xref: /petsc/src/mat/utils/convert.c (revision 94a9d846f3ddde88d13e28427bb8487cab59ecdb)
1 #ifndef lint
2 static char vcid[] = "$Id: convert.c,v 1.57 1997/01/06 20:26:03 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   ierr = MatGetSize(mat,&m,&n); 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     case MATMPIROWBS:
25       if (m != n) SETERRQ(1,0,"MATMPIROWBS matrix must be square");
26       ierr = MatCreateMPIRowbs(mat->comm,PETSC_DECIDE,m,0,PETSC_NULL,
27              PETSC_NULL,M); CHKERRQ(ierr);
28       break;
29     case MATMPIAIJ:
30       ierr = MatCreateMPIAIJ(mat->comm,PETSC_DECIDE,PETSC_DECIDE,
31              m,n,0,PETSC_NULL,0,PETSC_NULL,M); CHKERRQ(ierr);
32       break;
33     case MATSEQDENSE:
34       ierr = MatCreateSeqDense(mat->comm,m,n,PETSC_NULL,M); CHKERRQ(ierr);
35       break;
36     case MATMPIDENSE:
37       ierr = MatCreateMPIDense(mat->comm,PETSC_DECIDE,PETSC_DECIDE,
38              m,n,PETSC_NULL,M); CHKERRQ(ierr);
39       break;
40     case MATSEQBDIAG:
41       {
42       int bs = 1; /* Default block size = 1 */
43       ierr = OptionsGetInt(PETSC_NULL,"-mat_block_size",&bs,&flg);CHKERRQ(ierr);
44       ierr = MatCreateSeqBDiag(mat->comm,m,n,0,bs,PETSC_NULL,PETSC_NULL,M);CHKERRQ(ierr);
45       break;
46       }
47     case MATMPIBDIAG:
48       {
49       int bs = 1; /* Default block size = 1 */
50       ierr = OptionsGetInt(PETSC_NULL,"-mat_block_size",&bs,&flg);CHKERRQ(ierr);
51       ierr = MatCreateMPIBDiag(mat->comm,PETSC_DECIDE,m,n,0,bs,PETSC_NULL,
52              PETSC_NULL,M); CHKERRQ(ierr);
53       break;
54       }
55     case MATSEQBAIJ:
56       ierr = MatCreateSeqBAIJ(mat->comm,1,m,n,0,PETSC_NULL,M); CHKERRQ(ierr);
57       break;
58     case MATMPIBAIJ:
59       ierr = MatCreateMPIBAIJ(mat->comm,1,PETSC_DECIDE,PETSC_DECIDE,
60              m,n,0,PETSC_NULL,0,PETSC_NULL,M); CHKERRQ(ierr);
61       break;
62     default:
63       SETERRQ(1,0,"Matrix type is not currently supported");
64   }
65   ierr = MatGetOwnershipRange(*M,&rstart,&rend); CHKERRQ(ierr);
66   for (i=rstart; i<rend; i++) {
67     ierr = MatGetRow(mat,i,&nz,&cwork,&vwork); CHKERRQ(ierr);
68     ierr = MatSetValues(*M,1,&i,nz,cwork,vwork,INSERT_VALUES); CHKERRQ(ierr);
69     ierr = MatRestoreRow(mat,i,&nz,&cwork,&vwork); CHKERRQ(ierr);
70   }
71   ierr = MatAssemblyBegin(*M,MAT_FINAL_ASSEMBLY); CHKERRQ(ierr);
72   ierr = MatAssemblyEnd(*M,MAT_FINAL_ASSEMBLY); CHKERRQ(ierr);
73   return 0;
74 }
75