PICurv 0.1.0
A Parallel Particle-In-Cell Solver for Curvilinear LES
Loading...
Searching...
No Matches
particle_field_catalog.c
Go to the documentation of this file.
1/**
2 * @file particle_field_catalog.c
3 * @brief Persistent solver-particle-field catalog implementation.
4 */
5
7
8#define PARTICLE_FIELD_ENTRY(field_id_, name_, alias1_, alias2_, components_, type_, registration_, capabilities_, default_, scatter_target_) \
9 [field_id_] = { \
10 field_id_, name_, alias1_, alias2_, components_, type_, registration_, capabilities_, default_, scatter_target_ \
11 }
12
14 PARTICLE_FIELD_ENTRY(PARTICLE_FIELD_ID_POSITION, "position", "ParticlePosition", NULL,
17 PARTICLE_FIELD_ENTRY(PARTICLE_FIELD_ID_VELOCITY, "velocity", "ParticleVelocity", NULL,
20 PARTICLE_FIELD_ENTRY(PARTICLE_FIELD_ID_CELL_ID, "DMSwarm_CellID", "CellID", NULL,
23 PARTICLE_FIELD_ENTRY(PARTICLE_FIELD_ID_WEIGHT, "weight", "ParticleWeight", NULL,
26 PARTICLE_FIELD_ENTRY(PARTICLE_FIELD_ID_DIFFUSIVITY, "Diffusivity", NULL, NULL,
29 PARTICLE_FIELD_ENTRY(PARTICLE_FIELD_ID_DIFFUSIVITY_GRADIENT, "DiffusivityGradient", NULL, NULL,
37 0.0, FIELD_ID_PSI),
38 PARTICLE_FIELD_ENTRY(PARTICLE_FIELD_ID_LOCATION_STATUS, "DMSwarm_location_status", "Migration Status", NULL,
41 PARTICLE_FIELD_ENTRY(PARTICLE_FIELD_ID_PID, "DMSwarm_pid", "pid", "Particle ID",
44 PARTICLE_FIELD_ENTRY(PARTICLE_FIELD_ID_RANK, "DMSwarm_rank", "rank", NULL,
47};
48
49_Static_assert(sizeof(gParticleFieldCatalog) / sizeof(gParticleFieldCatalog[0]) == PARTICLE_FIELD_ID_COUNT,
50 "Particle field catalog must contain one entry per ParticleFieldId.");
51
52/**
53 * @brief Validates and returns one immutable particle-field descriptor.
54 * @see ParticleFieldGetDescriptor()
55 */
57 const ParticleFieldDescriptor **descriptor)
58{
59 PetscFunctionBeginUser;
60 PetscCheck(descriptor != NULL, PETSC_COMM_SELF, PETSC_ERR_ARG_NULL,
61 "Particle field descriptor output cannot be NULL.");
62 PetscCheck(field_id >= 0 && field_id < PARTICLE_FIELD_ID_COUNT,
63 PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE,
64 "Invalid ParticleFieldId value %d.", (int)field_id);
65 PetscCheck(gParticleFieldCatalog[field_id].id == field_id,
66 PETSC_COMM_SELF, PETSC_ERR_PLIB,
67 "Particle field catalog entry %d is not initialized consistently.", (int)field_id);
68
69 *descriptor = &gParticleFieldCatalog[field_id];
70 PetscFunctionReturn(0);
71}
72
73/**
74 * @brief Resolves particle field text once by searching canonical names and aliases.
75 * @see ParticleFieldIdFromName()
76 */
77PetscErrorCode ParticleFieldIdFromName(const char *field_name, ParticleFieldId *field_id)
78{
79 PetscFunctionBeginUser;
80 PetscCheck(field_name != NULL, PETSC_COMM_SELF, PETSC_ERR_ARG_NULL,
81 "Particle field name cannot be NULL.");
82 PetscCheck(field_id != NULL, PETSC_COMM_SELF, PETSC_ERR_ARG_NULL,
83 "ParticleFieldId output cannot be NULL.");
84
85 for (PetscInt index = 0; index < PARTICLE_FIELD_ID_COUNT; ++index) {
86 const ParticleFieldDescriptor *descriptor = &gParticleFieldCatalog[index];
87 PetscBool match = PETSC_FALSE;
88
89 PetscCall(PetscStrcasecmp(field_name, descriptor->canonical_name, &match));
90 if (!match && descriptor->alias_1) PetscCall(PetscStrcasecmp(field_name, descriptor->alias_1, &match));
91 if (!match && descriptor->alias_2) PetscCall(PetscStrcasecmp(field_name, descriptor->alias_2, &match));
92 if (match) {
93 *field_id = descriptor->id;
94 PetscFunctionReturn(0);
95 }
96 }
97
98 *field_id = PARTICLE_FIELD_ID_INVALID;
99 SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_UNKNOWN_TYPE,
100 "Particle field name '%s' is not registered in the persistent particle field catalog.",
101 field_name);
102}
103
104/**
105 * @brief Returns the canonical PETSc name without performing name lookup.
106 * @see ParticleFieldName()
107 */
109{
110 if (field_id < 0 || field_id >= PARTICLE_FIELD_ID_COUNT) return "InvalidParticleField";
111 if (gParticleFieldCatalog[field_id].id != field_id) return "InvalidParticleField";
112 return gParticleFieldCatalog[field_id].canonical_name;
113}
114
115#undef PARTICLE_FIELD_ENTRY
@ FIELD_ID_PSI
@ FIELD_ID_INVALID
const char * ParticleFieldName(ParticleFieldId field_id)
Returns the canonical PETSc name without performing name lookup.
PetscErrorCode ParticleFieldIdFromName(const char *field_name, ParticleFieldId *field_id)
Resolves particle field text once by searching canonical names and aliases.
static const ParticleFieldDescriptor gParticleFieldCatalog[PARTICLE_FIELD_ID_COUNT]
PetscErrorCode ParticleFieldGetDescriptor(ParticleFieldId field_id, const ParticleFieldDescriptor **descriptor)
Validates and returns one immutable particle-field descriptor.
#define PARTICLE_FIELD_ENTRY(field_id_, name_, alias1_, alias2_, components_, type_, registration_, capabilities_, default_, scatter_target_)
Typed identities and metadata for persistent solver-particle fields.
ParticleFieldId
Compile-time identity for a persistent solver-particle field.
@ PARTICLE_FIELD_ID_LOCATION_STATUS
@ PARTICLE_FIELD_ID_WEIGHT
@ PARTICLE_FIELD_ID_POSITION
@ PARTICLE_FIELD_ID_PID
@ PARTICLE_FIELD_ID_CELL_ID
@ PARTICLE_FIELD_ID_PSI
@ PARTICLE_FIELD_ID_RANK
@ PARTICLE_FIELD_ID_DIFFUSIVITY_GRADIENT
@ PARTICLE_FIELD_ID_COUNT
@ PARTICLE_FIELD_ID_DIFFUSIVITY
@ PARTICLE_FIELD_ID_INVALID
@ PARTICLE_FIELD_ID_VELOCITY
@ PARTICLE_FIELD_CAPABILITY_MODEL_UPDATE
@ PARTICLE_FIELD_CAPABILITY_DEFAULT_INITIALIZE
@ PARTICLE_FIELD_CAPABILITY_EULERIAN_SCATTER
@ PARTICLE_FIELD_CAPABILITY_NONE
@ PARTICLE_FIELD_REGISTRATION_PETSC
@ PARTICLE_FIELD_REGISTRATION_PICURV
Immutable metadata for one persistent particle field.