1 /*$Id: convert.c,v 1.66 2000/04/09 04:36:57 bsmith Exp bsmith $*/ 2 3 #include "src/mat/matimpl.h" 4 5 #undef __FUNC__ 6 #define __FUNC__ /*<a name=""></a>*/"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,lm,ln; 15 16 PetscFunctionBegin; 17 ierr = MatGetSize(mat,&m,&n);CHKERRQ(ierr); 18 ierr = MatGetLocalSize(mat,&lm,&ln);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 #if defined(PETSC_HAVE_BLOCKSOLVE) && !defined(PETSC_USE_COMPLEX) 25 case MATMPIROWBS: 26 if (m != n) SETERRQ(PETSC_ERR_SUP,0,"MATMPIROWBS matrix must be square"); 27 ierr = MatCreateMPIRowbs(mat->comm,PETSC_DECIDE,m,0,PETSC_NULL,PETSC_NULL,M);CHKERRQ(ierr); 28 break; 29 #endif 30 case MATMPIAIJ: 31 if (ln == n) ln = PETSC_DECIDE; 32 ierr = MatCreateMPIAIJ(mat->comm,lm,ln,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,PETSC_NULL);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,PETSC_NULL);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(PETSC_ERR_SUP,0,"Matrix type is not currently supported"); 65 } 66 ierr = MatGetOwnershipRange(mat,&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