VertexCFD  0.0-dev
VertexCFD_Closure_InductionConvectiveMomentumFlux_impl.hpp
1 #ifndef VERTEXCFD_CLOSURE_INDUCTIONCONVECTIVEMOMENTUMFLUX_IMPL_HPP
2 #define VERTEXCFD_CLOSURE_INDUCTIONCONVECTIVEMOMENTUMFLUX_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 InductionConvectiveMomentumFlux<EvalType, Traits, NumSpaceDim>::
16  InductionConvectiveMomentumFlux(
17  const panzer::IntegrationRule& ir,
18  const MHDProperties::FullInductionMHDProperties& mhd_props,
19  const std::string& flux_prefix)
20  : _total_magnetic_field(
21  "total_magnetic_field",
22  Utils::buildMagneticLayout(ir.dl_scalar, num_magnetic_field_dim))
23  , _magnetic_pressure("magnetic_pressure", ir.dl_scalar)
24  , _magnetic_permeability(mhd_props.vacuumMagneticPermeability())
25 {
26  // Contributed fields
27  Utils::addContributedVectorField(*this, ir.dl_vector, _momentum_flux,
28  flux_prefix + "CONVECTIVE_FLUX_"
29  "momentum_");
30 
31  // Dependent fields
32  this->addDependentField(_total_magnetic_field);
33  this->addDependentField(_magnetic_pressure);
34 
35  this->setName("Induction Convective Momentum Flux "
36  + std::to_string(num_space_dim) + "D");
37 }
38 
39 //---------------------------------------------------------------------------//
40 template<class EvalType, class Traits, int NumSpaceDim>
41 void InductionConvectiveMomentumFlux<EvalType, Traits, NumSpaceDim>::evaluateFields(
42  typename Traits::EvalData workset)
43 {
44  auto policy = panzer::HP::inst().teamPolicy<scalar_type, PHX::Device>(
45  workset.num_cells);
46  Kokkos::parallel_for(this->getName(), policy, *this);
47 }
48 
49 //---------------------------------------------------------------------------//
50 template<class EvalType, class Traits, int NumSpaceDim>
51 KOKKOS_INLINE_FUNCTION void
52 InductionConvectiveMomentumFlux<EvalType, Traits, NumSpaceDim>::operator()(
53  const Kokkos::TeamPolicy<PHX::exec_space>::member_type& team) const
54 {
55  const int cell = team.league_rank();
56  const int num_point = _momentum_flux[0].extent(1);
57 
58  Kokkos::parallel_for(
59  Kokkos::TeamThreadRange(team, 0, num_point), [&](const int point) {
60  for (int flux_dim = 0; flux_dim < num_space_dim; ++flux_dim)
61  {
62  for (int vec_dim = 0; vec_dim < num_space_dim; ++vec_dim)
63  {
64  _momentum_flux[vec_dim](cell, point, flux_dim)
65  -= _total_magnetic_field(cell, point, flux_dim)
66  * _total_magnetic_field(cell, point, vec_dim)
67  / _magnetic_permeability;
68  }
69  // Add the magnetic pressure contribution to momentum flux.
70  _momentum_flux[flux_dim](cell, point, flux_dim)
71  += _magnetic_pressure(cell, point);
72  }
73  });
74 }
75 
76 //---------------------------------------------------------------------------//
77 
78 } // end namespace ClosureModel
79 } // end namespace VertexCFD
80 
81 #endif // end VERTEXCFD_CLOSURE_INDUCTIONCONVECTIVEMOMENTUMFLUX_IMPL_HPP
VertexCFD
Definition: tstMethodManufacturedSolutionBC.cpp:23