00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #ifndef MAT_DH_DH
00031 #define MAT_DH_DH
00032
00033 #include "euclid_common.h"
00034
00035
00036 #define MAT_DH_BINS 10
00037 #define MATVEC_TIME 0
00038 #define MATVEC_MPI_TIME 1
00039 #define MATVEC_MPI_TIME2 5
00040 #define MATVEC_TOTAL_TIME 2
00041 #define MATVEC_RATIO 3
00042 #define MATVEC_WORDS 4
00043
00044 #ifdef __cplusplus
00045 extern "C"
00046 {
00047 #endif
00048
00049 struct _mat_dh
00050 {
00051 int m, n;
00052
00053
00054 int beg_row;
00055 int bs;
00056
00057
00058 int *rp;
00059 int *len;
00060 int *cval;
00061 int *fill;
00062 int *diag;
00063 double *aval;
00064 bool owner;
00065
00066
00067 int len_private;
00068 int rowCheckedOut;
00069 int *cval_private;
00070 double *aval_private;
00071
00072
00073 int *row_perm;
00074
00075
00076 double time[MAT_DH_BINS];
00077 double time_max[MAT_DH_BINS];
00078 double time_min[MAT_DH_BINS];
00079 bool matvec_timing;
00080
00081
00082 int num_recv;
00083 int num_send;
00084 MPI_Request *recv_req;
00085 MPI_Request *send_req;
00086 double *recvbuf, *sendbuf;
00087 int *sendind;
00088 int sendlen;
00089 int recvlen;
00090 bool matvecIsSetup;
00091 Numbering_dh numb;
00092 MPI_Status *status;
00093
00094 bool debug;
00095 };
00096
00097 extern void Mat_dhCreate (Mat_dh * mat);
00098 extern void Mat_dhDestroy (Mat_dh mat);
00099
00100 extern void Mat_dhTranspose (Mat_dh matIN, Mat_dh * matOUT);
00101 extern void Mat_dhMakeStructurallySymmetric (Mat_dh A);
00102
00103
00104 extern void Mat_dhMatVecSetup (Mat_dh mat);
00105 extern void Mat_dhMatVecSetdown (Mat_dh mat);
00106
00107
00108
00109
00110
00111
00112
00113 extern void Mat_dhMatVec (Mat_dh mat, double *lhs, double *rhs);
00114
00115
00116 extern void Mat_dhMatVec_omp (Mat_dh mat, double *lhs, double *rhs);
00117
00118
00119 extern void Mat_dhMatVec_uni (Mat_dh mat, double *lhs, double *rhs);
00120
00121
00122 extern void Mat_dhMatVec_uni_omp (Mat_dh mat, double *lhs, double *rhs);
00123
00124
00125
00126 extern int Mat_dhReadNz (Mat_dh mat);
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137 extern void Mat_dhPrintGraph (Mat_dh mat, SubdomainGraph_dh sg, FILE * fp);
00138 extern void Mat_dhPrintRows (Mat_dh mat, SubdomainGraph_dh sg, FILE * fp);
00139
00140 extern void Mat_dhPrintCSR (Mat_dh mat, SubdomainGraph_dh sg,
00141 char *filename);
00142 extern void Mat_dhPrintTriples (Mat_dh mat, SubdomainGraph_dh sg,
00143 char *filename);
00144 extern void Mat_dhPrintBIN (Mat_dh mat, SubdomainGraph_dh sg,
00145 char *filename);
00146
00147 extern void Mat_dhReadCSR (Mat_dh * mat, char *filename);
00148 extern void Mat_dhReadTriples (Mat_dh * mat, int ignore, char *filename);
00149 extern void Mat_dhReadBIN (Mat_dh * mat, char *filename);
00150
00151
00152 extern void Mat_dhPermute (Mat_dh Ain, int *pIN, Mat_dh * Bout);
00153
00154
00155 extern void Mat_dhFixDiags (Mat_dh A);
00156
00157
00158
00159
00160
00161 extern void Mat_dhPrintDiags (Mat_dh A, FILE * fp);
00162
00163 extern void Mat_dhGetRow (Mat_dh B, int globalRow, int *len, int **ind,
00164 double **val);
00165 extern void Mat_dhRestoreRow (Mat_dh B, int row, int *len, int **ind,
00166 double **val);
00167
00168
00169 extern void Mat_dhPartition (Mat_dh mat, int k, int **beg_rowOUT,
00170 int **row_countOUT, int **n2oOUT,
00171 int **o2nOUT);
00172
00173
00174
00175
00176 extern void Mat_dhZeroTiming (Mat_dh mat);
00177 extern void Mat_dhReduceTiming (Mat_dh mat);
00178
00179
00180 extern void Mat_dhRowPermute (Mat_dh);
00181
00182 extern void dldperm (int job, int n, int nnz, int colptr[], int adjncy[],
00183 double nzval[], int *perm, double u[], double v[]);
00184
00185
00186 #ifdef __cplusplus
00187 }
00188 #endif
00189 #endif