[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 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, real>> manufactured_solution_function)
18  : Burgers<dim, 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 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 nstate, typename real>
74 std::array<real,nstate> BurgersRewienski<dim,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 
113 
114 } // Physics namespace
115 } // PHiLiP namespace
116 
117 
118 
Manufactured solution used for grid studies to check convergence orders.
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, real > > manufactured_solution_function=nullptr)
Constructor.
Files for the baseline physics.
Definition: ADTypes.hpp:10
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.
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:129
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 > 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 ...
Burger&#39;s equation with nonlinear advective term and linear diffusive term. Derived from PhysicsBase...
Definition: burgers.h:30
const double rewienski_a
Parameter a for eq.(18) in Carlberg 2011.
const bool hasDiffusion
Turns on diffusive part of the Burgers problem.
Definition: burgers.h:50
std::shared_ptr< ManufacturedSolutionFunction< dim, real > > manufactured_solution_function
Manufactured solution function.
Definition: physics.h:71