17#include "fasp_functs.h"
23#define ICNTL(I) icntl[(I)-1]
53 const int n = ptrA->
row;
54 const int nz = ptrA->
nnz;
57 double* AA = ptrA->
val;
66 int begin_row, end_row;
69 printf(
"### DEBUG: fasp_solver_mumps ... [Start]\n");
70 printf(
"### DEBUG: nr=%d, nnz=%d\n", n, nz);
74 if (IA[0] != 0 && IA[0] != 1) {
75 printf(
"### ERROR: Matrix format is wrong -- IA[0] = %d\n", IA[0]);
79 REAL start_time, end_time;
83 irn = (
int*)malloc(
sizeof(
int) * nz);
84 jcn = (
int*)malloc(
sizeof(
int) * nz);
85 a = (
double*)malloc(
sizeof(
double) * nz);
86 rhs = (
double*)malloc(
sizeof(
double) * n);
89 for (i = 0; i < n; i++) {
92 for (j = begin_row; j < end_row; j++) {
99 for (i = 0; i < n; i++) {
100 begin_row = IA[i] - 1;
101 end_row = IA[i + 1] - 1;
102 for (j = begin_row; j < end_row; j++) {
139 for (i = 0; i < n; i++) rhs[i] = f[i];
145 printf(
"### ERROR: %d, %s %d\n", status, __FUNCTION__, __LINE__);
146 printf(
"### ERROR: MUMPS solve failed!\n");
150 for (i = 0; i < n; i++) x[i] =
id.rhs[i];
166 printf(
"### DEBUG: fasp_solver_mumps ... [Finish]\n");
172 printf(
"### ERROR: MUMPS is not available!\n");
203 int job = mumps->
job;
204 static int job_stat = 0;
216 printf(
"### DEBUG: %s, step %d, job_stat = %d... [Start]\n",
217 __FUNCTION__, job, job_stat);
219 int begin_row, end_row;
220 const int n = ptrA->
row;
221 const int nz = ptrA->
nnz;
224 double* AA = ptrA->
val;
226 irn =
id.irn = (
int*)malloc(
sizeof(
int) * nz);
227 jcn =
id.jcn = (
int*)malloc(
sizeof(
int) * nz);
228 a =
id.a = (
double*)malloc(
sizeof(
double) * nz);
229 rhs =
id.rhs = (
double*)malloc(
sizeof(
double) * n);
232 if (IA[0] != 0 && IA[0] != 1) {
233 printf(
"### ERROR: Matrix format is wrong, IA[0] = %d!\n", IA[0]);
239 for (i = 0; i < n; i++) {
242 for (j = begin_row; j < end_row; j++) {
249 for (i = 0; i < n; i++) {
250 begin_row = IA[i] - 1;
251 end_row = IA[i + 1] - 1;
252 for (j = begin_row; j < end_row; j++) {
285 printf(
"### ERROR: %d, %s %d\n", status, __FUNCTION__, __LINE__);
286 printf(
"### ERROR: MUMPS factorization failed!\n");
294 printf(
"### DEBUG: %s, step %d, job_stat = %d... [Finish]\n",
295 __FUNCTION__, job, job_stat);
303 printf(
"### DEBUG: %s, step %d, job_stat = %d... [Start]\n",
304 __FUNCTION__, job, job_stat);
309 printf(
"### ERROR: %s setup failed!\n", __FUNCTION__);
312 for (i = 0; i <
id.n; i++)
id.rhs[i] = b->
val[i];
318 printf(
"### ERROR: %d, %s %d\n", status, __FUNCTION__, __LINE__);
319 printf(
"### ERROR: MUMPS solve failed!\n");
323 for (i = 0; i <
id.n; i++) u->
val[i] =
id.rhs[i];
326 printf(
"### DEBUG: %s, step %d, job_stat = %d... [Finish]\n",
327 __FUNCTION__, job, job_stat);
335 printf(
"### DEBUG: %s, step %d, job_stat = %d... [Start]\n",
336 __FUNCTION__, job, job_stat);
341 printf(
"### ERROR: %s setup failed!\n", __FUNCTION__);
351 printf(
"### DEBUG: %s, step %d, job_stat = %d... [Finish]\n",
352 __FUNCTION__, job, job_stat);
359 printf(
"### ERROR: job = %d. Should be 1, 2, or 3!\n", job);
367 printf(
"### ERROR: MUMPS is not available!\n");
394 const int n = ptrA->
col;
395 const int nz = ptrA->
nnz;
398 double* AA = ptrA->
val;
401 int* irn =
id.irn = (
int*)malloc(
sizeof(
int) * nz);
402 int* jcn =
id.jcn = (
int*)malloc(
sizeof(
int) * nz);
403 double* a =
id.a = (
double*)malloc(
sizeof(
double) * nz);
404 double* rhs =
id.rhs = (
double*)malloc(
sizeof(
double) * n);
406 int begin_row, end_row;
409 printf(
"### DEBUG: %s ... [Start]\n", __FUNCTION__);
410 printf(
"### DEBUG: nr=%d, nc=%d, nnz=%d\n", n, n, nz);
413 clock_t start_time = clock();
416 for (i = 0; i < n; i++) {
419 for (j = begin_row; j < end_row; j++) {
426 for (i = 0; i < n; i++) {
427 begin_row = IA[i] - 1;
428 end_row = IA[i + 1] - 1;
429 for (j = begin_row; j < end_row; j++) {
469 printf(
"### ERROR: %d, %s %d\n", status, __FUNCTION__, __LINE__);
470 printf(
"### ERROR: MUMPS factorization failed!\n");
475 clock_t end_time = clock();
476 double fac_time = (double)(end_time - start_time) / (double)(CLOCKS_PER_SEC);
477 printf(
"MUMPS factorize costs %f seconds.\n", fac_time);
481 printf(
"### DEBUG: %s ... [Finish]\n", __FUNCTION__);
509 DMUMPS_STRUC_C
id = mumps.id;
511 double* rhs =
id.rhs;
514 printf(
"### DEBUG: %s ... [Start]\n", __FUNCTION__);
515 printf(
"### DEBUG: nr=%d, nc=%d, nnz=%d\n", m, n, nz);
518 clock_t start_time = clock();
524 for (i = 0; i <
id.n; i++) rhs[i] = f[i];
543 printf(
"### ERROR: %d, %s %d\n", status, __FUNCTION__, __LINE__);
544 printf(
"### ERROR: MUMPS solve failed!\n");
548 for (i = 0; i <
id.n; i++) x[i] =
id.rhs[i];
551 clock_t end_time = clock();
552 double solve_time = (double)(end_time - start_time) / (double)(CLOCKS_PER_SEC);
553 printf(
"MUMPS costs %f seconds.\n", solve_time);
557 printf(
"### DEBUG: %s ... [Finish]\n", __FUNCTION__);
575 DMUMPS_STRUC_C
id = mumps->id;
void fasp_cputime(const char *message, const REAL cputime)
Print CPU walltime.
void fasp_gettime(REAL *time)
Get system time.
int fasp_solver_mumps(dCSRmat *ptrA, dvector *b, dvector *u, const SHORT prtlvl)
Solve Ax=b by MUMPS directly.
int fasp_solver_mumps_steps(dCSRmat *ptrA, dvector *b, dvector *u, Mumps_data *mumps)
Solve Ax=b by MUMPS in three steps.
Main header file for the FASP project.
#define SHORT
FASP integer and floating point numbers.
#define FASP_SUCCESS
Definition of return status and error messages.
#define ERROR_SOLVER_MISC
#define PRINT_NONE
Print level for all subroutines – not including DEBUG output.
#define ERROR_SOLVER_EXIT
Data for MUMPS interface.
Sparse matrix of REAL type in CSR format.
INT col
column of matrix A, n
REAL * val
nonzero entries of A
INT row
row number of matrix A, m
INT * IA
integer array of row pointers, the size is m+1
INT nnz
number of nonzero entries
INT * JA
integer array of column indexes, the size is nnz
Vector with n entries of REAL type.
REAL * val
actual vector entries