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