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