xref: /petsc/src/dm/impls/product/productutils.c (revision 174dc0c8cee294b82b85e4dd3b331b29396264fc)
1 #include <petsc/private/dmproductimpl.h> /*I  "petsc/private/dmproductimpl.h"    I*/
2 
3 /*@
4   DMProductGetDM - Get sub-`DM` whose coordinates will be associated with a particular dimension of the `DMPRODUCT`
5 
6   Not Collective
7 
8   Input Parameters:
9 + dm   - the` DMPRODUCT`
10 - slot - which dimension within `DMPRODUCT` whose coordinates is being provided, in the range 0 to $dim-1$
11 
12   Output Parameter:
13 . subdm - the sub-`DM`
14 
15   Level: advanced
16 
17   Note:
18   You can call `DMProductGetDimensionIndex()` to determine which dimension in `subdm` is to be used to provide the coordinates, see `DMPRODUCT`
19 
20 .seealso: `DMPRODUCT`, `DMProductSetDM()`, `DMProductGetDimensionIndex()`, `DMProductSetDimensionIndex()`
21 @*/
22 PetscErrorCode DMProductGetDM(DM dm, PetscInt slot, DM *subdm)
23 {
24   DM_Product *product = (DM_Product *)dm->data;
25   PetscInt    dim;
26 
27   PetscFunctionBegin;
28   PetscValidHeaderSpecificType(dm, DM_CLASSID, 1, DMPRODUCT);
29   PetscCall(DMGetDimension(dm, &dim));
30   PetscCheck(slot < dim && slot >= 0, PetscObjectComm((PetscObject)dm), PETSC_ERR_ARG_OUTOFRANGE, "slot number must be in range 0-%" PetscInt_FMT, dim - 1);
31   *subdm = product->dm[slot];
32   PetscFunctionReturn(PETSC_SUCCESS);
33 }
34 
35 /*@
36   DMProductSetDM - Set sub-`DM` whose coordinates will be associated with a particular dimension of the `DMPRODUCT`
37 
38   Not Collective
39 
40   Input Parameters:
41 + dm    - the `DMPRODUCT`
42 . slot  - which dimension within `DMPRODUCT` whose coordinates is being provided, in the range 0 to $dim-1$
43 - subdm - the sub-`DM`
44 
45   Level: advanced
46 
47   Notes:
48   This function does not destroy the provided sub-`DM`. You may safely destroy it after calling this function.
49 
50   You can call `DMProductSetDimensionIndex()` to determine which dimension in `subdm` is to be used to provide the coordinates, see `DMPRODUCT`
51 
52 .seealso: `DMPRODUCT`, `DMProductGetDM()`, `DMProductSetDimensionIndex()`, `DMProductGetDimensionIndex()`
53 @*/
54 PetscErrorCode DMProductSetDM(DM dm, PetscInt slot, DM subdm)
55 {
56   DM_Product *product = (DM_Product *)dm->data;
57   PetscInt    dim;
58 
59   PetscFunctionBegin;
60   PetscValidHeaderSpecificType(dm, DM_CLASSID, 1, DMPRODUCT);
61   PetscCall(DMGetDimension(dm, &dim));
62   PetscCheck(slot < dim && slot >= 0, PetscObjectComm((PetscObject)dm), PETSC_ERR_ARG_OUTOFRANGE, "slot number must be in range 0-%" PetscInt_FMT, dim - 1);
63   PetscCall(PetscObjectReference((PetscObject)subdm));
64   PetscCall(DMDestroy(&product->dm[slot]));
65   product->dm[slot] = subdm;
66   PetscFunctionReturn(PETSC_SUCCESS);
67 }
68 
69 /*@
70   DMProductSetDimensionIndex - Set which dimension `idx` of the sub-`DM` coordinates will be used associated with the `DMPRODUCT` dimension `slot`
71 
72   Not Collective
73 
74   Input Parameters:
75 + dm   - the `DMPRODUCT`
76 . slot - which dimension, in the range 0 to $dim-1$ you are providing to the `dm`
77 - idx  - the dimension of the sub-`DM` to use
78 
79   Level: advanced
80 
81 .seealso: `DMPRODUCT`, `DMProductGetDM()`, `DMProductGetDimensionIndex()`
82 @*/
83 PetscErrorCode DMProductSetDimensionIndex(DM dm, PetscInt slot, PetscInt idx)
84 {
85   DM_Product *product = (DM_Product *)dm->data;
86   PetscInt    dim;
87 
88   PetscFunctionBegin;
89   PetscValidHeaderSpecificType(dm, DM_CLASSID, 1, DMPRODUCT);
90   PetscCall(DMGetDimension(dm, &dim));
91   PetscCheck(slot < dim && slot >= 0, PetscObjectComm((PetscObject)dm), PETSC_ERR_ARG_OUTOFRANGE, "slot number must be in range 0-%" PetscInt_FMT, dim - 1);
92   product->dim[slot] = idx;
93   PetscFunctionReturn(PETSC_SUCCESS);
94 }
95 
96 /*@
97   DMProductGetDimensionIndex - Get which dimension `idx` of the sub-`DM` coordinates will be used associated with the `DMPRODUCT` dimension `slot`
98 
99   Not Collective
100 
101   Input Parameters:
102 + dm   - the `DMPRODUCT`
103 - slot - which dimension, in the range 0 to $dim-1$ of `dm`
104 
105   Output Parameter:
106 . idx - the dimension of the sub-`DM`
107 
108   Level: advanced
109 
110 .seealso: `DMPRODUCT`, `DMProductGetDM()`, `DMProductSetDimensionIndex()`
111 @*/
112 PetscErrorCode DMProductGetDimensionIndex(DM dm, PetscInt slot, PetscInt *idx)
113 {
114   DM_Product *product = (DM_Product *)dm->data;
115   PetscInt    dim;
116 
117   PetscFunctionBegin;
118   PetscValidHeaderSpecificType(dm, DM_CLASSID, 1, DMPRODUCT);
119   PetscCall(DMGetDimension(dm, &dim));
120   PetscAssertPointer(idx, 3);
121   PetscCheck(slot < dim && slot >= 0, PetscObjectComm((PetscObject)dm), PETSC_ERR_ARG_OUTOFRANGE, "slot number must be in range 0-%" PetscInt_FMT, dim - 1);
122   *idx = product->dim[slot];
123   PetscFunctionReturn(PETSC_SUCCESS);
124 }
125