xref: /petsc/src/mat/utils/convert.c (revision 3a40ed3dce77c081171d005ae1a6ff4bb9d13b6f)
1 #ifdef PETSC_RCS_HEADER
2 static char vcid[] = "$Id: convert.c,v 1.59 1997/07/09 20:56:43 balay Exp bsmith $";
3 #endif
4 
5 #include "src/mat/matimpl.h"
6 
7 #undef __FUNC__
8 #define __FUNC__ "MatConvert_Basic"
9 /*
10   MatConvert_Basic - Converts from any input format to another format. For
11   parallel formats, the new matrix distribution is determined by PETSc.
12  */
13 int MatConvert_Basic(Mat mat,MatType newtype,Mat *M)
14 {
15   Scalar *vwork;
16   int    ierr, i, nz, m, n, *cwork, rstart, rend,flg;
17 
18   PetscFunctionBegin;
19   ierr = MatGetSize(mat,&m,&n); CHKERRQ(ierr);
20   if (newtype == MATSAME) newtype = (MatType)mat->type;
21   switch (newtype) {
22     case MATSEQAIJ:
23       ierr = MatCreateSeqAIJ(mat->comm,m,n,0,PETSC_NULL,M); CHKERRQ(ierr);
24       break;
25     case MATMPIROWBS:
26       if (m != n) SETERRQ(1,0,"MATMPIROWBS matrix must be square");
27       ierr = MatCreateMPIRowbs(mat->comm,PETSC_DECIDE,m,0,PETSC_NULL,
28              PETSC_NULL,M); CHKERRQ(ierr);
29       break;
30     case MATMPIAIJ:
31       ierr = MatCreateMPIAIJ(mat->comm,PETSC_DECIDE,PETSC_DECIDE,
32              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,&flg);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,&flg);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(1,0,"Matrix type is not currently supported");
65   }
66   ierr = MatGetOwnershipRange(*M,&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