xref: /petsc/src/mat/utils/convert.c (revision 58154824fd593f6cacc0046fd1dfe043f485953e)
156fe5c5cSLois Curfman McInnes #ifndef lint
2*58154824SLois Curfman McInnes static char vcid[] = "$Id: convert.c,v 1.28 1995/10/04 03:58:40 bsmith Exp curfman $";
356fe5c5cSLois Curfman McInnes #endif
456fe5c5cSLois Curfman McInnes 
5*58154824SLois Curfman McInnes /* Matrix conversion routines.  For now, this supports only conversion from AIJ */
656fe5c5cSLois Curfman McInnes 
756fe5c5cSLois Curfman McInnes #include "mpiaij.h"
856fe5c5cSLois Curfman McInnes 
956fe5c5cSLois Curfman McInnes /*
10ec8511deSBarry Smith   MatConvert_SeqAIJ - Converts from MATSEQAIJ format to another format. For
1144ae05bdSLois Curfman McInnes   parallel formats, the new matrix distribution is determined by PETSc.
1256fe5c5cSLois Curfman McInnes  */
13ec8511deSBarry Smith int MatConvert_SeqAIJ(Mat mat, MatType newtype, Mat *newmat)
1456fe5c5cSLois Curfman McInnes {
15ec8511deSBarry Smith   Mat_SeqAIJ *aij = (Mat_SeqAIJ *) mat->data;
1656fe5c5cSLois Curfman McInnes   Scalar     *vwork;
1744ae05bdSLois Curfman McInnes   int        i, ierr, nz, m = aij->m, n = aij->n, *cwork, rstart, rend;
1856fe5c5cSLois Curfman McInnes 
1956fe5c5cSLois Curfman McInnes   switch (newtype) {
20ec8511deSBarry Smith     case MATSEQROW:
21416022c9SBarry Smith       ierr = MatCreateSeqRow(mat->comm,m,n,0,aij->ilen,newmat);CHKERRQ(ierr);
22416022c9SBarry Smith       break;
2344ae05bdSLois Curfman McInnes     case MATMPIROW:
24ec8511deSBarry Smith       if (m != n) SETERRQ(1,"MatConvert_SeqAIJ: MPIRowbs matrix must be square");
2544ae05bdSLois Curfman McInnes       ierr = MatCreateMPIRow(MPI_COMM_WORLD,PETSC_DECIDE,PETSC_DECIDE,
26416022c9SBarry Smith                              m,n,0,0,0,0,newmat); CHKERRQ(ierr);
27416022c9SBarry Smith       break;
28ec8511deSBarry Smith     case MATMPIROWBS:
29ec8511deSBarry Smith       ierr = MatCreateMPIRowbs(MPI_COMM_WORLD,PETSC_DECIDE,
30416022c9SBarry Smith                                m,0,0,0,newmat);CHKERRQ(ierr);
31416022c9SBarry Smith       break;
3244ae05bdSLois Curfman McInnes     case MATMPIAIJ:
3344ae05bdSLois Curfman McInnes       ierr = MatCreateMPIAIJ(MPI_COMM_WORLD,PETSC_DECIDE,PETSC_DECIDE,
34416022c9SBarry Smith                              m,n,0,0,0,0,newmat);CHKERRQ(ierr);
35416022c9SBarry Smith       break;
36ec8511deSBarry Smith     case MATSEQDENSE:
37416022c9SBarry Smith       ierr = MatCreateSeqDense(mat->comm,m,n,newmat); CHKERRQ(ierr);
38416022c9SBarry Smith       break;
39ec8511deSBarry Smith     case MATSEQBDIAG:
40416022c9SBarry Smith       {
41*58154824SLois Curfman McInnes       int nb = 1; /* Default block size = 1 */
42df60cc22SBarry Smith       OptionsGetInt(0,"-mat_bdiag_bsize",&nb);
43*58154824SLois Curfman McInnes       ierr = MatCreateSeqBDiag(mat->comm,m,n,0,nb,0,0,newmat); CHKERRQ(ierr);
4444ae05bdSLois Curfman McInnes       break;
4544ae05bdSLois Curfman McInnes       }
4644ae05bdSLois Curfman McInnes     case MATMPIBDIAG:
47416022c9SBarry Smith       {
48*58154824SLois Curfman McInnes       int nb = 1; /* Default block size = 1 */
4944ae05bdSLois Curfman McInnes       OptionsGetInt(0,"-mat_bdiag_bsize",&nb);
50*58154824SLois Curfman McInnes       ierr = MatCreateMPIBDiag(MPI_COMM_WORLD,PETSC_DECIDE,m,n,0,nb,0,0,newmat);
5178b31e54SBarry Smith       CHKERRQ(ierr);
52416022c9SBarry Smith       break;
5356fe5c5cSLois Curfman McInnes       }
54f3ba505bSLois Curfman McInnes     default:
55ec8511deSBarry Smith       SETERRQ(1,"MatConvert_SeqAIJ:Matrix type is not currently supported");
56f3ba505bSLois Curfman McInnes   }
5778b31e54SBarry Smith   ierr = MatGetOwnershipRange(*newmat,&rstart,&rend); CHKERRQ(ierr);
5844ae05bdSLois Curfman McInnes   for (i=rstart; i<rend; i++) {
5978b31e54SBarry Smith     ierr = MatGetRow(mat,i,&nz,&cwork,&vwork); CHKERRQ(ierr);
60416022c9SBarry Smith     ierr = MatSetValues(*newmat,1,&i,nz,cwork,vwork,INSERT_VALUES); CHKERRQ(ierr);
6178b31e54SBarry Smith     ierr = MatRestoreRow(mat,i,&nz,&cwork,&vwork); CHKERRQ(ierr);
6256fe5c5cSLois Curfman McInnes   }
6378b31e54SBarry Smith   ierr = MatAssemblyBegin(*newmat,FINAL_ASSEMBLY); CHKERRQ(ierr);
6478b31e54SBarry Smith   ierr = MatAssemblyEnd(*newmat,FINAL_ASSEMBLY); CHKERRQ(ierr);
6556fe5c5cSLois Curfman McInnes   return 0;
6656fe5c5cSLois Curfman McInnes }
6756fe5c5cSLois Curfman McInnes /* ------------------------------------------------------------------ */
6856fe5c5cSLois Curfman McInnes /*
691fb19edaSLois Curfman McInnes   MatConvert_MPIAIJ - Converts from MATMPIAIJ format to another
7056fe5c5cSLois Curfman McInnes   parallel format.
7156fe5c5cSLois Curfman McInnes  */
725c378462SLois Curfman McInnes int MatConvert_MPIAIJ(Mat mat, MatType newtype, Mat *newmat)
7356fe5c5cSLois Curfman McInnes {
741fb19edaSLois Curfman McInnes   Mat_MPIAIJ *aij = (Mat_MPIAIJ *) mat->data;
75ec8511deSBarry Smith   Mat_SeqAIJ *Ad = (Mat_SeqAIJ *)(aij->A->data), *Bd = (Mat_SeqAIJ *)(aij->B->data);
76abc0e9e4SLois Curfman McInnes   int        ierr, nz, i, ig,rstart = aij->rstart, m = aij->m, *cwork;
7756fe5c5cSLois Curfman McInnes   Scalar     *vwork;
7856fe5c5cSLois Curfman McInnes 
7956fe5c5cSLois Curfman McInnes   switch (newtype) {
801fb19edaSLois Curfman McInnes     case MATMPIROW:
810e6118f3SLois Curfman McInnes       ierr = MatCreateMPIRow(mat->comm,m,aij->n,aij->M,aij->N,0,Ad->ilen,
820e6118f3SLois Curfman McInnes 			0,Bd->ilen,newmat); CHKERRQ(ierr);
83abc0e9e4SLois Curfman McInnes       break;
8456fe5c5cSLois Curfman McInnes     default:
85bbb6d6a8SBarry Smith       SETERRQ(1,"MatConvert_MPIAIJ:Only MATMPIROW is currently suported");
8656fe5c5cSLois Curfman McInnes   }
87abc0e9e4SLois Curfman McInnes   /* Each processor converts its local rows */
8856fe5c5cSLois Curfman McInnes   for (i=0; i<m; i++) {
8956fe5c5cSLois Curfman McInnes     ig   = i + rstart;
9078b31e54SBarry Smith     ierr = MatGetRow(mat,ig,&nz,&cwork,&vwork);	CHKERRQ(ierr);
91416022c9SBarry Smith     ierr = MatSetValues(*newmat,1,&ig,nz,cwork,vwork,INSERT_VALUES); CHKERRQ(ierr);
9278b31e54SBarry Smith     ierr = MatRestoreRow(mat,ig,&nz,&cwork,&vwork); CHKERRQ(ierr);
9356fe5c5cSLois Curfman McInnes   }
9478b31e54SBarry Smith   ierr = MatAssemblyBegin(*newmat,FINAL_ASSEMBLY); CHKERRQ(ierr);
9578b31e54SBarry Smith   ierr = MatAssemblyEnd(*newmat,FINAL_ASSEMBLY); CHKERRQ(ierr);
9656fe5c5cSLois Curfman McInnes   return 0;
9756fe5c5cSLois Curfman McInnes }
98ec8511deSBarry Smith 
99ec8511deSBarry Smith 
100