xref: /petsc/src/mat/utils/convert.c (revision f1af5d2ffeae1f5fc391a89939f4818e47770ae3)
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