17 PetscReal diffusivity,
22 PetscFunctionBeginUser;
24 if (strcmp(fieldName,
"Psi") == 0) {
25 if (cell_vol < 1.0e-14) cell_vol = 1.0e-14;
27 PetscReal delta2 = PetscPowReal(cell_vol, 0.6666667);
28 PetscReal omega = C_model * diffusivity / delta2;
29 PetscReal decay = PetscExpReal(-omega * dt);
31 PetscReal psi_old = *psi_io;
32 *psi_io = mean_val + (psi_old - mean_val) * decay;
35 PetscFunctionReturn(0);
47 DM swarm = user->
swarm;
51 PetscReal C_IEM = 2.0;
53 PetscReal *psi_arr = NULL;
54 PetscReal *diff_arr = NULL;
55 PetscInt *cell_arr = NULL;
57 PetscReal ***grid_mean = NULL;
58 PetscReal ***grid_aj = NULL;
60 PetscBool accessed_eulerian = PETSC_FALSE;
62 PetscFunctionBeginUser;
65 ierr = DMSwarmGetLocalSize(swarm, &n_local); CHKERRQ(ierr);
67 PetscFunctionReturn(0);
70 ierr = DMSwarmGetField(swarm, fieldName, NULL, NULL, (
void**)&psi_arr); CHKERRQ(ierr);
72 if (strcmp(fieldName,
"Psi") == 0) {
73 ierr = DMSwarmGetField(swarm,
"Diffusivity", NULL, NULL, (
void**)&diff_arr); CHKERRQ(ierr);
74 ierr = DMSwarmGetField(swarm,
"DMSwarm_CellID", NULL, NULL, (
void**)&cell_arr); CHKERRQ(ierr);
76 if (!user->
lPsi || !user->
lAj) {
77 SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE,
"UserCtx lPsi or lAj not initialized.");
80 ierr = DMDAVecGetArrayRead(da, user->
lPsi, &grid_mean); CHKERRQ(ierr);
81 ierr = DMDAVecGetArrayRead(da, user->
lAj, &grid_aj); CHKERRQ(ierr);
82 accessed_eulerian = PETSC_TRUE;
85 for (PetscInt p = 0; p < n_local; ++p) {
86 PetscReal p_diff = 0.0;
87 PetscReal p_mean = 0.0;
88 PetscReal p_vol = 1.0;
90 if (strcmp(fieldName,
"Psi") == 0) {
91 PetscInt i = cell_arr[3*p + 0];
92 PetscInt j = cell_arr[3*p + 1];
93 PetscInt k = cell_arr[3*p + 2];
96 p_mean = grid_mean[k][j][i];
98 PetscReal jac = grid_aj[k][j][i];
99 p_vol = (jac > 1.0e-14) ? (1.0 / jac) : 1.0e-14;
106 ierr = DMSwarmRestoreField(swarm, fieldName, NULL, NULL, (
void**)&psi_arr); CHKERRQ(ierr);
108 if (strcmp(fieldName,
"Psi") == 0) {
109 ierr = DMSwarmRestoreField(swarm,
"Diffusivity", NULL, NULL, (
void**)&diff_arr); CHKERRQ(ierr);
110 ierr = DMSwarmRestoreField(swarm,
"DMSwarm_CellID", NULL, NULL, (
void**)&cell_arr); CHKERRQ(ierr);
113 if (accessed_eulerian) {
114 ierr = DMDAVecRestoreArrayRead(da, user->
lPsi, &grid_mean); CHKERRQ(ierr);
115 ierr = DMDAVecRestoreArrayRead(da, user->
lAj, &grid_aj); CHKERRQ(ierr);
121 PetscFunctionReturn(0);
PetscErrorCode UpdateParticleField(const char *fieldName, PetscReal dt, PetscReal *psi_io, PetscReal diffusivity, PetscReal mean_val, PetscReal cell_vol, PetscReal C_model)
Internal helper implementation: UpdateParticleField().
PetscErrorCode UpdateFieldForAllParticles(UserCtx *user, const char *fieldName)
Internal helper implementation: UpdateFieldForAllParticles().
PetscErrorCode UpdateAllParticleFields(UserCtx *user)
Implementation of UpdateAllParticleFields().
Header file for Particle related physics modules.