xref: /petsc/src/dm/impls/product/product.c (revision d852a6387a007acc70dbe016d928dd91f742016d)
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