VertexCFD  0.0-dev
VertexCFD_Closure_SolidFullInductionConvectiveFlux_impl.hpp
1 #ifndef VERTEXCFD_CLOSURE_SOLIDFULLINDUCTIONCONVECTIVEFLUX_IMPL_HPP
2 #define VERTEXCFD_CLOSURE_SOLIDFULLINDUCTIONCONVECTIVEFLUX_IMPL_HPP
3 
4 #include "utils/VertexCFD_Utils_MagneticLayout.hpp"
5 #include "utils/VertexCFD_Utils_VectorField.hpp"
6 
7 #include <Panzer_HierarchicParallelism.hpp>
8 
9 namespace VertexCFD
10 {
11 namespace ClosureModel
12 {
13 //---------------------------------------------------------------------------//
14 template<class EvalType, class Traits, int NumSpaceDim>
15 SolidFullInductionConvectiveFlux<EvalType, Traits, NumSpaceDim>::
16  SolidFullInductionConvectiveFlux(
17  const panzer::IntegrationRule& ir,
18  const MHDProperties::FullInductionMHDProperties& mhd_props,
19  const std::string& flux_prefix,
20  const std::string& field_prefix)
21  : _magnetic_correction_potential_flux(
22  flux_prefix + "CONVECTIVE_FLUX_magnetic_correction_potential",
23  ir.dl_vector)
24  , _total_magnetic_field(
25  "total_magnetic_field",
26  Utils::buildMagneticLayout(ir.dl_scalar, num_magnetic_field_dim))
27  , _scalar_magnetic_potential(field_prefix + "scalar_magnetic_potential",
28  ir.dl_scalar)
29  , _c_h(mhd_props.hyperbolicDivergenceCleaningSpeed())
30 {
31  // Evaluated fields
32  this->addEvaluatedField(_magnetic_correction_potential_flux);
33 
34  Utils::addEvaluatedVectorField(*this, ir.dl_vector, _induction_flux,
35  flux_prefix + "CONVECTIVE_FLUX_"
36  "induction_");
37 
38  // Dependent fields
39  this->addDependentField(_scalar_magnetic_potential);
40  this->addDependentField(_total_magnetic_field);
41 
42  this->setName("Solid Full Induction Convective Flux "
43  + std::to_string(num_space_dim) + "D");
44 }
45 
46 //---------------------------------------------------------------------------//
47 template<class EvalType, class Traits, int NumSpaceDim>
48 void SolidFullInductionConvectiveFlux<EvalType, Traits, NumSpaceDim>::evaluateFields(
49  typename Traits::EvalData workset)
50 {
51  auto policy = panzer::HP::inst().teamPolicy<scalar_type, PHX::Device>(
52  workset.num_cells);
53  Kokkos::parallel_for(this->getName(), policy, *this);
54 }
55 
56 //---------------------------------------------------------------------------//
57 template<class EvalType, class Traits, int NumSpaceDim>
58 KOKKOS_INLINE_FUNCTION void
59 SolidFullInductionConvectiveFlux<EvalType, Traits, NumSpaceDim>::operator()(
60  const Kokkos::TeamPolicy<PHX::exec_space>::member_type& team) const
61 {
62  const int cell = team.league_rank();
63  const int num_point = _induction_flux[0].extent(1);
64 
65  Kokkos::parallel_for(
66  Kokkos::TeamThreadRange(team, 0, num_point), [&](const int point) {
67  for (int flux_dim = 0; flux_dim < num_space_dim; ++flux_dim)
68  {
69  _induction_flux[flux_dim](cell, point, flux_dim)
70  = _c_h * _scalar_magnetic_potential(cell, point);
71  _magnetic_correction_potential_flux(cell, point, flux_dim)
72  = _c_h * _total_magnetic_field(cell, point, flux_dim);
73  }
74  });
75 }
76 
77 //---------------------------------------------------------------------------//
78 
79 } // end namespace ClosureModel
80 } // end namespace VertexCFD
81 
82 #endif // end VERTEXCFD_CLOSURE_SOLIDFULLINDUCTIONCONVECTIVEFLUX_IMPL_HPP
VertexCFD
Definition: tstMethodManufacturedSolutionBC.cpp:23