xref: /petsc/src/dm/impls/product/product.c (revision eefb368e60eb43c3e08ca0927788b33650449484)
1d852a638SPatrick Sanan #include <petsc/private/dmproductimpl.h>
2d852a638SPatrick Sanan 
DMDestroy_Product(DM dm)3d71ae5a4SJacob Faibussowitsch static PetscErrorCode DMDestroy_Product(DM dm)
4d71ae5a4SJacob Faibussowitsch {
5d852a638SPatrick Sanan   DM_Product *product = (DM_Product *)dm->data;
6d852a638SPatrick Sanan   PetscInt    d;
7d852a638SPatrick Sanan 
8d852a638SPatrick Sanan   PetscFunctionBeginUser;
948a46eb9SPierre Jolivet   for (d = 0; d < DMPRODUCT_MAX_DIM; ++d) PetscCall(DMDestroy(&product->dm[d]));
109566063dSJacob Faibussowitsch   PetscCall(PetscFree(product));
113ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
12d852a638SPatrick Sanan }
13d852a638SPatrick Sanan 
DMView_Product(DM dm,PetscViewer viewer)14356ea6bcSBarry Smith static PetscErrorCode DMView_Product(DM dm, PetscViewer viewer)
15356ea6bcSBarry Smith {
16356ea6bcSBarry Smith   DM_Product *product = (DM_Product *)dm->data;
17356ea6bcSBarry Smith   PetscInt    d;
18d852a638SPatrick Sanan 
19356ea6bcSBarry Smith   PetscFunctionBegin;
20356ea6bcSBarry Smith   for (d = 0; d < DMPRODUCT_MAX_DIM; ++d) {
21356ea6bcSBarry Smith     if (product->dm[d]) {
22356ea6bcSBarry Smith       PetscCall(PetscViewerASCIIPrintf(viewer, "  DM that defines dimension %" PetscInt_FMT "\n", d));
23356ea6bcSBarry Smith       PetscCall(PetscViewerASCIIPushTab(viewer));
24356ea6bcSBarry Smith       PetscCall(PetscViewerASCIIPushTab(viewer));
25356ea6bcSBarry Smith       PetscCall(DMView(product->dm[d], viewer));
26356ea6bcSBarry Smith       PetscCall(PetscViewerASCIIPopTab(viewer));
27356ea6bcSBarry Smith       PetscCall(PetscViewerASCIIPopTab(viewer));
28356ea6bcSBarry Smith     }
29356ea6bcSBarry Smith   }
30356ea6bcSBarry Smith   PetscFunctionReturn(PETSC_SUCCESS);
31356ea6bcSBarry Smith }
32356ea6bcSBarry Smith 
33356ea6bcSBarry Smith /*MC
34356ea6bcSBarry Smith   DMPRODUCT = "product" - a `DM` representing a local Cartesian product of other `DM`
35d852a638SPatrick Sanan 
36d852a638SPatrick Sanan   Level: advanced
37d852a638SPatrick Sanan 
38356ea6bcSBarry Smith   Notes:
39356ea6bcSBarry Smith   The `DM` is usually used for managing coordinates of other `DM` via `DMGetCoordinateDM()` and `DMSetCoordinateDM()`
40356ea6bcSBarry Smith 
41356ea6bcSBarry Smith   For each of `dim` dimensions, the `DMPRODUCT` contains a `DM` and a dimension index. The dimensional index, set with `DMProductSetDimensionIndex()`
42356ea6bcSBarry Smith   specifies  which dimension of the sub-`DM` coordinates corresponds to a particular dimension of the `DMPRODUCT`. For example,
43356ea6bcSBarry Smith .vb
44356ea6bcSBarry Smith   DM da1, da2;
45356ea6bcSBarry Smith   DM dm
46356ea6bcSBarry Smith   DMCreate(PETSC_COMM_WORLD,&dm);
47356ea6bcSBarry Smith   DMSetType(dm,DMPRODUCT);
48356ea6bcSBarry Smith   DMSetDimension(dm,3);
49356ea6bcSBarry Smith   DMProductSetDM(dm,0,da1);
50356ea6bcSBarry Smith   DMProductSetDimensionIndex(dm,0,0);
51356ea6bcSBarry Smith   DMProductSetDM(dm,1,da2);
52356ea6bcSBarry Smith   DMProductSetDimensionIndex(dm,1,0);
53356ea6bcSBarry Smith   DMProductSetDM(dm,2,da1);
54356ea6bcSBarry Smith   DMProductSetDimensionIndex(dm,2,1);
55356ea6bcSBarry Smith .ve
56*46091a0eSPierre Jolivet   results in a three-dimensional `DM` whose `x` coordinate values are obtained from the `x` coordinate values of `da1`, whose `y` coordinate values are obtained from
57356ea6bcSBarry Smith   the 'x' coordinate values of `da2` and whose `z` coordinate values are obtained from the `y` coordinate values of `da1`.
58356ea6bcSBarry Smith 
59db781477SPatrick Sanan .seealso: `DM`, `DMSTAG`, `DMProductGetDM()`, `DMProductSetDimensionIndex()`, `DMProductSetDM()`, `DMStagSetUniformCoordinatesProduct()`,
60356ea6bcSBarry Smith           `DMStagGetProductCoordinateArrays()`, `DMStagGetProductCoordinateArraysRead()`, `DMGetCoordinateDM()`, `DMSetCoordinateDM()`
61d852a638SPatrick Sanan M*/
62d852a638SPatrick Sanan 
DMCreate_Product(DM dm)63d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode DMCreate_Product(DM dm)
64d71ae5a4SJacob Faibussowitsch {
65d852a638SPatrick Sanan   DM_Product *product;
66d852a638SPatrick Sanan   PetscInt    d;
67d852a638SPatrick Sanan 
68d852a638SPatrick Sanan   PetscFunctionBegin;
694f572ea9SToby Isaac   PetscAssertPointer(dm, 1);
704dfa11a4SJacob Faibussowitsch   PetscCall(PetscNew(&product));
71d852a638SPatrick Sanan   dm->data = product;
72d852a638SPatrick Sanan 
73d852a638SPatrick Sanan   for (d = 0; d < DMPRODUCT_MAX_DIM; ++d) product->dm[d] = NULL;
74d852a638SPatrick Sanan   for (d = 0; d < DMPRODUCT_MAX_DIM; ++d) product->dim[d] = -1;
75d852a638SPatrick Sanan 
76d852a638SPatrick Sanan   dm->ops->destroy = DMDestroy_Product;
77356ea6bcSBarry Smith   dm->ops->view    = DMView_Product;
783ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
79d852a638SPatrick Sanan }
80