166 char control_filename[PETSC_MAX_PATH_LEN] =
"";
167 PetscBool control_flg;
168 PetscBool particle_console_output_freq_flg = PETSC_FALSE;
170 PetscFunctionBeginUser;
175 ierr = PetscNew(p_simCtx); CHKERRQ(ierr);
191 strcpy(simCtx->
log_dir,
"logs");
273 simCtx->
max_angle = -54. * 3.1415926 / 180.;
283 strcpy(simCtx->
grid_file,
"config/grid.run");
291 ierr = PetscMalloc1(1, &simCtx->
bcs_files); CHKERRQ(ierr);
292 ierr = PetscStrallocpy(
"config/bcs.run", &simCtx->
bcs_files[0]); CHKERRQ(ierr);
301 simCtx->
U_bc = 0.0; simCtx->
ccc = 0;
343 simCtx->
ibm = NULL; simCtx->
ibmv = NULL; simCtx->
fsi = NULL;
347 strcpy(simCtx->
allowedFile,
"config/whitelist.run");
348 simCtx->
useCfg = PETSC_FALSE;
383 ierr = PetscNew(&simCtx->
pps); CHKERRQ(ierr);
387 ierr = MPI_Comm_rank(PETSC_COMM_WORLD, &simCtx->
rank); CHKERRQ(ierr);
388 ierr = MPI_Comm_size(PETSC_COMM_WORLD, &simCtx->
size); CHKERRQ(ierr);
391 ierr = PetscOptionsGetString(NULL, NULL,
"-control_file", control_filename,
sizeof(control_filename), &control_flg); CHKERRQ(ierr);
394 if (!control_flg || strlen(control_filename) == 0) {
395 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONG,
396 "\n\n*** MANDATORY ARGUMENT MISSING ***\n"
397 "The -control_file argument was not provided.\n"
398 "This program must be launched with a configuration file.\n"
399 "Example: mpiexec -n 4 ./simulator -control_file /path/to/your/config.control\n"
400 "This is typically handled automatically by the 'picurv' script.\n");
404 LOG(
GLOBAL,
LOG_INFO,
"Loading mandatory configuration from: %s\n", control_filename);
405 ierr = PetscOptionsInsertFile(PETSC_COMM_WORLD, NULL, control_filename, PETSC_FALSE);
406 if (ierr == PETSC_ERR_FILE_OPEN) {
407 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_FILE_OPEN,
"The specified control file was not found or could not be opened: %s", control_filename);
412 PetscBool legacy_averaging = PETSC_FALSE;
413 ierr = PetscOptionsHasName(NULL, NULL,
"-averaging", &legacy_averaging); CHKERRQ(ierr);
414 PetscCheck(!legacy_averaging, PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONG,
415 "Legacy -averaging was removed. Use instantaneous output and offline "
416 "postprocessing until the replacement field-statistics pipeline is available.");
422 ierr = PetscOptionsGetString(NULL, NULL,
"-whitelist_config_file", simCtx->
allowedFile, PETSC_MAX_PATH_LEN, &simCtx->
useCfg); CHKERRQ(ierr);
428 PetscPrintf(PETSC_COMM_SELF,
"[%s] WARNING: Failed to load allowed functions from '%s'. Falling back to default list.\n", __func__, simCtx->
allowedFile);
429 simCtx->
useCfg = PETSC_FALSE;
432 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONG,
433 "Whitelist config file '%s' is empty. Omit -whitelist_config_file to use the default allow-list, or list at least one function.",
441 ierr = PetscStrallocpy(
"main", &simCtx->
allowedFuncs[0]); CHKERRQ(ierr);
442 ierr = PetscStrallocpy(
"CreateSimulationContext", &simCtx->
allowedFuncs[1]); CHKERRQ(ierr);
454 ierr = PetscOptionsGetString(NULL, NULL,
"-profiling_timestep_file", simCtx->
profilingTimestepFile, PETSC_MAX_PATH_LEN, NULL); CHKERRQ(ierr);
455 ierr = PetscOptionsGetBool(NULL, NULL,
"-profiling_final_summary", &simCtx->
profilingFinalSummary, NULL); CHKERRQ(ierr);
459 PetscPrintf(PETSC_COMM_SELF,
"[%s] WARNING: Unknown profiling timestep mode '%s'. Falling back to 'selected'.\n", __func__, simCtx->
profilingTimestepMode);
468 PetscPrintf(PETSC_COMM_SELF,
"[%s] WARNING: Failed to load selected profiling functions from '%s'. Falling back to default list.\n", __func__, simCtx->
profilingSelectedFuncsFile);
494 ierr = PetscOptionsGetInt(NULL, NULL,
"-start_step", &simCtx->
StartStep, NULL); CHKERRQ(ierr);
495 ierr = PetscOptionsGetInt(NULL,NULL,
"-totalsteps", &simCtx->
StepsToRun, NULL); CHKERRQ(ierr);
496 ierr = PetscOptionsGetBool(NULL, NULL,
"-only_setup", &simCtx->
OnlySetup, NULL); CHKERRQ(ierr);
497 ierr = PetscOptionsGetBool(NULL, NULL,
"-continue_mode", &simCtx->
continueMode, NULL); CHKERRQ(ierr);
502 ierr = PetscOptionsGetReal(NULL, NULL,
"-dt", &simCtx->
dt, NULL); CHKERRQ(ierr);
503 ierr = PetscOptionsGetInt(NULL, NULL,
"-tio", &simCtx->
tiout, NULL); CHKERRQ(ierr);
504 ierr = PetscOptionsGetInt(NULL, NULL,
"-particle_console_output_freq", &simCtx->
particleConsoleOutputFreq, &particle_console_output_freq_flg); CHKERRQ(ierr);
505 if (!particle_console_output_freq_flg) {
509 ierr = PetscOptionsGetString(NULL,NULL,
"-output_dir",simCtx->
output_dir,
sizeof(simCtx->
output_dir),NULL);CHKERRQ(ierr);
510 ierr = PetscOptionsGetString(NULL,NULL,
"-restart_dir",simCtx->
restart_dir,
sizeof(simCtx->
restart_dir),NULL);CHKERRQ(ierr);
511 ierr = PetscOptionsGetString(NULL,NULL,
"-log_dir",simCtx->
log_dir,
sizeof(simCtx->
log_dir),NULL);CHKERRQ(ierr);
512 ierr = PetscOptionsGetBool(NULL, NULL,
"-walltime_guard_enabled", &simCtx->
walltimeGuardEnabled, NULL); CHKERRQ(ierr);
513 ierr = PetscOptionsGetInt(NULL, NULL,
"-walltime_guard_warmup_steps", &simCtx->
walltimeGuardWarmupSteps, NULL); CHKERRQ(ierr);
514 ierr = PetscOptionsGetReal(NULL, NULL,
"-walltime_guard_multiplier", &simCtx->
walltimeGuardMultiplier, NULL); CHKERRQ(ierr);
515 ierr = PetscOptionsGetBool(NULL, NULL,
"-runtime_memory_log_enabled", &simCtx->
runtimeMemoryLogEnabled, NULL); CHKERRQ(ierr);
516 ierr = PetscOptionsGetString(NULL, NULL,
"-runtime_memory_log_file", simCtx->
runtimeMemoryLogFile, PETSC_MAX_PATH_LEN, NULL); CHKERRQ(ierr);
517 ierr = PetscOptionsGetReal(NULL, NULL,
"-walltime_guard_min_seconds", &simCtx->
walltimeGuardMinSeconds, NULL); CHKERRQ(ierr);
518 ierr = PetscOptionsGetReal(NULL, NULL,
"-walltime_guard_estimator_alpha", &simCtx->
walltimeGuardEstimatorAlpha, NULL); CHKERRQ(ierr);
521 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONG,
"Invalid value for -walltime_guard_warmup_steps: %d. Must be > 0.", simCtx->
walltimeGuardWarmupSteps);
524 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONG,
"Invalid value for -walltime_guard_multiplier: %.6f. Must be in (0, 5].", (
double)simCtx->
walltimeGuardMultiplier);
527 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONG,
"Invalid value for -walltime_guard_min_seconds: %.6f. Must be > 0.", (
double)simCtx->
walltimeGuardMinSeconds);
530 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONG,
"Invalid value for -walltime_guard_estimator_alpha: %.6f. Must be in (0, 1].", (
double)simCtx->
walltimeGuardEstimatorAlpha);
534 SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_ARG_WRONG,
"Invalid value for -euler_field_source. Must be 'load','analytical' or 'solve'. You provided '%s'.",simCtx->
eulerianSource);
537 const char *job_start_env = getenv(
"PICURV_JOB_START_EPOCH");
538 const char *limit_env = getenv(
"PICURV_WALLTIME_LIMIT_SECONDS");
542 if (!job_start_ok || !limit_ok) {
549 "Runtime walltime guard enabled but %s/%s are missing or invalid. Falling back to external shutdown signals only.\n",
550 "PICURV_JOB_START_EPOCH",
551 "PICURV_WALLTIME_LIMIT_SECONDS"
560 ierr = PetscOptionsGetInt(NULL, NULL,
"-imm", &simCtx->
immersed, NULL); CHKERRQ(ierr);
561 ierr = PetscOptionsGetInt(NULL, NULL,
"-fsi", &simCtx->
movefsi, NULL); CHKERRQ(ierr);
562 ierr = PetscOptionsGetInt(NULL, NULL,
"-rfsi", &simCtx->
rotatefsi, NULL); CHKERRQ(ierr);
563 ierr = PetscOptionsGetInt(NULL, NULL,
"-sediment", &simCtx->
sediment, NULL); CHKERRQ(ierr);
564 ierr = PetscOptionsGetInt(NULL, NULL,
"-rheology", &simCtx->
rheology, NULL); CHKERRQ(ierr);
565 ierr = PetscOptionsGetInt(NULL, NULL,
"-inv", &simCtx->
invicid, NULL); CHKERRQ(ierr);
566 ierr = PetscOptionsGetInt(NULL, NULL,
"-TwoD", &simCtx->
TwoD, NULL); CHKERRQ(ierr);
567 ierr = PetscOptionsGetInt(NULL, NULL,
"-thin", &simCtx->
thin, NULL); CHKERRQ(ierr);
568 ierr = PetscOptionsGetInt(NULL, NULL,
"-mframe", &simCtx->
moveframe, NULL); CHKERRQ(ierr);
569 ierr = PetscOptionsGetInt(NULL, NULL,
"-rframe", &simCtx->
rotateframe, NULL); CHKERRQ(ierr);
570 ierr = PetscOptionsGetInt(NULL, NULL,
"-blk", &simCtx->
blank, NULL); CHKERRQ(ierr);
571 ierr = PetscOptionsGetInt(NULL, NULL,
"-dgf_z", &simCtx->
dgf_z, NULL); CHKERRQ(ierr);
572 ierr = PetscOptionsGetInt(NULL, NULL,
"-dgf_y", &simCtx->
dgf_y, NULL); CHKERRQ(ierr);
573 ierr = PetscOptionsGetInt(NULL, NULL,
"-dgf_x", &simCtx->
dgf_x, NULL); CHKERRQ(ierr);
574 ierr = PetscOptionsGetInt(NULL, NULL,
"-dgf_az", &simCtx->
dgf_az, NULL); CHKERRQ(ierr);
575 ierr = PetscOptionsGetInt(NULL, NULL,
"-dgf_ay", &simCtx->
dgf_ay, NULL); CHKERRQ(ierr);
576 ierr = PetscOptionsGetInt(NULL, NULL,
"-dgf_ax", &simCtx->
dgf_ax, NULL); CHKERRQ(ierr);
581 ierr = PetscOptionsGetInt(NULL, NULL,
"-cop", &simCtx->
cop, NULL); CHKERRQ(ierr);
582 ierr = PetscOptionsGetInt(NULL, NULL,
"-fish", &simCtx->
fish, NULL); CHKERRQ(ierr);
583 ierr = PetscOptionsGetInt(NULL, NULL,
"-pizza", &simCtx->
pizza, NULL); CHKERRQ(ierr);
584 ierr = PetscOptionsGetInt(NULL, NULL,
"-turbine", &simCtx->
turbine, NULL); CHKERRQ(ierr);
585 ierr = PetscOptionsGetInt(NULL, NULL,
"-fishcyl", &simCtx->
fishcyl, NULL); CHKERRQ(ierr);
586 ierr = PetscOptionsGetInt(NULL, NULL,
"-eel", &simCtx->
eel, NULL); CHKERRQ(ierr);
587 ierr = PetscOptionsGetInt(NULL, NULL,
"-cstart", &simCtx->
fish_c, NULL); CHKERRQ(ierr);
588 ierr = PetscOptionsGetInt(NULL, NULL,
"-wing", &simCtx->
wing, NULL); CHKERRQ(ierr);
589 ierr = PetscOptionsGetInt(NULL, NULL,
"-mhv", &simCtx->
MHV, NULL); CHKERRQ(ierr);
590 ierr = PetscOptionsGetInt(NULL, NULL,
"-hydro", &simCtx->
hydro, NULL); CHKERRQ(ierr);
591 ierr = PetscOptionsGetInt(NULL, NULL,
"-lv", &simCtx->
LV, NULL); CHKERRQ(ierr);
592 ierr = PetscOptionsGetInt(NULL, NULL,
"-Pipe", &simCtx->
Pipe, NULL); CHKERRQ(ierr);
593 ierr = PetscOptionsGetInt(NULL, NULL,
"-Turbulent_Channel_z", &simCtx->
channelz, NULL); CHKERRQ(ierr);
594 ierr = PetscOptionsGetReal(NULL,NULL,
"-driven_flow_initial_force",&simCtx->
drivingForceMagnitude,NULL);CHKERRQ(ierr);
595 ierr = PetscOptionsGetReal(NULL,NULL,
"-driven_flow_scaling_factor",&simCtx->
forceScalingFactor,NULL);CHKERRQ(ierr);
598 char mom_solver_type_char[PETSC_MAX_PATH_LEN];
599 char solution_convergence_mode_char[PETSC_MAX_PATH_LEN];
600 PetscBool mom_solver_type_flg = PETSC_FALSE;
601 PetscBool solution_convergence_mode_flg = PETSC_FALSE;
602 ierr = PetscOptionsGetString(NULL, NULL,
"-mom_solver_type", mom_solver_type_char,
sizeof(mom_solver_type_char), &mom_solver_type_flg); CHKERRQ(ierr);
603 ierr = PetscOptionsGetInt(NULL, NULL,
"-mom_max_pseudo_steps", &simCtx->
mom_max_pseudo_steps, NULL); CHKERRQ(ierr);
604 ierr = PetscOptionsGetReal(NULL, NULL,
"-mom_atol", &simCtx->
mom_atol, NULL); CHKERRQ(ierr);
605 ierr = PetscOptionsGetReal(NULL, NULL,
"-mom_rtol", &simCtx->
mom_rtol, NULL); CHKERRQ(ierr);
606 ierr = PetscOptionsGetReal(NULL, NULL,
"-mom_resid_atol", &simCtx->
mom_resid_atol, NULL); CHKERRQ(ierr);
607 ierr = PetscOptionsGetReal(NULL, NULL,
"-mom_resid_rtol", &simCtx->
mom_resid_rtol, NULL); CHKERRQ(ierr);
608 ierr = PetscOptionsGetReal(NULL, NULL,
"-imp_stol", &simCtx->
imp_stol, NULL); CHKERRQ(ierr);
609 ierr = PetscOptionsGetInt(NULL, NULL,
"-central", &simCtx->
central, NULL); CHKERRQ(ierr);
610 ierr = PetscOptionsGetString(NULL, NULL,
"-solution_convergence_mode",
611 solution_convergence_mode_char,
sizeof(solution_convergence_mode_char),
612 &solution_convergence_mode_flg); CHKERRQ(ierr);
613 ierr = PetscOptionsGetBool(NULL, NULL,
"-solution_convergence_enabled", &simCtx->
solutionConvergenceEnabled, NULL); CHKERRQ(ierr);
623 if (mom_solver_type_flg) {
624 if(strcmp(mom_solver_type_char,
"DUALTIME_PICARD_JAMESON_RK") == 0 ||
625 strcmp(mom_solver_type_char,
"DUALTIME_PICARD_RK4") == 0) {
627 }
else if (strcmp(mom_solver_type_char,
"EXPLICIT_RK") == 0) {
629 }
else if (strcmp(mom_solver_type_char,
"newton_krylov") == 0) {
632 LOG(
GLOBAL,
LOG_ERROR,
"Invalid value for -mom_solver_type: '%s'. Valid options are: 'DUALTIME_PICARD_JAMESON_RK', 'EXPLICIT_RK', 'newton_krylov'.\n", mom_solver_type_char);
633 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONG,
"Invalid value for -mom_solver_type: '%s'.", mom_solver_type_char);
637 if (solution_convergence_mode_flg) {
638 if (strcmp(solution_convergence_mode_char,
"STEADY_DETERMINISTIC") == 0) {
640 }
else if (strcmp(solution_convergence_mode_char,
"PERIODIC_DETERMINISTIC") == 0) {
642 }
else if (strcmp(solution_convergence_mode_char,
"STATISTICAL_STEADY") == 0) {
644 }
else if (strcmp(solution_convergence_mode_char,
"TRANSIENT") == 0) {
647 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONG,
648 "Invalid value for -solution_convergence_mode: '%s'.", solution_convergence_mode_char);
654 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONG,
655 "solution convergence mode PERIODIC_DETERMINISTIC requires -solution_convergence_period_steps > 0.");
659 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONG,
660 "solution convergence mode STATISTICAL_STEADY requires -solution_convergence_window_steps > 0.");
664 ierr = PetscOptionsGetInt(NULL, NULL,
"-mg_level", &simCtx->
mglevels, NULL); CHKERRQ(ierr);
665 ierr = PetscOptionsGetInt(NULL, NULL,
"-mg_max_it", &simCtx->
mg_MAX_IT, NULL); CHKERRQ(ierr);
666 ierr = PetscOptionsGetInt(NULL, NULL,
"-mg_idx", &simCtx->
mg_idx, NULL); CHKERRQ(ierr);
667 ierr = PetscOptionsGetInt(NULL, NULL,
"-mg_pre_it", &simCtx->
mg_preItr, NULL); CHKERRQ(ierr);
668 ierr = PetscOptionsGetInt(NULL, NULL,
"-mg_post_it", &simCtx->
mg_poItr, NULL); CHKERRQ(ierr);
671 ierr = PetscOptionsGetInt(NULL, NULL,
"-poisson", &simCtx->
poisson, NULL); CHKERRQ(ierr);
672 ierr = PetscOptionsGetReal(NULL, NULL,
"-poisson_tol", &simCtx->
poisson_tol, NULL); CHKERRQ(ierr);
673 ierr = PetscOptionsGetInt(NULL, NULL,
"-str", &simCtx->
STRONG_COUPLING, NULL); CHKERRQ(ierr);
674 ierr = PetscOptionsGetReal(NULL, NULL,
"-ren", &simCtx->
ren, NULL); CHKERRQ(ierr);
675 ierr = PetscOptionsGetReal(NULL, NULL,
"-pseudo_cfl", &simCtx->
pseudo_cfl, NULL); CHKERRQ(ierr);
676 ierr = PetscOptionsGetReal(NULL, NULL,
"-max_pseudo_cfl", &simCtx->
max_pseudo_cfl, NULL); CHKERRQ(ierr);
677 ierr = PetscOptionsGetReal(NULL, NULL,
"-min_pseudo_cfl", &simCtx->
min_pseudo_cfl, NULL); CHKERRQ(ierr);
679 ierr = PetscOptionsGetReal(NULL, NULL,
"-pseudo_cfl_growth_factor", &simCtx->
pseudo_cfl_growth_factor, NULL); CHKERRQ(ierr);
683 ierr = PetscOptionsGetBool(NULL, NULL,
"-no_pseudo_cfl_backtrack", &simCtx->
no_pseudo_cfl_backtrack, NULL); CHKERRQ(ierr);
684 ierr = PetscOptionsGetReal(NULL, NULL,
"-mom_ratio_ema_alpha", &simCtx->
mom_ratio_ema_alpha, NULL); CHKERRQ(ierr);
688 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_OUTOFRANGE,
689 "Pseudo-CFL controls require 0 < minimum <= initial <= maximum.");
695 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_OUTOFRANGE,
696 "Pseudo-CFL controls require growth_factor >= 1, 0 < reduction_factor < 1, and noise allowance >= 1.");
699 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_OUTOFRANGE,
700 "-mom_ratio_ema_alpha must be in [0, 1].");
703 ierr = PetscOptionsGetBool(NULL, NULL,
"-mom_nk_pic_monitor", &simCtx->
mom_nk_monitor_history, NULL); CHKERRQ(ierr);
707 ierr = PetscOptionsGetInt(NULL, NULL,
"-finit", &ic_mode, NULL); CHKERRQ(ierr);
708 ierr = PetscOptionsGetInt(NULL, NULL,
"-ic_field", &ic_field, NULL); CHKERRQ(ierr);
715 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_OUTOFRANGE,
716 "Invalid value for -finit. Expected an initial-condition mode in [0,4], got %d.",
720 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_OUTOFRANGE,
721 "Invalid value for -ic_field. Expected 0 (Ucat) or 1 (Ucont), got %d.",
724 ierr = PetscOptionsGetReal(NULL, NULL,
"-ucont_x", &simCtx->
InitialConstantContra.
x, NULL); CHKERRQ(ierr);
725 ierr = PetscOptionsGetReal(NULL, NULL,
"-ucont_y", &simCtx->
InitialConstantContra.
y, NULL); CHKERRQ(ierr);
726 ierr = PetscOptionsGetReal(NULL, NULL,
"-ucont_z", &simCtx->
InitialConstantContra.
z, NULL); CHKERRQ(ierr);
729 PetscBool fd_set = PETSC_FALSE;
730 ierr = PetscOptionsGetInt(NULL, NULL,
"-flow_direction", &fd_int, &fd_set); CHKERRQ(ierr);
733 ierr = PetscOptionsGetReal(NULL, NULL,
"-ic_velocity_physical", &simCtx->
icVelocityPhysical, NULL); CHKERRQ(ierr);
737 PetscBool verification_scalar_value_set = PETSC_FALSE;
738 PetscBool verification_scalar_phi0_set = PETSC_FALSE;
739 PetscBool verification_scalar_slope_x_set = PETSC_FALSE;
740 PetscBool verification_scalar_amplitude_set = PETSC_FALSE;
741 PetscBool verification_scalar_kx_set = PETSC_FALSE;
742 PetscBool verification_scalar_ky_set = PETSC_FALSE;
743 PetscBool verification_scalar_kz_set = PETSC_FALSE;
744 ierr = PetscOptionsGetString(NULL, NULL,
"-verification_diffusivity_mode",
747 ierr = PetscOptionsGetString(NULL, NULL,
"-verification_diffusivity_profile",
750 ierr = PetscOptionsGetReal(NULL, NULL,
"-verification_diffusivity_gamma0",
752 ierr = PetscOptionsGetReal(NULL, NULL,
"-verification_diffusivity_slope_x",
754 ierr = PetscOptionsGetString(NULL, NULL,
"-verification_scalar_mode",
757 ierr = PetscOptionsGetString(NULL, NULL,
"-verification_scalar_profile",
760 ierr = PetscOptionsGetReal(NULL, NULL,
"-verification_scalar_value",
762 ierr = PetscOptionsGetReal(NULL, NULL,
"-verification_scalar_phi0",
764 ierr = PetscOptionsGetReal(NULL, NULL,
"-verification_scalar_slope_x",
766 ierr = PetscOptionsGetReal(NULL, NULL,
"-verification_scalar_amplitude",
768 ierr = PetscOptionsGetReal(NULL, NULL,
"-verification_scalar_kx",
770 ierr = PetscOptionsGetReal(NULL, NULL,
"-verification_scalar_ky",
772 ierr = PetscOptionsGetReal(NULL, NULL,
"-verification_scalar_kz",
782 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONGSTATE,
783 "verification diffusivity overrides require -euler_field_source \"analytical\".");
786 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONG,
787 "Unsupported -verification_diffusivity_mode '%s'. Only 'analytical' is supported.",
791 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONG,
792 "Unsupported -verification_diffusivity_profile '%s'. Only 'LINEAR_X' is supported.",
798 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONGSTATE,
799 "verification scalar overrides require -euler_field_source \"analytical\".");
802 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONG,
803 "Unsupported -verification_scalar_mode '%s'. Only 'analytical' is supported.",
807 if (!verification_scalar_value_set) {
808 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONG,
809 "verification scalar profile CONSTANT requires -verification_scalar_value.");
812 if (!verification_scalar_phi0_set || !verification_scalar_slope_x_set) {
813 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONG,
814 "verification scalar profile LINEAR_X requires -verification_scalar_phi0 and -verification_scalar_slope_x.");
817 if (!verification_scalar_amplitude_set || !verification_scalar_kx_set ||
818 !verification_scalar_ky_set || !verification_scalar_kz_set) {
819 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONG,
820 "verification scalar profile SIN_PRODUCT requires -verification_scalar_amplitude, -verification_scalar_kx, -verification_scalar_ky, and -verification_scalar_kz.");
823 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONG,
824 "Unsupported -verification_scalar_profile '%s'. Supported profiles: CONSTANT, LINEAR_X, SIN_PRODUCT.",
832 ierr = PetscOptionsGetReal(NULL,NULL,
"-schmidt_number",&simCtx->
schmidt_number,NULL);CHKERRQ(ierr);
834 ierr = PetscOptionsGetInt(NULL, NULL,
"-no_of_bodies", &simCtx->
NumberOfBodies, NULL); CHKERRQ(ierr);
835 ierr = PetscOptionsGetReal(NULL,NULL,
"-wall_roughness",&simCtx->
wall_roughness_height,NULL);CHKERRQ(ierr);
844 ierr = PetscOptionsGetInt(NULL, NULL,
"-nblk", &simCtx->
block_number, NULL); CHKERRQ(ierr);
845 ierr = PetscOptionsGetInt(NULL, NULL,
"-inlet", &simCtx->
inletprofile, NULL); CHKERRQ(ierr);
846 ierr = PetscOptionsGetInt(NULL, NULL,
"-Ogrid", &simCtx->
Ogrid, NULL); CHKERRQ(ierr);
848 ierr = PetscOptionsGetInt(NULL, NULL,
"-grid1d", &simCtx->
grid1d, NULL); CHKERRQ(ierr);
849 ierr = PetscOptionsGetBool(NULL, NULL,
"-grid", &simCtx->
generate_grid, NULL); CHKERRQ(ierr);
850 ierr = PetscOptionsGetString(NULL, NULL,
"-grid_file", simCtx->
grid_file, PETSC_MAX_PATH_LEN, NULL); CHKERRQ(ierr);
851 ierr = PetscOptionsGetInt(NULL, NULL,
"-da_processors_x", &simCtx->
da_procs_x, NULL); CHKERRQ(ierr);
852 ierr = PetscOptionsGetInt(NULL, NULL,
"-da_processors_y", &simCtx->
da_procs_y, NULL); CHKERRQ(ierr);
853 ierr = PetscOptionsGetInt(NULL, NULL,
"-da_processors_z", &simCtx->
da_procs_z, NULL); CHKERRQ(ierr);
854 ierr = PetscOptionsGetInt(NULL, NULL,
"-pbc_domain", &simCtx->
blkpbc, NULL); CHKERRQ(ierr);
856 ierr = PetscOptionsGetReal(NULL, NULL,
"-grid_rotation_angle", &simCtx->
grid_rotation_angle, NULL); CHKERRQ(ierr);
857 ierr = PetscOptionsGetReal(NULL, NULL,
"-Croty", &simCtx->
Croty, NULL); CHKERRQ(ierr);
858 ierr = PetscOptionsGetReal(NULL, NULL,
"-Crotz", &simCtx->
Crotz, NULL); CHKERRQ(ierr);
860 char file_list_str[PETSC_MAX_PATH_LEN * 10];
862 ierr = PetscOptionsGetString(NULL, NULL,
"-bcs_files", file_list_str,
sizeof(file_list_str), &bcs_flg); CHKERRQ(ierr);
863 ierr = PetscOptionsGetReal(NULL, NULL,
"-U_bc", &simCtx->
U_bc, NULL); CHKERRQ(ierr);
869 ierr = PetscFree(simCtx->
bcs_files[0]); CHKERRQ(ierr);
870 ierr = PetscFree(simCtx->
bcs_files); CHKERRQ(ierr);
877 ierr = PetscStrallocpy(file_list_str, &str_copy); CHKERRQ(ierr);
880 token = strtok(str_copy,
",");
883 token = strtok(NULL,
",");
885 ierr = PetscFree(str_copy); CHKERRQ(ierr);
889 ierr = PetscStrallocpy(file_list_str, &str_copy); CHKERRQ(ierr);
890 token = strtok(str_copy,
",");
892 ierr = PetscStrallocpy(token, &simCtx->
bcs_files[i]); CHKERRQ(ierr);
893 token = strtok(NULL,
",");
895 ierr = PetscFree(str_copy); CHKERRQ(ierr);
901 PetscInt temp_les_model;
902 ierr = PetscOptionsGetInt(NULL, NULL,
"-les", &temp_les_model, NULL); CHKERRQ(ierr);
904 ierr = PetscOptionsGetInt(NULL, NULL,
"-rans", &simCtx->
rans, NULL); CHKERRQ(ierr);
905 ierr = PetscOptionsGetInt(NULL, NULL,
"-wallfunction", &simCtx->
wallfunction, NULL); CHKERRQ(ierr);
906 ierr = PetscOptionsGetInt(NULL, NULL,
"-mixed", &simCtx->
mixed, NULL); CHKERRQ(ierr);
907 ierr = PetscOptionsGetInt(NULL, NULL,
"-clark", &simCtx->
clark, NULL); CHKERRQ(ierr);
908 ierr = PetscOptionsGetInt(NULL, NULL,
"-dynamic_freq", &simCtx->
dynamic_freq, NULL); CHKERRQ(ierr);
909 ierr = PetscOptionsGetReal(NULL, NULL,
"-max_cs", &simCtx->
max_cs, NULL); CHKERRQ(ierr);
910 ierr = PetscOptionsGetReal(NULL, NULL,
"-const_cs", &simCtx->
Const_CS, NULL); CHKERRQ(ierr);
911 ierr = PetscOptionsGetInt(NULL, NULL,
"-testfilter_ik", &simCtx->
testfilter_ik, NULL); CHKERRQ(ierr);
912 ierr = PetscOptionsGetInt(NULL, NULL,
"-testfilter_1d", &simCtx->
testfilter_1d, NULL); CHKERRQ(ierr);
913 ierr = PetscOptionsGetInt(NULL, NULL,
"-i_homo_filter", &simCtx->
i_homo_filter, NULL); CHKERRQ(ierr);
914 ierr = PetscOptionsGetInt(NULL, NULL,
"-j_homo_filter", &simCtx->
j_homo_filter, NULL); CHKERRQ(ierr);
915 ierr = PetscOptionsGetInt(NULL, NULL,
"-k_homo_filter", &simCtx->
k_homo_filter, NULL); CHKERRQ(ierr);
919 ierr = PetscOptionsGetInt(NULL, NULL,
"-numParticles", &simCtx->
np, NULL); CHKERRQ(ierr);
920 ierr = PetscOptionsGetBool(NULL, NULL,
"-read_fields", &simCtx->
readFields, NULL); CHKERRQ(ierr);
922 ierr = PetscOptionsGetInt(NULL, NULL,
"-pinit", &temp_pinit, NULL); CHKERRQ(ierr);
925 ierr = PetscOptionsGetInt(NULL, NULL,
"-interpolation_method", &temp_interp, NULL); CHKERRQ(ierr);
929 ierr = PetscOptionsGetReal(NULL, NULL,
"-psrc_x", &simCtx->
psrc_x, NULL); CHKERRQ(ierr);
930 ierr = PetscOptionsGetReal(NULL, NULL,
"-psrc_y", &simCtx->
psrc_y, NULL); CHKERRQ(ierr);
931 ierr = PetscOptionsGetReal(NULL, NULL,
"-psrc_z", &simCtx->
psrc_z, NULL); CHKERRQ(ierr);
938 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONG,
"Invalid value for -particle_restart_mode. Must be 'load' or 'init'. You provided '%s'.", simCtx->
particleRestartMode);
943 ierr = PetscOptionsGetBool(NULL, NULL,
"-rs_fsi", &simCtx->
rstart_fsi, NULL); CHKERRQ(ierr);
944 ierr = PetscOptionsGetInt(NULL, NULL,
"-duplicate", &simCtx->
duplicate, NULL); CHKERRQ(ierr);
948 ierr = PetscOptionsGetInt(NULL, NULL,
"-logfreq", &simCtx->
LoggingFrequency, NULL); CHKERRQ(ierr);
951 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_INCOMP,
"Number of BC files (%d) does not match number of blocks (%d). Use -bcs_files \"file1.dat,file2.dat,...\".", simCtx->
num_bcs_files, simCtx->
block_number);
957 ierr = PetscOptionsGetString(NULL,NULL,
"-postprocessing_config_file",simCtx->
PostprocessingControlFile,PETSC_MAX_PATH_LEN,NULL); CHKERRQ(ierr);
969 for (PetscInt i = 0; i < simCtx->
nAllowed; ++i) {
977 if (simCtx->
tiout > 0) {
984 if (simCtx->
np > 0) {
997 ierr = PetscLogDefaultBegin(); CHKERRQ(ierr);
998 ierr = PetscMemorySetGetMaximumUsage(); CHKERRQ(ierr);
1003 PetscFunctionReturn(0);
1402 PetscErrorCode ierr;
1407 PetscFunctionBeginUser;
1413 for (PetscInt level = usermg->
mglevels-1; level >=0; level--) {
1414 for (PetscInt bi = 0; bi < nblk; bi++) {
1417 if(!user->
da || !user->
fda) {
1418 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONGSTATE,
"DMs not properly initialized in UserCtx before vector creation.");
1425 ierr = DMCreateGlobalVector(user->
fda, &user->
Ucont); CHKERRQ(ierr); ierr = VecSet(user->
Ucont, 0.0); CHKERRQ(ierr);
1426 ierr = DMCreateGlobalVector(user->
fda, &user->
Ucat); CHKERRQ(ierr); ierr = VecSet(user->
Ucat, 0.0); CHKERRQ(ierr);
1427 ierr = DMCreateGlobalVector(user->
da, &user->
P); CHKERRQ(ierr); ierr = VecSet(user->
P, 0.0); CHKERRQ(ierr);
1428 ierr = DMCreateGlobalVector(user->
da, &user->
Nvert); CHKERRQ(ierr); ierr = VecSet(user->
Nvert, 0.0); CHKERRQ(ierr);
1430 ierr = DMCreateLocalVector(user->
fda, &user->
lUcont); CHKERRQ(ierr); ierr = VecSet(user->
lUcont, 0.0); CHKERRQ(ierr);
1431 ierr = DMCreateLocalVector(user->
fda, &user->
lUcat); CHKERRQ(ierr); ierr = VecSet(user->
lUcat, 0.0); CHKERRQ(ierr);
1432 ierr = DMCreateLocalVector(user->
da, &user->
lP); CHKERRQ(ierr); ierr = VecSet(user->
lP, 0.0); CHKERRQ(ierr);
1433 ierr = DMCreateLocalVector(user->
da, &user->
lNvert); CHKERRQ(ierr); ierr = VecSet(user->
lNvert, 0.0); CHKERRQ(ierr);
1436 ierr = VecDuplicate(user->
P,&user->
Diffusivity); CHKERRQ(ierr); ierr = VecSet(user->
Diffusivity, 0.0); CHKERRQ(ierr);
1442 ierr = VecDuplicate(user->
P, &user->
Phi); CHKERRQ(ierr); ierr = VecSet(user->
Phi, 0.0); CHKERRQ(ierr);
1443 ierr = VecDuplicate(user->
lP, &user->
lPhi); CHKERRQ(ierr); ierr = VecSet(user->
lPhi, 0.0); CHKERRQ(ierr);
1446 if (level == usermg->
mglevels - 1) {
1447 ierr = VecDuplicate(user->
Ucont, &user->
Ucont_o); CHKERRQ(ierr); ierr = VecSet(user->
Ucont_o, 0.0); CHKERRQ(ierr);
1448 ierr = VecDuplicate(user->
Ucont, &user->
Ucont_rm1); CHKERRQ(ierr); ierr = VecSet(user->
Ucont_rm1, 0.0); CHKERRQ(ierr);
1449 ierr = VecDuplicate(user->
Ucat, &user->
Ucat_o); CHKERRQ(ierr); ierr = VecSet(user->
Ucat_o, 0.0); CHKERRQ(ierr);
1450 ierr = VecDuplicate(user->
P, &user->
P_o); CHKERRQ(ierr); ierr = VecSet(user->
P_o, 0.0); CHKERRQ(ierr);
1451 ierr = VecDuplicate(user->
lUcont, &user->
lUcont_o); CHKERRQ(ierr); ierr = VecSet(user->
lUcont_o, 0.0); CHKERRQ(ierr);
1453 ierr = DMCreateLocalVector(user->
da, &user->
lNvert_o); CHKERRQ(ierr); ierr = VecSet(user->
lNvert_o, 0.0); CHKERRQ(ierr);
1454 ierr = VecDuplicate(user->
Nvert, &user->
Nvert_o); CHKERRQ(ierr); ierr = VecSet(user->
Nvert_o, 0.0); CHKERRQ(ierr);
1458 ierr = DMCreateGlobalVector(user->
fda, &user->
Csi); CHKERRQ(ierr); ierr = VecSet(user->
Csi, 0.0); CHKERRQ(ierr);
1459 ierr = VecDuplicate(user->
Csi, &user->
Eta); CHKERRQ(ierr); ierr = VecSet(user->
Eta, 0.0); CHKERRQ(ierr);
1460 ierr = VecDuplicate(user->
Csi, &user->
Zet); CHKERRQ(ierr); ierr = VecSet(user->
Zet, 0.0); CHKERRQ(ierr);
1461 ierr = DMCreateGlobalVector(user->
da, &user->
Aj); CHKERRQ(ierr); ierr = VecSet(user->
Aj, 0.0); CHKERRQ(ierr);
1463 ierr = DMCreateLocalVector(user->
fda, &user->
lCsi); CHKERRQ(ierr); ierr = VecSet(user->
lCsi, 0.0); CHKERRQ(ierr);
1464 ierr = VecDuplicate(user->
lCsi, &user->
lEta); CHKERRQ(ierr); ierr = VecSet(user->
lEta, 0.0); CHKERRQ(ierr);
1465 ierr = VecDuplicate(user->
lCsi, &user->
lZet); CHKERRQ(ierr); ierr = VecSet(user->
lZet, 0.0); CHKERRQ(ierr);
1466 ierr = DMCreateLocalVector(user->
da, &user->
lAj); CHKERRQ(ierr); ierr = VecSet(user->
lAj, 0.0); CHKERRQ(ierr);
1471 ierr = VecDuplicate(user->
Csi, &user->
ICsi); CHKERRQ(ierr); ierr = VecSet(user->
ICsi, 0.0); CHKERRQ(ierr);
1472 ierr = VecDuplicate(user->
Csi, &user->
IEta); CHKERRQ(ierr); ierr = VecSet(user->
IEta, 0.0); CHKERRQ(ierr);
1473 ierr = VecDuplicate(user->
Csi, &user->
IZet); CHKERRQ(ierr); ierr = VecSet(user->
IZet, 0.0); CHKERRQ(ierr);
1474 ierr = VecDuplicate(user->
Csi, &user->
JCsi); CHKERRQ(ierr); ierr = VecSet(user->
JCsi, 0.0); CHKERRQ(ierr);
1475 ierr = VecDuplicate(user->
Csi, &user->
JEta); CHKERRQ(ierr); ierr = VecSet(user->
JEta, 0.0); CHKERRQ(ierr);
1476 ierr = VecDuplicate(user->
Csi, &user->
JZet); CHKERRQ(ierr); ierr = VecSet(user->
JZet, 0.0); CHKERRQ(ierr);
1477 ierr = VecDuplicate(user->
Csi, &user->
KCsi); CHKERRQ(ierr); ierr = VecSet(user->
KCsi, 0.0); CHKERRQ(ierr);
1478 ierr = VecDuplicate(user->
Csi, &user->
KEta); CHKERRQ(ierr); ierr = VecSet(user->
KEta, 0.0); CHKERRQ(ierr);
1479 ierr = VecDuplicate(user->
Csi, &user->
KZet); CHKERRQ(ierr); ierr = VecSet(user->
KZet, 0.0); CHKERRQ(ierr);
1481 ierr = VecDuplicate(user->
Aj, &user->
IAj); CHKERRQ(ierr); ierr = VecSet(user->
IAj, 0.0); CHKERRQ(ierr);
1482 ierr = VecDuplicate(user->
Aj, &user->
JAj); CHKERRQ(ierr); ierr = VecSet(user->
JAj, 0.0); CHKERRQ(ierr);
1483 ierr = VecDuplicate(user->
Aj, &user->
KAj); CHKERRQ(ierr); ierr = VecSet(user->
KAj, 0.0); CHKERRQ(ierr);
1485 ierr = VecDuplicate(user->
lCsi, &user->
lICsi); CHKERRQ(ierr); ierr = VecSet(user->
lICsi, 0.0); CHKERRQ(ierr);
1486 ierr = VecDuplicate(user->
lCsi, &user->
lIEta); CHKERRQ(ierr); ierr = VecSet(user->
lIEta, 0.0); CHKERRQ(ierr);
1487 ierr = VecDuplicate(user->
lCsi, &user->
lIZet); CHKERRQ(ierr); ierr = VecSet(user->
lIZet, 0.0); CHKERRQ(ierr);
1488 ierr = VecDuplicate(user->
lCsi, &user->
lJCsi); CHKERRQ(ierr); ierr = VecSet(user->
lJCsi, 0.0); CHKERRQ(ierr);
1489 ierr = VecDuplicate(user->
lCsi, &user->
lJEta); CHKERRQ(ierr); ierr = VecSet(user->
lJEta, 0.0); CHKERRQ(ierr);
1490 ierr = VecDuplicate(user->
lCsi, &user->
lJZet); CHKERRQ(ierr); ierr = VecSet(user->
lJZet, 0.0); CHKERRQ(ierr);
1491 ierr = VecDuplicate(user->
lCsi, &user->
lKCsi); CHKERRQ(ierr); ierr = VecSet(user->
lKCsi, 0.0); CHKERRQ(ierr);
1492 ierr = VecDuplicate(user->
lCsi, &user->
lKEta); CHKERRQ(ierr); ierr = VecSet(user->
lKEta, 0.0); CHKERRQ(ierr);
1493 ierr = VecDuplicate(user->
lCsi, &user->
lKZet); CHKERRQ(ierr); ierr = VecSet(user->
lKZet, 0.0); CHKERRQ(ierr);
1495 ierr = VecDuplicate(user->
lAj, &user->
lIAj); CHKERRQ(ierr); ierr = VecSet(user->
lIAj, 0.0); CHKERRQ(ierr);
1496 ierr = VecDuplicate(user->
lAj, &user->
lJAj); CHKERRQ(ierr); ierr = VecSet(user->
lJAj, 0.0); CHKERRQ(ierr);
1497 ierr = VecDuplicate(user->
lAj, &user->
lKAj); CHKERRQ(ierr); ierr = VecSet(user->
lKAj, 0.0); CHKERRQ(ierr);
1500 ierr = DMCreateGlobalVector(user->
fda, &user->
Cent); CHKERRQ(ierr); ierr = VecSet(user->
Cent, 0.0); CHKERRQ(ierr);
1501 ierr = DMCreateLocalVector(user->
fda, &user->
lCent); CHKERRQ(ierr); ierr = VecSet(user->
lCent, 0.0); CHKERRQ(ierr);
1503 ierr = VecDuplicate(user->
Cent, &user->
GridSpace); CHKERRQ(ierr); ierr = VecSet(user->
GridSpace, 0.0); CHKERRQ(ierr);
1504 ierr = VecDuplicate(user->
lCent, &user->
lGridSpace); CHKERRQ(ierr); ierr = VecSet(user->
lGridSpace, 0.0); CHKERRQ(ierr);
1506 ierr = VecDuplicate(user->
Cent, &user->
Centx); CHKERRQ(ierr); ierr = VecSet(user->
Centx, 0.0); CHKERRQ(ierr);
1507 ierr = VecDuplicate(user->
Cent, &user->
Centy); CHKERRQ(ierr); ierr = VecSet(user->
Centy, 0.0); CHKERRQ(ierr);
1508 ierr = VecDuplicate(user->
Cent, &user->
Centz); CHKERRQ(ierr); ierr = VecSet(user->
Centz, 0.0); CHKERRQ(ierr);
1509 ierr = VecDuplicate(user->
lCent, &user->
lCentx); CHKERRQ(ierr); ierr = VecSet(user->
lCentx, 0.0); CHKERRQ(ierr);
1510 ierr = VecDuplicate(user->
lCent, &user->
lCenty); CHKERRQ(ierr); ierr = VecSet(user->
lCenty, 0.0); CHKERRQ(ierr);
1511 ierr = VecDuplicate(user->
lCent, &user->
lCentz); CHKERRQ(ierr); ierr = VecSet(user->
lCentz, 0.0); CHKERRQ(ierr);
1515 if (simCtx->
les || simCtx->
rans) {
1516 ierr = DMCreateGlobalVector(user->
da, &user->
Nu_t); CHKERRQ(ierr); ierr = VecSet(user->
Nu_t, 0.0); CHKERRQ(ierr);
1517 ierr = DMCreateLocalVector(user->
da, &user->
lNu_t); CHKERRQ(ierr); ierr = VecSet(user->
lNu_t, 0.0); CHKERRQ(ierr);
1520 ierr = DMCreateGlobalVector(user->
da,&user->
CS); CHKERRQ(ierr); ierr = VecSet(user->
CS,0.0); CHKERRQ(ierr);
1521 ierr = DMCreateLocalVector(user->
da,&user->
lCs); CHKERRQ(ierr); ierr = VecSet(user->
lCs,0.0); CHKERRQ(ierr);
1539 ierr = DMCreateGlobalVector(user->
da,&user->
Psi); CHKERRQ(ierr); ierr = VecSet(user->
Psi,0.0); CHKERRQ(ierr);
1540 ierr = DMCreateLocalVector(user->
da,&user->
lPsi); CHKERRQ(ierr); ierr = VecSet(user->
lPsi,0.0); CHKERRQ(ierr);
1545 ierr = DMCreateGlobalVector(user->
fda, &user->
Bcs.
Ubcs); CHKERRQ(ierr);
1546 ierr = VecSet(user->
Bcs.
Ubcs, 0.0); CHKERRQ(ierr);
1547 ierr = DMCreateGlobalVector(user->
fda, &user->
Bcs.
Uch); CHKERRQ(ierr);
1548 ierr = VecSet(user->
Bcs.
Uch, 0.0); CHKERRQ(ierr);
1555 if (level == 0 && simCtx->
immersed) {
1556 ierr = PetscCalloc1((
size_t)(user->
info.mx * user->
info.my * 2), &user->
KSKE); CHKERRQ(ierr);
1573 "Allocated accumulators for %d statistics window(s).\n",
1581 if (level == usermg->
mglevels - 1) {
1598 ierr = DMCreateGlobalVector(user->
da, &user->
PostScalar); CHKERRQ(ierr);
1599 ierr = VecSet(user->
PostScalar, 0.0); CHKERRQ(ierr);
1600 ierr = DMCreateLocalVector(user->
da, &user->
lPostScalar); CHKERRQ(ierr);
1601 ierr = VecSet(user->
lPostScalar, 0.0); CHKERRQ(ierr);
1604 ierr = DMCreateGlobalVector(user->
fda, &user->
PostVector); CHKERRQ(ierr);
1605 ierr = VecSet(user->
PostVector, 0.0); CHKERRQ(ierr);
1606 ierr = DMCreateLocalVector(user->
fda, &user->
lPostVector); CHKERRQ(ierr);
1607 ierr = VecSet(user->
lPostVector, 0.0); CHKERRQ(ierr);
1616 ierr = VecDuplicate(user->
P, &user->
P_nodal); CHKERRQ(ierr);
1617 ierr = VecSet(user->
P_nodal, 0.0); CHKERRQ(ierr);
1619 ierr = VecDuplicate(user->
Ucat, &user->
Ucat_nodal); CHKERRQ(ierr);
1620 ierr = VecSet(user->
Ucat_nodal, 0.0); CHKERRQ(ierr);
1622 ierr = VecDuplicate(user->
P, &user->
Qcrit); CHKERRQ(ierr);
1623 ierr = VecSet(user->
Qcrit, 0.0); CHKERRQ(ierr);
1628 ierr = VecDuplicate(user->
Psi, &user->
Psi_nodal); CHKERRQ(ierr);
1629 ierr = VecSet(user->
Psi_nodal, 0.0); CHKERRQ(ierr);
1655 PetscFunctionReturn(0);
1669 PetscInt dof,
char face_direction,
1670 PetscBool component_staggered)
1673 PetscInt xs, xe, ys, ye, zs, ze;
1674 PetscInt gxs, gxe, gys, gye, gzs, gze;
1675 PetscInt mx, my, mz;
1677 PetscFunctionBeginUser;
1678 if (!face_direction && !component_staggered) PetscFunctionReturn(0);
1680 PetscCall(DMDAGetLocalInfo(dm, &info));
1681 xs = info.xs; xe = info.xs + info.xm;
1682 ys = info.ys; ye = info.ys + info.ym;
1683 zs = info.zs; ze = info.zs + info.zm;
1684 gxs = info.gxs; gxe = info.gxs + info.gxm;
1685 gys = info.gys; gye = info.gys + info.gym;
1686 gzs = info.gzs; gze = info.gzs + info.gzm;
1687 mx = info.mx; my = info.my; mz = info.mz;
1689 if (component_staggered) {
1691 PetscCall(DMDAVecGetArray(dm, local_vec, &array));
1694 PetscCheck(gxs <= -3, PETSC_COMM_SELF, PETSC_ERR_ARG_SIZ,
1695 "Periodic Ucont.x ghost repair requires DMDA stencil width at least 3.");
1696 for (PetscInt k = gzs; k < gze; k++)
for (PetscInt j = gys; j < gye; j++)
1697 array[k][j][-1].x = array[k][j][-3].x;
1700 PetscCheck(gxe > mx + 2, PETSC_COMM_SELF, PETSC_ERR_ARG_SIZ,
1701 "Periodic Ucont.x ghost repair requires DMDA stencil width at least 3.");
1702 for (PetscInt k = gzs; k < gze; k++)
for (PetscInt j = gys; j < gye; j++)
1703 array[k][j][mx].x = array[k][j][mx + 2].x;
1706 PetscCheck(gys <= -3, PETSC_COMM_SELF, PETSC_ERR_ARG_SIZ,
1707 "Periodic Ucont.y ghost repair requires DMDA stencil width at least 3.");
1708 for (PetscInt k = gzs; k < gze; k++)
for (PetscInt i = gxs; i < gxe; i++)
1709 array[k][-1][i].y = array[k][-3][i].y;
1712 PetscCheck(gye > my + 2, PETSC_COMM_SELF, PETSC_ERR_ARG_SIZ,
1713 "Periodic Ucont.y ghost repair requires DMDA stencil width at least 3.");
1714 for (PetscInt k = gzs; k < gze; k++)
for (PetscInt i = gxs; i < gxe; i++)
1715 array[k][my][i].y = array[k][my + 2][i].y;
1718 PetscCheck(gzs <= -3, PETSC_COMM_SELF, PETSC_ERR_ARG_SIZ,
1719 "Periodic Ucont.z ghost repair requires DMDA stencil width at least 3.");
1720 for (PetscInt j = gys; j < gye; j++)
for (PetscInt i = gxs; i < gxe; i++)
1721 array[-1][j][i].z = array[-3][j][i].z;
1724 PetscCheck(gze > mz + 2, PETSC_COMM_SELF, PETSC_ERR_ARG_SIZ,
1725 "Periodic Ucont.z ghost repair requires DMDA stencil width at least 3.");
1726 for (PetscInt j = gys; j < gye; j++)
for (PetscInt i = gxs; i < gxe; i++)
1727 array[mz][j][i].z = array[mz + 2][j][i].z;
1730 PetscCall(DMDAVecRestoreArray(dm, local_vec, &array));
1731 PetscFunctionReturn(0);
1736 PetscCall(DMDAVecGetArray(dm, local_vec, &array));
1738 if (face_direction ==
'i') {
1740 PetscCheck(gxs <= -3, PETSC_COMM_SELF, PETSC_ERR_ARG_SIZ,
1741 "Periodic I-face ghost repair requires DMDA stencil width at least 3.");
1742 for (PetscInt k = gzs; k < gze; k++)
for (PetscInt j = gys; j < gye; j++)
1743 array[k][j][-1] = array[k][j][-3];
1746 PetscCheck(gxe > mx + 2, PETSC_COMM_SELF, PETSC_ERR_ARG_SIZ,
1747 "Periodic I-face ghost repair requires DMDA stencil width at least 3.");
1748 for (PetscInt k = gzs; k < gze; k++)
for (PetscInt j = gys; j < gye; j++)
1749 array[k][j][mx] = array[k][j][mx + 2];
1751 }
else if (face_direction ==
'j') {
1753 PetscCheck(gys <= -3, PETSC_COMM_SELF, PETSC_ERR_ARG_SIZ,
1754 "Periodic J-face ghost repair requires DMDA stencil width at least 3.");
1755 for (PetscInt k = gzs; k < gze; k++)
for (PetscInt i = gxs; i < gxe; i++)
1756 array[k][-1][i] = array[k][-3][i];
1759 PetscCheck(gye > my + 2, PETSC_COMM_SELF, PETSC_ERR_ARG_SIZ,
1760 "Periodic J-face ghost repair requires DMDA stencil width at least 3.");
1761 for (PetscInt k = gzs; k < gze; k++)
for (PetscInt i = gxs; i < gxe; i++)
1762 array[k][my][i] = array[k][my + 2][i];
1764 }
else if (face_direction ==
'k') {
1766 PetscCheck(gzs <= -3, PETSC_COMM_SELF, PETSC_ERR_ARG_SIZ,
1767 "Periodic K-face ghost repair requires DMDA stencil width at least 3.");
1768 for (PetscInt j = gys; j < gye; j++)
for (PetscInt i = gxs; i < gxe; i++)
1769 array[-1][j][i] = array[-3][j][i];
1772 PetscCheck(gze > mz + 2, PETSC_COMM_SELF, PETSC_ERR_ARG_SIZ,
1773 "Periodic K-face ghost repair requires DMDA stencil width at least 3.");
1774 for (PetscInt j = gys; j < gye; j++)
for (PetscInt i = gxs; i < gxe; i++)
1775 array[mz][j][i] = array[mz + 2][j][i];
1779 PetscCall(DMDAVecRestoreArray(dm, local_vec, &array));
1782 PetscCall(DMDAVecGetArray(dm, local_vec, &array));
1784 if (face_direction ==
'i') {
1786 PetscCheck(gxs <= -3, PETSC_COMM_SELF, PETSC_ERR_ARG_SIZ,
1787 "Periodic I-face ghost repair requires DMDA stencil width at least 3.");
1788 for (PetscInt k = gzs; k < gze; k++)
for (PetscInt j = gys; j < gye; j++)
1789 array[k][j][-1] = array[k][j][-3];
1792 PetscCheck(gxe > mx + 2, PETSC_COMM_SELF, PETSC_ERR_ARG_SIZ,
1793 "Periodic I-face ghost repair requires DMDA stencil width at least 3.");
1794 for (PetscInt k = gzs; k < gze; k++)
for (PetscInt j = gys; j < gye; j++)
1795 array[k][j][mx] = array[k][j][mx + 2];
1797 }
else if (face_direction ==
'j') {
1799 PetscCheck(gys <= -3, PETSC_COMM_SELF, PETSC_ERR_ARG_SIZ,
1800 "Periodic J-face ghost repair requires DMDA stencil width at least 3.");
1801 for (PetscInt k = gzs; k < gze; k++)
for (PetscInt i = gxs; i < gxe; i++)
1802 array[k][-1][i] = array[k][-3][i];
1805 PetscCheck(gye > my + 2, PETSC_COMM_SELF, PETSC_ERR_ARG_SIZ,
1806 "Periodic J-face ghost repair requires DMDA stencil width at least 3.");
1807 for (PetscInt k = gzs; k < gze; k++)
for (PetscInt i = gxs; i < gxe; i++)
1808 array[k][my][i] = array[k][my + 2][i];
1810 }
else if (face_direction ==
'k') {
1812 PetscCheck(gzs <= -3, PETSC_COMM_SELF, PETSC_ERR_ARG_SIZ,
1813 "Periodic K-face ghost repair requires DMDA stencil width at least 3.");
1814 for (PetscInt j = gys; j < gye; j++)
for (PetscInt i = gxs; i < gxe; i++)
1815 array[-1][j][i] = array[-3][j][i];
1818 PetscCheck(gze > mz + 2, PETSC_COMM_SELF, PETSC_ERR_ARG_SIZ,
1819 "Periodic K-face ghost repair requires DMDA stencil width at least 3.");
1820 for (PetscInt j = gys; j < gye; j++)
for (PetscInt i = gxs; i < gxe; i++)
1821 array[mz][j][i] = array[mz + 2][j][i];
1825 PetscCall(DMDAVecRestoreArray(dm, local_vec, &array));
1828 PetscFunctionReturn(0);
1840 PetscErrorCode ierr;
1843 const char *field_name;
1848 char face_direction =
'\0';
1849 PetscBool component_staggered = PETSC_FALSE;
1851 PetscFunctionBeginUser;
1853 ierr = MPI_Comm_rank(PETSC_COMM_WORLD, &rank); CHKERRQ(ierr);
1854 ierr =
FieldGetView(user, field_id, &field_view); CHKERRQ(ierr);
1856 PETSC_COMM_SELF, PETSC_ERR_SUP,
1857 "Field '%s' does not support ghost updates.",
1867 face_direction =
'i';
1870 face_direction =
'j';
1873 face_direction =
'k';
1876 component_staggered = PETSC_TRUE;
1881 SETERRQ(PETSC_COMM_SELF, PETSC_ERR_PLIB,
1882 "Field '%s' has an invalid ghost synchronization class.", field_name);
1888 rank, field_name, (
void*)dm, (
void*)globalVec, (
void*)localVec);
1894 PetscReal norm_global_before;
1895 ierr = VecNorm(globalVec, NORM_INFINITY, &norm_global_before); CHKERRQ(ierr);
1896 LOG_ALLOW(
GLOBAL,
LOG_INFO,
"Max norm '%s' (Global) BEFORE Ghost Update: %g\n", field_name, norm_global_before);
1905 ierr = DMGlobalToLocalBegin(dm, globalVec, INSERT_VALUES, localVec); CHKERRQ(ierr);
1906 ierr = DMGlobalToLocalEnd(dm, globalVec, INSERT_VALUES, localVec); CHKERRQ(ierr);
1908 component_staggered); CHKERRQ(ierr);
1915 PetscReal norm_local_after;
1916 ierr = VecNorm(localVec, NORM_INFINITY, &norm_local_after); CHKERRQ(ierr);
1922 PetscMPIInt rank_test;
1923 MPI_Comm_rank(PETSC_COMM_WORLD, &rank_test);
1926 DMDALocalInfo info_check;
1927 ierr = DMDAGetLocalInfo(dm, &info_check); CHKERRQ(ierr);
1930 Cmpnts ***lUcat_arr_test = NULL;
1931 PetscErrorCode ierr_test = 0;
1933 LOG_ALLOW(
LOCAL,
LOG_DEBUG,
"Rank %d: Testing '%s' access immediately after ghost update...\n", rank_test, field_name);
1934 ierr_test = DMDAVecGetArrayDOFRead(dm, localVec, &lUcat_arr_test);
1937 LOG_ALLOW(
LOCAL,
LOG_ERROR,
"Rank %d: ERROR %d getting '%s' array after ghost update!\n", rank_test, ierr_test, field_name);
1938 }
else if (!lUcat_arr_test) {
1939 LOG_ALLOW(
LOCAL,
LOG_ERROR,
"Rank %d: ERROR NULL pointer getting '%s' array after ghost update!\n", rank_test, field_name);
1943 PetscInt k_int = info_check.zs + (info_check.zm > 1 ? 1 : 0);
1944 PetscInt j_int = info_check.ys + (info_check.ym > 1 ? 1 : 0);
1945 PetscInt i_int = info_check.xs + (info_check.xm > 1 ? 1 : 0);
1951 if (k_int >= info_check.mz - 1) {
1952 k_int = info_check.mz - 2;
1959 if (j_int >= info_check.my - 1) {
1960 j_int = info_check.my - 2;
1967 if (i_int >= info_check.mx - 1) {
1968 i_int = info_check.mx - 2;
1975 if (k_int >= info_check.zs && k_int < info_check.zs + info_check.zm &&
1976 j_int >= info_check.ys && j_int < info_check.ys + info_check.ym &&
1977 i_int >= info_check.xs && i_int < info_check.xs + info_check.xm)
1979 LOG_ALLOW(
LOCAL,
LOG_DEBUG,
"Rank %d: Attempting test read OWNED INTERIOR [%d][%d][%d] (Global)\n", rank_test, k_int, j_int, i_int);
1980 Cmpnts test_val_owned_interior = lUcat_arr_test[k_int][j_int][i_int];
1981 LOG_ALLOW(
LOCAL,
LOG_DEBUG,
"Rank %d: SUCCESS reading owned interior: x=%g\n", rank_test, test_val_owned_interior.
x);
1983 LOG_ALLOW(
LOCAL,
LOG_DEBUG,
"Rank %d: Skipping interior test read for non-owned index [%d][%d][%d].\n", rank_test, k_int, j_int, i_int);
1988 PetscInt k_bnd = info_check.zs;
1989 PetscInt j_bnd = info_check.ys;
1990 PetscInt i_bnd = info_check.xs;
1991 LOG_ALLOW(
LOCAL,
LOG_DEBUG,
"Rank %d: Attempting test read OWNED BOUNDARY [%d][%d][%d] (Global)\n", rank_test, k_bnd, j_bnd, i_bnd);
1992 Cmpnts test_val_owned_boundary = lUcat_arr_test[k_bnd][j_bnd][i_bnd];
1993 LOG_ALLOW(
LOCAL,
LOG_DEBUG,
"Rank %d: SUCCESS reading owned boundary: x=%g\n", rank_test, test_val_owned_boundary.
x);
1997 if (info_check.zs > 0) {
1998 PetscInt k_ghost = info_check.zs - 1;
1999 PetscInt j_ghost = info_check.ys;
2000 PetscInt i_ghost = info_check.xs;
2001 LOG_ALLOW(
LOCAL,
LOG_DEBUG,
"Rank %d: Attempting test read GHOST [%d][%d][%d] (Global)\n", rank_test, k_ghost, j_ghost, i_ghost);
2002 Cmpnts test_val_ghost = lUcat_arr_test[k_ghost][j_ghost][i_ghost];
2009 ierr_test = DMDAVecRestoreArrayDOFRead(dm, localVec, &lUcat_arr_test);
2010 if(ierr_test){
LOG_ALLOW(
LOCAL,
LOG_ERROR,
"Rank %d: ERROR %d restoring '%s' array after test read!\n", rank_test, ierr_test, field_name); }
2018 PetscFunctionReturn(0);
2651 PetscErrorCode ierr;
2653 Cmpnts ***lcsi_arr, ***leta_arr, ***lzet_arr;
2656 PetscReal ***lnvert_arr;
2657 PetscReal ***laj_arr;
2659 PetscFunctionBeginUser;
2666 ierr = DMDAGetLocalInfo(user->
fda, &info); CHKERRQ(ierr);
2668 SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE,
"Contra2Cart requires lUcont, lCsi/Eta/Zet, lNvert, and Ucat to be non-NULL.");
2673 ierr = DMDAVecGetArrayRead(user->
fda, user->
lUcont, &lucont_arr); CHKERRQ(ierr);
2674 ierr = DMDAVecGetArrayRead(user->
fda, user->
lCsi, &lcsi_arr); CHKERRQ(ierr);
2675 ierr = DMDAVecGetArrayRead(user->
fda, user->
lEta, &leta_arr); CHKERRQ(ierr);
2676 ierr = DMDAVecGetArrayRead(user->
fda, user->
lZet, &lzet_arr); CHKERRQ(ierr);
2677 ierr = DMDAVecGetArrayRead(user->
da, user->
lNvert, &lnvert_arr); CHKERRQ(ierr);
2678 ierr = DMDAVecGetArrayRead(user->
da, user->
lAj, &laj_arr); CHKERRQ(ierr);
2683 ierr = DMDAVecGetArray(user->
fda, user->
Ucat, &gucat_arr); CHKERRQ(ierr);
2690 PetscInt i_start = (info.xs == 0) ? info.xs + 1 : info.xs;
2691 PetscInt i_end = (info.xs + info.xm == info.mx) ? info.xs + info.xm - 1 : info.xs + info.xm;
2693 PetscInt j_start = (info.ys == 0) ? info.ys + 1 : info.ys;
2694 PetscInt j_end = (info.ys + info.ym == info.my) ? info.ys + info.ym - 1 : info.ys + info.ym;
2696 PetscInt k_start = (info.zs == 0) ? info.zs + 1 : info.zs;
2697 PetscInt k_end = (info.zs + info.zm == info.mz) ? info.zs + info.zm - 1 : info.zs + info.zm;
2701 for (PetscInt k_cell = k_start; k_cell < k_end; ++k_cell) {
2702 for (PetscInt j_cell = j_start; j_cell < j_end; ++j_cell) {
2703 for (PetscInt i_cell = i_start; i_cell < i_end; ++i_cell) {
2710 PetscReal mat[3][3];
2714 mat[0][0] = 0.5 * (lcsi_arr[k_cell][j_cell][i_cell-1].
x + lcsi_arr[k_cell][j_cell][i_cell].
x);
2715 mat[0][1] = 0.5 * (lcsi_arr[k_cell][j_cell][i_cell-1].
y + lcsi_arr[k_cell][j_cell][i_cell].
y);
2716 mat[0][2] = 0.5 * (lcsi_arr[k_cell][j_cell][i_cell-1].
z + lcsi_arr[k_cell][j_cell][i_cell].
z);
2718 mat[1][0] = 0.5 * (leta_arr[k_cell][j_cell-1][i_cell].
x + leta_arr[k_cell][j_cell][i_cell].
x);
2719 mat[1][1] = 0.5 * (leta_arr[k_cell][j_cell-1][i_cell].
y + leta_arr[k_cell][j_cell][i_cell].
y);
2720 mat[1][2] = 0.5 * (leta_arr[k_cell][j_cell-1][i_cell].
z + leta_arr[k_cell][j_cell][i_cell].
z);
2722 mat[2][0] = 0.5 * (lzet_arr[k_cell-1][j_cell][i_cell].
x + lzet_arr[k_cell][j_cell][i_cell].
x);
2723 mat[2][1] = 0.5 * (lzet_arr[k_cell-1][j_cell][i_cell].
y + lzet_arr[k_cell][j_cell][i_cell].
y);
2724 mat[2][2] = 0.5 * (lzet_arr[k_cell-1][j_cell][i_cell].
z + lzet_arr[k_cell][j_cell][i_cell].
z);
2729 q[0] = 0.5 * (lucont_arr[k_cell][j_cell][i_cell-1].
x + lucont_arr[k_cell][j_cell][i_cell].
x);
2730 q[1] = 0.5 * (lucont_arr[k_cell][j_cell-1][i_cell].
y + lucont_arr[k_cell][j_cell][i_cell].
y);
2731 q[2] = 0.5 * (lucont_arr[k_cell-1][j_cell][i_cell].
z + lucont_arr[k_cell][j_cell][i_cell].
z);
2734 PetscReal det = mat[0][0] * (mat[1][1] * mat[2][2] - mat[1][2] * mat[2][1]) -
2735 mat[0][1] * (mat[1][0] * mat[2][2] - mat[1][2] * mat[2][0]) +
2736 mat[0][2] * (mat[1][0] * mat[2][1] - mat[1][1] * mat[2][0]);
2738 if (PetscAbsReal(det) < 1.0e-18) {
2739 SETERRQ(PETSC_COMM_SELF, PETSC_ERR_FLOP_COUNT,
"Transformation matrix determinant is near zero at cell (%d,%d,%d) \n", i_cell, j_cell, k_cell);
2742 PetscReal det_inv = 1.0 / det;
2744 PetscReal det0 = q[0] * (mat[1][1] * mat[2][2] - mat[1][2] * mat[2][1]) -
2745 q[1] * (mat[0][1] * mat[2][2] - mat[0][2] * mat[2][1]) +
2746 q[2] * (mat[0][1] * mat[1][2] - mat[0][2] * mat[1][1]);
2748 PetscReal det1 = -q[0] * (mat[1][0] * mat[2][2] - mat[1][2] * mat[2][0]) +
2749 q[1] * (mat[0][0] * mat[2][2] - mat[0][2] * mat[2][0]) -
2750 q[2] * (mat[0][0] * mat[1][2] - mat[0][2] * mat[1][0]);
2752 PetscReal det2 = q[0] * (mat[1][0] * mat[2][1] - mat[1][1] * mat[2][0]) -
2753 q[1] * (mat[0][0] * mat[2][1] - mat[0][1] * mat[2][0]) +
2754 q[2] * (mat[0][0] * mat[1][1] - mat[0][1] * mat[1][0]);
2758 gucat_arr[k_cell][j_cell][i_cell].
x = det0 * det_inv;
2759 gucat_arr[k_cell][j_cell][i_cell].
y = det1 * det_inv;
2760 gucat_arr[k_cell][j_cell][i_cell].
z = det2 * det_inv;
2766 ierr = DMDAVecRestoreArrayRead(user->
fda, user->
lUcont, &lucont_arr); CHKERRQ(ierr);
2767 ierr = DMDAVecRestoreArrayRead(user->
fda, user->
lCsi, &lcsi_arr); CHKERRQ(ierr);
2768 ierr = DMDAVecRestoreArrayRead(user->
fda, user->
lEta, &leta_arr); CHKERRQ(ierr);
2769 ierr = DMDAVecRestoreArrayRead(user->
fda, user->
lZet, &lzet_arr); CHKERRQ(ierr);
2770 ierr = DMDAVecRestoreArrayRead(user->
da, user->
lNvert, &lnvert_arr); CHKERRQ(ierr);
2771 ierr = DMDAVecRestoreArrayRead(user->
da, user->
lAj, &laj_arr); CHKERRQ(ierr);
2772 ierr = DMDAVecRestoreArray(user->
fda, user->
Ucat, &gucat_arr); CHKERRQ(ierr);
2776 PetscFunctionReturn(0);
3471 PetscErrorCode ierr;
3472 PetscFunctionBeginUser;
3475 if (user->
Ucont) { ierr = VecDestroy(&user->
Ucont); CHKERRQ(ierr); }
3476 if (user->
lUcont) { ierr = VecDestroy(&user->
lUcont); CHKERRQ(ierr); }
3477 if (user->
Ucat) { ierr = VecDestroy(&user->
Ucat); CHKERRQ(ierr); }
3478 if (user->
lUcat) { ierr = VecDestroy(&user->
lUcat); CHKERRQ(ierr); }
3479 if (user->
P) { ierr = VecDestroy(&user->
P); CHKERRQ(ierr); }
3480 if (user->
lP) { ierr = VecDestroy(&user->
lP); CHKERRQ(ierr); }
3481 if (user->
Nvert) { ierr = VecDestroy(&user->
Nvert); CHKERRQ(ierr); }
3482 if (user->
lNvert) { ierr = VecDestroy(&user->
lNvert); CHKERRQ(ierr); }
3491 if (user->
Phi) { ierr = VecDestroy(&user->
Phi); CHKERRQ(ierr); }
3492 if (user->
lPhi) { ierr = VecDestroy(&user->
lPhi); CHKERRQ(ierr); }
3495 if (user->
Ucont_o) { ierr = VecDestroy(&user->
Ucont_o); CHKERRQ(ierr); }
3497 if (user->
Ucat_o) { ierr = VecDestroy(&user->
Ucat_o); CHKERRQ(ierr); }
3498 if (user->
P_o) { ierr = VecDestroy(&user->
P_o); CHKERRQ(ierr); }
3499 if (user->
Nvert_o) { ierr = VecDestroy(&user->
Nvert_o); CHKERRQ(ierr); }
3505 if (user->
Csi) { ierr = VecDestroy(&user->
Csi); CHKERRQ(ierr); }
3506 if (user->
Eta) { ierr = VecDestroy(&user->
Eta); CHKERRQ(ierr); }
3507 if (user->
Zet) { ierr = VecDestroy(&user->
Zet); CHKERRQ(ierr); }
3508 if (user->
Aj) { ierr = VecDestroy(&user->
Aj); CHKERRQ(ierr); }
3509 if (user->
lCsi) { ierr = VecDestroy(&user->
lCsi); CHKERRQ(ierr); }
3510 if (user->
lEta) { ierr = VecDestroy(&user->
lEta); CHKERRQ(ierr); }
3511 if (user->
lZet) { ierr = VecDestroy(&user->
lZet); CHKERRQ(ierr); }
3512 if (user->
lAj) { ierr = VecDestroy(&user->
lAj); CHKERRQ(ierr); }
3515 if (user->
ICsi) { ierr = VecDestroy(&user->
ICsi); CHKERRQ(ierr); }
3516 if (user->
IEta) { ierr = VecDestroy(&user->
IEta); CHKERRQ(ierr); }
3517 if (user->
IZet) { ierr = VecDestroy(&user->
IZet); CHKERRQ(ierr); }
3518 if (user->
JCsi) { ierr = VecDestroy(&user->
JCsi); CHKERRQ(ierr); }
3519 if (user->
JEta) { ierr = VecDestroy(&user->
JEta); CHKERRQ(ierr); }
3520 if (user->
JZet) { ierr = VecDestroy(&user->
JZet); CHKERRQ(ierr); }
3521 if (user->
KCsi) { ierr = VecDestroy(&user->
KCsi); CHKERRQ(ierr); }
3522 if (user->
KEta) { ierr = VecDestroy(&user->
KEta); CHKERRQ(ierr); }
3523 if (user->
KZet) { ierr = VecDestroy(&user->
KZet); CHKERRQ(ierr); }
3524 if (user->
IAj) { ierr = VecDestroy(&user->
IAj); CHKERRQ(ierr); }
3525 if (user->
JAj) { ierr = VecDestroy(&user->
JAj); CHKERRQ(ierr); }
3526 if (user->
KAj) { ierr = VecDestroy(&user->
KAj); CHKERRQ(ierr); }
3527 if (user->
lICsi) { ierr = VecDestroy(&user->
lICsi); CHKERRQ(ierr); }
3528 if (user->
lIEta) { ierr = VecDestroy(&user->
lIEta); CHKERRQ(ierr); }
3529 if (user->
lIZet) { ierr = VecDestroy(&user->
lIZet); CHKERRQ(ierr); }
3530 if (user->
lJCsi) { ierr = VecDestroy(&user->
lJCsi); CHKERRQ(ierr); }
3531 if (user->
lJEta) { ierr = VecDestroy(&user->
lJEta); CHKERRQ(ierr); }
3532 if (user->
lJZet) { ierr = VecDestroy(&user->
lJZet); CHKERRQ(ierr); }
3533 if (user->
lKCsi) { ierr = VecDestroy(&user->
lKCsi); CHKERRQ(ierr); }
3534 if (user->
lKEta) { ierr = VecDestroy(&user->
lKEta); CHKERRQ(ierr); }
3535 if (user->
lKZet) { ierr = VecDestroy(&user->
lKZet); CHKERRQ(ierr); }
3536 if (user->
lIAj) { ierr = VecDestroy(&user->
lIAj); CHKERRQ(ierr); }
3537 if (user->
lJAj) { ierr = VecDestroy(&user->
lJAj); CHKERRQ(ierr); }
3538 if (user->
lKAj) { ierr = VecDestroy(&user->
lKAj); CHKERRQ(ierr); }
3541 if (user->
Cent) { ierr = VecDestroy(&user->
Cent); CHKERRQ(ierr); }
3542 if (user->
lCent) { ierr = VecDestroy(&user->
lCent); CHKERRQ(ierr); }
3545 if (user->
Centx) { ierr = VecDestroy(&user->
Centx); CHKERRQ(ierr); }
3546 if (user->
Centy) { ierr = VecDestroy(&user->
Centy); CHKERRQ(ierr); }
3547 if (user->
Centz) { ierr = VecDestroy(&user->
Centz); CHKERRQ(ierr); }
3548 if (user->
lCentx) { ierr = VecDestroy(&user->
lCentx); CHKERRQ(ierr); }
3549 if (user->
lCenty) { ierr = VecDestroy(&user->
lCenty); CHKERRQ(ierr); }
3550 if (user->
lCentz) { ierr = VecDestroy(&user->
lCentz); CHKERRQ(ierr); }
3553 if (user->
Nu_t) { ierr = VecDestroy(&user->
Nu_t); CHKERRQ(ierr); }
3554 if (user->
lNu_t) { ierr = VecDestroy(&user->
lNu_t); CHKERRQ(ierr); }
3555 if (user->
CS) { ierr = VecDestroy(&user->
CS); CHKERRQ(ierr); }
3556 if (user->
lCs) { ierr = VecDestroy(&user->
lCs); CHKERRQ(ierr); }
3558 if (user->
K_Omega) { ierr = VecDestroy(&user->
K_Omega); CHKERRQ(ierr); }
3566 if (user->
Psi) { ierr = VecDestroy(&user->
Psi); CHKERRQ(ierr); }
3567 if (user->
lPsi) { ierr = VecDestroy(&user->
lPsi); CHKERRQ(ierr); }
3570 if (user->
Bcs.
Ubcs) { ierr = VecDestroy(&user->
Bcs.
Ubcs); CHKERRQ(ierr); }
3571 if (user->
Bcs.
Uch) { ierr = VecDestroy(&user->
Bcs.
Uch); CHKERRQ(ierr); }
3574 if (user->
P_nodal) { ierr = VecDestroy(&user->
P_nodal); CHKERRQ(ierr); }
3576 if (user->
Qcrit) { ierr = VecDestroy(&user->
Qcrit); CHKERRQ(ierr); }
3583 for (PetscInt w = 0; w < window_count; ++w) {
3601 if (user->
Rhs) { ierr = VecDestroy(&user->
Rhs); CHKERRQ(ierr); }
3602 if (user->
dUcont) { ierr = VecDestroy(&user->
dUcont); CHKERRQ(ierr); }
3603 if (user->
pUcont) { ierr = VecDestroy(&user->
pUcont); CHKERRQ(ierr); }
3606 if (user->
B) { ierr = VecDestroy(&user->
B); CHKERRQ(ierr); }
3607 if (user->
R) { ierr = VecDestroy(&user->
R); CHKERRQ(ierr); }
3610 PetscFunctionReturn(0);