16 Vec target_vec = NULL;
17 PetscReal scale_factor = 1.0;
18 char field_type[64] =
"Unknown";
19 PetscBool is_swarm_field = PETSC_FALSE;
20 const char *swarm_field_name = NULL;
22 PetscFunctionBeginUser;
24 if (!user) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_NULL,
"UserCtx is NULL.");
25 if (!field_name) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_NULL,
"field_name is NULL.");
28 if (strcasecmp(field_name,
"Ucat") == 0) {
29 target_vec = user->
Ucat;
31 strcpy(field_type,
"Cartesian Velocity (L/T)");
32 }
else if (strcasecmp(field_name,
"Ucont") == 0) {
33 target_vec = user->
Ucont;
35 strcpy(field_type,
"Contravariant Volume Flux (L^3/T)");
36 }
else if (strcasecmp(field_name,
"P") == 0) {
39 strcpy(field_type,
"Pressure (M L^-1 T^-2)");
40 }
else if (strcasecmp(field_name,
"Coordinates") == 0) {
41 ierr = DMGetCoordinates(user->
da, &target_vec); CHKERRQ(ierr);
43 strcpy(field_type,
"Grid Coordinates (L)");
44 }
else if (strcasecmp(field_name,
"ParticlePosition") == 0) {
45 is_swarm_field = PETSC_TRUE;
46 swarm_field_name =
"position";
48 strcpy(field_type,
"Particle Position (L)");
49 }
else if (strcasecmp(field_name,
"ParticleVelocity") == 0) {
50 is_swarm_field = PETSC_TRUE;
51 swarm_field_name =
"velocity";
53 strcpy(field_type,
"Particle Velocity (L/T)");
55 LOG(
GLOBAL,
LOG_WARNING,
"DimensionalizeField: Unknown or unhandled field_name '%s'. Field will not be scaled.\n", field_name);
57 PetscFunctionReturn(0);
61 if (PetscAbsReal(scale_factor - 1.0) < PETSC_MACHINE_EPSILON) {
62 LOG(
GLOBAL,
LOG_DEBUG,
"DimensionalizeField: Scaling factor for '%s' is 1.0. Skipping operation.\n", field_name);
64 PetscFunctionReturn(0);
68 LOG(
GLOBAL,
LOG_INFO,
"Scaling '%s' field (%s) by factor %.4e.\n", field_name, field_type, scale_factor);
72 ierr = DMSwarmCreateGlobalVectorFromField(user->
swarm, swarm_field_name, &target_vec); CHKERRQ(ierr);
73 ierr = VecScale(target_vec, scale_factor); CHKERRQ(ierr);
74 ierr = DMSwarmDestroyGlobalVectorFromField(user->
swarm, swarm_field_name, &target_vec); CHKERRQ(ierr);
78 ierr = VecScale(target_vec, scale_factor); CHKERRQ(ierr);
80 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONGSTATE,
"Target vector for field '%s' was not found or is NULL.", field_name);
85 if (strcasecmp(field_name,
"Coordinates") == 0) {
90 PetscFunctionReturn(0);
142 Vec in_vec_local = NULL, out_vec_global = NULL;
143 DM dm_in = NULL, dm_out = NULL;
146 PetscFunctionBeginUser;
148 LOG_ALLOW(
GLOBAL,
LOG_INFO,
"-> KERNEL: Running ComputeNodalAverage on '%s' -> '%s'.\n", in_field_name, out_field_name);
151 if (strcasecmp(in_field_name,
"P") == 0) { in_vec_local = user->
lP; dm_in = user->
da; dof = 1; }
152 else if (strcasecmp(in_field_name,
"Ucat") == 0) { in_vec_local = user->
lUcat; dm_in = user->
fda; dof = 3; }
153 else if (strcasecmp(in_field_name,
"Psi") == 0) { in_vec_local = user->
lPsi; dm_in = user->
da; dof = 1; }
155 else SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONG,
"Unknown input field name for nodal averaging: %s", in_field_name);
157 if (strcasecmp(out_field_name,
"P_nodal") == 0) { out_vec_global = user->
P_nodal; dm_out = user->
da; }
158 else if (strcasecmp(out_field_name,
"Ucat_nodal") == 0) { out_vec_global = user->
Ucat_nodal; dm_out = user->
fda; }
159 else if (strcasecmp(out_field_name,
"Psi_nodal") == 0) { out_vec_global = user->
Psi_nodal; dm_out = user->
da; }
161 else SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONG,
"Unknown output field name for nodal averaging: %s", out_field_name);
168 ierr = DMDAGetLocalInfo(dm_out, &info); CHKERRQ(ierr);
171 const PetscReal ***l_in_arr;
172 PetscReal ***g_out_arr;
173 ierr = DMDAVecGetArrayRead(dm_in,in_vec_local, (
void*)&l_in_arr); CHKERRQ(ierr);
174 ierr = DMDAVecGetArray(dm_out,out_vec_global, (
void*)&g_out_arr); CHKERRQ(ierr);
178 for (PetscInt k = info.zs; k < info.zs + info.zm - 1; k++) {
179 for (PetscInt j = info.ys; j < info.ys + info.ym - 1; j++) {
180 for (PetscInt i = info.xs; i < info.xs + info.xm - 1; i++) {
181 g_out_arr[k][j][i] = 0.125 * (l_in_arr[k][j][i] + l_in_arr[k][j][i+1] +
182 l_in_arr[k][j+1][i] + l_in_arr[k][j+1][i+1] +
183 l_in_arr[k+1][j][i] + l_in_arr[k+1][j][i+1] +
184 l_in_arr[k+1][j+1][i] + l_in_arr[k+1][j+1][i+1]);
188 ierr = DMDAVecRestoreArrayRead(dm_in,in_vec_local, (
void*)&l_in_arr); CHKERRQ(ierr);
189 ierr = DMDAVecRestoreArray(dm_out,out_vec_global, (
void*)&g_out_arr); CHKERRQ(ierr);
191 }
else if (dof == 3) {
194 ierr = DMDAVecGetArrayRead(dm_in,in_vec_local, (
void*)&l_in_arr); CHKERRQ(ierr);
195 ierr = DMDAVecGetArray(dm_out,out_vec_global, (
void*)&g_out_arr); CHKERRQ(ierr);
197 for (PetscInt k = info.zs; k < info.zs + info.zm - 1; k++) {
198 for (PetscInt j = info.ys; j < info.ys + info.ym - 1; j++) {
199 for (PetscInt i = info.xs; i < info.xs + info.xm - 1; i++) {
200 g_out_arr[k][j][i].
x = 0.125 * (l_in_arr[k][j][i].
x + l_in_arr[k][j][i+1].
x +
201 l_in_arr[k][j+1][i].
x + l_in_arr[k][j+1][i+1].
x +
202 l_in_arr[k+1][j][i].
x + l_in_arr[k+1][j][i+1].
x +
203 l_in_arr[k+1][j+1][i].
x + l_in_arr[k+1][j+1][i+1].
x);
205 g_out_arr[k][j][i].
y = 0.125 * (l_in_arr[k][j][i].
y + l_in_arr[k][j][i+1].
y +
206 l_in_arr[k][j+1][i].
y + l_in_arr[k][j+1][i+1].
y +
207 l_in_arr[k+1][j][i].
y + l_in_arr[k+1][j][i+1].
y +
208 l_in_arr[k+1][j+1][i].
y + l_in_arr[k+1][j+1][i+1].
y);
210 g_out_arr[k][j][i].
z = 0.125 * (l_in_arr[k][j][i].
z + l_in_arr[k][j][i+1].
z +
211 l_in_arr[k][j+1][i].
z + l_in_arr[k][j+1][i+1].
z +
212 l_in_arr[k+1][j][i].
z + l_in_arr[k+1][j][i+1].
z +
213 l_in_arr[k+1][j+1][i].
z + l_in_arr[k+1][j+1][i+1].
z);
217 ierr = DMDAVecRestoreArrayRead(dm_in,in_vec_local, (
void*)&l_in_arr); CHKERRQ(ierr);
218 ierr = DMDAVecRestoreArray(dm_out,out_vec_global, (
void*)&g_out_arr); CHKERRQ(ierr);
221 PetscFunctionReturn(0);
237 const Cmpnts ***lucat, ***lcsi, ***leta, ***lzet;
238 const PetscReal***laj, ***lnvert;
241 PetscFunctionBeginUser;
254 ierr = DMDAGetLocalInfo(user->
da, &info); CHKERRQ(ierr);
256 ierr = DMDAVecGetArrayRead(user->
fda, user->
lUcat, (
void*)&lucat); CHKERRQ(ierr);
257 ierr = DMDAVecGetArrayRead(user->
fda, user->
lCsi, (
void*)&lcsi); CHKERRQ(ierr);
258 ierr = DMDAVecGetArrayRead(user->
fda, user->
lEta, (
void*)&leta); CHKERRQ(ierr);
259 ierr = DMDAVecGetArrayRead(user->
fda, user->
lZet, (
void*)&lzet); CHKERRQ(ierr);
260 ierr = DMDAVecGetArrayRead(user->
da, user->
lAj, (
void*)&laj); CHKERRQ(ierr);
261 ierr = DMDAVecGetArrayRead(user->
da, user->
lNvert, (
void*)&lnvert); CHKERRQ(ierr);
262 ierr = DMDAVecGetArray(user->
da, user->
Qcrit, (
void*)&gq); CHKERRQ(ierr);
265 PetscInt i_start = (info.xs == 0) ? 1 : info.xs;
266 PetscInt i_end = (info.xs + info.xm == info.mx) ? info.mx - 1 : info.xs + info.xm;
267 PetscInt j_start = (info.ys == 0) ? 1 : info.ys;
268 PetscInt j_end = (info.ys + info.ym == info.my) ? info.my - 1 : info.ys + info.ym;
269 PetscInt k_start = (info.zs == 0) ? 1 : info.zs;
270 PetscInt k_end = (info.zs + info.zm == info.mz) ? info.mz - 1 : info.zs + info.zm;
273 for (PetscInt k = k_start; k < k_end; k++) {
274 for (PetscInt j = j_start; j < j_end; j++) {
275 for (PetscInt i = i_start; i < i_end; i++) {
278 PetscReal uc = 0.5 * (lucat[k][j][i+1].
x - lucat[k][j][i-1].
x);
279 PetscReal vc = 0.5 * (lucat[k][j][i+1].
y - lucat[k][j][i-1].
y);
280 PetscReal wc = 0.5 * (lucat[k][j][i+1].
z - lucat[k][j][i-1].
z);
282 PetscReal ue = 0.5 * (lucat[k][j+1][i].
x - lucat[k][j-1][i].
x);
283 PetscReal ve = 0.5 * (lucat[k][j+1][i].
y - lucat[k][j-1][i].
y);
284 PetscReal we = 0.5 * (lucat[k][j+1][i].
z - lucat[k][j-1][i].
z);
286 PetscReal uz = 0.5 * (lucat[k+1][j][i].
x - lucat[k-1][j][i].
x);
287 PetscReal vz = 0.5 * (lucat[k+1][j][i].
y - lucat[k-1][j][i].
y);
288 PetscReal wz = 0.5 * (lucat[k+1][j][i].
z - lucat[k-1][j][i].
z);
291 PetscReal csi1 = 0.5 * (lcsi[k][j][i].
x + lcsi[k][j][i-1].
x) * laj[k][j][i];
292 PetscReal csi2 = 0.5 * (lcsi[k][j][i].
y + lcsi[k][j][i-1].
y) * laj[k][j][i];
293 PetscReal csi3 = 0.5 * (lcsi[k][j][i].
z + lcsi[k][j][i-1].
z) * laj[k][j][i];
295 PetscReal eta1 = 0.5 * (leta[k][j][i].
x + leta[k][j-1][i].
x) * laj[k][j][i];
296 PetscReal eta2 = 0.5 * (leta[k][j][i].
y + leta[k][j-1][i].
y) * laj[k][j][i];
297 PetscReal eta3 = 0.5 * (leta[k][j][i].
z + leta[k][j-1][i].
z) * laj[k][j][i];
299 PetscReal zet1 = 0.5 * (lzet[k][j][i].
x + lzet[k-1][j][i].
x) * laj[k][j][i];
300 PetscReal zet2 = 0.5 * (lzet[k][j][i].
y + lzet[k-1][j][i].
y) * laj[k][j][i];
301 PetscReal zet3 = 0.5 * (lzet[k][j][i].
z + lzet[k-1][j][i].
z) * laj[k][j][i];
304 PetscReal d11 = uc * csi1 + ue * eta1 + uz * zet1;
305 PetscReal d12 = uc * csi2 + ue * eta2 + uz * zet2;
306 PetscReal d13 = uc * csi3 + ue * eta3 + uz * zet3;
308 PetscReal d21 = vc * csi1 + ve * eta1 + vz * zet1;
309 PetscReal d22 = vc * csi2 + ve * eta2 + vz * zet2;
310 PetscReal d23 = vc * csi3 + ve * eta3 + vz * zet3;
312 PetscReal d31 = wc * csi1 + we * eta1 + wz * zet1;
313 PetscReal d32 = wc * csi2 + we * eta2 + wz * zet2;
314 PetscReal d33 = wc * csi3 + we * eta3 + wz * zet3;
318 PetscReal s12 = 0.5 * (d12 + d21);
319 PetscReal s13 = 0.5 * (d13 + d31);
321 PetscReal s23 = 0.5 * (d23 + d32);
325 PetscReal w12 = 0.5 * (d12 - d21);
326 PetscReal w13 = 0.5 * (d13 - d31);
327 PetscReal w23 = 0.5 * (d23 - d32);
330 PetscReal s_norm_sq = s11*s11 + s22*s22 + s33*s33 + 2.0*(s12*s12 + s13*s13 + s23*s23);
331 PetscReal w_norm_sq = 2.0 * (w12*w12 + w13*w13 + w23*w23);
333 gq[k][j][i] = 0.5 * (w_norm_sq - s_norm_sq);
335 if (lnvert[k][j][i] > 0.1) {
343 ierr = DMDAVecRestoreArrayRead(user->
fda, user->
lUcat, (
void*)&lucat); CHKERRQ(ierr);
344 ierr = DMDAVecRestoreArrayRead(user->
fda, user->
lCsi, (
void*)&lcsi); CHKERRQ(ierr);
345 ierr = DMDAVecRestoreArrayRead(user->
fda, user->
lEta, (
void*)&leta); CHKERRQ(ierr);
346 ierr = DMDAVecRestoreArrayRead(user->
fda, user->
lZet, (
void*)&lzet); CHKERRQ(ierr);
347 ierr = DMDAVecRestoreArrayRead(user->
da, user->
lAj, (
void*)&laj); CHKERRQ(ierr);
348 ierr = DMDAVecRestoreArrayRead(user->
da, user->
lNvert, (
void*)&lnvert); CHKERRQ(ierr);
349 ierr = DMDAVecRestoreArray(user->
da, user->
Qcrit, (
void*)&gq); CHKERRQ(ierr);
352 PetscFunctionReturn(0);
368 PetscInt ip=1, jp=1, kp=1;
369 PetscReal p_ref = 0.0;
370 PetscInt ref_point_global_idx[1];
371 PetscScalar ref_value_local[1];
373 VecScatter scatter_ctx;
382 PetscFunctionBeginUser;
387 if (strcasecmp(relative_field_name,
"P") == 0) {
390 SETERRQ(PETSC_COMM_SELF, 1,
"NormalizeRelativeField only supports the primary 'P' field , not '%s' currently.", relative_field_name);
394 ierr = MPI_Comm_rank(PETSC_COMM_WORLD, &rank); CHKERRQ(ierr);
397 ref_point_global_idx[0] = kp * (user->
IM * user->
JM) + jp * user->
IM + ip;
401 ierr = ISCreateGeneral(PETSC_COMM_WORLD, 1, ref_point_global_idx, PETSC_COPY_VALUES, &is_from); CHKERRQ(ierr);
404 ierr = VecCreateSeq(PETSC_COMM_SELF, 1, &ref_vec_seq); CHKERRQ(ierr);
407 PetscInt dest_idx[1] = {0};
408 ierr = ISCreateGeneral(PETSC_COMM_SELF, 1, dest_idx, PETSC_COPY_VALUES, &is_to); CHKERRQ(ierr);
411 ierr = VecScatterCreate(P_vec, is_from, ref_vec_seq, is_to, &scatter_ctx); CHKERRQ(ierr);
412 ierr = VecScatterBegin(scatter_ctx, P_vec, ref_vec_seq, INSERT_VALUES, SCATTER_FORWARD); CHKERRQ(ierr);
413 ierr = VecScatterEnd(scatter_ctx, P_vec, ref_vec_seq, INSERT_VALUES, SCATTER_FORWARD); CHKERRQ(ierr);
417 ierr = VecGetValues(ref_vec_seq, 1, dest_idx, ref_value_local); CHKERRQ(ierr);
418 p_ref = ref_value_local[0];
419 LOG_ALLOW(
LOCAL,
LOG_DEBUG,
"%s reference point (%" PetscInt_FMT
", %" PetscInt_FMT
", %" PetscInt_FMT
") has value %g.\n", relative_field_name, jp, kp, ip, p_ref);
423 ierr = MPI_Bcast(&p_ref, 1, MPIU_REAL, 0, PETSC_COMM_WORLD); CHKERRQ(ierr);
426 ierr = VecShift(P_vec, -p_ref); CHKERRQ(ierr);
430 ierr = ISDestroy(&is_from); CHKERRQ(ierr);
431 ierr = ISDestroy(&is_to); CHKERRQ(ierr);
432 ierr = VecScatterDestroy(&scatter_ctx); CHKERRQ(ierr);
433 ierr = VecDestroy(&ref_vec_seq); CHKERRQ(ierr);
436 PetscFunctionReturn(0);
452 const PetscScalar (*vel_arr)[3];
453 PetscScalar *ske_arr;
455 PetscFunctionBeginUser;
457 LOG_ALLOW(
GLOBAL,
LOG_INFO,
"-> KERNEL: Running ComputeSpecificKE ('%s' -> '%s').\n", velocity_field, ske_field);
460 ierr = DMSwarmGetLocalSize(user->
swarm, &n_local); CHKERRQ(ierr);
461 if (n_local == 0) PetscFunctionReturn(0);
464 ierr = DMSwarmGetField(user->
swarm, velocity_field, NULL, NULL, (
void**)&vel_arr); CHKERRQ(ierr);
465 ierr = DMSwarmGetField(user->
post_swarm, ske_field, NULL, NULL, (
void**)&ske_arr); CHKERRQ(ierr);
468 for (PetscInt p = 0; p < n_local; p++) {
469 const PetscScalar u = vel_arr[p][0];
470 const PetscScalar v = vel_arr[p][1];
471 const PetscScalar w = vel_arr[p][2];
472 const PetscScalar vel_sq = u*u + v*v + w*w;
473 ske_arr[p] = 0.5 * vel_sq;
477 ierr = DMSwarmRestoreField(user->
swarm, velocity_field, NULL, NULL, (
void**)&vel_arr); CHKERRQ(ierr);
478 ierr = DMSwarmRestoreField(user->
post_swarm, ske_field, NULL, NULL, (
void**)&ske_arr); CHKERRQ(ierr);
481 PetscFunctionReturn(0);
494 const PetscReal (*pos_arr)[3];
495 PetscScalar *disp_out;
498 PetscFunctionBeginUser;
502 ierr = DMSwarmGetLocalSize(user->
swarm, &n_local); CHKERRQ(ierr);
503 if (n_local == 0) PetscFunctionReturn(0);
505 const PetscReal x0 = simCtx->
psrc_x;
506 const PetscReal y0 = simCtx->
psrc_y;
507 const PetscReal z0 = simCtx->
psrc_z;
509 ierr = DMSwarmGetField(user->
swarm,
"position", NULL, NULL, (
void**)&pos_arr); CHKERRQ(ierr);
510 ierr = DMSwarmGetField(user->
post_swarm, disp_field, NULL, NULL, (
void**)&disp_out); CHKERRQ(ierr);
512 for (PetscInt p = 0; p < n_local; p++) {
513 const PetscReal dx = pos_arr[p][0] - x0;
514 const PetscReal dy = pos_arr[p][1] - y0;
515 const PetscReal dz = pos_arr[p][2] - z0;
516 disp_out[p] = PetscSqrtReal(dx*dx + dy*dy + dz*dz);
519 ierr = DMSwarmRestoreField(user->
swarm,
"position", NULL, NULL, (
void**)&pos_arr); CHKERRQ(ierr);
520 ierr = DMSwarmRestoreField(user->
post_swarm, disp_field, NULL, NULL, (
void**)&disp_out); CHKERRQ(ierr);
523 PetscFunctionReturn(0);
PetscErrorCode ComputeQCriterion(UserCtx *user)
Implementation of ComputeQCriterion().
PetscErrorCode ComputeSpecificKE(UserCtx *user, const char *velocity_field, const char *ske_field)
Internal helper implementation: ComputeSpecificKE().
PetscErrorCode ComputeDisplacement(UserCtx *user, const char *disp_field)
Internal helper implementation: ComputeDisplacement().
PetscErrorCode NormalizeRelativeField(UserCtx *user, const char *relative_field_name)
Implementation of NormalizeRelativeField().
PetscErrorCode DimensionalizeField(UserCtx *user, const char *field_name)
Implementation of DimensionalizeField().
PetscErrorCode DimensionalizeAllLoadedFields(UserCtx *user)
Internal helper implementation: DimensionalizeAllLoadedFields().
PetscErrorCode ComputeNodalAverage(UserCtx *user, const char *in_field_name, const char *out_field_name)
Implementation of ComputeNodalAverage().
Holds all configuration parameters for a post-processing run.