xref: /petsc/src/mat/utils/convert.c (revision a0a613f7e9bd81527fa91217d82e0d30cb4570e4)
1 #ifndef lint
2 static char vcid[] = "$Id: convert.c,v 1.1 1995/03/23 05:01:38 bsmith Exp bsmith $";
3 #endif
4 
5 /* Matrix conversion routines.  For now, this supports only AIJ */
6 
7 #include "mpiaij.h"
8 
9 /*
10   MatiAIJSeqConvert - Converts from MATAIJSEQ format to another
11   sequential format.
12  */
13 int MatiAIJSeqConvert(Mat mat, MATTYPE newtype, Mat *newmat)
14 {
15   Matiaij *aij = (Matiaij *) mat->data;
16   Scalar  *vwork;
17   int     i, ierr, nz, m = aij->m, n = aij->n, *cwork;
18 
19   if (mat->type != MATAIJSEQ) SETERR(1,"Input matrix must be MATAIJSEQ.");
20   switch (newtype) {
21     case MATROWSEQ:
22       ierr = MatCreateSequentialRow(m,n,0,aij->ilen,newmat);
23       CHKERR(ierr); break;
24     case MATDENSESEQ:
25       ierr = MatCreateSequentialDense(m,n,newmat);
26       CHKERR(ierr); break;
27     default:
28       SETERR(1,"Only MATROWSEQ and MATDENSESEQ are currently suported.");
29   }
30   for (i=0; i<m; i++) {
31     ierr = MatGetRow(mat,i,&nz,&cwork,&vwork);		CHKERR(ierr);
32     ierr = MatSetValues(*newmat,1,&i,nz,cwork,vwork,InsertValues); CHKERR(ierr);
33     ierr = MatRestoreRow(mat,i,&nz,&cwork,&vwork);	CHKERR(ierr);
34   }
35   ierr = MatBeginAssembly(*newmat);			CHKERR(ierr);
36   ierr = MatEndAssembly(*newmat);			CHKERR(ierr);
37   return 0;
38 }
39 /* ------------------------------------------------------------------ */
40 /*
41   MatiAIJMPIConvert - Converts from MATAIJMPI format to another
42   parallel format.
43  */
44 int MatiAIJMPIConvert(Mat mat, MATTYPE newtype, Mat *newmat)
45 {
46   Matimpiaij *aij = (Matimpiaij *) mat->data;
47   Mat        A = aij->A, B = aij->B, OldM;
48   Matiaij    *Ad = (Matiaij *)(A->data), *Bd = (Matiaij *)(B->data);
49   Scalar     *vwork;
50   int        ierr, m = aij->m, n = aij->n, M = aij->M, N = aij->N, *cwork;
51   int        nz,i,j,ig,submat, rstart = aij->rstart, cstart = aij->cstart;
52 
53   if (mat->type != MATAIJMPI) SETERR(1,"Input matrix must be MATAIJMPI.");
54   switch (newtype) {
55     case MATROWMPI:
56       for (i=0; i<m; i++)
57            printf("row=%d, A-nz=%d, B-nz=%d\n",i,Ad->ilen[i],Bd->ilen[i]);
58       ierr = MatCreateMPIRow(mat->comm,m,n,M,N,0,Ad->ilen,0,Bd->ilen,newmat);
59       CHKERR(ierr); break;
60     default:
61       SETERR(1,"Only MATROWMPI is currently suported.");
62   }
63   for (submat = 0; submat<2; submat++) {
64     if (submat == 0) OldM = A;
65     else OldM = B;
66     for (i=0; i<m; i++) {
67       ig   = i + rstart;
68       ierr = MatGetRow(OldM,i,&nz,&cwork,&vwork);	CHKERR(ierr);
69       if (submat == 0) {
70         for (j=0; j<nz; j++) cwork[j] += cstart;
71       } else {
72         /* This part is incorrect! */
73         for (j=0; j<nz; j++) cwork[j] += cstart;
74       }
75       ierr = MatSetValues(*newmat,1,&ig,nz,cwork,vwork,
76 		InsertValues);				CHKERR(ierr);
77       ierr = MatRestoreRow(OldM,ig,&nz,&cwork,&vwork);	CHKERR(ierr);
78     }
79   }
80   ierr = MatBeginAssembly(*newmat);			CHKERR(ierr);
81   ierr = MatEndAssembly(*newmat);			CHKERR(ierr);
82   return 0;
83 }
84