1d852a638SPatrick Sanan /* Additional functions in the DMProduct API, which are not part of the general DM API. */ 2d852a638SPatrick Sanan #include <petsc/private/dmproductimpl.h> 3d852a638SPatrick Sanan 4d852a638SPatrick Sanan /*@C 5*20f4b53cSBarry Smith DMProductGetDM - Get sub-`DM` associated with a given slot of a `DMPRODUCT` 6d852a638SPatrick Sanan 7*20f4b53cSBarry Smith Not Collective 8d852a638SPatrick Sanan 9d852a638SPatrick Sanan Input Parameters: 10*20f4b53cSBarry Smith + dm - the` DMPRODUCT` 11d852a638SPatrick Sanan - slot - which dimension slot, in the range 0 to dim-1 12d852a638SPatrick Sanan 13d852a638SPatrick Sanan Output Parameter: 14*20f4b53cSBarry Smith . subdm - the sub-`DM` 15d852a638SPatrick Sanan 16d852a638SPatrick Sanan Level: advanced 17d852a638SPatrick Sanan 18db781477SPatrick Sanan .seealso: `DMPRODUCT`, `DMProductSetDM()` 19d852a638SPatrick Sanan @*/ 20d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode DMProductGetDM(DM dm, PetscInt slot, DM *subdm) 21d71ae5a4SJacob Faibussowitsch { 22d852a638SPatrick Sanan DM_Product *product = (DM_Product *)dm->data; 23d852a638SPatrick Sanan PetscInt dim; 24d852a638SPatrick Sanan 25d852a638SPatrick Sanan PetscFunctionBegin; 26d852a638SPatrick Sanan PetscValidHeaderSpecificType(dm, DM_CLASSID, 1, DMPRODUCT); 279566063dSJacob Faibussowitsch PetscCall(DMGetDimension(dm, &dim)); 281dca8a05SBarry Smith PetscCheck(slot < dim && slot >= 0, PetscObjectComm((PetscObject)dm), PETSC_ERR_ARG_OUTOFRANGE, "slot number must be in range 0-%" PetscInt_FMT, dim - 1); 29d852a638SPatrick Sanan *subdm = product->dm[slot]; 303ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 31d852a638SPatrick Sanan } 32d852a638SPatrick Sanan 33d852a638SPatrick Sanan /*@C 34*20f4b53cSBarry Smith DMProductSetDM - Set sub-`DM` associated with a given slot of `DMPRODUCT` 35d852a638SPatrick Sanan 36*20f4b53cSBarry Smith Not Collective 37d852a638SPatrick Sanan 38d852a638SPatrick Sanan Input Parameters: 39*20f4b53cSBarry Smith + dm - the `DMPRODUCT` 40d852a638SPatrick Sanan . slot - which dimension slot, in the range 0 to dim-1 41*20f4b53cSBarry Smith - subdm - the sub-`DM` 42d852a638SPatrick Sanan 43d852a638SPatrick Sanan Level: advanced 44d852a638SPatrick Sanan 45*20f4b53cSBarry Smith Note: 46*20f4b53cSBarry Smith This function does not destroy the provided sub-`DM`. You may safely destroy it after calling this function. 47*20f4b53cSBarry Smith 48db781477SPatrick Sanan .seealso: `DMPRODUCT`, `DMProductGetDM()`, `DMProductSetDimensionIndex()` 49d852a638SPatrick Sanan @*/ 50d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode DMProductSetDM(DM dm, PetscInt slot, DM subdm) 51d71ae5a4SJacob Faibussowitsch { 52d852a638SPatrick Sanan DM_Product *product = (DM_Product *)dm->data; 53d852a638SPatrick Sanan PetscInt dim; 54d852a638SPatrick Sanan 55d852a638SPatrick Sanan PetscFunctionBegin; 56d852a638SPatrick Sanan PetscValidHeaderSpecificType(dm, DM_CLASSID, 1, DMPRODUCT); 579566063dSJacob Faibussowitsch PetscCall(DMGetDimension(dm, &dim)); 581dca8a05SBarry Smith PetscCheck(slot < dim && slot >= 0, PetscObjectComm((PetscObject)dm), PETSC_ERR_ARG_OUTOFRANGE, "slot number must be in range 0-%" PetscInt_FMT, dim - 1); 599566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)subdm)); 609566063dSJacob Faibussowitsch PetscCall(DMDestroy(&product->dm[slot])); 61d852a638SPatrick Sanan product->dm[slot] = subdm; 623ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 63d852a638SPatrick Sanan } 64d852a638SPatrick Sanan 65d852a638SPatrick Sanan /*@C 66*20f4b53cSBarry Smith DMProductSetDimensionIndex - Set the dimension index associated with a given slot/sub-`DM` 67d852a638SPatrick Sanan 68*20f4b53cSBarry Smith Not Collective 69d852a638SPatrick Sanan 70d852a638SPatrick Sanan Input Parameters: 71*20f4b53cSBarry Smith + dm - the `DMPRODUCT` 72d852a638SPatrick Sanan . slot - which dimension slot, in the range 0 to dim-1 73*20f4b53cSBarry Smith - idx - the dimension index of the sub-`DM` 74d852a638SPatrick Sanan 75d852a638SPatrick Sanan Level: advanced 76d852a638SPatrick Sanan 77db781477SPatrick Sanan .seealso: `DMPRODUCT` 78d852a638SPatrick Sanan @*/ 79d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode DMProductSetDimensionIndex(DM dm, PetscInt slot, PetscInt idx) 80d71ae5a4SJacob Faibussowitsch { 81d852a638SPatrick Sanan DM_Product *product = (DM_Product *)dm->data; 82d852a638SPatrick Sanan PetscInt dim; 83d852a638SPatrick Sanan 84d852a638SPatrick Sanan PetscFunctionBegin; 85d852a638SPatrick Sanan PetscValidHeaderSpecificType(dm, DM_CLASSID, 1, DMPRODUCT); 869566063dSJacob Faibussowitsch PetscCall(DMGetDimension(dm, &dim)); 871dca8a05SBarry Smith PetscCheck(slot < dim && slot >= 0, PetscObjectComm((PetscObject)dm), PETSC_ERR_ARG_OUTOFRANGE, "slot number must be in range 0-%" PetscInt_FMT, dim - 1); 88d852a638SPatrick Sanan product->dim[slot] = idx; 893ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 90d852a638SPatrick Sanan } 91