1 #include "pod_adaptive_sampling_testing.h" 3 #include <deal.II/base/numbers.h> 5 #include <eigen/Eigen/Dense> 8 #include "dg/dg_base.hpp" 9 #include "flow_solver/flow_solver.h" 10 #include "flow_solver/flow_solver_factory.h" 11 #include "functional/functional.h" 12 #include "ode_solver/ode_solver_factory.h" 13 #include "parameters/all_parameters.h" 14 #include "reduced_order/pod_basis_offline.h" 20 template <
int dim,
int nstate>
22 const dealii::ParameterHandler ¶meter_handler_input)
24 , parameter_handler(parameter_handler_input)
27 template <
int dim,
int nstate>
31 RowVectorXd params_1 {{4.0000000000000000,
35 RowVectorXd params_2 {{0.0325000000000000,
39 std::cout << params_1 << std::endl;
40 std::cout << params_2 << std::endl;
42 std::shared_ptr<dealii::TableHandler> data_table = std::make_shared<dealii::TableHandler>();
44 for(
int i=0 ; i < params_1.size() ; i++){
45 std::cout <<
"Index: " << i << std::endl;
46 std::cout <<
"Parameter 1: " << params_1(i) << std::endl;
47 std::cout <<
"Parameter 2: " << params_2(i) << std::endl;
49 RowVector2d parameter = {params_1(i), params_2(i)};
57 auto ode_solver_type = Parameters::ODESolverParam::ODESolverEnum::pod_petrov_galerkin_solver;
58 std::shared_ptr<ProperOrthogonalDecomposition::OfflinePOD<dim>> pod_standard = std::make_shared<ProperOrthogonalDecomposition::OfflinePOD<dim>>(flow_solver->dg);
60 flow_solver->ode_solver->allocate_ode_system();
64 flow_solver->ode_solver->steady_state();
65 flow_solver_implicit->run();
67 dealii::LinearAlgebra::distributed::Vector<double> standard_solution(flow_solver->dg->solution);
68 dealii::LinearAlgebra::distributed::Vector<double> implicit_solution(flow_solver_implicit->dg->solution);
70 double standard_error = ((standard_solution-=implicit_solution).l2_norm()/implicit_solution.l2_norm());
71 double standard_func_error = functional->evaluate_functional(
false,
false) - functional_implicit->evaluate_functional(
false,
false);
73 pcout <<
"State error: " << std::setprecision(15) << standard_error << std::setprecision(6) << std::endl;
74 pcout <<
"Functional error: " << std::setprecision(15) << standard_func_error << std::setprecision(6) << std::endl;
76 data_table->add_value(
"Parameter 1", parameter(0));
77 data_table->add_value(
"Parameter 2", parameter(1));
78 data_table->add_value(
"FOM func", functional_implicit->evaluate_functional(
false,
false));
79 data_table->add_value(
"ROM func", functional->evaluate_functional(
false,
false));
80 data_table->add_value(
"Func error", standard_func_error);
81 data_table->add_value(
"State error", standard_error);
83 data_table->set_precision(
"Parameter 1", 16);
84 data_table->set_precision(
"Parameter 2", 16);
85 data_table->set_precision(
"FOM func", 16);
86 data_table->set_precision(
"ROM func", 16);
87 data_table->set_precision(
"Func error", 16);
88 data_table->set_precision(
"State error", 16);
90 std::ofstream data_table_file(
"adaptation_data_table.txt");
91 data_table->write_text(data_table_file, dealii::TableHandler::TextOutputFormat::org_mode_table);
96 template <
int dim,
int nstate>
103 if (flow_type == FlowCaseEnum::burgers_rewienski_snapshot){
107 else if (flow_type == FlowCaseEnum::naca0012){
113 this->
pcout <<
"Invalid flow case. You probably forgot to specify a flow case in the prm file." << std::endl;
static std::shared_ptr< ODESolverBase< dim, real, MeshType > > create_ODESolver_manual(Parameters::ODESolverParam::ODESolverEnum ode_solver_type, std::shared_ptr< DGBase< dim, real, MeshType > > dg_input)
Creates either implicit or explicit ODE solver based on manual input (no POD basis given) ...
FlowCaseType
Selects the flow case to be simulated.
FlowCaseType flow_case_type
Selected FlowCaseType from the input file.
FlowSolverParam flow_solver_param
Contains the parameters for simulation cases (flow solver test)
double mach_inf
Mach number at infinity.
AdaptiveSamplingTesting(const Parameters::AllParameters *const parameters_input, const dealii::ParameterHandler ¶meter_handler_input)
Constructor.
Files for the baseline physics.
EulerParam euler_param
Contains parameters for the Euler equations non-dimensionalization.
Main parameter class that contains the various other sub-parameter classes.
static std::unique_ptr< FlowSolver< dim, nstate > > select_flow_case(const Parameters::AllParameters *const parameters_input, const dealii::ParameterHandler ¶meter_handler_input)
Factory to return the correct flow solver given input file.
const Parameters::AllParameters *const all_parameters
Pointer to all parameters.
Parameters::AllParameters reinit_params(RowVector2d parameter) const
Reinitialize parameters.
double angle_of_attack
Input file provides in degrees, but the value stored here is in radians.
static std::shared_ptr< Functional< dim, nstate, real, MeshType > > create_Functional(PHiLiP::Parameters::AllParameters const *const param, std::shared_ptr< PHiLiP::DGBase< dim, real, MeshType > > dg)
Create standard functional object from constant parameter file.
FunctionalParam functional_param
Contains parameters for functional.
dealii::ConditionalOStream pcout
ConditionalOStream.
int run_test() const override
Run test.
BurgersParam burgers_param
Contains parameters for Burgers equation.
const dealii::ParameterHandler & parameter_handler
Parameter handler for storing the .prm file being ran.
Base class of all the tests.
Adaptive Sampling Testing.