VertexCFD  0.0-dev
VertexCFD_InitialCondition_IncompressibleLaminarFlow_impl.hpp
1 #ifndef VERTEXCFD_INITIALCONDITION_INCOMPRESSIBLELAMINARFLOW_IMPL_HPP
2 #define VERTEXCFD_INITIALCONDITION_INCOMPRESSIBLELAMINARFLOW_IMPL_HPP
3 
4 #include <utils/VertexCFD_Utils_VectorField.hpp>
5 
6 #include <Panzer_GlobalIndexer.hpp>
7 #include <Panzer_HierarchicParallelism.hpp>
8 #include <Panzer_PureBasis.hpp>
9 #include <Panzer_Workset_Utilities.hpp>
10 
11 #include "utils/VertexCFD_Utils_Constants.hpp"
12 #include "utils/VertexCFD_Utils_SmoothMath.hpp"
13 
14 #include <Teuchos_Array.hpp>
15 
16 #include <cmath>
17 #include <string>
18 
19 namespace VertexCFD
20 {
21 namespace InitialCondition
22 {
23 //---------------------------------------------------------------------------//
24 template<class EvalType, class Traits, int NumSpaceDim>
25 IncompressibleLaminarFlow<EvalType, Traits, NumSpaceDim>::IncompressibleLaminarFlow(
26  const Teuchos::ParameterList& ic_params, const panzer::PureBasis& basis)
27  : _lagrange_pressure("lagrange_pressure", basis.functional)
28  , _temperature("temperature", basis.functional)
29  , _basis_name(basis.name())
30  , _min(ic_params.get<double>("Minimum height"))
31  , _max(ic_params.get<double>("Maximum height"))
32  , _vel_avg(ic_params.get<double>("Average velocity"))
33  , _vel_max(num_space_dim == 2 ? 3.0 / 2.0 * _vel_avg : 2.0 * _vel_avg)
34  , _solve_temp(ic_params.isType<double>("Temperature"))
35  , _T_init(std::numeric_limits<double>::quiet_NaN())
36 {
37  this->addEvaluatedField(_lagrange_pressure);
38  this->addUnsharedField(_lagrange_pressure.fieldTag().clone());
39 
40  Utils::addEvaluatedVectorField(
41  *this, basis.functional, _velocity, "velocity_", true);
42 
43  if (_solve_temp)
44  {
45  _T_init = ic_params.get<double>("Temperature");
46  this->addEvaluatedField(_temperature);
47  this->addUnsharedField(_temperature.fieldTag().clone());
48  }
49 
50  this->setName("Laminar Flow Initial Condition");
51 }
52 
53 //---------------------------------------------------------------------------//
54 template<class EvalType, class Traits, int NumSpaceDim>
55 void IncompressibleLaminarFlow<EvalType, Traits, NumSpaceDim>::postRegistrationSetup(
56  typename Traits::SetupData sd, PHX::FieldManager<Traits>&)
57 {
58  _basis_index = panzer::getPureBasisIndex(
59  _basis_name, (*sd.worksets_)[0], this->wda);
60 }
61 
62 //---------------------------------------------------------------------------//
63 template<class EvalType, class Traits, int NumSpaceDim>
64 void IncompressibleLaminarFlow<EvalType, Traits, NumSpaceDim>::evaluateFields(
65  typename Traits::EvalData workset)
66 {
67  _basis_coords = this->wda(workset).bases[_basis_index]->basis_coordinates;
68  auto policy = panzer::HP::inst().teamPolicy<scalar_type, PHX::Device>(
69  workset.num_cells);
70  Kokkos::parallel_for(this->getName(), policy, *this);
71 }
72 
73 //---------------------------------------------------------------------------//
74 template<class EvalType, class Traits, int NumSpaceDim>
75 KOKKOS_INLINE_FUNCTION void
76 IncompressibleLaminarFlow<EvalType, Traits, NumSpaceDim>::operator()(
77  const Kokkos::TeamPolicy<PHX::exec_space>::member_type& team) const
78 {
79  const int cell = team.league_rank();
80  const int num_basis = _velocity[0].extent(1);
81 
82  using std::pow;
83 
84  Kokkos::parallel_for(
85  Kokkos::TeamThreadRange(team, 0, num_basis), [&](const int basis) {
86  const double H = 0.5 * (_max - _min);
87 
88  // y-axis can be at arbitrary location
89  const double y_0 = _min + H;
90  double r2 = pow(_basis_coords(cell, basis, 1) - y_0, 2.0);
91  _velocity[1](cell, basis) = 0.0;
92  if (num_space_dim == 3)
93  {
94  // Assumes z-axis is centered about z = 0
95  r2 += pow(_basis_coords(cell, basis, 2), 2.0);
96  _velocity[2](cell, basis) = 0.0;
97  }
98  // Limit radius to set zero velocity in areas of domain that may
99  // be outside of the characteristic radius
100  r2 = SmoothMath::min(r2, H * H, 0.0);
101  _velocity[0](cell, basis) = _vel_max * (1.0 - r2 / (H * H));
102  _lagrange_pressure(cell, basis) = 0.0;
103  if (_solve_temp)
104  _temperature(cell, basis) = _T_init;
105  });
106 }
107 
108 //---------------------------------------------------------------------------//
109 
110 } // end namespace InitialCondition
111 } // end namespace VertexCFD
112 
113 #endif // end VERTEXCFD_INITIALCONDITION_INCOMPRESSIBLELAMINARFLOW_IMPL_HPP
VertexCFD
Definition: tstMethodManufacturedSolutionBC.cpp:23