Actual source code: product.c

  1: #include <petsc/private/dmproductimpl.h>

  3: static PetscErrorCode DMDestroy_Product(DM dm)
  4: {
  5:   DM_Product *product = (DM_Product *)dm->data;
  6:   PetscInt    d;

  8:   PetscFunctionBeginUser;
  9:   for (d = 0; d < DMPRODUCT_MAX_DIM; ++d) PetscCall(DMDestroy(&product->dm[d]));
 10:   PetscCall(PetscFree(product));
 11:   PetscFunctionReturn(PETSC_SUCCESS);
 12: }

 14: /*MC
 15:   DMPRODUCT = "product" - a DM representing a local Cartesian product of other DMs

 17:   For each of dim dimensions, stores a sub-DM (need not be unique) and a dimension index. This specifies
 18:   which dimension of the sub-DM corresponds to each dimension of the DMProduct.

 20:   Level: advanced

 22: .seealso: `DM`, `DMSTAG`, `DMProductGetDM()`, `DMProductSetDimensionIndex()`, `DMProductSetDM()`, `DMStagSetUniformCoordinatesProduct()`,
 23:           `DMStagGetProductCoordinateArrays()`, `DMStagGetProductCoordinateArraysRead()`
 24: M*/

 26: PETSC_EXTERN PetscErrorCode DMCreate_Product(DM dm)
 27: {
 28:   DM_Product *product;
 29:   PetscInt    d;

 31:   PetscFunctionBegin;
 32:   PetscAssertPointer(dm, 1);
 33:   PetscCall(PetscNew(&product));
 34:   dm->data = product;

 36:   for (d = 0; d < DMPRODUCT_MAX_DIM; ++d) product->dm[d] = NULL;
 37:   for (d = 0; d < DMPRODUCT_MAX_DIM; ++d) product->dim[d] = -1;

 39:   dm->ops->destroy = DMDestroy_Product;
 40:   PetscFunctionReturn(PETSC_SUCCESS);
 41: }