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