VertexCFD  0.0-dev
VertexCFD_Closure_IncompressibleConvectiveFlux_impl.hpp
1 #ifndef VERTEXCFD_CLOSURE_INCOMPRESSIBLECONVECTIVEFLUX_IMPL_HPP
2 #define VERTEXCFD_CLOSURE_INCOMPRESSIBLECONVECTIVEFLUX_IMPL_HPP
3 
4 #include "utils/VertexCFD_Utils_VectorField.hpp"
5 
6 #include <Panzer_HierarchicParallelism.hpp>
7 #include <Teuchos_StandardParameterEntryValidators.hpp>
8 
9 #include <string>
10 
11 namespace VertexCFD
12 {
13 namespace ClosureModel
14 {
15 //---------------------------------------------------------------------------//
16 template<class EvalType, class Traits, int NumSpaceDim>
17 IncompressibleConvectiveFlux<EvalType, Traits, NumSpaceDim>::
18  IncompressibleConvectiveFlux(const panzer::IntegrationRule& ir,
19  const Teuchos::ParameterList& fluid_params,
20  const std::string& flux_prefix,
21  const std::string& field_prefix)
22  : _continuity_flux(flux_prefix + "CONVECTIVE_FLUX_continuity", ir.dl_vector)
23  , _energy_flux(flux_prefix + "CONVECTIVE_FLUX_energy", ir.dl_vector)
24  , _energy_source("NON_CONSERVATIVE_SOURCE_energy", ir.dl_scalar)
25  , _lagrange_pressure(field_prefix + "lagrange_pressure", ir.dl_scalar)
26  , _rho("density", ir.dl_scalar)
27  , _cp("specific_heat_capacity", ir.dl_scalar)
28  , _temperature(field_prefix + "temperature", ir.dl_scalar)
29  , _grad_temp("GRAD_temperature", ir.dl_vector)
30  , _beta(fluid_params.get<double>("Artificial compressibility"))
31  , _solve_temp(fluid_params.get<bool>("Build Temperature Equation"))
32  , _continuity_model(ConModel::AC)
33 {
34  // Get continuity model type
35  if (fluid_params.isType<std::string>("Continuity Model"))
36  {
37  const auto type_validator = Teuchos::rcp(
38  new Teuchos::StringToIntegralParameterEntryValidator<ConModel>(
39  Teuchos::tuple<std::string>("AC", "EDAC", "EDACTempNC"), "AC"));
40  _continuity_model = type_validator->getIntegralValue(
41  fluid_params.get<std::string>("Continuity Model"));
42  }
43 
44  // Evaluated fields
45  this->addEvaluatedField(_continuity_flux);
46 
47  Utils::addEvaluatedVectorField(*this, ir.dl_vector, _momentum_flux,
48  flux_prefix + "CONVECTIVE_FLUX_"
49  "momentum_");
50 
51  if (_solve_temp)
52  {
53  if (_continuity_model == ConModel::EDACTempNC)
54  {
55  this->addEvaluatedField(_energy_source);
56  }
57  else
58  {
59  this->addEvaluatedField(_energy_flux);
60  }
61  }
62 
63  // Dependent fields
64  Utils::addDependentVectorField(
65  *this, ir.dl_scalar, _velocity, field_prefix + "velocity_");
66  this->addDependentField(_lagrange_pressure);
67  this->addDependentField(_rho);
68 
69  if (_solve_temp)
70  {
71  this->addDependentField(_cp);
72  this->addDependentField(_temperature);
73  if (_continuity_model == ConModel::EDACTempNC)
74  {
75  this->addDependentField(_grad_temp);
76  }
77  }
78 
79  this->setName("Incompressible Convective Flux "
80  + std::to_string(num_space_dim) + "D");
81 }
82 
83 //---------------------------------------------------------------------------//
84 template<class EvalType, class Traits, int NumSpaceDim>
85 void IncompressibleConvectiveFlux<EvalType, Traits, NumSpaceDim>::evaluateFields(
86  typename Traits::EvalData workset)
87 {
88  auto policy = panzer::HP::inst().teamPolicy<scalar_type, PHX::Device>(
89  workset.num_cells);
90  Kokkos::parallel_for(this->getName(), policy, *this);
91 }
92 
93 //---------------------------------------------------------------------------//
94 template<class EvalType, class Traits, int NumSpaceDim>
95 KOKKOS_INLINE_FUNCTION void
96 IncompressibleConvectiveFlux<EvalType, Traits, NumSpaceDim>::operator()(
97  const Kokkos::TeamPolicy<PHX::exec_space>::member_type& team) const
98 {
99  const int cell = team.league_rank();
100  const int num_point = _continuity_flux.extent(1);
101 
102  Kokkos::parallel_for(
103  Kokkos::TeamThreadRange(team, 0, num_point), [&](const int point) {
104  if (_solve_temp && _continuity_model == ConModel::EDACTempNC)
105  _energy_source(cell, point) = 0.0;
106 
107  for (int dim = 0; dim < num_space_dim; ++dim)
108  {
109  const auto vel_dim = _velocity[dim](cell, point);
110  _continuity_flux(cell, point, dim) = _rho(cell, point)
111  * vel_dim;
112 
113  if (_continuity_model != ConModel::AC)
114  {
115  _continuity_flux(cell, point, dim)
116  += _lagrange_pressure(cell, point) * vel_dim / _beta;
117  }
118 
119  for (int mom_dim = 0; mom_dim < num_space_dim; ++mom_dim)
120  {
121  _momentum_flux[mom_dim](cell, point, dim)
122  = _rho(cell, point) * vel_dim
123  * _velocity[mom_dim](cell, point);
124  if (mom_dim == dim)
125  {
126  _momentum_flux[mom_dim](cell, point, dim)
127  += _lagrange_pressure(cell, point);
128  }
129  }
130 
131  if (_solve_temp)
132  {
133  if (_continuity_model == ConModel::EDACTempNC)
134  {
135  _energy_source(cell, point)
136  += _rho(cell, point) * _cp(cell, point)
137  * _grad_temp(cell, point, dim)
138  * _velocity[dim](cell, point);
139  }
140  else
141  {
142  _energy_flux(cell, point, dim)
143  = _rho(cell, point) * _cp(cell, point) * vel_dim
144  * _temperature(cell, point);
145  }
146  }
147  }
148  });
149 }
150 
151 //---------------------------------------------------------------------------//
152 
153 } // end namespace ClosureModel
154 } // end namespace VertexCFD
155 
156 #endif // end VERTEXCFD_CLOSURE_INCOMPRESSIBLECONVECTIVEFLUX_IMPL_HPP
VertexCFD
Definition: tstMethodManufacturedSolutionBC.cpp:23