[P]arallel [Hi]gh-order [Li]brary for [P]DEs  Latest
Parallel High-Order Library for PDEs through hp-adaptive Discontinuous Galerkin methods
burgers_rewienski.cpp
1 #include "ADTypes.hpp"
2 
3 #include "burgers_rewienski.h"
4 
5 namespace PHiLiP {
6 namespace Physics {
7 
8 template <int dim, int nspecies, int nstate, typename real>
10  const Parameters::AllParameters *const parameters_input,
11  const double rewienski_a,
12  const double rewienski_b,
13  const bool rewienski_manufactured_solution,
14  const bool convection,
15  const bool diffusion,
16  const dealii::Tensor<2, 3> input_diffusion_tensor,
17  std::shared_ptr<ManufacturedSolutionFunction<dim, nspecies, real>> manufactured_solution_function)
18  : Burgers<dim, nspecies, nstate, real>(parameters_input,
19  0, //Burgers rewienski diffusion coefficient is zero
20  convection,
21  diffusion,
22  input_diffusion_tensor,
23  manufactured_solution_function)
24  , rewienski_a(rewienski_a)
25  , rewienski_b(rewienski_b)
26  , rewienski_manufactured_solution(rewienski_manufactured_solution)
27 {
28  static_assert(nstate==dim, "Physics::Burgers() should be created with nstate==dim");
29 }
30 
31 
32 
33 template <int dim, int nspecies, int nstate, typename real>
36  const int /*boundary_type*/,
37  const dealii::Point<dim, real> &pos,
38  const dealii::Tensor<1,dim,real> &normal_int,
39  const std::array<real,nstate> &soln_int,
40  const std::array<dealii::Tensor<1,dim,real>,nstate> &soln_grad_int,
41  std::array<real,nstate> &soln_bc,
42  std::array<dealii::Tensor<1,dim,real>,nstate> &soln_grad_bc) const
43 {
44  std::array<real,nstate> boundary_values;
45  std::array<dealii::Tensor<1,dim,real>,nstate> boundary_gradients;
46 
48  for (int i=0; i<nstate; i++) {
49  boundary_values[i] = this->manufactured_solution_function->value (pos, i);
50  }
51  }else{
52  for (int i=0; i<nstate; i++) {
53  boundary_values[i] = rewienski_a; // corresponds to 'a' in eq.(18) of reference Carlberg 2013
54  }
55  }
56 
57  for (int istate=0; istate<nstate; ++istate) {
58 
59  std::array<real,nstate> characteristic_dot_n = this->convective_eigenvalues(boundary_values, normal_int);
60  const bool inflow = (characteristic_dot_n[istate] <= 0.);
61 
62  if (inflow || this->hasDiffusion) { // Dirichlet boundary condition
63  soln_bc[istate] = boundary_values[istate];
64  soln_grad_bc[istate] = soln_grad_int[istate];
65 
66  } else { // Neumann boundary condition
67  soln_bc[istate] = soln_int[istate];
68  soln_grad_bc[istate] = soln_grad_int[istate];
69  }
70  }
71 }
72 
73 template <int dim, int nspecies, int nstate, typename real>
74 std::array<real,nstate> BurgersRewienski<dim,nspecies,nstate,real>
76  const dealii::Point<dim,real> &pos,
77  const std::array<real,nstate> &/*solution*/,
78  const real /*current_time*/) const
79 {
80  std::array<real,nstate> source;
81 
82  for (int istate=0; istate<nstate; istate++) {
83  double b = rewienski_b; // corresponds to 'b' in eq.(18) of reference Carlberg 2013
84  source[istate] = 0.02*exp(b*pos[0]);
85  }
87  for (int istate=0; istate<nstate; istate++) {
88  source[istate] = 0.0;
89  dealii::Tensor<1,dim,real> manufactured_gradient = this->manufactured_solution_function->gradient (pos, istate);
90  for (int d=0;d<dim;++d) {
91  real manufactured_solution = this->manufactured_solution_function->value (pos, d);
92  source[istate] += 0.5*manufactured_solution*manufactured_gradient[d];
93  }
94  }
95  for (int istate=0; istate<nstate; istate++) {
96  real manufactured_solution = this->manufactured_solution_function->value (pos, istate);
97  real divergence = 0.0;
98  for (int d=0;d<dim;++d) {
99  dealii::Tensor<1,dim,real> manufactured_gradient = this->manufactured_solution_function->gradient (pos, d);
100  divergence += manufactured_gradient[d];
101  }
102  source[istate] += 0.5*manufactured_solution*divergence;
103  }
104  }
105  return source;
106 }
107 
108 #if PHILIP_SPECIES==1
114 #endif
115 } // Physics namespace
116 } // PHiLiP namespace
117 
118 
119 
Manufactured solution used for grid studies to check convergence orders.
const double rewienski_a
Parameter a for eq.(18) in Carlberg 2011.
Files for the baseline physics.
Definition: ADTypes.hpp:10
std::array< real, nstate > source_term(const dealii::Point< dim, real > &pos, const std::array< real, nstate > &solution, const real current_time) const override
PDE Source term. If rewienski_manufactured_solution==true then the manufactured solution source term ...
std::shared_ptr< ManufacturedSolutionFunction< dim, nspecies, real > > manufactured_solution_function
Manufactured solution function.
Definition: physics.h:71
Main parameter class that contains the various other sub-parameter classes.
Burgers Rewienski equation. Derived from Burgers, which is derived from PhysicsBase. Based on eq.(18) in Carlberg 2011.
const bool hasDiffusion
Turns on diffusive part of the Burgers problem.
Definition: burgers.h:51
const double rewienski_b
Parameter b for eq.(18) in Carlberg 2011.
void boundary_face_values(const int, const dealii::Point< dim, real > &, const dealii::Tensor< 1, dim, real > &, const std::array< real, nstate > &, const std::array< dealii::Tensor< 1, dim, real >, nstate > &, std::array< real, nstate > &, std::array< dealii::Tensor< 1, dim, real >, nstate > &) const override
If diffusion is present, assign Dirichlet boundary condition.
std::array< real, nstate > convective_eigenvalues(const std::array< real, nstate > &, const dealii::Tensor< 1, dim, real > &) const
Spectral radius of convective term Jacobian is &#39;c&#39;.
Definition: burgers.cpp:161
Burger&#39;s equation with nonlinear advective term and linear diffusive term. Derived from PhysicsBase...
Definition: burgers.h:30
BurgersRewienski(const Parameters::AllParameters *const parameters_input, const double rewienski_a, const double rewienski_b, const bool rewienski_manufactured_solution, const bool convection, const bool diffusion, const dealii::Tensor< 2, 3, double > input_diffusion_tensor=Parameters::ManufacturedSolutionParam::get_default_diffusion_tensor(), std::shared_ptr< ManufacturedSolutionFunction< dim, nspecies, real > > manufactured_solution_function=nullptr)
Constructor.