xref: /petsc/src/dm/impls/moab/dmmbfield.cxx (revision 99fa7e037a0a87e30ecdc330b4fb296aa8bc0af2)
18cbae1a6SVijay Mahadevan #include <petsc-private/dmmbimpl.h> /*I  "petscdm.h"   I*/
28cbae1a6SVijay Mahadevan 
38cbae1a6SVijay Mahadevan #include <petscdmmoab.h>
48cbae1a6SVijay Mahadevan 
58cbae1a6SVijay Mahadevan #undef __FUNCT__
68cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabSetFieldVector"
7*99fa7e03SVijay Mahadevan /*@C
8*99fa7e03SVijay Mahadevan    DMMoabSetFieldVector - Sets the vector reference that represents the solution associated
9*99fa7e03SVijay Mahadevan    with a particular field component.
10*99fa7e03SVijay Mahadevan 
11*99fa7e03SVijay Mahadevan    Not Collective
12*99fa7e03SVijay Mahadevan 
13*99fa7e03SVijay Mahadevan    Input Parameters:
14*99fa7e03SVijay Mahadevan + dm     - the discretization manager object
15*99fa7e03SVijay Mahadevan .  ifield - the index of the field as set before via DMMoabSetFieldName.
16*99fa7e03SVijay Mahadevan -  fvec - the Vector solution corresponding to the field (component)
17*99fa7e03SVijay Mahadevan 
18*99fa7e03SVijay Mahadevan   Level: intermediate
19*99fa7e03SVijay Mahadevan 
20*99fa7e03SVijay Mahadevan .keywords: discretization manager, set, component solution
21*99fa7e03SVijay Mahadevan 
22*99fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldName(), DMMoabSetGlobalFieldVector()
23*99fa7e03SVijay Mahadevan @*/
248cbae1a6SVijay Mahadevan PetscErrorCode DMMoabSetFieldVector(DM dm, PetscInt ifield, Vec fvec)
258cbae1a6SVijay Mahadevan {
268cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
278cbae1a6SVijay Mahadevan   moab::Tag     vtag,ntag;
288cbae1a6SVijay Mahadevan   const PetscScalar *varray;
298cbae1a6SVijay Mahadevan   PetscScalar *farray;
308cbae1a6SVijay Mahadevan   moab::ErrorCode merr;
318cbae1a6SVijay Mahadevan   PetscErrorCode  ierr;
328cbae1a6SVijay Mahadevan   std::string tag_name;
338cbae1a6SVijay Mahadevan 
348cbae1a6SVijay Mahadevan   PetscFunctionBegin;
358cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
368cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
378cbae1a6SVijay Mahadevan 
38addae81cSVijay Mahadevan   if ((ifield < 0) || (ifield >= dmmoab->numFields)) SETERRQ2(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "The field %d should be positive and less than %d.", ifield, dmmoab->numFields);
39addae81cSVijay Mahadevan 
408cbae1a6SVijay Mahadevan   /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */
41addae81cSVijay Mahadevan   merr = dmmoab->mbiface->tag_get_handle(dmmoab->fieldNames[ifield],1,moab::MB_TYPE_DOUBLE,ntag,
428cbae1a6SVijay Mahadevan                                           moab::MB_TAG_DENSE|moab::MB_TAG_CREAT);MBERRNM(merr);
438cbae1a6SVijay Mahadevan 
448cbae1a6SVijay Mahadevan   ierr = DMMoabGetVecTag(fvec,&vtag);CHKERRQ(ierr);
458cbae1a6SVijay Mahadevan 
468cbae1a6SVijay Mahadevan   merr = dmmoab->mbiface->tag_get_name(vtag, tag_name);
478cbae1a6SVijay Mahadevan   if (!tag_name.length() && merr !=moab::MB_SUCCESS) {
488cbae1a6SVijay Mahadevan     ierr = VecGetArrayRead(fvec,&varray);CHKERRQ(ierr);
498cbae1a6SVijay Mahadevan     /* use the entity handle and the Dof index to set the right value */
508cbae1a6SVijay Mahadevan     merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)varray);MBERRNM(merr);
518cbae1a6SVijay Mahadevan     ierr = VecRestoreArrayRead(fvec,&varray);CHKERRQ(ierr);
528cbae1a6SVijay Mahadevan   }
538cbae1a6SVijay Mahadevan   else {
548cbae1a6SVijay Mahadevan     ierr = PetscMalloc(dmmoab->nloc*sizeof(PetscScalar),&farray);CHKERRQ(ierr);
558cbae1a6SVijay Mahadevan     /* we are using a MOAB Vec - directly copy the tag data to new one */
568cbae1a6SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_data(vtag, *dmmoab->vowned, (void*)farray);MBERRNM(merr);
578cbae1a6SVijay Mahadevan     merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)farray);MBERRNM(merr);
588cbae1a6SVijay Mahadevan     /* make sure the parallel exchange for ghosts are done appropriately */
598cbae1a6SVijay Mahadevan     ierr = PetscFree(farray);CHKERRQ(ierr);
608cbae1a6SVijay Mahadevan   }
618cbae1a6SVijay Mahadevan   merr = dmmoab->pcomm->exchange_tags(ntag, *dmmoab->vowned);MBERRNM(merr);
628cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
638cbae1a6SVijay Mahadevan }
648cbae1a6SVijay Mahadevan 
658cbae1a6SVijay Mahadevan 
668cbae1a6SVijay Mahadevan #undef __FUNCT__
678cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabSetGlobalFieldVector"
68*99fa7e03SVijay Mahadevan /*@C
69*99fa7e03SVijay Mahadevan    DMMoabSetGlobalFieldVector - Sets the vector reference that represents the global solution associated
70*99fa7e03SVijay Mahadevan    with all fields (components) managed by DM.
71*99fa7e03SVijay Mahadevan    A useful utility when updating the DM solution after a solve, to be serialized with the mesh for
72*99fa7e03SVijay Mahadevan    checkpointing purposes.
73*99fa7e03SVijay Mahadevan 
74*99fa7e03SVijay Mahadevan    Not Collective
75*99fa7e03SVijay Mahadevan 
76*99fa7e03SVijay Mahadevan    Input Parameters:
77*99fa7e03SVijay Mahadevan + dm     - the discretization manager object
78*99fa7e03SVijay Mahadevan -  fvec - the global Vector solution corresponding to all the fields managed by DM
79*99fa7e03SVijay Mahadevan 
80*99fa7e03SVijay Mahadevan   Level: intermediate
81*99fa7e03SVijay Mahadevan 
82*99fa7e03SVijay Mahadevan .keywords: discretization manager, set, component solution
83*99fa7e03SVijay Mahadevan 
84*99fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldName(), DMMoabSetFieldVector()
85*99fa7e03SVijay Mahadevan @*/
868cbae1a6SVijay Mahadevan PetscErrorCode DMMoabSetGlobalFieldVector(DM dm, Vec fvec)
878cbae1a6SVijay Mahadevan {
888cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
898cbae1a6SVijay Mahadevan   moab::Tag     vtag,ntag;
908cbae1a6SVijay Mahadevan   const PetscScalar   *varray;
918cbae1a6SVijay Mahadevan   PetscScalar   *farray;
928cbae1a6SVijay Mahadevan   moab::ErrorCode merr;
938cbae1a6SVijay Mahadevan   PetscErrorCode  ierr;
948cbae1a6SVijay Mahadevan   PetscInt i,ifield;
958cbae1a6SVijay Mahadevan   std::string tag_name;
968cbae1a6SVijay Mahadevan   moab::Range::iterator iter;
978cbae1a6SVijay Mahadevan 
988cbae1a6SVijay Mahadevan   PetscFunctionBegin;
998cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1008cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
1018cbae1a6SVijay Mahadevan 
1028cbae1a6SVijay Mahadevan   /* get the Tag corresponding to the global vector - possible that there is no tag associated.. */
1038cbae1a6SVijay Mahadevan   ierr = DMMoabGetVecTag(fvec,&vtag);CHKERRQ(ierr);
1048cbae1a6SVijay Mahadevan   merr = dmmoab->mbiface->tag_get_name(vtag, tag_name);
1058cbae1a6SVijay Mahadevan   ierr = PetscMalloc(dmmoab->nloc*sizeof(PetscScalar),&farray);CHKERRQ(ierr);
1068cbae1a6SVijay Mahadevan   if (!tag_name.length() && merr !=moab::MB_SUCCESS) {
1078cbae1a6SVijay Mahadevan     /* not a MOAB vector - use VecGetSubVector to get the parts as needed */
1088cbae1a6SVijay Mahadevan 
1098cbae1a6SVijay Mahadevan     ierr = VecGetArrayRead(fvec,&varray);CHKERRQ(ierr);
110addae81cSVijay Mahadevan     for (ifield=0; ifield<dmmoab->numFields; ++ifield) {
1118cbae1a6SVijay Mahadevan 
1128cbae1a6SVijay Mahadevan       /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */
113addae81cSVijay Mahadevan       merr = dmmoab->mbiface->tag_get_handle(dmmoab->fieldNames[ifield],1,moab::MB_TYPE_DOUBLE,ntag,
1148cbae1a6SVijay Mahadevan                                             moab::MB_TAG_DENSE|moab::MB_TAG_CREAT);MBERRNM(merr);
1158cbae1a6SVijay Mahadevan 
1168cbae1a6SVijay Mahadevan       for(i=0;i<dmmoab->nloc;i++) {
1178cbae1a6SVijay Mahadevan         if (dmmoab->bs == 1)
1188cbae1a6SVijay Mahadevan           farray[i]=varray[ifield*dmmoab->nloc+i];
1198cbae1a6SVijay Mahadevan         else
120addae81cSVijay Mahadevan           farray[i]=varray[i*dmmoab->numFields+ifield];
1218cbae1a6SVijay Mahadevan       }
1228cbae1a6SVijay Mahadevan 
1238cbae1a6SVijay Mahadevan       /* use the entity handle and the Dof index to set the right value */
1248cbae1a6SVijay Mahadevan       merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)farray);MBERRNM(merr);
1258cbae1a6SVijay Mahadevan     }
1268cbae1a6SVijay Mahadevan     ierr = VecRestoreArrayRead(fvec,&varray);CHKERRQ(ierr);
1278cbae1a6SVijay Mahadevan   }
1288cbae1a6SVijay Mahadevan   else {
1298cbae1a6SVijay Mahadevan     ierr = PetscMalloc(dmmoab->nloc*dmmoab->bs*sizeof(PetscScalar),&varray);CHKERRQ(ierr);
1308cbae1a6SVijay Mahadevan 
1318cbae1a6SVijay Mahadevan     /* we are using a MOAB Vec - directly copy the tag data to new one */
1328cbae1a6SVijay Mahadevan     merr = dmmoab->mbiface->tag_get_data(vtag, *dmmoab->vowned, (void*)varray);MBERRNM(merr);
133addae81cSVijay Mahadevan     for (ifield=0; ifield<dmmoab->numFields; ++ifield) {
1348cbae1a6SVijay Mahadevan 
1358cbae1a6SVijay Mahadevan       /* Create a tag in MOAB mesh to index and keep track of number of Petsc vec tags */
136addae81cSVijay Mahadevan       merr = dmmoab->mbiface->tag_get_handle(dmmoab->fieldNames[ifield],1,moab::MB_TYPE_DOUBLE,ntag,
1378cbae1a6SVijay Mahadevan                                             moab::MB_TAG_DENSE|moab::MB_TAG_CREAT);MBERRNM(merr);
1388cbae1a6SVijay Mahadevan 
1398cbae1a6SVijay Mahadevan       /* we are using a MOAB Vec - directly copy the tag data to new one */
1408cbae1a6SVijay Mahadevan       for(i=0; i < dmmoab->nloc; i++) {
1418cbae1a6SVijay Mahadevan         farray[i] = varray[i*dmmoab->bs+ifield];
1428cbae1a6SVijay Mahadevan       }
1438cbae1a6SVijay Mahadevan 
1448cbae1a6SVijay Mahadevan       merr = dmmoab->mbiface->tag_set_data(ntag, *dmmoab->vowned, (const void*)farray);MBERRNM(merr);
1458cbae1a6SVijay Mahadevan       /* make sure the parallel exchange for ghosts are done appropriately */
1468cbae1a6SVijay Mahadevan       merr = dmmoab->pcomm->exchange_tags(ntag, *dmmoab->vlocal);MBERRNM(merr);
1478cbae1a6SVijay Mahadevan     }
1488cbae1a6SVijay Mahadevan     ierr = PetscFree(varray);CHKERRQ(ierr);
1498cbae1a6SVijay Mahadevan   }
1508cbae1a6SVijay Mahadevan   ierr = PetscFree(farray);CHKERRQ(ierr);
1518cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
1528cbae1a6SVijay Mahadevan }
1538cbae1a6SVijay Mahadevan 
1548cbae1a6SVijay Mahadevan 
1558cbae1a6SVijay Mahadevan #undef __FUNCT__
156*99fa7e03SVijay Mahadevan #define __FUNCT__ "DMMoabSetFieldNames"
157*99fa7e03SVijay Mahadevan /*@C
158*99fa7e03SVijay Mahadevan   DMMoabSetFieldNames - Sets the number of fields and their names to be managed by the DM
159*99fa7e03SVijay Mahadevan 
160*99fa7e03SVijay Mahadevan   Not Collective
161*99fa7e03SVijay Mahadevan 
162*99fa7e03SVijay Mahadevan   Input Parameters:
163*99fa7e03SVijay Mahadevan + dm     - the discretization manager object
164*99fa7e03SVijay Mahadevan . numFields - the total number of fields
165*99fa7e03SVijay Mahadevan - fields - the array containing the names of each field (component); Can be NULL.
166*99fa7e03SVijay Mahadevan 
167*99fa7e03SVijay Mahadevan   Level: intermediate
168*99fa7e03SVijay Mahadevan 
169*99fa7e03SVijay Mahadevan .keywords: discretization manager, set, component name
170*99fa7e03SVijay Mahadevan 
171*99fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldName(), DMMoabSetFieldName()
172*99fa7e03SVijay Mahadevan @*/
173*99fa7e03SVijay Mahadevan PetscErrorCode DMMoabSetFieldNames(DM dm,PetscInt numFields,const char** fields)
1748cbae1a6SVijay Mahadevan {
175addae81cSVijay Mahadevan   PetscErrorCode ierr;
176addae81cSVijay Mahadevan   PetscInt       i;
1778cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
1788cbae1a6SVijay Mahadevan 
1798cbae1a6SVijay Mahadevan   PetscFunctionBegin;
1808cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
1818cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
1828cbae1a6SVijay Mahadevan 
183addae81cSVijay Mahadevan   /* first deallocate the existing field structure */
184addae81cSVijay Mahadevan   if (dmmoab->fieldNames) {
185addae81cSVijay Mahadevan     for(i=0; i<dmmoab->numFields; i++) {
186addae81cSVijay Mahadevan       ierr = PetscFree(dmmoab->fieldNames[i]);CHKERRQ(ierr);
187addae81cSVijay Mahadevan     }
188addae81cSVijay Mahadevan     ierr = PetscFree(dmmoab->fieldNames);CHKERRQ(ierr);
189addae81cSVijay Mahadevan   }
190addae81cSVijay Mahadevan 
191addae81cSVijay Mahadevan   /* now re-allocate and assign field names  */
192addae81cSVijay Mahadevan   dmmoab->numFields = numFields;
193addae81cSVijay Mahadevan   ierr = PetscMalloc(sizeof(char*)*numFields,&dmmoab->fieldNames);CHKERRQ(ierr);
194addae81cSVijay Mahadevan   if (fields) {
195addae81cSVijay Mahadevan     for(i=0; i<dmmoab->numFields; i++) {
196addae81cSVijay Mahadevan       ierr = PetscStrallocpy(fields[i], (char**) &dmmoab->fieldNames[i]);CHKERRQ(ierr);
197addae81cSVijay Mahadevan     }
198addae81cSVijay Mahadevan   }
1998cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
2008cbae1a6SVijay Mahadevan }
2018cbae1a6SVijay Mahadevan 
202*99fa7e03SVijay Mahadevan 
203*99fa7e03SVijay Mahadevan #undef __FUNCT__
204*99fa7e03SVijay Mahadevan #define __FUNCT__ "DMMoabGetFieldName"
205*99fa7e03SVijay Mahadevan /*@C
206*99fa7e03SVijay Mahadevan   DMMoabGetFieldName - Gets the names of individual field components in multicomponent
207*99fa7e03SVijay Mahadevan    vectors associated with a DMDA.
208*99fa7e03SVijay Mahadevan 
209*99fa7e03SVijay Mahadevan    Not Collective
210*99fa7e03SVijay Mahadevan 
211*99fa7e03SVijay Mahadevan    Input Parameter:
212*99fa7e03SVijay Mahadevan + dm     - the discretization manager object
213*99fa7e03SVijay Mahadevan -  field - field number for the DMMoab (0, 1, ... dof-1), where dof indicates the
214*99fa7e03SVijay Mahadevan         number of degrees of freedom per node within the DMMoab
215*99fa7e03SVijay Mahadevan 
216*99fa7e03SVijay Mahadevan    Output Parameter:
217*99fa7e03SVijay Mahadevan .  fieldName - the name of the field (component)
218*99fa7e03SVijay Mahadevan 
219*99fa7e03SVijay Mahadevan   Level: intermediate
220*99fa7e03SVijay Mahadevan 
221*99fa7e03SVijay Mahadevan .keywords: discretization manager, get, component name
222*99fa7e03SVijay Mahadevan 
223*99fa7e03SVijay Mahadevan .seealso: DMMoabSetFieldName(), DMMoabSetFields()
224*99fa7e03SVijay Mahadevan @*/
225*99fa7e03SVijay Mahadevan PetscErrorCode DMMoabGetFieldName(DM dm, PetscInt field, const char **fieldName)
226*99fa7e03SVijay Mahadevan {
227*99fa7e03SVijay Mahadevan   DM_Moab        *dmmoab;
228*99fa7e03SVijay Mahadevan 
229*99fa7e03SVijay Mahadevan   PetscFunctionBegin;
230*99fa7e03SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
231*99fa7e03SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
232*99fa7e03SVijay Mahadevan   if ((field < 0) || (field >= dmmoab->numFields)) SETERRQ3(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "DM field %d should be in [%d, %d)", field, 0, dmmoab->numFields);
233*99fa7e03SVijay Mahadevan 
234*99fa7e03SVijay Mahadevan   *fieldName = dmmoab->fieldNames[field];
235*99fa7e03SVijay Mahadevan   PetscFunctionReturn(0);
236*99fa7e03SVijay Mahadevan }
237*99fa7e03SVijay Mahadevan 
238*99fa7e03SVijay Mahadevan 
239c68c6878SVijay Mahadevan #undef __FUNCT__
240c68c6878SVijay Mahadevan #define __FUNCT__ "DMMoabSetFieldName"
241c68c6878SVijay Mahadevan /*@C
242*99fa7e03SVijay Mahadevan   DMMoabSetFieldName - Sets the name of a field (component) managed by the DM
243c68c6878SVijay Mahadevan 
244c68c6878SVijay Mahadevan   Not Collective
245c68c6878SVijay Mahadevan 
246c68c6878SVijay Mahadevan   Input Parameters:
247*99fa7e03SVijay Mahadevan + dm     - the discretization manager object
248c68c6878SVijay Mahadevan . field - the field number
249*99fa7e03SVijay Mahadevan - fieldName - the field (component) name
250c68c6878SVijay Mahadevan 
251*99fa7e03SVijay Mahadevan   Level: intermediate
252*99fa7e03SVijay Mahadevan   Notes: Can only be called after DMMoabSetFields supplied with correct numFields
253c68c6878SVijay Mahadevan 
254*99fa7e03SVijay Mahadevan .keywords: discretization manager, set, component name
255*99fa7e03SVijay Mahadevan 
256*99fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldName(), DMMoabSetFields()
257c68c6878SVijay Mahadevan @*/
258*99fa7e03SVijay Mahadevan PetscErrorCode DMMoabSetFieldName(DM dm, PetscInt field, const char **fieldName)
259c68c6878SVijay Mahadevan {
260c68c6878SVijay Mahadevan   PetscErrorCode ierr;
261c68c6878SVijay Mahadevan   DM_Moab        *dmmoab;
262c68c6878SVijay Mahadevan 
263c68c6878SVijay Mahadevan   PetscFunctionBegin;
264c68c6878SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
265*99fa7e03SVijay Mahadevan   PetscValidPointer(fieldName,3);
266*99fa7e03SVijay Mahadevan   PetscValidCharPointer(*fieldName,3);
267c68c6878SVijay Mahadevan 
268*99fa7e03SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
269c68c6878SVijay Mahadevan   if ((field < 0) || (field >= dmmoab->numFields)) SETERRQ3(PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "DM field %d should be in [%d, %d)", field, 0, dmmoab->numFields);
270*99fa7e03SVijay Mahadevan 
271*99fa7e03SVijay Mahadevan   if (dmmoab->fieldNames[field]) {
272c68c6878SVijay Mahadevan     ierr = PetscFree(dmmoab->fieldNames[field]);CHKERRQ(ierr);
273*99fa7e03SVijay Mahadevan   }
274*99fa7e03SVijay Mahadevan   ierr = PetscStrallocpy(*fieldName, (char**) &dmmoab->fieldNames[field]);CHKERRQ(ierr);
275c68c6878SVijay Mahadevan   PetscFunctionReturn(0);
276c68c6878SVijay Mahadevan }
277c68c6878SVijay Mahadevan 
2788cbae1a6SVijay Mahadevan 
2798cbae1a6SVijay Mahadevan #undef __FUNCT__
2808cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetFieldDof"
281*99fa7e03SVijay Mahadevan /*@C
282*99fa7e03SVijay Mahadevan   DMMoabGetFieldDof - Gets the global degree-of-freedom of a field (component) defined on a
283*99fa7e03SVijay Mahadevan   particular MOAB EntityHandle.
284*99fa7e03SVijay Mahadevan 
285*99fa7e03SVijay Mahadevan   Not Collective
286*99fa7e03SVijay Mahadevan 
287*99fa7e03SVijay Mahadevan   Input Parameters:
288*99fa7e03SVijay Mahadevan + dm     - the discretization manager object
289*99fa7e03SVijay Mahadevan . point - the MOAB EntityHandle container which holds the field degree-of-freedom values
290*99fa7e03SVijay Mahadevan - field - the field (component) index
291*99fa7e03SVijay Mahadevan 
292*99fa7e03SVijay Mahadevan    Output Parameter:
293*99fa7e03SVijay Mahadevan +  dof - the global degree-of-freedom index corresponding to the field in the discrete representation (Vec, Mat)
294*99fa7e03SVijay Mahadevan 
295*99fa7e03SVijay Mahadevan   Level: beginner
296*99fa7e03SVijay Mahadevan 
297*99fa7e03SVijay Mahadevan .keywords: discretization manager, get, global degree of freedom
298*99fa7e03SVijay Mahadevan 
299*99fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldDofs(), DMMoabGetFieldDofsLocal()
300*99fa7e03SVijay Mahadevan @*/
3018cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetFieldDof(DM dm,moab::EntityHandle point,PetscInt field,PetscInt* dof)
3028cbae1a6SVijay Mahadevan {
3038cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
3048cbae1a6SVijay Mahadevan 
3058cbae1a6SVijay Mahadevan   PetscFunctionBegin;
3068cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
3078cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
3088cbae1a6SVijay Mahadevan 
3098cbae1a6SVijay Mahadevan   *dof=dmmoab->gidmap[(PetscInt)point];
3108cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
3118cbae1a6SVijay Mahadevan }
3128cbae1a6SVijay Mahadevan 
3138cbae1a6SVijay Mahadevan 
3148cbae1a6SVijay Mahadevan #undef __FUNCT__
3158cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetFieldDofs"
316*99fa7e03SVijay Mahadevan /*@C
317*99fa7e03SVijay Mahadevan   DMMoabGetFieldDofs - Gets the global degree-of-freedom of a field (component) defined on an
318*99fa7e03SVijay Mahadevan   array of MOAB EntityHandles.
319*99fa7e03SVijay Mahadevan 
320*99fa7e03SVijay Mahadevan   Not Collective
321*99fa7e03SVijay Mahadevan 
322*99fa7e03SVijay Mahadevan   Input Parameters:
323*99fa7e03SVijay Mahadevan + dm     - the discretization manager object
324*99fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array
325*99fa7e03SVijay Mahadevan . points - the MOAB EntityHandle container array which holds the field degree-of-freedom values
326*99fa7e03SVijay Mahadevan - field - the field (component) index
327*99fa7e03SVijay Mahadevan 
328*99fa7e03SVijay Mahadevan   Output Parameter:
329*99fa7e03SVijay Mahadevan + dof - the global degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat)
330*99fa7e03SVijay Mahadevan 
331*99fa7e03SVijay Mahadevan   Level: intermediate
332*99fa7e03SVijay Mahadevan 
333*99fa7e03SVijay Mahadevan .keywords: discretization manager, get, global degrees of freedom
334*99fa7e03SVijay Mahadevan 
335*99fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldDof(), DMMoabGetFieldDofsLocal()
336*99fa7e03SVijay Mahadevan @*/
3378cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetFieldDofs(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt field,PetscInt* dof)
3388cbae1a6SVijay Mahadevan {
3398cbae1a6SVijay Mahadevan   PetscInt        i;
3408cbae1a6SVijay Mahadevan   PetscErrorCode  ierr;
3418cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
3428cbae1a6SVijay Mahadevan 
3438cbae1a6SVijay Mahadevan   PetscFunctionBegin;
3448cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
345*99fa7e03SVijay Mahadevan   PetscValidPointer(points,3);
3468cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
3478cbae1a6SVijay Mahadevan 
3488cbae1a6SVijay Mahadevan   if (!dof) {
3498cbae1a6SVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscInt)*npoints, &dof);CHKERRQ(ierr);
3508cbae1a6SVijay Mahadevan   }
3518cbae1a6SVijay Mahadevan 
352*99fa7e03SVijay Mahadevan   if (dmmoab->bs > 1) { /* compute the DOF based on local blocking in the fields */
3538cbae1a6SVijay Mahadevan     for (i=0; i<npoints; ++i)
354addae81cSVijay Mahadevan       dof[i] = dmmoab->gidmap[(PetscInt)points[i]]*dmmoab->numFields+field;
3558cbae1a6SVijay Mahadevan   }
3568cbae1a6SVijay Mahadevan   else {
357*99fa7e03SVijay Mahadevan     /* assume all fields have equal distribution; i.e., all fields are either defined on vertices or elements and not on a mixture */
358*99fa7e03SVijay Mahadevan     /* TODO: eliminate the limitation using PetscSection to manage DOFs */
3598cbae1a6SVijay Mahadevan     for (i=0; i<npoints; ++i)
3608cbae1a6SVijay Mahadevan       dof[i] = dmmoab->gidmap[(PetscInt)points[i]]+field*dmmoab->n;
3618cbae1a6SVijay Mahadevan   }
3628cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
3638cbae1a6SVijay Mahadevan }
3648cbae1a6SVijay Mahadevan 
3658cbae1a6SVijay Mahadevan 
3668cbae1a6SVijay Mahadevan #undef __FUNCT__
3678cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetFieldDofsLocal"
368*99fa7e03SVijay Mahadevan /*@C
369*99fa7e03SVijay Mahadevan   DMMoabGetFieldDofsLocal - Gets the local degrees-of-freedom of a field (component) defined on an
370*99fa7e03SVijay Mahadevan   array of MOAB EntityHandles.
371*99fa7e03SVijay Mahadevan 
372*99fa7e03SVijay Mahadevan   Not Collective
373*99fa7e03SVijay Mahadevan 
374*99fa7e03SVijay Mahadevan   Input Parameters:
375*99fa7e03SVijay Mahadevan + dm     - the discretization manager object
376*99fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array
377*99fa7e03SVijay Mahadevan . points - the MOAB EntityHandle container array which holds the field degree-of-freedom values
378*99fa7e03SVijay Mahadevan - field - the field (component) index
379*99fa7e03SVijay Mahadevan 
380*99fa7e03SVijay Mahadevan   Output Parameter:
381*99fa7e03SVijay Mahadevan + dof - the local degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat)
382*99fa7e03SVijay Mahadevan 
383*99fa7e03SVijay Mahadevan   Level: intermediate
384*99fa7e03SVijay Mahadevan 
385*99fa7e03SVijay Mahadevan .keywords: discretization manager, get, local degrees of freedom
386*99fa7e03SVijay Mahadevan 
387*99fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldDof(), DMMoabGetFieldDofs()
388*99fa7e03SVijay Mahadevan @*/
3898cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetFieldDofsLocal(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt field,PetscInt* dof)
3908cbae1a6SVijay Mahadevan {
3918cbae1a6SVijay Mahadevan   PetscInt i,offset;
3928cbae1a6SVijay Mahadevan   PetscErrorCode  ierr;
3938cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
3948cbae1a6SVijay Mahadevan 
3958cbae1a6SVijay Mahadevan   PetscFunctionBegin;
3968cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
397*99fa7e03SVijay Mahadevan   PetscValidPointer(points,3);
3988cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
3998cbae1a6SVijay Mahadevan 
4008cbae1a6SVijay Mahadevan   if (!dof) {
4018cbae1a6SVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscInt)*npoints, &dof);CHKERRQ(ierr);
4028cbae1a6SVijay Mahadevan   }
4038cbae1a6SVijay Mahadevan 
404*99fa7e03SVijay Mahadevan   if (dmmoab->bs > 1) { /* compute the DOF based on local blocking in the fields */
4058cbae1a6SVijay Mahadevan     for (i=0; i<npoints; ++i)
406addae81cSVijay Mahadevan       dof[i] = dmmoab->lidmap[(PetscInt)points[i]]*dmmoab->numFields+field;
4078cbae1a6SVijay Mahadevan   }
4088cbae1a6SVijay Mahadevan   else {
409*99fa7e03SVijay Mahadevan     /* assume all fields have equal distribution; i.e., all fields are either defined on vertices or elements and not on a mixture */
410*99fa7e03SVijay Mahadevan     /* TODO: eliminate the limitation using PetscSection to manage DOFs */
411*99fa7e03SVijay Mahadevan     offset = field*dmmoab->n;
4128cbae1a6SVijay Mahadevan     for (i=0; i<npoints; ++i)
4138cbae1a6SVijay Mahadevan       dof[i] = dmmoab->lidmap[(PetscInt)points[i]]+offset;
4148cbae1a6SVijay Mahadevan   }
4158cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
4168cbae1a6SVijay Mahadevan }
4178cbae1a6SVijay Mahadevan 
4188cbae1a6SVijay Mahadevan 
4198cbae1a6SVijay Mahadevan #undef __FUNCT__
4208cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetDofs"
421*99fa7e03SVijay Mahadevan /*@C
422*99fa7e03SVijay Mahadevan   DMMoabGetDofs - Gets the global degree-of-freedom for all fields (components) defined on an
423*99fa7e03SVijay Mahadevan   array of MOAB EntityHandles.
424*99fa7e03SVijay Mahadevan 
425*99fa7e03SVijay Mahadevan   Not Collective
426*99fa7e03SVijay Mahadevan 
427*99fa7e03SVijay Mahadevan   Input Parameters:
428*99fa7e03SVijay Mahadevan + dm     - the discretization manager object
429*99fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array
430*99fa7e03SVijay Mahadevan . points - the MOAB EntityHandle container array which holds the field degree-of-freedom values
431*99fa7e03SVijay Mahadevan 
432*99fa7e03SVijay Mahadevan   Output Parameter:
433*99fa7e03SVijay Mahadevan + dof - the global degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat)
434*99fa7e03SVijay Mahadevan 
435*99fa7e03SVijay Mahadevan   Level: intermediate
436*99fa7e03SVijay Mahadevan 
437*99fa7e03SVijay Mahadevan .keywords: discretization manager, get, global degrees of freedom
438*99fa7e03SVijay Mahadevan 
439*99fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldDofs(), DMMoabGetDofsLocal(), DMMoabGetDofsBlocked()
440*99fa7e03SVijay Mahadevan @*/
4418cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetDofs(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt* dof)
4428cbae1a6SVijay Mahadevan {
4438cbae1a6SVijay Mahadevan   PetscInt        i,field,offset;
4448cbae1a6SVijay Mahadevan   PetscErrorCode  ierr;
4458cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
4468cbae1a6SVijay Mahadevan 
4478cbae1a6SVijay Mahadevan   PetscFunctionBegin;
4488cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
449*99fa7e03SVijay Mahadevan   PetscValidPointer(points,3);
4508cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
4518cbae1a6SVijay Mahadevan 
4528cbae1a6SVijay Mahadevan   if (!dof) {
453addae81cSVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscInt)*dmmoab->numFields*npoints, &dof);CHKERRQ(ierr);
4548cbae1a6SVijay Mahadevan   }
4558cbae1a6SVijay Mahadevan 
456*99fa7e03SVijay Mahadevan   if (dmmoab->bs > 1) { /* compute the DOF based on local blocking in the fields */
457addae81cSVijay Mahadevan     for (field=0; field<dmmoab->numFields; ++field) {
4588cbae1a6SVijay Mahadevan       for (i=0; i<npoints; ++i)
459addae81cSVijay Mahadevan         dof[i*dmmoab->numFields+field] = dmmoab->gidmap[(PetscInt)points[i]]*dmmoab->numFields+field;
4608cbae1a6SVijay Mahadevan     }
4618cbae1a6SVijay Mahadevan   }
4628cbae1a6SVijay Mahadevan   else {
463*99fa7e03SVijay Mahadevan     /* assume all fields have equal distribution; i.e., all fields are either defined on vertices or elements and not on a mixture */
464*99fa7e03SVijay Mahadevan     /* TODO: eliminate the limitation using PetscSection to manage DOFs */
465addae81cSVijay Mahadevan     for (field=0; field<dmmoab->numFields; ++field) {
466*99fa7e03SVijay Mahadevan       offset = field*dmmoab->n;
4678cbae1a6SVijay Mahadevan       for (i=0; i<npoints; ++i)
468addae81cSVijay Mahadevan         dof[i*dmmoab->numFields+field] = dmmoab->gidmap[(PetscInt)points[i]]+offset;
4698cbae1a6SVijay Mahadevan     }
4708cbae1a6SVijay Mahadevan   }
4718cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
4728cbae1a6SVijay Mahadevan }
4738cbae1a6SVijay Mahadevan 
4748cbae1a6SVijay Mahadevan 
4758cbae1a6SVijay Mahadevan #undef __FUNCT__
4768cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetDofsLocal"
477*99fa7e03SVijay Mahadevan /*@C
478*99fa7e03SVijay Mahadevan   DMMoabGetDofsLocal - Gets the local degree-of-freedom for all fields (components) defined on an
479*99fa7e03SVijay Mahadevan   array of MOAB EntityHandles.
480*99fa7e03SVijay Mahadevan 
481*99fa7e03SVijay Mahadevan   Not Collective
482*99fa7e03SVijay Mahadevan 
483*99fa7e03SVijay Mahadevan   Input Parameters:
484*99fa7e03SVijay Mahadevan + dm     - the discretization manager object
485*99fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array
486*99fa7e03SVijay Mahadevan . points - the MOAB EntityHandle container array which holds the field degree-of-freedom values
487*99fa7e03SVijay Mahadevan 
488*99fa7e03SVijay Mahadevan   Output Parameter:
489*99fa7e03SVijay Mahadevan + dof - the local degree-of-freedom index array corresponding to the field in the discrete representation (Vec, Mat)
490*99fa7e03SVijay Mahadevan 
491*99fa7e03SVijay Mahadevan   Level: intermediate
492*99fa7e03SVijay Mahadevan 
493*99fa7e03SVijay Mahadevan .keywords: discretization manager, get, global degrees of freedom
494*99fa7e03SVijay Mahadevan 
495*99fa7e03SVijay Mahadevan .seealso: DMMoabGetFieldDofs(), DMMoabGetDofs(), DMMoabGetDofsBlocked()
496*99fa7e03SVijay Mahadevan @*/
4978cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetDofsLocal(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt* dof)
4988cbae1a6SVijay Mahadevan {
4998cbae1a6SVijay Mahadevan   PetscInt        i,field,offset;
5008cbae1a6SVijay Mahadevan   PetscErrorCode  ierr;
5018cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
5028cbae1a6SVijay Mahadevan 
5038cbae1a6SVijay Mahadevan   PetscFunctionBegin;
5048cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
505*99fa7e03SVijay Mahadevan   PetscValidPointer(points,3);
5068cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
5078cbae1a6SVijay Mahadevan 
5088cbae1a6SVijay Mahadevan   if (!dof) {
509addae81cSVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscInt)*dmmoab->numFields*npoints, &dof);CHKERRQ(ierr);
5108cbae1a6SVijay Mahadevan   }
5118cbae1a6SVijay Mahadevan 
512*99fa7e03SVijay Mahadevan   if (dmmoab->bs > 1) { /* compute the DOF based on local blocking in the fields */
513addae81cSVijay Mahadevan     for (field=0; field<dmmoab->numFields; ++field) {
5148cbae1a6SVijay Mahadevan       for (i=0; i<npoints; ++i)
515addae81cSVijay Mahadevan         dof[i*dmmoab->numFields+field] = dmmoab->lidmap[(PetscInt)points[i]]*dmmoab->numFields+field;
5168cbae1a6SVijay Mahadevan     }
5178cbae1a6SVijay Mahadevan   }
5188cbae1a6SVijay Mahadevan   else {
519*99fa7e03SVijay Mahadevan     /* assume all fields have equal distribution; i.e., all fields are either defined on vertices or elements and not on a mixture */
520*99fa7e03SVijay Mahadevan     /* TODO: eliminate the limitation using PetscSection to manage DOFs */
521addae81cSVijay Mahadevan     for (field=0; field<dmmoab->numFields; ++field) {
522*99fa7e03SVijay Mahadevan       offset = field*dmmoab->n;
5238cbae1a6SVijay Mahadevan       for (i=0; i<npoints; ++i)
524addae81cSVijay Mahadevan         dof[i*dmmoab->numFields+field] = dmmoab->lidmap[(PetscInt)points[i]]+offset;
5258cbae1a6SVijay Mahadevan     }
5268cbae1a6SVijay Mahadevan   }
5278cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
5288cbae1a6SVijay Mahadevan }
5298cbae1a6SVijay Mahadevan 
5308cbae1a6SVijay Mahadevan 
5318cbae1a6SVijay Mahadevan #undef __FUNCT__
5328cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetDofsBlocked"
533*99fa7e03SVijay Mahadevan /*@C
534*99fa7e03SVijay Mahadevan   DMMoabGetDofsBlocked - Gets the global degree-of-freedom for the first field (component) defined on an
535*99fa7e03SVijay Mahadevan   array of MOAB EntityHandles. It is useful when performing Blocked(Get/Set) methods in computation
536*99fa7e03SVijay Mahadevan   of element residuals and assembly of the discrete systems when all fields are co-located.
537*99fa7e03SVijay Mahadevan 
538*99fa7e03SVijay Mahadevan   Not Collective
539*99fa7e03SVijay Mahadevan 
540*99fa7e03SVijay Mahadevan   Input Parameters:
541*99fa7e03SVijay Mahadevan + dm     - the discretization manager object
542*99fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array
543*99fa7e03SVijay Mahadevan . points - the MOAB EntityHandle container array which holds the field degree-of-freedom values
544*99fa7e03SVijay Mahadevan 
545*99fa7e03SVijay Mahadevan   Output Parameter:
546*99fa7e03SVijay Mahadevan + dof - the blocked global degree-of-freedom index array in the discrete representation (Vec, Mat)
547*99fa7e03SVijay Mahadevan 
548*99fa7e03SVijay Mahadevan   Level: intermediate
549*99fa7e03SVijay Mahadevan 
550*99fa7e03SVijay Mahadevan .keywords: discretization manager, get, global degrees of freedom
551*99fa7e03SVijay Mahadevan 
552*99fa7e03SVijay Mahadevan .seealso: DMMoabGetDofsLocal(), DMMoabGetDofs(), DMMoabGetDofsBlockedLocal()
553*99fa7e03SVijay Mahadevan @*/
5548cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetDofsBlocked(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt* dof)
5558cbae1a6SVijay Mahadevan {
5568cbae1a6SVijay Mahadevan   PetscInt        i;
5578cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
5588cbae1a6SVijay Mahadevan   PetscErrorCode  ierr;
5598cbae1a6SVijay Mahadevan 
5608cbae1a6SVijay Mahadevan   PetscFunctionBegin;
5618cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
5628cbae1a6SVijay Mahadevan   PetscValidPointer(points,2);
5638cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
5648cbae1a6SVijay Mahadevan 
5658cbae1a6SVijay Mahadevan   if (!dof) {
5668cbae1a6SVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscInt)*npoints, &dof);CHKERRQ(ierr);
5678cbae1a6SVijay Mahadevan   }
5688cbae1a6SVijay Mahadevan 
5698cbae1a6SVijay Mahadevan   for (i=0; i<npoints; ++i) {
5708cbae1a6SVijay Mahadevan     dof[i]=dmmoab->gidmap[(PetscInt)points[i]];
5718cbae1a6SVijay Mahadevan   }
5728cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
5738cbae1a6SVijay Mahadevan }
5748cbae1a6SVijay Mahadevan 
5758cbae1a6SVijay Mahadevan 
5768cbae1a6SVijay Mahadevan #undef __FUNCT__
5778cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetDofsBlockedLocal"
578*99fa7e03SVijay Mahadevan /*@C
579*99fa7e03SVijay Mahadevan   DMMoabGetDofsBlockedLocal - Gets the local degree-of-freedom for the first field (component) defined on an
580*99fa7e03SVijay Mahadevan   array of MOAB EntityHandles. It is useful when performing local Blocked(Get/Set) methods in computation
581*99fa7e03SVijay Mahadevan   of element residuals and assembly of the discrete systems when all fields are co-located.
582*99fa7e03SVijay Mahadevan 
583*99fa7e03SVijay Mahadevan   Not Collective
584*99fa7e03SVijay Mahadevan 
585*99fa7e03SVijay Mahadevan   Input Parameters:
586*99fa7e03SVijay Mahadevan + dm     - the discretization manager object
587*99fa7e03SVijay Mahadevan . npoints - the total number of Entities in the points array
588*99fa7e03SVijay Mahadevan . points - the MOAB EntityHandle container array which holds the field degree-of-freedom values
589*99fa7e03SVijay Mahadevan 
590*99fa7e03SVijay Mahadevan   Output Parameter:
591*99fa7e03SVijay Mahadevan + dof - the blocked local degree-of-freedom index array in the discrete representation (Vec, Mat)
592*99fa7e03SVijay Mahadevan 
593*99fa7e03SVijay Mahadevan   Level: intermediate
594*99fa7e03SVijay Mahadevan 
595*99fa7e03SVijay Mahadevan .keywords: discretization manager, get, global degrees of freedom
596*99fa7e03SVijay Mahadevan 
597*99fa7e03SVijay Mahadevan .seealso: DMMoabGetDofsLocal(), DMMoabGetDofs(), DMMoabGetDofsBlockedLocal()
598*99fa7e03SVijay Mahadevan @*/
5998cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetDofsBlockedLocal(DM dm,PetscInt npoints,const moab::EntityHandle* points,PetscInt* dof)
6008cbae1a6SVijay Mahadevan {
6018cbae1a6SVijay Mahadevan   PetscInt        i;
6028cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
6038cbae1a6SVijay Mahadevan   PetscErrorCode  ierr;
6048cbae1a6SVijay Mahadevan 
6058cbae1a6SVijay Mahadevan   PetscFunctionBegin;
6068cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6078cbae1a6SVijay Mahadevan   PetscValidPointer(points,2);
6088cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
6098cbae1a6SVijay Mahadevan 
6108cbae1a6SVijay Mahadevan   if (!dof) {
6118cbae1a6SVijay Mahadevan     ierr = PetscMalloc(sizeof(PetscInt)*npoints, &dof);CHKERRQ(ierr);
6128cbae1a6SVijay Mahadevan   }
6138cbae1a6SVijay Mahadevan 
6148cbae1a6SVijay Mahadevan   for (i=0; i<npoints; ++i)
6158cbae1a6SVijay Mahadevan     dof[i] = dmmoab->lidmap[(PetscInt)points[i]];
6168cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
6178cbae1a6SVijay Mahadevan }
6188cbae1a6SVijay Mahadevan 
6198cbae1a6SVijay Mahadevan 
6208cbae1a6SVijay Mahadevan #undef __FUNCT__
6218cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetVertexDofsBlocked"
622*99fa7e03SVijay Mahadevan /*@C
623*99fa7e03SVijay Mahadevan   DMMoabGetVertexDofsBlocked - Gets the global degree-of-freedom for the first field (component) defined on an
624*99fa7e03SVijay Mahadevan   array of locally owned MOAB mesh vertices. It's utility is when performing Finite-Difference type calculations
625*99fa7e03SVijay Mahadevan   where vertex traversal is faster than element-wise assembly that is typically done in FEM calculations.
626*99fa7e03SVijay Mahadevan 
627*99fa7e03SVijay Mahadevan   Not Collective
628*99fa7e03SVijay Mahadevan 
629*99fa7e03SVijay Mahadevan   Input Parameters:
630*99fa7e03SVijay Mahadevan + dm     - the discretization manager object
631*99fa7e03SVijay Mahadevan 
632*99fa7e03SVijay Mahadevan   Output Parameter:
633*99fa7e03SVijay Mahadevan + dof - the blocked global degree-of-freedom index array in the discrete representation (Vec, Mat) that is vertex-based based on local numbering
634*99fa7e03SVijay Mahadevan 
635*99fa7e03SVijay Mahadevan   Level: intermediate
636*99fa7e03SVijay Mahadevan 
637*99fa7e03SVijay Mahadevan .keywords: discretization manager, get, blocked degrees of freedom
638*99fa7e03SVijay Mahadevan 
639*99fa7e03SVijay Mahadevan .seealso: DMMoabGetVertexDofsBlockedLocal(), DMMoabGetDofsBlocked(), DMMoabGetDofsBlockedLocal()
640*99fa7e03SVijay Mahadevan @*/
6418cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetVertexDofsBlocked(DM dm,PetscInt** dof)
6428cbae1a6SVijay Mahadevan {
6438cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
6448cbae1a6SVijay Mahadevan 
6458cbae1a6SVijay Mahadevan   PetscFunctionBegin;
6468cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6478cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
6488cbae1a6SVijay Mahadevan 
6498cbae1a6SVijay Mahadevan   *dof = dmmoab->gidmap;
6508cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
6518cbae1a6SVijay Mahadevan }
6528cbae1a6SVijay Mahadevan 
6538cbae1a6SVijay Mahadevan 
6548cbae1a6SVijay Mahadevan #undef __FUNCT__
6558cbae1a6SVijay Mahadevan #define __FUNCT__ "DMMoabGetVertexDofsBlockedLocal"
656*99fa7e03SVijay Mahadevan /*@C
657*99fa7e03SVijay Mahadevan   DMMoabGetVertexDofsBlockedLocal - Gets the local degree-of-freedom for the first field (component) defined on an
658*99fa7e03SVijay Mahadevan   array of locally owned MOAB mesh vertices. It's utility is when performing Finite-Difference type calculations
659*99fa7e03SVijay Mahadevan   where vertex traversal is faster than element-wise assembly that is typically done in FEM calculations.
660*99fa7e03SVijay Mahadevan 
661*99fa7e03SVijay Mahadevan   Not Collective
662*99fa7e03SVijay Mahadevan 
663*99fa7e03SVijay Mahadevan   Input Parameters:
664*99fa7e03SVijay Mahadevan + dm     - the discretization manager object
665*99fa7e03SVijay Mahadevan 
666*99fa7e03SVijay Mahadevan   Output Parameter:
667*99fa7e03SVijay Mahadevan + dof - the blocked local degree-of-freedom index array in the discrete representation (Vec, Mat) that is vertex-based based on local numbering
668*99fa7e03SVijay Mahadevan 
669*99fa7e03SVijay Mahadevan   Level: intermediate
670*99fa7e03SVijay Mahadevan 
671*99fa7e03SVijay Mahadevan .keywords: discretization manager, get, blocked degrees of freedom
672*99fa7e03SVijay Mahadevan 
673*99fa7e03SVijay Mahadevan .seealso: DMMoabGetVertexDofsBlocked(), DMMoabGetDofsBlocked(), DMMoabGetDofsBlockedLocal()
674*99fa7e03SVijay Mahadevan @*/
6758cbae1a6SVijay Mahadevan PetscErrorCode DMMoabGetVertexDofsBlockedLocal(DM dm,PetscInt** dof)
6768cbae1a6SVijay Mahadevan {
6778cbae1a6SVijay Mahadevan   DM_Moab        *dmmoab;
6788cbae1a6SVijay Mahadevan 
6798cbae1a6SVijay Mahadevan   PetscFunctionBegin;
6808cbae1a6SVijay Mahadevan   PetscValidHeaderSpecific(dm,DM_CLASSID,1);
6818cbae1a6SVijay Mahadevan   PetscValidPointer(dof,2);
6828cbae1a6SVijay Mahadevan   dmmoab = (DM_Moab*)(dm)->data;
6838cbae1a6SVijay Mahadevan 
6848cbae1a6SVijay Mahadevan   *dof = dmmoab->lidmap;
6858cbae1a6SVijay Mahadevan   PetscFunctionReturn(0);
6868cbae1a6SVijay Mahadevan }
6878cbae1a6SVijay Mahadevan 
688