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 18db781477SPatrick Sanan .seealso: `DMMoabGetFieldName()`, `DMMoabSetGlobalFieldVector()` 1999fa7e03SVijay Mahadevan @*/ 209371c9d4SSatish Balay PetscErrorCode DMMoabSetFieldVector(DM dm, PetscInt ifield, Vec fvec) { 218cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 228cbae1a6SVijay Mahadevan moab::Tag vtag, ntag; 238cbae1a6SVijay Mahadevan const PetscScalar *varray; 248cbae1a6SVijay Mahadevan PetscScalar *farray; 258cbae1a6SVijay Mahadevan moab::ErrorCode merr; 268cbae1a6SVijay Mahadevan std::string tag_name; 278cbae1a6SVijay Mahadevan 288cbae1a6SVijay Mahadevan PetscFunctionBegin; 298cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 308cbae1a6SVijay Mahadevan dmmoab = (DM_Moab *)(dm)->data; 318cbae1a6SVijay Mahadevan 3208401ef6SPierre Jolivet PetscCheck(!(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); 33addae81cSVijay Mahadevan 348cbae1a6SVijay Mahadevan /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */ 359371c9d4SSatish Balay merr = dmmoab->mbiface->tag_get_handle(dmmoab->fieldNames[ifield], 1, moab::MB_TYPE_DOUBLE, ntag, moab::MB_TAG_DENSE | moab::MB_TAG_CREAT); 369371c9d4SSatish Balay MBERRNM(merr); 378cbae1a6SVijay Mahadevan 389566063dSJacob Faibussowitsch PetscCall(DMMoabGetVecTag(fvec, &vtag)); 398cbae1a6SVijay Mahadevan 408cbae1a6SVijay Mahadevan merr = dmmoab->mbiface->tag_get_name(vtag, tag_name); 418cbae1a6SVijay Mahadevan if (!tag_name.length() && merr != moab::MB_SUCCESS) { 429566063dSJacob Faibussowitsch PetscCall(VecGetArrayRead(fvec, &varray)); 438cbae1a6SVijay Mahadevan /* use the entity handle and the Dof index to set the right value */ 449371c9d4SSatish Balay merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void *)varray); 459371c9d4SSatish Balay MBERRNM(merr); 469566063dSJacob Faibussowitsch PetscCall(VecRestoreArrayRead(fvec, &varray)); 471baa6e33SBarry Smith } else { 489566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(dmmoab->nloc, &farray)); 498cbae1a6SVijay Mahadevan /* we are using a MOAB Vec - directly copy the tag data to new one */ 509371c9d4SSatish Balay merr = dmmoab->mbiface->tag_get_data(vtag, *dmmoab->vowned, (void *)farray); 519371c9d4SSatish Balay MBERRNM(merr); 529371c9d4SSatish Balay merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void *)farray); 539371c9d4SSatish Balay MBERRNM(merr); 548cbae1a6SVijay Mahadevan /* make sure the parallel exchange for ghosts are done appropriately */ 559566063dSJacob Faibussowitsch PetscCall(PetscFree(farray)); 568cbae1a6SVijay Mahadevan } 579daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 589371c9d4SSatish Balay merr = dmmoab->pcomm->exchange_tags(ntag, *dmmoab->vowned); 599371c9d4SSatish Balay MBERRNM(merr); 609daf19fdSVijay Mahadevan #endif 618cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 628cbae1a6SVijay Mahadevan } 638cbae1a6SVijay Mahadevan 6499fa7e03SVijay Mahadevan /*@C 6599fa7e03SVijay Mahadevan DMMoabSetGlobalFieldVector - Sets the vector reference that represents the global solution associated 6699fa7e03SVijay Mahadevan with all fields (components) managed by DM. 6799fa7e03SVijay Mahadevan A useful utility when updating the DM solution after a solve, to be serialized with the mesh for 6899fa7e03SVijay Mahadevan checkpointing purposes. 6999fa7e03SVijay Mahadevan 7099fa7e03SVijay Mahadevan Not Collective 7199fa7e03SVijay Mahadevan 7299fa7e03SVijay Mahadevan Input Parameters: 7399fa7e03SVijay Mahadevan + dm - the discretization manager object 74a2b725a8SWilliam Gropp - fvec - the global Vector solution corresponding to all the fields managed by DM 7599fa7e03SVijay Mahadevan 7699fa7e03SVijay Mahadevan Level: intermediate 7799fa7e03SVijay Mahadevan 78db781477SPatrick Sanan .seealso: `DMMoabGetFieldName()`, `DMMoabSetFieldVector()` 7999fa7e03SVijay Mahadevan @*/ 809371c9d4SSatish Balay PetscErrorCode DMMoabSetGlobalFieldVector(DM dm, Vec fvec) { 818cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 828cbae1a6SVijay Mahadevan moab::Tag vtag, ntag; 83f28b2503SVijay Mahadevan const PetscScalar *rarray; 84f28b2503SVijay Mahadevan PetscScalar *varray, *farray; 858cbae1a6SVijay Mahadevan moab::ErrorCode merr; 868cbae1a6SVijay Mahadevan PetscInt i, ifield; 878cbae1a6SVijay Mahadevan std::string tag_name; 888cbae1a6SVijay Mahadevan moab::Range::iterator iter; 898cbae1a6SVijay Mahadevan 908cbae1a6SVijay Mahadevan PetscFunctionBegin; 918cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 928cbae1a6SVijay Mahadevan dmmoab = (DM_Moab *)(dm)->data; 938cbae1a6SVijay Mahadevan 948cbae1a6SVijay Mahadevan /* get the Tag corresponding to the global vector - possible that there is no tag associated.. */ 959566063dSJacob Faibussowitsch PetscCall(DMMoabGetVecTag(fvec, &vtag)); 968cbae1a6SVijay Mahadevan merr = dmmoab->mbiface->tag_get_name(vtag, tag_name); 979566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(dmmoab->nloc, &farray)); 988cbae1a6SVijay Mahadevan if (!tag_name.length() && merr != moab::MB_SUCCESS) { 998cbae1a6SVijay Mahadevan /* not a MOAB vector - use VecGetSubVector to get the parts as needed */ 1009566063dSJacob Faibussowitsch PetscCall(VecGetArrayRead(fvec, &rarray)); 101addae81cSVijay Mahadevan for (ifield = 0; ifield < dmmoab->numFields; ++ifield) { 1028cbae1a6SVijay Mahadevan /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */ 1039371c9d4SSatish Balay merr = dmmoab->mbiface->tag_get_handle(dmmoab->fieldNames[ifield], 1, moab::MB_TYPE_DOUBLE, ntag, moab::MB_TAG_DENSE | moab::MB_TAG_CREAT); 1049371c9d4SSatish Balay MBERRNM(merr); 1058cbae1a6SVijay Mahadevan 1069371c9d4SSatish Balay for (i = 0; i < dmmoab->nloc; i++) { farray[i] = (dmmoab->bs == 1 ? rarray[ifield * dmmoab->nloc + i] : rarray[i * dmmoab->numFields + ifield]); } 1078cbae1a6SVijay Mahadevan 1088cbae1a6SVijay Mahadevan /* use the entity handle and the Dof index to set the right value */ 1099371c9d4SSatish Balay merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void *)farray); 1109371c9d4SSatish Balay MBERRNM(merr); 1118cbae1a6SVijay Mahadevan } 1129566063dSJacob Faibussowitsch PetscCall(VecRestoreArrayRead(fvec, &rarray)); 1131baa6e33SBarry Smith } else { 1149566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(dmmoab->nloc * dmmoab->numFields, &varray)); 1158cbae1a6SVijay Mahadevan 1168cbae1a6SVijay Mahadevan /* we are using a MOAB Vec - directly copy the tag data to new one */ 1179371c9d4SSatish Balay merr = dmmoab->mbiface->tag_get_data(vtag, *dmmoab->vowned, (void *)varray); 1189371c9d4SSatish Balay MBERRNM(merr); 119addae81cSVijay Mahadevan for (ifield = 0; ifield < dmmoab->numFields; ++ifield) { 1208cbae1a6SVijay Mahadevan /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */ 1219371c9d4SSatish Balay merr = dmmoab->mbiface->tag_get_handle(dmmoab->fieldNames[ifield], 1, moab::MB_TYPE_DOUBLE, ntag, moab::MB_TAG_DENSE | moab::MB_TAG_CREAT); 1229371c9d4SSatish Balay MBERRNM(merr); 1238cbae1a6SVijay Mahadevan 1248cbae1a6SVijay Mahadevan /* we are using a MOAB Vec - directly copy the tag data to new one */ 1259371c9d4SSatish Balay for (i = 0; i < dmmoab->nloc; i++) { farray[i] = (dmmoab->bs == 1 ? varray[ifield * dmmoab->nloc + i] : varray[i * dmmoab->numFields + ifield]); } 1268cbae1a6SVijay Mahadevan 1279371c9d4SSatish Balay merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void *)farray); 1289371c9d4SSatish Balay MBERRNM(merr); 1299daf19fdSVijay Mahadevan 1309daf19fdSVijay Mahadevan #ifdef MOAB_HAVE_MPI 1318cbae1a6SVijay Mahadevan /* make sure the parallel exchange for ghosts are done appropriately */ 1329371c9d4SSatish Balay merr = dmmoab->pcomm->exchange_tags(ntag, *dmmoab->vlocal); 1339371c9d4SSatish Balay MBERRNM(merr); 1349daf19fdSVijay Mahadevan #endif 1358cbae1a6SVijay Mahadevan } 1369566063dSJacob Faibussowitsch PetscCall(PetscFree(varray)); 1378cbae1a6SVijay Mahadevan } 1389566063dSJacob Faibussowitsch PetscCall(PetscFree(farray)); 1398cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 1408cbae1a6SVijay Mahadevan } 1418cbae1a6SVijay Mahadevan 14299fa7e03SVijay Mahadevan /*@C 14399fa7e03SVijay Mahadevan DMMoabSetFieldNames - Sets the number of fields and their names to be managed by the DM 14499fa7e03SVijay Mahadevan 14599fa7e03SVijay Mahadevan Not Collective 14699fa7e03SVijay Mahadevan 14799fa7e03SVijay Mahadevan Input Parameters: 14899fa7e03SVijay Mahadevan + dm - the discretization manager object 14999fa7e03SVijay Mahadevan . numFields - the total number of fields 150a2b725a8SWilliam Gropp - fields - the array containing the names of each field (component); Can be NULL. 15199fa7e03SVijay Mahadevan 15299fa7e03SVijay Mahadevan Level: intermediate 15399fa7e03SVijay Mahadevan 154db781477SPatrick Sanan .seealso: `DMMoabGetFieldName()`, `DMMoabSetFieldName()` 15599fa7e03SVijay Mahadevan @*/ 1569371c9d4SSatish Balay PetscErrorCode DMMoabSetFieldNames(DM dm, PetscInt numFields, const char *fields[]) { 157addae81cSVijay Mahadevan PetscInt i; 1588cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 1598cbae1a6SVijay Mahadevan 1608cbae1a6SVijay Mahadevan PetscFunctionBegin; 1618cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 1628cbae1a6SVijay Mahadevan dmmoab = (DM_Moab *)(dm)->data; 1638cbae1a6SVijay Mahadevan 164addae81cSVijay Mahadevan /* first deallocate the existing field structure */ 165addae81cSVijay Mahadevan if (dmmoab->fieldNames) { 166*48a46eb9SPierre Jolivet for (i = 0; i < dmmoab->numFields; i++) PetscCall(PetscFree(dmmoab->fieldNames[i])); 1679566063dSJacob Faibussowitsch PetscCall(PetscFree(dmmoab->fieldNames)); 168addae81cSVijay Mahadevan } 169addae81cSVijay Mahadevan 170addae81cSVijay Mahadevan /* now re-allocate and assign field names */ 171addae81cSVijay Mahadevan dmmoab->numFields = numFields; 1729566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(numFields, &dmmoab->fieldNames)); 173addae81cSVijay Mahadevan if (fields) { 174*48a46eb9SPierre Jolivet for (i = 0; i < dmmoab->numFields; i++) PetscCall(PetscStrallocpy(fields[i], (char **)&dmmoab->fieldNames[i])); 175addae81cSVijay Mahadevan } 1769566063dSJacob Faibussowitsch PetscCall(DMSetNumFields(dm, numFields)); 1778cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 1788cbae1a6SVijay Mahadevan } 1798cbae1a6SVijay Mahadevan 18099fa7e03SVijay Mahadevan /*@C 18199fa7e03SVijay Mahadevan DMMoabGetFieldName - Gets the names of individual field components in multicomponent 18299fa7e03SVijay Mahadevan vectors associated with a DMDA. 18399fa7e03SVijay Mahadevan 18499fa7e03SVijay Mahadevan Not Collective 18599fa7e03SVijay Mahadevan 186d8d19677SJose E. Roman Input Parameters: 18799fa7e03SVijay Mahadevan + dm - the discretization manager object 188a2b725a8SWilliam Gropp - field - field number for the DMMoab (0, 1, ... dof-1), where dof indicates the 18999fa7e03SVijay Mahadevan number of degrees of freedom per node within the DMMoab 19099fa7e03SVijay Mahadevan 19199fa7e03SVijay Mahadevan Output Parameter: 19299fa7e03SVijay Mahadevan . fieldName - the name of the field (component) 19399fa7e03SVijay Mahadevan 19499fa7e03SVijay Mahadevan Level: intermediate 19599fa7e03SVijay Mahadevan 196db781477SPatrick Sanan .seealso: `DMMoabSetFieldName()`, `DMMoabSetFields()` 19799fa7e03SVijay Mahadevan @*/ 1989371c9d4SSatish Balay PetscErrorCode DMMoabGetFieldName(DM dm, PetscInt field, const char **fieldName) { 19999fa7e03SVijay Mahadevan DM_Moab *dmmoab; 20099fa7e03SVijay Mahadevan 20199fa7e03SVijay Mahadevan PetscFunctionBegin; 20299fa7e03SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 20399fa7e03SVijay Mahadevan dmmoab = (DM_Moab *)(dm)->data; 20408401ef6SPierre Jolivet PetscCheck(!(field < 0) && !(field >= dmmoab->numFields), PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "DM field %d should be in [%d, %d)", field, 0, dmmoab->numFields); 20599fa7e03SVijay Mahadevan 20699fa7e03SVijay Mahadevan *fieldName = dmmoab->fieldNames[field]; 20799fa7e03SVijay Mahadevan PetscFunctionReturn(0); 20899fa7e03SVijay Mahadevan } 20999fa7e03SVijay Mahadevan 210c68c6878SVijay Mahadevan /*@C 21199fa7e03SVijay Mahadevan DMMoabSetFieldName - Sets the name of a field (component) managed by the DM 212c68c6878SVijay Mahadevan 213c68c6878SVijay Mahadevan Not Collective 214c68c6878SVijay Mahadevan 215c68c6878SVijay Mahadevan Input Parameters: 21699fa7e03SVijay Mahadevan + dm - the discretization manager object 217c68c6878SVijay Mahadevan . field - the field number 218a2b725a8SWilliam Gropp - fieldName - the field (component) name 219c68c6878SVijay Mahadevan 22099fa7e03SVijay Mahadevan Level: intermediate 22195452b02SPatrick Sanan Notes: 22295452b02SPatrick Sanan Can only be called after DMMoabSetFields supplied with correct numFields 223c68c6878SVijay Mahadevan 224db781477SPatrick Sanan .seealso: `DMMoabGetFieldName()`, `DMMoabSetFields()` 225c68c6878SVijay Mahadevan @*/ 2269371c9d4SSatish Balay PetscErrorCode DMMoabSetFieldName(DM dm, PetscInt field, const char *fieldName) { 227c68c6878SVijay Mahadevan DM_Moab *dmmoab; 228c68c6878SVijay Mahadevan 229c68c6878SVijay Mahadevan PetscFunctionBegin; 230c68c6878SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 2315f7ae369SVijay Mahadevan PetscValidCharPointer(fieldName, 3); 232c68c6878SVijay Mahadevan 23399fa7e03SVijay Mahadevan dmmoab = (DM_Moab *)(dm)->data; 23408401ef6SPierre Jolivet PetscCheck(!(field < 0) && !(field >= dmmoab->numFields), PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "DM field %d should be in [%d, %d)", field, 0, dmmoab->numFields); 23599fa7e03SVijay Mahadevan 236*48a46eb9SPierre Jolivet if (dmmoab->fieldNames[field]) PetscCall(PetscFree(dmmoab->fieldNames[field])); 2379566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(fieldName, (char **)&dmmoab->fieldNames[field])); 238c68c6878SVijay Mahadevan PetscFunctionReturn(0); 239c68c6878SVijay Mahadevan } 240c68c6878SVijay Mahadevan 24199fa7e03SVijay Mahadevan /*@C 24299fa7e03SVijay Mahadevan DMMoabGetFieldDof - Gets the global degree-of-freedom of a field (component) defined on a 24399fa7e03SVijay Mahadevan particular MOAB EntityHandle. 24499fa7e03SVijay Mahadevan 24599fa7e03SVijay Mahadevan Not Collective 24699fa7e03SVijay Mahadevan 24799fa7e03SVijay Mahadevan Input Parameters: 24899fa7e03SVijay Mahadevan + dm - the discretization manager object 24999fa7e03SVijay Mahadevan . point - the MOAB EntityHandle container which holds the field degree-of-freedom values 250a2b725a8SWilliam Gropp - field - the field (component) index 25199fa7e03SVijay Mahadevan 25299fa7e03SVijay Mahadevan Output Parameter: 253a2b725a8SWilliam Gropp . dof - the global degree-of-freedom index corresponding to the field in the discrete representation (Vec, Mat) 25499fa7e03SVijay Mahadevan 25599fa7e03SVijay Mahadevan Level: beginner 25699fa7e03SVijay Mahadevan 257db781477SPatrick Sanan .seealso: `DMMoabGetFieldDofs()`, `DMMoabGetFieldDofsLocal()` 25899fa7e03SVijay Mahadevan @*/ 2599371c9d4SSatish Balay PetscErrorCode DMMoabGetFieldDof(DM dm, moab::EntityHandle point, PetscInt field, PetscInt *dof) { 2608cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 2618cbae1a6SVijay Mahadevan 2628cbae1a6SVijay Mahadevan PetscFunctionBegin; 2638cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 2648cbae1a6SVijay Mahadevan dmmoab = (DM_Moab *)(dm)->data; 2658cbae1a6SVijay Mahadevan 2669371c9d4SSatish Balay *dof = (dmmoab->bs == 1 ? dmmoab->gidmap[dmmoab->mbiface->id_from_handle(point) - dmmoab->seqstart] + field * dmmoab->n : dmmoab->gidmap[dmmoab->mbiface->id_from_handle(point) - dmmoab->seqstart] * dmmoab->numFields + field); 2678cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 2688cbae1a6SVijay Mahadevan } 2698cbae1a6SVijay Mahadevan 27099fa7e03SVijay Mahadevan /*@C 27199fa7e03SVijay Mahadevan DMMoabGetFieldDofs - Gets the global degree-of-freedom of a field (component) defined on an 27299fa7e03SVijay Mahadevan array of MOAB EntityHandles. 27399fa7e03SVijay Mahadevan 27499fa7e03SVijay Mahadevan Not Collective 27599fa7e03SVijay Mahadevan 27699fa7e03SVijay Mahadevan Input Parameters: 27799fa7e03SVijay Mahadevan + dm - the discretization manager object 27899fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array 27999fa7e03SVijay Mahadevan . points - the MOAB EntityHandle container array which holds the field degree-of-freedom values 280a2b725a8SWilliam Gropp - field - the field (component) index 28199fa7e03SVijay Mahadevan 28299fa7e03SVijay Mahadevan Output Parameter: 283a2b725a8SWilliam Gropp . dof - the global degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat) 28499fa7e03SVijay Mahadevan 28599fa7e03SVijay Mahadevan Level: intermediate 28699fa7e03SVijay Mahadevan 287db781477SPatrick Sanan .seealso: `DMMoabGetFieldDof()`, `DMMoabGetFieldDofsLocal()` 28899fa7e03SVijay Mahadevan @*/ 2899371c9d4SSatish Balay PetscErrorCode DMMoabGetFieldDofs(DM dm, PetscInt npoints, const moab::EntityHandle *points, PetscInt field, PetscInt *dof) { 2908cbae1a6SVijay Mahadevan PetscInt i; 2918cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 2928cbae1a6SVijay Mahadevan 2938cbae1a6SVijay Mahadevan PetscFunctionBegin; 2948cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 29599fa7e03SVijay Mahadevan PetscValidPointer(points, 3); 2968cbae1a6SVijay Mahadevan dmmoab = (DM_Moab *)(dm)->data; 2978cbae1a6SVijay Mahadevan 298*48a46eb9SPierre Jolivet if (!dof) PetscCall(PetscMalloc1(npoints, &dof)); 2998cbae1a6SVijay Mahadevan 3003f1c6e43SVijay Mahadevan /* compute the DOF based on local blocking in the fields */ 3013f1c6e43SVijay 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 */ 30299fa7e03SVijay Mahadevan /* TODO: eliminate the limitation using PetscSection to manage DOFs */ 3038cbae1a6SVijay Mahadevan for (i = 0; i < npoints; ++i) 3049371c9d4SSatish Balay dof[i] = (dmmoab->bs == 1 ? dmmoab->gidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] + field * dmmoab->n : dmmoab->gidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] * dmmoab->numFields + field); 3058cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 3068cbae1a6SVijay Mahadevan } 3078cbae1a6SVijay Mahadevan 30899fa7e03SVijay Mahadevan /*@C 30999fa7e03SVijay Mahadevan DMMoabGetFieldDofsLocal - Gets the local degrees-of-freedom of a field (component) defined on an 31099fa7e03SVijay Mahadevan array of MOAB EntityHandles. 31199fa7e03SVijay Mahadevan 31299fa7e03SVijay Mahadevan Not Collective 31399fa7e03SVijay Mahadevan 31499fa7e03SVijay Mahadevan Input Parameters: 31599fa7e03SVijay Mahadevan + dm - the discretization manager object 31699fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array 31799fa7e03SVijay Mahadevan . points - the MOAB EntityHandle container array which holds the field degree-of-freedom values 318a2b725a8SWilliam Gropp - field - the field (component) index 31999fa7e03SVijay Mahadevan 32099fa7e03SVijay Mahadevan Output Parameter: 321a2b725a8SWilliam Gropp . dof - the local degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat) 32299fa7e03SVijay Mahadevan 32399fa7e03SVijay Mahadevan Level: intermediate 32499fa7e03SVijay Mahadevan 325db781477SPatrick Sanan .seealso: `DMMoabGetFieldDof()`, `DMMoabGetFieldDofs()` 32699fa7e03SVijay Mahadevan @*/ 3279371c9d4SSatish Balay PetscErrorCode DMMoabGetFieldDofsLocal(DM dm, PetscInt npoints, const moab::EntityHandle *points, PetscInt field, PetscInt *dof) { 3283f1c6e43SVijay Mahadevan PetscInt i; 3298cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 3308cbae1a6SVijay Mahadevan 3318cbae1a6SVijay Mahadevan PetscFunctionBegin; 3328cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 33399fa7e03SVijay Mahadevan PetscValidPointer(points, 3); 3348cbae1a6SVijay Mahadevan dmmoab = (DM_Moab *)(dm)->data; 3358cbae1a6SVijay Mahadevan 336*48a46eb9SPierre Jolivet if (!dof) PetscCall(PetscMalloc1(npoints, &dof)); 3378cbae1a6SVijay Mahadevan 3383f1c6e43SVijay Mahadevan /* compute the DOF based on local blocking in the fields */ 33999fa7e03SVijay Mahadevan /* assume all fields have equal distribution; i.e., all fields are either defined on vertices or elements and not on a mixture */ 34099fa7e03SVijay Mahadevan /* TODO: eliminate the limitation using PetscSection to manage DOFs */ 3413f1c6e43SVijay Mahadevan for (i = 0; i < npoints; ++i) { 3429371c9d4SSatish Balay dof[i] = (dmmoab->bs > 1 ? dmmoab->lidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] * dmmoab->numFields + field : dmmoab->lidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] + field * dmmoab->n); 3438cbae1a6SVijay Mahadevan } 3448cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 3458cbae1a6SVijay Mahadevan } 3468cbae1a6SVijay Mahadevan 34799fa7e03SVijay Mahadevan /*@C 34899fa7e03SVijay Mahadevan DMMoabGetDofs - Gets the global degree-of-freedom for all fields (components) defined on an 34999fa7e03SVijay Mahadevan array of MOAB EntityHandles. 35099fa7e03SVijay Mahadevan 35199fa7e03SVijay Mahadevan Not Collective 35299fa7e03SVijay Mahadevan 35399fa7e03SVijay Mahadevan Input Parameters: 35499fa7e03SVijay Mahadevan + dm - the discretization manager object 35599fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array 356a2b725a8SWilliam Gropp - points - the MOAB EntityHandle container array which holds the field degree-of-freedom values 35799fa7e03SVijay Mahadevan 35899fa7e03SVijay Mahadevan Output Parameter: 359a2b725a8SWilliam Gropp . dof - the global degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat) 36099fa7e03SVijay Mahadevan 36199fa7e03SVijay Mahadevan Level: intermediate 36299fa7e03SVijay Mahadevan 363db781477SPatrick Sanan .seealso: `DMMoabGetFieldDofs()`, `DMMoabGetDofsLocal()`, `DMMoabGetDofsBlocked()` 36499fa7e03SVijay Mahadevan @*/ 3659371c9d4SSatish Balay PetscErrorCode DMMoabGetDofs(DM dm, PetscInt npoints, const moab::EntityHandle *points, PetscInt *dof) { 3668cbae1a6SVijay Mahadevan PetscInt i, field, offset; 3678cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 3688cbae1a6SVijay Mahadevan 3698cbae1a6SVijay Mahadevan PetscFunctionBegin; 3708cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 37199fa7e03SVijay Mahadevan PetscValidPointer(points, 3); 3728cbae1a6SVijay Mahadevan dmmoab = (DM_Moab *)(dm)->data; 3738cbae1a6SVijay Mahadevan 374*48a46eb9SPierre Jolivet if (!dof) PetscCall(PetscMalloc1(dmmoab->numFields * npoints, &dof)); 3758cbae1a6SVijay Mahadevan 3763f1c6e43SVijay Mahadevan /* compute the DOF based on local blocking in the fields */ 37799fa7e03SVijay Mahadevan /* assume all fields have equal distribution; i.e., all fields are either defined on vertices or elements and not on a mixture */ 37899fa7e03SVijay Mahadevan /* TODO: eliminate the limitation using PetscSection to manage DOFs */ 379addae81cSVijay Mahadevan for (field = 0; field < dmmoab->numFields; ++field) { 38099fa7e03SVijay Mahadevan offset = field * dmmoab->n; 3818cbae1a6SVijay Mahadevan for (i = 0; i < npoints; ++i) 3829371c9d4SSatish Balay dof[i * dmmoab->numFields + field] = (dmmoab->bs > 1 ? dmmoab->gidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] * dmmoab->numFields + field : dmmoab->gidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] + offset); 3838cbae1a6SVijay Mahadevan } 3848cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 3858cbae1a6SVijay Mahadevan } 3868cbae1a6SVijay Mahadevan 38799fa7e03SVijay Mahadevan /*@C 38899fa7e03SVijay Mahadevan DMMoabGetDofsLocal - Gets the local degree-of-freedom for all fields (components) defined on an 38999fa7e03SVijay Mahadevan array of MOAB EntityHandles. 39099fa7e03SVijay Mahadevan 39199fa7e03SVijay Mahadevan Not Collective 39299fa7e03SVijay Mahadevan 39399fa7e03SVijay Mahadevan Input Parameters: 39499fa7e03SVijay Mahadevan + dm - the discretization manager object 39599fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array 396a2b725a8SWilliam Gropp - points - the MOAB EntityHandle container array which holds the field degree-of-freedom values 39799fa7e03SVijay Mahadevan 39899fa7e03SVijay Mahadevan Output Parameter: 399a2b725a8SWilliam Gropp . dof - the local degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat) 40099fa7e03SVijay Mahadevan 40199fa7e03SVijay Mahadevan Level: intermediate 40299fa7e03SVijay Mahadevan 403db781477SPatrick Sanan .seealso: `DMMoabGetFieldDofs()`, `DMMoabGetDofs()`, `DMMoabGetDofsBlocked()` 40499fa7e03SVijay Mahadevan @*/ 4059371c9d4SSatish Balay PetscErrorCode DMMoabGetDofsLocal(DM dm, PetscInt npoints, const moab::EntityHandle *points, PetscInt *dof) { 4068cbae1a6SVijay Mahadevan PetscInt i, field, offset; 4078cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 4088cbae1a6SVijay Mahadevan 4098cbae1a6SVijay Mahadevan PetscFunctionBegin; 4108cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 41199fa7e03SVijay Mahadevan PetscValidPointer(points, 3); 4128cbae1a6SVijay Mahadevan dmmoab = (DM_Moab *)(dm)->data; 4138cbae1a6SVijay Mahadevan 414*48a46eb9SPierre Jolivet if (!dof) PetscCall(PetscMalloc1(dmmoab->numFields * npoints, &dof)); 4158cbae1a6SVijay Mahadevan 4163f1c6e43SVijay Mahadevan /* compute the DOF based on local blocking in the fields */ 41799fa7e03SVijay Mahadevan /* assume all fields have equal distribution; i.e., all fields are either defined on vertices or elements and not on a mixture */ 41899fa7e03SVijay Mahadevan /* TODO: eliminate the limitation using PetscSection to manage DOFs */ 419addae81cSVijay Mahadevan for (field = 0; field < dmmoab->numFields; ++field) { 42099fa7e03SVijay Mahadevan offset = field * dmmoab->n; 4218cbae1a6SVijay Mahadevan for (i = 0; i < npoints; ++i) 4229371c9d4SSatish Balay dof[i * dmmoab->numFields + field] = (dmmoab->bs > 1 ? dmmoab->lidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] * dmmoab->numFields + field : dmmoab->lidmap[dmmoab->mbiface->id_from_handle(points[i]) - dmmoab->seqstart] + offset); 4238cbae1a6SVijay Mahadevan } 4248cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 4258cbae1a6SVijay Mahadevan } 4268cbae1a6SVijay Mahadevan 42799fa7e03SVijay Mahadevan /*@C 42899fa7e03SVijay Mahadevan DMMoabGetDofsBlocked - Gets the global degree-of-freedom for the first field (component) defined on an 42999fa7e03SVijay Mahadevan array of MOAB EntityHandles. It is useful when performing Blocked(Get/Set) methods in computation 43099fa7e03SVijay Mahadevan of element residuals and assembly of the discrete systems when all fields are co-located. 43199fa7e03SVijay Mahadevan 43299fa7e03SVijay Mahadevan Not Collective 43399fa7e03SVijay Mahadevan 43499fa7e03SVijay Mahadevan Input Parameters: 43599fa7e03SVijay Mahadevan + dm - the discretization manager object 43699fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array 437a2b725a8SWilliam Gropp - points - the MOAB EntityHandle container array which holds the field degree-of-freedom values 43899fa7e03SVijay Mahadevan 43999fa7e03SVijay Mahadevan Output Parameter: 440a2b725a8SWilliam Gropp . dof - the blocked global degree-of-freedom index array in the discrete representation (Vec, Mat) 44199fa7e03SVijay Mahadevan 44299fa7e03SVijay Mahadevan Level: intermediate 44399fa7e03SVijay Mahadevan 444db781477SPatrick Sanan .seealso: `DMMoabGetDofsLocal()`, `DMMoabGetDofs()`, `DMMoabGetDofsBlockedLocal()` 44599fa7e03SVijay Mahadevan @*/ 4469371c9d4SSatish Balay PetscErrorCode DMMoabGetDofsBlocked(DM dm, PetscInt npoints, const moab::EntityHandle *points, PetscInt *dof) { 4478cbae1a6SVijay Mahadevan PetscInt i; 4488cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 4498cbae1a6SVijay Mahadevan 4508cbae1a6SVijay Mahadevan PetscFunctionBegin; 4518cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 4523f1c6e43SVijay Mahadevan PetscValidPointer(points, 3); 4538cbae1a6SVijay Mahadevan dmmoab = (DM_Moab *)(dm)->data; 4548cbae1a6SVijay Mahadevan 455*48a46eb9SPierre Jolivet if (!dof) PetscCall(PetscMalloc1(npoints, &dof)); 4568cbae1a6SVijay Mahadevan 4579371c9d4SSatish Balay for (i = 0; i < npoints; ++i) { dof[i] = dmmoab->gidmap[(PetscInt)points[i] - dmmoab->seqstart]; } 4588cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 4598cbae1a6SVijay Mahadevan } 4608cbae1a6SVijay Mahadevan 46199fa7e03SVijay Mahadevan /*@C 46299fa7e03SVijay Mahadevan DMMoabGetDofsBlockedLocal - Gets the local degree-of-freedom for the first field (component) defined on an 46399fa7e03SVijay Mahadevan array of MOAB EntityHandles. It is useful when performing local Blocked(Get/Set) methods in computation 46499fa7e03SVijay Mahadevan of element residuals and assembly of the discrete systems when all fields are co-located. 46599fa7e03SVijay Mahadevan 46699fa7e03SVijay Mahadevan Not Collective 46799fa7e03SVijay Mahadevan 46899fa7e03SVijay Mahadevan Input Parameters: 46999fa7e03SVijay Mahadevan + dm - the discretization manager object 47099fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array 471a2b725a8SWilliam Gropp - points - the MOAB EntityHandle container array which holds the field degree-of-freedom values 47299fa7e03SVijay Mahadevan 47399fa7e03SVijay Mahadevan Output Parameter: 474a2b725a8SWilliam Gropp . dof - the blocked local degree-of-freedom index array in the discrete representation (Vec, Mat) 47599fa7e03SVijay Mahadevan 47699fa7e03SVijay Mahadevan Level: intermediate 47799fa7e03SVijay Mahadevan 478db781477SPatrick Sanan .seealso: `DMMoabGetDofsLocal()`, `DMMoabGetDofs()`, `DMMoabGetDofsBlockedLocal()` 47999fa7e03SVijay Mahadevan @*/ 4809371c9d4SSatish Balay PetscErrorCode DMMoabGetDofsBlockedLocal(DM dm, PetscInt npoints, const moab::EntityHandle *points, PetscInt *dof) { 4818cbae1a6SVijay Mahadevan PetscInt i; 4828cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 4838cbae1a6SVijay Mahadevan 4848cbae1a6SVijay Mahadevan PetscFunctionBegin; 4858cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 4863f1c6e43SVijay Mahadevan PetscValidPointer(points, 3); 4878cbae1a6SVijay Mahadevan dmmoab = (DM_Moab *)(dm)->data; 4888cbae1a6SVijay Mahadevan 4899566063dSJacob Faibussowitsch if (!dof) PetscCall(PetscMalloc1(npoints, &dof)); 4908cbae1a6SVijay Mahadevan 4915f80ce2aSJacob Faibussowitsch for (i = 0; i < npoints; ++i) dof[i] = dmmoab->lidmap[(PetscInt)points[i] - dmmoab->seqstart]; 4928cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 4938cbae1a6SVijay Mahadevan } 4948cbae1a6SVijay Mahadevan 49599fa7e03SVijay Mahadevan /*@C 49699fa7e03SVijay Mahadevan DMMoabGetVertexDofsBlocked - Gets the global degree-of-freedom for the first field (component) defined on an 49799fa7e03SVijay Mahadevan array of locally owned MOAB mesh vertices. It's utility is when performing Finite-Difference type calculations 49899fa7e03SVijay Mahadevan where vertex traversal is faster than element-wise assembly that is typically done in FEM calculations. 49999fa7e03SVijay Mahadevan 50099fa7e03SVijay Mahadevan Not Collective 50199fa7e03SVijay Mahadevan 50299fa7e03SVijay Mahadevan Input Parameters: 503a2b725a8SWilliam Gropp . dm - the discretization manager object 50499fa7e03SVijay Mahadevan 50599fa7e03SVijay Mahadevan Output Parameter: 506a2b725a8SWilliam Gropp . dof - the blocked global degree-of-freedom index array in the discrete representation (Vec, Mat) that is vertex-based based on local numbering 50799fa7e03SVijay Mahadevan 50899fa7e03SVijay Mahadevan Level: intermediate 50999fa7e03SVijay Mahadevan 510db781477SPatrick Sanan .seealso: `DMMoabGetVertexDofsBlockedLocal()`, `DMMoabGetDofsBlocked()`, `DMMoabGetDofsBlockedLocal()` 51199fa7e03SVijay Mahadevan @*/ 5129371c9d4SSatish Balay PetscErrorCode DMMoabGetVertexDofsBlocked(DM dm, PetscInt **dof) { 5138cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 5148cbae1a6SVijay Mahadevan 5158cbae1a6SVijay Mahadevan PetscFunctionBegin; 5168cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 5178cbae1a6SVijay Mahadevan dmmoab = (DM_Moab *)(dm)->data; 5188cbae1a6SVijay Mahadevan 5198cbae1a6SVijay Mahadevan *dof = dmmoab->gidmap; 5208cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 5218cbae1a6SVijay Mahadevan } 5228cbae1a6SVijay Mahadevan 52399fa7e03SVijay Mahadevan /*@C 52499fa7e03SVijay Mahadevan DMMoabGetVertexDofsBlockedLocal - Gets the local degree-of-freedom for the first field (component) defined on an 52599fa7e03SVijay Mahadevan array of locally owned MOAB mesh vertices. It's utility is when performing Finite-Difference type calculations 52699fa7e03SVijay Mahadevan where vertex traversal is faster than element-wise assembly that is typically done in FEM calculations. 52799fa7e03SVijay Mahadevan 52899fa7e03SVijay Mahadevan Not Collective 52999fa7e03SVijay Mahadevan 53099fa7e03SVijay Mahadevan Input Parameters: 531a2b725a8SWilliam Gropp . dm - the discretization manager object 53299fa7e03SVijay Mahadevan 53399fa7e03SVijay Mahadevan Output Parameter: 534a2b725a8SWilliam Gropp . dof - the blocked local degree-of-freedom index array in the discrete representation (Vec, Mat) that is vertex-based based on local numbering 53599fa7e03SVijay Mahadevan 53699fa7e03SVijay Mahadevan Level: intermediate 53799fa7e03SVijay Mahadevan 538db781477SPatrick Sanan .seealso: `DMMoabGetVertexDofsBlocked()`, `DMMoabGetDofsBlocked()`, `DMMoabGetDofsBlockedLocal()` 53999fa7e03SVijay Mahadevan @*/ 5409371c9d4SSatish Balay PetscErrorCode DMMoabGetVertexDofsBlockedLocal(DM dm, PetscInt **dof) { 5418cbae1a6SVijay Mahadevan DM_Moab *dmmoab; 5428cbae1a6SVijay Mahadevan 5438cbae1a6SVijay Mahadevan PetscFunctionBegin; 5448cbae1a6SVijay Mahadevan PetscValidHeaderSpecific(dm, DM_CLASSID, 1); 5458cbae1a6SVijay Mahadevan PetscValidPointer(dof, 2); 5468cbae1a6SVijay Mahadevan dmmoab = (DM_Moab *)(dm)->data; 5478cbae1a6SVijay Mahadevan 5488cbae1a6SVijay Mahadevan *dof = dmmoab->lidmap; 5498cbae1a6SVijay Mahadevan PetscFunctionReturn(0); 5508cbae1a6SVijay Mahadevan } 551