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