xref: /petsc/src/mat/utils/convert.c (revision 2399e097d578db20dd4db26af4297c62119f5cb2)
156fe5c5cSLois Curfman McInnes #ifndef lint
2*2399e097SLois Curfman McInnes static char vcid[] = "$Id: convert.c,v 1.29 1995/10/04 20:49:27 curfman Exp curfman $";
356fe5c5cSLois Curfman McInnes #endif
456fe5c5cSLois Curfman McInnes 
5*2399e097SLois Curfman McInnes /* This file contains implementation-specific matrix conversion routines.
6*2399e097SLois Curfman McInnes    For now, this has been implemented only for AIJ.  See MatConvert() for
7*2399e097SLois Curfman McInnes    generic conversion code. */
856fe5c5cSLois Curfman McInnes 
956fe5c5cSLois Curfman McInnes #include "mpiaij.h"
1056fe5c5cSLois Curfman McInnes 
1156fe5c5cSLois Curfman McInnes /*
12ec8511deSBarry Smith   MatConvert_SeqAIJ - Converts from MATSEQAIJ format to another format. For
1344ae05bdSLois Curfman McInnes   parallel formats, the new matrix distribution is determined by PETSc.
1456fe5c5cSLois Curfman McInnes  */
15*2399e097SLois Curfman McInnes int MatConvert_SeqAIJ(Mat A, MatType newtype, Mat *B)
1656fe5c5cSLois Curfman McInnes {
17*2399e097SLois Curfman McInnes   Mat_SeqAIJ *a = (Mat_SeqAIJ *) A->data;
1856fe5c5cSLois Curfman McInnes   Scalar     *vwork;
19*2399e097SLois Curfman McInnes   int        i, ierr, nz, m = a->m, n = a->n, *cwork, rstart, rend;
2056fe5c5cSLois Curfman McInnes 
2156fe5c5cSLois Curfman McInnes   switch (newtype) {
22ec8511deSBarry Smith     case MATSEQROW:
23*2399e097SLois Curfman McInnes       ierr = MatCreateSeqRow(A->comm,m,n,0,a->ilen,B); CHKERRQ(ierr);
24416022c9SBarry Smith       break;
2544ae05bdSLois Curfman McInnes     case MATMPIROW:
2644ae05bdSLois Curfman McInnes       ierr = MatCreateMPIRow(MPI_COMM_WORLD,PETSC_DECIDE,PETSC_DECIDE,
27*2399e097SLois Curfman McInnes                              m,n,0,0,0,0,B); CHKERRQ(ierr);
28416022c9SBarry Smith       break;
29ec8511deSBarry Smith     case MATMPIROWBS:
30*2399e097SLois Curfman McInnes       if (m != n) SETERRQ(1,"MatConvert_SeqAIJ:MATMPIROWBS matrix must be square");
31*2399e097SLois Curfman McInnes       ierr = MatCreateMPIRowbs(MPI_COMM_WORLD,PETSC_DECIDE,m,0,0,0,B); CHKERRQ(ierr);
32416022c9SBarry Smith       break;
3344ae05bdSLois Curfman McInnes     case MATMPIAIJ:
3444ae05bdSLois Curfman McInnes       ierr = MatCreateMPIAIJ(MPI_COMM_WORLD,PETSC_DECIDE,PETSC_DECIDE,
35*2399e097SLois Curfman McInnes                              m,n,0,0,0,0,B); CHKERRQ(ierr);
36416022c9SBarry Smith       break;
37ec8511deSBarry Smith     case MATSEQDENSE:
38*2399e097SLois Curfman McInnes       ierr = MatCreateSeqDense(A->comm,m,n,B); CHKERRQ(ierr);
39*2399e097SLois Curfman McInnes       break;
40*2399e097SLois Curfman McInnes     case MATMPIDENSE:
41*2399e097SLois Curfman McInnes       ierr = MatCreateMPIDense(MPI_COMM_WORLD,PETSC_DECIDE,PETSC_DECIDE,
42*2399e097SLois Curfman McInnes                                m,n,B); CHKERRQ(ierr);
43416022c9SBarry Smith       break;
44ec8511deSBarry Smith     case MATSEQBDIAG:
45416022c9SBarry Smith       {
4658154824SLois Curfman McInnes       int nb = 1; /* Default block size = 1 */
47df60cc22SBarry Smith       OptionsGetInt(0,"-mat_bdiag_bsize",&nb);
48*2399e097SLois Curfman McInnes       ierr = MatCreateSeqBDiag(A->comm,m,n,0,nb,0,0,B); CHKERRQ(ierr);
4944ae05bdSLois Curfman McInnes       break;
5044ae05bdSLois Curfman McInnes       }
5144ae05bdSLois Curfman McInnes     case MATMPIBDIAG:
52416022c9SBarry Smith       {
5358154824SLois Curfman McInnes       int nb = 1; /* Default block size = 1 */
5444ae05bdSLois Curfman McInnes       OptionsGetInt(0,"-mat_bdiag_bsize",&nb);
55*2399e097SLois Curfman McInnes       ierr = MatCreateMPIBDiag(MPI_COMM_WORLD,PETSC_DECIDE,m,n,0,nb,0,0,B);
5678b31e54SBarry Smith       CHKERRQ(ierr);
57416022c9SBarry Smith       break;
5856fe5c5cSLois Curfman McInnes       }
59f3ba505bSLois Curfman McInnes     default:
60ec8511deSBarry Smith       SETERRQ(1,"MatConvert_SeqAIJ:Matrix type is not currently supported");
61f3ba505bSLois Curfman McInnes   }
62*2399e097SLois Curfman McInnes   ierr = MatGetOwnershipRange(*B,&rstart,&rend); CHKERRQ(ierr);
6344ae05bdSLois Curfman McInnes   for (i=rstart; i<rend; i++) {
64*2399e097SLois Curfman McInnes     ierr = MatGetRow(A,i,&nz,&cwork,&vwork); CHKERRQ(ierr);
65*2399e097SLois Curfman McInnes     ierr = MatSetValues(*B,1,&i,nz,cwork,vwork,INSERT_VALUES); CHKERRQ(ierr);
66*2399e097SLois Curfman McInnes     ierr = MatRestoreRow(A,i,&nz,&cwork,&vwork); CHKERRQ(ierr);
6756fe5c5cSLois Curfman McInnes   }
68*2399e097SLois Curfman McInnes   ierr = MatAssemblyBegin(*B,FINAL_ASSEMBLY); CHKERRQ(ierr);
69*2399e097SLois Curfman McInnes   ierr = MatAssemblyEnd(*B,FINAL_ASSEMBLY); CHKERRQ(ierr);
7056fe5c5cSLois Curfman McInnes   return 0;
7156fe5c5cSLois Curfman McInnes }
7256fe5c5cSLois Curfman McInnes /* ------------------------------------------------------------------ */
7356fe5c5cSLois Curfman McInnes /*
741fb19edaSLois Curfman McInnes   MatConvert_MPIAIJ - Converts from MATMPIAIJ format to another
7556fe5c5cSLois Curfman McInnes   parallel format.
7656fe5c5cSLois Curfman McInnes  */
77*2399e097SLois Curfman McInnes int MatConvert_MPIAIJ(Mat A, MatType newtype, Mat *B)
7856fe5c5cSLois Curfman McInnes {
79*2399e097SLois Curfman McInnes   Mat_MPIAIJ *a = (Mat_MPIAIJ *) A->data;
80*2399e097SLois Curfman McInnes   Mat_SeqAIJ *Ad = (Mat_SeqAIJ *)(a->A->data), *Bd = (Mat_SeqAIJ *)(a->B->data);
81*2399e097SLois Curfman McInnes   int        ierr, nz, i, ig, rstart = a->rstart, m = a->m, *cwork;
8256fe5c5cSLois Curfman McInnes   Scalar     *vwork;
8356fe5c5cSLois Curfman McInnes 
8456fe5c5cSLois Curfman McInnes   switch (newtype) {
851fb19edaSLois Curfman McInnes     case MATMPIROW:
86*2399e097SLois Curfman McInnes       ierr = MatCreateMPIRow(A->comm,m,a->n,a->M,a->N,0,Ad->ilen,
87*2399e097SLois Curfman McInnes 			0,Bd->ilen,B); CHKERRQ(ierr);
88abc0e9e4SLois Curfman McInnes       break;
8956fe5c5cSLois Curfman McInnes     default:
90bbb6d6a8SBarry Smith       SETERRQ(1,"MatConvert_MPIAIJ:Only MATMPIROW is currently suported");
9156fe5c5cSLois Curfman McInnes   }
92abc0e9e4SLois Curfman McInnes   /* Each processor converts its local rows */
9356fe5c5cSLois Curfman McInnes   for (i=0; i<m; i++) {
9456fe5c5cSLois Curfman McInnes     ig   = i + rstart;
95*2399e097SLois Curfman McInnes     ierr = MatGetRow(A,ig,&nz,&cwork,&vwork);	CHKERRQ(ierr);
96*2399e097SLois Curfman McInnes     ierr = MatSetValues(*B,1,&ig,nz,cwork,vwork,INSERT_VALUES); CHKERRQ(ierr);
97*2399e097SLois Curfman McInnes     ierr = MatRestoreRow(A,ig,&nz,&cwork,&vwork); CHKERRQ(ierr);
9856fe5c5cSLois Curfman McInnes   }
99*2399e097SLois Curfman McInnes   ierr = MatAssemblyBegin(*B,FINAL_ASSEMBLY); CHKERRQ(ierr);
100*2399e097SLois Curfman McInnes   ierr = MatAssemblyEnd(*B,FINAL_ASSEMBLY); CHKERRQ(ierr);
10156fe5c5cSLois Curfman McInnes   return 0;
10256fe5c5cSLois Curfman McInnes }
103ec8511deSBarry Smith 
104ec8511deSBarry Smith 
105