Changeset 16430
- Timestamp:
- 10/16/13 11:14:22 (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/toolkits/issm/IssmMpiSparseMat.h
r16424 r16430 194 194 int* numvalues_perrow = NULL; 195 195 int row; 196 197 doubletype** values_perrow = NULL; 198 int** cols_perrow = NULL; 199 int** mods_perrow = NULL; 200 int* counters_perrow = NULL; 201 int counter; 196 202 197 203 /*Early exit: */ … … 284 290 } 285 291 286 287 /*Deal with sparse row one at a time: */ 288 for(row=0;row<this->m;row++){ 289 290 /*Allocate: */ 291 this_row_numvalues=numvalues_perrow[row]; 292 this_row_cols=xNew<int>(this_row_numvalues); 293 this_row_values=xNew<doubletype>(this_row_numvalues); 294 this_row_mods=xNew<int>(this_row_numvalues); 295 296 /*Collect: */ 297 count=0; 298 for(i=0;i<num_procs;i++){ 299 int numvalues=numvalues_fromcpu[i]; 300 int* rows=row_indices_fromcpu[i]; 301 int* cols=col_indices_fromcpu[i]; 302 doubletype* values=values_fromcpu[i]; 303 int* mods=modes_fromcpu[i]; 304 305 for(j=0;j<numvalues;j++){ 306 if((rows[j]-lower_row)==row){ 307 this_row_cols[count]=cols[j]; 308 this_row_values[count]=values[j]; 309 this_row_mods[count]=mods[j]; 310 count++; 311 } 312 } 313 } 314 if(count!=this_row_numvalues)_error_("counter error during assembly of values!"); 315 316 /*Now fill in the sparse row: */ 317 this->matrix[row]->SetValues(this_row_numvalues,this_row_cols,this_row_values,this_row_mods); 318 319 /*Free ressources: */ 320 xDelete<int>(this_row_cols); 321 xDelete<doubletype>(this_row_values); 322 xDelete<int>(this_row_mods); 292 /*Allocate all the values, cols and mods from each cpu: */ 293 values_perrow=xNew<doubletype*>(this->m); 294 cols_perrow=xNew<int*>(this->m); 295 mods_perrow=xNew<int*>(this->m); 296 counters_perrow=xNewZeroInit<int>(this->m); 297 298 for(i=0;i<this->m;i++){ 299 values_perrow[i]=xNewZeroInit<doubletype>(numvalues_perrow[i]); 300 cols_perrow[i]=xNewZeroInit<int>(numvalues_perrow[i]); 301 mods_perrow[i]=xNewZeroInit<int>(numvalues_perrow[i]); 302 } 303 304 /*collect:*/ 305 for(i=0;i<num_procs;i++){ 306 int numvalues=numvalues_fromcpu[i]; 307 int* rows=row_indices_fromcpu[i]; 308 int* cols=col_indices_fromcpu[i]; 309 doubletype* values=values_fromcpu[i]; 310 int* mods=modes_fromcpu[i]; 311 312 for(j=0;j<numvalues;j++){ 313 row=rows[j]-lower_row; 314 counter=counters_perrow[row]; 315 values_perrow[row][counter]=values[j]; 316 cols_perrow[row][counter]=cols[j]; 317 mods_perrow[row][counter]=mods[j]; 318 counter=counters_perrow[row]++; 319 } 320 } 321 322 /*Plug into matrix: */ 323 for(i=0;i<this->m;i++){ 324 this->matrix[i]->SetValues(numvalues_perrow[i],cols_perrow[i],values_perrow[i],mods_perrow[i]); 323 325 } 324 326 /*}}}*/ … … 358 360 xDelete<int>(sendcnts); 359 361 xDelete<int>(displs); 362 363 for(i=0;i<this->m;i++){ 364 doubletype* values=values_perrow[i]; xDelete<doubletype>(values); 365 int* cols=cols_perrow[i]; xDelete<int>(cols); 366 int* mods=mods_perrow[i]; xDelete<int>(mods); 367 } 368 xDelete<int>(counters_perrow); 369 xDelete<doubletype*>(values_perrow); 370 xDelete<int*>(cols_perrow); 371 xDelete<int*>(mods_perrow); 360 372 /*}}}*/ 361 373
Note:
See TracChangeset
for help on using the changeset viewer.