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