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