VertexCFD  0.0-dev
VertexCFD_Closure_ConductionVolumetricSource_impl.hpp
1 #ifndef VERTEXCFD_CLOSURE_CONDUCTIONVOLUMETRICSOURCE_IMPL_HPP
2 #define VERTEXCFD_CLOSURE_CONDUCTIONVOLUMETRICSOURCE_IMPL_HPP
3 
4 #include <Panzer_HierarchicParallelism.hpp>
5 #include <Panzer_Workset_Utilities.hpp>
6 
7 #include <Teuchos_StandardParameterEntryValidators.hpp>
8 
9 namespace VertexCFD
10 {
11 namespace ClosureModel
12 {
13 //---------------------------------------------------------------------------//
14 template<class EvalType, class Traits>
16  const panzer::IntegrationRule& ir,
17  const Teuchos::ParameterList& closure_params)
18  : _source("SOURCE_energy", ir.dl_scalar)
19  , _num_space_dim(ir.spatial_dimension)
20  , _ir_degree(ir.cubature_degree)
21  , _q(closure_params.get<double>("Volumetric Heat Source Value"))
22  , _x_left(std::numeric_limits<double>::signaling_NaN())
23  , _x_right(std::numeric_limits<double>::signaling_NaN())
24  , _heat_source_type(HeatSourceType::constant)
25 {
26  // Evaluated fields
27  this->addEvaluatedField(_source);
28 
29  // Get heat source type
30  if (closure_params.isType<std::string>("Heat Source Type"))
31  {
32  const auto type_validator = Teuchos::rcp(
33  new Teuchos::StringToIntegralParameterEntryValidator<HeatSourceType>(
34  Teuchos::tuple<std::string>("constant", "xlinear"),
35  "constant"));
36  _heat_source_type = type_validator->getIntegralValue(
37  closure_params.get<std::string>("Heat Source Type"));
38  }
39 
40  // Get parameters for each source type
41  if (_heat_source_type == HeatSourceType::xlinear)
42  {
43  _x_left = closure_params.get<double>("X-value of the left boundary");
44  _x_right = closure_params.get<double>("X-value of the right boundary");
45  }
46 
47  // Closure model name
48  this->setName("Conduction Volumetric Heat Source "
49  + std::to_string(_num_space_dim) + "D");
50 }
51 
52 //---------------------------------------------------------------------------//
53 template<class EvalType, class Traits>
55  typename Traits::SetupData sd, PHX::FieldManager<Traits>&)
56 {
57  _ir_index = panzer::getIntegrationRuleIndex(_ir_degree, (*sd.worksets_)[0]);
58 }
59 
60 //---------------------------------------------------------------------------//
61 template<class EvalType, class Traits>
63  typename Traits::EvalData workset)
64 {
65  auto policy = panzer::HP::inst().teamPolicy<scalar_type, PHX::Device>(
66  workset.num_cells);
67 
68  _ip_coords = workset.int_rules[_ir_index]->ip_coordinates;
69  Kokkos::parallel_for(this->getName(), policy, *this);
70 }
71 
72 //---------------------------------------------------------------------------//
73 template<class EvalType, class Traits>
74 KOKKOS_INLINE_FUNCTION void
76  const Kokkos::TeamPolicy<PHX::exec_space>::member_type& team) const
77 {
78  const int cell = team.league_rank();
79  const int num_point = _source.extent(1);
80 
81  Kokkos::parallel_for(Kokkos::TeamThreadRange(team, 0, num_point),
82  [&](const int point) {
83  if (_heat_source_type == HeatSourceType::constant)
84  {
85  _source(cell, point) = _q;
86  }
87  else
88  {
89  const double x = _ip_coords(cell, point, 0);
90  _source(cell, point) = _q * (x - _x_left)
91  / (_x_right - _x_left);
92  }
93  });
94 }
95 
96 //---------------------------------------------------------------------------//
97 
98 } // end namespace ClosureModel
99 } // end namespace VertexCFD
100 
101 #endif // end VERTEXCFD_CLOSURE_CONDUCTIONVOLUMETRICSOURCE_IMPL_HPP
VertexCFD::ClosureModel::ConductionVolumetricSource::evaluateFields
void evaluateFields(typename Traits::EvalData workset) override
Compute the source term at each integration point.
Definition: VertexCFD_Closure_ConductionVolumetricSource_impl.hpp:62
VertexCFD
Definition: tstMethodManufacturedSolutionBC.cpp:23
VertexCFD::ClosureModel::ConductionVolumetricSource::operator()
KOKKOS_INLINE_FUNCTION void operator()(const Kokkos::TeamPolicy< PHX::exec_space >::member_type &team) const
Kokkos functor for parallel evaluation over teams.
Definition: VertexCFD_Closure_ConductionVolumetricSource_impl.hpp:75
VertexCFD::ClosureModel::ConductionVolumetricSource::ConductionVolumetricSource
ConductionVolumetricSource(const panzer::IntegrationRule &ir, const Teuchos::ParameterList &closure_params)
Constructor.
Definition: VertexCFD_Closure_ConductionVolumetricSource_impl.hpp:15
VertexCFD::ClosureModel::ConductionVolumetricSource::_source
PHX::MDField< scalar_type, panzer::Cell, panzer::Point > _source
MDField that holds the evaluated source term.
Definition: VertexCFD_Closure_ConductionVolumetricSource.hpp:99
VertexCFD::ClosureModel::ConductionVolumetricSource::postRegistrationSetup
void postRegistrationSetup(typename Traits::SetupData sd, PHX::FieldManager< Traits > &fm) override
Register fields with the FieldManager after construction.
Definition: VertexCFD_Closure_ConductionVolumetricSource_impl.hpp:54