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