17#include "fasp_functs.h"
23#define ICNTL(I) icntl[(I)-1]
52 const int n = ptrA->
row;
53 const int nz = ptrA->
nnz;
56 double* AA = ptrA->
val;
65 int begin_row, end_row;
68 printf(
"### DEBUG: fasp_solver_mumps ... [Start]\n");
69 printf(
"### DEBUG: nr=%d, nnz=%d\n", n, nz);
73 if (IA[0] != 0 && IA[0] != 1) {
74 printf(
"### ERROR: Matrix format is wrong -- IA[0] = %d\n", IA[0]);
78 REAL start_time, end_time;
82 irn = (
int*)malloc(
sizeof(
int) * nz);
83 jcn = (
int*)malloc(
sizeof(
int) * nz);
84 a = (
double*)malloc(
sizeof(
double) * nz);
85 rhs = (
double*)malloc(
sizeof(
double) * n);
88 for (i = 0; i < n; i++) {
91 for (j = begin_row; j < end_row; j++) {
98 for (i = 0; i < n; i++) {
99 begin_row = IA[i] - 1;
100 end_row = IA[i + 1] - 1;
101 for (j = begin_row; j < end_row; j++) {
137 for (i = 0; i < n; i++) rhs[i] = f[i];
142 for (i = 0; i < n; i++) x[i] =
id.rhs[i];
158 printf(
"### DEBUG: fasp_solver_mumps ... [Finish]\n");
164 printf(
"### ERROR: MUMPS is not available!\n");
194 int job = mumps->
job;
196 static int job_stat = 0;
209 printf(
"### DEBUG: %s, step %d, job_stat = %d... [Start]\n",
210 __FUNCTION__, job, job_stat);
212 int begin_row, end_row;
213 const int n = ptrA->
row;
214 const int nz = ptrA->
nnz;
217 double* AA = ptrA->
val;
219 irn =
id.irn = (
int*)malloc(
sizeof(
int) * nz);
220 jcn =
id.jcn = (
int*)malloc(
sizeof(
int) * nz);
221 a =
id.a = (
double*)malloc(
sizeof(
double) * nz);
222 rhs =
id.rhs = (
double*)malloc(
sizeof(
double) * n);
225 if (IA[0] != 0 && IA[0] != 1) {
226 printf(
"### ERROR: Matrix format is wrong, IA[0] = %d!\n", IA[0]);
232 for (i = 0; i < n; i++) {
235 for (j = begin_row; j < end_row; j++) {
242 for (i = 0; i < n; i++) {
243 begin_row = IA[i] - 1;
244 end_row = IA[i + 1] - 1;
245 for (j = begin_row; j < end_row; j++) {
281 printf(
"### DEBUG: %s, step %d, job_stat = %d... [Finish]\n",
282 __FUNCTION__, job, job_stat);
290 printf(
"### DEBUG: %s, step %d, job_stat = %d... [Start]\n",
291 __FUNCTION__, job, job_stat);
296 printf(
"### ERROR: %s setup failed!\n", __FUNCTION__);
299 for (i = 0; i <
id.n; i++)
id.rhs[i] = b->
val[i];
304 for (i = 0; i <
id.n; i++) u->
val[i] =
id.rhs[i];
307 printf(
"### DEBUG: %s, step %d, job_stat = %d... [Finish]\n",
308 __FUNCTION__, job, job_stat);
316 printf(
"### DEBUG: %s, step %d, job_stat = %d... [Start]\n",
317 __FUNCTION__, job, job_stat);
322 printf(
"### ERROR: %s setup failed!\n", __FUNCTION__);
332 printf(
"### DEBUG: %s, step %d, job_stat = %d... [Finish]\n",
333 __FUNCTION__, job, job_stat);
340 printf(
"### ERROR: job = %d. Should be 1, 2, or 3!\n", job);
348 printf(
"### ERROR: MUMPS is not available!\n");
375 const int m = ptrA->
row;
376 const int n = ptrA->
col;
377 const int nz = ptrA->
nnz;
380 double* AA = ptrA->
val;
382 int* irn =
id.irn = (
int*)malloc(
sizeof(
int) * nz);
383 int* jcn =
id.jcn = (
int*)malloc(
sizeof(
int) * nz);
384 double* a =
id.a = (
double*)malloc(
sizeof(
double) * nz);
385 double* rhs =
id.rhs = (
double*)malloc(
sizeof(
double) * n);
387 int begin_row, end_row;
390 printf(
"### DEBUG: %s ... [Start]\n", __FUNCTION__);
391 printf(
"### DEBUG: nr=%d, nc=%d, nnz=%d\n", m, n, nz);
394 clock_t start_time = clock();
397 for (i = 0; i < n; i++) {
400 for (j = begin_row; j < end_row; j++) {
407 for (i = 0; i < n; i++) {
408 begin_row = IA[i] - 1;
409 end_row = IA[i + 1] - 1;
410 for (j = begin_row; j < end_row; j++) {
449 clock_t end_time = clock();
450 double fac_time = (double)(end_time - start_time) / (double)(CLOCKS_PER_SEC);
451 printf(
"MUMPS factorize costs %f seconds.\n", fac_time);
455 printf(
"### DEBUG: %s ... [Finish]\n", __FUNCTION__);
484 DMUMPS_STRUC_C
id = mumps.id;
486 const int m = ptrA->
row;
487 const int n = ptrA->
row;
488 const int nz = ptrA->
nnz;
491 double* AA = ptrA->
val;
496 double* rhs =
id.rhs;
499 printf(
"### DEBUG: %s ... [Start]\n", __FUNCTION__);
500 printf(
"### DEBUG: nr=%d, nc=%d, nnz=%d\n", m, n, nz);
503 clock_t start_time = clock();
509 for (i = 0; i <
id.n; i++) rhs[i] = f[i];
526 for (i = 0; i <
id.n; i++) x[i] =
id.rhs[i];
529 clock_t end_time = clock();
530 double solve_time = (double)(end_time - start_time) / (double)(CLOCKS_PER_SEC);
531 printf(
"MUMPS costs %f seconds.\n", solve_time);
535 printf(
"### DEBUG: %s ... [Finish]\n", __FUNCTION__);
553 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 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