9 #ifndef _ISSM_MPI_DENSE_MAT_H_
10 #define _ISSM_MPI_DENSE_MAT_H_
17 #error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
20 #include "../../shared/shared.h"
21 #include "../../datastructures/datastructures.h"
22 #include "../mumps/mumpsincludes.h"
36 template <
class doubletype>
77 if (
m*
N)this->matrix=xNewZeroInit<doubletype>(this->m*
N);
91 this->matrix=xNewZeroInit<doubletype>(
m*
N);
92 xMemCpy<doubletype>(this->matrix,serial_mat,
m*
N);
102 xDelete<doubletype>(this->matrix);
123 if (
m*
N)this->matrix=xNewZeroInit<doubletype>(this->m*
N);
137 _printf_(
"cpu " << i <<
" #rows: " << this->m <<
"\n");
138 for (j=0;j<this->
m;j++){
140 for (k=0;k<this->
N;k++){
141 if(this->matrix[j*this->N+k]!=0)
_printf_(
"(" << k <<
"," << this->matrix[j*this->N+k] <<
") ");
158 int *row_indices_forcpu = NULL;
159 int *col_indices_forcpu = NULL;
160 int *modes_forcpu = NULL;
161 doubletype *values_forcpu = NULL;
162 int *numvalues_forcpu = NULL;
163 DataSet **bucketsforcpu = NULL;
165 int **row_indices_fromcpu = NULL;
166 int **col_indices_fromcpu = NULL;
167 int **modes_fromcpu = NULL;
168 doubletype **values_fromcpu = NULL;
169 int *numvalues_fromcpu = NULL;
173 int* sendcnts = NULL;
185 bucketsforcpu=xNew<DataSet*>(num_procs);
187 for(i=0;i<num_procs;i++){
193 bucketsforcpu[i]=bucketsofcpu_i;
200 this->
BucketsBuildScatterBuffers(&numvalues_forcpu,&row_indices_forcpu,&col_indices_forcpu,&values_forcpu,&modes_forcpu,bucketsforcpu,num_procs);
205 numvalues_fromcpu = xNew<int>(num_procs);
206 for(i=0;i<num_procs;i++){
210 row_indices_fromcpu=xNew<int*>(num_procs);
211 col_indices_fromcpu=xNew<int*>(num_procs);
212 values_fromcpu=xNew<doubletype*>(num_procs);
213 modes_fromcpu=xNew<int*>(num_procs);
214 for(i=0;i<num_procs;i++){
215 int size=numvalues_fromcpu[i];
217 row_indices_fromcpu[i]=xNew<int>(size);
218 col_indices_fromcpu[i]=xNew<int>(size);
219 values_fromcpu[i]=xNew<doubletype>(size);
220 modes_fromcpu[i]=xNew<int>(size);
223 row_indices_fromcpu[i]=NULL;
224 col_indices_fromcpu[i]=NULL;
225 values_fromcpu[i]=NULL;
226 modes_fromcpu[i]=NULL;
235 sendcnts=xNew<int>(num_procs);
236 displs=xNew<int>(num_procs);
238 for(i=0;i<num_procs;i++){
239 sendcnts[i]=numvalues_forcpu[i];
241 count+=numvalues_forcpu[i];
244 for(i=0;i<num_procs;i++){
254 for(i=0;i<num_procs;i++){
255 int numvalues=numvalues_fromcpu[i];
256 int* rows=row_indices_fromcpu[i];
257 int* cols=col_indices_fromcpu[i];
258 doubletype* values=values_fromcpu[i];
259 int* mods=modes_fromcpu[i];
261 for(j=0;j<numvalues;j++){
262 if(mods[j]==
ADD_VAL) *(
matrix+
N*(rows[j]-lower_row)+cols[j])+=values[j];
263 else *(
matrix+
N*(rows[j]-lower_row)+cols[j])=values[j];
269 xDelete<int>(RowRank);
270 xDelete<int>(row_indices_forcpu);
271 xDelete<int>(col_indices_forcpu);
272 xDelete<int>(modes_forcpu);
273 xDelete<doubletype>(values_forcpu);
274 xDelete<int>(numvalues_forcpu);
276 for(i=0;i<num_procs;i++){
280 xDelete<DataSet*>(bucketsforcpu);
282 for(i=0;i<num_procs;i++){
283 int* rows=row_indices_fromcpu[i];
284 int* cols=col_indices_fromcpu[i];
285 int* modes=modes_fromcpu[i];
286 doubletype* values=values_fromcpu[i];
291 xDelete<doubletype>(values);
293 xDelete<int*>(row_indices_fromcpu);
294 xDelete<int*>(col_indices_fromcpu);
295 xDelete<int*>(modes_fromcpu);
296 xDelete<doubletype*>(values_fromcpu);
297 xDelete<int>(numvalues_fromcpu);
299 xDelete<int>(sendcnts);
300 xDelete<int>(displs);
307 doubletype norm,local_norm;
314 for(i=0;i<this->
m;i++){
316 for(j=0;j<this->
N;j++){
317 absolute+=fabs(this->matrix[
N*i+j]);
319 local_norm=
max(local_norm,absolute);
327 for(i=0;i<this->
m;i++){
328 for(j=0;j<this->
N;j++){
329 local_norm+=this->matrix[
N*i+j]*this->matrix[
N*i+j];
356 doubletype *X_serial = NULL;
370 for(i=0;i<this->
m;i++){
371 for(j=0;j<this->
N;j++){
372 AX->
vector[i]+=this->matrix[i*
N+j]*X_serial[j];
377 xDelete<doubletype>(X_serial);
403 for(
int i=0;i<this->m*this->
N;i++) this->matrix[i] = 0.;
409 void BucketsBuildScatterBuffers(
int** pnumvalues_forcpu,
int** prow_indices_forcpu,
int** pcol_indices_forcpu,doubletype** pvalues_forcpu,
int** pmodes_forcpu,
DataSet** bucketsforcpu,
int num_procs){
415 int *temp_row_indices_forcpu = NULL;
416 int *temp_col_indices_forcpu = NULL;
417 doubletype *temp_values_forcpu = NULL;
418 int *temp_modes_forcpu = NULL;
421 int *numvalues_forcpu = NULL;
422 int *row_indices_forcpu = NULL;
423 int *col_indices_forcpu = NULL;
424 doubletype *values_forcpu = NULL;
425 int *modes_forcpu = NULL;
429 numvalues_forcpu=xNew<int>(num_procs);
430 for(i=0;i<num_procs;i++){
439 numvalues_forcpu[i]=count;
444 for(i=0;i<num_procs;i++){
445 count+=numvalues_forcpu[i];
450 row_indices_forcpu = xNew<int>(total_size);
451 col_indices_forcpu = xNew<int>(total_size);
452 values_forcpu = xNew<doubletype>(total_size);
453 modes_forcpu = xNew<int>(total_size);
458 temp_row_indices_forcpu=row_indices_forcpu;
459 temp_col_indices_forcpu=col_indices_forcpu;
460 temp_values_forcpu=values_forcpu;
461 temp_modes_forcpu=modes_forcpu;
464 for(i=0;i<num_procs;i++){
468 bucket->
Marshall(&temp_row_indices_forcpu,&temp_col_indices_forcpu,&temp_values_forcpu,&temp_modes_forcpu);
473 if (temp_row_indices_forcpu!=row_indices_forcpu+total_size)
_error_(
"problem with marshalling of buckets");
474 if (temp_col_indices_forcpu!=col_indices_forcpu+total_size)
_error_(
"problem with marshalling of buckets");
475 if (temp_values_forcpu!=values_forcpu+total_size)
_error_(
"problem with marshalling of buckets");
476 if (temp_modes_forcpu!=modes_forcpu+total_size)
_error_(
"problem with marshalling of buckets");
479 *pnumvalues_forcpu = numvalues_forcpu;
480 *prow_indices_forcpu = row_indices_forcpu;
481 *pcol_indices_forcpu = col_indices_forcpu;
482 *pvalues_forcpu = values_forcpu;
483 *pmodes_forcpu = modes_forcpu;
486 #ifndef _HAVE_WRAPPERS_
502 MpiDenseMumpsSolve( uf->
vector,uf->
M,uf->
m, this->matrix,this->M,this->N,this->m, pf->
vector,pf->
M,pf->
m,parameters);
504 _error_(
"IssmMpiDenseMat solver requires MUMPS solver");
519 _error_(
"GSL support not compiled in!");
523 _error_(
"solver type not supported yet!");
530 #endif //#ifndef _ISSM_MPI_DENSE_MAT_H_