1 #ifndef VERTEXCFD_CLOSURE_INCOMPRESSIBLELSVOFARTIFICIALCOMPRESSION_IMPL_HPP
2 #define VERTEXCFD_CLOSURE_INCOMPRESSIBLELSVOFARTIFICIALCOMPRESSION_IMPL_HPP
4 #include "utils/VertexCFD_Utils_SmoothMath.hpp"
5 #include "utils/VertexCFD_Utils_VectorField.hpp"
7 #include <Panzer_HierarchicParallelism.hpp>
13 namespace ClosureModel
16 template<
class EvalType,
class Traits,
int NumSpaceDim>
17 IncompressibleLSVOFArtificialCompression<EvalType, Traits, NumSpaceDim>::
18 IncompressibleLSVOFArtificialCompression(
19 const panzer::IntegrationRule& ir,
20 const Teuchos::ParameterList& closure_params,
21 const std::string& scalar_name,
22 const std::string& equation_name,
23 const std::string& flux_prefix,
24 const std::string& gradient_prefix,
25 const std::string& field_prefix)
26 : _scalar_flux(flux_prefix +
"ARTIFICIAL_COMPRESSION_" + equation_name,
28 , _interface_velocity(
"interface_velocity", ir.dl_vector)
29 , _scalar(field_prefix + scalar_name, ir.dl_scalar)
30 , _grad_scalar(gradient_prefix +
"GRAD_" + scalar_name, ir.dl_vector)
31 , _C_alpha(closure_params.get<double>(
"Compression Factor"))
34 this->addEvaluatedField(_scalar_flux);
35 this->addEvaluatedField(_interface_velocity);
38 this->addDependentField(_scalar);
39 this->addDependentField(_grad_scalar);
41 Utils::addDependentVectorField(
42 *
this, ir.dl_scalar, _velocity, field_prefix +
"velocity_");
44 this->setName(equation_name
45 +
" Incompressible LSVOF Artificial Compression "
46 + std::to_string(num_space_dim) +
"D");
50 template<
class EvalType,
class Traits,
int NumSpaceDim>
51 void IncompressibleLSVOFArtificialCompression<EvalType, Traits, NumSpaceDim>::
52 evaluateFields(
typename Traits::EvalData workset)
56 if constexpr (Sacado::IsADType<scalar_type>::value)
59 = Kokkos::dimension_scalar(_interface_velocity.get_view());
60 bytes = scratch_view::shmem_size(
61 _interface_velocity.extent(1), NUM_TMPS, fad_size);
65 bytes = scratch_view::shmem_size(_interface_velocity.extent(1),
69 auto policy = panzer::HP::inst().teamPolicy<scalar_type, PHX::Device>(
71 policy.set_scratch_size(0, Kokkos::PerTeam(bytes));
72 Kokkos::parallel_for(this->getName(), policy, *
this);
76 template<
class EvalType,
class Traits,
int NumSpaceDim>
77 KOKKOS_INLINE_FUNCTION
void
78 IncompressibleLSVOFArtificialCompression<EvalType, Traits, NumSpaceDim>::operator()(
79 const Kokkos::TeamPolicy<PHX::exec_space>::member_type& team)
const
82 const int cell = team.league_rank();
83 const int num_point = _scalar_flux.extent(1);
84 const double max_tol = 1e-10;
86 scratch_view tmp_field;
87 if constexpr (Sacado::IsADType<scalar_type>::value)
90 = Kokkos::dimension_scalar(_interface_velocity.get_view());
92 = scratch_view(team.team_shmem(), num_point, NUM_TMPS, fad_size);
96 tmp_field = scratch_view(team.team_shmem(), num_point, NUM_TMPS);
100 Kokkos::TeamThreadRange(team, 0, num_point), [&](
const int point) {
101 auto&& mag_u = tmp_field(point, MAG_U);
102 auto&& mag_grad_scalar = tmp_field(point, MAG_GRAD_SCALAR);
104 mag_grad_scalar = 0.0;
106 for (
int d = 0; d < num_space_dim; ++d)
108 mag_u += pow(_velocity[d](cell, point), 2.0);
109 mag_grad_scalar += pow(_grad_scalar(cell, point, d), 2.0);
112 for (
int dim = 0; dim < num_space_dim; ++dim)
114 _scalar_flux(cell, point, dim)
115 = _scalar(cell, point) * (1.0 - _scalar(cell, point));
117 _interface_velocity(cell, point, dim)
120 / SmoothMath::max(mag_grad_scalar, max_tol, 0))
121 * _grad_scalar(cell, point, dim);
123 _scalar_flux(cell, point, dim)
124 *= _interface_velocity(cell, point, dim);