1 #ifndef lint 2 static char vcid[] = "$Id: convert.c,v 1.57 1997/01/06 20:26:03 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 ierr = MatGetSize(mat,&m,&n); CHKERRQ(ierr); 19 if (newtype == MATSAME) newtype = (MatType)mat->type; 20 switch (newtype) { 21 case MATSEQAIJ: 22 ierr = MatCreateSeqAIJ(mat->comm,m,n,0,PETSC_NULL,M); CHKERRQ(ierr); 23 break; 24 case MATMPIROWBS: 25 if (m != n) SETERRQ(1,0,"MATMPIROWBS matrix must be square"); 26 ierr = MatCreateMPIRowbs(mat->comm,PETSC_DECIDE,m,0,PETSC_NULL, 27 PETSC_NULL,M); CHKERRQ(ierr); 28 break; 29 case MATMPIAIJ: 30 ierr = MatCreateMPIAIJ(mat->comm,PETSC_DECIDE,PETSC_DECIDE, 31 m,n,0,PETSC_NULL,0,PETSC_NULL,M); CHKERRQ(ierr); 32 break; 33 case MATSEQDENSE: 34 ierr = MatCreateSeqDense(mat->comm,m,n,PETSC_NULL,M); CHKERRQ(ierr); 35 break; 36 case MATMPIDENSE: 37 ierr = MatCreateMPIDense(mat->comm,PETSC_DECIDE,PETSC_DECIDE, 38 m,n,PETSC_NULL,M); CHKERRQ(ierr); 39 break; 40 case MATSEQBDIAG: 41 { 42 int bs = 1; /* Default block size = 1 */ 43 ierr = OptionsGetInt(PETSC_NULL,"-mat_block_size",&bs,&flg);CHKERRQ(ierr); 44 ierr = MatCreateSeqBDiag(mat->comm,m,n,0,bs,PETSC_NULL,PETSC_NULL,M);CHKERRQ(ierr); 45 break; 46 } 47 case MATMPIBDIAG: 48 { 49 int bs = 1; /* Default block size = 1 */ 50 ierr = OptionsGetInt(PETSC_NULL,"-mat_block_size",&bs,&flg);CHKERRQ(ierr); 51 ierr = MatCreateMPIBDiag(mat->comm,PETSC_DECIDE,m,n,0,bs,PETSC_NULL, 52 PETSC_NULL,M); CHKERRQ(ierr); 53 break; 54 } 55 case MATSEQBAIJ: 56 ierr = MatCreateSeqBAIJ(mat->comm,1,m,n,0,PETSC_NULL,M); CHKERRQ(ierr); 57 break; 58 case MATMPIBAIJ: 59 ierr = MatCreateMPIBAIJ(mat->comm,1,PETSC_DECIDE,PETSC_DECIDE, 60 m,n,0,PETSC_NULL,0,PETSC_NULL,M); CHKERRQ(ierr); 61 break; 62 default: 63 SETERRQ(1,0,"Matrix type is not currently supported"); 64 } 65 ierr = MatGetOwnershipRange(*M,&rstart,&rend); CHKERRQ(ierr); 66 for (i=rstart; i<rend; i++) { 67 ierr = MatGetRow(mat,i,&nz,&cwork,&vwork); CHKERRQ(ierr); 68 ierr = MatSetValues(*M,1,&i,nz,cwork,vwork,INSERT_VALUES); CHKERRQ(ierr); 69 ierr = MatRestoreRow(mat,i,&nz,&cwork,&vwork); CHKERRQ(ierr); 70 } 71 ierr = MatAssemblyBegin(*M,MAT_FINAL_ASSEMBLY); CHKERRQ(ierr); 72 ierr = MatAssemblyEnd(*M,MAT_FINAL_ASSEMBLY); CHKERRQ(ierr); 73 return 0; 74 } 75