157 char control_filename[PETSC_MAX_PATH_LEN] =
"";
158 PetscBool control_flg;
159 PetscBool particle_console_output_freq_flg = PETSC_FALSE;
161 PetscFunctionBeginUser;
166 ierr = PetscNew(p_simCtx); CHKERRQ(ierr);
182 strcpy(simCtx->
log_dir,
"logs");
238 simCtx->
max_angle = -54. * 3.1415926 / 180.;
248 strcpy(simCtx->
grid_file,
"config/grid.run");
256 ierr = PetscMalloc1(1, &simCtx->
bcs_files); CHKERRQ(ierr);
257 ierr = PetscStrallocpy(
"config/bcs.run", &simCtx->
bcs_files[0]); CHKERRQ(ierr);
262 simCtx->
U_bc = 0.0; simCtx->
ccc = 0;
304 simCtx->
ibm = NULL; simCtx->
ibmv = NULL; simCtx->
fsi = NULL;
308 strcpy(simCtx->
allowedFile,
"config/whitelist.run");
309 simCtx->
useCfg = PETSC_FALSE;
344 ierr = PetscNew(&simCtx->
pps); CHKERRQ(ierr);
348 ierr = MPI_Comm_rank(PETSC_COMM_WORLD, &simCtx->
rank); CHKERRQ(ierr);
349 ierr = MPI_Comm_size(PETSC_COMM_WORLD, &simCtx->
size); CHKERRQ(ierr);
352 ierr = PetscOptionsGetString(NULL, NULL,
"-control_file", control_filename,
sizeof(control_filename), &control_flg); CHKERRQ(ierr);
355 if (!control_flg || strlen(control_filename) == 0) {
356 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONG,
357 "\n\n*** MANDATORY ARGUMENT MISSING ***\n"
358 "The -control_file argument was not provided.\n"
359 "This program must be launched with a configuration file.\n"
360 "Example: mpiexec -n 4 ./simulator -control_file /path/to/your/config.control\n"
361 "This is typically handled automatically by the 'picurv' script.\n");
365 LOG(
GLOBAL,
LOG_INFO,
"Loading mandatory configuration from: %s\n", control_filename);
366 ierr = PetscOptionsInsertFile(PETSC_COMM_WORLD, NULL, control_filename, PETSC_FALSE);
367 if (ierr == PETSC_ERR_FILE_OPEN) {
368 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_FILE_OPEN,
"The specified control file was not found or could not be opened: %s", control_filename);
375 ierr = PetscOptionsGetString(NULL, NULL,
"-whitelist_config_file", simCtx->
allowedFile, PETSC_MAX_PATH_LEN, &simCtx->
useCfg); CHKERRQ(ierr);
381 PetscPrintf(PETSC_COMM_SELF,
"[%s] WARNING: Failed to load allowed functions from '%s'. Falling back to default list.\n", __func__, simCtx->
allowedFile);
382 simCtx->
useCfg = PETSC_FALSE;
385 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONG,
386 "Whitelist config file '%s' is empty. Omit -whitelist_config_file to use the default allow-list, or list at least one function.",
394 ierr = PetscStrallocpy(
"main", &simCtx->
allowedFuncs[0]); CHKERRQ(ierr);
395 ierr = PetscStrallocpy(
"CreateSimulationContext", &simCtx->
allowedFuncs[1]); CHKERRQ(ierr);
407 ierr = PetscOptionsGetString(NULL, NULL,
"-profiling_timestep_file", simCtx->
profilingTimestepFile, PETSC_MAX_PATH_LEN, NULL); CHKERRQ(ierr);
408 ierr = PetscOptionsGetBool(NULL, NULL,
"-profiling_final_summary", &simCtx->
profilingFinalSummary, NULL); CHKERRQ(ierr);
412 PetscPrintf(PETSC_COMM_SELF,
"[%s] WARNING: Unknown profiling timestep mode '%s'. Falling back to 'selected'.\n", __func__, simCtx->
profilingTimestepMode);
421 PetscPrintf(PETSC_COMM_SELF,
"[%s] WARNING: Failed to load selected profiling functions from '%s'. Falling back to default list.\n", __func__, simCtx->
profilingSelectedFuncsFile);
447 ierr = PetscOptionsGetInt(NULL, NULL,
"-start_step", &simCtx->
StartStep, NULL); CHKERRQ(ierr);
448 ierr = PetscOptionsGetInt(NULL,NULL,
"-totalsteps", &simCtx->
StepsToRun, NULL); CHKERRQ(ierr);
449 ierr = PetscOptionsGetBool(NULL, NULL,
"-only_setup", &simCtx->
OnlySetup, NULL); CHKERRQ(ierr);
450 ierr = PetscOptionsGetBool(NULL, NULL,
"-continue_mode", &simCtx->
continueMode, NULL); CHKERRQ(ierr);
451 ierr = PetscOptionsGetReal(NULL, NULL,
"-dt", &simCtx->
dt, NULL); CHKERRQ(ierr);
452 ierr = PetscOptionsGetInt(NULL, NULL,
"-tio", &simCtx->
tiout, NULL); CHKERRQ(ierr);
453 ierr = PetscOptionsGetInt(NULL, NULL,
"-particle_console_output_freq", &simCtx->
particleConsoleOutputFreq, &particle_console_output_freq_flg); CHKERRQ(ierr);
454 if (!particle_console_output_freq_flg) {
458 ierr = PetscOptionsGetString(NULL,NULL,
"-output_dir",simCtx->
output_dir,
sizeof(simCtx->
output_dir),NULL);CHKERRQ(ierr);
459 ierr = PetscOptionsGetString(NULL,NULL,
"-restart_dir",simCtx->
restart_dir,
sizeof(simCtx->
restart_dir),NULL);CHKERRQ(ierr);
460 ierr = PetscOptionsGetString(NULL,NULL,
"-log_dir",simCtx->
log_dir,
sizeof(simCtx->
log_dir),NULL);CHKERRQ(ierr);
461 ierr = PetscOptionsGetString(NULL,NULL,
"-euler_subdir",simCtx->
euler_subdir,
sizeof(simCtx->
euler_subdir),NULL);CHKERRQ(ierr);
463 ierr = PetscOptionsGetBool(NULL, NULL,
"-walltime_guard_enabled", &simCtx->
walltimeGuardEnabled, NULL); CHKERRQ(ierr);
464 ierr = PetscOptionsGetInt(NULL, NULL,
"-walltime_guard_warmup_steps", &simCtx->
walltimeGuardWarmupSteps, NULL); CHKERRQ(ierr);
465 ierr = PetscOptionsGetReal(NULL, NULL,
"-walltime_guard_multiplier", &simCtx->
walltimeGuardMultiplier, NULL); CHKERRQ(ierr);
466 ierr = PetscOptionsGetBool(NULL, NULL,
"-runtime_memory_log_enabled", &simCtx->
runtimeMemoryLogEnabled, NULL); CHKERRQ(ierr);
467 ierr = PetscOptionsGetString(NULL, NULL,
"-runtime_memory_log_file", simCtx->
runtimeMemoryLogFile, PETSC_MAX_PATH_LEN, NULL); CHKERRQ(ierr);
468 ierr = PetscOptionsGetReal(NULL, NULL,
"-walltime_guard_min_seconds", &simCtx->
walltimeGuardMinSeconds, NULL); CHKERRQ(ierr);
469 ierr = PetscOptionsGetReal(NULL, NULL,
"-walltime_guard_estimator_alpha", &simCtx->
walltimeGuardEstimatorAlpha, NULL); CHKERRQ(ierr);
472 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONG,
"Invalid value for -walltime_guard_warmup_steps: %d. Must be > 0.", simCtx->
walltimeGuardWarmupSteps);
475 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONG,
"Invalid value for -walltime_guard_multiplier: %.6f. Must be in (0, 5].", (
double)simCtx->
walltimeGuardMultiplier);
478 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONG,
"Invalid value for -walltime_guard_min_seconds: %.6f. Must be > 0.", (
double)simCtx->
walltimeGuardMinSeconds);
481 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONG,
"Invalid value for -walltime_guard_estimator_alpha: %.6f. Must be in (0, 1].", (
double)simCtx->
walltimeGuardEstimatorAlpha);
485 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);
489 const char *job_start_env = getenv(
"PICURV_JOB_START_EPOCH");
490 const char *limit_env = getenv(
"PICURV_WALLTIME_LIMIT_SECONDS");
494 if (!job_start_ok || !limit_ok) {
501 "Runtime walltime guard enabled but %s/%s are missing or invalid. Falling back to external shutdown signals only.\n",
502 "PICURV_JOB_START_EPOCH",
503 "PICURV_WALLTIME_LIMIT_SECONDS"
512 ierr = PetscOptionsGetInt(NULL, NULL,
"-imm", &simCtx->
immersed, NULL); CHKERRQ(ierr);
513 ierr = PetscOptionsGetInt(NULL, NULL,
"-fsi", &simCtx->
movefsi, NULL); CHKERRQ(ierr);
514 ierr = PetscOptionsGetInt(NULL, NULL,
"-rfsi", &simCtx->
rotatefsi, NULL); CHKERRQ(ierr);
515 ierr = PetscOptionsGetInt(NULL, NULL,
"-sediment", &simCtx->
sediment, NULL); CHKERRQ(ierr);
516 ierr = PetscOptionsGetInt(NULL, NULL,
"-rheology", &simCtx->
rheology, NULL); CHKERRQ(ierr);
517 ierr = PetscOptionsGetInt(NULL, NULL,
"-inv", &simCtx->
invicid, NULL); CHKERRQ(ierr);
518 ierr = PetscOptionsGetInt(NULL, NULL,
"-TwoD", &simCtx->
TwoD, NULL); CHKERRQ(ierr);
519 ierr = PetscOptionsGetInt(NULL, NULL,
"-thin", &simCtx->
thin, NULL); CHKERRQ(ierr);
520 ierr = PetscOptionsGetInt(NULL, NULL,
"-mframe", &simCtx->
moveframe, NULL); CHKERRQ(ierr);
521 ierr = PetscOptionsGetInt(NULL, NULL,
"-rframe", &simCtx->
rotateframe, NULL); CHKERRQ(ierr);
522 ierr = PetscOptionsGetInt(NULL, NULL,
"-blk", &simCtx->
blank, NULL); CHKERRQ(ierr);
523 ierr = PetscOptionsGetInt(NULL, NULL,
"-dgf_z", &simCtx->
dgf_z, NULL); CHKERRQ(ierr);
524 ierr = PetscOptionsGetInt(NULL, NULL,
"-dgf_y", &simCtx->
dgf_y, NULL); CHKERRQ(ierr);
525 ierr = PetscOptionsGetInt(NULL, NULL,
"-dgf_x", &simCtx->
dgf_x, NULL); CHKERRQ(ierr);
526 ierr = PetscOptionsGetInt(NULL, NULL,
"-dgf_az", &simCtx->
dgf_az, NULL); CHKERRQ(ierr);
527 ierr = PetscOptionsGetInt(NULL, NULL,
"-dgf_ay", &simCtx->
dgf_ay, NULL); CHKERRQ(ierr);
528 ierr = PetscOptionsGetInt(NULL, NULL,
"-dgf_ax", &simCtx->
dgf_ax, NULL); CHKERRQ(ierr);
533 ierr = PetscOptionsGetInt(NULL, NULL,
"-cop", &simCtx->
cop, NULL); CHKERRQ(ierr);
534 ierr = PetscOptionsGetInt(NULL, NULL,
"-fish", &simCtx->
fish, NULL); CHKERRQ(ierr);
535 ierr = PetscOptionsGetInt(NULL, NULL,
"-pizza", &simCtx->
pizza, NULL); CHKERRQ(ierr);
536 ierr = PetscOptionsGetInt(NULL, NULL,
"-turbine", &simCtx->
turbine, NULL); CHKERRQ(ierr);
537 ierr = PetscOptionsGetInt(NULL, NULL,
"-fishcyl", &simCtx->
fishcyl, NULL); CHKERRQ(ierr);
538 ierr = PetscOptionsGetInt(NULL, NULL,
"-eel", &simCtx->
eel, NULL); CHKERRQ(ierr);
539 ierr = PetscOptionsGetInt(NULL, NULL,
"-cstart", &simCtx->
fish_c, NULL); CHKERRQ(ierr);
540 ierr = PetscOptionsGetInt(NULL, NULL,
"-wing", &simCtx->
wing, NULL); CHKERRQ(ierr);
541 ierr = PetscOptionsGetInt(NULL, NULL,
"-mhv", &simCtx->
MHV, NULL); CHKERRQ(ierr);
542 ierr = PetscOptionsGetInt(NULL, NULL,
"-hydro", &simCtx->
hydro, NULL); CHKERRQ(ierr);
543 ierr = PetscOptionsGetInt(NULL, NULL,
"-lv", &simCtx->
LV, NULL); CHKERRQ(ierr);
544 ierr = PetscOptionsGetInt(NULL, NULL,
"-Pipe", &simCtx->
Pipe, NULL); CHKERRQ(ierr);
545 ierr = PetscOptionsGetInt(NULL, NULL,
"-Turbulent_Channel_z", &simCtx->
channelz, NULL); CHKERRQ(ierr);
546 ierr = PetscOptionsGetReal(NULL,NULL,
"-Turbulent_Channel_z_Driving_Force",&simCtx->
drivingForceMagnitude,NULL);CHKERRQ(ierr);
547 ierr = PetscOptionsGetReal(NULL,NULL,
"-Turbulent_Channel_z_Scaling_Factor",&simCtx->
forceScalingFactor,NULL);CHKERRQ(ierr);
550 char mom_solver_type_char[PETSC_MAX_PATH_LEN];
551 char solution_convergence_mode_char[PETSC_MAX_PATH_LEN];
552 PetscBool mom_solver_type_flg = PETSC_FALSE;
553 PetscBool solution_convergence_mode_flg = PETSC_FALSE;
554 ierr = PetscOptionsGetString(NULL, NULL,
"-mom_solver_type", mom_solver_type_char,
sizeof(mom_solver_type_char), &mom_solver_type_flg); CHKERRQ(ierr);
555 ierr = PetscOptionsGetInt(NULL, NULL,
"-mom_max_pseudo_steps", &simCtx->
mom_max_pseudo_steps, NULL); CHKERRQ(ierr);
556 ierr = PetscOptionsGetReal(NULL, NULL,
"-mom_atol", &simCtx->
mom_atol, NULL); CHKERRQ(ierr);
557 ierr = PetscOptionsGetReal(NULL, NULL,
"-mom_rtol", &simCtx->
mom_rtol, NULL); CHKERRQ(ierr);
558 ierr = PetscOptionsGetReal(NULL, NULL,
"-imp_stol", &simCtx->
imp_stol, NULL); CHKERRQ(ierr);
559 ierr = PetscOptionsGetInt(NULL, NULL,
"-central", &simCtx->
central, NULL); CHKERRQ(ierr);
560 ierr = PetscOptionsGetString(NULL, NULL,
"-solution_convergence_mode",
561 solution_convergence_mode_char,
sizeof(solution_convergence_mode_char),
562 &solution_convergence_mode_flg); CHKERRQ(ierr);
567 if (mom_solver_type_flg) {
568 if(strcmp(mom_solver_type_char,
"DUALTIME_PICARD_RK4") == 0) {
570 }
else if (strcmp(mom_solver_type_char,
"EXPLICIT_RK") == 0) {
573 LOG(
GLOBAL,
LOG_ERROR,
"Invalid value for -mom_solver_type: '%s'. Valid options are: 'DUALTIME_PICARD_RK4', 'EXPLICIT_RK'.\n", mom_solver_type_char);
574 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONG,
"Invalid value for -mom_solver_type: '%s'.", mom_solver_type_char);
578 if (solution_convergence_mode_flg) {
579 if (strcmp(solution_convergence_mode_char,
"STEADY_DETERMINISTIC") == 0) {
581 }
else if (strcmp(solution_convergence_mode_char,
"PERIODIC_DETERMINISTIC") == 0) {
583 }
else if (strcmp(solution_convergence_mode_char,
"STATISTICAL_STEADY") == 0) {
585 }
else if (strcmp(solution_convergence_mode_char,
"TRANSIENT") == 0) {
588 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONG,
589 "Invalid value for -solution_convergence_mode: '%s'.", solution_convergence_mode_char);
595 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONG,
596 "solution convergence mode PERIODIC_DETERMINISTIC requires -solution_convergence_period_steps > 0.");
600 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONG,
601 "solution convergence mode STATISTICAL_STEADY requires -solution_convergence_window_steps > 0.");
605 ierr = PetscOptionsGetInt(NULL, NULL,
"-mg_level", &simCtx->
mglevels, NULL); CHKERRQ(ierr);
606 ierr = PetscOptionsGetInt(NULL, NULL,
"-mg_max_it", &simCtx->
mg_MAX_IT, NULL); CHKERRQ(ierr);
607 ierr = PetscOptionsGetInt(NULL, NULL,
"-mg_idx", &simCtx->
mg_idx, NULL); CHKERRQ(ierr);
608 ierr = PetscOptionsGetInt(NULL, NULL,
"-mg_pre_it", &simCtx->
mg_preItr, NULL); CHKERRQ(ierr);
609 ierr = PetscOptionsGetInt(NULL, NULL,
"-mg_post_it", &simCtx->
mg_poItr, NULL); CHKERRQ(ierr);
612 ierr = PetscOptionsGetInt(NULL, NULL,
"-poisson", &simCtx->
poisson, NULL); CHKERRQ(ierr);
613 ierr = PetscOptionsGetReal(NULL, NULL,
"-poisson_tol", &simCtx->
poisson_tol, NULL); CHKERRQ(ierr);
614 ierr = PetscOptionsGetInt(NULL, NULL,
"-str", &simCtx->
STRONG_COUPLING, NULL); CHKERRQ(ierr);
615 ierr = PetscOptionsGetReal(NULL, NULL,
"-ren", &simCtx->
ren, NULL); CHKERRQ(ierr);
616 ierr = PetscOptionsGetReal(NULL, NULL,
"-pseudo_cfl", &simCtx->
pseudo_cfl, NULL); CHKERRQ(ierr);
617 ierr = PetscOptionsGetReal(NULL, NULL,
"-max_pseudo_cfl", &simCtx->
max_pseudo_cfl, NULL); CHKERRQ(ierr);
618 ierr = PetscOptionsGetReal(NULL, NULL,
"-min_pseudo_cfl", &simCtx->
min_pseudo_cfl, NULL); CHKERRQ(ierr);
620 ierr = PetscOptionsGetReal(NULL, NULL,
"-pseudo_cfl_growth_factor", &simCtx->
pseudo_cfl_growth_factor, NULL); CHKERRQ(ierr);
623 ierr = PetscOptionsGetInt(NULL, NULL,
"-finit", &simCtx->
FieldInitialization, NULL); CHKERRQ(ierr);
624 ierr = PetscOptionsGetReal(NULL, NULL,
"-ucont_x", &simCtx->
InitialConstantContra.
x, NULL); CHKERRQ(ierr);
625 ierr = PetscOptionsGetReal(NULL, NULL,
"-ucont_y", &simCtx->
InitialConstantContra.
y, NULL); CHKERRQ(ierr);
626 ierr = PetscOptionsGetReal(NULL, NULL,
"-ucont_z", &simCtx->
InitialConstantContra.
z, NULL); CHKERRQ(ierr);
630 PetscBool verification_scalar_value_set = PETSC_FALSE;
631 PetscBool verification_scalar_phi0_set = PETSC_FALSE;
632 PetscBool verification_scalar_slope_x_set = PETSC_FALSE;
633 PetscBool verification_scalar_amplitude_set = PETSC_FALSE;
634 PetscBool verification_scalar_kx_set = PETSC_FALSE;
635 PetscBool verification_scalar_ky_set = PETSC_FALSE;
636 PetscBool verification_scalar_kz_set = PETSC_FALSE;
637 ierr = PetscOptionsGetString(NULL, NULL,
"-verification_diffusivity_mode",
640 ierr = PetscOptionsGetString(NULL, NULL,
"-verification_diffusivity_profile",
643 ierr = PetscOptionsGetReal(NULL, NULL,
"-verification_diffusivity_gamma0",
645 ierr = PetscOptionsGetReal(NULL, NULL,
"-verification_diffusivity_slope_x",
647 ierr = PetscOptionsGetString(NULL, NULL,
"-verification_scalar_mode",
650 ierr = PetscOptionsGetString(NULL, NULL,
"-verification_scalar_profile",
653 ierr = PetscOptionsGetReal(NULL, NULL,
"-verification_scalar_value",
655 ierr = PetscOptionsGetReal(NULL, NULL,
"-verification_scalar_phi0",
657 ierr = PetscOptionsGetReal(NULL, NULL,
"-verification_scalar_slope_x",
659 ierr = PetscOptionsGetReal(NULL, NULL,
"-verification_scalar_amplitude",
661 ierr = PetscOptionsGetReal(NULL, NULL,
"-verification_scalar_kx",
663 ierr = PetscOptionsGetReal(NULL, NULL,
"-verification_scalar_ky",
665 ierr = PetscOptionsGetReal(NULL, NULL,
"-verification_scalar_kz",
675 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONGSTATE,
676 "verification diffusivity overrides require -euler_field_source \"analytical\".");
679 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONG,
680 "Unsupported -verification_diffusivity_mode '%s'. Only 'analytical' is supported.",
684 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONG,
685 "Unsupported -verification_diffusivity_profile '%s'. Only 'LINEAR_X' is supported.",
691 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONGSTATE,
692 "verification scalar overrides require -euler_field_source \"analytical\".");
695 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONG,
696 "Unsupported -verification_scalar_mode '%s'. Only 'analytical' is supported.",
700 if (!verification_scalar_value_set) {
701 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONG,
702 "verification scalar profile CONSTANT requires -verification_scalar_value.");
705 if (!verification_scalar_phi0_set || !verification_scalar_slope_x_set) {
706 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONG,
707 "verification scalar profile LINEAR_X requires -verification_scalar_phi0 and -verification_scalar_slope_x.");
710 if (!verification_scalar_amplitude_set || !verification_scalar_kx_set ||
711 !verification_scalar_ky_set || !verification_scalar_kz_set) {
712 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONG,
713 "verification scalar profile SIN_PRODUCT requires -verification_scalar_amplitude, -verification_scalar_kx, -verification_scalar_ky, and -verification_scalar_kz.");
716 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONG,
717 "Unsupported -verification_scalar_profile '%s'. Supported profiles: CONSTANT, LINEAR_X, SIN_PRODUCT.",
725 ierr = PetscOptionsGetReal(NULL,NULL,
"-schmidt_number",&simCtx->
schmidt_number,NULL);CHKERRQ(ierr);
727 ierr = PetscOptionsGetInt(NULL, NULL,
"-no_of_bodies", &simCtx->
NumberOfBodies, NULL); CHKERRQ(ierr);
728 ierr = PetscOptionsGetReal(NULL,NULL,
"-wall_roughness",&simCtx->
wall_roughness_height,NULL);CHKERRQ(ierr);
737 ierr = PetscOptionsGetInt(NULL, NULL,
"-nblk", &simCtx->
block_number, NULL); CHKERRQ(ierr);
738 ierr = PetscOptionsGetInt(NULL, NULL,
"-inlet", &simCtx->
inletprofile, NULL); CHKERRQ(ierr);
739 ierr = PetscOptionsGetInt(NULL, NULL,
"-Ogrid", &simCtx->
Ogrid, NULL); CHKERRQ(ierr);
741 ierr = PetscOptionsGetInt(NULL, NULL,
"-grid1d", &simCtx->
grid1d, NULL); CHKERRQ(ierr);
742 ierr = PetscOptionsGetBool(NULL, NULL,
"-grid", &simCtx->
generate_grid, NULL); CHKERRQ(ierr);
743 ierr = PetscOptionsGetString(NULL, NULL,
"-grid_file", simCtx->
grid_file, PETSC_MAX_PATH_LEN, NULL); CHKERRQ(ierr);
744 ierr = PetscOptionsGetInt(NULL, NULL,
"-da_processors_x", &simCtx->
da_procs_x, NULL); CHKERRQ(ierr);
745 ierr = PetscOptionsGetInt(NULL, NULL,
"-da_processors_y", &simCtx->
da_procs_y, NULL); CHKERRQ(ierr);
746 ierr = PetscOptionsGetInt(NULL, NULL,
"-da_processors_z", &simCtx->
da_procs_z, NULL); CHKERRQ(ierr);
747 ierr = PetscOptionsGetInt(NULL, NULL,
"-i_periodic", &simCtx->
i_periodic, NULL); CHKERRQ(ierr);
748 ierr = PetscOptionsGetInt(NULL, NULL,
"-j_periodic", &simCtx->
j_periodic, NULL); CHKERRQ(ierr);
749 ierr = PetscOptionsGetInt(NULL, NULL,
"-k_periodic", &simCtx->
k_periodic, NULL); CHKERRQ(ierr);
750 ierr = PetscOptionsGetInt(NULL, NULL,
"-pbc_domain", &simCtx->
blkpbc, NULL); CHKERRQ(ierr);
752 ierr = PetscOptionsGetReal(NULL, NULL,
"-grid_rotation_angle", &simCtx->
grid_rotation_angle, NULL); CHKERRQ(ierr);
753 ierr = PetscOptionsGetReal(NULL, NULL,
"-Croty", &simCtx->
Croty, NULL); CHKERRQ(ierr);
754 ierr = PetscOptionsGetReal(NULL, NULL,
"-Crotz", &simCtx->
Crotz, NULL); CHKERRQ(ierr);
756 char file_list_str[PETSC_MAX_PATH_LEN * 10];
758 ierr = PetscOptionsGetString(NULL, NULL,
"-bcs_files", file_list_str,
sizeof(file_list_str), &bcs_flg); CHKERRQ(ierr);
759 ierr = PetscOptionsGetReal(NULL, NULL,
"-U_bc", &simCtx->
U_bc, NULL); CHKERRQ(ierr);
765 ierr = PetscFree(simCtx->
bcs_files[0]); CHKERRQ(ierr);
766 ierr = PetscFree(simCtx->
bcs_files); CHKERRQ(ierr);
773 ierr = PetscStrallocpy(file_list_str, &str_copy); CHKERRQ(ierr);
776 token = strtok(str_copy,
",");
779 token = strtok(NULL,
",");
781 ierr = PetscFree(str_copy); CHKERRQ(ierr);
785 ierr = PetscStrallocpy(file_list_str, &str_copy); CHKERRQ(ierr);
786 token = strtok(str_copy,
",");
788 ierr = PetscStrallocpy(token, &simCtx->
bcs_files[i]); CHKERRQ(ierr);
789 token = strtok(NULL,
",");
791 ierr = PetscFree(str_copy); CHKERRQ(ierr);
797 PetscInt temp_les_model;
798 ierr = PetscOptionsGetInt(NULL, NULL,
"-les", &temp_les_model, NULL); CHKERRQ(ierr);
800 ierr = PetscOptionsGetInt(NULL, NULL,
"-rans", &simCtx->
rans, NULL); CHKERRQ(ierr);
801 ierr = PetscOptionsGetInt(NULL, NULL,
"-wallfunction", &simCtx->
wallfunction, NULL); CHKERRQ(ierr);
802 ierr = PetscOptionsGetInt(NULL, NULL,
"-mixed", &simCtx->
mixed, NULL); CHKERRQ(ierr);
803 ierr = PetscOptionsGetInt(NULL, NULL,
"-clark", &simCtx->
clark, NULL); CHKERRQ(ierr);
804 ierr = PetscOptionsGetInt(NULL, NULL,
"-dynamic_freq", &simCtx->
dynamic_freq, NULL); CHKERRQ(ierr);
805 ierr = PetscOptionsGetReal(NULL, NULL,
"-max_cs", &simCtx->
max_cs, NULL); CHKERRQ(ierr);
806 ierr = PetscOptionsGetReal(NULL, NULL,
"-const_cs", &simCtx->
Const_CS, NULL); CHKERRQ(ierr);
807 ierr = PetscOptionsGetInt(NULL, NULL,
"-testfilter_ik", &simCtx->
testfilter_ik, NULL); CHKERRQ(ierr);
808 ierr = PetscOptionsGetInt(NULL, NULL,
"-testfilter_1d", &simCtx->
testfilter_1d, NULL); CHKERRQ(ierr);
809 ierr = PetscOptionsGetInt(NULL, NULL,
"-i_homo_filter", &simCtx->
i_homo_filter, NULL); CHKERRQ(ierr);
810 ierr = PetscOptionsGetInt(NULL, NULL,
"-j_homo_filter", &simCtx->
j_homo_filter, NULL); CHKERRQ(ierr);
811 ierr = PetscOptionsGetInt(NULL, NULL,
"-k_homo_filter", &simCtx->
k_homo_filter, NULL); CHKERRQ(ierr);
812 ierr = PetscOptionsGetBool(NULL, NULL,
"-averaging", &simCtx->
averaging, NULL); CHKERRQ(ierr);
816 ierr = PetscOptionsGetInt(NULL, NULL,
"-numParticles", &simCtx->
np, NULL); CHKERRQ(ierr);
817 ierr = PetscOptionsGetBool(NULL, NULL,
"-read_fields", &simCtx->
readFields, NULL); CHKERRQ(ierr);
819 ierr = PetscOptionsGetInt(NULL, NULL,
"-pinit", &temp_pinit, NULL); CHKERRQ(ierr);
822 ierr = PetscOptionsGetInt(NULL, NULL,
"-interpolation_method", &temp_interp, NULL); CHKERRQ(ierr);
826 ierr = PetscOptionsGetReal(NULL, NULL,
"-psrc_x", &simCtx->
psrc_x, NULL); CHKERRQ(ierr);
827 ierr = PetscOptionsGetReal(NULL, NULL,
"-psrc_y", &simCtx->
psrc_y, NULL); CHKERRQ(ierr);
828 ierr = PetscOptionsGetReal(NULL, NULL,
"-psrc_z", &simCtx->
psrc_z, NULL); CHKERRQ(ierr);
835 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONG,
"Invalid value for -particle_restart_mode. Must be 'load' or 'init'. You provided '%s'.", simCtx->
particleRestartMode);
840 ierr = PetscOptionsGetBool(NULL, NULL,
"-rs_fsi", &simCtx->
rstart_fsi, NULL); CHKERRQ(ierr);
841 ierr = PetscOptionsGetInt(NULL, NULL,
"-duplicate", &simCtx->
duplicate, NULL); CHKERRQ(ierr);
845 ierr = PetscOptionsGetInt(NULL, NULL,
"-logfreq", &simCtx->
LoggingFrequency, NULL); CHKERRQ(ierr);
848 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);
854 ierr = PetscOptionsGetString(NULL,NULL,
"-postprocessing_config_file",simCtx->
PostprocessingControlFile,PETSC_MAX_PATH_LEN,NULL); CHKERRQ(ierr);
866 for (PetscInt i = 0; i < simCtx->
nAllowed; ++i) {
874 if (simCtx->
tiout > 0) {
881 if (simCtx->
np > 0) {
894 ierr = PetscLogDefaultBegin(); CHKERRQ(ierr);
895 ierr = PetscMemorySetGetMaximumUsage(); CHKERRQ(ierr);
900 PetscFunctionReturn(0);
967 PetscFunctionBeginUser;
968 ierr = MPI_Comm_rank(PETSC_COMM_WORLD, &rank); CHKERRQ(ierr);
983 ierr = PetscSNPrintf(desc,
sizeof(desc),
"BCS file #%d", i + 1); CHKERRQ(ierr);
1027 ierr = PetscRMTree(simCtx->
log_dir);
1029 PetscError(PETSC_COMM_SELF, __LINE__,
__FUNCT__, __FILE__, ierr, PETSC_ERROR_INITIAL,
"Could not remove existing log directory '%s'. Check permissions.", simCtx->
log_dir);
1031 ierr = PetscMkdir(simCtx->
log_dir); CHKERRQ(ierr);
1035 ierr = PetscMkdir(simCtx->
log_dir); CHKERRQ(ierr);
1039 char path_buffer[PETSC_MAX_PATH_LEN];
1043 ierr = PetscTestDirectory(simCtx->
output_dir,
'r', &exists); CHKERRQ(ierr);
1046 ierr = PetscMkdir(simCtx->
output_dir); CHKERRQ(ierr);
1050 ierr = PetscSNPrintf(path_buffer,
sizeof(path_buffer),
"%s/%s", simCtx->
output_dir, simCtx->
euler_subdir); CHKERRQ(ierr);
1052 ierr = PetscTestDirectory(path_buffer,
'r', &exists); CHKERRQ(ierr);
1055 ierr = PetscMkdir(path_buffer); CHKERRQ(ierr);
1059 if (simCtx->
np > 0) {
1060 ierr = PetscSNPrintf(path_buffer,
sizeof(path_buffer),
"%s/%s", simCtx->
output_dir, simCtx->
particle_subdir); CHKERRQ(ierr);
1062 ierr = PetscTestDirectory(path_buffer,
'r', &exists); CHKERRQ(ierr);
1065 ierr = PetscMkdir(path_buffer); CHKERRQ(ierr);
1072 char path_buffer[PETSC_MAX_PATH_LEN];
1074 const char *last_slash_euler = strrchr(pps->
output_prefix,
'/');
1075 if(last_slash_euler){
1078 if(dir_len >=
sizeof(path_buffer)) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_ARG_WRONG,
"Post-processing output prefix path is too long.");
1080 path_buffer[dir_len] =
'\0';
1082 ierr = PetscTestDirectory(path_buffer,
'r', &exists); CHKERRQ(ierr);
1093 if(last_slash_particle){
1096 if(dir_len >
sizeof(path_buffer)) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_ARG_WRONG,
"Post-processing particle output prefix path is too long.");
1098 path_buffer[dir_len] =
'\0';
1100 ierr = PetscTestDirectory(path_buffer,
'r', &exists); CHKERRQ(ierr);
1113 if(last_slash_stats){
1116 if(dir_len >=
sizeof(path_buffer)) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_ARG_WRONG,
"Post-processing statistics output prefix path is too long.");
1118 path_buffer[dir_len] =
'\0';
1120 ierr = PetscTestDirectory(path_buffer,
'r', &exists); CHKERRQ(ierr);
1132 ierr = MPI_Barrier(PETSC_COMM_WORLD); CHKERRMPI(ierr);
1136 PetscFunctionReturn(0);
1319 PetscErrorCode ierr;
1324 PetscFunctionBeginUser;
1330 for (PetscInt level = usermg->
mglevels-1; level >=0; level--) {
1331 for (PetscInt bi = 0; bi < nblk; bi++) {
1334 if(!user->
da || !user->
fda) {
1335 SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_WRONGSTATE,
"DMs not properly initialized in UserCtx before vector creation.");
1342 ierr = DMCreateGlobalVector(user->
fda, &user->
Ucont); CHKERRQ(ierr); ierr = VecSet(user->
Ucont, 0.0); CHKERRQ(ierr);
1343 ierr = DMCreateGlobalVector(user->
fda, &user->
Ucat); CHKERRQ(ierr); ierr = VecSet(user->
Ucat, 0.0); CHKERRQ(ierr);
1344 ierr = DMCreateGlobalVector(user->
da, &user->
P); CHKERRQ(ierr); ierr = VecSet(user->
P, 0.0); CHKERRQ(ierr);
1345 ierr = DMCreateGlobalVector(user->
da, &user->
Nvert); CHKERRQ(ierr); ierr = VecSet(user->
Nvert, 0.0); CHKERRQ(ierr);
1347 ierr = DMCreateLocalVector(user->
fda, &user->
lUcont); CHKERRQ(ierr); ierr = VecSet(user->
lUcont, 0.0); CHKERRQ(ierr);
1348 ierr = DMCreateLocalVector(user->
fda, &user->
lUcat); CHKERRQ(ierr); ierr = VecSet(user->
lUcat, 0.0); CHKERRQ(ierr);
1349 ierr = DMCreateLocalVector(user->
da, &user->
lP); CHKERRQ(ierr); ierr = VecSet(user->
lP, 0.0); CHKERRQ(ierr);
1350 ierr = DMCreateLocalVector(user->
da, &user->
lNvert); CHKERRQ(ierr); ierr = VecSet(user->
lNvert, 0.0); CHKERRQ(ierr);
1353 ierr = VecDuplicate(user->
P,&user->
Diffusivity); CHKERRQ(ierr); ierr = VecSet(user->
Diffusivity, 0.0); CHKERRQ(ierr);
1359 ierr = VecDuplicate(user->
P, &user->
Phi); CHKERRQ(ierr); ierr = VecSet(user->
Phi, 0.0); CHKERRQ(ierr);
1360 ierr = VecDuplicate(user->
lP, &user->
lPhi); CHKERRQ(ierr); ierr = VecSet(user->
lPhi, 0.0); CHKERRQ(ierr);
1363 if (level == usermg->
mglevels - 1) {
1364 ierr = VecDuplicate(user->
Ucont, &user->
Ucont_o); CHKERRQ(ierr); ierr = VecSet(user->
Ucont_o, 0.0); CHKERRQ(ierr);
1365 ierr = VecDuplicate(user->
Ucont, &user->
Ucont_rm1); CHKERRQ(ierr); ierr = VecSet(user->
Ucont_rm1, 0.0); CHKERRQ(ierr);
1366 ierr = VecDuplicate(user->
Ucat, &user->
Ucat_o); CHKERRQ(ierr); ierr = VecSet(user->
Ucat_o, 0.0); CHKERRQ(ierr);
1367 ierr = VecDuplicate(user->
P, &user->
P_o); CHKERRQ(ierr); ierr = VecSet(user->
P_o, 0.0); CHKERRQ(ierr);
1368 ierr = VecDuplicate(user->
lUcont, &user->
lUcont_o); CHKERRQ(ierr); ierr = VecSet(user->
lUcont_o, 0.0); CHKERRQ(ierr);
1370 ierr = DMCreateLocalVector(user->
da, &user->
lNvert_o); CHKERRQ(ierr); ierr = VecSet(user->
lNvert_o, 0.0); CHKERRQ(ierr);
1371 ierr = VecDuplicate(user->
Nvert, &user->
Nvert_o); CHKERRQ(ierr); ierr = VecSet(user->
Nvert_o, 0.0); CHKERRQ(ierr);
1375 ierr = DMCreateGlobalVector(user->
fda, &user->
Csi); CHKERRQ(ierr); ierr = VecSet(user->
Csi, 0.0); CHKERRQ(ierr);
1376 ierr = VecDuplicate(user->
Csi, &user->
Eta); CHKERRQ(ierr); ierr = VecSet(user->
Eta, 0.0); CHKERRQ(ierr);
1377 ierr = VecDuplicate(user->
Csi, &user->
Zet); CHKERRQ(ierr); ierr = VecSet(user->
Zet, 0.0); CHKERRQ(ierr);
1378 ierr = DMCreateGlobalVector(user->
da, &user->
Aj); CHKERRQ(ierr); ierr = VecSet(user->
Aj, 0.0); CHKERRQ(ierr);
1380 ierr = DMCreateLocalVector(user->
fda, &user->
lCsi); CHKERRQ(ierr); ierr = VecSet(user->
lCsi, 0.0); CHKERRQ(ierr);
1381 ierr = VecDuplicate(user->
lCsi, &user->
lEta); CHKERRQ(ierr); ierr = VecSet(user->
lEta, 0.0); CHKERRQ(ierr);
1382 ierr = VecDuplicate(user->
lCsi, &user->
lZet); CHKERRQ(ierr); ierr = VecSet(user->
lZet, 0.0); CHKERRQ(ierr);
1383 ierr = DMCreateLocalVector(user->
da, &user->
lAj); CHKERRQ(ierr); ierr = VecSet(user->
lAj, 0.0); CHKERRQ(ierr);
1388 ierr = VecDuplicate(user->
Csi, &user->
ICsi); CHKERRQ(ierr); ierr = VecSet(user->
ICsi, 0.0); CHKERRQ(ierr);
1389 ierr = VecDuplicate(user->
Csi, &user->
IEta); CHKERRQ(ierr); ierr = VecSet(user->
IEta, 0.0); CHKERRQ(ierr);
1390 ierr = VecDuplicate(user->
Csi, &user->
IZet); CHKERRQ(ierr); ierr = VecSet(user->
IZet, 0.0); CHKERRQ(ierr);
1391 ierr = VecDuplicate(user->
Csi, &user->
JCsi); CHKERRQ(ierr); ierr = VecSet(user->
JCsi, 0.0); CHKERRQ(ierr);
1392 ierr = VecDuplicate(user->
Csi, &user->
JEta); CHKERRQ(ierr); ierr = VecSet(user->
JEta, 0.0); CHKERRQ(ierr);
1393 ierr = VecDuplicate(user->
Csi, &user->
JZet); CHKERRQ(ierr); ierr = VecSet(user->
JZet, 0.0); CHKERRQ(ierr);
1394 ierr = VecDuplicate(user->
Csi, &user->
KCsi); CHKERRQ(ierr); ierr = VecSet(user->
KCsi, 0.0); CHKERRQ(ierr);
1395 ierr = VecDuplicate(user->
Csi, &user->
KEta); CHKERRQ(ierr); ierr = VecSet(user->
KEta, 0.0); CHKERRQ(ierr);
1396 ierr = VecDuplicate(user->
Csi, &user->
KZet); CHKERRQ(ierr); ierr = VecSet(user->
KZet, 0.0); CHKERRQ(ierr);
1398 ierr = VecDuplicate(user->
Aj, &user->
IAj); CHKERRQ(ierr); ierr = VecSet(user->
IAj, 0.0); CHKERRQ(ierr);
1399 ierr = VecDuplicate(user->
Aj, &user->
JAj); CHKERRQ(ierr); ierr = VecSet(user->
JAj, 0.0); CHKERRQ(ierr);
1400 ierr = VecDuplicate(user->
Aj, &user->
KAj); CHKERRQ(ierr); ierr = VecSet(user->
KAj, 0.0); CHKERRQ(ierr);
1402 ierr = VecDuplicate(user->
lCsi, &user->
lICsi); CHKERRQ(ierr); ierr = VecSet(user->
lICsi, 0.0); CHKERRQ(ierr);
1403 ierr = VecDuplicate(user->
lCsi, &user->
lIEta); CHKERRQ(ierr); ierr = VecSet(user->
lIEta, 0.0); CHKERRQ(ierr);
1404 ierr = VecDuplicate(user->
lCsi, &user->
lIZet); CHKERRQ(ierr); ierr = VecSet(user->
lIZet, 0.0); CHKERRQ(ierr);
1405 ierr = VecDuplicate(user->
lCsi, &user->
lJCsi); CHKERRQ(ierr); ierr = VecSet(user->
lJCsi, 0.0); CHKERRQ(ierr);
1406 ierr = VecDuplicate(user->
lCsi, &user->
lJEta); CHKERRQ(ierr); ierr = VecSet(user->
lJEta, 0.0); CHKERRQ(ierr);
1407 ierr = VecDuplicate(user->
lCsi, &user->
lJZet); CHKERRQ(ierr); ierr = VecSet(user->
lJZet, 0.0); CHKERRQ(ierr);
1408 ierr = VecDuplicate(user->
lCsi, &user->
lKCsi); CHKERRQ(ierr); ierr = VecSet(user->
lKCsi, 0.0); CHKERRQ(ierr);
1409 ierr = VecDuplicate(user->
lCsi, &user->
lKEta); CHKERRQ(ierr); ierr = VecSet(user->
lKEta, 0.0); CHKERRQ(ierr);
1410 ierr = VecDuplicate(user->
lCsi, &user->
lKZet); CHKERRQ(ierr); ierr = VecSet(user->
lKZet, 0.0); CHKERRQ(ierr);
1412 ierr = VecDuplicate(user->
lAj, &user->
lIAj); CHKERRQ(ierr); ierr = VecSet(user->
lIAj, 0.0); CHKERRQ(ierr);
1413 ierr = VecDuplicate(user->
lAj, &user->
lJAj); CHKERRQ(ierr); ierr = VecSet(user->
lJAj, 0.0); CHKERRQ(ierr);
1414 ierr = VecDuplicate(user->
lAj, &user->
lKAj); CHKERRQ(ierr); ierr = VecSet(user->
lKAj, 0.0); CHKERRQ(ierr);
1417 ierr = DMCreateGlobalVector(user->
fda, &user->
Cent); CHKERRQ(ierr); ierr = VecSet(user->
Cent, 0.0); CHKERRQ(ierr);
1418 ierr = DMCreateLocalVector(user->
fda, &user->
lCent); CHKERRQ(ierr); ierr = VecSet(user->
lCent, 0.0); CHKERRQ(ierr);
1420 ierr = VecDuplicate(user->
Cent, &user->
GridSpace); CHKERRQ(ierr); ierr = VecSet(user->
GridSpace, 0.0); CHKERRQ(ierr);
1421 ierr = VecDuplicate(user->
lCent, &user->
lGridSpace); CHKERRQ(ierr); ierr = VecSet(user->
lGridSpace, 0.0); CHKERRQ(ierr);
1424 ierr = VecDuplicate(user->
lCent, &user->
Centx); CHKERRQ(ierr); ierr = VecSet(user->
Centx, 0.0); CHKERRQ(ierr);
1425 ierr = VecDuplicate(user->
lCent, &user->
Centy); CHKERRQ(ierr); ierr = VecSet(user->
Centy, 0.0); CHKERRQ(ierr);
1426 ierr = VecDuplicate(user->
lCent, &user->
Centz); CHKERRQ(ierr); ierr = VecSet(user->
Centz, 0.0); CHKERRQ(ierr);
1430 if (simCtx->
les || simCtx->
rans) {
1431 ierr = DMCreateGlobalVector(user->
da, &user->
Nu_t); CHKERRQ(ierr); ierr = VecSet(user->
Nu_t, 0.0); CHKERRQ(ierr);
1432 ierr = DMCreateLocalVector(user->
da, &user->
lNu_t); CHKERRQ(ierr); ierr = VecSet(user->
lNu_t, 0.0); CHKERRQ(ierr);
1435 ierr = DMCreateGlobalVector(user->
da,&user->
CS); CHKERRQ(ierr); ierr = VecSet(user->
CS,0.0); CHKERRQ(ierr);
1436 ierr = DMCreateLocalVector(user->
da,&user->
lCs); CHKERRQ(ierr); ierr = VecSet(user->
lCs,0.0); CHKERRQ(ierr);
1454 ierr = DMCreateGlobalVector(user->
da,&user->
Psi); CHKERRQ(ierr); ierr = VecSet(user->
Psi,0.0); CHKERRQ(ierr);
1455 ierr = DMCreateLocalVector(user->
da,&user->
lPsi); CHKERRQ(ierr); ierr = VecSet(user->
lPsi,0.0); CHKERRQ(ierr);
1460 ierr = DMCreateGlobalVector(user->
fda, &user->
Bcs.
Ubcs); CHKERRQ(ierr);
1461 ierr = VecSet(user->
Bcs.
Ubcs, 0.0); CHKERRQ(ierr);
1462 ierr = DMCreateGlobalVector(user->
fda, &user->
Bcs.
Uch); CHKERRQ(ierr);
1463 ierr = VecSet(user->
Bcs.
Uch, 0.0); CHKERRQ(ierr);
1469 ierr = VecDuplicate(user->
P, &user->
P_nodal); CHKERRQ(ierr);
1470 ierr = VecSet(user->
P_nodal, 0.0); CHKERRQ(ierr);
1472 ierr = VecDuplicate(user->
Ucat, &user->
Ucat_nodal); CHKERRQ(ierr);
1473 ierr = VecSet(user->
Ucat_nodal, 0.0); CHKERRQ(ierr);
1475 ierr = VecDuplicate(user->
P, &user->
Qcrit); CHKERRQ(ierr);
1476 ierr = VecSet(user->
Qcrit, 0.0); CHKERRQ(ierr);
1481 ierr = VecDuplicate(user->
Psi, &user->
Psi_nodal); CHKERRQ(ierr);
1482 ierr = VecSet(user->
Psi_nodal, 0.0); CHKERRQ(ierr);
1501 PetscFunctionReturn(0);
1512 PetscErrorCode ierr;
1514 Vec globalVec = NULL;
1515 Vec localVec = NULL;
1518 PetscFunctionBeginUser;
1520 ierr = MPI_Comm_rank(PETSC_COMM_WORLD, &rank); CHKERRQ(ierr);
1524 if (strcmp(fieldName,
"Ucat") == 0) {
1525 globalVec = user->
Ucat;
1526 localVec = user->
lUcat;
1528 }
else if (strcmp(fieldName,
"Ucont") == 0) {
1529 globalVec = user->
Ucont;
1532 }
else if (strcmp(fieldName,
"P") == 0) {
1533 globalVec = user->
P;
1534 localVec = user->
lP;
1536 }
else if (strcmp(fieldName,
"Diffusivity") == 0) {
1540 }
else if (strcmp(fieldName,
"DiffusivityGradient") == 0) {
1544 }
else if (strcmp(fieldName,
"Csi") == 0) {
1545 globalVec = user->
Csi;
1546 localVec = user->
lCsi;
1548 }
else if (strcmp(fieldName,
"Eta") == 0) {
1549 globalVec = user->
Eta;
1550 localVec = user->
lEta;
1552 }
else if (strcmp(fieldName,
"Zet") == 0) {
1553 globalVec = user->
Zet;
1554 localVec = user->
lZet;
1556 }
else if (strcmp(fieldName,
"Nvert") == 0) {
1557 globalVec = user->
Nvert;
1561 }
else if (strcmp(fieldName,
"Aj") == 0) {
1562 globalVec = user->
Aj;
1563 localVec = user->
lAj;
1565 }
else if (strcmp(fieldName,
"Cent") == 0) {
1566 globalVec = user->
Cent;
1567 localVec = user->
lCent;
1569 }
else if (strcmp(fieldName,
"GridSpace") == 0) {
1573 }
else if (strcmp(fieldName,
"ICsi") == 0){
1574 globalVec = user->
ICsi;
1575 localVec = user->
lICsi;
1577 }
else if (strcmp(fieldName,
"IEta") == 0){
1578 globalVec = user->
IEta;
1579 localVec = user->
lIEta;
1581 }
else if (strcmp(fieldName,
"IZet") == 0){
1582 globalVec = user->
IZet;
1583 localVec = user->
lIZet;
1585 }
else if (strcmp(fieldName,
"JCsi") == 0){
1586 globalVec = user->
JCsi;
1587 localVec = user->
lJCsi;
1589 }
else if (strcmp(fieldName,
"JEta") == 0){
1590 globalVec = user->
JEta;
1591 localVec = user->
lJEta;
1593 }
else if (strcmp(fieldName,
"JZet") == 0){
1594 globalVec = user->
JZet;
1595 localVec = user->
lJZet;
1597 }
else if (strcmp(fieldName,
"KCsi") == 0){
1598 globalVec = user->
KCsi;
1599 localVec = user->
lKCsi;
1601 }
else if (strcmp(fieldName,
"KEta") == 0){
1602 globalVec = user->
KEta;
1603 localVec = user->
lKEta;
1605 }
else if (strcmp(fieldName,
"KZet") == 0){
1606 globalVec = user->
KZet;
1607 localVec = user->
lKZet;
1609 }
else if (strcmp(fieldName,
"IAj") == 0){
1610 globalVec = user->
IAj;
1611 localVec = user->
lIAj;
1613 }
else if (strcmp(fieldName,
"JAj") == 0){
1614 globalVec = user->
JAj;
1615 localVec = user->
lJAj;
1617 }
else if (strcmp(fieldName,
"KAj") == 0){
1618 globalVec = user->
KAj;
1619 localVec = user->
lKAj;
1621 }
else if (strcmp(fieldName,
"Phi") == 0){
1622 globalVec = user->
Phi;
1623 localVec = user->
lPhi;
1625 }
else if (strcmp(fieldName,
"Psi") == 0){
1626 globalVec = user->
Psi;
1627 localVec = user->
lPsi;
1630 SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_UNKNOWN_TYPE,
"Field '%s' not recognized for ghost update.", fieldName);
1635 SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE,
"Global vector for field '%s' is NULL.", fieldName);
1638 SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE,
"Local vector for field '%s' is NULL.", fieldName);
1641 SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE,
"DM for field '%s' is NULL.", fieldName);
1645 rank, fieldName, (
void*)dm, (
void*)globalVec, (
void*)localVec);
1651 PetscReal norm_global_before;
1652 ierr = VecNorm(globalVec, NORM_INFINITY, &norm_global_before); CHKERRQ(ierr);
1653 LOG_ALLOW(
GLOBAL,
LOG_INFO,
"Max norm '%s' (Global) BEFORE Ghost Update: %g\n", fieldName, norm_global_before);
1662 ierr = DMGlobalToLocalBegin(dm, globalVec, INSERT_VALUES, localVec); CHKERRQ(ierr);
1663 ierr = DMGlobalToLocalEnd(dm, globalVec, INSERT_VALUES, localVec); CHKERRQ(ierr);
1670 PetscReal norm_local_after;
1671 ierr = VecNorm(localVec, NORM_INFINITY, &norm_local_after); CHKERRQ(ierr);
1676 if (strcmp(fieldName,
"Ucat") == 0) {
1677 PetscMPIInt rank_test;
1678 MPI_Comm_rank(PETSC_COMM_WORLD, &rank_test);
1681 DMDALocalInfo info_check;
1682 ierr = DMDAGetLocalInfo(dm, &info_check); CHKERRQ(ierr);
1685 Cmpnts ***lUcat_arr_test = NULL;
1686 PetscErrorCode ierr_test = 0;
1688 LOG_ALLOW(
LOCAL,
LOG_DEBUG,
"Rank %d: Testing '%s' access immediately after ghost update...\n", rank_test, fieldName);
1689 ierr_test = DMDAVecGetArrayDOFRead(dm, localVec, &lUcat_arr_test);
1692 LOG_ALLOW(
LOCAL,
LOG_ERROR,
"Rank %d: ERROR %d getting '%s' array after ghost update!\n", rank_test, ierr_test, fieldName);
1693 }
else if (!lUcat_arr_test) {
1694 LOG_ALLOW(
LOCAL,
LOG_ERROR,
"Rank %d: ERROR NULL pointer getting '%s' array after ghost update!\n", rank_test, fieldName);
1698 PetscInt k_int = info_check.zs + (info_check.zm > 1 ? 1 : 0);
1699 PetscInt j_int = info_check.ys + (info_check.ym > 1 ? 1 : 0);
1700 PetscInt i_int = info_check.xs + (info_check.xm > 1 ? 1 : 0);
1706 if (k_int >= info_check.mz - 1) {
1707 k_int = info_check.mz - 2;
1714 if (j_int >= info_check.my - 1) {
1715 j_int = info_check.my - 2;
1722 if (i_int >= info_check.mx - 1) {
1723 i_int = info_check.mx - 2;
1730 if (k_int >= info_check.zs && k_int < info_check.zs + info_check.zm &&
1731 j_int >= info_check.ys && j_int < info_check.ys + info_check.ym &&
1732 i_int >= info_check.xs && i_int < info_check.xs + info_check.xm)
1734 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);
1735 Cmpnts test_val_owned_interior = lUcat_arr_test[k_int][j_int][i_int];
1736 LOG_ALLOW(
LOCAL,
LOG_DEBUG,
"Rank %d: SUCCESS reading owned interior: x=%g\n", rank_test, test_val_owned_interior.
x);
1738 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);
1743 PetscInt k_bnd = info_check.zs;
1744 PetscInt j_bnd = info_check.ys;
1745 PetscInt i_bnd = info_check.xs;
1746 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);
1747 Cmpnts test_val_owned_boundary = lUcat_arr_test[k_bnd][j_bnd][i_bnd];
1748 LOG_ALLOW(
LOCAL,
LOG_DEBUG,
"Rank %d: SUCCESS reading owned boundary: x=%g\n", rank_test, test_val_owned_boundary.
x);
1752 if (info_check.zs > 0) {
1753 PetscInt k_ghost = info_check.zs - 1;
1754 PetscInt j_ghost = info_check.ys;
1755 PetscInt i_ghost = info_check.xs;
1756 LOG_ALLOW(
LOCAL,
LOG_DEBUG,
"Rank %d: Attempting test read GHOST [%d][%d][%d] (Global)\n", rank_test, k_ghost, j_ghost, i_ghost);
1757 Cmpnts test_val_ghost = lUcat_arr_test[k_ghost][j_ghost][i_ghost];
1764 ierr_test = DMDAVecRestoreArrayDOFRead(dm, localVec, &lUcat_arr_test);
1765 if(ierr_test){
LOG_ALLOW(
LOCAL,
LOG_ERROR,
"Rank %d: ERROR %d restoring '%s' array after test read!\n", rank_test, ierr_test, fieldName); }
1773 PetscFunctionReturn(0);
2398 PetscErrorCode ierr;
2400 Cmpnts ***lcsi_arr, ***leta_arr, ***lzet_arr;
2403 PetscReal ***lnvert_arr;
2404 PetscReal ***laj_arr;
2406 PetscFunctionBeginUser;
2413 ierr = DMDAGetLocalInfo(user->
fda, &info); CHKERRQ(ierr);
2415 SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONGSTATE,
"Contra2Cart requires lUcont, lCsi/Eta/Zet, lNvert, and Ucat to be non-NULL.");
2420 ierr = DMDAVecGetArrayRead(user->
fda, user->
lUcont, &lucont_arr); CHKERRQ(ierr);
2421 ierr = DMDAVecGetArrayRead(user->
fda, user->
lCsi, &lcsi_arr); CHKERRQ(ierr);
2422 ierr = DMDAVecGetArrayRead(user->
fda, user->
lEta, &leta_arr); CHKERRQ(ierr);
2423 ierr = DMDAVecGetArrayRead(user->
fda, user->
lZet, &lzet_arr); CHKERRQ(ierr);
2424 ierr = DMDAVecGetArrayRead(user->
da, user->
lNvert, &lnvert_arr); CHKERRQ(ierr);
2425 ierr = DMDAVecGetArrayRead(user->
da, user->
lAj, &laj_arr); CHKERRQ(ierr);
2430 ierr = DMDAVecGetArray(user->
fda, user->
Ucat, &gucat_arr); CHKERRQ(ierr);
2437 PetscInt i_start = (info.xs == 0) ? info.xs + 1 : info.xs;
2438 PetscInt i_end = (info.xs + info.xm == info.mx) ? info.xs + info.xm - 1 : info.xs + info.xm;
2440 PetscInt j_start = (info.ys == 0) ? info.ys + 1 : info.ys;
2441 PetscInt j_end = (info.ys + info.ym == info.my) ? info.ys + info.ym - 1 : info.ys + info.ym;
2443 PetscInt k_start = (info.zs == 0) ? info.zs + 1 : info.zs;
2444 PetscInt k_end = (info.zs + info.zm == info.mz) ? info.zs + info.zm - 1 : info.zs + info.zm;
2448 for (PetscInt k_cell = k_start; k_cell < k_end; ++k_cell) {
2449 for (PetscInt j_cell = j_start; j_cell < j_end; ++j_cell) {
2450 for (PetscInt i_cell = i_start; i_cell < i_end; ++i_cell) {
2457 PetscReal mat[3][3];
2461 mat[0][0] = 0.5 * (lcsi_arr[k_cell][j_cell][i_cell-1].
x + lcsi_arr[k_cell][j_cell][i_cell].
x);
2462 mat[0][1] = 0.5 * (lcsi_arr[k_cell][j_cell][i_cell-1].
y + lcsi_arr[k_cell][j_cell][i_cell].
y);
2463 mat[0][2] = 0.5 * (lcsi_arr[k_cell][j_cell][i_cell-1].
z + lcsi_arr[k_cell][j_cell][i_cell].
z);
2465 mat[1][0] = 0.5 * (leta_arr[k_cell][j_cell-1][i_cell].
x + leta_arr[k_cell][j_cell][i_cell].
x);
2466 mat[1][1] = 0.5 * (leta_arr[k_cell][j_cell-1][i_cell].
y + leta_arr[k_cell][j_cell][i_cell].
y);
2467 mat[1][2] = 0.5 * (leta_arr[k_cell][j_cell-1][i_cell].
z + leta_arr[k_cell][j_cell][i_cell].
z);
2469 mat[2][0] = 0.5 * (lzet_arr[k_cell-1][j_cell][i_cell].
x + lzet_arr[k_cell][j_cell][i_cell].
x);
2470 mat[2][1] = 0.5 * (lzet_arr[k_cell-1][j_cell][i_cell].
y + lzet_arr[k_cell][j_cell][i_cell].
y);
2471 mat[2][2] = 0.5 * (lzet_arr[k_cell-1][j_cell][i_cell].
z + lzet_arr[k_cell][j_cell][i_cell].
z);
2476 q[0] = 0.5 * (lucont_arr[k_cell][j_cell][i_cell-1].
x + lucont_arr[k_cell][j_cell][i_cell].
x);
2477 q[1] = 0.5 * (lucont_arr[k_cell][j_cell-1][i_cell].
y + lucont_arr[k_cell][j_cell][i_cell].
y);
2478 q[2] = 0.5 * (lucont_arr[k_cell-1][j_cell][i_cell].
z + lucont_arr[k_cell][j_cell][i_cell].
z);
2481 PetscReal det = mat[0][0] * (mat[1][1] * mat[2][2] - mat[1][2] * mat[2][1]) -
2482 mat[0][1] * (mat[1][0] * mat[2][2] - mat[1][2] * mat[2][0]) +
2483 mat[0][2] * (mat[1][0] * mat[2][1] - mat[1][1] * mat[2][0]);
2485 if (PetscAbsReal(det) < 1.0e-18) {
2486 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);
2489 PetscReal det_inv = 1.0 / det;
2491 PetscReal det0 = q[0] * (mat[1][1] * mat[2][2] - mat[1][2] * mat[2][1]) -
2492 q[1] * (mat[0][1] * mat[2][2] - mat[0][2] * mat[2][1]) +
2493 q[2] * (mat[0][1] * mat[1][2] - mat[0][2] * mat[1][1]);
2495 PetscReal det1 = -q[0] * (mat[1][0] * mat[2][2] - mat[1][2] * mat[2][0]) +
2496 q[1] * (mat[0][0] * mat[2][2] - mat[0][2] * mat[2][0]) -
2497 q[2] * (mat[0][0] * mat[1][2] - mat[0][2] * mat[1][0]);
2499 PetscReal det2 = q[0] * (mat[1][0] * mat[2][1] - mat[1][1] * mat[2][0]) -
2500 q[1] * (mat[0][0] * mat[2][1] - mat[0][1] * mat[2][0]) +
2501 q[2] * (mat[0][0] * mat[1][1] - mat[0][1] * mat[1][0]);
2505 gucat_arr[k_cell][j_cell][i_cell].
x = det0 * det_inv;
2506 gucat_arr[k_cell][j_cell][i_cell].
y = det1 * det_inv;
2507 gucat_arr[k_cell][j_cell][i_cell].
z = det2 * det_inv;
2513 ierr = DMDAVecRestoreArrayRead(user->
fda, user->
lUcont, &lucont_arr); CHKERRQ(ierr);
2514 ierr = DMDAVecRestoreArrayRead(user->
fda, user->
lCsi, &lcsi_arr); CHKERRQ(ierr);
2515 ierr = DMDAVecRestoreArrayRead(user->
fda, user->
lEta, &leta_arr); CHKERRQ(ierr);
2516 ierr = DMDAVecRestoreArrayRead(user->
fda, user->
lZet, &lzet_arr); CHKERRQ(ierr);
2517 ierr = DMDAVecRestoreArrayRead(user->
da, user->
lNvert, &lnvert_arr); CHKERRQ(ierr);
2518 ierr = DMDAVecRestoreArrayRead(user->
da, user->
lAj, &laj_arr); CHKERRQ(ierr);
2519 ierr = DMDAVecRestoreArray(user->
fda, user->
Ucat, &gucat_arr); CHKERRQ(ierr);
2523 PetscFunctionReturn(0);
3105 PetscErrorCode ierr;
3106 PetscFunctionBeginUser;
3109 if (user->
Ucont) { ierr = VecDestroy(&user->
Ucont); CHKERRQ(ierr); }
3110 if (user->
lUcont) { ierr = VecDestroy(&user->
lUcont); CHKERRQ(ierr); }
3111 if (user->
Ucat) { ierr = VecDestroy(&user->
Ucat); CHKERRQ(ierr); }
3112 if (user->
lUcat) { ierr = VecDestroy(&user->
lUcat); CHKERRQ(ierr); }
3113 if (user->
P) { ierr = VecDestroy(&user->
P); CHKERRQ(ierr); }
3114 if (user->
lP) { ierr = VecDestroy(&user->
lP); CHKERRQ(ierr); }
3115 if (user->
Nvert) { ierr = VecDestroy(&user->
Nvert); CHKERRQ(ierr); }
3116 if (user->
lNvert) { ierr = VecDestroy(&user->
lNvert); CHKERRQ(ierr); }
3125 if (user->
Phi) { ierr = VecDestroy(&user->
Phi); CHKERRQ(ierr); }
3126 if (user->
lPhi) { ierr = VecDestroy(&user->
lPhi); CHKERRQ(ierr); }
3129 if (user->
Ucont_o) { ierr = VecDestroy(&user->
Ucont_o); CHKERRQ(ierr); }
3131 if (user->
Ucat_o) { ierr = VecDestroy(&user->
Ucat_o); CHKERRQ(ierr); }
3132 if (user->
P_o) { ierr = VecDestroy(&user->
P_o); CHKERRQ(ierr); }
3133 if (user->
Nvert_o) { ierr = VecDestroy(&user->
Nvert_o); CHKERRQ(ierr); }
3139 if (user->
Csi) { ierr = VecDestroy(&user->
Csi); CHKERRQ(ierr); }
3140 if (user->
Eta) { ierr = VecDestroy(&user->
Eta); CHKERRQ(ierr); }
3141 if (user->
Zet) { ierr = VecDestroy(&user->
Zet); CHKERRQ(ierr); }
3142 if (user->
Aj) { ierr = VecDestroy(&user->
Aj); CHKERRQ(ierr); }
3143 if (user->
lCsi) { ierr = VecDestroy(&user->
lCsi); CHKERRQ(ierr); }
3144 if (user->
lEta) { ierr = VecDestroy(&user->
lEta); CHKERRQ(ierr); }
3145 if (user->
lZet) { ierr = VecDestroy(&user->
lZet); CHKERRQ(ierr); }
3146 if (user->
lAj) { ierr = VecDestroy(&user->
lAj); CHKERRQ(ierr); }
3149 if (user->
ICsi) { ierr = VecDestroy(&user->
ICsi); CHKERRQ(ierr); }
3150 if (user->
IEta) { ierr = VecDestroy(&user->
IEta); CHKERRQ(ierr); }
3151 if (user->
IZet) { ierr = VecDestroy(&user->
IZet); CHKERRQ(ierr); }
3152 if (user->
JCsi) { ierr = VecDestroy(&user->
JCsi); CHKERRQ(ierr); }
3153 if (user->
JEta) { ierr = VecDestroy(&user->
JEta); CHKERRQ(ierr); }
3154 if (user->
JZet) { ierr = VecDestroy(&user->
JZet); CHKERRQ(ierr); }
3155 if (user->
KCsi) { ierr = VecDestroy(&user->
KCsi); CHKERRQ(ierr); }
3156 if (user->
KEta) { ierr = VecDestroy(&user->
KEta); CHKERRQ(ierr); }
3157 if (user->
KZet) { ierr = VecDestroy(&user->
KZet); CHKERRQ(ierr); }
3158 if (user->
IAj) { ierr = VecDestroy(&user->
IAj); CHKERRQ(ierr); }
3159 if (user->
JAj) { ierr = VecDestroy(&user->
JAj); CHKERRQ(ierr); }
3160 if (user->
KAj) { ierr = VecDestroy(&user->
KAj); CHKERRQ(ierr); }
3161 if (user->
lICsi) { ierr = VecDestroy(&user->
lICsi); CHKERRQ(ierr); }
3162 if (user->
lIEta) { ierr = VecDestroy(&user->
lIEta); CHKERRQ(ierr); }
3163 if (user->
lIZet) { ierr = VecDestroy(&user->
lIZet); CHKERRQ(ierr); }
3164 if (user->
lJCsi) { ierr = VecDestroy(&user->
lJCsi); CHKERRQ(ierr); }
3165 if (user->
lJEta) { ierr = VecDestroy(&user->
lJEta); CHKERRQ(ierr); }
3166 if (user->
lJZet) { ierr = VecDestroy(&user->
lJZet); CHKERRQ(ierr); }
3167 if (user->
lKCsi) { ierr = VecDestroy(&user->
lKCsi); CHKERRQ(ierr); }
3168 if (user->
lKEta) { ierr = VecDestroy(&user->
lKEta); CHKERRQ(ierr); }
3169 if (user->
lKZet) { ierr = VecDestroy(&user->
lKZet); CHKERRQ(ierr); }
3170 if (user->
lIAj) { ierr = VecDestroy(&user->
lIAj); CHKERRQ(ierr); }
3171 if (user->
lJAj) { ierr = VecDestroy(&user->
lJAj); CHKERRQ(ierr); }
3172 if (user->
lKAj) { ierr = VecDestroy(&user->
lKAj); CHKERRQ(ierr); }
3175 if (user->
Cent) { ierr = VecDestroy(&user->
Cent); CHKERRQ(ierr); }
3176 if (user->
lCent) { ierr = VecDestroy(&user->
lCent); CHKERRQ(ierr); }
3179 if (user->
Centx) { ierr = VecDestroy(&user->
Centx); CHKERRQ(ierr); }
3180 if (user->
Centy) { ierr = VecDestroy(&user->
Centy); CHKERRQ(ierr); }
3181 if (user->
Centz) { ierr = VecDestroy(&user->
Centz); CHKERRQ(ierr); }
3184 if (user->
Nu_t) { ierr = VecDestroy(&user->
Nu_t); CHKERRQ(ierr); }
3185 if (user->
lNu_t) { ierr = VecDestroy(&user->
lNu_t); CHKERRQ(ierr); }
3186 if (user->
CS) { ierr = VecDestroy(&user->
CS); CHKERRQ(ierr); }
3187 if (user->
lCs) { ierr = VecDestroy(&user->
lCs); CHKERRQ(ierr); }
3189 if (user->
K_Omega) { ierr = VecDestroy(&user->
K_Omega); CHKERRQ(ierr); }
3197 if (user->
Psi) { ierr = VecDestroy(&user->
Psi); CHKERRQ(ierr); }
3198 if (user->
lPsi) { ierr = VecDestroy(&user->
lPsi); CHKERRQ(ierr); }
3201 if (user->
Bcs.
Ubcs) { ierr = VecDestroy(&user->
Bcs.
Ubcs); CHKERRQ(ierr); }
3202 if (user->
Bcs.
Uch) { ierr = VecDestroy(&user->
Bcs.
Uch); CHKERRQ(ierr); }
3205 if (user->
P_nodal) { ierr = VecDestroy(&user->
P_nodal); CHKERRQ(ierr); }
3207 if (user->
Qcrit) { ierr = VecDestroy(&user->
Qcrit); CHKERRQ(ierr); }
3218 if (user->
P_sum) { ierr = VecDestroy(&user->
P_sum); CHKERRQ(ierr); }
3221 if (user->
Rhs) { ierr = VecDestroy(&user->
Rhs); CHKERRQ(ierr); }
3222 if (user->
dUcont) { ierr = VecDestroy(&user->
dUcont); CHKERRQ(ierr); }
3223 if (user->
pUcont) { ierr = VecDestroy(&user->
pUcont); CHKERRQ(ierr); }
3226 if (user->
B) { ierr = VecDestroy(&user->
B); CHKERRQ(ierr); }
3227 if (user->
R) { ierr = VecDestroy(&user->
R); CHKERRQ(ierr); }
3230 PetscFunctionReturn(0);