[P]arallel [Hi]gh-order [Li]brary for [P]DEs  Latest
Parallel High-Order Library for PDEs through hp-adaptive Discontinuous Galerkin methods
reduced_order.cpp
1 #include "reduced_order.h"
2 #include "reduced_order/pod_basis_offline.h"
3 #include "parameters/all_parameters.h"
4 #include "functional/functional.h"
5 #include "flow_solver/flow_solver.h"
6 #include "flow_solver/flow_solver_factory.h"
7 #include <deal.II/base/numbers.h>
8 #include "ode_solver/ode_solver_factory.h"
9 #include <iostream>
10 
11 namespace PHiLiP {
12 namespace Tests {
13 
14 template <int dim, int nstate>
16  const dealii::ParameterHandler &parameter_handler_input)
17  : TestsBase::TestsBase(parameters_input)
18  , parameter_handler(parameter_handler_input)
19 {}
20 
21 template <int dim, int nstate>
23 {
24  pcout << "Starting reduced-order test..." << std::endl;
25 
26  std::unique_ptr<FlowSolver::FlowSolver<dim,nstate>> flow_solver_implicit = FlowSolver::FlowSolverFactory<dim,nstate>::select_flow_case(all_parameters, parameter_handler);
27  auto functional_implicit = FunctionalFactory<dim,nstate,double>::create_Functional(all_parameters->functional_param, flow_solver_implicit->dg);
28 
29  std::unique_ptr<FlowSolver::FlowSolver<dim,nstate>> flow_solver_galerkin = FlowSolver::FlowSolverFactory<dim,nstate>::select_flow_case(all_parameters, parameter_handler);
30  auto ode_solver_type = Parameters::ODESolverParam::ODESolverEnum::pod_galerkin_solver;
31  std::shared_ptr<ProperOrthogonalDecomposition::OfflinePOD<dim>> pod_galerkin = std::make_shared<ProperOrthogonalDecomposition::OfflinePOD<dim>>(flow_solver_galerkin->dg);
32  flow_solver_galerkin->ode_solver = PHiLiP::ODE::ODESolverFactory<dim, double>::create_ODESolver_manual(ode_solver_type, flow_solver_galerkin->dg, pod_galerkin);
33  flow_solver_galerkin->ode_solver->allocate_ode_system();
34  auto functional_galerkin = FunctionalFactory<dim,nstate,double>::create_Functional(all_parameters->functional_param, flow_solver_galerkin->dg);
35 
36 
37  std::unique_ptr<FlowSolver::FlowSolver<dim,nstate>> flow_solver_petrov_galerkin = FlowSolver::FlowSolverFactory<dim,nstate>::select_flow_case(all_parameters, parameter_handler);
38  ode_solver_type = Parameters::ODESolverParam::ODESolverEnum::pod_petrov_galerkin_solver;
39  std::shared_ptr<ProperOrthogonalDecomposition::OfflinePOD<dim>> pod_petrov_galerkin = std::make_shared<ProperOrthogonalDecomposition::OfflinePOD<dim>>(flow_solver_petrov_galerkin->dg);
40  flow_solver_petrov_galerkin->ode_solver = PHiLiP::ODE::ODESolverFactory<dim, double>::create_ODESolver_manual(ode_solver_type, flow_solver_petrov_galerkin->dg, pod_petrov_galerkin);
41  flow_solver_petrov_galerkin->ode_solver->allocate_ode_system();
42  auto functional_petrov_galerkin = FunctionalFactory<dim,nstate,double>::create_Functional(all_parameters->functional_param, flow_solver_petrov_galerkin->dg);
43 
44  flow_solver_implicit->run();
45  flow_solver_galerkin->ode_solver->steady_state();
46  flow_solver_petrov_galerkin->ode_solver->steady_state();
47 
48  dealii::LinearAlgebra::distributed::Vector<double> implicit_solution(flow_solver_implicit->dg->solution);
49  dealii::LinearAlgebra::distributed::Vector<double> galerkin_solution(flow_solver_galerkin->dg->solution);
50  dealii::LinearAlgebra::distributed::Vector<double> petrov_galerkin_solution(flow_solver_petrov_galerkin->dg->solution);
51 
52  double galerkin_solution_error = ((galerkin_solution-=implicit_solution).l2_norm()/implicit_solution.l2_norm());
53  double petrov_galerkin_solution_error = ((petrov_galerkin_solution-=implicit_solution).l2_norm()/implicit_solution.l2_norm());
54 
55  double galerkin_func_error = functional_galerkin->evaluate_functional(false,false) - functional_implicit->evaluate_functional(false,false);
56  double petrov_galerkin_func_error = functional_petrov_galerkin->evaluate_functional(false,false) - functional_implicit->evaluate_functional(false,false);
57 
58  pcout << "Galerkin solution error: " << galerkin_solution_error << std::endl
59  << "Petrov-Galerkin solution error: " << petrov_galerkin_solution_error << std::endl
60  << "Galerkin functional error: " << galerkin_func_error << std::endl
61  << "Petrov-Galerkin functional error: " << petrov_galerkin_func_error << std::endl;
62 
63  if (std::abs(galerkin_solution_error) < 1E-10 && std::abs(petrov_galerkin_solution_error) < 1E-11 && std::abs(galerkin_func_error) < 1E-10 && std::abs(petrov_galerkin_func_error) < 1E-11){
64  pcout << "Passed!";
65  return 0;
66  }else{
67  pcout << "Failed!";
68  return -1;
69  }
70 }
71 
72 #if PHILIP_DIM==1
74 #endif
75 
76 #if PHILIP_DIM!=1
78 #endif
79 } // Tests namespace
80 } // PHiLiP namespace
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) ...
ReducedOrder(const Parameters::AllParameters *const parameters_input, const dealii::ParameterHandler &parameter_handler_input)
Constructor.
Files for the baseline physics.
Definition: ADTypes.hpp:10
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
const dealii::ParameterHandler & parameter_handler
Dummy parameter handler because flowsolver requires it.
Definition: reduced_order.h:23
int run_test() const override
Run POD reduced order.
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
POD reduced order test, verifies consistency of solution.
Definition: reduced_order.h:12
Base class of all the tests.
Definition: tests.h:17