[petsc-users] DaSetGetMatrix
domenico.borzacchiello at univ-st-etienne.fr
domenico.borzacchiello at univ-st-etienne.fr
Wed Apr 20 10:32:31 CDT 2011
Hi,
I'm running my code (3D Stokes Solver with MAC arrangement) pretty fine so
far with a FieldSplit/Schur Preconditioning.
I had to write my own DAGetMatrix routine cause it was using too much
memory (5 times the required size) for the matrices. The code works with
1 2 3 5 etc procs (I presume with any number of procs for which are only
possible 1D cartesian topologies of communicators i.e. any prime numbers)
then if I run with 4 procs for example it stops when assembling the MPIAIJ
matrix with the following error:
[1]PETSC ERROR: Nonconforming object sizes!
[1]PETSC ERROR: Local scatter sizes don't match!
What could be causing the error?
Thank you,
Domenico
here's the getmatrix function I'm using
#undef __FUNCT__
#define __FUNCT__ "DAGetMatrix_User_2"
PetscErrorCode DAGetMatrix_User_2(DA da,const MatType mtype,Mat *J)
{
PetscErrorCode ierr;
Mat A;
PetscInt xm,ym,zm,dim,dof,starts[3],dims[3];
const MatType Atype;
void
(*aij)(void)=PETSC_NULL,(*baij)(void)=PETSC_NULL,(*sbaij)(void)=PETSC_NULL;
ISLocalToGlobalMapping ltog,ltogb;
PetscFunctionBegin;
ierr = DAGetInfo(da,&dim, 0,0,0, 0,0,0,&dof,0,0,0);CHKERRQ(ierr);
if (dim != 3) SETERRQ(PETSC_ERR_ARG_WRONG,"Expected DA to be 3D");
ierr = DAGetCorners(da,0,0,0,&zm,&ym,&xm);CHKERRQ(ierr);
ierr = DAGetISLocalToGlobalMapping(da,<og);CHKERRQ(ierr);
ierr = DAGetISLocalToGlobalMappingBlck(da,<ogb);CHKERRQ(ierr);
ierr = MatCreate(((PetscObject)da)->comm,&A);CHKERRQ(ierr);
ierr =
MatSetSizes(A,dof*xm*ym*zm,dof*xm*ym*zm,PETSC_DETERMINE,PETSC_DETERMINE);CHKERRQ(ierr);
ierr = MatSetType(A,mtype);CHKERRQ(ierr);
ierr = MatSetFromOptions(A);CHKERRQ(ierr);
ierr = MatSeqAIJSetPreallocation(A,17,PETSC_NULL);CHKERRQ(ierr);
ierr =
MatMPIAIJSetPreallocation(A,17,PETSC_NULL,12,PETSC_NULL);CHKERRQ(ierr);
ierr = MatSeqBAIJSetPreallocation(A,dof,7,PETSC_NULL);CHKERRQ(ierr);
ierr =
MatMPIBAIJSetPreallocation(A,dof,7,PETSC_NULL,0,PETSC_NULL);CHKERRQ(ierr);
ierr = MatSeqSBAIJSetPreallocation(A,dof,4,PETSC_NULL);CHKERRQ(ierr);
ierr =
MatMPISBAIJSetPreallocation(A,dof,4,PETSC_NULL,0,PETSC_NULL);CHKERRQ(ierr);
ierr = MatSetDA(A,da);
ierr = MatSetFromOptions(A);
ierr = MatGetType(A,&Atype);
ierr = MatSetBlockSize(A,dof);CHKERRQ(ierr);
ierr = MatSetLocalToGlobalMapping(A,ltog);CHKERRQ(ierr);
ierr = MatSetLocalToGlobalMappingBlock(A,ltogb);CHKERRQ(ierr);
ierr =
DAGetGhostCorners(da,&starts[0],&starts[1],&starts[2],&dims[0],&dims[1],&dims[2]);CHKERRQ(ierr);
ierr = MatSetStencil(A,dim,dims,starts,dof);CHKERRQ(ierr);
*J = A;
PetscFunctionReturn(0);
}
More information about the petsc-users
mailing list