[P]arallel [Hi]gh-order [Li]brary for [P]DEs  Latest
Parallel High-Order Library for PDEs through hp-adaptive Discontinuous Galerkin methods
diffusion_exact_adjoint.h
1 #ifndef __DIFFUSION_EXACT_ADJOINT_H__
2 #define __DIFFUSION_EXACT_ADJOINT_H__
3 
4 #include <deal.II/base/tensor.h>
5 #include <deal.II/base/types.h>
6 
7 #include <memory>
8 
9 #include "dg/dg_base.hpp"
10 #include "functional/functional.h"
11 #include "parameters/all_parameters.h"
12 #include "physics/convection_diffusion.h"
13 #include "physics/manufactured_solution.h"
14 #include "physics/physics.h"
15 #include "tests.h"
16 
17 namespace PHiLiP {
18 namespace Tests {
19 
53 template <int dim, typename real>
56 {
57 protected:
58  using dealii::Function<dim,real>::value;
59  using dealii::Function<dim,real>::gradient;
60  using dealii::Function<dim,real>::hessian;
61 public:
63  real value (const dealii::Point<dim,real> &pos, const unsigned int istate = 0) const override;
64 
66  dealii::Tensor<1,dim,real> gradient (const dealii::Point<dim,real> &pos, const unsigned int istate = 0) const override;
67 
69  dealii::SymmetricTensor<2,dim,real> hessian (const dealii::Point<dim,real> &/* point */, const unsigned int /* istate = 0 */) const
70  {
71  return dealii::SymmetricTensor<2,dim,real>();
72  }
73 };
74 
76 template <int dim, typename real>
78 {
79 protected:
80  using dealii::Function<dim,real>::value;
81  using dealii::Function<dim,real>::gradient;
82  using dealii::Function<dim,real>::hessian;
83 public:
85  real value (const dealii::Point<dim,real> &pos, const unsigned int istate = 0) const override;
86 
88  dealii::Tensor<1,dim,real> gradient (const dealii::Point<dim,real> &pos, const unsigned int istate = 0) const override;
89 
91  dealii::SymmetricTensor<2,dim,real> hessian (const dealii::Point<dim,real> &/* point */, const unsigned int /* istate = 0 */) const override
92  {
93  return dealii::SymmetricTensor<2,dim,real>();
94  }
95 };
96 
98 template <int dim, int nstate, typename real>
99 class diffusion_objective : public Physics::ConvectionDiffusion <dim, nstate, real>
100 {
101 protected:
102  // For overloading the virtual functions defined in PhysicsBase
111 public:
114  const Parameters::AllParameters *const parameters_input,
115  const bool convection,
116  const bool diffusion,
117  std::shared_ptr<ManufacturedSolutionFunction<dim,real>> manufactured_solution_function):
118  Physics::ConvectionDiffusion<dim,nstate,real>::ConvectionDiffusion(
119  parameters_input,
120  convection,
121  diffusion,
122  default_diffusion_tensor(),
123  Parameters::ManufacturedSolutionParam::get_default_advection_vector(),
124  default_diffusion_coefficient(),
125  manufactured_solution_function)
126  {}
127 
130  {
131  return -1.0;
132  }
133 
135  static dealii::Tensor<2,3,double> default_diffusion_tensor()
136  {
137  dealii::Tensor<2,3,double> diffusion_tensor;
138  diffusion_tensor[0][0] = 1;
139  if constexpr(dim>=2) {
140  diffusion_tensor[0][1] = 0.0;
141  diffusion_tensor[1][0] = 0.0;
142  diffusion_tensor[1][1] = 1.0;
143  }
144  if constexpr(dim>=3) {
145  diffusion_tensor[0][2] = 0.0;
146  diffusion_tensor[1][2] = 0.0;
147  diffusion_tensor[2][0] = 0.0;
148  diffusion_tensor[2][1] = 0.0;
149  diffusion_tensor[2][2] = 1.0;
150  }
151  return diffusion_tensor;
152  }
153 
155  virtual real objective_function(
156  const dealii::Point<dim,real> &pos) const = 0;
157 };
158 
160 template <int dim, int nstate, typename real>
161 class diffusion_u : public diffusion_objective <dim, nstate, real>
162 {
163 protected:
164  // For overloading the virtual functions defined in PhysicsBase
173 public:
176  const Parameters::AllParameters *const parameters_input,
177  const bool convection,
178  const bool diffusion):
180  parameters_input,
181  convection,
182  diffusion,
183  std::make_shared<ManufacturedSolutionU<dim,real>>())
184  {}
185 
187  std::array<real,nstate> source_term (
188  const dealii::Point<dim,real> &pos,
189  const std::array<real,nstate> &solution,
190  const real current_time,
191  const dealii::types::global_dof_index cell_index) const override;
192 
194  real objective_function(
195  const dealii::Point<dim,real> &pos) const override;
196 };
197 
199 template <int dim, int nstate, typename real>
200 class diffusion_v : public diffusion_objective <dim, nstate, real>
201 {
202 protected:
203  // For overloading the virtual functions defined in PhysicsBase
212 public:
215  const Parameters::AllParameters *const parameters_input,
216  const bool convection,
217  const bool diffusion):
219  parameters_input,
220  convection,
221  diffusion,
222  std::make_shared<ManufacturedSolutionV<dim,real>>())
223  {}
224 
226  std::array<real,nstate> source_term (
227  const dealii::Point<dim,real> &pos,
228  const std::array<real,nstate> &solution,
229  const real current_time,
230  const dealii::types::global_dof_index cell_index) const override;
231 
233  real objective_function(
234  const dealii::Point<dim,real> &pos) const override;
235 };
236 
238 template <int dim, int nstate, typename real>
239 class DiffusionFunctional : public Functional<dim, nstate, real>
240 {
241  using FadType = Sacado::Fad::DFad<real>;
242  using FadFadType = Sacado::Fad::DFad<FadType>;
243 public:
246  std::shared_ptr<PHiLiP::DGBase<dim,real>> dg_input,
247  std::shared_ptr<PHiLiP::Physics::PhysicsBase<dim,nstate,FadFadType>> _physics_fad_fad,
248  const bool uses_solution_values = true,
249  const bool uses_solution_gradient = false)
250  : PHiLiP::Functional<dim,nstate,real>(dg_input,_physics_fad_fad,uses_solution_values,uses_solution_gradient)
251  {}
252 
254  template <typename real2>
255  real2 evaluate_volume_integrand(
257  const dealii::Point<dim,real2> &phys_coord,
258  const std::array<real2,nstate> &soln_at_q,
259  const std::array<dealii::Tensor<1,dim,real2>,nstate> &soln_grad_at_q) const;
260 
264  const dealii::Point<dim,real> &phys_coord,
265  const std::array<real,nstate> &soln_at_q,
266  const std::array<dealii::Tensor<1,dim,real>,nstate> &soln_grad_at_q) const override
267  {
268  return evaluate_volume_integrand<>(physics, phys_coord, soln_at_q, soln_grad_at_q);
269  }
270 
274  const dealii::Point<dim,FadFadType> &phys_coord,
275  const std::array<FadFadType,nstate> &soln_at_q,
276  const std::array<dealii::Tensor<1,dim,FadFadType>,nstate> &soln_grad_at_q) const override
277  {
278  return evaluate_volume_integrand<>(physics, phys_coord, soln_at_q, soln_grad_at_q);
279  }
280 };
281 
283 template <int dim, int nstate>
285 {
286 public:
288  explicit DiffusionExactAdjoint(const Parameters::AllParameters *const parameters_input);
289 
294  int run_test() const;
295 };
296 
297 // for evaluating error slopes
298 double eval_avg_slope(std::vector<double> error, std::vector<double> grid_size, unsigned int n_grids);
299 
300 } // Tests namespace
301 } // PHiLiP namespace
302 
303 #endif //__DIFFUSION_EXACT_ADJOINT_H__
Functional that performs the inner product over the entire domain.
Sacado::Fad::DFad< real > FadType
Sacado AD type for first derivatives.
Sacado::Fad::DFad< FadType > FadFadType
Sacado AD type that allows 2nd derivatives.
Base class from which Advection, Diffusion, ConvectionDiffusion, and Euler is derived.
Definition: physics.h:34
Manufactured solution used for grid studies to check convergence orders.
Convection-diffusion with linear advective and diffusive term. Derived from PhysicsBase.
Files for the baseline physics.
Definition: ADTypes.hpp:10
physics for the v variable
diffusion_u(const Parameters::AllParameters *const parameters_input, const bool convection, const bool diffusion)
constructor
real evaluate_volume_integrand(const PHiLiP::Physics::PhysicsBase< dim, nstate, real > &physics, const dealii::Point< dim, real > &phys_coord, const std::array< real, nstate > &soln_at_q, const std::array< dealii::Tensor< 1, dim, real >, nstate > &soln_grad_at_q) const override
Non-template functions to override the template classes.
static dealii::Tensor< 2, 3, double > default_diffusion_tensor()
Default diffusion tensor is set for isotropic diffusion, .
Main parameter class that contains the various other sub-parameter classes.
diffusion_objective(const Parameters::AllParameters *const parameters_input, const bool convection, const bool diffusion, std::shared_ptr< ManufacturedSolutionFunction< dim, real >> manufactured_solution_function)
constructor
physics for the u variable
dealii::SymmetricTensor< 2, dim, real > hessian(const dealii::Point< dim, real > &, const unsigned int) const override
Hessian of manufactured solution is unused but needed to make class concrete.
dealii::SymmetricTensor< 2, dim, real > hessian(const dealii::Point< dim, real > &, const unsigned int) const
Hessian of manufactured solution is unused but needed to make class concrete.
diffusion_v(const Parameters::AllParameters *const parameters_input, const bool convection, const bool diffusion)
constructor
Functional base class.
Definition: functional.h:43
DiffusionFunctional(std::shared_ptr< PHiLiP::DGBase< dim, real >> dg_input, std::shared_ptr< PHiLiP::Physics::PhysicsBase< dim, nstate, FadFadType >> _physics_fad_fad, const bool uses_solution_values=true, const bool uses_solution_gradient=false)
Constructor.
dealii::Tensor< 1, dim, real > gradient(const dealii::Point< dim, real > &pos, const unsigned int istate=0) const override
Gradient of the manufactured solution.
DGBase is independent of the number of state variables.
Definition: dg_base.hpp:82
real value(const dealii::Point< dim, real > &pos, const unsigned int istate=0) const override
overriding the function for the value and gradient
Base class of all the tests.
Definition: tests.h:17
FadFadType evaluate_volume_integrand(const PHiLiP::Physics::PhysicsBase< dim, nstate, FadFadType > &physics, const dealii::Point< dim, FadFadType > &phys_coord, const std::array< FadFadType, nstate > &soln_at_q, const std::array< dealii::Tensor< 1, dim, FadFadType >, nstate > &soln_grad_at_q) const override
Non-template functions to override the template classes.
static double default_diffusion_coefficient()
negative one is used for the diffusion coefficient so that the problem becomes
parent class to add the objective function directly to physics as a virtual class ...