#ifndef lint static char vcid[] = "$Id: convert.c,v 1.50 1996/07/08 22:20:46 bsmith Exp bsmith $"; #endif #include "src/mat/impls/aij/mpi/mpiaij.h" #include "src/mat/impls/bdiag/mpi/mpibdiag.h" /* This file contains a generic conversion routine and implementation specific versions for increased efficiency. */ /* MatConvert_Basic - Converts from any input format to another format. For parallel formats, the new matrix distribution is determined by PETSc. */ int MatConvert_Basic(Mat mat,MatType newtype,Mat *M) { Scalar *vwork; int ierr, i, nz, m, n, *cwork, rstart, rend,flg; ierr = MatGetSize(mat,&m,&n); CHKERRQ(ierr); if (newtype == MATSAME) newtype = (MatType)mat->type; switch (newtype) { case MATSEQAIJ: ierr = MatCreateSeqAIJ(mat->comm,m,n,0,PETSC_NULL,M); CHKERRQ(ierr); break; case MATMPIROWBS: if (m != n) SETERRQ(1,"MatConvert:MATMPIROWBS matrix must be square"); ierr = MatCreateMPIRowbs(MPI_COMM_WORLD,PETSC_DECIDE,m,0,PETSC_NULL, PETSC_NULL,M); CHKERRQ(ierr); break; case MATMPIAIJ: ierr = MatCreateMPIAIJ(MPI_COMM_WORLD,PETSC_DECIDE,PETSC_DECIDE, m,n,0,PETSC_NULL,0,PETSC_NULL,M); CHKERRQ(ierr); break; case MATSEQDENSE: ierr = MatCreateSeqDense(mat->comm,m,n,PETSC_NULL,M); CHKERRQ(ierr); break; case MATMPIDENSE: ierr = MatCreateMPIDense(MPI_COMM_WORLD,PETSC_DECIDE,PETSC_DECIDE, m,n,PETSC_NULL,M); CHKERRQ(ierr); break; case MATSEQBDIAG: { int nb = 1; /* Default block size = 1 */ ierr = OptionsGetInt(PETSC_NULL,"-mat_block_size",&nb,&flg);CHKERRQ(ierr); ierr = MatCreateSeqBDiag(mat->comm,m,n,0,nb,PETSC_NULL,PETSC_NULL,M);CHKERRQ(ierr); break; } case MATMPIBDIAG: { int nb = 1; /* Default block size = 1 */ ierr = OptionsGetInt(PETSC_NULL,"-mat_block_size",&nb,&flg);CHKERRQ(ierr); ierr = MatCreateMPIBDiag(MPI_COMM_WORLD,PETSC_DECIDE,m,n,0,nb,PETSC_NULL, PETSC_NULL,M); CHKERRQ(ierr); break; } default: SETERRQ(1,"MatConvert:Matrix type is not currently supported"); } ierr = MatGetOwnershipRange(*M,&rstart,&rend); CHKERRQ(ierr); for (i=rstart; idata; Scalar *vwork; int i, ierr, nz, m = a->m, n = a->n, *cwork, rstart, rend,flg; switch (newtype) { case MATMPIROWBS: if (m != n) SETERRQ(1,"MatConvert_SeqAIJ:MATMPIROWBS matrix must be square"); ierr = MatCreateMPIRowbs(MPI_COMM_WORLD,PETSC_DECIDE,m,0,PETSC_NULL,PETSC_NULL,B); CHKERRQ(ierr); break; case MATMPIAIJ: ierr = MatCreateMPIAIJ(MPI_COMM_WORLD,PETSC_DECIDE,PETSC_DECIDE, m,n,0,PETSC_NULL,0,PETSC_NULL,B); CHKERRQ(ierr); break; case MATSEQDENSE: ierr = MatCreateSeqDense(A->comm,m,n,PETSC_NULL,B); CHKERRQ(ierr); break; case MATMPIDENSE: ierr = MatCreateMPIDense(MPI_COMM_WORLD,PETSC_DECIDE,PETSC_DECIDE, m,n,PETSC_NULL,B); CHKERRQ(ierr); break; case MATSEQBDIAG: { int nb = 1; /* Default block size = 1 */ ierr = OptionsGetInt(PETSC_NULL,"-mat_block_size",&nb,&flg);CHKERRQ(ierr); ierr = MatCreateSeqBDiag(A->comm,m,n,0,nb,PETSC_NULL,PETSC_NULL,B); CHKERRQ(ierr); break; } case MATMPIBDIAG: { int nb = 1; /* Default block size = 1 */ ierr = OptionsGetInt(PETSC_NULL,"-mat_block_size",&nb,&flg);CHKERRQ(ierr); CHKERRQ(ierr); ierr = MatCreateMPIBDiag(MPI_COMM_WORLD,PETSC_DECIDE,m,n,0,nb,PETSC_NULL, PETSC_NULL,B); CHKERRQ(ierr); break; } default: SETERRQ(1,"MatConvert_SeqAIJ:Matrix type is not currently supported"); } ierr = MatGetOwnershipRange(*B,&rstart,&rend); CHKERRQ(ierr); for (i=rstart; idata; int ierr, nz, i, ig, rstart = a->rstart, m = a->m, *cwork; Scalar *vwork; for (i=0; idata; Scalar *vwork, *vw2; int i, ierr, nz, m = a->m, n = a->n, *cwork, rstart, rend; int j, *cw2, ict; /* rough over-estimate; could refine for individual rows */ nz = PetscMin(n,a->nd*a->nb); switch (newtype) { case MATSEQAIJ: ierr = MatCreateSeqAIJ(A->comm,m,n,nz,PETSC_NULL,B); CHKERRQ(ierr); break; case MATMPIROWBS: if (m != n) SETERRQ(1,"MatConvert_SeqBDiag:MATMPIROWBS matrix must be square"); ierr = MatCreateMPIRowbs(MPI_COMM_WORLD,PETSC_DECIDE,m,0,PETSC_NULL,PETSC_NULL, B); CHKERRQ(ierr); break; case MATMPIAIJ: ierr = MatCreateMPIAIJ(MPI_COMM_WORLD,PETSC_DECIDE,PETSC_DECIDE, m,n,0,PETSC_NULL,0,PETSC_NULL,B); CHKERRQ(ierr); break; case MATSEQDENSE: ierr = MatCreateSeqDense(A->comm,m,n,PETSC_NULL,B); CHKERRQ(ierr); break; case MATMPIDENSE: ierr = MatCreateMPIDense(MPI_COMM_WORLD,PETSC_DECIDE,PETSC_DECIDE, m,n,PETSC_NULL,B); CHKERRQ(ierr); break; case MATMPIBDIAG: { ierr = MatCreateMPIBDiag(MPI_COMM_WORLD,PETSC_DECIDE,m,n,a->nd,a->nb, PETSC_NULL,PETSC_NULL,B); CHKERRQ(ierr); break; } default: SETERRQ(1,"MatConvert_SeqBDiag:Matrix type is not currently supported"); } ierr = MatGetOwnershipRange(*B,&rstart,&rend); CHKERRQ(ierr); cw2 = (int *)PetscMalloc( n * sizeof(int) ); CHKPTRQ(cw2); vw2 = (Scalar *)PetscMalloc( n * sizeof(Scalar) ); CHKPTRQ(vw2); for (i=rstart; i