xref: /petsc/src/mat/utils/convert.c (revision ac2a4f0d24b3b6a4ee93edbcad41f4bb9e923944)
1 /*$Id: convert.c,v 1.62 1999/05/04 20:33:40 balay Exp bsmith $*/
2 
3 #include "src/mat/matimpl.h"
4 
5 #undef __FUNC__
6 #define __FUNC__ "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,flg;
15 
16   PetscFunctionBegin;
17   ierr = MatGetSize(mat,&m,&n);CHKERRQ(ierr);
18   if (newtype == MATSAME) newtype = (MatType)mat->type;
19   switch (newtype) {
20     case MATSEQAIJ:
21       ierr = MatCreateSeqAIJ(mat->comm,m,n,0,PETSC_NULL,M);CHKERRQ(ierr);
22       break;
23     case MATMPIROWBS:
24       if (m != n) SETERRQ(PETSC_ERR_SUP,0,"MATMPIROWBS matrix must be square");
25       ierr = MatCreateMPIRowbs(mat->comm,PETSC_DECIDE,m,0,PETSC_NULL,
26              PETSC_NULL,M);CHKERRQ(ierr);
27       break;
28     case MATMPIAIJ:
29       ierr = MatCreateMPIAIJ(mat->comm,PETSC_DECIDE,PETSC_DECIDE,
30              m,n,0,PETSC_NULL,0,PETSC_NULL,M);CHKERRQ(ierr);
31       break;
32     case MATSEQDENSE:
33       ierr = MatCreateSeqDense(mat->comm,m,n,PETSC_NULL,M);CHKERRQ(ierr);
34       break;
35     case MATMPIDENSE:
36       ierr = MatCreateMPIDense(mat->comm,PETSC_DECIDE,PETSC_DECIDE,
37              m,n,PETSC_NULL,M);CHKERRQ(ierr);
38       break;
39     case MATSEQBDIAG:
40       {
41       int bs = 1; /* Default block size = 1 */
42       ierr = OptionsGetInt(PETSC_NULL,"-mat_block_size",&bs,&flg);CHKERRQ(ierr);
43       ierr = MatCreateSeqBDiag(mat->comm,m,n,0,bs,PETSC_NULL,PETSC_NULL,M);CHKERRQ(ierr);
44       break;
45       }
46     case MATMPIBDIAG:
47       {
48       int bs = 1; /* Default block size = 1 */
49       ierr = OptionsGetInt(PETSC_NULL,"-mat_block_size",&bs,&flg);CHKERRQ(ierr);
50       ierr = MatCreateMPIBDiag(mat->comm,PETSC_DECIDE,m,n,0,bs,PETSC_NULL,
51              PETSC_NULL,M);CHKERRQ(ierr);
52       break;
53       }
54     case MATSEQBAIJ:
55       ierr = MatCreateSeqBAIJ(mat->comm,1,m,n,0,PETSC_NULL,M);CHKERRQ(ierr);
56       break;
57     case MATMPIBAIJ:
58       ierr = MatCreateMPIBAIJ(mat->comm,1,PETSC_DECIDE,PETSC_DECIDE,
59              m,n,0,PETSC_NULL,0,PETSC_NULL,M);CHKERRQ(ierr);
60       break;
61     default:
62       SETERRQ(PETSC_ERR_SUP,0,"Matrix type is not currently supported");
63   }
64   ierr = MatGetOwnershipRange(*M,&rstart,&rend);CHKERRQ(ierr);
65   for (i=rstart; i<rend; i++) {
66     ierr = MatGetRow(mat,i,&nz,&cwork,&vwork);CHKERRQ(ierr);
67     ierr = MatSetValues(*M,1,&i,nz,cwork,vwork,INSERT_VALUES);CHKERRQ(ierr);
68     ierr = MatRestoreRow(mat,i,&nz,&cwork,&vwork);CHKERRQ(ierr);
69   }
70   ierr = MatAssemblyBegin(*M,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
71   ierr = MatAssemblyEnd(*M,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
72   PetscFunctionReturn(0);
73 }
74