[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 #include "parameters/all_parameters.h"
6 #include "physics/physics_factory.h"
7 #include "physics/navier_stokes.h"
8 
9 namespace PHiLiP {
10 
14 #if PHILIP_DIM==1
15 template <int dim, int nspecies, int nstate, typename real, typename MeshType = dealii::Triangulation<dim>>
16 #else
17 template <int dim, int nspecies, int nstate, typename real, typename MeshType = dealii::parallel::distributed::Triangulation<dim>>
18 #endif
19 class LiftDragFunctional : public Functional<dim, nspecies, nstate, real, MeshType>
20 {
21 public:
23  enum Functional_types { lift, drag };
24 private:
25  using FadType = Sacado::Fad::DFad<real>;
26  using FadFadType = Sacado::Fad::DFad<FadType>;
27 
29 
34 
37 
41  const double angle_of_attack;
43  const dealii::Tensor<2,dim,double> rotation_matrix;
46  const dealii::Tensor<1,dim,double> lift_vector;
49  const dealii::Tensor<1,dim,double> drag_vector;
50 
52  dealii::Tensor<1,dim,double> force_vector;
53 
55 
65 
67 
70 
72  dealii::Tensor<2,dim,double> initialize_rotation_matrix(const double angle_of_attack);
73 
75 
77  dealii::Tensor<1,dim,double> initialize_lift_vector(const dealii::Tensor<2,dim,double> &rotation_matrix);
78 
80 
82  dealii::Tensor<1,dim,double> initialize_drag_vector(const dealii::Tensor<2,dim,double> &rotation_matrix);
83 
84 public:
87  std::shared_ptr<DGBase<dim,nspecies,real,MeshType>> dg_input,
88  const Functional_types functional_type);
90 
91  real evaluate_functional( const bool compute_dIdW = false, const bool compute_dIdX = false, const bool compute_d2I = false) override;
92 
93 public:
95 
96  template<typename real2>
99  const unsigned int boundary_id,
100  const dealii::Point<dim,real2> &/*phys_coord*/,
101  const dealii::Tensor<1,dim,real2> &normal,
102  const std::array<real2,nstate> &soln_at_q,
103  const std::array<dealii::Tensor<1,dim,real2>,nstate> &soln_grad_at_q) const
104  {
105  if (boundary_id == 1001 || boundary_id == 1006) {
106  assert(soln_at_q.size() == dim+2);
107 
110  std::shared_ptr< Physics::NavierStokes<dim,nspecies,dim+2,real2> > navier_stokes_physics = std::dynamic_pointer_cast<Physics::NavierStokes<dim,nspecies,dim+2,real2>> (Physics::PhysicsFactory<dim,nspecies,dim+2,real2>::create_Physics(this->all_parameters, PDE_enum::navier_stokes, nullptr));
111 
112  // Compute pressure (same as Euler physics)
113  const real2 pressure = navier_stokes_physics->compute_pressure (soln_at_q);
114 
115  // Initialize
116  dealii::Tensor<1,dim,real2> viscous_tensor_times_normal;
117  for(int i=0; i<dim; i++){
118  viscous_tensor_times_normal[i] = 0;
119  }
120  // add viscous stress tensor contribution if viscous (i.e. not Euler)
121  if(this->all_parameters->pde_type != PDE_enum::euler) {
122  // Compute viscous stress tensor
123  const dealii::Tensor<2,dim,real2> viscous_stress_tensor = navier_stokes_physics->compute_viscous_stress_tensor_from_conservative_templated(soln_at_q, soln_grad_at_q);
124  // std::cout<<"Norm of viscous stress tensor = "<< viscous_stress_tensor[0][0]<<std::endl;
125  for (int i=0;i<dim;i++){
126  for (int j=0;j<dim;j++){
127  viscous_tensor_times_normal[i]+= viscous_stress_tensor[i][j]*normal[j];
128  }
129  }
130  }
131 
132  return force_dimensionalization_factor * (pressure * (normal * force_vector) - viscous_tensor_times_normal*force_vector);
133  }
134  return (real2) 0.0;
135  }
136 
138 
141  const unsigned int boundary_id,
142  const dealii::Point<dim,real> &phys_coord,
143  const dealii::Tensor<1,dim,real> &normal,
144  const std::array<real,nstate> &soln_at_q,
145  const std::array<dealii::Tensor<1,dim,real>,nstate> &soln_grad_at_q) const override
146  {
147  return evaluate_boundary_integrand<real>(
148  physics,
149  boundary_id,
150  phys_coord,
151  normal,
152  soln_at_q,
153  soln_grad_at_q);
154  }
155 
157 
160  const unsigned int boundary_id,
161  const dealii::Point<dim,FadFadType> &phys_coord,
162  const dealii::Tensor<1,dim,FadFadType> &normal,
163  const std::array<FadFadType,nstate> &soln_at_q,
164  const std::array<dealii::Tensor<1,dim,FadFadType>,nstate> &soln_grad_at_q) const override
165  {
166  return evaluate_boundary_integrand<FadFadType>(
167  physics,
168  boundary_id,
169  phys_coord,
170  normal,
171  soln_at_q,
172  soln_grad_at_q);
173  }
174 
176 
179  const dealii::Point<dim,real> &/*phys_coord*/,
180  const std::array<real,nstate> &/*soln_at_q*/,
181  const std::array<dealii::Tensor<1,dim,real>,nstate> &/*soln_grad_at_q*/) const
182  { return (real) 0.0; }
183 
185 
188  const dealii::Point<dim,FadFadType> &/*phys_coord*/, const std::array<FadFadType,nstate> &/*soln_at_q*/,
189  const std::array<dealii::Tensor<1,dim,FadFadType>,nstate> &/*soln_grad_at_q*/) const
190  { return (FadFadType) 0.0; }
191 
192 
193 };
194 
195 // template <int dim, int nspecies, int nstate, typename real>
196 // class TargetLiftDragFunctional : public LiftDragFunctional<dim,nspecies,nstate,real>
197 // {
198 // private:
199 // /// Constructor
200 // TargetLiftDragFunctional(
201 // std::shared_ptr<DGBase<dim,nspecies,real>> dg_input,
202 // const Functional_types functional_type
203 // const double target_value = -1e200
204 // : LiftDragFunctional(dg_input, functional_type)
205 // , target_value(target_value)
206 // { }
207 //
208 //
209 // real evaluate_functional(
210 // const bool compute_dIdW,
211 // const bool compute_dIdX,
212 // const bool compute_d2I)
213 // {
214 // real value = LiftDragFunctional<dim,nspecies,nstate,real>::evaluate_functional(compute_dIdW, compute_dIdX, compute_d2I);
215 //
216 // return value - target_value
217 // }
218 //
219 // };
220 //
221 // template <int dim, int nspecies, int nstate, typename real>
222 // class QuadraticPenaltyTargetLiftDragFunctional : public TargetLiftDragFunctional<dim,nspecies,nstate,real>
223 // {
224 // public:
225 //
226 // double penalty;
227 //
228 // /// Constructor
229 // QuadraticPenaltyTargetLiftDragFunctional(
230 // std::shared_ptr<DGBase<dim,nspecies,real>> dg_input,
231 // const Functional_types functional_type
232 // const double target_value = -1e200
233 // const double penalty = 0
234 // : TargetLiftDragFunctional(dg_input, functional_type, target_value)
235 // , penalty(penalty)
236 // { }
237 //
238 //
239 // real evaluate_functional(
240 // const bool compute_dIdW,
241 // const bool compute_dIdX,
242 // const bool compute_d2I)
243 // {
244 // real value = TargetLiftDragFunctional<dim,nspecies,nstate,real>::evaluate_functional((compute_dIdW || compute_d2I), (compute_dIdX || compute_d2I), compute_d2I);
245 //
246 // if (compute_dIdW) {
247 // const real scaling = 2.0*value;
248 // this->dIdw *= scaling;
249 // }
250 //
251 // if (compute_dIdX) {
252 // const real scaling = 2.0*value;
253 // this->dIdX *= scaling;
254 // }
255 //
256 // if (compute_d2I) {
257 // const real scaling = 2.0*value;
258 // this->dIdX *= scaling;
259 // }
260 //
261 // return penalty * value * value;
262 // }
263 //
264 // };
265 
266 } // PHiLiP namespace
267 
268 #endif
virtual FadFadType evaluate_boundary_integrand(const PHiLiP::Physics::PhysicsBase< dim, nspecies, 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:158
PartialDifferentialEquation pde_type
Store the PDE type to be solved.
dealii::Tensor< 1, dim, double > force_vector
Used force scaling vector depending whether this functional represents lift or drag.
Definition: lift_drag.hpp:52
Base class from which Advection, Diffusion, ConvectionDiffusion, and Euler is derived.
Definition: physics.h:34
const double force_dimensionalization_factor
Pressure induced drag is given by.
Definition: lift_drag.hpp:64
const Physics::Euler< dim, nspecies, dim+2, FadFadType > & euler_fad_fad
Casts DG&#39;s physics into an Euler physics reference.
Definition: lift_drag.hpp:39
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:49
const Parameters::AllParameters *const all_parameters
Pointer to all parameters.
Definition: lift_drag.hpp:66
PartialDifferentialEquation
Possible Partial Differential Equations to solve.
Files for the baseline physics.
Definition: ADTypes.hpp:10
const double angle_of_attack
Angle of attack retrieved from euler_fad_fad.
Definition: lift_drag.hpp:41
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:46
Main parameter class that contains the various other sub-parameter classes.
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:86
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:39
real compute_pressure(const std::array< real, nstate > &conservative_soln) const
Compute pressure from conservative solution.
Definition: euler.cpp:510
virtual real evaluate_boundary_integrand(const PHiLiP::Physics::PhysicsBase< dim, nspecies, 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:139
virtual real evaluate_volume_integrand(const PHiLiP::Physics::PhysicsBase< dim, nspecies, 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:177
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:65
Sacado::Fad::DFad< real > FadType
Sacado AD type for first derivatives.
Definition: functional.h:45
const Functional_types functional_type
Switches between lift and drag.
Definition: lift_drag.hpp:36
virtual FadFadType evaluate_volume_integrand(const PHiLiP::Physics::PhysicsBase< dim, nspecies, 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:186
const dealii::Tensor< 2, dim, double > rotation_matrix
Rotation matrix based on angle of attack.
Definition: lift_drag.hpp:43
real2 evaluate_boundary_integrand(const PHiLiP::Physics::PhysicsBase< dim, nspecies, nstate, real2 > &, 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 > &soln_grad_at_q) const
Virtual function for computation of cell boundary functional term.
Definition: lift_drag.hpp:97
static std::shared_ptr< PhysicsBase< dim, nspecies, nstate, real > > create_Physics(const Parameters::AllParameters *const parameters_input, std::shared_ptr< ModelBase< dim, nspecies, nstate, real > > model_input=nullptr)
Factory to return the correct physics given input file.
double initialize_force_dimensionalization_factor()
Compute force dimensionalization factor.
Definition: lift_drag.cpp:29
Functional_types
Switch between lift and drag functional types.
Definition: lift_drag.hpp:23
Functional base class.
Definition: functional.h:43
DGBase is independent of the number of state variables.
Definition: dg_base.hpp:82
real evaluate_functional(const bool compute_dIdW=false, const bool compute_dIdX=false, const bool compute_d2I=false) override
Destructor.
Definition: lift_drag.cpp:107
Navier-Stokes equations. Derived from Euler for the convective terms, which is derived from PhysicsBa...
Definition: navier_stokes.h:12
LiftDragFunctional(std::shared_ptr< DGBase< dim, nspecies, real, MeshType >> dg_input, const Functional_types functional_type)
Constructor.
Definition: lift_drag.cpp:7
Sacado::Fad::DFad< FadType > FadFadType
Sacado AD type that allows 2nd derivatives.
Definition: lift_drag.hpp:26