1 #ifndef VERTEXCFD_CLOSURE_SOLIDELECTRICCONDUCTIVITY_IMPL_HPP
2 #define VERTEXCFD_CLOSURE_SOLIDELECTRICCONDUCTIVITY_IMPL_HPP
4 #include <Panzer_HierarchicParallelism.hpp>
6 #include <Teuchos_StandardParameterEntryValidators.hpp>
10 namespace ClosureModel
13 template<
class EvalType,
class Traits>
14 SolidElectricConductivity<EvalType, Traits>::SolidElectricConductivity(
15 const panzer::IntegrationRule& ir,
16 const Teuchos::ParameterList& closure_params)
17 : _sigma(
"solid_electric_conductivity", ir.dl_scalar)
18 , _electric_potential(
"electric_potential", ir.dl_scalar)
19 , _sigma0(std::numeric_limits<double>::quiet_NaN())
20 , _elec_cond_type(ElecCondType::constant)
23 this->addEvaluatedField(_sigma);
26 if (closure_params.isType<std::string>(
"Electric Conductivity Type"))
28 const auto type_validator = Teuchos::rcp(
29 new Teuchos::StringToIntegralParameterEntryValidator<ElecCondType>(
30 Teuchos::tuple<std::string>(
"constant",
"inverse_proportional"),
32 _elec_cond_type = type_validator->getIntegralValue(
33 closure_params.get<std::string>(
"Electric Conductivity Type"));
37 if (_elec_cond_type == ElecCondType::constant)
39 _sigma0 = closure_params.get<
double>(
"Electric Conductivity Value");
41 else if (_elec_cond_type == ElecCondType::inverse_proportional)
44 = closure_params.get<
double>(
"Electric Conductivity Coefficient");
46 this->addDependentField(_electric_potential);
49 this->setName(
"Solid Electric Conductivity");
53 template<
class EvalType,
class Traits>
54 void SolidElectricConductivity<EvalType, Traits>::evaluateFields(
55 typename Traits::EvalData workset)
57 if (_elec_cond_type == ElecCondType::constant)
58 _sigma.deep_copy(_sigma0);
59 else if (_elec_cond_type == ElecCondType::inverse_proportional)
61 auto policy = panzer::HP::inst().teamPolicy<scalar_type, PHX::Device>(
63 Kokkos::parallel_for(this->getName(), policy, *
this);
68 template<
class EvalType,
class Traits>
69 KOKKOS_INLINE_FUNCTION
void
70 SolidElectricConductivity<EvalType, Traits>::operator()(
71 const Kokkos::TeamPolicy<PHX::exec_space>::member_type& team)
const
73 const int cell = team.league_rank();
74 const int num_point = _sigma.extent(1);
77 Kokkos::TeamThreadRange(team, 0, num_point), [&](
const int point) {
78 _sigma(cell, point) = _sigma0 / _electric_potential(cell, point);
87 #endif // end VERTEXCFD_CLOSURE_SOLIDELECTRICCONDUCTIVITY_IMPL_HPP