1 #include "parameters/parameters_ode_solver.h" 8 prm.enter_subsection(
"ODE solver");
11 prm.declare_entry(
"ode_output",
"verbose",
12 dealii::Patterns::Selection(
"quiet|verbose"),
13 "State whether output from ODE solver should be printed. " 14 "Choices are <quiet|verbose>.");
16 prm.declare_entry(
"output_solution_every_x_steps",
"-1",
17 dealii::Patterns::Integer(-1,dealii::Patterns::Integer::max_int_value),
18 "Outputs the solution every x steps in .vtk file");
20 prm.declare_entry(
"output_solution_every_dt_time_intervals",
"0.0",
21 dealii::Patterns::Double(0,dealii::Patterns::Double::max_double_value),
22 "Outputs the solution at time intervals of dt in .vtk file");
24 prm.declare_entry(
"output_solution_at_fixed_times",
"false",
25 dealii::Patterns::Bool(),
26 "Output solution at fixed times. False by default.");
28 prm.declare_entry(
"output_solution_fixed_times_string",
" ",
29 dealii::Patterns::FileName(dealii::Patterns::FileName::FileType::input),
30 "String of the times at which to output the velocity field. " 31 "Example: '0.0 1.0 2.0 3.0 ' or '0.0 1.0 2.0 3.0'");
33 prm.declare_entry(
"output_solution_at_exact_fixed_times",
"false",
34 dealii::Patterns::Bool(),
35 "Output solution at exact fixed times by decreasing the time step on the fly. False by default. " 36 "NOTE: Should be set to false if doing stability studies so that the time step is never influenced by solution file soutput times.");
38 prm.declare_entry(
"ode_solver_type",
"implicit",
39 dealii::Patterns::Selection(
41 " low_storage_runge_kutta | " 45 " pod_petrov_galerkin | " 46 " hyper_reduced_petrov_galerkin | " 47 " pod_galerkin_runge_kutta "),
48 "Type of ODE solver to use." 51 " low_storage_runge_kutta | " 55 " pod_petrov_galerkin | " 56 " hyper_reduced_petrov_galerkin | " 57 " pod_galerkin_runge_kutta>.");
59 prm.declare_entry(
"nonlinear_max_iterations",
"500000",
60 dealii::Patterns::Integer(0,dealii::Patterns::Integer::max_int_value),
61 "Maximum nonlinear solver iterations");
62 prm.declare_entry(
"nonlinear_steady_residual_tolerance",
"1e-13",
64 dealii::Patterns::Double(1e-300,dealii::Patterns::Double::max_double_value),
65 "Nonlinear solver residual tolerance");
66 prm.declare_entry(
"initial_time_step",
"100.0",
67 dealii::Patterns::Double(1e-16,dealii::Patterns::Double::max_double_value),
68 "Time step used in ODE solver.");
69 prm.declare_entry(
"time_step_factor_residual",
"0.0",
70 dealii::Patterns::Double(0,dealii::Patterns::Double::max_double_value),
71 "Multiplies initial time-step by time_step_factor_residual*(-log10(residual_norm_decrease)).");
72 prm.declare_entry(
"time_step_factor_residual_exp",
"1.0",
73 dealii::Patterns::Double(0,dealii::Patterns::Double::max_double_value),
74 "Scales initial time step by pow(time_step_factor_residual*(-log10(residual_norm_decrease)),time_step_factor_residual_exp).");
76 prm.declare_entry(
"print_iteration_modulo",
"1",
77 dealii::Patterns::Integer(0,dealii::Patterns::Integer::max_int_value),
78 "Print every print_iteration_modulo iterations of " 79 "the nonlinear solver");
80 prm.declare_entry(
"output_final_steady_state_solution_to_file",
"false",
81 dealii::Patterns::Bool(),
82 "Output final steady state solution to file if set to true");
83 prm.declare_entry(
"steady_state_final_solution_filename",
"solution_snapshot",
84 dealii::Patterns::Anything(),
85 "Filename to use when outputting solution to a file.");
86 prm.declare_entry(
"output_ode_solver_steady_state_convergence_table",
"false",
87 dealii::Patterns::Bool(),
88 "Set as false by default. If true, writes the linear solver convergence data " 89 "for steady state to a file named 'ode_solver_steady_state_convergence_data_table.txt'.");
91 prm.declare_entry(
"initial_time",
"0.0",
92 dealii::Patterns::Double(0, dealii::Patterns::Double::max_double_value),
93 "Initial time at which we initialize the ODE solver with.");
95 prm.declare_entry(
"initial_iteration",
"0",
96 dealii::Patterns::Integer(0, dealii::Patterns::Integer::max_int_value),
97 "Initial iteration at which we initialize the ODE solver with.");
99 prm.declare_entry(
"initial_desired_time_for_output_solution_every_dt_time_intervals",
"0.0",
100 dealii::Patterns::Double(0, dealii::Patterns::Double::max_double_value),
101 "Initial desired time for outputting the solution every dt time intervals " 102 "at which we initialize the ODE solver with.");
104 prm.declare_entry(
"runge_kutta_method",
"ssprk3_ex",
105 dealii::Patterns::Selection(
113 " RK3_2_5F_3SStarPlus | " 115 " RK4_3_9F_3SStarPlus |" 116 " RK5_4_10F_3SStarPlus "),
117 "Runge-kutta method to use. Methods with _ex are explicit, and with _im are implicit. [3S*] and [3S*+] methods are low-storage RK methods" 127 " RK3_2_5F_3SStarPlus | " 128 " RK5_4_10F_3SStarPlus |" 129 " RK4_3_9F_3SStarPlus >.");
130 prm.enter_subsection(
"rrk root solver");
132 prm.declare_entry(
"rrk_root_solver_output",
"quiet",
133 dealii::Patterns::Selection(
"quiet|verbose"),
134 "State whether output from rrk root solver should be printed. " 135 "Choices are <quiet|verbose>.");
137 prm.declare_entry(
"relaxation_runge_kutta_root_tolerance",
"5e-10",
138 dealii::Patterns::Double(),
139 "Tolerance for root-finding problem in entropy RRK ode solver." 140 "Defult 5E-10 is suitable in most cases.");
142 prm.leave_subsection();
144 prm.enter_subsection(
"low-storage rk solver");
146 prm.declare_entry(
"atol",
"0.001",
147 dealii::Patterns::Double(),
148 "Absolute Tolerance for automatic step size controller");
150 prm.declare_entry(
"rtol",
"0.001",
151 dealii::Patterns::Double(),
152 "Relative Tolerance for automatic step size controller");
154 prm.declare_entry(
"beta1",
"0.70",
155 dealii::Patterns::Double(),
156 "Beta Controller 1 for automatic step size controller");
158 prm.declare_entry(
"beta2",
"-0.23",
159 dealii::Patterns::Double(),
160 "Beta controller 2 for automatic step size controller");
162 prm.declare_entry(
"beta3",
"0.0",
163 dealii::Patterns::Double(),
164 "Beta controller 3 for automatic step size controller");
166 prm.leave_subsection();
168 prm.leave_subsection();
173 prm.enter_subsection(
"ODE solver");
175 const std::string output_string = prm.get(
"ode_output");
176 if (output_string ==
"quiet")
ode_output = OutputEnum::quiet;
177 else if (output_string ==
"verbose")
ode_output = OutputEnum::verbose;
187 const std::string solver_string = prm.get(
"ode_solver_type");
188 if (solver_string ==
"runge_kutta") {
ode_solver_type = ODESolverEnum::runge_kutta_solver;
190 else if (solver_string ==
"low_storage_runge_kutta") {
ode_solver_type = ODESolverEnum::low_storage_runge_kutta_solver;
192 else if (solver_string ==
"implicit") {
ode_solver_type = ODESolverEnum::implicit_solver;
194 else if (solver_string ==
"rrk_explicit") {
ode_solver_type = ODESolverEnum::rrk_explicit_solver;
196 else if (solver_string ==
"pod_galerkin") {
ode_solver_type = ODESolverEnum::pod_galerkin_solver;
198 else if (solver_string ==
"pod_petrov_galerkin") {
ode_solver_type = ODESolverEnum::pod_petrov_galerkin_solver;
200 else if (solver_string ==
"hyper_reduced_petrov_galerkin") {
ode_solver_type = ODESolverEnum::hyper_reduced_petrov_galerkin_solver;
202 else if (solver_string ==
"pod_galerkin_runge_kutta") {
ode_solver_type = ODESolverEnum::pod_galerkin_runge_kutta_solver;
220 const std::string rk_method_string = prm.get(
"runge_kutta_method");
221 if (rk_method_string ==
"rk4_ex"){
226 else if (rk_method_string ==
"ssprk3_ex"){
231 else if (rk_method_string ==
"heun2_ex"){
236 else if (rk_method_string ==
"euler_ex"){
241 else if (rk_method_string ==
"euler_im"){
246 else if (rk_method_string ==
"dirk_2_im"){
251 else if (rk_method_string ==
"dirk_3_im"){
256 else if (rk_method_string ==
"RK3_2_5F_3SStarPlus"){
263 else if (rk_method_string ==
"RK4_3_5_3SStar"){
270 else if (rk_method_string ==
"RK4_3_9F_3SStarPlus"){
277 else if (rk_method_string ==
"RK5_4_10F_3SStarPlus"){
285 prm.enter_subsection(
"rrk root solver");
287 const std::string output_string_rrk = prm.get(
"rrk_root_solver_output");
293 prm.leave_subsection();
295 prm.enter_subsection(
"low-storage rk solver");
297 atol = prm.get_double(
"atol");
298 rtol = prm.get_double(
"rtol");
299 beta1 = prm.get_double(
"beta1");
300 beta2 = prm.get_double(
"beta2");
301 beta3 = prm.get_double(
"beta3");
303 prm.leave_subsection();
306 prm.leave_subsection();
bool is_3Sstarplus
True or false depending on what low-storage RK method is used.
OutputEnum ode_output
verbose or quiet.
double initial_time
Initial time at which we initialize the ODE solver with.
double beta2
Second value for beta controller;.
int output_solution_every_x_steps
Outputs the solution every x steps to .vtk file.
int num_delta
Number of delta values in low-storage RK methods.
bool output_solution_at_fixed_times
Flag for outputting solution at fixed times.
double time_step_factor_residual_exp
Scales initial time step by pow(time_step_factor_residual*(-log10(residual_norm_decrease)),time_step_factor_residual_exp)
Files for the baseline physics.
OutputEnum rrk_root_solver_output
Do output for root solving routine.
unsigned int print_iteration_modulo
If ode_output==verbose, print every print_iteration_modulo iterations.
bool output_ode_solver_steady_state_convergence_table
unsigned int initial_iteration
Initial iteration at which we initialize the ODE solver with.
double atol
Absolute tolerance.
double output_solution_every_dt_time_intervals
Outputs the solution every dt time intervals to .vtk file.
bool allocate_matrix_dRdW
Flag to signal that automatic differentiation (AD) matrix dRdW must be allocated. ...
int rk_order
Order of the RK method; assigned based on runge_kutta_method.
std::string output_solution_fixed_times_string
String of fixed solution output times.
double initial_time_step
Time step used in ODE solver.
double nonlinear_steady_residual_tolerance
Tolerance to determine steady-state convergence.
double rtol
Relative tolerance.
double initial_desired_time_for_output_solution_every_dt_time_intervals
std::string steady_state_final_solution_filename
Filename to write final steady state solution.
unsigned int number_of_fixed_times_to_output_solution
Number of fixed times to output the solution.
bool output_final_steady_state_solution_to_file
Output final steady state solution to file.
RKMethodEnum runge_kutta_method
Runge-kutta method.
double time_step_factor_residual
Multiplies initial time-step by time_step_factor_residual*(-log10(residual_norm_decrease)) ...
void parse_parameters(dealii::ParameterHandler &prm)
Parses input file and sets the variables.
bool output_solution_at_exact_fixed_times
Flag for outputting the solution at exact fixed times by decreasing the time step on the fly...
ODESolverEnum ode_solver_type
ODE solver type.
double relaxation_runge_kutta_root_tolerance
Tolerance for RRK root solver, default value 5E-10.
double beta3
Third value for beta controller;.
int n_rk_stages
Number of stages for an RK method; assigned based on runge_kutta_method.
double beta1
First value for beta controller;.
unsigned int nonlinear_max_iterations
Maximum number of iterations.
static void declare_parameters(dealii::ParameterHandler &prm)
Declares the possible variables and sets the defaults.