8#define FIELD_NO_VEC_OFFSET ((size_t)-1)
10#define FIELD_ENTRY(field_id_, name_, alias1_, alias2_, dof_, dm_, layout_, sync_, availability_, capabilities_, global_member_, local_member_) \
12 field_id_, name_, alias1_, alias2_, dof_, dm_, layout_, sync_, availability_, capabilities_, \
13 offsetof(UserCtx, global_member_), offsetof(UserCtx, local_member_) \
16#define FIELD_COORDINATE_ENTRY(field_id_, name_, dof_, layout_, capabilities_) \
18 field_id_, name_, NULL, NULL, dof_, FIELD_DM_COORDINATES, layout_, \
19 FIELD_SYNC_STANDARD, FIELD_AVAILABILITY_ALWAYS, capabilities_, \
20 FIELD_NO_VEC_OFFSET, FIELD_NO_VEC_OFFSET \
192 "Field catalog must contain one entry per FieldId.");
202 PetscFunctionBeginUser;
203 PetscCheck(descriptor != NULL, PETSC_COMM_SELF, PETSC_ERR_ARG_NULL,
204 "Field descriptor output cannot be NULL.");
205 PetscCheck(field_id >= 0 && field_id <
FIELD_ID_COUNT, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE,
206 "Invalid FieldId value %d.", (
int)field_id);
207 PetscCheck(
gFieldCatalog[field_id].
id == field_id, PETSC_COMM_SELF, PETSC_ERR_PLIB,
208 "Field catalog entry %d is not initialized consistently.", (
int)field_id);
211 PetscFunctionReturn(0);
222 PetscFunctionBeginUser;
223 PetscCheck(field_name != NULL, PETSC_COMM_SELF, PETSC_ERR_ARG_NULL,
224 "Field name cannot be NULL.");
225 PetscCheck(field_id != NULL, PETSC_COMM_SELF, PETSC_ERR_ARG_NULL,
226 "FieldId output cannot be NULL.");
230 PetscBool match = PETSC_FALSE;
232 PetscCall(PetscStrcasecmp(field_name, descriptor->
canonical_name, &match));
233 if (!match && descriptor->
alias_1) PetscCall(PetscStrcasecmp(field_name, descriptor->
alias_1, &match));
234 if (!match && descriptor->
alias_2) PetscCall(PetscStrcasecmp(field_name, descriptor->
alias_2, &match));
236 *field_id = descriptor->
id;
237 PetscFunctionReturn(0);
242 SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_UNKNOWN_TYPE,
243 "Field name '%s' is not registered in the Eulerian field catalog.", field_name);
253 if (field_id < 0 || field_id >=
FIELD_ID_COUNT)
return "InvalidField";
254 if (
gFieldCatalog[field_id].
id != field_id)
return "InvalidField";
271 default:
return "Invalid-Layout";
285 PetscFunctionBeginUser;
286 PetscCheck(user != NULL, PETSC_COMM_SELF, PETSC_ERR_ARG_NULL,
287 "UserCtx cannot be NULL when resolving a field view.");
288 PetscCheck(view != NULL, PETSC_COMM_SELF, PETSC_ERR_ARG_NULL,
289 "Field view output cannot be NULL.");
302 view->
dm = user->
fda;
305 view->
dm = user->
fda;
306 PetscCheck(user->
da != NULL, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE,
307 "Coordinate DM is unavailable for field '%s'.", descriptor->
canonical_name);
308 PetscCall(DMGetCoordinates(user->
da, &view->
global_vec));
309 PetscCall(DMGetCoordinatesLocal(user->
da, &view->
local_vec));
312 SETERRQ(PETSC_COMM_SELF, PETSC_ERR_PLIB,
313 "Field '%s' has an invalid DM selector.", descriptor->
canonical_name);
321 PetscCheck(view->
dm != NULL, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE,
322 "DM for field '%s' is unavailable in this UserCtx.", descriptor->
canonical_name);
323 PetscCheck(view->
global_vec != NULL, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE,
324 "Global vector for field '%s' is unavailable in this UserCtx.", descriptor->
canonical_name);
325 PetscCheck(view->
local_vec != NULL, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE,
326 "Local vector for field '%s' is unavailable in this UserCtx.", descriptor->
canonical_name);
328 PetscFunctionReturn(0);
331#undef FIELD_COORDINATE_ENTRY
333#undef FIELD_NO_VEC_OFFSET
PetscErrorCode FieldIdFromName(const char *field_name, FieldId *field_id)
Resolves a canonical field name or registered alias to a typed identity.
#define FIELD_ENTRY(field_id_, name_, alias1_, alias2_, dof_, dm_, layout_, sync_, availability_, capabilities_, global_member_, local_member_)
static const FieldDescriptor gFieldCatalog[FIELD_ID_COUNT]
const char * FieldCanonicalName(FieldId field_id)
Returns catalog-owned printable text for a field identity.
PetscErrorCode FieldGetView(UserCtx *user, FieldId field_id, FieldView *view)
Binds one descriptor to the PETSc objects already owned by a UserCtx.
const char * FieldLayoutName(FieldLayout layout)
Converts layout metadata to the stable diagnostic label used by field loggers.
#define FIELD_COORDINATE_ENTRY(field_id_, name_, dof_, layout_, capabilities_)
PetscErrorCode FieldGetDescriptor(FieldId field_id, const FieldDescriptor **descriptor)
Returns the immutable catalog descriptor for one typed field identity.
Authoritative identities and storage metadata for persistent Eulerian fields.
@ FIELD_CAPABILITY_CHECKPOINT
@ FIELD_CAPABILITY_GHOST_UPDATE
@ FIELD_CAPABILITY_PERIODIC_GEOMETRY_SHIFT
@ FIELD_CAPABILITY_PERIODIC_CELL_SYNC
@ FIELD_CAPABILITY_PERIODIC_FACE_SYNC
@ FIELD_CAPABILITY_PERIODIC_STAGGERED_SYNC
@ FIELD_AVAILABILITY_WALL_MODEL
@ FIELD_AVAILABILITY_FINEST_LEVEL
@ FIELD_AVAILABILITY_PARTICLES
@ FIELD_AVAILABILITY_TURBULENCE
@ FIELD_AVAILABILITY_LES_DYNAMIC
@ FIELD_AVAILABILITY_ALWAYS
@ FIELD_SYNC_COMPONENT_STAGGERED
const FieldDescriptor * descriptor
FieldLayout
Logical storage topology of a field.
@ FIELD_LAYOUT_CELL_CENTERED
@ FIELD_LAYOUT_COMPONENT_STAGGERED
@ FIELD_LAYOUT_NODE_CENTERED
const char * canonical_name
FieldId
Compile-time identity for a catalogued Eulerian field.
@ FIELD_ID_CELL_SCALAR_AT_CORNER
@ FIELD_ID_CELL_VECTOR_AT_CORNER
@ FIELD_ID_DIFFUSIVITY_GRADIENT
@ FIELD_ID_PARTICLE_COUNT
Immutable metadata for one field identity.
Non-owning runtime objects resolved for one field and UserCtx.
User-defined context containing data specific to a single computational grid level.