1*d852a638SPatrick Sanan #include <petsc/private/dmproductimpl.h> 2*d852a638SPatrick Sanan 3*d852a638SPatrick Sanan static PetscErrorCode DMDestroy_Product(DM dm) 4*d852a638SPatrick Sanan { 5*d852a638SPatrick Sanan PetscErrorCode ierr; 6*d852a638SPatrick Sanan DM_Product *product = (DM_Product*)dm->data; 7*d852a638SPatrick Sanan PetscInt d; 8*d852a638SPatrick Sanan 9*d852a638SPatrick Sanan PetscFunctionBeginUser; 10*d852a638SPatrick Sanan for (d=0; d<DMPRODUCT_MAX_DIM; ++d) { 11*d852a638SPatrick Sanan if (product->dm[d]) { 12*d852a638SPatrick Sanan ierr = DMDestroy(&product->dm[d]);CHKERRQ(ierr); 13*d852a638SPatrick Sanan } 14*d852a638SPatrick Sanan } 15*d852a638SPatrick Sanan ierr = PetscFree(product);CHKERRQ(ierr); 16*d852a638SPatrick Sanan PetscFunctionReturn(0); 17*d852a638SPatrick Sanan } 18*d852a638SPatrick Sanan 19*d852a638SPatrick Sanan /*MC 20*d852a638SPatrick Sanan DMPRODUCT = "product" - a DM representing a local Cartesian product of other DMs 21*d852a638SPatrick Sanan 22*d852a638SPatrick Sanan For each of dim dimensions, stores a sub-DM (need not be unique) and a dimension index. This specifies 23*d852a638SPatrick Sanan which dimension of the sub-DM corresponds to each dimension of the DMProduct. 24*d852a638SPatrick Sanan 25*d852a638SPatrick Sanan Level: advanced 26*d852a638SPatrick Sanan 27*d852a638SPatrick Sanan .seealso: DM, DMSTAG, DMProductGetDM(), DMProductSetDimensionIndex(), DMProductSetDM(), DMStagSetUniformCoordinatesProduct(), 28*d852a638SPatrick Sanan DMStagGet1DCoordinateArraysDOFRead() 29*d852a638SPatrick Sanan M*/ 30*d852a638SPatrick Sanan 31*d852a638SPatrick Sanan PETSC_EXTERN PetscErrorCode DMCreate_Product(DM dm) 32*d852a638SPatrick Sanan { 33*d852a638SPatrick Sanan PetscErrorCode ierr; 34*d852a638SPatrick Sanan DM_Product *product; 35*d852a638SPatrick Sanan PetscInt d; 36*d852a638SPatrick Sanan 37*d852a638SPatrick Sanan PetscFunctionBegin; 38*d852a638SPatrick Sanan PetscValidPointer(dm,1); 39*d852a638SPatrick Sanan ierr = PetscNewLog(dm,&product);CHKERRQ(ierr); 40*d852a638SPatrick Sanan dm->data = product; 41*d852a638SPatrick Sanan ierr = PetscObjectChangeTypeName((PetscObject)dm,DMPRODUCT);CHKERRQ(ierr); 42*d852a638SPatrick Sanan 43*d852a638SPatrick Sanan for (d=0; d<DMPRODUCT_MAX_DIM; ++d) product->dm[d] = NULL; 44*d852a638SPatrick Sanan for (d=0; d<DMPRODUCT_MAX_DIM; ++d) product->dim[d] = -1; 45*d852a638SPatrick Sanan 46*d852a638SPatrick Sanan dm->ops->destroy = DMDestroy_Product; 47*d852a638SPatrick Sanan PetscFunctionReturn(0); 48*d852a638SPatrick Sanan } 49