1af0996ceSBarry Smith #include <petsc/private/dmmbimpl.h> /*I "petscdmmoab.h" I*/ 28cbae1a6SVijay Mahadevan 38cbae1a6SVijay Mahadevan #include <petscdmmoab.h> 48cbae1a6SVijay Mahadevan 599fa7e03SVijay Mahadevan /*@C 699fa7e03SVijay Mahadevan DMMoabSetFieldVector - Sets the vector reference that represents the solution associated 799fa7e03SVijay Mahadevan with a particular field component. 899fa7e03SVijay Mahadevan 999fa7e03SVijay Mahadevan Not Collective 1099fa7e03SVijay Mahadevan 1199fa7e03SVijay Mahadevan Input Parameters: 1299fa7e03SVijay Mahadevan + dm - the discretization manager object 1399fa7e03SVijay Mahadevan . ifield - the index of the field as set before via DMMoabSetFieldName. 14a2b725a8SWilliam Gropp - fvec - the Vector solution corresponding to the field (component) 1599fa7e03SVijay Mahadevan 1699fa7e03SVijay Mahadevan Level: intermediate 1799fa7e03SVijay Mahadevan 1899fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldName(), DMMoabSetGlobalFieldVector() 1999fa7e03SVijay Mahadevan @*/ 208cbae1a6SVijay Mahadevan PetscErrorCode DMMoabSetFieldVector(DM dm, PetscInt ifield, Vec fvec) 218cbae1a6SVijay Mahadevan { 228cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 238cbae1a6SVijay Mahadevan moab::Tag vtag, ntag; 248cbae1a6SVijay Mahadevan const PetscScalar *varray; 258cbae1a6SVijay Mahadevan PetscScalar *farray; 268cbae1a6SVijay Mahadevan moab::ErrorCode merr; 278cbae1a6SVijay Mahadevan std::string tag_name; 288cbae1a6SVijay Mahadevan 298cbae1a6SVijay Mahadevan PetscFunctionBegin; 308cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 318cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 328cbae1a6SVijay Mahadevan 332c71b3e2SJacob Faibussowitsch PetscCheckFalse((ifield < 0) || (ifield >= dmmoab->numFields),PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "The field %d should be positive and less than %d.", ifield, dmmoab->numFields); 34addae81cSVijay Mahadevan 358cbae1a6SVijay Mahadevan /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */ 36addae81cSVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(dmmoab->fieldNames[ifield], 1, moab::MB_TYPE_DOUBLE, ntag, 378cbae1a6SVijay Mahadevan moab::MB_TAG_DENSE | moab::MB_TAG_CREAT); MBERRNM(merr); 388cbae1a6SVijay Mahadevan 39*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMMoabGetVecTag(fvec, &vtag)); 408cbae1a6SVijay Mahadevan 418cbae1a6SVijay Mahadevan merr = dmmoab->mbiface->tag_get_name(vtag, tag_name); 428cbae1a6SVijay Mahadevan if (!tag_name.length() && merr != moab::MB_SUCCESS) { 43*5f80ce2aSJacob Faibussowitsch CHKERRQ(VecGetArrayRead(fvec, &varray)); 448cbae1a6SVijay Mahadevan /* use the entity handle and the Dof index to set the right value */ 458cbae1a6SVijay Mahadevan merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)varray); MBERRNM(merr); 46*5f80ce2aSJacob Faibussowitsch CHKERRQ(VecRestoreArrayRead(fvec, &varray)); 478cbae1a6SVijay Mahadevan } 488cbae1a6SVijay Mahadevan else { 49*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscMalloc1(dmmoab->nloc, &farray)); 508cbae1a6SVijay Mahadevan /* we are using a MOAB Vec - directly copy the tag data to new one */ 518cbae1a6SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(vtag, *dmmoab->vowned, (void*)farray); MBERRNM(merr); 528cbae1a6SVijay Mahadevan merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)farray); MBERRNM(merr); 538cbae1a6SVijay Mahadevan /* make sure the parallel exchange for ghosts are done appropriately */ 54*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscFree(farray)); 558cbae1a6SVijay Mahadevan } 569daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 578cbae1a6SVijay Mahadevan merr = dmmoab->pcomm->exchange_tags(ntag, *dmmoab->vowned); MBERRNM(merr); 589daf19fdSVijay Mahadevan #endif 598cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 608cbae1a6SVijay Mahadevan } 618cbae1a6SVijay Mahadevan 6299fa7e03SVijay Mahadevan /*@C 6399fa7e03SVijay Mahadevan DMMoabSetGlobalFieldVector - Sets the vector reference that represents the global solution associated 6499fa7e03SVijay Mahadevan with all fields (components) managed by DM. 6599fa7e03SVijay Mahadevan A useful utility when updating the DM solution after a solve, to be serialized with the mesh for 6699fa7e03SVijay Mahadevan checkpointing purposes. 6799fa7e03SVijay Mahadevan 6899fa7e03SVijay Mahadevan Not Collective 6999fa7e03SVijay Mahadevan 7099fa7e03SVijay Mahadevan Input Parameters: 7199fa7e03SVijay Mahadevan + dm - the discretization manager object 72a2b725a8SWilliam Gropp - fvec - the global Vector solution corresponding to all the fields managed by DM 7399fa7e03SVijay Mahadevan 7499fa7e03SVijay Mahadevan Level: intermediate 7599fa7e03SVijay Mahadevan 7699fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldName(), DMMoabSetFieldVector() 7799fa7e03SVijay Mahadevan @*/ 788cbae1a6SVijay Mahadevan PetscErrorCode DMMoabSetGlobalFieldVector(DM dm, Vec fvec) 798cbae1a6SVijay Mahadevan { 808cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 818cbae1a6SVijay Mahadevan moab::Tag vtag, ntag; 82f28b2503SVijay Mahadevan const PetscScalar *rarray; 83f28b2503SVijay Mahadevan PetscScalar *varray, *farray; 848cbae1a6SVijay Mahadevan moab::ErrorCode merr; 858cbae1a6SVijay Mahadevan PetscInt i, ifield; 868cbae1a6SVijay Mahadevan std::string tag_name; 878cbae1a6SVijay Mahadevan moab::Range::iterator iter; 888cbae1a6SVijay Mahadevan 898cbae1a6SVijay Mahadevan PetscFunctionBegin; 908cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 918cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 928cbae1a6SVijay Mahadevan 938cbae1a6SVijay Mahadevan /* get the Tag corresponding to the global vector - possible that there is no tag associated.. */ 94*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMMoabGetVecTag(fvec, &vtag)); 958cbae1a6SVijay Mahadevan merr = dmmoab->mbiface->tag_get_name(vtag, tag_name); 96*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscMalloc1(dmmoab->nloc, &farray)); 978cbae1a6SVijay Mahadevan if (!tag_name.length() && merr != moab::MB_SUCCESS) { 988cbae1a6SVijay Mahadevan /* not a MOAB vector - use VecGetSubVector to get the parts as needed */ 99*5f80ce2aSJacob Faibussowitsch CHKERRQ(VecGetArrayRead(fvec, &rarray)); 100addae81cSVijay Mahadevan for (ifield = 0; ifield < dmmoab->numFields; ++ifield) { 1018cbae1a6SVijay Mahadevan 1028cbae1a6SVijay Mahadevan /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */ 103addae81cSVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(dmmoab->fieldNames[ifield], 1, moab::MB_TYPE_DOUBLE, ntag, 1048cbae1a6SVijay Mahadevan moab::MB_TAG_DENSE | moab::MB_TAG_CREAT); MBERRNM(merr); 1058cbae1a6SVijay Mahadevan 1068cbae1a6SVijay Mahadevan for (i = 0; i < dmmoab->nloc; i++) { 1073f1c6e43SVijay Mahadevan farray[i] = (dmmoab->bs == 1 ? rarray[ifield * dmmoab->nloc + i] : rarray[i * dmmoab->numFields + ifield]); 1088cbae1a6SVijay Mahadevan } 1098cbae1a6SVijay Mahadevan 1108cbae1a6SVijay Mahadevan /* use the entity handle and the Dof index to set the right value */ 1118cbae1a6SVijay Mahadevan merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)farray); MBERRNM(merr); 1128cbae1a6SVijay Mahadevan } 113*5f80ce2aSJacob Faibussowitsch CHKERRQ(VecRestoreArrayRead(fvec, &rarray)); 1148cbae1a6SVijay Mahadevan } 1158cbae1a6SVijay Mahadevan else { 116*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscMalloc1(dmmoab->nloc * dmmoab->numFields, &varray)); 1178cbae1a6SVijay Mahadevan 1188cbae1a6SVijay Mahadevan /* we are using a MOAB Vec - directly copy the tag data to new one */ 1198cbae1a6SVijay Mahadevan merr = dmmoab->mbiface->tag_get_data(vtag, *dmmoab->vowned, (void*)varray); MBERRNM(merr); 120addae81cSVijay Mahadevan for (ifield = 0; ifield < dmmoab->numFields; ++ifield) { 1218cbae1a6SVijay Mahadevan 1228cbae1a6SVijay Mahadevan /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */ 123addae81cSVijay Mahadevan merr = dmmoab->mbiface->tag_get_handle(dmmoab->fieldNames[ifield], 1, moab::MB_TYPE_DOUBLE, ntag, 1248cbae1a6SVijay Mahadevan moab::MB_TAG_DENSE | moab::MB_TAG_CREAT); MBERRNM(merr); 1258cbae1a6SVijay Mahadevan 1268cbae1a6SVijay Mahadevan /* we are using a MOAB Vec - directly copy the tag data to new one */ 1278cbae1a6SVijay Mahadevan for (i = 0; i < dmmoab->nloc; i++) { 1283f1c6e43SVijay Mahadevan farray[i] = (dmmoab->bs == 1 ? varray[ifield * dmmoab->nloc + i] : varray[i * dmmoab->numFields + ifield]); 1298cbae1a6SVijay Mahadevan } 1308cbae1a6SVijay Mahadevan 1318cbae1a6SVijay Mahadevan merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)farray); MBERRNM(merr); 1329daf19fdSVijay Mahadevan 1339daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 1348cbae1a6SVijay Mahadevan /* make sure the parallel exchange for ghosts are done appropriately */ 1358cbae1a6SVijay Mahadevan merr = dmmoab->pcomm->exchange_tags(ntag, *dmmoab->vlocal); MBERRNM(merr); 1369daf19fdSVijay Mahadevan #endif 1378cbae1a6SVijay Mahadevan } 138*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscFree(varray)); 1398cbae1a6SVijay Mahadevan } 140*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscFree(farray)); 1418cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 1428cbae1a6SVijay Mahadevan } 1438cbae1a6SVijay Mahadevan 14499fa7e03SVijay Mahadevan /*@C 14599fa7e03SVijay Mahadevan DMMoabSetFieldNames - Sets the number of fields and their names to be managed by the DM 14699fa7e03SVijay Mahadevan 14799fa7e03SVijay Mahadevan Not Collective 14899fa7e03SVijay Mahadevan 14999fa7e03SVijay Mahadevan Input Parameters: 15099fa7e03SVijay Mahadevan + dm - the discretization manager object 15199fa7e03SVijay Mahadevan . numFields - the total number of fields 152a2b725a8SWilliam Gropp - fields - the array containing the names of each field (component); Can be NULL. 15399fa7e03SVijay Mahadevan 15499fa7e03SVijay Mahadevan Level: intermediate 15599fa7e03SVijay Mahadevan 15699fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldName(), DMMoabSetFieldName() 15799fa7e03SVijay Mahadevan @*/ 158f28b2503SVijay Mahadevan PetscErrorCode DMMoabSetFieldNames(DM dm, PetscInt numFields, const char* fields[]) 1598cbae1a6SVijay Mahadevan { 160addae81cSVijay Mahadevan PetscInt i; 1618cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 1628cbae1a6SVijay Mahadevan 1638cbae1a6SVijay Mahadevan PetscFunctionBegin; 1648cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 1658cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 1668cbae1a6SVijay Mahadevan 167addae81cSVijay Mahadevan /* first deallocate the existing field structure */ 168addae81cSVijay Mahadevan if (dmmoab->fieldNames) { 169addae81cSVijay Mahadevan for (i = 0; i < dmmoab->numFields; i++) { 170*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscFree(dmmoab->fieldNames[i])); 171addae81cSVijay Mahadevan } 172*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscFree(dmmoab->fieldNames)); 173addae81cSVijay Mahadevan } 174addae81cSVijay Mahadevan 175addae81cSVijay Mahadevan /* now re-allocate and assign field names */ 176addae81cSVijay Mahadevan dmmoab->numFields = numFields; 177*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscMalloc1(numFields, &dmmoab->fieldNames)); 178addae81cSVijay Mahadevan if (fields) { 179addae81cSVijay Mahadevan for (i = 0; i < dmmoab->numFields; i++) { 180*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscStrallocpy(fields[i], (char**) &dmmoab->fieldNames[i])); 181addae81cSVijay Mahadevan } 182addae81cSVijay Mahadevan } 183*5f80ce2aSJacob Faibussowitsch CHKERRQ(DMSetNumFields(dm, numFields)); 1848cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 1858cbae1a6SVijay Mahadevan } 1868cbae1a6SVijay Mahadevan 18799fa7e03SVijay Mahadevan /*@C 18899fa7e03SVijay Mahadevan DMMoabGetFieldName - Gets the names of individual field components in multicomponent 18999fa7e03SVijay Mahadevan vectors associated with a DMDA. 19099fa7e03SVijay Mahadevan 19199fa7e03SVijay Mahadevan Not Collective 19299fa7e03SVijay Mahadevan 193d8d19677SJose E. Roman Input Parameters: 19499fa7e03SVijay Mahadevan + dm - the discretization manager object 195a2b725a8SWilliam Gropp - field - field number for the DMMoab (0, 1, ... dof-1), where dof indicates the 19699fa7e03SVijay Mahadevan number of degrees of freedom per node within the DMMoab 19799fa7e03SVijay Mahadevan 19899fa7e03SVijay Mahadevan Output Parameter: 19999fa7e03SVijay Mahadevan . fieldName - the name of the field (component) 20099fa7e03SVijay Mahadevan 20199fa7e03SVijay Mahadevan Level: intermediate 20299fa7e03SVijay Mahadevan 20399fa7e03SVijay Mahadevan .seealso: DMMoabSetFieldName(), DMMoabSetFields() 20499fa7e03SVijay Mahadevan @*/ 20599fa7e03SVijay Mahadevan PetscErrorCode DMMoabGetFieldName(DM dm, PetscInt field, const char **fieldName) 20699fa7e03SVijay Mahadevan { 20799fa7e03SVijay Mahadevan DM_Moab *dmmoab; 20899fa7e03SVijay Mahadevan 20999fa7e03SVijay Mahadevan PetscFunctionBegin; 21099fa7e03SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 21199fa7e03SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 2122c71b3e2SJacob Faibussowitsch PetscCheckFalse((field < 0) || (field >= dmmoab->numFields),PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "DM field %d should be in [%d, %d)", field, 0, dmmoab->numFields); 21399fa7e03SVijay Mahadevan 21499fa7e03SVijay Mahadevan *fieldName = dmmoab->fieldNames[field]; 21599fa7e03SVijay Mahadevan PetscFunctionReturn(0); 21699fa7e03SVijay Mahadevan } 21799fa7e03SVijay Mahadevan 218c68c6878SVijay Mahadevan /*@C 21999fa7e03SVijay Mahadevan DMMoabSetFieldName - Sets the name of a field (component) managed by the DM 220c68c6878SVijay Mahadevan 221c68c6878SVijay Mahadevan Not Collective 222c68c6878SVijay Mahadevan 223c68c6878SVijay Mahadevan Input Parameters: 22499fa7e03SVijay Mahadevan + dm - the discretization manager object 225c68c6878SVijay Mahadevan . field - the field number 226a2b725a8SWilliam Gropp - fieldName - the field (component) name 227c68c6878SVijay Mahadevan 22899fa7e03SVijay Mahadevan Level: intermediate 22995452b02SPatrick Sanan Notes: 23095452b02SPatrick Sanan Can only be called after DMMoabSetFields supplied with correct numFields 231c68c6878SVijay Mahadevan 23299fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldName(), DMMoabSetFields() 233c68c6878SVijay Mahadevan @*/ 2345f7ae369SVijay Mahadevan PetscErrorCode DMMoabSetFieldName(DM dm, PetscInt field, const char *fieldName) 235c68c6878SVijay Mahadevan { 236c68c6878SVijay Mahadevan DM_Moab *dmmoab; 237c68c6878SVijay Mahadevan 238c68c6878SVijay Mahadevan PetscFunctionBegin; 239c68c6878SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 2405f7ae369SVijay Mahadevan PetscValidCharPointer(fieldName, 3); 241c68c6878SVijay Mahadevan 24299fa7e03SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 2432c71b3e2SJacob Faibussowitsch PetscCheckFalse((field < 0) || (field >= dmmoab->numFields),PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "DM field %d should be in [%d, %d)", field, 0, dmmoab->numFields); 24499fa7e03SVijay Mahadevan 24599fa7e03SVijay Mahadevan if (dmmoab->fieldNames[field]) { 246*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscFree(dmmoab->fieldNames[field])); 24799fa7e03SVijay Mahadevan } 248*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscStrallocpy(fieldName, (char**) &dmmoab->fieldNames[field])); 249c68c6878SVijay Mahadevan PetscFunctionReturn(0); 250c68c6878SVijay Mahadevan } 251c68c6878SVijay Mahadevan 25299fa7e03SVijay Mahadevan /*@C 25399fa7e03SVijay Mahadevan DMMoabGetFieldDof - Gets the global degree-of-freedom of a field (component) defined on a 25499fa7e03SVijay Mahadevan particular MOAB EntityHandle. 25599fa7e03SVijay Mahadevan 25699fa7e03SVijay Mahadevan Not Collective 25799fa7e03SVijay Mahadevan 25899fa7e03SVijay Mahadevan Input Parameters: 25999fa7e03SVijay Mahadevan + dm - the discretization manager object 26099fa7e03SVijay Mahadevan . point - the MOAB EntityHandle container which holds the field degree-of-freedom values 261a2b725a8SWilliam Gropp - field - the field (component) index 26299fa7e03SVijay Mahadevan 26399fa7e03SVijay Mahadevan Output Parameter: 264a2b725a8SWilliam Gropp . dof - the global degree-of-freedom index corresponding to the field in the discrete representation (Vec, Mat) 26599fa7e03SVijay Mahadevan 26699fa7e03SVijay Mahadevan Level: beginner 26799fa7e03SVijay Mahadevan 26899fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldDofs(), DMMoabGetFieldDofsLocal() 26999fa7e03SVijay Mahadevan @*/ 2708cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetFieldDof(DM dm, moab::EntityHandle point, PetscInt field, PetscInt* dof) 2718cbae1a6SVijay Mahadevan { 2728cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 2738cbae1a6SVijay Mahadevan 2748cbae1a6SVijay Mahadevan PetscFunctionBegin; 2758cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 2768cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 2778cbae1a6SVijay Mahadevan 278e92d1c7cSVijay Mahadevan *dof = (dmmoab->bs == 1 ? dmmoab->gidmap[dmmoab->mbiface->id_from_handle(point) - dmmoab->seqstart] + field * dmmoab->n : 279e92d1c7cSVijay Mahadevan dmmoab->gidmap[dmmoab->mbiface->id_from_handle(point) - dmmoab->seqstart] * dmmoab->numFields + field); 2808cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 2818cbae1a6SVijay Mahadevan } 2828cbae1a6SVijay Mahadevan 28399fa7e03SVijay Mahadevan /*@C 28499fa7e03SVijay Mahadevan DMMoabGetFieldDofs - Gets the global degree-of-freedom of a field (component) defined on an 28599fa7e03SVijay Mahadevan array of MOAB EntityHandles. 28699fa7e03SVijay Mahadevan 28799fa7e03SVijay Mahadevan Not Collective 28899fa7e03SVijay Mahadevan 28999fa7e03SVijay Mahadevan Input Parameters: 29099fa7e03SVijay Mahadevan + dm - the discretization manager object 29199fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array 29299fa7e03SVijay Mahadevan . points - the MOAB EntityHandle container array which holds the field degree-of-freedom values 293a2b725a8SWilliam Gropp - field - the field (component) index 29499fa7e03SVijay Mahadevan 29599fa7e03SVijay Mahadevan Output Parameter: 296a2b725a8SWilliam Gropp . dof - the global degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat) 29799fa7e03SVijay Mahadevan 29899fa7e03SVijay Mahadevan Level: intermediate 29999fa7e03SVijay Mahadevan 30099fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldDof(), DMMoabGetFieldDofsLocal() 30199fa7e03SVijay Mahadevan @*/ 3028cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetFieldDofs(DM dm, PetscInt npoints, const moab::EntityHandle* points, PetscInt field, PetscInt* dof) 3038cbae1a6SVijay Mahadevan { 3048cbae1a6SVijay Mahadevan PetscInt i; 3058cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 3068cbae1a6SVijay Mahadevan 3078cbae1a6SVijay Mahadevan PetscFunctionBegin; 3088cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 30999fa7e03SVijay Mahadevan PetscValidPointer(points, 3); 3108cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 3118cbae1a6SVijay Mahadevan 3128cbae1a6SVijay Mahadevan if (!dof) { 313*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscMalloc1(npoints, &dof)); 3148cbae1a6SVijay Mahadevan } 3158cbae1a6SVijay Mahadevan 3163f1c6e43SVijay Mahadevan /* compute the DOF based on local blocking in the fields */ 3173f1c6e43SVijay Mahadevan /* We also assume all fields have equal distribution; i.e., all fields are either defined on vertices or elements and not on a mixture */ 31899fa7e03SVijay Mahadevan /* TODO: eliminate the limitation using PetscSection to manage DOFs */ 3198cbae1a6SVijay Mahadevan for (i = 0; i < npoints; ++i) 320e92d1c7cSVijay Mahadevan dof[i] = (dmmoab->bs == 1 ? dmmoab->gidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] + field * dmmoab->n : 321e92d1c7cSVijay Mahadevan dmmoab->gidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] * dmmoab->numFields + field); 3228cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 3238cbae1a6SVijay Mahadevan } 3248cbae1a6SVijay Mahadevan 32599fa7e03SVijay Mahadevan /*@C 32699fa7e03SVijay Mahadevan DMMoabGetFieldDofsLocal - Gets the local degrees-of-freedom of a field (component) defined on an 32799fa7e03SVijay Mahadevan array of MOAB EntityHandles. 32899fa7e03SVijay Mahadevan 32999fa7e03SVijay Mahadevan Not Collective 33099fa7e03SVijay Mahadevan 33199fa7e03SVijay Mahadevan Input Parameters: 33299fa7e03SVijay Mahadevan + dm - the discretization manager object 33399fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array 33499fa7e03SVijay Mahadevan . points - the MOAB EntityHandle container array which holds the field degree-of-freedom values 335a2b725a8SWilliam Gropp - field - the field (component) index 33699fa7e03SVijay Mahadevan 33799fa7e03SVijay Mahadevan Output Parameter: 338a2b725a8SWilliam Gropp . dof - the local degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat) 33999fa7e03SVijay Mahadevan 34099fa7e03SVijay Mahadevan Level: intermediate 34199fa7e03SVijay Mahadevan 34299fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldDof(), DMMoabGetFieldDofs() 34399fa7e03SVijay Mahadevan @*/ 3448cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetFieldDofsLocal(DM dm, PetscInt npoints, const moab::EntityHandle* points, PetscInt field, PetscInt* dof) 3458cbae1a6SVijay Mahadevan { 3463f1c6e43SVijay Mahadevan PetscInt i; 3478cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 3488cbae1a6SVijay Mahadevan 3498cbae1a6SVijay Mahadevan PetscFunctionBegin; 3508cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 35199fa7e03SVijay Mahadevan PetscValidPointer(points, 3); 3528cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 3538cbae1a6SVijay Mahadevan 3548cbae1a6SVijay Mahadevan if (!dof) { 355*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscMalloc1(npoints, &dof)); 3568cbae1a6SVijay Mahadevan } 3578cbae1a6SVijay Mahadevan 3583f1c6e43SVijay Mahadevan /* compute the DOF based on local blocking in the fields */ 35999fa7e03SVijay Mahadevan /* assume all fields have equal distribution; i.e., all fields are either defined on vertices or elements and not on a mixture */ 36099fa7e03SVijay Mahadevan /* TODO: eliminate the limitation using PetscSection to manage DOFs */ 3613f1c6e43SVijay Mahadevan for (i = 0; i < npoints; ++i) { 362e92d1c7cSVijay Mahadevan dof[i] = (dmmoab->bs > 1 ? dmmoab->lidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] * dmmoab->numFields + field : 363e92d1c7cSVijay Mahadevan dmmoab->lidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] + field * dmmoab->n); 3648cbae1a6SVijay Mahadevan } 3658cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 3668cbae1a6SVijay Mahadevan } 3678cbae1a6SVijay Mahadevan 36899fa7e03SVijay Mahadevan /*@C 36999fa7e03SVijay Mahadevan DMMoabGetDofs - Gets the global degree-of-freedom for all fields (components) defined on an 37099fa7e03SVijay Mahadevan array of MOAB EntityHandles. 37199fa7e03SVijay Mahadevan 37299fa7e03SVijay Mahadevan Not Collective 37399fa7e03SVijay Mahadevan 37499fa7e03SVijay Mahadevan Input Parameters: 37599fa7e03SVijay Mahadevan + dm - the discretization manager object 37699fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array 377a2b725a8SWilliam Gropp - points - the MOAB EntityHandle container array which holds the field degree-of-freedom values 37899fa7e03SVijay Mahadevan 37999fa7e03SVijay Mahadevan Output Parameter: 380a2b725a8SWilliam Gropp . dof - the global degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat) 38199fa7e03SVijay Mahadevan 38299fa7e03SVijay Mahadevan Level: intermediate 38399fa7e03SVijay Mahadevan 38499fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldDofs(), DMMoabGetDofsLocal(), DMMoabGetDofsBlocked() 38599fa7e03SVijay Mahadevan @*/ 3868cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetDofs(DM dm, PetscInt npoints, const moab::EntityHandle* points, PetscInt* dof) 3878cbae1a6SVijay Mahadevan { 3888cbae1a6SVijay Mahadevan PetscInt i, field, offset; 3898cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 3908cbae1a6SVijay Mahadevan 3918cbae1a6SVijay Mahadevan PetscFunctionBegin; 3928cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 39399fa7e03SVijay Mahadevan PetscValidPointer(points, 3); 3948cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 3958cbae1a6SVijay Mahadevan 3968cbae1a6SVijay Mahadevan if (!dof) { 397*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscMalloc1(dmmoab->numFields * npoints, &dof)); 3988cbae1a6SVijay Mahadevan } 3998cbae1a6SVijay Mahadevan 4003f1c6e43SVijay Mahadevan /* compute the DOF based on local blocking in the fields */ 40199fa7e03SVijay Mahadevan /* assume all fields have equal distribution; i.e., all fields are either defined on vertices or elements and not on a mixture */ 40299fa7e03SVijay Mahadevan /* TODO: eliminate the limitation using PetscSection to manage DOFs */ 403addae81cSVijay Mahadevan for (field = 0; field < dmmoab->numFields; ++field) { 40499fa7e03SVijay Mahadevan offset = field * dmmoab->n; 4058cbae1a6SVijay Mahadevan for (i = 0; i < npoints; ++i) 406e92d1c7cSVijay Mahadevan dof[i * dmmoab->numFields + field] = (dmmoab->bs > 1 ? dmmoab->gidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] * dmmoab->numFields + field : 407e92d1c7cSVijay Mahadevan dmmoab->gidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] + offset); 4088cbae1a6SVijay Mahadevan } 4098cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 4108cbae1a6SVijay Mahadevan } 4118cbae1a6SVijay Mahadevan 41299fa7e03SVijay Mahadevan /*@C 41399fa7e03SVijay Mahadevan DMMoabGetDofsLocal - Gets the local degree-of-freedom for all fields (components) defined on an 41499fa7e03SVijay Mahadevan array of MOAB EntityHandles. 41599fa7e03SVijay Mahadevan 41699fa7e03SVijay Mahadevan Not Collective 41799fa7e03SVijay Mahadevan 41899fa7e03SVijay Mahadevan Input Parameters: 41999fa7e03SVijay Mahadevan + dm - the discretization manager object 42099fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array 421a2b725a8SWilliam Gropp - points - the MOAB EntityHandle container array which holds the field degree-of-freedom values 42299fa7e03SVijay Mahadevan 42399fa7e03SVijay Mahadevan Output Parameter: 424a2b725a8SWilliam Gropp . dof - the local degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat) 42599fa7e03SVijay Mahadevan 42699fa7e03SVijay Mahadevan Level: intermediate 42799fa7e03SVijay Mahadevan 42899fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldDofs(), DMMoabGetDofs(), DMMoabGetDofsBlocked() 42999fa7e03SVijay Mahadevan @*/ 4308cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetDofsLocal(DM dm, PetscInt npoints, const moab::EntityHandle* points, PetscInt* dof) 4318cbae1a6SVijay Mahadevan { 4328cbae1a6SVijay Mahadevan PetscInt i, field, offset; 4338cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 4348cbae1a6SVijay Mahadevan 4358cbae1a6SVijay Mahadevan PetscFunctionBegin; 4368cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 43799fa7e03SVijay Mahadevan PetscValidPointer(points, 3); 4388cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 4398cbae1a6SVijay Mahadevan 4408cbae1a6SVijay Mahadevan if (!dof) { 441*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscMalloc1(dmmoab->numFields * npoints, &dof)); 4428cbae1a6SVijay Mahadevan } 4438cbae1a6SVijay Mahadevan 4443f1c6e43SVijay Mahadevan /* compute the DOF based on local blocking in the fields */ 44599fa7e03SVijay Mahadevan /* assume all fields have equal distribution; i.e., all fields are either defined on vertices or elements and not on a mixture */ 44699fa7e03SVijay Mahadevan /* TODO: eliminate the limitation using PetscSection to manage DOFs */ 447addae81cSVijay Mahadevan for (field = 0; field < dmmoab->numFields; ++field) { 44899fa7e03SVijay Mahadevan offset = field * dmmoab->n; 4498cbae1a6SVijay Mahadevan for (i = 0; i < npoints; ++i) 450e92d1c7cSVijay Mahadevan dof[i * dmmoab->numFields + field] = (dmmoab->bs > 1 ? dmmoab->lidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] * dmmoab->numFields + field : 451e92d1c7cSVijay Mahadevan dmmoab->lidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] + offset); 4528cbae1a6SVijay Mahadevan } 4538cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 4548cbae1a6SVijay Mahadevan } 4558cbae1a6SVijay Mahadevan 45699fa7e03SVijay Mahadevan /*@C 45799fa7e03SVijay Mahadevan DMMoabGetDofsBlocked - Gets the global degree-of-freedom for the first field (component) defined on an 45899fa7e03SVijay Mahadevan array of MOAB EntityHandles. It is useful when performing Blocked(Get/Set) methods in computation 45999fa7e03SVijay Mahadevan of element residuals and assembly of the discrete systems when all fields are co-located. 46099fa7e03SVijay Mahadevan 46199fa7e03SVijay Mahadevan Not Collective 46299fa7e03SVijay Mahadevan 46399fa7e03SVijay Mahadevan Input Parameters: 46499fa7e03SVijay Mahadevan + dm - the discretization manager object 46599fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array 466a2b725a8SWilliam Gropp - points - the MOAB EntityHandle container array which holds the field degree-of-freedom values 46799fa7e03SVijay Mahadevan 46899fa7e03SVijay Mahadevan Output Parameter: 469a2b725a8SWilliam Gropp . dof - the blocked global degree-of-freedom index array in the discrete representation (Vec, Mat) 47099fa7e03SVijay Mahadevan 47199fa7e03SVijay Mahadevan Level: intermediate 47299fa7e03SVijay Mahadevan 47399fa7e03SVijay Mahadevan .seealso: DMMoabGetDofsLocal(), DMMoabGetDofs(), DMMoabGetDofsBlockedLocal() 47499fa7e03SVijay Mahadevan @*/ 4758cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetDofsBlocked(DM dm, PetscInt npoints, const moab::EntityHandle* points, PetscInt* dof) 4768cbae1a6SVijay Mahadevan { 4778cbae1a6SVijay Mahadevan PetscInt i; 4788cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 4798cbae1a6SVijay Mahadevan 4808cbae1a6SVijay Mahadevan PetscFunctionBegin; 4818cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 4823f1c6e43SVijay Mahadevan PetscValidPointer(points, 3); 4838cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 4848cbae1a6SVijay Mahadevan 4858cbae1a6SVijay Mahadevan if (!dof) { 486*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscMalloc1(npoints, &dof)); 4878cbae1a6SVijay Mahadevan } 4888cbae1a6SVijay Mahadevan 4898cbae1a6SVijay Mahadevan for (i = 0; i < npoints; ++i) { 4903f1c6e43SVijay Mahadevan dof[i] = dmmoab->gidmap[(PetscInt)points[i] - dmmoab->seqstart]; 4918cbae1a6SVijay Mahadevan } 4928cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 4938cbae1a6SVijay Mahadevan } 4948cbae1a6SVijay Mahadevan 49599fa7e03SVijay Mahadevan /*@C 49699fa7e03SVijay Mahadevan DMMoabGetDofsBlockedLocal - Gets the local degree-of-freedom for the first field (component) defined on an 49799fa7e03SVijay Mahadevan array of MOAB EntityHandles. It is useful when performing local Blocked(Get/Set) methods in computation 49899fa7e03SVijay Mahadevan of element residuals and assembly of the discrete systems when all fields are co-located. 49999fa7e03SVijay Mahadevan 50099fa7e03SVijay Mahadevan Not Collective 50199fa7e03SVijay Mahadevan 50299fa7e03SVijay Mahadevan Input Parameters: 50399fa7e03SVijay Mahadevan + dm - the discretization manager object 50499fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array 505a2b725a8SWilliam Gropp - points - the MOAB EntityHandle container array which holds the field degree-of-freedom values 50699fa7e03SVijay Mahadevan 50799fa7e03SVijay Mahadevan Output Parameter: 508a2b725a8SWilliam Gropp . dof - the blocked local degree-of-freedom index array in the discrete representation (Vec, Mat) 50999fa7e03SVijay Mahadevan 51099fa7e03SVijay Mahadevan Level: intermediate 51199fa7e03SVijay Mahadevan 51299fa7e03SVijay Mahadevan .seealso: DMMoabGetDofsLocal(), DMMoabGetDofs(), DMMoabGetDofsBlockedLocal() 51399fa7e03SVijay Mahadevan @*/ 5148cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetDofsBlockedLocal(DM dm, PetscInt npoints, const moab::EntityHandle* points, PetscInt* dof) 5158cbae1a6SVijay Mahadevan { 5168cbae1a6SVijay Mahadevan PetscInt i; 5178cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 5188cbae1a6SVijay Mahadevan 5198cbae1a6SVijay Mahadevan PetscFunctionBegin; 5208cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 5213f1c6e43SVijay Mahadevan PetscValidPointer(points, 3); 5228cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 5238cbae1a6SVijay Mahadevan 524*5f80ce2aSJacob Faibussowitsch if (!dof) CHKERRQ(PetscMalloc1(npoints, &dof)); 5258cbae1a6SVijay Mahadevan 526*5f80ce2aSJacob Faibussowitsch for (i = 0; i < npoints; ++i) dof[i] = dmmoab->lidmap[(PetscInt)points[i] - dmmoab->seqstart]; 5278cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 5288cbae1a6SVijay Mahadevan } 5298cbae1a6SVijay Mahadevan 53099fa7e03SVijay Mahadevan /*@C 53199fa7e03SVijay Mahadevan DMMoabGetVertexDofsBlocked - Gets the global degree-of-freedom for the first field (component) defined on an 53299fa7e03SVijay Mahadevan array of locally owned MOAB mesh vertices. It's utility is when performing Finite-Difference type calculations 53399fa7e03SVijay Mahadevan where vertex traversal is faster than element-wise assembly that is typically done in FEM calculations. 53499fa7e03SVijay Mahadevan 53599fa7e03SVijay Mahadevan Not Collective 53699fa7e03SVijay Mahadevan 53799fa7e03SVijay Mahadevan Input Parameters: 538a2b725a8SWilliam Gropp . dm - the discretization manager object 53999fa7e03SVijay Mahadevan 54099fa7e03SVijay Mahadevan Output Parameter: 541a2b725a8SWilliam Gropp . dof - the blocked global degree-of-freedom index array in the discrete representation (Vec, Mat) that is vertex-based based on local numbering 54299fa7e03SVijay Mahadevan 54399fa7e03SVijay Mahadevan Level: intermediate 54499fa7e03SVijay Mahadevan 54599fa7e03SVijay Mahadevan .seealso: DMMoabGetVertexDofsBlockedLocal(), DMMoabGetDofsBlocked(), DMMoabGetDofsBlockedLocal() 54699fa7e03SVijay Mahadevan @*/ 5478cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetVertexDofsBlocked(DM dm, PetscInt** dof) 5488cbae1a6SVijay Mahadevan { 5498cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 5508cbae1a6SVijay Mahadevan 5518cbae1a6SVijay Mahadevan PetscFunctionBegin; 5528cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 5538cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 5548cbae1a6SVijay Mahadevan 5558cbae1a6SVijay Mahadevan *dof = dmmoab->gidmap; 5568cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 5578cbae1a6SVijay Mahadevan } 5588cbae1a6SVijay Mahadevan 55999fa7e03SVijay Mahadevan /*@C 56099fa7e03SVijay Mahadevan DMMoabGetVertexDofsBlockedLocal - Gets the local degree-of-freedom for the first field (component) defined on an 56199fa7e03SVijay Mahadevan array of locally owned MOAB mesh vertices. It's utility is when performing Finite-Difference type calculations 56299fa7e03SVijay Mahadevan where vertex traversal is faster than element-wise assembly that is typically done in FEM calculations. 56399fa7e03SVijay Mahadevan 56499fa7e03SVijay Mahadevan Not Collective 56599fa7e03SVijay Mahadevan 56699fa7e03SVijay Mahadevan Input Parameters: 567a2b725a8SWilliam Gropp . dm - the discretization manager object 56899fa7e03SVijay Mahadevan 56999fa7e03SVijay Mahadevan Output Parameter: 570a2b725a8SWilliam Gropp . dof - the blocked local degree-of-freedom index array in the discrete representation (Vec, Mat) that is vertex-based based on local numbering 57199fa7e03SVijay Mahadevan 57299fa7e03SVijay Mahadevan Level: intermediate 57399fa7e03SVijay Mahadevan 57499fa7e03SVijay Mahadevan .seealso: DMMoabGetVertexDofsBlocked(), DMMoabGetDofsBlocked(), DMMoabGetDofsBlockedLocal() 57599fa7e03SVijay Mahadevan @*/ 5768cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetVertexDofsBlockedLocal(DM dm, PetscInt** dof) 5778cbae1a6SVijay Mahadevan { 5788cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 5798cbae1a6SVijay Mahadevan 5808cbae1a6SVijay Mahadevan PetscFunctionBegin; 5818cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 5828cbae1a6SVijay Mahadevan PetscValidPointer(dof, 2); 5838cbae1a6SVijay Mahadevan dmmoab = (DM_Moab*)(dm)->data; 5848cbae1a6SVijay Mahadevan 5858cbae1a6SVijay Mahadevan *dof = dmmoab->lidmap; 5868cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 5878cbae1a6SVijay Mahadevan } 588