1 #ifndef VERTEXCFD_INITIALCONDITION_INCOMPRESSIBLELAMINARFLOW_IMPL_HPP
2 #define VERTEXCFD_INITIALCONDITION_INCOMPRESSIBLELAMINARFLOW_IMPL_HPP
4 #include <utils/VertexCFD_Utils_VectorField.hpp>
6 #include <Panzer_GlobalIndexer.hpp>
7 #include <Panzer_HierarchicParallelism.hpp>
8 #include <Panzer_PureBasis.hpp>
9 #include <Panzer_Workset_Utilities.hpp>
11 #include "utils/VertexCFD_Utils_Constants.hpp"
12 #include "utils/VertexCFD_Utils_SmoothMath.hpp"
14 #include <Teuchos_Array.hpp>
21 namespace InitialCondition
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())
37 this->addEvaluatedField(_lagrange_pressure);
38 this->addUnsharedField(_lagrange_pressure.fieldTag().clone());
40 Utils::addEvaluatedVectorField(
41 *
this, basis.functional, _velocity,
"velocity_",
true);
45 _T_init = ic_params.get<
double>(
"Temperature");
46 this->addEvaluatedField(_temperature);
47 this->addUnsharedField(_temperature.fieldTag().clone());
50 this->setName(
"Laminar Flow Initial Condition");
54 template<
class EvalType,
class Traits,
int NumSpaceDim>
55 void IncompressibleLaminarFlow<EvalType, Traits, NumSpaceDim>::postRegistrationSetup(
56 typename Traits::SetupData sd, PHX::FieldManager<Traits>&)
58 _basis_index = panzer::getPureBasisIndex(
59 _basis_name, (*sd.worksets_)[0], this->wda);
63 template<
class EvalType,
class Traits,
int NumSpaceDim>
64 void IncompressibleLaminarFlow<EvalType, Traits, NumSpaceDim>::evaluateFields(
65 typename Traits::EvalData workset)
67 _basis_coords = this->wda(workset).bases[_basis_index]->basis_coordinates;
68 auto policy = panzer::HP::inst().teamPolicy<scalar_type, PHX::Device>(
70 Kokkos::parallel_for(this->getName(), policy, *
this);
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
79 const int cell = team.league_rank();
80 const int num_basis = _velocity[0].extent(1);
85 Kokkos::TeamThreadRange(team, 0, num_basis), [&](
const int basis) {
86 const double H = 0.5 * (_max - _min);
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)
95 r2 += pow(_basis_coords(cell, basis, 2), 2.0);
96 _velocity[2](cell, basis) = 0.0;
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;
104 _temperature(cell, basis) = _T_init;
113 #endif // end VERTEXCFD_INITIALCONDITION_INCOMPRESSIBLELAMINARFLOW_IMPL_HPP