399 DM swarm = user->
swarm;
401 PetscInt localNumParticles;
402 PetscReal *positions = NULL;
403 PetscInt64 *particleIDs = NULL;
404 PetscMPIInt *particleRanks = NULL;
405 PetscInt *cellIDs = NULL;
406 PetscReal *weights = NULL;
407 PetscReal *velocities = NULL;
410 ierr = MPI_Comm_rank(PETSC_COMM_WORLD, &rank); CHKERRQ(ierr);
413 ierr = DMSwarmGetLocalSize(swarm, &localNumParticles); CHKERRQ(ierr);
416 ierr = DMSwarmGetField(swarm,
"position", NULL, NULL, (
void**)&positions); CHKERRQ(ierr);
417 ierr = DMSwarmGetField(swarm,
"DMSwarm_pid", NULL, NULL, (
void**)&particleIDs); CHKERRQ(ierr);
418 ierr = DMSwarmGetField(swarm,
"DMSwarm_rank", NULL, NULL, (
void**)&particleRanks); CHKERRQ(ierr);
419 ierr = DMSwarmGetField(swarm,
"DMSwarm_CellID", NULL, NULL, (
void**)&cellIDs); CHKERRQ(ierr);
420 ierr = DMSwarmGetField(swarm,
"weight", NULL, NULL, (
void**)&weights); CHKERRQ(ierr);
421 ierr = DMSwarmGetField(swarm,
"velocity", NULL, NULL, (
void**)&velocities); CHKERRQ(ierr);
424 int wRank, wPID, wCell, wPos, wVel, wWt;
425 wRank = wPID = wCell = wPos = wVel = wWt = 0;
427 positions, velocities, weights,
428 &wRank, &wPID, &wCell, &wPos, &wVel, &wWt); CHKERRQ(ierr);
433 BuildHeaderString(headerFmt,
sizeof(headerFmt), wRank, wPID, wCell, wPos, wVel, wWt);
437 ierr = PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"--------------------------------------------------------------------------------------------------------------\n"); CHKERRQ(ierr);
438 ierr = PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"%s", headerFmt); CHKERRQ(ierr);
439 ierr = PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"--------------------------------------------------------------------------------------------------------------\n"); CHKERRQ(ierr);
443 for (PetscInt i = 0; i < localNumParticles; i++) {
444 if (i % printInterval == 0) {
488 snprintf(rowStr,
sizeof(rowStr), rowFmt,
495 ierr = PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"%s", rowStr); CHKERRQ(ierr);
500 ierr = PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"--------------------------------------------------------------------------------------------------------------\n"); CHKERRQ(ierr);
501 ierr = PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"\n"); CHKERRQ(ierr);
502 ierr = PetscSynchronizedFlush(PETSC_COMM_WORLD, PETSC_STDOUT); CHKERRQ(ierr);
507 ierr = DMSwarmRestoreField(swarm,
"position", NULL, NULL, (
void**)&positions); CHKERRQ(ierr);
508 ierr = DMSwarmRestoreField(swarm,
"DMSwarm_pid", NULL, NULL, (
void**)&particleIDs); CHKERRQ(ierr);
509 ierr = DMSwarmRestoreField(swarm,
"DMSwarm_rank", NULL, NULL, (
void**)&particleRanks); CHKERRQ(ierr);
510 ierr = DMSwarmRestoreField(swarm,
"DMSwarm_CellID", NULL, NULL, (
void**)&cellIDs); CHKERRQ(ierr);
511 ierr = DMSwarmRestoreField(swarm,
"weight", NULL, NULL, (
void**)&weights); CHKERRQ(ierr);
512 ierr = DMSwarmRestoreField(swarm,
"velocity", NULL, NULL, (
void**)&velocities); CHKERRQ(ierr);
1092 PetscBool periodic_mode,
1093 PetscInt phase_step,
1094 PetscInt samples_before,
1095 PetscBool *has_reference_out,
1096 PetscReal *u_abs_l2_out,
1097 PetscReal *u_rel_l2_out,
1098 PetscReal *p_abs_l2_out,
1099 PetscReal *p_rel_l2_out,
1100 PetscReal *mean_speed_out,
1101 PetscReal *mean_speed_ref_out,
1102 PetscReal *mean_speed_abs_out,
1103 PetscReal *mean_speed_rel_out,
1104 PetscReal *mean_ke_out,
1105 PetscReal *mean_ke_ref_out,
1106 PetscReal *mean_ke_abs_out,
1107 PetscReal *mean_ke_rel_out)
1113 PetscReal current_pressure_mean = 0.0;
1114 PetscReal reference_pressure_mean = 0.0;
1117 PetscFunctionBeginUser;
1118 if (!simCtx || !has_reference_out || !u_abs_l2_out || !u_rel_l2_out || !p_abs_l2_out || !p_rel_l2_out ||
1119 !mean_speed_out || !mean_speed_ref_out || !mean_speed_abs_out || !mean_speed_rel_out ||
1120 !mean_ke_out || !mean_ke_ref_out || !mean_ke_abs_out || !mean_ke_rel_out) {
1121 SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_NULL,
"ComputeDeterministicSolutionMetrics received a NULL output pointer.");
1124 *has_reference_out = periodic_mode
1127 phase_step < simCtx->solutionConvergencePeriodSteps &&
1129 : (PetscBool)(samples_before > 0);
1131 *u_abs_l2_out = 0.0;
1132 *u_rel_l2_out = 0.0;
1133 *p_abs_l2_out = 0.0;
1134 *p_rel_l2_out = 0.0;
1135 *mean_speed_out = 0.0;
1136 *mean_speed_ref_out = 0.0;
1137 *mean_speed_abs_out = 0.0;
1138 *mean_speed_rel_out = 0.0;
1140 *mean_ke_ref_out = 0.0;
1141 *mean_ke_abs_out = 0.0;
1142 *mean_ke_rel_out = 0.0;
1146 for (PetscInt bi = 0; bi < simCtx->
block_number; ++bi) {
1147 const DMDALocalInfo info = user[bi].
info;
1148 const PetscBool x_per = (PetscBool)(simCtx->
i_periodic != 0);
1149 const PetscBool y_per = (PetscBool)(simCtx->
j_periodic != 0);
1150 const PetscBool z_per = (PetscBool)(simCtx->
k_periodic != 0);
1151 const PetscInt i_end = (x_per && (info.xs + info.xm == info.mx)) ? info.mx - 1 : info.xs + info.xm;
1152 const PetscInt j_end = (y_per && (info.ys + info.ym == info.my)) ? info.my - 1 : info.ys + info.ym;
1153 const PetscInt k_end = (z_per && (info.zs + info.zm == info.mz)) ? info.mz - 1 : info.zs + info.zm;
1155 Cmpnts ***ucat_ref = NULL;
1156 PetscReal ***pressure = NULL;
1157 PetscReal ***pressure_ref = NULL;
1158 PetscReal ***aj = NULL;
1159 PetscReal ***nvert = NULL;
1160 Vec ucat_reference_vec = NULL;
1161 Vec pressure_reference_vec = NULL;
1163 if (*has_reference_out) {
1164 if (periodic_mode) {
1168 ucat_reference_vec = user[bi].
Ucat_o;
1169 pressure_reference_vec = user[bi].
P_o;
1173 PetscCall(DMDAVecGetArrayRead(user[bi].fda, user[bi].Ucat, &ucat));
1174 PetscCall(DMDAVecGetArrayRead(user[bi].da, user[bi].P, &pressure));
1175 PetscCall(DMDAVecGetArrayRead(user[bi].da, user[bi].Aj, &aj));
1176 PetscCall(DMDAVecGetArrayRead(user[bi].da, user[bi].Nvert, &nvert));
1177 if (*has_reference_out) {
1178 PetscCall(DMDAVecGetArrayRead(user[bi].fda, ucat_reference_vec, &ucat_ref));
1179 PetscCall(DMDAVecGetArrayRead(user[bi].da, pressure_reference_vec, &pressure_ref));
1182 for (PetscInt k = info.zs; k < k_end; ++k) {
1183 for (PetscInt j = info.ys; j < j_end; ++j) {
1184 for (PetscInt i = info.xs; i < i_end; ++i) {
1185 PetscReal jac = aj[k][j][i];
1186 PetscReal cell_volume = 0.0;
1187 PetscReal speed = 0.0;
1191 if (PetscAbsReal(jac) <= 1.0e-14)
continue;
1193 cell_volume = 1.0 / jac;
1194 speed = PetscSqrtReal(ucat[k][j][i].x * ucat[k][j][i].x +
1195 ucat[k][j][i].y * ucat[k][j][i].y +
1196 ucat[k][j][i].z * ucat[k][j][i].z);
1197 ke = 0.5 * speed * speed;
1203 ucat[k][j][i].
y * ucat[k][j][i].
y +
1204 ucat[k][j][i].
z * ucat[k][j][i].
z) * cell_volume;
1206 if (*has_reference_out) {
1207 PetscReal ref_speed = PetscSqrtReal(ucat_ref[k][j][i].x * ucat_ref[k][j][i].x +
1208 ucat_ref[k][j][i].y * ucat_ref[k][j][i].y +
1209 ucat_ref[k][j][i].z * ucat_ref[k][j][i].z);
1210 PetscReal ref_ke = 0.5 * ref_speed * ref_speed;
1211 PetscReal dux = ucat[k][j][i].
x - ucat_ref[k][j][i].
x;
1212 PetscReal duy = ucat[k][j][i].
y - ucat_ref[k][j][i].
y;
1213 PetscReal duz = ucat[k][j][i].
z - ucat_ref[k][j][i].
z;
1217 local_pass1.
delta_u_norm_sq += (dux * dux + duy * duy + duz * duz) * cell_volume;
1225 if (*has_reference_out) {
1226 PetscCall(DMDAVecRestoreArrayRead(user[bi].da, pressure_reference_vec, &pressure_ref));
1227 PetscCall(DMDAVecRestoreArrayRead(user[bi].fda, ucat_reference_vec, &ucat_ref));
1229 PetscCall(DMDAVecRestoreArrayRead(user[bi].da, user[bi].Nvert, &nvert));
1230 PetscCall(DMDAVecRestoreArrayRead(user[bi].da, user[bi].Aj, &aj));
1231 PetscCall(DMDAVecRestoreArrayRead(user[bi].da, user[bi].P, &pressure));
1232 PetscCall(DMDAVecRestoreArrayRead(user[bi].fda, user[bi].Ucat, &ucat));
1235 PetscCallMPI(MPI_Allreduce(&local_pass1, &global_pass1,
1237 MPIU_REAL, MPI_SUM, PETSC_COMM_WORLD));
1239 if (global_pass1.
fluid_volume <= 0.0) PetscFunctionReturn(0);
1244 if (!*has_reference_out) PetscFunctionReturn(0);
1247 *mean_speed_abs_out = PetscAbsReal(*mean_speed_out - *mean_speed_ref_out);
1250 *mean_ke_abs_out = PetscAbsReal(*mean_ke_out - *mean_ke_ref_out);
1256 for (PetscInt bi = 0; bi < simCtx->
block_number; ++bi) {
1257 const DMDALocalInfo info = user[bi].
info;
1258 const PetscBool x_per = (PetscBool)(simCtx->
i_periodic != 0);
1259 const PetscBool y_per = (PetscBool)(simCtx->
j_periodic != 0);
1260 const PetscBool z_per = (PetscBool)(simCtx->
k_periodic != 0);
1261 const PetscInt i_end = (x_per && (info.xs + info.xm == info.mx)) ? info.mx - 1 : info.xs + info.xm;
1262 const PetscInt j_end = (y_per && (info.ys + info.ym == info.my)) ? info.my - 1 : info.ys + info.ym;
1263 const PetscInt k_end = (z_per && (info.zs + info.zm == info.mz)) ? info.mz - 1 : info.zs + info.zm;
1264 PetscReal ***pressure = NULL;
1265 PetscReal ***pressure_ref = NULL;
1266 PetscReal ***aj = NULL;
1267 PetscReal ***nvert = NULL;
1270 PetscCall(DMDAVecGetArrayRead(user[bi].da, user[bi].P, &pressure));
1271 PetscCall(DMDAVecGetArrayRead(user[bi].da, pressure_reference_vec, &pressure_ref));
1272 PetscCall(DMDAVecGetArrayRead(user[bi].da, user[bi].Aj, &aj));
1273 PetscCall(DMDAVecGetArrayRead(user[bi].da, user[bi].Nvert, &nvert));
1275 for (PetscInt k = info.zs; k < k_end; ++k) {
1276 for (PetscInt j = info.ys; j < j_end; ++j) {
1277 for (PetscInt i = info.xs; i < i_end; ++i) {
1278 PetscReal jac = aj[k][j][i];
1279 PetscReal cell_volume = 0.0;
1280 PetscReal current_pressure = 0.0;
1281 PetscReal reference_pressure = 0.0;
1282 PetscReal delta_pressure = 0.0;
1285 if (PetscAbsReal(jac) <= 1.0e-14)
continue;
1287 cell_volume = 1.0 / jac;
1288 current_pressure = pressure[k][j][i] - current_pressure_mean;
1289 reference_pressure = pressure_ref[k][j][i] - reference_pressure_mean;
1290 delta_pressure = current_pressure - reference_pressure;
1298 PetscCall(DMDAVecRestoreArrayRead(user[bi].da, user[bi].Nvert, &nvert));
1299 PetscCall(DMDAVecRestoreArrayRead(user[bi].da, user[bi].Aj, &aj));
1300 PetscCall(DMDAVecRestoreArrayRead(user[bi].da, pressure_reference_vec, &pressure_ref));
1301 PetscCall(DMDAVecRestoreArrayRead(user[bi].da, user[bi].P, &pressure));
1304 PetscCallMPI(MPI_Allreduce(&local_pass2, &global_pass2,
1306 MPIU_REAL, MPI_SUM, PETSC_COMM_WORLD));
1313 PetscFunctionReturn(0);
1450 PetscInt samples_available,
1451 PetscBool *has_reference_out,
1452 PetscReal *mean_speed_window_out,
1453 PetscReal *mean_speed_window_prev_out,
1454 PetscReal *mean_speed_window_abs_out,
1455 PetscReal *mean_speed_window_rel_out,
1456 PetscReal *mean_speed_rms_window_out,
1457 PetscReal *mean_speed_rms_window_prev_out,
1458 PetscReal *mean_speed_rms_window_abs_out,
1459 PetscReal *mean_speed_rms_window_rel_out,
1460 PetscReal *mean_ke_window_out,
1461 PetscReal *mean_ke_window_prev_out,
1462 PetscReal *mean_ke_window_abs_out,
1463 PetscReal *mean_ke_window_rel_out,
1464 PetscReal *mean_ke_rms_window_out,
1465 PetscReal *mean_ke_rms_window_prev_out,
1466 PetscReal *mean_ke_rms_window_abs_out,
1467 PetscReal *mean_ke_rms_window_rel_out)
1470 PetscInt history_capacity = 0;
1471 PetscReal speed_sum = 0.0;
1472 PetscReal speed_sum_sq = 0.0;
1473 PetscReal speed_prev_sum = 0.0;
1474 PetscReal speed_prev_sum_sq = 0.0;
1475 PetscReal ke_sum = 0.0;
1476 PetscReal ke_sum_sq = 0.0;
1477 PetscReal ke_prev_sum = 0.0;
1478 PetscReal ke_prev_sum_sq = 0.0;
1480 PetscFunctionBeginUser;
1481 if (!simCtx || !has_reference_out || !mean_speed_window_out || !mean_speed_window_prev_out ||
1482 !mean_speed_window_abs_out || !mean_speed_window_rel_out || !mean_speed_rms_window_out ||
1483 !mean_speed_rms_window_prev_out || !mean_speed_rms_window_abs_out || !mean_speed_rms_window_rel_out ||
1484 !mean_ke_window_out || !mean_ke_window_prev_out || !mean_ke_window_abs_out || !mean_ke_window_rel_out ||
1485 !mean_ke_rms_window_out || !mean_ke_rms_window_prev_out || !mean_ke_rms_window_abs_out ||
1486 !mean_ke_rms_window_rel_out) {
1487 SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_NULL,
"ComputeStatisticalWindowMetrics received a NULL output pointer.");
1490 *has_reference_out = PETSC_FALSE;
1491 *mean_speed_window_out = 0.0;
1492 *mean_speed_window_prev_out = 0.0;
1493 *mean_speed_window_abs_out = 0.0;
1494 *mean_speed_window_rel_out = 0.0;
1495 *mean_speed_rms_window_out = 0.0;
1496 *mean_speed_rms_window_prev_out = 0.0;
1497 *mean_speed_rms_window_abs_out = 0.0;
1498 *mean_speed_rms_window_rel_out = 0.0;
1499 *mean_ke_window_out = 0.0;
1500 *mean_ke_window_prev_out = 0.0;
1501 *mean_ke_window_abs_out = 0.0;
1502 *mean_ke_window_rel_out = 0.0;
1503 *mean_ke_rms_window_out = 0.0;
1504 *mean_ke_rms_window_prev_out = 0.0;
1505 *mean_ke_rms_window_abs_out = 0.0;
1506 *mean_ke_rms_window_rel_out = 0.0;
1509 history_capacity = 2 * w;
1510 if (w <= 0 || samples_available < w) PetscFunctionReturn(0);
1512 for (PetscInt idx = 0; idx < w; ++idx) {
1521 speed_sum += speed_value;
1522 speed_sum_sq += speed_value * speed_value;
1524 ke_sum_sq += ke_value * ke_value;
1527 *mean_speed_window_out = speed_sum / (PetscReal)w;
1528 *mean_speed_rms_window_out = PetscSqrtReal(PetscMax(0.0, speed_sum_sq / (PetscReal)w -
1529 (*mean_speed_window_out) * (*mean_speed_window_out)));
1530 *mean_ke_window_out = ke_sum / (PetscReal)w;
1531 *mean_ke_rms_window_out = PetscSqrtReal(PetscMax(0.0, ke_sum_sq / (PetscReal)w -
1532 (*mean_ke_window_out) * (*mean_ke_window_out)));
1534 if (samples_available < 2 * w) PetscFunctionReturn(0);
1536 for (PetscInt idx = w; idx < 2 * w; ++idx) {
1545 speed_prev_sum += speed_value;
1546 speed_prev_sum_sq += speed_value * speed_value;
1547 ke_prev_sum += ke_value;
1548 ke_prev_sum_sq += ke_value * ke_value;
1551 *has_reference_out = PETSC_TRUE;
1552 *mean_speed_window_prev_out = speed_prev_sum / (PetscReal)w;
1553 *mean_speed_window_abs_out = PetscAbsReal(*mean_speed_window_out - *mean_speed_window_prev_out);
1555 *mean_speed_rms_window_prev_out = PetscSqrtReal(PetscMax(0.0, speed_prev_sum_sq / (PetscReal)w -
1556 (*mean_speed_window_prev_out) * (*mean_speed_window_prev_out)));
1557 *mean_speed_rms_window_abs_out = PetscAbsReal(*mean_speed_rms_window_out - *mean_speed_rms_window_prev_out);
1560 *mean_ke_window_prev_out = ke_prev_sum / (PetscReal)w;
1561 *mean_ke_window_abs_out = PetscAbsReal(*mean_ke_window_out - *mean_ke_window_prev_out);
1563 *mean_ke_rms_window_prev_out = PetscSqrtReal(PetscMax(0.0, ke_prev_sum_sq / (PetscReal)w -
1564 (*mean_ke_window_prev_out) * (*mean_ke_window_prev_out)));
1565 *mean_ke_rms_window_abs_out = PetscAbsReal(*mean_ke_rms_window_out - *mean_ke_rms_window_prev_out);
1568 PetscFunctionReturn(0);
1601 PetscMPIInt rank = 0;
1602 PetscBool has_reference = PETSC_FALSE;
1603 PetscInt phase_step = -1;
1604 PetscInt samples_before = 0;
1605 PetscReal u_abs_l2 = 0.0, u_rel_l2 = 0.0, p_abs_l2 = 0.0, p_rel_l2 = 0.0;
1606 PetscReal mean_speed = 0.0, mean_speed_reference = 0.0, mean_speed_abs_drift = 0.0, mean_speed_rel_drift = 0.0;
1607 PetscReal mean_ke = 0.0, mean_ke_reference = 0.0, mean_ke_abs_drift = 0.0, mean_ke_rel_drift = 0.0;
1608 PetscReal mean_speed_window = 0.0, mean_speed_window_prev = 0.0, mean_speed_window_abs_drift = 0.0, mean_speed_window_rel_drift = 0.0;
1609 PetscReal mean_speed_rms_window = 0.0, mean_speed_rms_window_prev = 0.0, mean_speed_rms_window_abs_drift = 0.0, mean_speed_rms_window_rel_drift = 0.0;
1610 PetscReal mean_ke_window = 0.0, mean_ke_window_prev = 0.0, mean_ke_window_abs_drift = 0.0, mean_ke_window_rel_drift = 0.0;
1611 PetscReal mean_ke_rms_window = 0.0, mean_ke_rms_window_prev = 0.0, mean_ke_rms_window_abs_drift = 0.0, mean_ke_rms_window_rel_drift = 0.0;
1613 PetscFunctionBeginUser;
1614 if (!simCtx) PetscFunctionReturn(0);
1624 &u_abs_l2, &u_rel_l2,
1625 &p_abs_l2, &p_rel_l2,
1626 &mean_speed, &mean_speed_reference,
1627 &mean_speed_abs_drift, &mean_speed_rel_drift,
1628 &mean_ke, &mean_ke_reference,
1629 &mean_ke_abs_drift, &mean_ke_rel_drift));
1635 &u_abs_l2, &u_rel_l2,
1636 &p_abs_l2, &p_rel_l2,
1637 &mean_speed, &mean_speed_reference,
1638 &mean_speed_abs_drift, &mean_speed_rel_drift,
1639 &mean_ke, &mean_ke_reference,
1640 &mean_ke_abs_drift, &mean_ke_rel_drift));
1647 &mean_speed_window, &mean_speed_window_prev,
1648 &mean_speed_window_abs_drift, &mean_speed_window_rel_drift,
1649 &mean_speed_rms_window, &mean_speed_rms_window_prev,
1650 &mean_speed_rms_window_abs_drift, &mean_speed_rms_window_rel_drift,
1651 &mean_ke_window, &mean_ke_window_prev,
1652 &mean_ke_window_abs_drift, &mean_ke_window_rel_drift,
1653 &mean_ke_rms_window, &mean_ke_rms_window_prev,
1654 &mean_ke_rms_window_abs_drift, &mean_ke_rms_window_rel_drift));
1657 SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG,
"Unknown solution convergence mode %d.", (
int)simCtx->
solutionConvergenceMode);
1660 PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank));
1662 char log_path[PETSC_MAX_PATH_LEN + 32];
1666 PetscCall(PetscSNPrintf(log_path,
sizeof(log_path),
"%s/solution_convergence.log", simCtx->
log_dir));
1667 f = fopen(log_path,
"a");
1669 SETERRQ(PETSC_COMM_SELF, PETSC_ERR_FILE_OPEN,
"Cannot open solution convergence log: %s", log_path);
1672 if (ftell(f) == 0) {
1676 fprintf(f,
"==================== Solution Convergence Log [mode: %s] ====================\n", mode_str);
1678 fprintf(f,
"%-10s | %-18s | %-22s | %-3s | %-18s | %-18s | %-18s | %-18s | %-18s | %-18s | %-18s | %-18s | %-18s | %-18s | %-18s | %-18s\n",
1679 "step",
"time",
"mode",
"ref",
1680 "u_abs_l2",
"u_rel_l2",
"p_abs_l2",
"p_rel_l2",
1681 "mean_speed",
"spd_ref",
"spd_abs",
"spd_rel",
1682 "mean_ke",
"ke_ref",
"ke_abs",
"ke_rel");
1683 fprintf(f,
"----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n");
1686 fprintf(f,
"==================== Solution Convergence Log [mode: %s | period_steps: %d] ====================\n",
1689 fprintf(f,
"%-10s | %-18s | %-22s | %-3s | %-5s | %-5s | %-18s | %-18s | %-18s | %-18s | %-18s | %-18s | %-18s | %-18s | %-18s | %-18s | %-18s | %-18s\n",
1690 "step",
"time",
"mode",
"ref",
"ph",
"per",
1691 "u_abs_l2",
"u_rel_l2",
"p_abs_l2",
"p_rel_l2",
1692 "mean_speed",
"spd_ref",
"spd_abs",
"spd_rel",
1693 "mean_ke",
"ke_ref",
"ke_abs",
"ke_rel");
1694 fprintf(f,
"----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n");
1697 fprintf(f,
"==================== Solution Convergence Log [mode: %s | window_steps: %d] ====================\n",
1700 fprintf(f,
"%-10s | %-18s | %-22s | %-3s | %-5s | %-18s | %-18s | %-18s | %-18s | %-18s | %-18s | %-18s | %-18s | %-18s | %-18s | %-18s | %-18s | %-18s | %-18s | %-18s | %-18s\n",
1701 "step",
"time",
"mode",
"ref",
"win",
1702 "mean_speed",
"mean_ke",
1703 "spd_win",
"spd_win_prev",
"spd_win_abs",
"spd_win_rel",
1704 "spd_rms_win",
"spd_rms_abs",
"spd_rms_rel",
1705 "ke_win",
"ke_win_prev",
"ke_win_abs",
"ke_win_rel",
1706 "ke_rms_win",
"ke_rms_abs",
"ke_rms_rel");
1707 fprintf(f,
"------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------\n");
1713 fprintf(f,
"# Continuation from step %" PetscInt_FMT
"\n", simCtx->
StartStep);
1720 "%-10d | %-18.10e | %-22s | %-3d | %-18.10e | %-18.10e | %-18.10e | %-18.10e | %-18.10e | %-18.10e | %-18.10e | %-18.10e | %-18.10e | %-18.10e | %-18.10e | %-18.10e\n",
1721 (
int)simCtx->
step, (
double)simCtx->
ti, mode_str, has_reference ? 1 : 0,
1722 (double)u_abs_l2, (
double)u_rel_l2, (double)p_abs_l2, (
double)p_rel_l2,
1723 (double)mean_speed, (
double)mean_speed_reference,
1724 (double)mean_speed_abs_drift, (
double)mean_speed_rel_drift,
1725 (double)mean_ke, (
double)mean_ke_reference,
1726 (double)mean_ke_abs_drift, (
double)mean_ke_rel_drift);
1730 "%-10d | %-18.10e | %-22s | %-3d | %-5d | %-5d | %-18.10e | %-18.10e | %-18.10e | %-18.10e | %-18.10e | %-18.10e | %-18.10e | %-18.10e | %-18.10e | %-18.10e | %-18.10e | %-18.10e\n",
1731 (
int)simCtx->
step, (
double)simCtx->
ti, mode_str, has_reference ? 1 : 0,
1733 (double)u_abs_l2, (
double)u_rel_l2, (double)p_abs_l2, (
double)p_rel_l2,
1734 (double)mean_speed, (
double)mean_speed_reference,
1735 (double)mean_speed_abs_drift, (
double)mean_speed_rel_drift,
1736 (double)mean_ke, (
double)mean_ke_reference,
1737 (double)mean_ke_abs_drift, (
double)mean_ke_rel_drift);
1741 "%-10d | %-18.10e | %-22s | %-3d | %-5d | %-18.10e | %-18.10e | %-18.10e | %-18.10e | %-18.10e | %-18.10e | %-18.10e | %-18.10e | %-18.10e | %-18.10e | %-18.10e | %-18.10e | %-18.10e | %-18.10e | %-18.10e | %-18.10e\n",
1742 (
int)simCtx->
step, (
double)simCtx->
ti, mode_str, has_reference ? 1 : 0,
1744 (
double)mean_speed, (double)mean_ke,
1745 (
double)mean_speed_window, (double)mean_speed_window_prev,
1746 (
double)mean_speed_window_abs_drift, (double)mean_speed_window_rel_drift,
1747 (
double)mean_speed_rms_window,
1748 (double)mean_speed_rms_window_abs_drift, (
double)mean_speed_rms_window_rel_drift,
1749 (double)mean_ke_window, (
double)mean_ke_window_prev,
1750 (double)mean_ke_window_abs_drift, (
double)mean_ke_window_rel_drift,
1751 (double)mean_ke_rms_window,
1752 (
double)mean_ke_rms_window_abs_drift, (double)mean_ke_rms_window_rel_drift);
1760 phase_step >= 0 && phase_step < simCtx->solutionConvergencePeriodSteps) {
1762 for (PetscInt bi = 0; bi < simCtx->
block_number; ++bi) {
1763 PetscCall(VecCopy(user[bi].Ucat, user[bi].solutionConvergencePeriodicUcatRef[phase_step]));
1764 PetscCall(VecCopy(user[bi].P, user[bi].solutionConvergencePeriodicPRef[phase_step]));
1770 PetscFunctionReturn(0);
2351 PetscErrorCode ierr;
2355 Vec fieldVec = NULL;
2358 char data_layout[20];
2360 PetscFunctionBeginUser;
2363 if (strcasecmp(fieldName,
"Ucat") == 0) {
2364 fieldVec = user->
Ucat; dm = user->
fda; dof = 3; strcpy(data_layout,
"Cell-Centered");
2365 }
else if (strcasecmp(fieldName,
"P") == 0) {
2366 fieldVec = user->
P; dm = user->
da; dof = 1; strcpy(data_layout,
"Cell-Centered");
2367 }
else if (strcasecmp(fieldName,
"Diffusivity") == 0) {
2368 fieldVec = user->
Diffusivity; dm = user->
da; dof = 1; strcpy(data_layout,
"Cell-Centered");
2369 }
else if (strcasecmp(fieldName,
"DiffusivityGradient") == 0) {
2371 }
else if (strcasecmp(fieldName,
"Phi") == 0) {
2372 fieldVec = user->
Phi; dm = user->
da; dof = 1; strcpy(data_layout,
"Cell-Centered");
2373 }
else if (strcasecmp(fieldName,
"Nvert") == 0) {
2374 fieldVec = user->
Nvert; dm = user->
da; dof = 1; strcpy(data_layout,
"Cell-Centered");
2375 }
else if (strcasecmp(fieldName,
"Aj") == 0) {
2376 fieldVec = user->
Aj; dm = user->
da; dof = 1; strcpy(data_layout,
"Cell-Centered");
2377 }
else if (strcasecmp(fieldName,
"Cent") == 0 || strcasecmp(fieldName,
"Center-Coordinates") == 0) {
2378 fieldVec = user->
Cent; dm = user->
fda; dof = 3; strcpy(data_layout,
"Cell-Centered");
2379 }
else if (strcasecmp(fieldName,
"Ucont") == 0) {
2380 fieldVec = user->
lUcont; dm = user->
fda; dof = 3; strcpy(data_layout,
"Face-Centered");
2381 }
else if (strcasecmp(fieldName,
"Centx") == 0 || strcasecmp(fieldName,
"X-Face-Centers") == 0) {
2382 fieldVec = user->
Centx; dm = user->
fda; dof = 3; strcpy(data_layout,
"I-Face");
2383 }
else if (strcasecmp(fieldName,
"Centy") == 0 || strcasecmp(fieldName,
"Y-Face-Centers") == 0) {
2384 fieldVec = user->
Centy; dm = user->
fda; dof = 3; strcpy(data_layout,
"J-Face");
2385 }
else if (strcasecmp(fieldName,
"Centz") == 0 || strcasecmp(fieldName,
"Z-Face-Centers") == 0) {
2386 fieldVec = user->
Centz; dm = user->
fda; dof = 3; strcpy(data_layout,
"K-Face");
2387 }
else if (strcasecmp(fieldName,
"Csi") == 0 || strcasecmp(fieldName,
"ICsi") == 0 ||
2388 strcasecmp(fieldName,
"IEta") == 0 || strcasecmp(fieldName,
"IZet") == 0) {
2389 fieldVec = strcasecmp(fieldName,
"Csi") == 0 ? user->
Csi :
2390 (strcasecmp(fieldName,
"ICsi") == 0 ? user->
ICsi :
2391 (strcasecmp(fieldName,
"IEta") == 0 ? user->
IEta : user->
IZet));
2392 dm = user->
fda; dof = 3; strcpy(data_layout,
"I-Face");
2393 }
else if (strcasecmp(fieldName,
"Eta") == 0 || strcasecmp(fieldName,
"JCsi") == 0 ||
2394 strcasecmp(fieldName,
"JEta") == 0 || strcasecmp(fieldName,
"JZet") == 0) {
2395 fieldVec = strcasecmp(fieldName,
"Eta") == 0 ? user->
Eta :
2396 (strcasecmp(fieldName,
"JCsi") == 0 ? user->
JCsi :
2397 (strcasecmp(fieldName,
"JEta") == 0 ? user->
JEta : user->
JZet));
2398 dm = user->
fda; dof = 3; strcpy(data_layout,
"J-Face");
2399 }
else if (strcasecmp(fieldName,
"Zet") == 0 || strcasecmp(fieldName,
"KCsi") == 0 ||
2400 strcasecmp(fieldName,
"KEta") == 0 || strcasecmp(fieldName,
"KZet") == 0) {
2401 fieldVec = strcasecmp(fieldName,
"Zet") == 0 ? user->
Zet :
2402 (strcasecmp(fieldName,
"KCsi") == 0 ? user->
KCsi :
2403 (strcasecmp(fieldName,
"KEta") == 0 ? user->
KEta : user->
KZet));
2404 dm = user->
fda; dof = 3; strcpy(data_layout,
"K-Face");
2405 }
else if (strcasecmp(fieldName,
"IAj") == 0 || strcasecmp(fieldName,
"JAj") == 0 ||
2406 strcasecmp(fieldName,
"KAj") == 0) {
2407 fieldVec = strcasecmp(fieldName,
"IAj") == 0 ? user->
IAj :
2408 (strcasecmp(fieldName,
"JAj") == 0 ? user->
JAj : user->
KAj);
2409 dm = user->
da; dof = 1;
2410 strcpy(data_layout, strcasecmp(fieldName,
"IAj") == 0 ?
"I-Face" :
2411 (strcasecmp(fieldName,
"JAj") == 0 ?
"J-Face" :
"K-Face"));
2412 }
else if (strcasecmp(fieldName,
"Coordinates") == 0) {
2413 ierr = DMGetCoordinates(user->
da, &fieldVec); CHKERRQ(ierr);
2414 dm = user->
fda; dof = 3; strcpy(data_layout,
"Node-Centered");
2415 }
else if (strcasecmp(fieldName,
"Psi") == 0) {
2416 fieldVec = user->
Psi; dm = user->
da; dof = 1; strcpy(data_layout,
"Cell-Centered");
2418 SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_UNKNOWN_TYPE,
"Field %s not recognized.", fieldName);
2422 SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE,
"Vector for field '%s' is NULL.", fieldName);
2425 SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE,
"DM for field '%s' is NULL.", fieldName);
2428 ierr = DMDAGetLocalInfo(dm, &info); CHKERRQ(ierr);
2431 PetscInt i_start, i_end, j_start, j_end, k_start, k_end;
2433 if (strcmp(data_layout,
"Cell-Centered") == 0) {
2437 i_start = PetscMax(info.xs, 1); i_end = PetscMin(info.xs + info.xm, user->
IM);
2438 j_start = PetscMax(info.ys, 1); j_end = PetscMin(info.ys + info.ym, user->
JM);
2439 k_start = PetscMax(info.zs, 1); k_end = PetscMin(info.zs + info.zm, user->
KM);
2444 i_start = PetscMax(info.xs, 0); i_end = PetscMin(info.xs + info.xm, user->
IM);
2445 j_start = PetscMax(info.ys, 0); j_end = PetscMin(info.ys + info.ym, user->
JM);
2446 k_start = PetscMax(info.zs, 0); k_end = PetscMin(info.zs + info.zm, user->
KM);
2450 ierr = MPI_Barrier(PETSC_COMM_WORLD); CHKERRQ(ierr);
2452 PetscPrintf(PETSC_COMM_SELF,
"\n--- Field Ranges: [%s] (Layout: %s) ---\n", fieldName, data_layout);
2457 PetscReal localMin = PETSC_MAX_REAL, localMax = PETSC_MIN_REAL;
2458 PetscReal globalMin, globalMax;
2459 const PetscScalar ***array;
2461 ierr = DMDAVecGetArrayRead(dm, fieldVec, &array); CHKERRQ(ierr);
2462 for (k = k_start; k < k_end; k++) {
2463 for (j = j_start; j < j_end; j++) {
2464 for (i = i_start; i < i_end; i++) {
2465 localMin = PetscMin(localMin, array[k][j][i]);
2466 localMax = PetscMax(localMax, array[k][j][i]);
2470 ierr = DMDAVecRestoreArrayRead(dm, fieldVec, &array); CHKERRQ(ierr);
2472 ierr = MPI_Allreduce(&localMin, &globalMin, 1, MPIU_REAL, MPI_MIN, PETSC_COMM_WORLD); CHKERRQ(ierr);
2473 ierr = MPI_Allreduce(&localMax, &globalMax, 1, MPIU_REAL, MPI_MAX, PETSC_COMM_WORLD); CHKERRQ(ierr);
2475 PetscSynchronizedPrintf(PETSC_COMM_WORLD,
" [Rank %d] Local Range: [ %11.4e , %11.4e ]\n", user->
simCtx->
rank, localMin, localMax);
2476 ierr = PetscSynchronizedFlush(PETSC_COMM_WORLD, PETSC_STDOUT); CHKERRQ(ierr);
2478 PetscPrintf(PETSC_COMM_SELF,
" Global Range: [ %11.4e , %11.4e ]\n", globalMin, globalMax);
2481 }
else if (dof == 3) {
2482 Cmpnts localMin = {PETSC_MAX_REAL, PETSC_MAX_REAL, PETSC_MAX_REAL};
2483 Cmpnts localMax = {PETSC_MIN_REAL, PETSC_MIN_REAL, PETSC_MIN_REAL};
2484 Cmpnts globalMin, globalMax;
2487 ierr = DMDAVecGetArrayRead(dm, fieldVec, &array); CHKERRQ(ierr);
2488 for (k = k_start; k < k_end; k++) {
2489 for (j = j_start; j < j_end; j++) {
2490 for (i = i_start; i < i_end; i++) {
2491 localMin.
x = PetscMin(localMin.
x, array[k][j][i].
x);
2492 localMin.
y = PetscMin(localMin.
y, array[k][j][i].
y);
2493 localMin.
z = PetscMin(localMin.
z, array[k][j][i].
z);
2494 localMax.
x = PetscMax(localMax.
x, array[k][j][i].
x);
2495 localMax.
y = PetscMax(localMax.
y, array[k][j][i].
y);
2496 localMax.
z = PetscMax(localMax.
z, array[k][j][i].
z);
2500 ierr = DMDAVecRestoreArrayRead(dm, fieldVec, &array); CHKERRQ(ierr);
2502 ierr = MPI_Allreduce(&localMin, &globalMin, 3, MPIU_REAL, MPI_MIN, PETSC_COMM_WORLD); CHKERRQ(ierr);
2503 ierr = MPI_Allreduce(&localMax, &globalMax, 3, MPIU_REAL, MPI_MAX, PETSC_COMM_WORLD); CHKERRQ(ierr);
2505 ierr = PetscSynchronizedPrintf(PETSC_COMM_WORLD,
" [Rank %d] Local X-Range: [ %11.4e , %11.4e ]\n", user->
simCtx->
rank, localMin.
x, localMax.
x);
2506 ierr = PetscSynchronizedPrintf(PETSC_COMM_WORLD,
" [Rank %d] Local Y-Range: [ %11.4e , %11.4e ]\n", user->
simCtx->
rank, localMin.
y, localMax.
y);
2507 ierr = PetscSynchronizedPrintf(PETSC_COMM_WORLD,
" [Rank %d] Local Z-Range: [ %11.4e , %11.4e ]\n", user->
simCtx->
rank, localMin.
z, localMax.
z);
2508 ierr = PetscSynchronizedFlush(PETSC_COMM_WORLD, PETSC_STDOUT); CHKERRQ(ierr);
2511 PetscPrintf(PETSC_COMM_SELF,
" [Global] X-Range: [ %11.4e , %11.4e ]\n", globalMin.
x, globalMax.
x);
2512 PetscPrintf(PETSC_COMM_SELF,
" [Global] Y-Range: [ %11.4e , %11.4e ]\n", globalMin.
y, globalMax.
y);
2513 PetscPrintf(PETSC_COMM_SELF,
" [Global] Z-Range: [ %11.4e , %11.4e ]\n", globalMin.
z, globalMax.
z);
2517 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONG,
"LogFieldStatistics only supports fields with 1 or 3 components, but field '%s' has %" PetscInt_FMT
".", fieldName, dof);
2521 ierr = MPI_Barrier(PETSC_COMM_WORLD); CHKERRQ(ierr);
2523 PetscPrintf(PETSC_COMM_SELF,
"--------------------------------------------\n\n");
2526 PetscFunctionReturn(0);
2538 PetscErrorCode ierr;
2542 Vec vec_local = NULL;
2545 char data_layout[20];
2546 char dominant_dir =
'\0';
2548 PetscFunctionBeginUser;
2549 ierr = MPI_Comm_rank(PETSC_COMM_WORLD, &rank); CHKERRQ(ierr);
2552 if (strcasecmp(field_name,
"Ucat") == 0) {
2553 vec_local = user->
lUcat; dm = user->
fda; dof = 3; strcpy(data_layout,
"Cell-Centered");
2554 }
else if (strcasecmp(field_name,
"P") == 0) {
2555 vec_local = user->
lP; dm = user->
da; dof = 1; strcpy(data_layout,
"Cell-Centered");
2556 }
else if (strcasecmp(field_name,
"Diffusivity") == 0) {
2557 vec_local = user->
lDiffusivity; dm = user->
da; dof = 1; strcpy(data_layout,
"Cell-Centered");
2558 }
else if (strcasecmp(field_name,
"DiffusivityGradient") == 0) {
2560 }
else if (strcasecmp(field_name,
"Psi") == 0) {
2561 vec_local = user->
lPsi; dm = user->
da; dof = 1; strcpy(data_layout,
"Cell-Centered");
2562 }
else if (strcasecmp(field_name,
"Center-Coordinates") == 0) {
2563 vec_local = user->
lCent; dm = user->
fda; dof = 3; strcpy(data_layout,
"Cell-Centered");
2564 }
else if (strcasecmp(field_name,
"Ucont") == 0 ||
2565 strcasecmp(field_name,
"Ucont_o") == 0 ||
2566 strcasecmp(field_name,
"Ucont_rm1") == 0) {
2567 vec_local = strcasecmp(field_name,
"Ucont") == 0 ? user->
lUcont :
2569 dm = user->
fda; dof = 3; strcpy(data_layout,
"Face-Centered"); dominant_dir =
'm';
2570 }
else if (strcasecmp(field_name,
"Csi") == 0 || strcasecmp(field_name,
"X-Face-Centers") == 0 ||
2571 strcasecmp(field_name,
"ICsi") == 0 || strcasecmp(field_name,
"IEta") == 0 ||
2572 strcasecmp(field_name,
"IZet") == 0) {
2573 vec_local = strcasecmp(field_name,
"Csi") == 0 ? user->
lCsi :
2574 (strcasecmp(field_name,
"X-Face-Centers") == 0 ? user->
lCentx :
2575 (strcasecmp(field_name,
"ICsi") == 0 ? user->
lICsi :
2576 (strcasecmp(field_name,
"IEta") == 0 ? user->
lIEta : user->
lIZet)));
2577 dm = user->
fda; dof = 3; strcpy(data_layout,
"Face-Centered"); dominant_dir =
'x';
2578 }
else if (strcasecmp(field_name,
"Eta") == 0 || strcasecmp(field_name,
"Y-Face-Centers") == 0 ||
2579 strcasecmp(field_name,
"JCsi") == 0 || strcasecmp(field_name,
"JEta") == 0 ||
2580 strcasecmp(field_name,
"JZet") == 0) {
2581 vec_local = strcasecmp(field_name,
"Eta") == 0 ? user->
lEta :
2582 (strcasecmp(field_name,
"Y-Face-Centers") == 0 ? user->
lCenty :
2583 (strcasecmp(field_name,
"JCsi") == 0 ? user->
lJCsi :
2584 (strcasecmp(field_name,
"JEta") == 0 ? user->
lJEta : user->
lJZet)));
2585 dm = user->
fda; dof = 3; strcpy(data_layout,
"Face-Centered"); dominant_dir =
'y';
2586 }
else if (strcasecmp(field_name,
"Zet") == 0 || strcasecmp(field_name,
"Z-Face-Centers") == 0 ||
2587 strcasecmp(field_name,
"KCsi") == 0 || strcasecmp(field_name,
"KEta") == 0 ||
2588 strcasecmp(field_name,
"KZet") == 0) {
2589 vec_local = strcasecmp(field_name,
"Zet") == 0 ? user->
lZet :
2590 (strcasecmp(field_name,
"Z-Face-Centers") == 0 ? user->
lCentz :
2591 (strcasecmp(field_name,
"KCsi") == 0 ? user->
lKCsi :
2592 (strcasecmp(field_name,
"KEta") == 0 ? user->
lKEta : user->
lKZet)));
2593 dm = user->
fda; dof = 3; strcpy(data_layout,
"Face-Centered"); dominant_dir =
'z';
2594 }
else if (strcasecmp(field_name,
"Coordinates") == 0) {
2595 ierr = DMGetCoordinatesLocal(user->
da, &vec_local); CHKERRQ(ierr);
2596 dm = user->
fda; dof = 3; strcpy(data_layout,
"Node-Centered");
2597 }
else if (strcasecmp(field_name,
"CornerField")== 0){
2602 if(dof == 1) dm = user->
da;
2603 else dm = user->
fda;
2605 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONG,
"Unknown field name for LOG_FIELD_ANATOMY: %s", field_name);
2609 ierr = DMDAGetLocalInfo(dm, &info); CHKERRQ(ierr);
2611 ierr = PetscBarrier(NULL);
2612 PetscPrintf(PETSC_COMM_WORLD,
"\n--- Field Anatomy Log: [%s] | Stage: [%s] | Layout: [%s] ---\n", field_name, stage_name, data_layout);
2615 PetscInt im_phys = user->
IM;
2616 PetscInt jm_phys = user->
JM;
2617 PetscInt km_phys = user->
KM;
2620 PetscInt i_mid = (PetscInt)(info.xs + 0.5 * info.xm) - 1;
2621 PetscInt j_mid = (PetscInt)(info.ys + 0.5 * info.ym) - 1;
2622 PetscInt k_mid = (PetscInt)(info.zs + 0.5 * info.zm) - 1;
2629 if (strcmp(data_layout,
"Cell-Centered") == 0) {
2631 ierr = DMDAVecGetArrayRead(dm, vec_local, (
void*)&l_arr); CHKERRQ(ierr);
2636 PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"[Rank %d, I-DIR]: Idx %2d (Ghost for Cell[k][j][0]) = ", rank, 0);
2637 if(dof==1) PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"(%.5f)\n", ((
const PetscReal***)l_arr)[k_mid][j_mid][0]);
2638 else PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"(%.5f, %.5f, %.5f)\n", ((
const Cmpnts***)l_arr)[k_mid][j_mid][0].x, ((
const Cmpnts***)l_arr)[k_mid][j_mid][0].y, ((
const Cmpnts***)l_arr)[k_mid][j_mid][0].z);
2640 PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"[Rank %d, I-DIR]: Idx %2d (Value for Cell[k][j][0]) = ", rank, 1);
2641 if(dof==1) PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"(%.5f)\n", ((
const PetscReal***)l_arr)[k_mid][j_mid][1]);
2642 else PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"(%.5f, %.5f, %.5f)\n", ((
const Cmpnts***)l_arr)[k_mid][j_mid][1].x, ((
const Cmpnts***)l_arr)[k_mid][j_mid][1].y, ((
const Cmpnts***)l_arr)[k_mid][j_mid][1].z);
2644 if (info.xs + info.xm == info.mx) {
2645 PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"[Rank %d, I-DIR]: Idx %2d (Value for Cell[k][j][%d]) = ", rank, im_phys - 1, im_phys - 2);
2646 if(dof==1) PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"(%.5f)\n", ((
const PetscReal***)l_arr)[k_mid][j_mid][im_phys - 1]);
2647 else PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"(%.5f, %.5f, %.5f)\n", ((
const Cmpnts***)l_arr)[k_mid][j_mid][im_phys - 1].x, ((
const Cmpnts***)l_arr)[k_mid][j_mid][im_phys - 1].y, ((
const Cmpnts***)l_arr)[k_mid][j_mid][im_phys - 1].z);
2649 PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"[Rank %d, I-DIR]: Idx %2d (Ghost for Cell[k][j][%d]) = ", rank, im_phys, im_phys - 2);
2650 if(dof==1) PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"(%.5f)\n", ((
const PetscReal***)l_arr)[k_mid][j_mid][im_phys]);
2651 else PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"(%.5f, %.5f, %.5f)\n", ((
const Cmpnts***)l_arr)[k_mid][j_mid][im_phys].x, ((
const Cmpnts***)l_arr)[k_mid][j_mid][im_phys].y, ((
const Cmpnts***)l_arr)[k_mid][j_mid][im_phys].z);
2656 PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"[Rank %d, J-DIR]: Jdx %2d (Ghost for Cell[k][0][i]) = ", rank, 0);
2657 if(dof==1) PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"(%.5f)\n", ((
const PetscReal***)l_arr)[k_mid][0][i_mid]);
2658 else PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"(%.5f, %.5f, %.5f)\n", ((
const Cmpnts***)l_arr)[k_mid][0][i_mid].x, ((
const Cmpnts***)l_arr)[k_mid][0][i_mid].y, ((
const Cmpnts***)l_arr)[k_mid][0][i_mid].z);
2660 PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"[Rank %d, J-DIR]: Jdx %2d (Value for Cell[k][0][i]) = ", rank, 1);
2661 if(dof==1) PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"(%.5f)\n", ((
const PetscReal***)l_arr)[k_mid][1][i_mid]);
2662 else PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"(%.5f, %.5f, %.5f)\n", ((
const Cmpnts***)l_arr)[k_mid][1][i_mid].x, ((
const Cmpnts***)l_arr)[k_mid][1][i_mid].y, ((
const Cmpnts***)l_arr)[k_mid][1][i_mid].z);
2665 if (info.ys + info.ym == info.my) {
2666 PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"[Rank %d, J-DIR]: Jdx %2d (Value for Cell[k][%d][i]) = ", rank, jm_phys - 1, jm_phys - 2);
2667 if(dof==1) PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"(%.5f)\n", ((
const PetscReal***)l_arr)[k_mid][jm_phys - 1][i_mid]);
2668 else PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"(%.5f, %.5f, %.5f)\n", ((
const Cmpnts***)l_arr)[k_mid][jm_phys - 1][i_mid].x, ((
const Cmpnts***)l_arr)[k_mid][jm_phys - 1][i_mid].y, ((
const Cmpnts***)l_arr)[k_mid][jm_phys - 1][i_mid].z);
2670 PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"[Rank %d, J-DIR]: Jdx %2d (Ghost for Cell[k][%d][i]) = ", rank, jm_phys, jm_phys - 2);
2671 if(dof==1) PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"(%.5f)\n", ((
const PetscReal***)l_arr)[k_mid][jm_phys][i_mid]);
2672 else PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"(%.5f, %.5f, %.5f)\n", ((
const Cmpnts***)l_arr)[k_mid][jm_phys][i_mid].x, ((
const Cmpnts***)l_arr)[k_mid][jm_phys][i_mid].y, ((
const Cmpnts***)l_arr)[k_mid][jm_phys][i_mid].z);
2677 PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"[Rank %d, K-DIR]: Kdx %2d (Ghost for Cell[0][j][i]) = ", rank, 0);
2678 if(dof==1) PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"(%.5f)\n", ((
const PetscReal***)l_arr)[0][j_mid][i_mid]);
2679 else PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"(%.5f, %.5f, %.5f)\n", ((
const Cmpnts***)l_arr)[0][j_mid][i_mid].x, ((
const Cmpnts***)l_arr)[0][j_mid][i_mid].y, ((
const Cmpnts***)l_arr)[0][j_mid][i_mid].z);
2680 PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"[Rank %d, K-DIR]: Kdx %2d (Value for Cell[0][j][i]) = ", rank, 1);
2681 if(dof==1) PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"(%.5f)\n", ((
const PetscReal***)l_arr)[1][j_mid][i_mid]);
2682 else PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"(%.5f, %.5f, %.5f)\n", ((
const Cmpnts***)l_arr)[1][j_mid][i_mid].x, ((
const Cmpnts***)l_arr)[1][j_mid][i_mid].y, ((
const Cmpnts***)l_arr)[1][j_mid][i_mid].z);
2684 if (info.zs + info.zm == info.mz) {
2685 PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"[Rank %d, K-DIR]: Kdx %2d (Value for Cell[%d][j][i]) = ", rank, km_phys - 1, km_phys - 2);
2686 if(dof==1) PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"(%.5f)\n", ((
const PetscReal***)l_arr)[km_phys - 1][j_mid][i_mid]);
2687 else PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"(%.5f, %.5f, %.5f)\n", ((
const Cmpnts***)l_arr)[km_phys - 1][j_mid][i_mid].x, ((
const Cmpnts***)l_arr)[km_phys - 1][j_mid][i_mid].y, ((
const Cmpnts***)l_arr)[km_phys - 1][j_mid][i_mid].z);
2688 PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"[Rank %d, K-DIR]: Kdx %2d (Ghost for Cell[%d][j][i]) = ", rank, km_phys, km_phys - 2);
2689 if(dof==1) PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"(%.5f)\n", ((
const PetscReal***)l_arr)[km_phys][j_mid][i_mid]);
2690 else PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"(%.5f, %.5f, %.5f)\n", ((
const Cmpnts***)l_arr)[km_phys][j_mid][i_mid].x, ((
const Cmpnts***)l_arr)[km_phys][j_mid][i_mid].y, ((
const Cmpnts***)l_arr)[km_phys][j_mid][i_mid].z);
2692 ierr = DMDAVecRestoreArrayRead(dm, vec_local, (
void*)&l_arr); CHKERRQ(ierr);
2697 else if (strcmp(data_layout,
"Face-Centered") == 0) {
2699 ierr = DMDAVecGetArrayRead(dm, vec_local, (
void*)&l_arr); CHKERRQ(ierr);
2703 if (dominant_dir ==
'x') {
2704 PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"[Rank %d, I-DIR]: Idx %2d (First Phys. X-Face) = (%.5f, %.5f, %.5f)\n", rank, 0, l_arr[k_mid][j_mid][0].x, l_arr[k_mid][j_mid][0].y, l_arr[k_mid][j_mid][0].z);
2705 }
else if (dominant_dir ==
'y' || dominant_dir ==
'z') {
2706 PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"[Rank %d, I-DIR]: Idx %2d (Ghost for Cell[k][j][0]) = (%.5f, %.5f, %.5f)\n", rank, 0, l_arr[k_mid][j_mid][0].x, l_arr[k_mid][j_mid][0].y, l_arr[k_mid][j_mid][0].z);
2707 PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"[Rank %d, I-DIR]: Idx %2d (Value for Cell[k][j][0]) = (%.5f, %.5f, %.5f)\n", rank, 1, l_arr[k_mid][j_mid][1].x, l_arr[k_mid][j_mid][1].y, l_arr[k_mid][j_mid][1].z);
2708 }
else if (dominant_dir ==
'm') {
2709 PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"[Rank %d, I-DIR]: u-comp @ Idx %2d (1st X-Face) = %.5f\n", rank, 0, l_arr[k_mid][j_mid][0].x);
2712 if (info.xs + info.xm == info.mx) {
2713 if (dominant_dir ==
'x') {
2714 PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"[Rank %d, I-DIR]: Idx %2d (Last Phys. X-Face) = (%.5f, %.5f, %.5f)\n", rank, im_phys - 1, l_arr[k_mid][j_mid][im_phys - 1].x, l_arr[k_mid][j_mid][im_phys-1].y, l_arr[k_mid][j_mid][im_phys - 1].z);
2715 PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"[Rank %d, I-DIR]: Idx %2d (Ghost Location) = (%.5f, %.5f, %.5f)\n", rank, im_phys, l_arr[k_mid][j_mid][im_phys].x, l_arr[k_mid][j_mid][im_phys].y, l_arr[k_mid][j_mid][im_phys].z);
2716 }
else if (dominant_dir ==
'y' || dominant_dir ==
'z') {
2717 PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"[Rank %d, I-DIR]: Idx %2d (Value for Cell[k][j][%d]) = (%.5f, %.5f, %.5f)\n", rank, im_phys - 1, im_phys - 2, l_arr[k_mid][j_mid][im_phys - 1].x, l_arr[k_mid][j_mid][im_phys - 1].y, l_arr[k_mid][j_mid][im_phys-1].z);
2718 PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"[Rank %d, I-DIR]: Idx %2d (Ghost for Cell[k][j][%d]) = (%.5f, %.5f, %.5f)\n", rank, im_phys, im_phys - 2, l_arr[k_mid][j_mid][im_phys].x, l_arr[k_mid][j_mid][im_phys].y, l_arr[k_mid][j_mid][im_phys].z);
2719 }
else if (dominant_dir ==
'm') {
2720 PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"[Rank %d, I-DIR]: u-comp @ Idx %2d (Last X-Face) = %.5f\n", rank, im_phys - 1, l_arr[k_mid][j_mid][im_phys - 1].x);
2721 PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"[Rank %d, I-DIR]: u-comp @ Idx %2d (Ghost Location) = %.5f\n", rank, im_phys, l_arr[k_mid][j_mid][im_phys].x);
2727 if (dominant_dir ==
'y') {
2728 PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"[Rank %d, J-DIR]: Jdx %2d (First Phys. Y-Face) = (%.5f, %.5f, %.5f)\n", rank, 0, l_arr[k_mid][0][i_mid].x, l_arr[k_mid][0][i_mid].y, l_arr[k_mid][0][i_mid].z);
2729 }
else if (dominant_dir ==
'x' || dominant_dir ==
'z') {
2730 PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"[Rank %d, J-DIR]: Jdx %2d (Ghost for Cell[k][0][i]) = (%.5f, %.5f, %.5f)\n", rank, 0, l_arr[k_mid][0][i_mid].x, l_arr[k_mid][0][i_mid].y, l_arr[k_mid][0][i_mid].z);
2731 PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"[Rank %d, J-DIR]: Jdx %2d (Value for Cell[k][0][i]) = (%.5f, %.5f, %.5f)\n", rank, 1, l_arr[k_mid][1][i_mid].x, l_arr[k_mid][1][i_mid].y, l_arr[k_mid][1][i_mid].z);
2732 }
else if (dominant_dir ==
'm') {
2733 PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"[Rank %d, J-DIR]: v-comp @ Jdx %2d (1st Y-Face) = %.5f\n", rank, 0, l_arr[k_mid][0][i_mid].y);
2736 if (info.ys + info.ym == info.my) {
2737 if (dominant_dir ==
'y') {
2738 PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"[Rank %d, J-DIR]: Jdx %2d (Last Phys. Y-Face) = (%.5f, %.5f, %.5f)\n", rank, jm_phys - 1, l_arr[k_mid][jm_phys - 1][i_mid].x, l_arr[k_mid][jm_phys - 1][i_mid].y, l_arr[k_mid][jm_phys - 1][i_mid].z);
2739 PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"[Rank %d, J-DIR]: Jdx %2d (Ghost Location) = (%.5f, %.5f, %.5f)\n", rank, jm_phys, l_arr[k_mid][jm_phys][i_mid].x, l_arr[k_mid][jm_phys][i_mid].y, l_arr[k_mid][jm_phys][i_mid].z);
2740 }
else if (dominant_dir ==
'x' || dominant_dir ==
'z') {
2741 PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"[Rank %d, J-DIR]: Jdx %2d (Value for Cell[k][%d][i]) = (%.5f, %.5f, %.5f)\n", rank, jm_phys-1, jm_phys-2, l_arr[k_mid][jm_phys - 1][i_mid].x, l_arr[k_mid][jm_phys - 1][i_mid].y, l_arr[k_mid][jm_phys - 1][i_mid].z);
2742 PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"[Rank %d, J-DIR]: Jdx %2d (Ghost for Cell[k][%d][i]) = (%.5f, %.5f, %.5f)\n", rank, jm_phys, jm_phys-2, l_arr[k_mid][jm_phys][i_mid].x, l_arr[k_mid][jm_phys][i_mid].y, l_arr[k_mid][jm_phys][i_mid].z);
2743 }
else if (dominant_dir ==
'm') {
2744 PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"[Rank %d, J-DIR]: v-comp @ Jdx %2d (Last Y-Face) = %.5f\n", rank, jm_phys - 1, l_arr[k_mid][jm_phys - 1][i_mid].y);
2745 PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"[Rank %d, J-DIR]: v-comp @ Jdx %2d (Ghost Location) = %.5f\n", rank, jm_phys, l_arr[k_mid][jm_phys][i_mid].y);
2751 if (dominant_dir ==
'z') {
2752 PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"[Rank %d, K-DIR]: Kdx %2d (First Phys. Z-Face) = (%.5f, %.5f, %.5f)\n", rank, 0, l_arr[0][j_mid][i_mid].x, l_arr[0][j_mid][i_mid].y, l_arr[0][j_mid][i_mid].z);
2753 }
else if (dominant_dir ==
'x' || dominant_dir ==
'y') {
2754 PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"[Rank %d, K-DIR]: Kdx %2d (Ghost for Cell[0][j][i]) = (%.5f, %.5f, %.5f)\n", rank, 0, l_arr[0][j_mid][i_mid].x, l_arr[0][j_mid][i_mid].y, l_arr[0][j_mid][i_mid].z);
2755 PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"[Rank %d, K-DIR]: Kdx %2d (Value for Cell[0][j][i]) = (%.5f, %.5f, %.5f)\n", rank, 1, l_arr[1][j_mid][i_mid].x, l_arr[1][j_mid][i_mid].y, l_arr[1][j_mid][i_mid].z);
2756 }
else if (dominant_dir ==
'm') {
2757 PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"[Rank %d, K-DIR]: w-comp @ Idx %2d (1st Z-Face) = %.5f\n", rank, 0, l_arr[0][j_mid][i_mid].z);
2760 if (info.zs + info.zm == info.mz) {
2761 if (dominant_dir ==
'z') {
2762 PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"[Rank %d, K-DIR]: Idx %2d (Last Phys. Z-Face) = (%.5f, %.5f, %.5f)\n", rank, km_phys - 1, l_arr[km_phys - 1][j_mid][i_mid].x, l_arr[km_phys - 1][j_mid][i_mid].y, l_arr[km_phys - 1][j_mid][i_mid].z);
2763 PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"[Rank %d, K-DIR]: Idx %2d (Ghost Location) = (%.5f, %.5f, %.5f)\n", rank, km_phys, l_arr[km_phys][j_mid][i_mid].x, l_arr[km_phys][j_mid][i_mid].y, l_arr[km_phys][j_mid][i_mid].z);
2764 }
else if (dominant_dir ==
'x' || dominant_dir ==
'y') {
2765 PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"[Rank %d, K-DIR]: Idx %2d (Value for Cell[%d][j][i]) = (%.5f, %.5f, %.5f)\n", rank, km_phys-1, km_phys-2, l_arr[km_phys-1][j_mid][i_mid].x, l_arr[km_phys-1][j_mid][i_mid].y, l_arr[km_phys - 1][j_mid][i_mid].z);
2766 PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"[Rank %d, K-DIR]: Idx %2d (Ghost for Cell[%d][j][i]) = (%.5f, %.5f, %.5f)\n", rank, km_phys, km_phys-2, l_arr[km_phys][j_mid][i_mid].x, l_arr[km_phys][j_mid][i_mid].y, l_arr[km_phys][j_mid][i_mid].z);
2767 }
else if (dominant_dir ==
'm') {
2768 PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"[Rank %d, K-DIR]: w-comp @ Idx %2d (Last Z-Face) = %.5f\n", rank, km_phys - 1, l_arr[km_phys - 1][j_mid][i_mid].z);
2769 PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"[Rank %d, K-DIR]: w-comp @ Idx %2d (Ghost Loc.) = %.5f\n", rank, km_phys, l_arr[km_phys][j_mid][i_mid].z);
2773 ierr = DMDAVecRestoreArrayRead(dm, vec_local, (
void*)&l_arr); CHKERRQ(ierr);
2778 else if (strcmp(data_layout,
"Node-Centered") == 0) {
2780 ierr = DMDAVecGetArrayRead(dm, vec_local, (
void*)&l_arr); CHKERRQ(ierr);
2784 PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"[Rank %d, I-DIR]: Idx %2d (First Phys. Node) = (%.5f, %.5f, %.5f)\n", rank, 0, l_arr[k_mid][j_mid][0].x, l_arr[k_mid][j_mid][0].y, l_arr[k_mid][j_mid][0].z);
2786 if (info.xs + info.xm == info.mx) {
2787 PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"[Rank %d, I-DIR]: Idx %2d (Last Phys. Node) = (%.5f, %.5f, %.5f)\n", rank, im_phys - 1, l_arr[k_mid][j_mid][im_phys - 1].x, l_arr[k_mid][j_mid][im_phys - 1].y, l_arr[k_mid][j_mid][im_phys - 1].z);
2788 PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"[Rank %d, I-DIR]: Idx %2d (Unused/Ghost Loc) = (%.5f, %.5f, %.5f)\n", rank, im_phys, l_arr[k_mid][j_mid][im_phys].x, l_arr[k_mid][j_mid][im_phys].y, l_arr[k_mid][j_mid][im_phys].z);
2792 PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"[Rank %d, J-DIR]: Jdx %2d (First Phys. Node) = (%.5f, %.5f, %.5f)\n", rank, 0, l_arr[k_mid][0][i_mid].x, l_arr[k_mid][0][i_mid].y, l_arr[k_mid][0][i_mid].z);
2794 if (info.ys + info.ym == info.my) {
2795 PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"[Rank %d, J-DIR]: Jdx %2d (Last Phys. Node) = (%.5f, %.5f, %.5f)\n", rank, jm_phys - 1, l_arr[k_mid][jm_phys - 1][i_mid].x, l_arr[k_mid][jm_phys - 1][i_mid].y, l_arr[k_mid][jm_phys - 1][i_mid].z);
2796 PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"[Rank %d, J-DIR]: Jdx %2d (Unused/Ghost Loc) = (%.5f, %.5f, %.5f)\n", rank, jm_phys, l_arr[k_mid][jm_phys][i_mid].x, l_arr[k_mid][jm_phys][i_mid].y, l_arr[k_mid][jm_phys][i_mid].z);
2800 PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"[Rank %d, K-DIR]: Kdx %2d (First Phys. Node) = (%.5f, %.5f, %.5f)\n", rank, 0, l_arr[0][j_mid][i_mid].x, l_arr[0][j_mid][i_mid].y, l_arr[0][j_mid][i_mid].z);
2802 if(info.zs + info.zm == info.mz) {
2803 PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"[Rank %d, K-DIR]: Kdx %2d (Last Phys. Node) = (%.5f, %.5f, %.5f)\n", rank, km_phys - 1, l_arr[km_phys - 1][j_mid][i_mid].x, l_arr[km_phys - 1][j_mid][i_mid].y, l_arr[km_phys - 1][j_mid][i_mid].z);
2804 PetscSynchronizedPrintf(PETSC_COMM_WORLD,
"[Rank %d, K-DIR]: Kdx %2d (Unused/Ghost Loc) = (%.5f, %.5f, %.5f)\n", rank, km_phys, l_arr[km_phys][j_mid][i_mid].x, l_arr[km_phys][j_mid][i_mid].y, l_arr[km_phys][j_mid][i_mid].z);
2806 ierr = DMDAVecRestoreArrayRead(dm, vec_local, (
void*)&l_arr); CHKERRQ(ierr);
2809 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONG,
"LOG_FIELD_ANATOMY encountered an unknown data layout: %s", data_layout);
2812 ierr = PetscSynchronizedFlush(PETSC_COMM_WORLD, PETSC_STDOUT); CHKERRQ(ierr);
2813 ierr = PetscBarrier(NULL);
2814 PetscFunctionReturn(0);
2906 PetscErrorCode ierr;
2909 PetscInt xs, xe, ys, ye, zs, ze, mx, my, mz;
2910 PetscInt lxs, lxe, lys, lye, lzs, lze;
2911 Vec reference_vec = NULL;
2912 PetscReal ***psi = NULL;
2913 PetscReal ***psi_ref = NULL;
2914 PetscReal ***aj = NULL;
2915 PetscReal ***count = NULL;
2916 PetscReal *particle_psi = NULL;
2917 PetscInt nlocal = 0;
2918 PetscReal local_l1 = 0.0, global_l1 = 0.0;
2919 PetscReal local_l2_sq = 0.0, global_l2_sq = 0.0;
2920 PetscReal local_linf = 0.0, global_linf = 0.0;
2921 PetscReal local_ref_l2_sq = 0.0, global_ref_l2_sq = 0.0;
2922 PetscReal local_grid_integral = 0.0, global_grid_integral = 0.0;
2923 PetscReal local_domain_volume = 0.0, global_domain_volume = 0.0;
2924 PetscReal local_particle_sum = 0.0, global_particle_sum = 0.0;
2925 PetscInt64 local_particle_count = 0, global_particle_count = 0;
2926 PetscInt64 local_cell_count = 0, global_cell_count = 0;
2927 PetscInt64 local_occupied_count = 0, global_occupied_count = 0;
2928 PetscReal particle_integral = 0.0;
2929 PetscReal occupancy_fraction = 0.0;
2930 PetscReal mean_particles_per_occupied_cell = 0.0;
2931 PetscReal l2_error = 0.0;
2932 PetscReal relative_l2_error = 0.0;
2934 PetscFunctionBeginUser;
2935 if (!user) SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_NULL,
"UserCtx cannot be NULL.");
2938 PetscFunctionReturn(0);
2942 xs = info.xs; xe = info.xs + info.xm;
2943 ys = info.ys; ye = info.ys + info.ym;
2944 zs = info.zs; ze = info.zs + info.zm;
2945 mx = info.mx; my = info.my; mz = info.mz;
2946 lxs = (xs == 0) ? xs + 1 : xs; lxe = (xe == mx) ? xe - 1 : xe;
2947 lys = (ys == 0) ? ys + 1 : ys; lye = (ye == my) ? ye - 1 : ye;
2948 lzs = (zs == 0) ? zs + 1 : zs; lze = (ze == mz) ? ze - 1 : ze;
2950 ierr = VecDuplicate(user->
Psi, &reference_vec); CHKERRQ(ierr);
2953 ierr = DMDAVecGetArrayRead(user->
da, user->
Psi, &psi); CHKERRQ(ierr);
2954 ierr = DMDAVecGetArrayRead(user->
da, reference_vec, &psi_ref); CHKERRQ(ierr);
2955 ierr = DMDAVecGetArrayRead(user->
da, user->
Aj, &aj); CHKERRQ(ierr);
2956 ierr = DMDAVecGetArrayRead(user->
da, user->
ParticleCount, &count); CHKERRQ(ierr);
2958 for (PetscInt k = lzs; k < lze; ++k) {
2959 for (PetscInt j = lys; j < lye; ++j) {
2960 for (PetscInt i = lxs; i < lxe; ++i) {
2961 const PetscReal cell_volume = (PetscAbsReal(aj[k][j][i]) > 1.0e-14) ? (1.0 / aj[k][j][i]) : 0.0;
2962 const PetscReal err = psi[k][j][i] - psi_ref[k][j][i];
2963 local_cell_count += 1;
2964 local_domain_volume += cell_volume;
2965 local_grid_integral += psi[k][j][i] * cell_volume;
2966 local_l1 += PetscAbsReal(err) * cell_volume;
2967 local_l2_sq += err * err * cell_volume;
2968 local_ref_l2_sq += psi_ref[k][j][i] * psi_ref[k][j][i] * cell_volume;
2969 local_linf = PetscMax(local_linf, PetscAbsReal(err));
2970 if (count[k][j][i] > 0.0) local_occupied_count += 1;
2975 ierr = DMDAVecRestoreArrayRead(user->
da, user->
ParticleCount, &count); CHKERRQ(ierr);
2976 ierr = DMDAVecRestoreArrayRead(user->
da, user->
Aj, &aj); CHKERRQ(ierr);
2977 ierr = DMDAVecRestoreArrayRead(user->
da, reference_vec, &psi_ref); CHKERRQ(ierr);
2978 ierr = DMDAVecRestoreArrayRead(user->
da, user->
Psi, &psi); CHKERRQ(ierr);
2979 ierr = VecDestroy(&reference_vec); CHKERRQ(ierr);
2981 ierr = DMSwarmGetLocalSize(user->
swarm, &nlocal); CHKERRQ(ierr);
2982 local_particle_count = (PetscInt64)nlocal;
2984 ierr = DMSwarmGetField(user->
swarm,
"Psi", NULL, NULL, (
void **)&particle_psi); CHKERRQ(ierr);
2985 for (PetscInt p = 0; p < nlocal; ++p) local_particle_sum += particle_psi[p];
2986 ierr = DMSwarmRestoreField(user->
swarm,
"Psi", NULL, NULL, (
void **)&particle_psi); CHKERRQ(ierr);
2989 ierr = MPI_Allreduce(&local_l1, &global_l1, 1, MPIU_REAL, MPI_SUM, PETSC_COMM_WORLD); CHKERRMPI(ierr);
2990 ierr = MPI_Allreduce(&local_l2_sq, &global_l2_sq, 1, MPIU_REAL, MPI_SUM, PETSC_COMM_WORLD); CHKERRMPI(ierr);
2991 ierr = MPI_Allreduce(&local_linf, &global_linf, 1, MPIU_REAL, MPI_MAX, PETSC_COMM_WORLD); CHKERRMPI(ierr);
2992 ierr = MPI_Allreduce(&local_ref_l2_sq, &global_ref_l2_sq, 1, MPIU_REAL, MPI_SUM, PETSC_COMM_WORLD); CHKERRMPI(ierr);
2993 ierr = MPI_Allreduce(&local_grid_integral, &global_grid_integral, 1, MPIU_REAL, MPI_SUM, PETSC_COMM_WORLD); CHKERRMPI(ierr);
2994 ierr = MPI_Allreduce(&local_domain_volume, &global_domain_volume, 1, MPIU_REAL, MPI_SUM, PETSC_COMM_WORLD); CHKERRMPI(ierr);
2995 ierr = MPI_Allreduce(&local_particle_sum, &global_particle_sum, 1, MPIU_REAL, MPI_SUM, PETSC_COMM_WORLD); CHKERRMPI(ierr);
2996 ierr = MPI_Allreduce(&local_particle_count, &global_particle_count, 1, MPIU_INT64, MPI_SUM, PETSC_COMM_WORLD); CHKERRMPI(ierr);
2997 ierr = MPI_Allreduce(&local_cell_count, &global_cell_count, 1, MPIU_INT64, MPI_SUM, PETSC_COMM_WORLD); CHKERRMPI(ierr);
2998 ierr = MPI_Allreduce(&local_occupied_count, &global_occupied_count, 1, MPIU_INT64, MPI_SUM, PETSC_COMM_WORLD); CHKERRMPI(ierr);
3000 l2_error = PetscSqrtReal(global_l2_sq);
3001 relative_l2_error = (global_ref_l2_sq > 0.0) ? (l2_error / PetscSqrtReal(global_ref_l2_sq)) : 0.0;
3002 occupancy_fraction = (global_cell_count > 0) ? ((PetscReal)global_occupied_count / (PetscReal)global_cell_count) : 0.0;
3003 mean_particles_per_occupied_cell =
3004 (global_occupied_count > 0) ? ((PetscReal)global_particle_count / (PetscReal)global_occupied_count) : 0.0;
3006 (global_particle_count > 0) ? (global_domain_volume * global_particle_sum / (PetscReal)global_particle_count) : 0.0;
3008 if (simCtx->
rank == 0) {
3009 char csv_path[PETSC_MAX_PATH_LEN + 32];
3011 ierr = PetscSNPrintf(csv_path,
sizeof(csv_path),
"%s/scatter_metrics.csv", simCtx->
log_dir); CHKERRQ(ierr);
3012 f = fopen(csv_path,
"a");
3014 if (ftell(f) == 0) {
3016 "step,time,total_particles,total_cells,occupied_cells,occupancy_fraction,"
3017 "mean_particles_per_occupied_cell,particle_integral,grid_integral,"
3018 "conservation_error_abs,L1_error,L2_error,Linf_error,relative_L2_error\n");
3021 fprintf(f,
"# Continuation from step %" PetscInt_FMT
"\n", simCtx->
StartStep);
3023 fprintf(f,
"%d,%.6e,%lld,%lld,%lld,%.6e,%.6e,%.6e,%.6e,%.6e,%.6e,%.6e,%.6e,%.6e\n",
3026 (
long long)global_particle_count,
3027 (
long long)global_cell_count,
3028 (
long long)global_occupied_count,
3029 (
double)occupancy_fraction,
3030 (
double)mean_particles_per_occupied_cell,
3031 (
double)particle_integral,
3032 (
double)global_grid_integral,
3033 (
double)PetscAbsReal(global_grid_integral - particle_integral),
3036 (
double)global_linf,
3037 (
double)relative_l2_error);
3047 PetscFunctionReturn(0);