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