1 #ifdef PETSC_RCS_HEADER 2 static char vcid[] = "$Id: convert.c,v 1.59 1997/07/09 20:56:43 balay Exp bsmith $"; 3 #endif 4 5 #include "src/mat/matimpl.h" 6 7 #undef __FUNC__ 8 #define __FUNC__ "MatConvert_Basic" 9 /* 10 MatConvert_Basic - Converts from any input format to another format. For 11 parallel formats, the new matrix distribution is determined by PETSc. 12 */ 13 int MatConvert_Basic(Mat mat,MatType newtype,Mat *M) 14 { 15 Scalar *vwork; 16 int ierr, i, nz, m, n, *cwork, rstart, rend,flg; 17 18 PetscFunctionBegin; 19 ierr = MatGetSize(mat,&m,&n); CHKERRQ(ierr); 20 if (newtype == MATSAME) newtype = (MatType)mat->type; 21 switch (newtype) { 22 case MATSEQAIJ: 23 ierr = MatCreateSeqAIJ(mat->comm,m,n,0,PETSC_NULL,M); CHKERRQ(ierr); 24 break; 25 case MATMPIROWBS: 26 if (m != n) SETERRQ(1,0,"MATMPIROWBS matrix must be square"); 27 ierr = MatCreateMPIRowbs(mat->comm,PETSC_DECIDE,m,0,PETSC_NULL, 28 PETSC_NULL,M); CHKERRQ(ierr); 29 break; 30 case MATMPIAIJ: 31 ierr = MatCreateMPIAIJ(mat->comm,PETSC_DECIDE,PETSC_DECIDE, 32 m,n,0,PETSC_NULL,0,PETSC_NULL,M); CHKERRQ(ierr); 33 break; 34 case MATSEQDENSE: 35 ierr = MatCreateSeqDense(mat->comm,m,n,PETSC_NULL,M); CHKERRQ(ierr); 36 break; 37 case MATMPIDENSE: 38 ierr = MatCreateMPIDense(mat->comm,PETSC_DECIDE,PETSC_DECIDE, 39 m,n,PETSC_NULL,M); CHKERRQ(ierr); 40 break; 41 case MATSEQBDIAG: 42 { 43 int bs = 1; /* Default block size = 1 */ 44 ierr = OptionsGetInt(PETSC_NULL,"-mat_block_size",&bs,&flg);CHKERRQ(ierr); 45 ierr = MatCreateSeqBDiag(mat->comm,m,n,0,bs,PETSC_NULL,PETSC_NULL,M);CHKERRQ(ierr); 46 break; 47 } 48 case MATMPIBDIAG: 49 { 50 int bs = 1; /* Default block size = 1 */ 51 ierr = OptionsGetInt(PETSC_NULL,"-mat_block_size",&bs,&flg);CHKERRQ(ierr); 52 ierr = MatCreateMPIBDiag(mat->comm,PETSC_DECIDE,m,n,0,bs,PETSC_NULL, 53 PETSC_NULL,M); CHKERRQ(ierr); 54 break; 55 } 56 case MATSEQBAIJ: 57 ierr = MatCreateSeqBAIJ(mat->comm,1,m,n,0,PETSC_NULL,M); CHKERRQ(ierr); 58 break; 59 case MATMPIBAIJ: 60 ierr = MatCreateMPIBAIJ(mat->comm,1,PETSC_DECIDE,PETSC_DECIDE, 61 m,n,0,PETSC_NULL,0,PETSC_NULL,M); CHKERRQ(ierr); 62 break; 63 default: 64 SETERRQ(1,0,"Matrix type is not currently supported"); 65 } 66 ierr = MatGetOwnershipRange(*M,&rstart,&rend); CHKERRQ(ierr); 67 for (i=rstart; i<rend; i++) { 68 ierr = MatGetRow(mat,i,&nz,&cwork,&vwork); CHKERRQ(ierr); 69 ierr = MatSetValues(*M,1,&i,nz,cwork,vwork,INSERT_VALUES); CHKERRQ(ierr); 70 ierr = MatRestoreRow(mat,i,&nz,&cwork,&vwork); CHKERRQ(ierr); 71 } 72 ierr = MatAssemblyBegin(*M,MAT_FINAL_ASSEMBLY); CHKERRQ(ierr); 73 ierr = MatAssemblyEnd(*M,MAT_FINAL_ASSEMBLY); CHKERRQ(ierr); 74 PetscFunctionReturn(0); 75 } 76