1 #ifndef VERTEXCFD_CLOSURE_INCOMPRESSIBLELSVOFSURFACETENSIONFORCE_IMPL_HPP
2 #define VERTEXCFD_CLOSURE_INCOMPRESSIBLELSVOFSURFACETENSIONFORCE_IMPL_HPP
4 #include "utils/VertexCFD_Utils_VectorFieldView.hpp"
6 #include "utils/VertexCFD_Utils_SmoothMath.hpp"
7 #include "utils/VertexCFD_Utils_VectorField.hpp"
9 #include <Panzer_HierarchicParallelism.hpp>
15 namespace ClosureModel
18 template<
class EvalType,
class Traits,
int NumSpaceDim>
19 IncompressibleLSVOFSurfaceTensionForce<EvalType, Traits, NumSpaceDim>::
20 IncompressibleLSVOFSurfaceTensionForce(
21 const panzer::IntegrationRule& ir,
22 const Teuchos::ParameterList& closure_params,
23 const std::vector<std::string>& phase_names,
24 const std::string& flux_prefix,
25 const std::string& gradient_prefix)
26 : _sigma_alpha(closure_params.get<double>(
"Surface Tension Coefficient"))
27 , num_phases(closure_params.get<int>(
"Number of Phases") - 1)
30 Utils::addEvaluatedVectorField(*
this, ir.dl_vector, _surface_tension_flux,
31 flux_prefix +
"SURFACE_TENSION_FLUX_"
35 this->setName(
"Incompressible LSVOF Surface Tension Force "
36 + std::to_string(num_space_dim) +
"D");
38 Utils::addDependentVectorFieldView(*
this,
42 gradient_prefix +
"GRAD_",
47 template<
class EvalType,
class Traits,
int NumSpaceDim>
48 void IncompressibleLSVOFSurfaceTensionForce<EvalType, Traits, NumSpaceDim>::
49 evaluateFields(
typename Traits::EvalData workset)
53 if constexpr (Sacado::IsADType<scalar_type>::value)
56 = Kokkos::dimension_scalar(_surface_tension_flux[0].get_view());
57 bytes = scratch_view::shmem_size(_surface_tension_flux[0].extent(1),
60 bytes += scratch_view_Fs::shmem_size(
61 _surface_tension_flux[0].extent(1), fad_size);
63 bytes += scratch_view_normal::shmem_size(
64 _surface_tension_flux[0].extent(1), num_space_dim, fad_size);
68 bytes = scratch_view::shmem_size(_surface_tension_flux[0].extent(1));
71 += scratch_view_Fs::shmem_size(_surface_tension_flux[0].extent(1));
73 bytes += scratch_view_normal::shmem_size(
74 _surface_tension_flux[0].extent(1), num_space_dim);
76 auto policy = panzer::HP::inst().teamPolicy<scalar_type, PHX::Device>(
78 policy.set_scratch_size(0, Kokkos::PerTeam(bytes));
79 Kokkos::parallel_for(this->getName(), policy, *
this);
83 template<
class EvalType,
class Traits,
int NumSpaceDim>
84 KOKKOS_INLINE_FUNCTION
void
85 IncompressibleLSVOFSurfaceTensionForce<EvalType, Traits, NumSpaceDim>::operator()(
86 const Kokkos::TeamPolicy<PHX::exec_space>::member_type& team)
const
90 const int cell = team.league_rank();
91 const int num_point = _surface_tension_flux[0].extent(1);
92 const double max_tol = 1e-10;
94 scratch_view scratch_data;
95 scratch_view_Fs scratch_data_force;
96 scratch_view_normal scratch_data_normal;
98 if constexpr (Sacado::IsADType<scalar_type>::value)
101 = Kokkos::dimension_scalar(_surface_tension_flux[0].get_view());
103 scratch_data = scratch_view(team.team_shmem(), num_point, fad_size);
106 = scratch_view_Fs(team.team_shmem(), num_point, fad_size);
108 scratch_data_normal = scratch_view_normal(
109 team.team_shmem(), num_point, num_space_dim, fad_size);
113 scratch_data = scratch_view(team.team_shmem(), num_point);
115 scratch_data_force = scratch_view_Fs(team.team_shmem(), num_point);
118 = scratch_view_normal(team.team_shmem(), num_point, num_space_dim);
121 Kokkos::parallel_for(
122 Kokkos::TeamThreadRange(team, 0, num_point), [&](
const int point) {
123 auto&& tmp_surf_force = scratch_data_force(point);
124 auto&& mag_grad_scalar = scratch_data(point);
126 = Kokkos::subview(scratch_data_normal, point, Kokkos::ALL);
128 for (
int dim = 0; dim < num_space_dim; ++dim)
130 for (
int d = 0; d < num_space_dim; ++d)
132 _surface_tension_flux[d](cell, point, dim) = 0.0;
136 for (
int n = 0; n < num_phases; ++n)
138 mag_grad_scalar = 0.0;
140 for (
int dim = 0; dim < num_space_dim; ++dim)
142 unit_normal[dim] = 0.0;
144 += pow(_phase_grad[n](cell, point, dim), 2.0);
147 = sqrt(SmoothMath::max(mag_grad_scalar, max_tol, 0));
149 for (
int dim = 0; dim < num_space_dim; ++dim)
151 unit_normal[dim] = _phase_grad[n](cell, point, dim)
155 for (
int dim = 0; dim < num_space_dim; ++dim)
157 for (
int d = 0; d < num_space_dim; ++d)
159 tmp_surf_force = -unit_normal[dim] * unit_normal[d];
163 tmp_surf_force += 1.0;
166 tmp_surf_force *= _sigma_alpha * mag_grad_scalar;
168 _surface_tension_flux[d](cell, point, dim)