1 /* 2 * ============================================ 3 * A wrapper around the Harwell subroutine MA27 4 * to dynamically allocate and ajust workspace. 5 * 6 * D. Orban Montreal, September 2003 7 * ============================================ 8 */ 9 10 #ifndef _MA27_H 11 #define _MA27_H 12 13 #include "stdio.h" 14 #include "stdlib.h" 15 #include "math.h" 16 17 #define imax(a,b) ((a) > (b) ? (a) : (b)) 18 #define imin(a,b) ((a) < (b) ? (a) : (b)) 19 #define ZERO 0.0 20 21 #define PRINT(...) if (ma27->outfile) fprintf(ma27->outfile, __VA_ARGS__) 22 23 #ifdef _AIX 24 #define FUNDERSCORE(a) a 25 #else 26 #define FUNDERSCORE(a) a##_ 27 #endif 28 29 #define MA27ID FUNDERSCORE(ma27id) 30 #define MA27AD FUNDERSCORE(ma27ad) 31 #define MA27BD FUNDERSCORE(ma27bd) 32 #define MA27CD FUNDERSCORE(ma27cd) 33 #define MA27FACTORS FUNDERSCORE(ma27factors) 34 #define MA27QDEMASC FUNDERSCORE(ma27qdemasc) 35 36 typedef struct Ma27_Data { 37 int n, nz; /* Order and #nonzeros */ 38 int icntl[31], info[21]; 39 double cntl[6]; 40 int *irn, *jcn; /* Sparsity pattern */ 41 int *iw, liw; /* Integer workspace */ 42 int *ikeep; /* Pivot sequence */ 43 int *iw1; /* Integer workspace */ 44 int nsteps; 45 int iflag; /* Pivot selection */ 46 double ops; /* Operation count */ 47 48 int la; 49 double *factors; /* Matrix factors */ 50 int maxfrt; 51 double *w; /* Real workspace */ 52 53 double *residual; /* = b - Ax */ 54 55 char fetched; /* Factors have been fetched 56 * Used for de-allocation */ 57 58 FILE *outfile; /* File for log output */ 59 } Ma27_Data; 60 61 /* Below I indicate arrays of fixed length by specifying it 62 * explicitly, e.g. icntl[30], arrays of variable length by 63 * specifying it implicitly, e.g. iw[]. The remaining variables 64 * are either variables of the type indicated, or arrays whose 65 * size is fixed, but depends on the value of other parameters. 66 */ 67 68 extern void MA27ID( int icntl[30], double cntl[5] ); 69 extern void MA27AD( int *n, int *nz, int *irn, int *jcn, int iw[], 70 int *liw, int *ikeep, int *iw1, int *nsteps, 71 int *iflag, int icntl[30], double cntl[5], 72 int info[20], double *ops ); 73 extern void MA27BD( int *n, int *nz, int *irn, int *jcn, 74 double *a, int *la, int iw[], int *liw, 75 int *ikeep, int *nsteps, int *maxfrt, int *iw1, 76 int icntl[30], double cntl[5], int info[20] ); 77 extern void MA27CD( int *n, double *a, int *la, int iw[], int *liw, 78 double *w, int *maxfrt, double *rhs, int *iw1, 79 int *nsteps, int icntl[30], int info[20] ); 80 //extern void MA27FACTORS( int *n, double a[], int *la, int iw[], 81 // int *liw, int *maxfrt, 82 // int iw2[], int *nblk, int *latop, 83 // int icntl[30], int colrhs[], int *nnzD, 84 // int id[], int jd[], double d[], 85 // int *nnzL, int il[], int jl[], double l[] ); 86 //extern void MA27QDEMASC( int *n, int iw[], int *liwm1, int iw2[], 87 // int *nblk, int *latop, int icntl[30] ); 88 89 90 /* Interfaces to the above MA27 subroutines */ 91 92 Ma27_Data * MA27_Initialize( int nz, int n, FILE *outfile ); 93 int MA27_Analyze( Ma27_Data *data, int iflag ); 94 int MA27_Factorize( Ma27_Data *data, double A[] ); 95 int MA27_Solve( Ma27_Data *data, double x[] ); 96 int MA27_Refine( Ma27_Data *data, double x[], double rhs[], 97 double A[], double tol, int maxitref ); 98 void MA27_Finalize( Ma27_Data *data ); 99 100 #define LIW_MIN 500 101 #define PIV_MIN -0.5 102 #define PIV_MAX 0.5 103 104 #endif /* _MA27_H */ 105