[P]arallel [Hi]gh-order [Li]brary for [P]DEs  Latest
Parallel High-Order Library for PDEs through hp-adaptive Discontinuous Galerkin methods
unsteady_reduced_order.cpp
1 #include "unsteady_reduced_order.h"
2 #include "flow_solver/flow_solver.h"
3 #include "flow_solver/flow_solver_factory.h"
4 #include "ode_solver/ode_solver_factory.h"
5 #include "reduced_order/pod_basis_online.h"
6 namespace PHiLiP {
7 namespace Tests {
8 
9 template<int dim, int nstate>
11  const dealii::ParameterHandler &parameter_handler_input)
12  : TestsBase::TestsBase(parameters_input)
13  , parameter_handler(parameter_handler_input)
14 {}
15 
16 template<int dim, int nstate>
18 {
19  pcout << "Starting unsteady reduced-order test..." << std::endl;
20  int testfail = 0;
21 
22  // Creating FOM and Solve
23  std::unique_ptr<FlowSolver::FlowSolver<dim,nstate>> flow_solver_full_order = FlowSolver::FlowSolverFactory<dim,nstate>::select_flow_case(all_parameters, parameter_handler);
24  flow_solver_full_order->run();
25 
26  // Change Parameters to ROM
28  ROM_param.ode_solver_param.ode_solver_type = Parameters::ODESolverParam::ODESolverEnum::pod_galerkin_runge_kutta_solver;
29  ROM_param.ode_solver_param.allocate_matrix_dRdW = true;
30  const Parameters::AllParameters ROM_param_const = ROM_param;
31 
32  // Create ROM and Solve
33  std::unique_ptr<FlowSolver::FlowSolver<dim,nstate>> flow_solver_galerkin = FlowSolver::FlowSolverFactory<dim,nstate>::select_flow_case(&ROM_param_const, parameter_handler);
34  const int modes = flow_solver_galerkin->ode_solver->pod->getPODBasis()->n();
35  flow_solver_galerkin->run();
36 
37  dealii::LinearAlgebra::distributed::Vector<double> full_order_solution(flow_solver_full_order->dg->solution);
38  dealii::LinearAlgebra::distributed::Vector<double> galerkin_solution(flow_solver_galerkin->dg->solution);
39 
40  const double galerkin_solution_error = ((galerkin_solution-=full_order_solution).l2_norm()/full_order_solution.l2_norm());
41 
42  pcout << "Galerkin solution error: " << galerkin_solution_error << std::endl;
43  if (std::abs(galerkin_solution_error) > 6E-9) testfail = 1;
44 
45  // Hard coding expected_modes based on past test results
46  if (constexpr int expected_modes = 7; modes != expected_modes) testfail = 1;
47  return testfail;
48 }
49 
51 
52 
53 } // Tests namespace
54 } // PHiLiP namespace
Files for the baseline physics.
Definition: ADTypes.hpp:10
const dealii::ParameterHandler & parameter_handler
Dummy parameter handler because flowsolver requires it.
Main parameter class that contains the various other sub-parameter classes.
bool allocate_matrix_dRdW
Flag to signal that automatic differentiation (AD) matrix dRdW must be allocated. ...
ODESolverParam ode_solver_param
Contains parameters for ODE solver.
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
ODESolverEnum ode_solver_type
ODE solver type.
Unsteady POD reduced order test, verifies consistency of solution and implementation of threshold fun...
dealii::ConditionalOStream pcout
ConditionalOStream.
Definition: tests.h:45
UnsteadyReducedOrder(const Parameters::AllParameters *const parameters_input, const dealii::ParameterHandler &parameter_handler_input)
Constructor.
Base class of all the tests.
Definition: tests.h:17
int run_test() const override
Run Unsteady POD reduced order.