1d852a638SPatrick Sanan /* Additional functions in the DMProduct API, which are not part of the general DM API. */ 2*cc4c1da9SBarry Smith #include <petsc/private/dmproductimpl.h> /*I "petsc/private/dmproductimpl.h" I*/ 3d852a638SPatrick Sanan 4*cc4c1da9SBarry Smith /*@ 520f4b53cSBarry Smith DMProductGetDM - Get sub-`DM` associated with a given slot of a `DMPRODUCT` 6d852a638SPatrick Sanan 720f4b53cSBarry Smith Not Collective 8d852a638SPatrick Sanan 9d852a638SPatrick Sanan Input Parameters: 1020f4b53cSBarry Smith + dm - the` DMPRODUCT` 11d852a638SPatrick Sanan - slot - which dimension slot, in the range 0 to dim-1 12d852a638SPatrick Sanan 13d852a638SPatrick Sanan Output Parameter: 1420f4b53cSBarry Smith . subdm - the sub-`DM` 15d852a638SPatrick Sanan 16d852a638SPatrick Sanan Level: advanced 17d852a638SPatrick Sanan 18db781477SPatrick Sanan .seealso: `DMPRODUCT`, `DMProductSetDM()` 19d852a638SPatrick Sanan @*/ 20*cc4c1da9SBarry Smith 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 33*cc4c1da9SBarry Smith /*@ 3420f4b53cSBarry Smith DMProductSetDM - Set sub-`DM` associated with a given slot of `DMPRODUCT` 35d852a638SPatrick Sanan 3620f4b53cSBarry Smith Not Collective 37d852a638SPatrick Sanan 38d852a638SPatrick Sanan Input Parameters: 3920f4b53cSBarry Smith + dm - the `DMPRODUCT` 40d852a638SPatrick Sanan . slot - which dimension slot, in the range 0 to dim-1 4120f4b53cSBarry Smith - subdm - the sub-`DM` 42d852a638SPatrick Sanan 43d852a638SPatrick Sanan Level: advanced 44d852a638SPatrick Sanan 4520f4b53cSBarry Smith Note: 4620f4b53cSBarry Smith This function does not destroy the provided sub-`DM`. You may safely destroy it after calling this function. 4720f4b53cSBarry Smith 48db781477SPatrick Sanan .seealso: `DMPRODUCT`, `DMProductGetDM()`, `DMProductSetDimensionIndex()` 49d852a638SPatrick Sanan @*/ 50*cc4c1da9SBarry Smith 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 65*cc4c1da9SBarry Smith /*@ 6620f4b53cSBarry Smith DMProductSetDimensionIndex - Set the dimension index associated with a given slot/sub-`DM` 67d852a638SPatrick Sanan 6820f4b53cSBarry Smith Not Collective 69d852a638SPatrick Sanan 70d852a638SPatrick Sanan Input Parameters: 7120f4b53cSBarry Smith + dm - the `DMPRODUCT` 72d852a638SPatrick Sanan . slot - which dimension slot, in the range 0 to dim-1 7320f4b53cSBarry Smith - idx - the dimension index of the sub-`DM` 74d852a638SPatrick Sanan 75d852a638SPatrick Sanan Level: advanced 76d852a638SPatrick Sanan 77db781477SPatrick Sanan .seealso: `DMPRODUCT` 78d852a638SPatrick Sanan @*/ 79*cc4c1da9SBarry Smith 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