1a5eb4965SSatish Balay #ifdef PETSC_RCS_HEADER 2*3a40ed3dSBarry Smith static char vcid[] = "$Id: convert.c,v 1.59 1997/07/09 20:56:43 balay Exp bsmith $"; 356fe5c5cSLois Curfman McInnes #endif 456fe5c5cSLois Curfman McInnes 594a9d846SBarry Smith #include "src/mat/matimpl.h" 68b6375c0SLois Curfman McInnes 75615d1e5SSatish Balay #undef __FUNC__ 85615d1e5SSatish Balay #define __FUNC__ "MatConvert_Basic" 98b6375c0SLois Curfman McInnes /* 108b6375c0SLois Curfman McInnes MatConvert_Basic - Converts from any input format to another format. For 118b6375c0SLois Curfman McInnes parallel formats, the new matrix distribution is determined by PETSc. 128b6375c0SLois Curfman McInnes */ 138b6375c0SLois Curfman McInnes int MatConvert_Basic(Mat mat,MatType newtype,Mat *M) 148b6375c0SLois Curfman McInnes { 158b6375c0SLois Curfman McInnes Scalar *vwork; 1625cdf11fSBarry Smith int ierr, i, nz, m, n, *cwork, rstart, rend,flg; 1725cdf11fSBarry Smith 18*3a40ed3dSBarry Smith PetscFunctionBegin; 198b6375c0SLois Curfman McInnes ierr = MatGetSize(mat,&m,&n); CHKERRQ(ierr); 207181dc05SLois Curfman McInnes if (newtype == MATSAME) newtype = (MatType)mat->type; 218b6375c0SLois Curfman McInnes switch (newtype) { 228b6375c0SLois Curfman McInnes case MATSEQAIJ: 23b4fd4287SBarry Smith ierr = MatCreateSeqAIJ(mat->comm,m,n,0,PETSC_NULL,M); CHKERRQ(ierr); 248b6375c0SLois Curfman McInnes break; 258b6375c0SLois Curfman McInnes case MATMPIROWBS: 26e3372554SBarry Smith if (m != n) SETERRQ(1,0,"MATMPIROWBS matrix must be square"); 273b2fbd54SBarry Smith ierr = MatCreateMPIRowbs(mat->comm,PETSC_DECIDE,m,0,PETSC_NULL, 28b4fd4287SBarry Smith PETSC_NULL,M); CHKERRQ(ierr); 298b6375c0SLois Curfman McInnes break; 308b6375c0SLois Curfman McInnes case MATMPIAIJ: 313b2fbd54SBarry Smith ierr = MatCreateMPIAIJ(mat->comm,PETSC_DECIDE,PETSC_DECIDE, 32b4fd4287SBarry Smith 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 */ 44537820f0SBarry Smith ierr = OptionsGetInt(PETSC_NULL,"-mat_block_size",&bs,&flg);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 */ 51537820f0SBarry Smith ierr = OptionsGetInt(PETSC_NULL,"-mat_block_size",&bs,&flg);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: 64e3372554SBarry Smith SETERRQ(1,0,"Matrix type is not currently supported"); 658b6375c0SLois Curfman McInnes } 668b6375c0SLois Curfman McInnes ierr = MatGetOwnershipRange(*M,&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); 74*3a40ed3dSBarry Smith PetscFunctionReturn(0); 758b6375c0SLois Curfman McInnes } 76