Actual source code: productutils.c
1: /* Additional functions in the DMProduct API, which are not part of the general DM API. */
2: #include <petsc/private/dmproductimpl.h>
4: /*@
5: DMProductGetDM - Get sub-`DM` associated with a given slot of a `DMPRODUCT`
7: Not Collective
9: Input Parameters:
10: + dm - the` DMPRODUCT`
11: - slot - which dimension slot, in the range 0 to dim-1
13: Output Parameter:
14: . subdm - the sub-`DM`
16: Level: advanced
18: .seealso: `DMPRODUCT`, `DMProductSetDM()`
19: @*/
20: PetscErrorCode DMProductGetDM(DM dm, PetscInt slot, DM *subdm)
21: {
22: DM_Product *product = (DM_Product *)dm->data;
23: PetscInt dim;
25: PetscFunctionBegin;
27: PetscCall(DMGetDimension(dm, &dim));
28: PetscCheck(slot < dim && slot >= 0, PetscObjectComm((PetscObject)dm), PETSC_ERR_ARG_OUTOFRANGE, "slot number must be in range 0-%" PetscInt_FMT, dim - 1);
29: *subdm = product->dm[slot];
30: PetscFunctionReturn(PETSC_SUCCESS);
31: }
33: /*@
34: DMProductSetDM - Set sub-`DM` associated with a given slot of `DMPRODUCT`
36: Not Collective
38: Input Parameters:
39: + dm - the `DMPRODUCT`
40: . slot - which dimension slot, in the range 0 to dim-1
41: - subdm - the sub-`DM`
43: Level: advanced
45: Note:
46: This function does not destroy the provided sub-`DM`. You may safely destroy it after calling this function.
48: .seealso: `DMPRODUCT`, `DMProductGetDM()`, `DMProductSetDimensionIndex()`
49: @*/
50: PetscErrorCode DMProductSetDM(DM dm, PetscInt slot, DM subdm)
51: {
52: DM_Product *product = (DM_Product *)dm->data;
53: PetscInt dim;
55: PetscFunctionBegin;
57: PetscCall(DMGetDimension(dm, &dim));
58: PetscCheck(slot < dim && slot >= 0, PetscObjectComm((PetscObject)dm), PETSC_ERR_ARG_OUTOFRANGE, "slot number must be in range 0-%" PetscInt_FMT, dim - 1);
59: PetscCall(PetscObjectReference((PetscObject)subdm));
60: PetscCall(DMDestroy(&product->dm[slot]));
61: product->dm[slot] = subdm;
62: PetscFunctionReturn(PETSC_SUCCESS);
63: }
65: /*@
66: DMProductSetDimensionIndex - Set the dimension index associated with a given slot/sub-`DM`
68: Not Collective
70: Input Parameters:
71: + dm - the `DMPRODUCT`
72: . slot - which dimension slot, in the range 0 to dim-1
73: - idx - the dimension index of the sub-`DM`
75: Level: advanced
77: .seealso: `DMPRODUCT`
78: @*/
79: PetscErrorCode DMProductSetDimensionIndex(DM dm, PetscInt slot, PetscInt idx)
80: {
81: DM_Product *product = (DM_Product *)dm->data;
82: PetscInt dim;
84: PetscFunctionBegin;
86: PetscCall(DMGetDimension(dm, &dim));
87: PetscCheck(slot < dim && slot >= 0, PetscObjectComm((PetscObject)dm), PETSC_ERR_ARG_OUTOFRANGE, "slot number must be in range 0-%" PetscInt_FMT, dim - 1);
88: product->dim[slot] = idx;
89: PetscFunctionReturn(PETSC_SUCCESS);
90: }