1 #ifndef VERTEXCFD_INITIALCONDITION_INCOMPRESSIBLETURBULENTCHANNEL_IMPL_HPP
2 #define VERTEXCFD_INITIALCONDITION_INCOMPRESSIBLETURBULENTCHANNEL_IMPL_HPP
4 #include "utils/VertexCFD_Utils_SmoothMath.hpp"
5 #include "utils/VertexCFD_Utils_VectorField.hpp"
7 #include <Panzer_GlobalIndexer.hpp>
8 #include <Panzer_HierarchicParallelism.hpp>
9 #include <Panzer_PureBasis.hpp>
10 #include <Panzer_Workset_Utilities.hpp>
12 #include "utils/VertexCFD_Utils_Constants.hpp"
14 #include <Teuchos_Array.hpp>
22 namespace InitialCondition
25 template<
class EvalType,
class Traits,
int NumSpaceDim>
26 IncompressibleTurbulentChannel<EvalType, Traits, NumSpaceDim>::
27 IncompressibleTurbulentChannel(
const Teuchos::ParameterList& ic_params,
28 const panzer::PureBasis& basis)
29 : _lagrange_pressure(
"lagrange_pressure", basis.functional)
30 , _temperature(
"temperature", basis.functional)
31 , _basis_name(basis.name())
32 , _nu(ic_params.get<double>(
"Kinematic Viscosity"))
33 , _h(ic_params.get<double>(
"Half Width"))
34 , _Re_tau(ic_params.get<double>(
"Friction Reynolds Number"))
35 , _u_tau(_Re_tau * _nu / _h)
36 , _L_x(ic_params.get<double>(
"L_x"))
37 , _L_z(ic_params.get<double>(
"L_z"))
39 , _rands(Kokkos::ViewAllocateWithoutInitializing(
"Turb rands"),
44 , _solve_temp(ic_params.isType<double>(
"Temperature"))
45 , _T_init(std::numeric_limits<double>::quiet_NaN())
48 if (ic_params.isType<
int>(
"Number of Modes"))
50 _nb_modes = ic_params.get<
int>(
"Number of Modes");
54 if (ic_params.isType<
bool>(
"Add Random Perturbations"))
56 _add_rands = ic_params.get<
bool>(
"Add Random Perturbations");
60 const double Re_b = std::pow(_Re_tau / 0.09, 1.0 / 0.88);
61 const double U_b = Re_b * _nu / 2.0 / _h;
62 _U_0 = 1.28 * std::pow(Re_b, -0.0116) * U_b;
68 = Kokkos::create_mirror_view(Kokkos::HostSpace{}, _rands);
70 std::default_random_engine generator;
71 std::uniform_real_distribution<double> interval(-1.0, 1.0);
73 for (
int i = 0; i < basis.numCells(); ++i)
75 for (
int j = 0; j < basis.cardinality(); ++j)
77 rands_host(i, j) = interval(generator);
81 Kokkos::deep_copy(_rands, rands_host);
85 this->addEvaluatedField(_lagrange_pressure);
86 this->addUnsharedField(_lagrange_pressure.fieldTag().clone());
88 Utils::addEvaluatedVectorField(
89 *
this, basis.functional, _velocity,
"velocity_",
true);
93 _T_init = ic_params.get<
double>(
"Temperature");
94 this->addEvaluatedField(_temperature);
95 this->addUnsharedField(_temperature.fieldTag().clone());
98 this->setName(
"Turbulent Channel Initial Condition "
99 + std::to_string(num_space_dim) +
"D");
103 template<
class EvalType,
class Traits,
int NumSpaceDim>
104 void IncompressibleTurbulentChannel<EvalType, Traits, NumSpaceDim>::
105 postRegistrationSetup(
typename Traits::SetupData sd,
106 PHX::FieldManager<Traits>&)
108 _basis_index = panzer::getPureBasisIndex(
109 _basis_name, (*sd.worksets_)[0], this->wda);
113 template<
class EvalType,
class Traits,
int NumSpaceDim>
114 void IncompressibleTurbulentChannel<EvalType, Traits, NumSpaceDim>::evaluateFields(
115 typename Traits::EvalData workset)
117 _basis_coords = this->wda(workset).bases[_basis_index]->basis_coordinates;
118 auto policy = panzer::HP::inst().teamPolicy<scalar_type, PHX::Device>(
120 Kokkos::parallel_for(this->getName(), policy, *
this);
124 template<
class EvalType,
class Traits,
int NumSpaceDim>
125 KOKKOS_INLINE_FUNCTION
void
126 IncompressibleTurbulentChannel<EvalType, Traits, NumSpaceDim>::operator()(
127 const Kokkos::TeamPolicy<PHX::exec_space>::member_type& team)
const
129 const int cell = team.league_rank();
130 const int num_basis = _velocity[0].extent(1);
131 const double abs_tol = 1e-10;
137 Kokkos::parallel_for(
138 Kokkos::TeamThreadRange(team, 0, num_basis), [&](
const int basis) {
143 - SmoothMath::abs(_basis_coords(cell, basis, 1), abs_tol))
149 _velocity[0](cell, basis) = y_plus * _u_tau;
154 _velocity[0](cell, basis) = _u_tau
155 * (1.0 / 0.41 * log(y_plus) + 5.2);
159 _velocity[1](cell, basis) = 0.0;
160 if (num_space_dim == 3)
161 _velocity[2](cell, basis) = 0.0;
166 _velocity[0](cell, basis) += 0.1 * _rands(cell, basis) * _U_0;
170 for (
int m = 1; m <= _nb_modes; ++m)
172 _velocity[0](cell, basis)
175 - pow(_basis_coords(cell, basis, 1), 2.0))
176 * sin(4.0 * m * pi * _basis_coords(cell, basis, 2)
179 if (num_space_dim == 3)
181 _velocity[2](cell, basis)
184 - pow(_basis_coords(cell, basis, 1), 2.0))
185 * sin(4.0 * m * pi * _basis_coords(cell, basis, 0)
191 _lagrange_pressure(cell, basis) = 0.0;
195 _temperature(cell, basis) = _T_init;