[P]arallel [Hi]gh-order [Li]brary for [P]DEs  Latest
Parallel High-Order Library for PDEs through hp-adaptive Discontinuous Galerkin methods
lift_drag.hpp
1 #ifndef __PHILIP_LIFT_DRAG_H__
2 #define __PHILIP_LIFT_DRAG_H__
3 
4 #include "functional.h"
5 
6 namespace PHiLiP {
7 
11 #if PHILIP_DIM==1
12 template <int dim, int nstate, typename real, typename MeshType = dealii::Triangulation<dim>>
13 #else
14 template <int dim, int nstate, typename real, typename MeshType = dealii::parallel::distributed::Triangulation<dim>>
15 #endif
16 class LiftDragFunctional : public Functional<dim, nstate, real, MeshType>
17 {
18 public:
20  enum Functional_types { lift, drag };
21 private:
22  using FadType = Sacado::Fad::DFad<real>;
23  using FadFadType = Sacado::Fad::DFad<FadType>;
24 
26 
31 
34 
38  const double angle_of_attack;
40  const dealii::Tensor<2,dim,double> rotation_matrix;
43  const dealii::Tensor<1,dim,double> lift_vector;
46  const dealii::Tensor<1,dim,double> drag_vector;
47 
49  dealii::Tensor<1,dim,double> force_vector;
50 
52 
62 
65 
67  dealii::Tensor<2,dim,double> initialize_rotation_matrix(const double angle_of_attack);
68 
70 
72  dealii::Tensor<1,dim,double> initialize_lift_vector(const dealii::Tensor<2,dim,double> &rotation_matrix);
73 
75 
77  dealii::Tensor<1,dim,double> initialize_drag_vector(const dealii::Tensor<2,dim,double> &rotation_matrix);
78 
79 public:
82  std::shared_ptr<DGBase<dim,real,MeshType>> dg_input,
83  const Functional_types functional_type);
85 
86  real evaluate_functional( const bool compute_dIdW = false, const bool compute_dIdX = false, const bool compute_d2I = false) override;
87 
88 public:
90 
91  template<typename real2>
94  const unsigned int boundary_id,
95  const dealii::Point<dim,real2> &/*phys_coord*/,
96  const dealii::Tensor<1,dim,real2> &normal,
97  const std::array<real2,nstate> &soln_at_q,
98  const std::array<dealii::Tensor<1,dim,real2>,nstate> &/*soln_grad_at_q*/) const
99  {
100  if (boundary_id == 1001) {
101  assert(soln_at_q.size() == dim+2);
102  const Physics::Euler<dim,dim+2,real2> &euler = dynamic_cast< const Physics::Euler<dim,dim+2,real2> &> (physics);
103 
104  real2 pressure = euler.compute_pressure (soln_at_q);
105 
106  //std::cout << " force_dimensionalization_factor: " << force_dimensionalization_factor
107  // << " pressure: " << pressure
108  // << " normal*force_vector: " << normal*force_vector
109  // << std::endl;
110 
111  return force_dimensionalization_factor * pressure * (normal * force_vector);
112  }
113  return (real2) 0.0;
114  }
115 
117 
120  const unsigned int boundary_id,
121  const dealii::Point<dim,real> &phys_coord,
122  const dealii::Tensor<1,dim,real> &normal,
123  const std::array<real,nstate> &soln_at_q,
124  const std::array<dealii::Tensor<1,dim,real>,nstate> &soln_grad_at_q) const override
125  {
126  return evaluate_boundary_integrand<real>(
127  physics,
128  boundary_id,
129  phys_coord,
130  normal,
131  soln_at_q,
132  soln_grad_at_q);
133  }
134 
136 
139  const unsigned int boundary_id,
140  const dealii::Point<dim,FadFadType> &phys_coord,
141  const dealii::Tensor<1,dim,FadFadType> &normal,
142  const std::array<FadFadType,nstate> &soln_at_q,
143  const std::array<dealii::Tensor<1,dim,FadFadType>,nstate> &soln_grad_at_q) const override
144  {
145  return evaluate_boundary_integrand<FadFadType>(
146  physics,
147  boundary_id,
148  phys_coord,
149  normal,
150  soln_at_q,
151  soln_grad_at_q);
152  }
153 
155 
158  const dealii::Point<dim,real> &/*phys_coord*/,
159  const std::array<real,nstate> &/*soln_at_q*/,
160  const std::array<dealii::Tensor<1,dim,real>,nstate> &/*soln_grad_at_q*/) const
161  { return (real) 0.0; }
162 
164 
167  const dealii::Point<dim,FadFadType> &/*phys_coord*/, const std::array<FadFadType,nstate> &/*soln_at_q*/,
168  const std::array<dealii::Tensor<1,dim,FadFadType>,nstate> &/*soln_grad_at_q*/) const
169  { return (FadFadType) 0.0; }
170 
171 
172 };
173 
174 // template <int dim, int nstate, typename real>
175 // class TargetLiftDragFunctional : public LiftDragFunctional<dim,nstate,real>
176 // {
177 // private:
178 // /// Constructor
179 // TargetLiftDragFunctional(
180 // std::shared_ptr<DGBase<dim,real>> dg_input,
181 // const Functional_types functional_type
182 // const double target_value = -1e200
183 // : LiftDragFunctional(dg_input, functional_type)
184 // , target_value(target_value)
185 // { }
186 //
187 //
188 // real evaluate_functional(
189 // const bool compute_dIdW,
190 // const bool compute_dIdX,
191 // const bool compute_d2I)
192 // {
193 // real value = LiftDragFunctional<dim,nstate,real>::evaluate_functional(compute_dIdW, compute_dIdX, compute_d2I);
194 //
195 // return value - target_value
196 // }
197 //
198 // };
199 //
200 // template <int dim, int nstate, typename real>
201 // class QuadraticPenaltyTargetLiftDragFunctional : public TargetLiftDragFunctional<dim,nstate,real>
202 // {
203 // public:
204 //
205 // double penalty;
206 //
207 // /// Constructor
208 // QuadraticPenaltyTargetLiftDragFunctional(
209 // std::shared_ptr<DGBase<dim,real>> dg_input,
210 // const Functional_types functional_type
211 // const double target_value = -1e200
212 // const double penalty = 0
213 // : TargetLiftDragFunctional(dg_input, functional_type, target_value)
214 // , penalty(penalty)
215 // { }
216 //
217 //
218 // real evaluate_functional(
219 // const bool compute_dIdW,
220 // const bool compute_dIdX,
221 // const bool compute_d2I)
222 // {
223 // real value = TargetLiftDragFunctional<dim,nstate,real>::evaluate_functional((compute_dIdW || compute_d2I), (compute_dIdX || compute_d2I), compute_d2I);
224 //
225 // if (compute_dIdW) {
226 // const real scaling = 2.0*value;
227 // this->dIdw *= scaling;
228 // }
229 //
230 // if (compute_dIdX) {
231 // const real scaling = 2.0*value;
232 // this->dIdX *= scaling;
233 // }
234 //
235 // if (compute_d2I) {
236 // const real scaling = 2.0*value;
237 // this->dIdX *= scaling;
238 // }
239 //
240 // return penalty * value * value;
241 // }
242 //
243 // };
244 
245 } // PHiLiP namespace
246 
247 #endif
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< dealii::Tensor< 1, dim, real >, nstate > &) const
Virtual function for computation of cell volume functional term.
Definition: lift_drag.hpp:156
Sacado::Fad::DFad< real > FadType
Sacado AD type for first derivatives.
Definition: functional.h:45
Sacado::Fad::DFad< FadType > FadFadType
Sacado AD type that allows 2nd derivatives.
Definition: lift_drag.hpp:23
dealii::Tensor< 1, dim, double > initialize_drag_vector(const dealii::Tensor< 2, dim, double > &rotation_matrix)
Initialize drag vector with given rotation matrix based on angle of attack.
Definition: lift_drag.cpp:85
Base class from which Advection, Diffusion, ConvectionDiffusion, and Euler is derived.
Definition: physics.h:34
double initialize_force_dimensionalization_factor()
Compute force dimensionalization factor.
Definition: lift_drag.cpp:28
dealii::Tensor< 1, dim, double > initialize_lift_vector(const dealii::Tensor< 2, dim, double > &rotation_matrix)
Initialize lift vector with given rotation matrix based on angle of attack.
Definition: lift_drag.cpp:64
Files for the baseline physics.
Definition: ADTypes.hpp:10
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< dealii::Tensor< 1, dim, FadFadType >, nstate > &soln_grad_at_q) const override
Virtual function for Sacado computation of cell boundary functional term and derivatives.
Definition: lift_drag.hpp:137
dealii::Tensor< 2, dim, double > initialize_rotation_matrix(const double angle_of_attack)
Initialize rotation matrix based on given angle of attack.
Definition: lift_drag.cpp:38
const double angle_of_attack
Angle of attack retrieved from euler_fad_fad.
Definition: lift_drag.hpp:38
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 > &normal, const std::array< real2, nstate > &soln_at_q, const std::array< dealii::Tensor< 1, dim, real2 >, nstate > &) const
Virtual function for computation of cell boundary functional term.
Definition: lift_drag.hpp:92
const Physics::Euler< dim, dim+2, FadFadType > & euler_fad_fad
Casts DG&#39;s physics into an Euler physics reference.
Definition: lift_drag.hpp:36
dealii::Tensor< 1, dim, double > force_vector
Used force scaling vector depending whether this functional represents lift or drag.
Definition: lift_drag.hpp:49
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< dealii::Tensor< 1, dim, real >, nstate > &soln_grad_at_q) const override
Virtual function for computation of cell boundary functional term.
Definition: lift_drag.hpp:118
LiftDragFunctional(std::shared_ptr< DGBase< dim, real, MeshType >> dg_input, const Functional_types functional_type)
Constructor.
Definition: lift_drag.cpp:7
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< dealii::Tensor< 1, dim, FadFadType >, nstate > &) const
Virtual function for Sacado computation of cell volume functional term and derivatives.
Definition: lift_drag.hpp:165
const dealii::Tensor< 2, dim, double > rotation_matrix
Rotation matrix based on angle of attack.
Definition: lift_drag.hpp:40
const double force_dimensionalization_factor
Pressure induced drag is given by.
Definition: lift_drag.hpp:61
real2 compute_pressure(const std::array< real2, nstate > &conservative_soln) const
Evaluate pressure from conservative variables.
Definition: euler.cpp:369
Functional_types
Switch between lift and drag functional types.
Definition: lift_drag.hpp:20
const dealii::Tensor< 1, dim, double > drag_vector
Drag force scaling based on the rotation matrix applied on a [1 0]^T vector. Assumes that the drag is...
Definition: lift_drag.hpp:46
Functional base class.
Definition: functional.h:43
real evaluate_functional(const bool compute_dIdW=false, const bool compute_dIdX=false, const bool compute_d2I=false) override
Destructor.
Definition: lift_drag.cpp:106
const Functional_types functional_type
Switches between lift and drag.
Definition: lift_drag.hpp:33
DGBase is independent of the number of state variables.
Definition: dg_base.hpp:82
const dealii::Tensor< 1, dim, double > lift_vector
Lift force scaling based on the rotation matrix applied on a [0 1]^T vector. Assumes that the lift is...
Definition: lift_drag.hpp:43