[P]arallel [Hi]gh-order [Li]brary for [P]DEs  Latest
Parallel High-Order Library for PDEs through hp-adaptive Discontinuous Galerkin methods
pod_adaptive_sampling_testing.cpp
1 #include "pod_adaptive_sampling_testing.h"
2 
3 #include <deal.II/base/numbers.h>
4 
5 #include <eigen/Eigen/Dense>
6 #include <fstream>
7 
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"
15 #include "tests.h"
16 
17 namespace PHiLiP {
18 namespace Tests {
19 
20 template <int dim, int nstate>
22  const dealii::ParameterHandler &parameter_handler_input)
23  : TestsBase::TestsBase(parameters_input)
24  , parameter_handler(parameter_handler_input)
25 {}
26 
27 template <int dim, int nstate>
29 {
30 
31  RowVectorXd params_1 {{4.0000000000000000,
32  2.0000000000000000
33  }};
34  //INPUT AS RADIANS IF ANGLE OF ATTACK
35  RowVectorXd params_2 {{0.0325000000000000,
36  0.0100000000000000
37  }};
38 
39  std::cout << params_1 << std::endl;
40  std::cout << params_2 << std::endl;
41 
42  std::shared_ptr<dealii::TableHandler> data_table = std::make_shared<dealii::TableHandler>();
43 
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;
48 
49  RowVector2d parameter = {params_1(i), params_2(i)};
50  Parameters::AllParameters params = reinit_params(parameter);
51 
52  std::unique_ptr<FlowSolver::FlowSolver<dim,nstate>> flow_solver_implicit = FlowSolver::FlowSolverFactory<dim,nstate>::select_flow_case(&params, parameter_handler);
53 
54  auto functional_implicit = FunctionalFactory<dim,nstate,double>::create_Functional(params.functional_param, flow_solver_implicit->dg);
55 
56  std::unique_ptr<FlowSolver::FlowSolver<dim,nstate>> flow_solver = FlowSolver::FlowSolverFactory<dim,nstate>::select_flow_case(&params, parameter_handler);
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);
59  flow_solver->ode_solver = PHiLiP::ODE::ODESolverFactory<dim, double>::create_ODESolver_manual(ode_solver_type, flow_solver->dg, pod_standard);
60  flow_solver->ode_solver->allocate_ode_system();
61  auto functional = FunctionalFactory<dim,nstate,double>::create_Functional(params.functional_param, flow_solver->dg);
62 
63 
64  flow_solver->ode_solver->steady_state();
65  flow_solver_implicit->run();
66 
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);
69 
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);
72 
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;
75 
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);
82 
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);
89 
90  std::ofstream data_table_file("adaptation_data_table.txt");
91  data_table->write_text(data_table_file, dealii::TableHandler::TextOutputFormat::org_mode_table);
92  }
93  return 0;
94 }
95 
96 template <int dim, int nstate>
98  // Copy all parameters
100 
101  using FlowCaseEnum = Parameters::FlowSolverParam::FlowCaseType;
102  const FlowCaseEnum flow_type = this->all_parameters->flow_solver_param.flow_case_type;
103  if (flow_type == FlowCaseEnum::burgers_rewienski_snapshot){
104  parameters.burgers_param.rewienski_a = parameter(0);
105  parameters.burgers_param.rewienski_b = parameter(1);
106  }
107  else if (flow_type == FlowCaseEnum::naca0012){
108  //const double pi = atan(1.0) * 4.0;
109  parameters.euler_param.mach_inf = parameter(0);
110  parameters.euler_param.angle_of_attack = parameter(1); //Already in radians
111  }
112  else{
113  this->pcout << "Invalid flow case. You probably forgot to specify a flow case in the prm file." << std::endl;
114  std::abort();
115  }
116  return parameters;
117 }
118 
119 #if PHILIP_DIM==1
121 #endif
122 
123 #if PHILIP_DIM!=1
125 #endif
126 
127 } // Tests namespace
128 } // PHiLiP namespace
129 
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 &parameter_handler_input)
Constructor.
Files for the baseline physics.
Definition: ADTypes.hpp:10
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 &parameter_handler_input)
Factory to return the correct flow solver given input file.
const Parameters::AllParameters *const all_parameters
Pointer to all parameters.
Definition: tests.h:20
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.
Definition: tests.h:45
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.
Definition: tests.h:17