xref: /petsc/src/dm/impls/product/productutils.c (revision 2c71b3e237ead271e4f3aa1505f92bf476e3413d)
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
5d852a638SPatrick Sanan   DMProductGetDM - Get sub-DM associated with a given slot of a DMProduct
6d852a638SPatrick Sanan 
7d852a638SPatrick Sanan   Not collective
8d852a638SPatrick Sanan 
9d852a638SPatrick Sanan   Input Parameters:
10d852a638SPatrick Sanan + dm - the DMProduct
11d852a638SPatrick Sanan - slot - which dimension slot, in the range 0 to dim-1
12d852a638SPatrick Sanan 
13d852a638SPatrick Sanan   Output Parameter:
1449bf8e70SPatrick Sanan . subdm - the sub-DM
15d852a638SPatrick Sanan 
16d852a638SPatrick Sanan   Level: advanced
17d852a638SPatrick Sanan 
18d852a638SPatrick Sanan .seealso: DMPRODUCT, DMProductSetDM()
19d852a638SPatrick Sanan @*/
20d852a638SPatrick Sanan PETSC_EXTERN PetscErrorCode DMProductGetDM(DM dm,PetscInt slot,DM *subdm)
21d852a638SPatrick Sanan {
22d852a638SPatrick Sanan   PetscErrorCode ierr;
23d852a638SPatrick Sanan   DM_Product     *product = (DM_Product*)dm->data;
24d852a638SPatrick Sanan   PetscInt       dim;
25d852a638SPatrick Sanan 
26d852a638SPatrick Sanan   PetscFunctionBegin;
27d852a638SPatrick Sanan   PetscValidHeaderSpecificType(dm,DM_CLASSID,1,DMPRODUCT);
28d852a638SPatrick Sanan   ierr = DMGetDimension(dm,&dim);CHKERRQ(ierr);
29*2c71b3e2SJacob Faibussowitsch   PetscCheckFalse(slot >= dim || slot < 0,PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_OUTOFRANGE,"slot number must be in range 0-%D",dim-1);
30d852a638SPatrick Sanan   *subdm = product->dm[slot];
31d852a638SPatrick Sanan   PetscFunctionReturn(0);
32d852a638SPatrick Sanan }
33d852a638SPatrick Sanan 
34d852a638SPatrick Sanan /*@C
35d852a638SPatrick Sanan   DMProductSetDM - Set sub-DM associated with a given slot of DMProduct
36d852a638SPatrick Sanan 
37d852a638SPatrick Sanan   Not collective
38d852a638SPatrick Sanan 
39d852a638SPatrick Sanan   Input Parameters:
40d852a638SPatrick Sanan + dm - the DMProduct
41d852a638SPatrick Sanan . slot - which dimension slot, in the range 0 to dim-1
42d852a638SPatrick Sanan - subdm - the sub-DM
43d852a638SPatrick Sanan 
44d852a638SPatrick Sanan   Notes:
45d852a638SPatrick Sanan   This function does not destroy the provided sub-DM. You may safely destroy it after calling this function.
46d852a638SPatrick Sanan 
47d852a638SPatrick Sanan   Level: advanced
48d852a638SPatrick Sanan 
49d852a638SPatrick Sanan .seealso: DMPRODUCT, DMProductGetDM(), DMProductSetDimensionIndex()
50d852a638SPatrick Sanan @*/
51d852a638SPatrick Sanan PETSC_EXTERN PetscErrorCode DMProductSetDM(DM dm,PetscInt slot,DM subdm)
52d852a638SPatrick Sanan {
53d852a638SPatrick Sanan   PetscErrorCode ierr;
54d852a638SPatrick Sanan   DM_Product     *product = (DM_Product*)dm->data;
55d852a638SPatrick Sanan   PetscInt       dim;
56d852a638SPatrick Sanan 
57d852a638SPatrick Sanan   PetscFunctionBegin;
58d852a638SPatrick Sanan   PetscValidHeaderSpecificType(dm,DM_CLASSID,1,DMPRODUCT);
59d852a638SPatrick Sanan   ierr = DMGetDimension(dm,&dim);CHKERRQ(ierr);
60*2c71b3e2SJacob Faibussowitsch   PetscCheckFalse(slot >= dim || slot < 0,PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_OUTOFRANGE,"slot number must be in range 0-%D",dim-1);
61d852a638SPatrick Sanan   ierr = PetscObjectReference((PetscObject)subdm);CHKERRQ(ierr);
626204203bSLisandro Dalcin   ierr = DMDestroy(&product->dm[slot]);CHKERRQ(ierr);
63d852a638SPatrick Sanan   product->dm[slot] = subdm;
64d852a638SPatrick Sanan   PetscFunctionReturn(0);
65d852a638SPatrick Sanan }
66d852a638SPatrick Sanan 
67d852a638SPatrick Sanan /*@C
68d852a638SPatrick Sanan   DMProductSetDimensionIndex - Set the dimension index associated with a given slot/sub-DM
69d852a638SPatrick Sanan 
70d852a638SPatrick Sanan   Not collective
71d852a638SPatrick Sanan 
72d852a638SPatrick Sanan   Input Parameters:
73d852a638SPatrick Sanan + dm - the DMProduct
74d852a638SPatrick Sanan . slot - which dimension slot, in the range 0 to dim-1
75d852a638SPatrick Sanan - idx - the dimension index of the sub-DM
76d852a638SPatrick Sanan 
77d852a638SPatrick Sanan   Level: advanced
78d852a638SPatrick Sanan 
79d852a638SPatrick Sanan .seealso: DMPRODUCT
80d852a638SPatrick Sanan @*/
81d852a638SPatrick Sanan PETSC_EXTERN PetscErrorCode DMProductSetDimensionIndex(DM dm,PetscInt slot,PetscInt idx)
82d852a638SPatrick Sanan {
83d852a638SPatrick Sanan   PetscErrorCode ierr;
84d852a638SPatrick Sanan   DM_Product     *product = (DM_Product*)dm->data;
85d852a638SPatrick Sanan   PetscInt       dim;
86d852a638SPatrick Sanan 
87d852a638SPatrick Sanan   PetscFunctionBegin;
88d852a638SPatrick Sanan   PetscValidHeaderSpecificType(dm,DM_CLASSID,1,DMPRODUCT);
89d852a638SPatrick Sanan   ierr = DMGetDimension(dm,&dim);CHKERRQ(ierr);
90*2c71b3e2SJacob Faibussowitsch   PetscCheckFalse(slot >= dim || slot < 0,PetscObjectComm((PetscObject)dm),PETSC_ERR_ARG_OUTOFRANGE,"slot number must be in range 0-%D",dim-1);
91d852a638SPatrick Sanan   product->dim[slot] = idx;
92d852a638SPatrick Sanan   PetscFunctionReturn(0);
93d852a638SPatrick Sanan }
94