1*f1af5d2fSBarry Smith /*$Id: convert.c,v 1.63 1999/10/24 14:02:51 bsmith Exp bsmith $*/ 256fe5c5cSLois Curfman McInnes 394a9d846SBarry Smith #include "src/mat/matimpl.h" 48b6375c0SLois Curfman McInnes 55615d1e5SSatish Balay #undef __FUNC__ 65615d1e5SSatish Balay #define __FUNC__ "MatConvert_Basic" 78b6375c0SLois Curfman McInnes /* 88b6375c0SLois Curfman McInnes MatConvert_Basic - Converts from any input format to another format. For 98b6375c0SLois Curfman McInnes parallel formats, the new matrix distribution is determined by PETSc. 108b6375c0SLois Curfman McInnes */ 118b6375c0SLois Curfman McInnes int MatConvert_Basic(Mat mat,MatType newtype,Mat *M) 128b6375c0SLois Curfman McInnes { 138b6375c0SLois Curfman McInnes Scalar *vwork; 14*f1af5d2fSBarry Smith int ierr, i, nz, m, n, *cwork, rstart, rend,lm,ln; 1525cdf11fSBarry Smith 163a40ed3dSBarry Smith PetscFunctionBegin; 178b6375c0SLois Curfman McInnes ierr = MatGetSize(mat,&m,&n);CHKERRQ(ierr); 18*f1af5d2fSBarry Smith ierr = MatGetLocalSize(mat,&lm,&ln);CHKERRQ(ierr); 197181dc05SLois Curfman McInnes if (newtype == MATSAME) newtype = (MatType)mat->type; 208b6375c0SLois Curfman McInnes switch (newtype) { 218b6375c0SLois Curfman McInnes case MATSEQAIJ: 22b4fd4287SBarry Smith ierr = MatCreateSeqAIJ(mat->comm,m,n,0,PETSC_NULL,M);CHKERRQ(ierr); 238b6375c0SLois Curfman McInnes break; 24*f1af5d2fSBarry Smith #if defined(PETSC_HAVE_BLOCKSOLVE) && !defined(PETSC_USE_COMPLEX) 258b6375c0SLois Curfman McInnes case MATMPIROWBS: 26a8c6a408SBarry Smith if (m != n) SETERRQ(PETSC_ERR_SUP,0,"MATMPIROWBS matrix must be square"); 27*f1af5d2fSBarry Smith ierr = MatCreateMPIRowbs(mat->comm,PETSC_DECIDE,m,0,PETSC_NULL,PETSC_NULL,M);CHKERRQ(ierr); 288b6375c0SLois Curfman McInnes break; 29*f1af5d2fSBarry Smith #endif 308b6375c0SLois Curfman McInnes case MATMPIAIJ: 31*f1af5d2fSBarry Smith if (ln == n) ln = PETSC_DECIDE; 32*f1af5d2fSBarry Smith ierr = MatCreateMPIAIJ(mat->comm,lm,ln,m,n,0,PETSC_NULL,0,PETSC_NULL,M);CHKERRQ(ierr); 338b6375c0SLois Curfman McInnes break; 348b6375c0SLois Curfman McInnes case MATSEQDENSE: 35b4fd4287SBarry Smith ierr = MatCreateSeqDense(mat->comm,m,n,PETSC_NULL,M);CHKERRQ(ierr); 368b6375c0SLois Curfman McInnes break; 378b6375c0SLois Curfman McInnes case MATMPIDENSE: 383b2fbd54SBarry Smith ierr = MatCreateMPIDense(mat->comm,PETSC_DECIDE,PETSC_DECIDE, 39b4fd4287SBarry Smith m,n,PETSC_NULL,M);CHKERRQ(ierr); 408b6375c0SLois Curfman McInnes break; 418b6375c0SLois Curfman McInnes case MATSEQBDIAG: 428b6375c0SLois Curfman McInnes { 43537820f0SBarry Smith int bs = 1; /* Default block size = 1 */ 44*f1af5d2fSBarry Smith ierr = OptionsGetInt(PETSC_NULL,"-mat_block_size",&bs,PETSC_NULL);CHKERRQ(ierr); 45537820f0SBarry Smith ierr = MatCreateSeqBDiag(mat->comm,m,n,0,bs,PETSC_NULL,PETSC_NULL,M);CHKERRQ(ierr); 468b6375c0SLois Curfman McInnes break; 478b6375c0SLois Curfman McInnes } 488b6375c0SLois Curfman McInnes case MATMPIBDIAG: 498b6375c0SLois Curfman McInnes { 50537820f0SBarry Smith int bs = 1; /* Default block size = 1 */ 51*f1af5d2fSBarry Smith ierr = OptionsGetInt(PETSC_NULL,"-mat_block_size",&bs,PETSC_NULL);CHKERRQ(ierr); 523b2fbd54SBarry Smith ierr = MatCreateMPIBDiag(mat->comm,PETSC_DECIDE,m,n,0,bs,PETSC_NULL, 53b4fd4287SBarry Smith PETSC_NULL,M);CHKERRQ(ierr); 548b6375c0SLois Curfman McInnes break; 558b6375c0SLois Curfman McInnes } 5694a9d846SBarry Smith case MATSEQBAIJ: 5794a9d846SBarry Smith ierr = MatCreateSeqBAIJ(mat->comm,1,m,n,0,PETSC_NULL,M);CHKERRQ(ierr); 5894a9d846SBarry Smith break; 5994a9d846SBarry Smith case MATMPIBAIJ: 6094a9d846SBarry Smith ierr = MatCreateMPIBAIJ(mat->comm,1,PETSC_DECIDE,PETSC_DECIDE, 6194a9d846SBarry Smith m,n,0,PETSC_NULL,0,PETSC_NULL,M);CHKERRQ(ierr); 6294a9d846SBarry Smith break; 638b6375c0SLois Curfman McInnes default: 64a8c6a408SBarry Smith SETERRQ(PETSC_ERR_SUP,0,"Matrix type is not currently supported"); 658b6375c0SLois Curfman McInnes } 66*f1af5d2fSBarry Smith ierr = MatGetOwnershipRange(mat,&rstart,&rend);CHKERRQ(ierr); 678b6375c0SLois Curfman McInnes for (i=rstart; i<rend; i++) { 688b6375c0SLois Curfman McInnes ierr = MatGetRow(mat,i,&nz,&cwork,&vwork);CHKERRQ(ierr); 698b6375c0SLois Curfman McInnes ierr = MatSetValues(*M,1,&i,nz,cwork,vwork,INSERT_VALUES);CHKERRQ(ierr); 708b6375c0SLois Curfman McInnes ierr = MatRestoreRow(mat,i,&nz,&cwork,&vwork);CHKERRQ(ierr); 718b6375c0SLois Curfman McInnes } 726d4a8577SBarry Smith ierr = MatAssemblyBegin(*M,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 736d4a8577SBarry Smith ierr = MatAssemblyEnd(*M,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 743a40ed3dSBarry Smith PetscFunctionReturn(0); 758b6375c0SLois Curfman McInnes } 76