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 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 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