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