1*3da551e6SToby Isaac #include <petsc/private/dmfieldimpl.h> /*I "petscdmfield.h" I*/ 2*3da551e6SToby Isaac 3*3da551e6SToby Isaac const char *const DMFieldContinuities[] = { 4*3da551e6SToby Isaac "VERTEX", 5*3da551e6SToby Isaac "EDGE", 6*3da551e6SToby Isaac "FACET", 7*3da551e6SToby Isaac "CELL", 8*3da551e6SToby Isaac 0 9*3da551e6SToby Isaac }; 10*3da551e6SToby Isaac 11*3da551e6SToby Isaac PETSC_INTERN PetscErrorCode DMFieldCreate(DM dm,PetscInt numComponents,DMFieldContinuity continuity,DMField *field) 12*3da551e6SToby Isaac { 13*3da551e6SToby Isaac PetscErrorCode ierr; 14*3da551e6SToby Isaac DMField b; 15*3da551e6SToby Isaac 16*3da551e6SToby Isaac PetscFunctionBegin; 17*3da551e6SToby Isaac PetscValidHeaderSpecific(dm,DM_CLASSID,1); 18*3da551e6SToby Isaac PetscValidPointer(field,2); 19*3da551e6SToby Isaac ierr = DMFieldInitializePackage();CHKERRQ(ierr); 20*3da551e6SToby Isaac 21*3da551e6SToby Isaac ierr = PetscHeaderCreate(b,DMFIELD_CLASSID,"DMField","Field over DM","DM",PetscObjectComm((PetscObject)dm),DMFieldDestroy,DMFieldView);CHKERRQ(ierr); 22*3da551e6SToby Isaac ierr = PetscObjectReference((PetscObject)dm);CHKERRQ(ierr); 23*3da551e6SToby Isaac b->dm = dm; 24*3da551e6SToby Isaac b->continuity = continuity; 25*3da551e6SToby Isaac b->numComponents = numComponents; 26*3da551e6SToby Isaac *field = b; 27*3da551e6SToby Isaac PetscFunctionReturn(0); 28*3da551e6SToby Isaac } 29*3da551e6SToby Isaac 30*3da551e6SToby Isaac /*@ 31*3da551e6SToby Isaac DMFieldDestroy - destroy a DMField 32*3da551e6SToby Isaac 33*3da551e6SToby Isaac Collective 34*3da551e6SToby Isaac 35*3da551e6SToby Isaac Input Arguments: 36*3da551e6SToby Isaac . field - address of DMField 37*3da551e6SToby Isaac 38*3da551e6SToby Isaac Level: advanced 39*3da551e6SToby Isaac 40*3da551e6SToby Isaac .seealso: DMFieldCreate() 41*3da551e6SToby Isaac @*/ 42*3da551e6SToby Isaac PetscErrorCode DMFieldDestroy(DMField *field) 43*3da551e6SToby Isaac { 44*3da551e6SToby Isaac PetscErrorCode ierr; 45*3da551e6SToby Isaac 46*3da551e6SToby Isaac PetscFunctionBegin; 47*3da551e6SToby Isaac if (!*field) PetscFunctionReturn(0); 48*3da551e6SToby Isaac PetscValidHeaderSpecific((*field),DMFIELD_CLASSID,1); 49*3da551e6SToby Isaac if (--((PetscObject)(*field))->refct > 0) {*field = 0; PetscFunctionReturn(0);} 50*3da551e6SToby Isaac if ((*field)->ops->destroy) {ierr = (*(*field)->ops->destroy)(*field);CHKERRQ(ierr);} 51*3da551e6SToby Isaac ierr = DMDestroy(&((*field)->dm));CHKERRQ(ierr); 52*3da551e6SToby Isaac ierr = PetscHeaderDestroy(field);CHKERRQ(ierr); 53*3da551e6SToby Isaac PetscFunctionReturn(0); 54*3da551e6SToby Isaac } 55*3da551e6SToby Isaac 56*3da551e6SToby Isaac /*@C 57*3da551e6SToby Isaac DMFieldView - view a DMField 58*3da551e6SToby Isaac 59*3da551e6SToby Isaac Collective 60*3da551e6SToby Isaac 61*3da551e6SToby Isaac Input Arguments: 62*3da551e6SToby Isaac + field - DMField 63*3da551e6SToby Isaac - viewer - viewer to display field, for example PETSC_VIEWER_STDOUT_WORLD 64*3da551e6SToby Isaac 65*3da551e6SToby Isaac Level: advanced 66*3da551e6SToby Isaac 67*3da551e6SToby Isaac .seealso: DMFieldCreate() 68*3da551e6SToby Isaac @*/ 69*3da551e6SToby Isaac PetscErrorCode DMFieldView(DMField field,PetscViewer viewer) 70*3da551e6SToby Isaac { 71*3da551e6SToby Isaac PetscErrorCode ierr; 72*3da551e6SToby Isaac PetscBool iascii; 73*3da551e6SToby Isaac 74*3da551e6SToby Isaac PetscFunctionBegin; 75*3da551e6SToby Isaac PetscValidHeaderSpecific(field,DMFIELD_CLASSID,1); 76*3da551e6SToby Isaac if (!viewer) {ierr = PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)field),&viewer);CHKERRQ(ierr);} 77*3da551e6SToby Isaac PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2); 78*3da551e6SToby Isaac PetscCheckSameComm(field,1,viewer,2); 79*3da551e6SToby Isaac ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 80*3da551e6SToby Isaac if (iascii) { 81*3da551e6SToby Isaac ierr = PetscObjectPrintClassNamePrefixType((PetscObject)field,viewer);CHKERRQ(ierr); 82*3da551e6SToby Isaac ierr = PetscViewerASCIIPushTab(viewer);CHKERRQ(ierr); 83*3da551e6SToby Isaac ierr = PetscViewerASCIIPrintf(viewer,"%D components\n",field->numComponents);CHKERRQ(ierr); 84*3da551e6SToby Isaac ierr = PetscViewerASCIIPrintf(viewer,"%s continuity\n",DMFieldContinuities[field->continuity]);CHKERRQ(ierr); 85*3da551e6SToby Isaac ierr = PetscViewerPushFormat(viewer,PETSC_VIEWER_DEFAULT);CHKERRQ(ierr); 86*3da551e6SToby Isaac ierr = DMView(field->dm,viewer);CHKERRQ(ierr); 87*3da551e6SToby Isaac ierr = PetscViewerPopFormat(viewer);CHKERRQ(ierr); 88*3da551e6SToby Isaac } 89*3da551e6SToby Isaac if (field->ops->view) {ierr = (*field->ops->view)(field,viewer);CHKERRQ(ierr);} 90*3da551e6SToby Isaac if (iascii) { 91*3da551e6SToby Isaac ierr = PetscViewerASCIIPopTab(viewer);CHKERRQ(ierr); 92*3da551e6SToby Isaac } 93*3da551e6SToby Isaac PetscFunctionReturn(0); 94*3da551e6SToby Isaac } 95*3da551e6SToby Isaac 96*3da551e6SToby Isaac /*@C 97*3da551e6SToby Isaac DMFieldSetType - set the DMField implementation 98*3da551e6SToby Isaac 99*3da551e6SToby Isaac Collective on DMField 100*3da551e6SToby Isaac 101*3da551e6SToby Isaac Input Parameters: 102*3da551e6SToby Isaac + field - the DMField context 103*3da551e6SToby Isaac - type - a known method 104*3da551e6SToby Isaac 105*3da551e6SToby Isaac Notes: 106*3da551e6SToby Isaac See "include/petscvec.h" for available methods (for instance) 107*3da551e6SToby Isaac + DMFIELDDA - a field defined only by its values at the corners of a DMDA 108*3da551e6SToby Isaac . DMFIELDDS - a field defined by a discretization over a mesh set with DMSetField() 109*3da551e6SToby Isaac - DMFIELDSHELL - a field defined by arbitrary callbacks 110*3da551e6SToby Isaac 111*3da551e6SToby Isaac Level: advanced 112*3da551e6SToby Isaac 113*3da551e6SToby Isaac .keywords: DMField, set, type 114*3da551e6SToby Isaac 115*3da551e6SToby Isaac .seealso: DMFieldType, 116*3da551e6SToby Isaac @*/ 117*3da551e6SToby Isaac PetscErrorCode DMFieldSetType(DMField field,DMFieldType type) 118*3da551e6SToby Isaac { 119*3da551e6SToby Isaac PetscErrorCode ierr,(*r)(DMField); 120*3da551e6SToby Isaac PetscBool match; 121*3da551e6SToby Isaac 122*3da551e6SToby Isaac PetscFunctionBegin; 123*3da551e6SToby Isaac PetscValidHeaderSpecific(field,DMFIELD_CLASSID,1); 124*3da551e6SToby Isaac PetscValidCharPointer(type,2); 125*3da551e6SToby Isaac 126*3da551e6SToby Isaac ierr = PetscObjectTypeCompare((PetscObject)field,type,&match);CHKERRQ(ierr); 127*3da551e6SToby Isaac if (match) PetscFunctionReturn(0); 128*3da551e6SToby Isaac 129*3da551e6SToby Isaac ierr = PetscFunctionListFind(DMFieldList,type,&r);CHKERRQ(ierr); 130*3da551e6SToby Isaac if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unable to find requested DMField type %s",type); 131*3da551e6SToby Isaac /* Destroy the previous private DMField context */ 132*3da551e6SToby Isaac if (field->ops->destroy) { 133*3da551e6SToby Isaac ierr = (*(field)->ops->destroy)(field);CHKERRQ(ierr); 134*3da551e6SToby Isaac } 135*3da551e6SToby Isaac ierr = PetscMemzero(field->ops,sizeof(*field->ops));CHKERRQ(ierr); 136*3da551e6SToby Isaac ierr = PetscObjectChangeTypeName((PetscObject)field,type);CHKERRQ(ierr); 137*3da551e6SToby Isaac field->ops->create = r; 138*3da551e6SToby Isaac ierr = (*r)(field);CHKERRQ(ierr); 139*3da551e6SToby Isaac PetscFunctionReturn(0); 140*3da551e6SToby Isaac } 141*3da551e6SToby Isaac 142*3da551e6SToby Isaac /*@C 143*3da551e6SToby Isaac DMFieldGetType - Gets the DMField type name (as a string) from the DMField. 144*3da551e6SToby Isaac 145*3da551e6SToby Isaac Not Collective 146*3da551e6SToby Isaac 147*3da551e6SToby Isaac Input Parameter: 148*3da551e6SToby Isaac . field - The DMField context 149*3da551e6SToby Isaac 150*3da551e6SToby Isaac Output Parameter: 151*3da551e6SToby Isaac . type - The DMField type name 152*3da551e6SToby Isaac 153*3da551e6SToby Isaac Level: advanced 154*3da551e6SToby Isaac 155*3da551e6SToby Isaac .keywords: DMField, get, type, name 156*3da551e6SToby Isaac .seealso: DMFieldSetType() 157*3da551e6SToby Isaac @*/ 158*3da551e6SToby Isaac PetscErrorCode DMFieldGetType(DMField field, DMFieldType *type) 159*3da551e6SToby Isaac { 160*3da551e6SToby Isaac PetscErrorCode ierr; 161*3da551e6SToby Isaac 162*3da551e6SToby Isaac PetscFunctionBegin; 163*3da551e6SToby Isaac PetscValidHeaderSpecific(field, VEC_TAGGER_CLASSID,1); 164*3da551e6SToby Isaac PetscValidPointer(type,2); 165*3da551e6SToby Isaac ierr = DMFieldRegisterAll();CHKERRQ(ierr); 166*3da551e6SToby Isaac *type = ((PetscObject)field)->type_name; 167*3da551e6SToby Isaac PetscFunctionReturn(0); 168*3da551e6SToby Isaac } 169*3da551e6SToby Isaac 170*3da551e6SToby Isaac PetscErrorCode DMFieldGetNumComponents(DMField field, PetscInt *nc) 171*3da551e6SToby Isaac { 172*3da551e6SToby Isaac PetscFunctionBegin; 173*3da551e6SToby Isaac PetscValidHeaderSpecific(field,DMFIELD_CLASSID,1); 174*3da551e6SToby Isaac PetscValidIntPointer(nc,2); 175*3da551e6SToby Isaac *nc = field->numComponents; 176*3da551e6SToby Isaac PetscFunctionReturn(0); 177*3da551e6SToby Isaac } 178*3da551e6SToby Isaac 179*3da551e6SToby Isaac PetscErrorCode DMFieldGetDM(DMField field, DM *dm) 180*3da551e6SToby Isaac { 181*3da551e6SToby Isaac PetscFunctionBegin; 182*3da551e6SToby Isaac PetscValidHeaderSpecific(field,DMFIELD_CLASSID,1); 183*3da551e6SToby Isaac PetscValidPointer(dm,2); 184*3da551e6SToby Isaac *dm = field->dm; 185*3da551e6SToby Isaac PetscFunctionReturn(0); 186*3da551e6SToby Isaac } 187*3da551e6SToby Isaac 188*3da551e6SToby Isaac PetscErrorCode DMFieldEvaluate(DMField field, Vec points, PetscDataType datatype, void *B, void *D, void *H) 189*3da551e6SToby Isaac { 190*3da551e6SToby Isaac PetscErrorCode ierr; 191*3da551e6SToby Isaac 192*3da551e6SToby Isaac PetscFunctionBegin; 193*3da551e6SToby Isaac PetscValidHeaderSpecific(field,DMFIELD_CLASSID,1); 194*3da551e6SToby Isaac PetscValidHeaderSpecific(points,VEC_CLASSID,2); 195*3da551e6SToby Isaac if (B) PetscValidPointer(B,3); 196*3da551e6SToby Isaac if (D) PetscValidPointer(D,4); 197*3da551e6SToby Isaac if (H) PetscValidPointer(H,5); 198*3da551e6SToby Isaac if (field->ops->evaluate) { 199*3da551e6SToby Isaac ierr = (*field->ops->evaluate) (field, points, datatype, B, D, H);CHKERRQ(ierr); 200*3da551e6SToby Isaac } else SETERRQ (PetscObjectComm((PetscObject)field),PETSC_ERR_SUP,"Not implemented for this type"); 201*3da551e6SToby Isaac PetscFunctionReturn(0); 202*3da551e6SToby Isaac } 203*3da551e6SToby Isaac 204*3da551e6SToby Isaac PetscErrorCode DMFieldEvaluateFE(DMField field, IS cellIS, PetscQuadrature points, PetscDataType datatype, void *B, void *D, void *H) 205*3da551e6SToby Isaac { 206*3da551e6SToby Isaac PetscErrorCode ierr; 207*3da551e6SToby Isaac 208*3da551e6SToby Isaac PetscFunctionBegin; 209*3da551e6SToby Isaac PetscValidHeaderSpecific(field,DMFIELD_CLASSID,1); 210*3da551e6SToby Isaac PetscValidHeaderSpecific(cellIS,IS_CLASSID,2); 211*3da551e6SToby Isaac PetscValidHeader(points,3); 212*3da551e6SToby Isaac if (B) PetscValidPointer(B,4); 213*3da551e6SToby Isaac if (D) PetscValidPointer(D,5); 214*3da551e6SToby Isaac if (H) PetscValidPointer(H,6); 215*3da551e6SToby Isaac if (field->ops->evaluateFE) { 216*3da551e6SToby Isaac ierr = (*field->ops->evaluateFE) (field, cellIS, points, datatype, B, D, H);CHKERRQ(ierr); 217*3da551e6SToby Isaac } else SETERRQ (PetscObjectComm((PetscObject)field),PETSC_ERR_SUP,"Not implemented for this type"); 218*3da551e6SToby Isaac PetscFunctionReturn(0); 219*3da551e6SToby Isaac } 220*3da551e6SToby Isaac 221*3da551e6SToby Isaac PetscErrorCode DMFieldEvaluateFV(DMField field, IS cellIS, PetscDataType datatype, void *B, void *D, void *H) 222*3da551e6SToby Isaac { 223*3da551e6SToby Isaac PetscErrorCode ierr; 224*3da551e6SToby Isaac 225*3da551e6SToby Isaac PetscFunctionBegin; 226*3da551e6SToby Isaac PetscValidHeaderSpecific(field,DMFIELD_CLASSID,1); 227*3da551e6SToby Isaac PetscValidHeaderSpecific(cellIS,IS_CLASSID,2); 228*3da551e6SToby Isaac if (B) PetscValidPointer(B,3); 229*3da551e6SToby Isaac if (D) PetscValidPointer(D,4); 230*3da551e6SToby Isaac if (H) PetscValidPointer(H,5); 231*3da551e6SToby Isaac if (field->ops->evaluateFV) { 232*3da551e6SToby Isaac ierr = (*field->ops->evaluateFV) (field, cellIS, datatype, B, D, H);CHKERRQ(ierr); 233*3da551e6SToby Isaac } else SETERRQ (PetscObjectComm((PetscObject)field),PETSC_ERR_SUP,"Not implemented for this type"); 234*3da551e6SToby Isaac PetscFunctionReturn(0); 235*3da551e6SToby Isaac } 236*3da551e6SToby Isaac 237*3da551e6SToby Isaac PetscErrorCode DMFieldGetFEInvariance(DMField field, IS cellIS, PetscBool *isConstant, PetscBool *isAffine, PetscBool *isQuadratic) 238*3da551e6SToby Isaac { 239*3da551e6SToby Isaac PetscErrorCode ierr; 240*3da551e6SToby Isaac 241*3da551e6SToby Isaac PetscFunctionBegin; 242*3da551e6SToby Isaac PetscValidHeaderSpecific(field,DMFIELD_CLASSID,1); 243*3da551e6SToby Isaac PetscValidHeaderSpecific(cellIS,IS_CLASSID,2); 244*3da551e6SToby Isaac if (isConstant) PetscValidPointer(isConstant,3); 245*3da551e6SToby Isaac if (isAffine) PetscValidPointer(isAffine,4); 246*3da551e6SToby Isaac if (isQuadratic) PetscValidPointer(isQuadratic,5); 247*3da551e6SToby Isaac 248*3da551e6SToby Isaac if (isConstant) *isConstant = PETSC_FALSE; 249*3da551e6SToby Isaac if (isAffine) *isAffine = PETSC_FALSE; 250*3da551e6SToby Isaac if (isQuadratic) *isQuadratic = PETSC_FALSE; 251*3da551e6SToby Isaac 252*3da551e6SToby Isaac if (field->ops->getFEInvariance) { 253*3da551e6SToby Isaac ierr = (*field->ops->getFEInvariance) (field,cellIS,isConstant,isAffine,isQuadratic);CHKERRQ(ierr); 254*3da551e6SToby Isaac } 255*3da551e6SToby Isaac PetscFunctionReturn(0); 256*3da551e6SToby Isaac } 257*3da551e6SToby Isaac 258*3da551e6SToby Isaac PetscErrorCode DMFieldCreateDefaultQuadrature(DMField field, IS pointIS, PetscQuadrature *quad) 259*3da551e6SToby Isaac { 260*3da551e6SToby Isaac PetscErrorCode ierr; 261*3da551e6SToby Isaac 262*3da551e6SToby Isaac PetscFunctionBegin; 263*3da551e6SToby Isaac PetscValidHeaderSpecific(field,DMFIELD_CLASSID,1); 264*3da551e6SToby Isaac PetscValidHeaderSpecific(pointIS,IS_CLASSID,2); 265*3da551e6SToby Isaac PetscValidPointer(quad,3); 266*3da551e6SToby Isaac 267*3da551e6SToby Isaac *quad = NULL; 268*3da551e6SToby Isaac if (field->ops->createDefaultQuadrature) { 269*3da551e6SToby Isaac ierr = (*field->ops->createDefaultQuadrature)(field, pointIS, quad);CHKERRQ(ierr); 270*3da551e6SToby Isaac } 271*3da551e6SToby Isaac PetscFunctionReturn(0); 272*3da551e6SToby Isaac } 273*3da551e6SToby Isaac 274