1d852a638SPatrick Sanan #include <petsc/private/dmproductimpl.h> 2d852a638SPatrick Sanan 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 14*356ea6bcSBarry Smith static PetscErrorCode DMView_Product(DM dm, PetscViewer viewer) 15*356ea6bcSBarry Smith { 16*356ea6bcSBarry Smith DM_Product *product = (DM_Product *)dm->data; 17*356ea6bcSBarry Smith PetscInt d; 18d852a638SPatrick Sanan 19*356ea6bcSBarry Smith PetscFunctionBegin; 20*356ea6bcSBarry Smith for (d = 0; d < DMPRODUCT_MAX_DIM; ++d) { 21*356ea6bcSBarry Smith if (product->dm[d]) { 22*356ea6bcSBarry Smith PetscCall(PetscViewerASCIIPrintf(viewer, " DM that defines dimension %" PetscInt_FMT "\n", d)); 23*356ea6bcSBarry Smith PetscCall(PetscViewerASCIIPushTab(viewer)); 24*356ea6bcSBarry Smith PetscCall(PetscViewerASCIIPushTab(viewer)); 25*356ea6bcSBarry Smith PetscCall(DMView(product->dm[d], viewer)); 26*356ea6bcSBarry Smith PetscCall(PetscViewerASCIIPopTab(viewer)); 27*356ea6bcSBarry Smith PetscCall(PetscViewerASCIIPopTab(viewer)); 28*356ea6bcSBarry Smith } 29*356ea6bcSBarry Smith } 30*356ea6bcSBarry Smith PetscFunctionReturn(PETSC_SUCCESS); 31*356ea6bcSBarry Smith } 32*356ea6bcSBarry Smith 33*356ea6bcSBarry Smith /*MC 34*356ea6bcSBarry Smith DMPRODUCT = "product" - a `DM` representing a local Cartesian product of other `DM` 35d852a638SPatrick Sanan 36d852a638SPatrick Sanan Level: advanced 37d852a638SPatrick Sanan 38*356ea6bcSBarry Smith Notes: 39*356ea6bcSBarry Smith The `DM` is usually used for managing coordinates of other `DM` via `DMGetCoordinateDM()` and `DMSetCoordinateDM()` 40*356ea6bcSBarry Smith 41*356ea6bcSBarry Smith For each of `dim` dimensions, the `DMPRODUCT` contains a `DM` and a dimension index. The dimensional index, set with `DMProductSetDimensionIndex()` 42*356ea6bcSBarry Smith specifies which dimension of the sub-`DM` coordinates corresponds to a particular dimension of the `DMPRODUCT`. For example, 43*356ea6bcSBarry Smith .vb 44*356ea6bcSBarry Smith DM da1, da2; 45*356ea6bcSBarry Smith DM dm 46*356ea6bcSBarry Smith DMCreate(PETSC_COMM_WORLD,&dm); 47*356ea6bcSBarry Smith DMSetType(dm,DMPRODUCT); 48*356ea6bcSBarry Smith DMSetDimension(dm,3); 49*356ea6bcSBarry Smith DMProductSetDM(dm,0,da1); 50*356ea6bcSBarry Smith DMProductSetDimensionIndex(dm,0,0); 51*356ea6bcSBarry Smith DMProductSetDM(dm,1,da2); 52*356ea6bcSBarry Smith DMProductSetDimensionIndex(dm,1,0); 53*356ea6bcSBarry Smith DMProductSetDM(dm,2,da1); 54*356ea6bcSBarry Smith DMProductSetDimensionIndex(dm,2,1); 55*356ea6bcSBarry Smith .ve 56*356ea6bcSBarry Smith results in a three-dimensional `DM` whose `x` coordinate values are obtained from the `x` coordinate values of `da1`, whose `y` coodinate values are obtained from 57*356ea6bcSBarry Smith the 'x' coordinate values of `da2` and whose `z` coordinate values are obtained from the `y` coordinate values of `da1`. 58*356ea6bcSBarry Smith 59db781477SPatrick Sanan .seealso: `DM`, `DMSTAG`, `DMProductGetDM()`, `DMProductSetDimensionIndex()`, `DMProductSetDM()`, `DMStagSetUniformCoordinatesProduct()`, 60*356ea6bcSBarry Smith `DMStagGetProductCoordinateArrays()`, `DMStagGetProductCoordinateArraysRead()`, `DMGetCoordinateDM()`, `DMSetCoordinateDM()` 61d852a638SPatrick Sanan M*/ 62d852a638SPatrick Sanan 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; 77*356ea6bcSBarry Smith dm->ops->view = DMView_Product; 783ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 79d852a638SPatrick Sanan } 80