1 #ifndef __PHILIP_LIFT_DRAG_H__ 2 #define __PHILIP_LIFT_DRAG_H__ 4 #include "functional.h" 5 #include "parameters/all_parameters.h" 6 #include "physics/physics_factory.h" 7 #include "physics/navier_stokes.h" 15 template <
int dim,
int nspecies,
int nstate,
typename real,
typename MeshType = dealii::Triangulation<dim>>
17 template <
int dim,
int nspecies,
int nstate,
typename real,
typename MeshType = dealii::parallel::distributed::Triangulation<dim>>
91 real
evaluate_functional(
const bool compute_dIdW =
false,
const bool compute_dIdX =
false,
const bool compute_d2I =
false)
override;
96 template<
typename real2>
99 const unsigned int boundary_id,
100 const dealii::Point<dim,real2> &,
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 105 if (boundary_id == 1001 || boundary_id == 1006) {
106 assert(soln_at_q.size() == dim+2);
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));
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;
121 if(this->all_parameters->
pde_type != PDE_enum::euler) {
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);
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];
132 return force_dimensionalization_factor * (pressure * (normal *
force_vector) - viscous_tensor_times_normal*force_vector);
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 147 return evaluate_boundary_integrand<real>(
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 166 return evaluate_boundary_integrand<FadFadType>(
179 const dealii::Point<dim,real> &,
180 const std::array<real,nstate> &,
181 const std::array<dealii::Tensor<1,dim,real>,nstate> &)
const 182 {
return (real) 0.0; }
188 const dealii::Point<dim,FadFadType> &,
const std::array<FadFadType,nstate> &,
189 const std::array<dealii::Tensor<1,dim,FadFadType>,nstate> &)
const 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.
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.
Base class from which Advection, Diffusion, ConvectionDiffusion, and Euler is derived.
const double force_dimensionalization_factor
Pressure induced drag is given by.
const Physics::Euler< dim, nspecies, dim+2, FadFadType > & euler_fad_fad
Casts DG's physics into an Euler physics reference.
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...
const Parameters::AllParameters *const all_parameters
Pointer to all parameters.
PartialDifferentialEquation
Possible Partial Differential Equations to solve.
Files for the baseline physics.
const double angle_of_attack
Angle of attack retrieved from euler_fad_fad.
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...
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.
dealii::Tensor< 2, dim, double > initialize_rotation_matrix(const double angle_of_attack)
Initialize rotation matrix based on given angle of attack.
real compute_pressure(const std::array< real, nstate > &conservative_soln) const
Compute pressure from conservative solution.
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.
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.
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.
Sacado::Fad::DFad< real > FadType
Sacado AD type for first derivatives.
const Functional_types functional_type
Switches between lift and drag.
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.
const dealii::Tensor< 2, dim, double > rotation_matrix
Rotation matrix based on angle of attack.
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.
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.
Functional_types
Switch between lift and drag functional types.
DGBase is independent of the number of state variables.
real evaluate_functional(const bool compute_dIdW=false, const bool compute_dIdX=false, const bool compute_d2I=false) override
Destructor.
Navier-Stokes equations. Derived from Euler for the convective terms, which is derived from PhysicsBa...
LiftDragFunctional(std::shared_ptr< DGBase< dim, nspecies, real, MeshType >> dg_input, const Functional_types functional_type)
Constructor.
Sacado::Fad::DFad< FadType > FadFadType
Sacado AD type that allows 2nd derivatives.