PICurv 0.1.0
A Parallel Particle-In-Cell Solver for Curvilinear LES
 
Loading...
Searching...
No Matches
Data Structures | Enumerations | Functions
particle_field_catalog.h File Reference

Typed identities and metadata for persistent solver-particle fields. More...

#include <petscdmswarm.h>
#include "field_catalog.h"
Include dependency graph for particle_field_catalog.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Data Structures

struct  ParticleFieldDescriptor
 Immutable metadata for one persistent particle field. More...
 

Enumerations

enum  ParticleFieldId {
  PARTICLE_FIELD_ID_INVALID = -1 , PARTICLE_FIELD_ID_POSITION = 0 , PARTICLE_FIELD_ID_VELOCITY , PARTICLE_FIELD_ID_CELL_ID ,
  PARTICLE_FIELD_ID_WEIGHT , PARTICLE_FIELD_ID_DIFFUSIVITY , PARTICLE_FIELD_ID_DIFFUSIVITY_GRADIENT , PARTICLE_FIELD_ID_PSI ,
  PARTICLE_FIELD_ID_LOCATION_STATUS , PARTICLE_FIELD_ID_PID , PARTICLE_FIELD_ID_RANK , PARTICLE_FIELD_ID_COUNT
}
 Compile-time identity for a persistent solver-particle field. More...
 
enum  ParticleFieldRegistration { PARTICLE_FIELD_REGISTRATION_PICURV = 0 , PARTICLE_FIELD_REGISTRATION_PETSC }
 Owner of a field's DMSwarm registration. More...
 
enum  ParticleFieldCapabilities {
  PARTICLE_FIELD_CAPABILITY_NONE = 0u , PARTICLE_FIELD_CAPABILITY_DEFAULT_INITIALIZE = 1u << 0 , PARTICLE_FIELD_CAPABILITY_MODEL_UPDATE = 1u << 1 , PARTICLE_FIELD_CAPABILITY_EULERIAN_SCATTER = 1u << 2 ,
  PARTICLE_FIELD_CAPABILITY_CHECKPOINT = 1u << 3 , PARTICLE_FIELD_CAPABILITY_USER_INITIALIZE = 1u << 4
}
 Operations supported by a particle-field catalog entry. More...
 

Functions

PetscErrorCode ParticleFieldGetDescriptor (ParticleFieldId field_id, const ParticleFieldDescriptor **descriptor)
 Return immutable metadata for a valid particle field ID.
 
PetscErrorCode ParticleFieldIdFromName (const char *field_name, ParticleFieldId *field_id)
 Resolve a canonical name or registered alias at a text-ingress boundary.
 
PetscErrorCode ParticleFieldTryIdFromName (const char *field_name, ParticleFieldId *field_id, PetscBool *found)
 Look a name up without treating an unknown name as an error.
 
PetscErrorCode ParticleFieldIdFromScatterTarget (FieldId target, ParticleFieldId *field_id)
 Find the particle field that scatters to an Eulerian field.
 
const char * ParticleFieldName (ParticleFieldId field_id)
 Return the canonical PETSc DMSwarm name for an ID.
 

Detailed Description

Typed identities and metadata for persistent solver-particle fields.

Particle fields intentionally use a catalog separate from Eulerian fields. They are registered on a DMSwarm, may use integer storage, and do not own a global/local Vec pair in UserCtx. Text is translated only where PETSc or a user/file interface requires a registered DMSwarm name.

Definition in file particle_field_catalog.h.


Data Structure Documentation

◆ ParticleFieldDescriptor

struct ParticleFieldDescriptor

Immutable metadata for one persistent particle field.

Definition at line 57 of file particle_field_catalog.h.

Collaboration diagram for ParticleFieldDescriptor:
[legend]
Data Fields
ParticleFieldId id
const char * canonical_name
const char * alias_1
const char * alias_2
PetscInt components
PetscDataType data_type
ParticleFieldRegistration registration
unsigned int capabilities
PetscReal default_real_value
FieldId eulerian_scatter_target
FieldDimension dimension

Enumeration Type Documentation

◆ ParticleFieldId

Compile-time identity for a persistent solver-particle field.

Enumerator
PARTICLE_FIELD_ID_INVALID 
PARTICLE_FIELD_ID_POSITION 
PARTICLE_FIELD_ID_VELOCITY 
PARTICLE_FIELD_ID_CELL_ID 
PARTICLE_FIELD_ID_WEIGHT 
PARTICLE_FIELD_ID_DIFFUSIVITY 
PARTICLE_FIELD_ID_DIFFUSIVITY_GRADIENT 
PARTICLE_FIELD_ID_PSI 
PARTICLE_FIELD_ID_LOCATION_STATUS 
PARTICLE_FIELD_ID_PID 
PARTICLE_FIELD_ID_RANK 
PARTICLE_FIELD_ID_COUNT 

Definition at line 23 of file particle_field_catalog.h.

23 {
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

◆ ParticleFieldRegistration

Owner of a field's DMSwarm registration.

Enumerator
PARTICLE_FIELD_REGISTRATION_PICURV 
PARTICLE_FIELD_REGISTRATION_PETSC 

Definition at line 39 of file particle_field_catalog.h.

39 {
ParticleFieldRegistration
Owner of a field's DMSwarm registration.
@ PARTICLE_FIELD_REGISTRATION_PETSC
@ PARTICLE_FIELD_REGISTRATION_PICURV

◆ ParticleFieldCapabilities

Operations supported by a particle-field catalog entry.

Enumerator
PARTICLE_FIELD_CAPABILITY_NONE 
PARTICLE_FIELD_CAPABILITY_DEFAULT_INITIALIZE 
PARTICLE_FIELD_CAPABILITY_MODEL_UPDATE 
PARTICLE_FIELD_CAPABILITY_EULERIAN_SCATTER 
PARTICLE_FIELD_CAPABILITY_CHECKPOINT 
PARTICLE_FIELD_CAPABILITY_USER_INITIALIZE 

The particle carries the value, so a configured initial value survives: nothing re-derives it from the Eulerian fields or from particle location.

Definition at line 45 of file particle_field_catalog.h.

45 {
51 /** The particle carries the value, so a configured initial value survives: nothing
52 re-derives it from the Eulerian fields or from particle location. */
ParticleFieldCapabilities
Operations supported by a particle-field catalog entry.
@ PARTICLE_FIELD_CAPABILITY_MODEL_UPDATE
@ PARTICLE_FIELD_CAPABILITY_USER_INITIALIZE
The particle carries the value, so a configured initial value survives: nothing re-derives it from th...
@ PARTICLE_FIELD_CAPABILITY_DEFAULT_INITIALIZE
@ PARTICLE_FIELD_CAPABILITY_CHECKPOINT
@ PARTICLE_FIELD_CAPABILITY_EULERIAN_SCATTER
@ PARTICLE_FIELD_CAPABILITY_NONE

Function Documentation

◆ ParticleFieldGetDescriptor()

PetscErrorCode ParticleFieldGetDescriptor ( ParticleFieldId  field_id,
const ParticleFieldDescriptor **  descriptor 
)

Return immutable metadata for a valid particle field ID.

Parameters
[in]field_idTyped particle-field identity.
[out]descriptorCatalog-owned immutable descriptor.
Returns
Zero on success; a PETSc argument error for invalid input.

Return immutable metadata for a valid particle field ID.

See also
ParticleFieldGetDescriptor()

Definition at line 72 of file particle_field_catalog.c.

74{
75 PetscFunctionBeginUser;
77 PetscCheck(descriptor != NULL, PETSC_COMM_SELF, PETSC_ERR_ARG_NULL,
78 "Particle field descriptor output cannot be NULL.");
79 PetscCheck(field_id >= 0 && field_id < PARTICLE_FIELD_ID_COUNT,
80 PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE,
81 "Invalid ParticleFieldId value %d.", (int)field_id);
82 PetscCheck(gParticleFieldCatalog[field_id].id == field_id,
83 PETSC_COMM_SELF, PETSC_ERR_PLIB,
84 "Particle field catalog entry %d is not initialized consistently.", (int)field_id);
85
86 *descriptor = &gParticleFieldCatalog[field_id];
88 PetscFunctionReturn(0);
89}
#define PROFILE_FUNCTION_END
Marks the end of a profiled code block.
Definition logging.h:1029
#define PROFILE_FUNCTION_BEGIN
Marks the beginning of a profiled function: an always-on aggregate timer.
Definition logging.h:1000
static const ParticleFieldDescriptor gParticleFieldCatalog[PARTICLE_FIELD_ID_COUNT]
Here is the caller graph for this function:

◆ ParticleFieldIdFromName()

PetscErrorCode ParticleFieldIdFromName ( const char *  field_name,
ParticleFieldId *  field_id 
)

Resolve a canonical name or registered alias at a text-ingress boundary.

Parameters
[in]field_nameCanonical particle name or registered alias.
[out]field_idResolved typed identity.
Returns
Zero on success; PETSC_ERR_ARG_UNKNOWN_TYPE for unknown text.

Resolve a canonical name or registered alias at a text-ingress boundary.

See also
ParticleFieldIdFromName()

Definition at line 118 of file particle_field_catalog.c.

119{
120 PetscBool found = PETSC_FALSE;
121
122 PetscFunctionBeginUser;
124 PetscCall(ParticleFieldTryIdFromName(field_name, field_id, &found));
125 PetscCheck(found, PETSC_COMM_SELF, PETSC_ERR_ARG_UNKNOWN_TYPE,
126 "Particle field name '%s' is not registered in the persistent particle field catalog.",
127 field_name);
129 PetscFunctionReturn(0);
130}
PetscErrorCode ParticleFieldTryIdFromName(const char *field_name, ParticleFieldId *field_id, PetscBool *found)
Searches canonical names and aliases, reporting a miss instead of failing.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ ParticleFieldTryIdFromName()

PetscErrorCode ParticleFieldTryIdFromName ( const char *  field_name,
ParticleFieldId *  field_id,
PetscBool *  found 
)

Look a name up without treating an unknown name as an error.

Parameters
[in]field_nameCanonical particle name or registered alias.
[out]field_idResolved identity, or PARTICLE_FIELD_ID_INVALID when not found.
[out]foundWhether the name is registered.
Returns
Zero on success; PETSc error only for null arguments.

Look a name up without treating an unknown name as an error.

See also
ParticleFieldTryIdFromName()

Definition at line 136 of file particle_field_catalog.c.

138{
139 PetscFunctionBeginUser;
141 PetscCheck(field_name != NULL, PETSC_COMM_SELF, PETSC_ERR_ARG_NULL,
142 "Particle field name cannot be NULL.");
143 PetscCheck(field_id != NULL && found != NULL, PETSC_COMM_SELF, PETSC_ERR_ARG_NULL,
144 "ParticleFieldId and found outputs cannot be NULL.");
145
146 *field_id = PARTICLE_FIELD_ID_INVALID;
147 *found = PETSC_FALSE;
148 for (PetscInt index = 0; index < PARTICLE_FIELD_ID_COUNT; ++index) {
149 const ParticleFieldDescriptor *descriptor = &gParticleFieldCatalog[index];
150 PetscBool match = PETSC_FALSE;
151
152 PetscCall(PetscStrcasecmp(field_name, descriptor->canonical_name, &match));
153 if (!match && descriptor->alias_1) PetscCall(PetscStrcasecmp(field_name, descriptor->alias_1, &match));
154 if (!match && descriptor->alias_2) PetscCall(PetscStrcasecmp(field_name, descriptor->alias_2, &match));
155 if (match) {
156 *field_id = descriptor->id;
157 *found = PETSC_TRUE;
158 break;
159 }
160 }
162 PetscFunctionReturn(0);
163}
Immutable metadata for one persistent particle field.
Here is the caller graph for this function:

◆ ParticleFieldIdFromScatterTarget()

PetscErrorCode ParticleFieldIdFromScatterTarget ( FieldId  target,
ParticleFieldId *  field_id 
)

Find the particle field that scatters to an Eulerian field.

Parameters
[in]targetEulerian field identity.
[out]field_idThe particle field whose scatter target is target.
Returns
Zero on success; PETSC_ERR_ARG_WRONG when no particle field scatters there.

Find the particle field that scatters to an Eulerian field.

See also
ParticleFieldIdFromScatterTarget()

Definition at line 95 of file particle_field_catalog.c.

96{
97 PetscFunctionBeginUser;
99 PetscCheck(field_id != NULL, PETSC_COMM_SELF, PETSC_ERR_ARG_NULL,
100 "ParticleFieldId output cannot be NULL.");
101 for (PetscInt index = 0; index < PARTICLE_FIELD_ID_COUNT; ++index) {
103 gParticleFieldCatalog[index].eulerian_scatter_target == target) {
104 *field_id = (ParticleFieldId)index;
106 PetscFunctionReturn(0);
107 }
108 }
109 SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG,
110 "No particle field scatters to Eulerian field '%s'.", FieldCanonicalName(target));
112}
const char * FieldCanonicalName(FieldId field_id)
Return the canonical printable name for an ID.
#define PROFILE_HELPER_BEGIN
Marks the beginning of a profiled helper: timed only when enabled by name.
Definition logging.h:1014
#define PROFILE_HELPER_END
Alias of PROFILE_FUNCTION_END for a function that began with PROFILE_HELPER_BEGIN.
Definition logging.h:1033
Here is the call graph for this function:
Here is the caller graph for this function:

◆ ParticleFieldName()

const char * ParticleFieldName ( ParticleFieldId  field_id)

Return the canonical PETSc DMSwarm name for an ID.

Parameters
[in]field_idTyped particle-field identity.
Returns
Catalog-owned canonical name or InvalidParticleField.

Return the canonical PETSc DMSwarm name for an ID.

See also
ParticleFieldName()

Definition at line 169 of file particle_field_catalog.c.

170{
172 if (field_id < 0 || field_id >= PARTICLE_FIELD_ID_COUNT) { PROFILE_HELPER_END; return "InvalidParticleField"; }
173 if (gParticleFieldCatalog[field_id].id != field_id) { PROFILE_HELPER_END; return "InvalidParticleField"; }
175 return gParticleFieldCatalog[field_id].canonical_name;
176}
Here is the caller graph for this function: