[P]arallel [Hi]gh-order [Li]brary for [P]DEs  Latest
Parallel High-Order Library for PDEs through hp-adaptive Discontinuous Galerkin methods
bound_preserving_limiter_factory.cpp
1 #include "parameters/all_parameters.h"
2 #include "bound_preserving_limiter_factory.hpp"
3 #include "bound_preserving_limiter.h"
4 #include "tvb_limiter.h"
5 #include "maximum_principle_limiter.h"
6 #include "positivity_preserving_limiter.h"
7 
8 namespace PHiLiP {
9 template <int dim, int nstate, typename real>
10 std::unique_ptr< BoundPreservingLimiter<dim, real> >
13  const Parameters::AllParameters* const parameters_input)
14 {
15  if (nstate == parameters_input->nstate)
17  else if constexpr (nstate > 1)
19  else
20  return nullptr;
21 }
22 
23 template <int dim, int nstate, typename real>
24 std::unique_ptr< BoundPreservingLimiter<dim, real> >
27  const Parameters::AllParameters* const parameters_input)
28 {
29  using limiter_enum = Parameters::LimiterParam::LimiterType;
30  using flux_nodes_enum = Parameters::AllParameters::FluxNodes;
31 
32  limiter_enum limiter_type = parameters_input->limiter_param.bound_preserving_limiter;
33  flux_nodes_enum flux_nodes_type = parameters_input->flux_nodes_type;
34 
35  bool apply_tvb = parameters_input->limiter_param.use_tvb_limiter;
36  bool curvilinear_grid = parameters_input->use_curvilinear_grid;
37 
38  if (limiter_type == limiter_enum::none) {
39  if (apply_tvb == true) {
40  if(curvilinear_grid) {
41  std::cout << "Error: Cannot create limiter for curvilinear grid" << std::endl;
42  std::abort();
43  } else if (flux_nodes_type != flux_nodes_enum::GLL) {
44  std::cout << "Error: Can only use limiter with GLL flux nodes" << std::endl;
45  std::abort();
46  } else if (dim == 1)
47  return std::make_unique < TVBLimiter<dim, nstate, real> >(parameters_input);
48  else {
49  std::cout << "Error: Cannot create TVB limiter for dim > 1" << std::endl;
50  std::abort();
51  }
52  }
53  else
54  return nullptr;
55  } else if(curvilinear_grid) {
56  std::cout << "Error: Cannot create limiter for curvilinear grid" << std::endl;
57  std::abort();
58  } else if (flux_nodes_type != flux_nodes_enum::GLL) {
59  std::cout << "Error: Can only use limiter with GLL flux nodes" << std::endl;
60  std::abort();
61  } else if (limiter_type == limiter_enum::maximum_principle) {
62  return std::make_unique< MaximumPrincipleLimiter<dim, nstate, real> >(parameters_input);
63  } else if (limiter_type == limiter_enum::positivity_preservingZhang2010
64  || limiter_type == limiter_enum::positivity_preservingWang2012) {
65  if (nstate == dim + 2)
66  return std::make_unique< PositivityPreservingLimiter<dim, nstate, real> >(parameters_input);
67  else {
68  if(nstate != dim + 2) {
69  std::cout << "Error: Cannot create Positivity-Preserving limiter for nstate_input != dim + 2" << std::endl;
70  std::abort();
71  }
72  }
73  }
74 
75  std::cout << "Error: Cannot create limiter pointer due to an invalid limiter type specified" << std::endl;
76  std::abort();
77  return nullptr;
78 }
79 
86 } // PHiLiP namespace
bool use_curvilinear_grid
Flag to use curvilinear grid.
LimiterType
Limiter type to be applied on the solution.
LimiterParam limiter_param
Contains parameters for limiter.
LimiterType bound_preserving_limiter
Variable to store specified limiter type.
Files for the baseline physics.
Definition: ADTypes.hpp:10
static std::unique_ptr< BoundPreservingLimiter< dim, real > > create_limiter(const Parameters::AllParameters *const parameters_input)
Recursively templated function that calls select_limiter when nstate is equal to one specified in prm...
This class creates a new BoundPreservingLimiter object based on input parameters. ...
Main parameter class that contains the various other sub-parameter classes.
int nstate
Number of state variables. Will depend on PDE.
FluxNodes flux_nodes_type
Store selected FluxNodes from the input file.
bool use_tvb_limiter
Flag for applying TVB Limiter.
static std::unique_ptr< BoundPreservingLimiter< dim, real > > select_limiter(const Parameters::AllParameters *const parameters_input)
Create a pointer to the limiter specified in prms.