1 #ifndef VERTEXCFD_CLOSURE_VARIABLEOLDVALUE_IMPL_HPP
2 #define VERTEXCFD_CLOSURE_VARIABLEOLDVALUE_IMPL_HPP
4 #include "utils/VertexCFD_Utils_GetValue.hpp"
6 #include <Panzer_HierarchicParallelism.hpp>
8 #include <Teuchos_StandardParameterEntryValidators.hpp>
12 namespace ClosureModel
15 template<
class EvalType,
class Traits>
16 VariableOldValue<EvalType, Traits>::VariableOldValue(
17 const panzer::IntegrationRule& ir,
18 const Teuchos::ParameterList& closure_params)
19 : _old_value_type(OldValueType::LastTime)
21 , _field_name(closure_params.get<std::string>(
"Field Name"))
26 , _var(_field_name, ir.dl_scalar)
27 , _grad_var(
"GRAD_" + _field_name, ir.dl_vector)
30 if (closure_params.isType<std::string>(
"Old Value Type"))
32 const auto type_validator = Teuchos::rcp(
33 new Teuchos::StringToIntegralParameterEntryValidator<OldValueType>(
34 Teuchos::tuple<std::string>(
"LastTime",
"LastStage"),
37 _old_value_type = type_validator->getIntegralValue(
38 closure_params.get<std::string>(
"Old Value Type"));
42 if (_old_value_type == OldValueType::LastStage)
46 if (closure_params.isType<
bool>(
"Save Old Gradient"))
47 _make_grad = closure_params.get<
bool>(
"Save Old Gradient");
50 _var_old_val = PHX::MDField<double, panzer::Cell, panzer::Point>(
51 _prefix + _field_name, ir.dl_scalar);
54 = PHX::MDField<double, panzer::Cell, panzer::Point, panzer::Dim>(
55 _prefix +
"GRAD_" + _field_name, ir.dl_vector);
58 this->addEvaluatedField(_var_old_val);
60 this->addEvaluatedField(_grad_var_old_val);
63 this->addDependentField(_var);
65 this->addDependentField(_grad_var);
68 this->setName(_field_name +
" Old Value");
72 template<
class EvalType,
class Traits>
73 void VariableOldValue<EvalType, Traits>::evaluateFields(
74 typename Traits::EvalData workset)
76 const double curr_time = workset.time;
77 const double curr_stage = workset.stage_number;
80 if ((curr_stage > _stage) || (curr_time != _time))
89 auto policy = panzer::HP::inst().teamPolicy<scalar_type, PHX::Device>(
91 Kokkos::parallel_for(this->getName(), policy, *
this);
95 template<
class EvalType,
class Traits>
96 KOKKOS_INLINE_FUNCTION
void VariableOldValue<EvalType, Traits>::operator()(
97 const Kokkos::TeamPolicy<PHX::exec_space>::member_type& team)
const
99 const int cell = team.league_rank();
100 const int num_point = _var.extent(1);
101 const int num_space_dim = _make_grad ? _grad_var.extent(2) : 0;
107 if ((_old_value_type == OldValueType::LastTime) && (_stage == 0)
113 else if ((_old_value_type == OldValueType::LastStage) && (_nl_iter == 0))
120 using Utils::getValue;
122 Kokkos::parallel_for(
123 Kokkos::TeamThreadRange(team, 0, num_point), [&](
const int point) {
124 _var_old_val(cell, point) = getValue(_var(cell, point));
126 for (
int dim = 0; dim < num_space_dim; ++dim)
128 _grad_var_old_val(cell, point, dim)
129 = getValue(_grad_var(cell, point, dim));
140 #endif // end VERTEXCFD_CLOSURE_VARIABLEOLDVALUE_IMPL_HPP