Changeset 26117


Ignore:
Timestamp:
03/18/21 20:58:51 (4 years ago)
Author:
Mathieu Morlighem
Message:

BUG: fixing problem with matrix

Location:
issm/trunk-jpl/src/c
Files:
1 deleted
7 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/c/Makefile.am

    r26110 r26117  
    373373        ./toolkits/petsc/patches \
    374374        ./toolkits/petsc/patches/VecToMPISerial.cpp \
    375         ./toolkits/petsc/patches/MatToSerial.cpp \
     375        ./toolkits/petsc/patches/MatToMPISerial.cpp \
    376376        ./toolkits/petsc/patches/NewVec.cpp \
    377377        ./toolkits/petsc/patches/PetscOptionsDetermineSolverType.cpp \
  • issm/trunk-jpl/src/c/toolkits/objects/Matrix.h

    r26112 r26117  
    266266                }
    267267                /*}}}*/
    268                 doubletype* ToSerial(void){/*{{{*/
     268                doubletype* ToMPISerial0(void){/*{{{*/
    269269
    270270                        doubletype* output=NULL;
     
    272272                        if(type==PetscMatType){
    273273                                #ifdef _HAVE_PETSC_
    274                                 output=this->pmatrix->ToSerial();
    275                                 #endif
    276                         }
    277                         else{
    278                                 output=this->imatrix->ToSerial();
     274                                output=this->pmatrix->ToMPISerial0();
     275                                #endif
     276                        }
     277                        else{
     278                                output=this->imatrix->ToMPISerial0();
    279279                        }
    280280
     
    288288                        if(type==PetscMatType){
    289289                                #ifdef _HAVE_PETSC_
    290                                 output=this->pmatrix->ToSerial();
     290                                output=this->pmatrix->ToMPISerial();
    291291                                #endif
    292292                        }
  • issm/trunk-jpl/src/c/toolkits/petsc/objects/PetscMat.cpp

    r26116 r26117  
    171171}
    172172/*}}}*/
    173 IssmDouble* PetscMat::ToSerial(void){/*{{{*/
     173IssmDouble* PetscMat::ToMPISerial(void){/*{{{*/
    174174
    175175         IssmDouble* output=NULL;
    176 
    177          MatToSerial(&output,this->matrix,IssmComm::GetComm());
     176         MatToMPISerial(&output,this->matrix,IssmComm::GetComm(),true);
    178177         return output;
    179178
    180179}
    181180/*}}}*/
    182 IssmDouble* PetscMat::ToMPISerial(void){/*{{{*/
     181IssmDouble* PetscMat::ToMPISerial0(void){/*{{{*/
    183182
    184183         IssmDouble* output=NULL;
    185          
    186          MatToMPISerial(&output,this->matrix,IssmComm::GetComm());
     184         MatToMPISerial(&output,this->matrix,IssmComm::GetComm(),false);
    187185         return output;
    188186
  • issm/trunk-jpl/src/c/toolkits/petsc/objects/PetscMat.h

    r26115 r26117  
    4949                void MatMult(PetscVec* X,PetscVec* AX);
    5050                PetscMat* Duplicate(void);
    51                 IssmDouble* ToSerial(void);
    5251                IssmDouble* ToMPISerial(void);
     52                IssmDouble* ToMPISerial0(void);
    5353                void SetValues(int m,int* idxm,int n,int* idxn,IssmDouble* values,InsMode mode);
    5454                void Convert(MatrixType type);
  • issm/trunk-jpl/src/c/toolkits/petsc/patches/MatToMPISerial.cpp

    r26111 r26117  
    1212#include "../../../shared/shared.h"
    1313
    14 void MatToMPISerial(double** poutmatrix,Mat matrix,ISSM_MPI_Comm comm){
     14void MatToMPISerial(double** poutmatrix,Mat matrix,ISSM_MPI_Comm comm,bool broadcast){
    1515
     16        int i;
     17        int my_rank;
     18        int num_procs;
     19
     20        /*Petsc variables*/
     21        PetscInt lower_row,upper_row;
     22        int range;
     23        int M,N; //size of matrix
     24        ISSM_MPI_Status status;
     25        int* idxm=NULL;
     26        int* idxn=NULL;
     27        double* local_matrix=NULL; /*matrix local to each node used for temporary holding matrix values*/
     28        int buffer[3];
     29
     30        /*recover my_rank and num_procs:*/
     31        ISSM_MPI_Comm_size(comm,&num_procs);
     32        ISSM_MPI_Comm_rank(comm,&my_rank);
     33
     34        /*Output*/
    1635        double* outmatrix=NULL;
    17 
    18         /*Call MatToSerial:*/
    19         MatToSerial(&outmatrix,matrix,comm);
    2036
    2137        /*get matrix size: */
    2238        MatGetSize(matrix,&M,&N);
    2339
    24         /*Allocate on cpus:*/
    25         if (my_rank!=0)outmatrix=xNew<double>(M*N);
     40        /*partition: */
     41        MatGetOwnershipRange(matrix,&lower_row,&upper_row);   
     42        upper_row--;
     43        range=upper_row-lower_row+1;
    2644
    27         /*Broadcast:*/
    28         ISSM_MPI_Bcast(outmatrix,M*N,ISSM_MPI_PDOUBLE,0,comm);
     45        /*Local and global allocation*/
     46        if(broadcast || my_rank==0){
     47                outmatrix=xNew<double>(M*N);
     48        }
    2949
    30         /*Assign output pointer:*/
     50        if (range){
     51                local_matrix=xNew<double>(N*range);
     52                idxm=xNew<int>(range); 
     53                idxn=xNew<int>(N); 
     54
     55                for (i=0;i<N;i++){
     56                        *(idxn+i)=i;
     57                }
     58                for (i=0;i<range;i++){
     59                        *(idxm+i)=lower_row+i;
     60                }
     61
     62                MatGetValues(matrix,range,idxm,N,idxn,local_matrix);     
     63        }
     64
     65        /*Now each node holds its local_matrix containing range rows.
     66         * We send these rows to the matrix on node 0*/
     67
     68        for (i=1;i<num_procs;i++){
     69                if (my_rank==i){
     70                        buffer[0]=my_rank;
     71                        buffer[1]=lower_row;
     72                        buffer[2]=range;
     73                        ISSM_MPI_Send(buffer,3,ISSM_MPI_INT,0,1,comm);   
     74                        if (range)ISSM_MPI_Send(local_matrix,N*range,ISSM_MPI_PDOUBLE,0,1,comm);
     75                }
     76                if (my_rank==0){
     77                        ISSM_MPI_Recv(buffer,3,ISSM_MPI_INT,i,1,comm,&status);
     78                        if (buffer[2])ISSM_MPI_Recv(outmatrix+(buffer[1]*N),N*buffer[2],ISSM_MPI_PDOUBLE,i,1,comm,&status);
     79                }
     80        }
     81        if (my_rank==0){
     82                //Still have the local_matrix on node 0 to take care of.
     83                if (range) memcpy(outmatrix,local_matrix,N*range*sizeof(double));
     84        }
     85
     86        if(broadcast){
     87                /*Broadcast:*/
     88                ISSM_MPI_Bcast(outmatrix,M*N,ISSM_MPI_PDOUBLE,0,comm);
     89        }
     90
     91        /*Assign output pointer: */
     92        xDelete<int>(idxm);
     93        xDelete<int>(idxn);
     94        xDelete<double>(local_matrix);
    3195        *poutmatrix=outmatrix;
    3296}
  • issm/trunk-jpl/src/c/toolkits/petsc/patches/VecToMPISerial.cpp

    r23643 r26117  
    8282        if (my_rank==0){
    8383                //Still have the local_vector on node 0 to take care of.
    84                 if (range)memcpy(gathered_vector+lower_row,local_vector,range*sizeof(double));
     84                if (range) memcpy(gathered_vector+lower_row,local_vector,range*sizeof(double));
    8585        }
    8686
  • issm/trunk-jpl/src/c/toolkits/petsc/patches/petscpatches.h

    r26110 r26117  
    2727void VecFree(Vec* pvec);
    2828void KSPFree(KSP* pksp);
    29 int MatPartition(Mat* poutmatrix,Mat matrixA,double* row_partition_vector,int row_partition_vector_size ,
    30                 double* col_partition_vector,int col_partition_vector_size);
     29int MatPartition(Mat* poutmatrix,Mat matrixA,double* row_partition_vector,int row_partition_vector_size, double* col_partition_vector,int col_partition_vector_size);
    3130void PetscOptionsDetermineSolverType(int* psolver_type);
    3231void MatMultPatch(Mat A,Vec X, Vec AX,ISSM_MPI_Comm comm);
    33 void MatToSerial(double** poutmatrix,Mat matrix,ISSM_MPI_Comm comm);
    34 void MatToMPISerial(double** poutmatrix,Mat matrix,ISSM_MPI_Comm comm);
     32void MatToMPISerial(double** poutmatrix,Mat matrix,ISSM_MPI_Comm comm,bool broadcast=true);
    3533Vec  SerialToVec(double* vector,int vector_size);
    3634InsertMode ISSMToPetscInsertMode(InsMode mode);
Note: See TracChangeset for help on using the changeset viewer.