Changeset 16430


Ignore:
Timestamp:
10/16/13 11:14:22 (11 years ago)
Author:
Eric.Larour
Message:

CHG: improved speed on assemble routine.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/c/toolkits/issm/IssmMpiSparseMat.h

    r16424 r16430  
    194194                        int*          numvalues_perrow    = NULL;
    195195                        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;
    196202
    197203                        /*Early exit: */
     
    284290                        }
    285291
    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]);
    323325                        }
    324326                        /*}}}*/
     
    358360                        xDelete<int>(sendcnts);
    359361                        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);
    360372                        /*}}}*/
    361373
Note: See TracChangeset for help on using the changeset viewer.