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 \
141 "Field catalog must contain one entry per FieldId.");
151 PetscFunctionBeginUser;
152 PetscCheck(descriptor != NULL, PETSC_COMM_SELF, PETSC_ERR_ARG_NULL,
153 "Field descriptor output cannot be NULL.");
154 PetscCheck(field_id >= 0 && field_id <
FIELD_ID_COUNT, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE,
155 "Invalid FieldId value %d.", (
int)field_id);
156 PetscCheck(
gFieldCatalog[field_id].
id == field_id, PETSC_COMM_SELF, PETSC_ERR_PLIB,
157 "Field catalog entry %d is not initialized consistently.", (
int)field_id);
160 PetscFunctionReturn(0);
171 PetscFunctionBeginUser;
172 PetscCheck(field_name != NULL, PETSC_COMM_SELF, PETSC_ERR_ARG_NULL,
173 "Field name cannot be NULL.");
174 PetscCheck(field_id != NULL, PETSC_COMM_SELF, PETSC_ERR_ARG_NULL,
175 "FieldId output cannot be NULL.");
179 PetscBool match = PETSC_FALSE;
181 PetscCall(PetscStrcasecmp(field_name, descriptor->
canonical_name, &match));
182 if (!match && descriptor->
alias_1) PetscCall(PetscStrcasecmp(field_name, descriptor->
alias_1, &match));
183 if (!match && descriptor->
alias_2) PetscCall(PetscStrcasecmp(field_name, descriptor->
alias_2, &match));
185 *field_id = descriptor->
id;
186 PetscFunctionReturn(0);
191 SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_UNKNOWN_TYPE,
192 "Field name '%s' is not registered in the Eulerian field catalog.", field_name);
202 if (field_id < 0 || field_id >=
FIELD_ID_COUNT)
return "InvalidField";
203 if (
gFieldCatalog[field_id].
id != field_id)
return "InvalidField";
220 default:
return "Invalid-Layout";
234 PetscFunctionBeginUser;
235 PetscCheck(user != NULL, PETSC_COMM_SELF, PETSC_ERR_ARG_NULL,
236 "UserCtx cannot be NULL when resolving a field view.");
237 PetscCheck(view != NULL, PETSC_COMM_SELF, PETSC_ERR_ARG_NULL,
238 "Field view output cannot be NULL.");
251 view->
dm = user->
fda;
257 view->
dm = user->
fda;
258 PetscCheck(user->
da != NULL, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE,
259 "Coordinate DM is unavailable for field '%s'.", descriptor->
canonical_name);
260 PetscCall(DMGetCoordinates(user->
da, &view->
global_vec));
261 PetscCall(DMGetCoordinatesLocal(user->
da, &view->
local_vec));
264 SETERRQ(PETSC_COMM_SELF, PETSC_ERR_PLIB,
265 "Field '%s' has an invalid DM selector.", descriptor->
canonical_name);
273 PetscCheck(view->
dm != NULL, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE,
274 "DM for field '%s' is unavailable in this UserCtx.", descriptor->
canonical_name);
275 PetscCheck(view->
global_vec != NULL, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE,
276 "Global vector for field '%s' is unavailable in this UserCtx.", descriptor->
canonical_name);
277 PetscCheck(view->
local_vec != NULL, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE,
278 "Local vector for field '%s' is unavailable in this UserCtx.", descriptor->
canonical_name);
280 PetscFunctionReturn(0);
283#undef FIELD_COORDINATE_ENTRY
285#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_GHOST_UPDATE
@ FIELD_CAPABILITY_PERIODIC_GEOMETRY_SHIFT
@ FIELD_CAPABILITY_PERIODIC_CELL_SYNC
@ FIELD_CAPABILITY_PERIODIC_FACE_SYNC
@ FIELD_CAPABILITY_PERIODIC_STAGGERED_SYNC
@ FIELD_AVAILABILITY_RANS
@ FIELD_AVAILABILITY_FINEST_LEVEL
@ FIELD_AVAILABILITY_PARTICLES
@ FIELD_AVAILABILITY_TURBULENCE
@ 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_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.