Changeset 26117
- Timestamp:
- 03/18/21 20:58:51 (4 years ago)
- Location:
- issm/trunk-jpl/src/c
- Files:
-
- 1 deleted
- 7 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/Makefile.am
r26110 r26117 373 373 ./toolkits/petsc/patches \ 374 374 ./toolkits/petsc/patches/VecToMPISerial.cpp \ 375 ./toolkits/petsc/patches/MatTo Serial.cpp \375 ./toolkits/petsc/patches/MatToMPISerial.cpp \ 376 376 ./toolkits/petsc/patches/NewVec.cpp \ 377 377 ./toolkits/petsc/patches/PetscOptionsDetermineSolverType.cpp \ -
issm/trunk-jpl/src/c/toolkits/objects/Matrix.h
r26112 r26117 266 266 } 267 267 /*}}}*/ 268 doubletype* To Serial(void){/*{{{*/268 doubletype* ToMPISerial0(void){/*{{{*/ 269 269 270 270 doubletype* output=NULL; … … 272 272 if(type==PetscMatType){ 273 273 #ifdef _HAVE_PETSC_ 274 output=this->pmatrix->To Serial();275 #endif 276 } 277 else{ 278 output=this->imatrix->To Serial();274 output=this->pmatrix->ToMPISerial0(); 275 #endif 276 } 277 else{ 278 output=this->imatrix->ToMPISerial0(); 279 279 } 280 280 … … 288 288 if(type==PetscMatType){ 289 289 #ifdef _HAVE_PETSC_ 290 output=this->pmatrix->To Serial();290 output=this->pmatrix->ToMPISerial(); 291 291 #endif 292 292 } -
issm/trunk-jpl/src/c/toolkits/petsc/objects/PetscMat.cpp
r26116 r26117 171 171 } 172 172 /*}}}*/ 173 IssmDouble* PetscMat::To Serial(void){/*{{{*/173 IssmDouble* PetscMat::ToMPISerial(void){/*{{{*/ 174 174 175 175 IssmDouble* output=NULL; 176 177 MatToSerial(&output,this->matrix,IssmComm::GetComm()); 176 MatToMPISerial(&output,this->matrix,IssmComm::GetComm(),true); 178 177 return output; 179 178 180 179 } 181 180 /*}}}*/ 182 IssmDouble* PetscMat::ToMPISerial (void){/*{{{*/181 IssmDouble* PetscMat::ToMPISerial0(void){/*{{{*/ 183 182 184 183 IssmDouble* output=NULL; 185 186 MatToMPISerial(&output,this->matrix,IssmComm::GetComm()); 184 MatToMPISerial(&output,this->matrix,IssmComm::GetComm(),false); 187 185 return output; 188 186 -
issm/trunk-jpl/src/c/toolkits/petsc/objects/PetscMat.h
r26115 r26117 49 49 void MatMult(PetscVec* X,PetscVec* AX); 50 50 PetscMat* Duplicate(void); 51 IssmDouble* ToSerial(void);52 51 IssmDouble* ToMPISerial(void); 52 IssmDouble* ToMPISerial0(void); 53 53 void SetValues(int m,int* idxm,int n,int* idxn,IssmDouble* values,InsMode mode); 54 54 void Convert(MatrixType type); -
issm/trunk-jpl/src/c/toolkits/petsc/patches/MatToMPISerial.cpp
r26111 r26117 12 12 #include "../../../shared/shared.h" 13 13 14 void MatToMPISerial(double** poutmatrix,Mat matrix,ISSM_MPI_Comm comm ){14 void MatToMPISerial(double** poutmatrix,Mat matrix,ISSM_MPI_Comm comm,bool broadcast){ 15 15 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*/ 16 35 double* outmatrix=NULL; 17 18 /*Call MatToSerial:*/19 MatToSerial(&outmatrix,matrix,comm);20 36 21 37 /*get matrix size: */ 22 38 MatGetSize(matrix,&M,&N); 23 39 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; 26 44 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 } 29 49 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); 31 95 *poutmatrix=outmatrix; 32 96 } -
issm/trunk-jpl/src/c/toolkits/petsc/patches/VecToMPISerial.cpp
r23643 r26117 82 82 if (my_rank==0){ 83 83 //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)); 85 85 } 86 86 -
issm/trunk-jpl/src/c/toolkits/petsc/patches/petscpatches.h
r26110 r26117 27 27 void VecFree(Vec* pvec); 28 28 void 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); 29 int MatPartition(Mat* poutmatrix,Mat matrixA,double* row_partition_vector,int row_partition_vector_size, double* col_partition_vector,int col_partition_vector_size); 31 30 void PetscOptionsDetermineSolverType(int* psolver_type); 32 31 void 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); 32 void MatToMPISerial(double** poutmatrix,Mat matrix,ISSM_MPI_Comm comm,bool broadcast=true); 35 33 Vec SerialToVec(double* vector,int vector_size); 36 34 InsertMode ISSMToPetscInsertMode(InsMode mode);
Note:
See TracChangeset
for help on using the changeset viewer.