/*$Id: convert.c,v 1.66 2000/04/09 04:36:57 bsmith Exp bsmith $*/
#include "src/mat/matimpl.h"
#undef __FUNC__
#define __FUNC__ /**/"MatConvert_Basic"
/*
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,lm,ln;
PetscFunctionBegin;
ierr = MatGetSize(mat,&m,&n);CHKERRQ(ierr);
ierr = MatGetLocalSize(mat,&lm,&ln);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;
#if defined(PETSC_HAVE_BLOCKSOLVE) && !defined(PETSC_USE_COMPLEX)
case MATMPIROWBS:
if (m != n) SETERRQ(PETSC_ERR_SUP,0,"MATMPIROWBS matrix must be square");
ierr = MatCreateMPIRowbs(mat->comm,PETSC_DECIDE,m,0,PETSC_NULL,PETSC_NULL,M);CHKERRQ(ierr);
break;
#endif
case MATMPIAIJ:
if (ln == n) ln = PETSC_DECIDE;
ierr = MatCreateMPIAIJ(mat->comm,lm,ln,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(mat->comm,PETSC_DECIDE,PETSC_DECIDE,
m,n,PETSC_NULL,M);CHKERRQ(ierr);
break;
case MATSEQBDIAG:
{
int bs = 1; /* Default block size = 1 */
ierr = OptionsGetInt(PETSC_NULL,"-mat_block_size",&bs,PETSC_NULL);CHKERRQ(ierr);
ierr = MatCreateSeqBDiag(mat->comm,m,n,0,bs,PETSC_NULL,PETSC_NULL,M);CHKERRQ(ierr);
break;
}
case MATMPIBDIAG:
{
int bs = 1; /* Default block size = 1 */
ierr = OptionsGetInt(PETSC_NULL,"-mat_block_size",&bs,PETSC_NULL);CHKERRQ(ierr);
ierr = MatCreateMPIBDiag(mat->comm,PETSC_DECIDE,m,n,0,bs,PETSC_NULL,
PETSC_NULL,M);CHKERRQ(ierr);
break;
}
case MATSEQBAIJ:
ierr = MatCreateSeqBAIJ(mat->comm,1,m,n,0,PETSC_NULL,M);CHKERRQ(ierr);
break;
case MATMPIBAIJ:
ierr = MatCreateMPIBAIJ(mat->comm,1,PETSC_DECIDE,PETSC_DECIDE,
m,n,0,PETSC_NULL,0,PETSC_NULL,M);CHKERRQ(ierr);
break;
default:
SETERRQ(PETSC_ERR_SUP,0,"Matrix type is not currently supported");
}
ierr = MatGetOwnershipRange(mat,&rstart,&rend);CHKERRQ(ierr);
for (i=rstart; i