[P]arallel [Hi]gh-order [Li]brary for [P]DEs  Latest
Parallel High-Order Library for PDEs through hp-adaptive Discontinuous Galerkin methods
target_wall_pressure.hpp
1 #ifndef __PHILIP_TARGET_WALL_PRESSURE_H__
2 #define __PHILIP_TARGET_WALL_PRESSURE_H__
3 
4 /* includes */
5 #include <deal.II/differentiation/ad/sacado_math.h>
6 #include <deal.II/differentiation/ad/sacado_number_types.h>
7 #include <deal.II/differentiation/ad/sacado_product_types.h>
8 #include <deal.II/fe/fe_q.h>
9 #include <deal.II/fe/fe_values.h>
10 #include <deal.II/lac/la_parallel_vector.h>
11 
12 #include <Sacado.hpp>
13 #include <iostream>
14 #include <vector>
15 
16 #include "dg/dg_base.hpp"
17 #include "physics/physics.h"
18 #include "target_functional.h"
19 
20 namespace PHiLiP {
21 
25 template <int dim, int nstate, typename real>
26 class TargetWallPressure : public TargetFunctional<dim, nstate, real>
27 {
28 private:
29  using FadType = Sacado::Fad::DFad<real>;
30  using FadFadType = Sacado::Fad::DFad<FadType>;
31 
33 
40 
41 public:
42 
43  real evaluate_functional( const bool compute_dIdW = false, const bool compute_dIdX = false, const bool compute_d2I = false) override
44  {
45  double value = TargetFunctional<dim,nstate,real>::evaluate_functional( compute_dIdW, compute_dIdX, compute_d2I);
46 
47  this->pcout << "Target pressure error l2_norm: " << value << "\n";
48 
49  return value;
50  }
51 
52 
54 
55  template<typename real2>
58  const unsigned int boundary_id,
59  const dealii::Point<dim,real2> &/*phys_coord*/,
60  const dealii::Tensor<1,dim,real2> &/*normal*/,
61  const std::array<real2,nstate> &soln_at_q,
62  const std::array<real,nstate> &target_soln_at_q,
63  const std::array<dealii::Tensor<1,dim,real2>,nstate> &/*soln_grad_at_q*/,
64  const std::array<dealii::Tensor<1,dim,real2>,nstate> &/*target_soln_grad_at_q*/) const
65  {
66  if (boundary_id == 1001) {
67  assert(soln_at_q.size() == dim+2);
68  const Physics::Euler<dim,dim+2,real2> &euler = dynamic_cast< const Physics::Euler<dim,dim+2,real2> &> (physics);
69 
70  real2 pressure = euler.compute_pressure (soln_at_q);
71 
72  std::array<real2,nstate> target_soln_at_q_real2;
73  for (int s=0; s<nstate; ++s) {
74  target_soln_at_q_real2[s] = target_soln_at_q[s];
75  }
76  real2 target_pressure = euler.compute_pressure (target_soln_at_q_real2);
77  real2 diff = pressure - target_pressure;
78  real2 diff2 = diff*diff;
79 
80  return diff2;
81  }
82  return (real2) 0.0;
83  }
84 
86 
89  const unsigned int boundary_id,
90  const dealii::Point<dim,real> &phys_coord,
91  const dealii::Tensor<1,dim,real> &normal,
92  const std::array<real,nstate> &soln_at_q,
93  const std::array<real,nstate> &target_soln_at_q,
94  const std::array<dealii::Tensor<1,dim,real>,nstate> &soln_grad_at_q,
95  const std::array<dealii::Tensor<1,dim,real>,nstate> &target_soln_grad_at_q) const override
96  {
97  return evaluate_boundary_integrand<real>(
98  physics,
99  boundary_id,
100  phys_coord,
101  normal,
102  target_soln_at_q,
103  soln_at_q,
104  soln_grad_at_q,
105  target_soln_grad_at_q);
106  }
108 
111  const unsigned int boundary_id,
112  const dealii::Point<dim,FadFadType> &phys_coord,
113  const dealii::Tensor<1,dim,FadFadType> &normal,
114  const std::array<FadFadType,nstate> &soln_at_q,
115  const std::array<real,nstate> &target_soln_at_q,
116  const std::array<dealii::Tensor<1,dim,FadFadType>,nstate> &soln_grad_at_q,
117  const std::array<dealii::Tensor<1,dim,FadFadType>,nstate> &target_soln_grad_at_q) const override
118  {
119  return evaluate_boundary_integrand<FadFadType>(
120  physics,
121  boundary_id,
122  phys_coord,
123  normal,
124  soln_at_q,
125  target_soln_at_q,
126  soln_grad_at_q,
127  target_soln_grad_at_q);
128  }
129 
131 
134  const dealii::Point<dim,real> &/*phys_coord*/,
135  const std::array<real,nstate> &/*soln_at_q*/,
136  const std::array<real,nstate> &/*target_soln_at_q*/,
137  const std::array<dealii::Tensor<1,dim,real>,nstate> &/*soln_grad_at_q*/,
138  const std::array<dealii::Tensor<1,dim,real>,nstate> &/*target_soln_grad_at_q*/) const override
139  { return (real) 0.0; }
141 
144  const dealii::Point<dim,FadFadType> &/*phys_coord*/,
145  const std::array<FadFadType,nstate> &/*soln_at_q*/,
146  const std::array<real,nstate> &/*target_soln_at_q*/,
147  const std::array<dealii::Tensor<1,dim,FadFadType>,nstate> &/*soln_grad_at_q*/,
148  const std::array<dealii::Tensor<1,dim,FadFadType>,nstate> &/*target_soln_grad_at_q*/) const override
149  { return (FadFadType) 0.0; }
150 
151 
152 }; // TargetWallPressure class
153 
154 } // PHiLiP namespace
155 #endif
156 
real evaluate_functional(const bool compute_dIdW=false, const bool compute_dIdX=false, const bool compute_d2I=false) override
Evaluates the functional derivative with respect to the solution variable.
TargetFunctional base class.
Base class from which Advection, Diffusion, ConvectionDiffusion, and Euler is derived.
Definition: physics.h:34
real2 evaluate_boundary_integrand(const PHiLiP::Physics::PhysicsBase< dim, nstate, real2 > &physics, const unsigned int boundary_id, const dealii::Point< dim, real2 > &, const dealii::Tensor< 1, dim, real2 > &, const std::array< real2, nstate > &soln_at_q, const std::array< real, nstate > &target_soln_at_q, const std::array< dealii::Tensor< 1, dim, real2 >, nstate > &, const std::array< dealii::Tensor< 1, dim, real2 >, nstate > &) const
Virtual function for computation of cell boundary functional term.
virtual FadFadType evaluate_boundary_integrand(const PHiLiP::Physics::PhysicsBase< dim, nstate, FadFadType > &physics, const unsigned int boundary_id, const dealii::Point< dim, FadFadType > &phys_coord, const dealii::Tensor< 1, dim, FadFadType > &normal, const std::array< FadFadType, nstate > &soln_at_q, const std::array< real, nstate > &target_soln_at_q, const std::array< dealii::Tensor< 1, dim, FadFadType >, nstate > &soln_grad_at_q, const std::array< dealii::Tensor< 1, dim, FadFadType >, nstate > &target_soln_grad_at_q) const override
Virtual function for Sacado computation of cell boundary functional term and derivatives.
Files for the baseline physics.
Definition: ADTypes.hpp:10
virtual real evaluate_functional(const bool compute_dIdW=false, const bool compute_dIdX=false, const bool compute_d2I=false) override
Evaluates the functional derivative with respect to the solution variable.
Sacado::Fad::DFad< real > FadType
Sacado AD type for first derivatives.
virtual real evaluate_volume_integrand(const PHiLiP::Physics::PhysicsBase< dim, nstate, real > &, const dealii::Point< dim, real > &, const std::array< real, nstate > &, const std::array< real, nstate > &, const std::array< dealii::Tensor< 1, dim, real >, nstate > &, const std::array< dealii::Tensor< 1, dim, real >, nstate > &) const override
Virtual function for computation of cell volume functional term.
Euler equations. Derived from PhysicsBase.
Definition: euler.h:78
virtual FadFadType evaluate_volume_integrand(const PHiLiP::Physics::PhysicsBase< dim, nstate, FadFadType > &, const dealii::Point< dim, FadFadType > &, const std::array< FadFadType, nstate > &, const std::array< real, nstate > &, const std::array< dealii::Tensor< 1, dim, FadFadType >, nstate > &, const std::array< dealii::Tensor< 1, dim, FadFadType >, nstate > &) const override
Virtual function for Sacado computation of cell volume functional term and derivatives.
real2 compute_pressure(const std::array< real2, nstate > &conservative_soln) const
Evaluate pressure from conservative variables.
Definition: euler.cpp:369
Sacado::Fad::DFad< FadType > FadFadType
Sacado AD type that allows 2nd derivatives.
virtual real evaluate_boundary_integrand(const PHiLiP::Physics::PhysicsBase< dim, nstate, real > &physics, const unsigned int boundary_id, const dealii::Point< dim, real > &phys_coord, const dealii::Tensor< 1, dim, real > &normal, const std::array< real, nstate > &soln_at_q, const std::array< real, nstate > &target_soln_at_q, const std::array< dealii::Tensor< 1, dim, real >, nstate > &soln_grad_at_q, const std::array< dealii::Tensor< 1, dim, real >, nstate > &target_soln_grad_at_q) const override
Virtual function for computation of cell boundary functional term.
dealii::ConditionalOStream pcout
Parallel std::cout that only outputs on mpi_rank==0.
Definition: functional.h:317