xref: /petsc/src/dm/impls/product/productutils.c (revision 20f4b53cbb5e9bd9ef12b76a8697d60d197cda17)
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