28 PetscReal diffusivity,
33 PetscFunctionBeginUser;
35 if (strcmp(fieldName,
"Psi") == 0) {
41 if (cell_vol < 1.0e-14) cell_vol = 1.0e-14;
43 PetscReal delta2 = PetscPowReal(cell_vol, 0.6666667);
47 PetscReal omega = C_model * diffusivity / delta2;
51 PetscReal decay = PetscExpReal(-omega * dt);
54 PetscReal psi_old = *psi_io;
55 *psi_io = mean_val + (psi_old - mean_val) * decay;
62 PetscFunctionReturn(0);
79 DM swarm = user->
swarm;
85 PetscReal C_IEM = 2.0;
88 PetscReal *psi_arr = NULL;
89 PetscReal *diff_arr = NULL;
90 PetscInt *cell_arr = NULL;
93 PetscReal ***grid_mean = NULL;
94 PetscReal ***grid_aj = NULL;
97 PetscBool accessed_eulerian = PETSC_FALSE;
99 PetscFunctionBeginUser;
102 ierr = DMSwarmGetLocalSize(swarm, &n_local); CHKERRQ(ierr);
104 PetscFunctionReturn(0);
108 ierr = DMSwarmGetField(swarm, fieldName, NULL, NULL, (
void**)&psi_arr); CHKERRQ(ierr);
112 if (strcmp(fieldName,
"Psi") == 0) {
115 ierr = DMSwarmGetField(swarm,
"Diffusivity", NULL, NULL, (
void**)&diff_arr); CHKERRQ(ierr);
116 ierr = DMSwarmGetField(swarm,
"DMSwarm_CellID", NULL, NULL, (
void**)&cell_arr); CHKERRQ(ierr);
120 if (!user->
lPsi || !user->
lAj) {
121 SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE,
"UserCtx lPsi or lAj not initialized.");
124 ierr = DMDAVecGetArrayRead(da, user->
lPsi, &grid_mean); CHKERRQ(ierr);
125 ierr = DMDAVecGetArrayRead(da, user->
lAj, &grid_aj); CHKERRQ(ierr);
126 accessed_eulerian = PETSC_TRUE;
130 for (PetscInt p = 0; p < n_local; ++p) {
133 PetscReal p_diff = 0.0;
134 PetscReal p_mean = 0.0;
135 PetscReal p_vol = 1.0;
137 if (strcmp(fieldName,
"Psi") == 0) {
139 PetscInt i = cell_arr[3*p + 0];
140 PetscInt j = cell_arr[3*p + 1];
141 PetscInt k = cell_arr[3*p + 2];
144 p_diff = diff_arr[p];
145 p_mean = grid_mean[k][j][i];
148 PetscReal jac = grid_aj[k][j][i];
149 p_vol = (jac > 1.0e-14) ? (1.0 / jac) : 1.0e-14;
158 ierr = DMSwarmRestoreField(swarm, fieldName, NULL, NULL, (
void**)&psi_arr); CHKERRQ(ierr);
160 if (strcmp(fieldName,
"Psi") == 0) {
161 ierr = DMSwarmRestoreField(swarm,
"Diffusivity", NULL, NULL, (
void**)&diff_arr); CHKERRQ(ierr);
162 ierr = DMSwarmRestoreField(swarm,
"DMSwarm_CellID", NULL, NULL, (
void**)&cell_arr); CHKERRQ(ierr);
165 if (accessed_eulerian) {
166 ierr = DMDAVecRestoreArrayRead(da, user->
lPsi, &grid_mean); CHKERRQ(ierr);
167 ierr = DMDAVecRestoreArrayRead(da, user->
lAj, &grid_aj); CHKERRQ(ierr);
173 PetscFunctionReturn(0);
PetscErrorCode UpdateParticleField(const char *fieldName, PetscReal dt, PetscReal *psi_io, PetscReal diffusivity, PetscReal mean_val, PetscReal cell_vol, PetscReal C_model)
Updates a single particle's field based on its state and physics model.
PetscErrorCode UpdateFieldForAllParticles(UserCtx *user, const char *fieldName)
Loops over all local particles and updates a specified field.
PetscErrorCode UpdateAllParticleFields(UserCtx *user)
Orchestrates the update of all physical properties for particles.
Header file for Particle related physics modules.