VertexCFD  0.0-dev
VertexCFD_Closure_SolidElectricPotentialErrorNorms_impl.hpp
1 #ifndef VERTEXCFD_CLOSURE_SOLIDELECTRICPOTENTIALERRORNORMS_IMPL_HPP
2 #define VERTEXCFD_CLOSURE_SOLIDELECTRICPOTENTIALERRORNORMS_IMPL_HPP
3 
4 #include "utils/VertexCFD_Utils_VectorField.hpp"
5 
6 #include "Panzer_GlobalIndexer.hpp"
7 #include "Panzer_PureBasis.hpp"
8 #include "Panzer_Workset_Utilities.hpp"
9 #include <Panzer_HierarchicParallelism.hpp>
10 
11 #include <Teuchos_Array.hpp>
12 
13 #include <cmath>
14 #include <string>
15 
16 namespace VertexCFD
17 {
18 namespace ClosureModel
19 {
20 //---------------------------------------------------------------------------//
21 template<class EvalType, class Traits, int NumSpaceDim>
22 SolidElectricPotentialErrorNorms<EvalType, Traits, NumSpaceDim>::
23  SolidElectricPotentialErrorNorms(const panzer::IntegrationRule& ir)
24  : _L1_error_continuity("L1_Error_continuity", ir.dl_scalar)
25  , _L1_error_electric_potential_equation(
26  "L1_Error_electric_potential_equation", ir.dl_scalar)
27  , _L2_error_continuity("L2_Error_continuity", ir.dl_scalar)
28  , _L2_error_electric_potential_equation(
29  "L2_Error_electric_potential_equation", ir.dl_scalar)
30  , _volume("volume", ir.dl_scalar)
31  , _exact_electric_potential("Exact_electric_potential", ir.dl_scalar)
32  , _electric_potential("electric_potential", ir.dl_scalar)
33 {
34  // exact solution
35  this->addDependentField(_exact_electric_potential);
36 
37  // numerical solution
38  this->addDependentField(_electric_potential);
39 
40  // error between exact and numerical solution
41  this->addEvaluatedField(_L1_error_continuity);
42  Utils::addEvaluatedVectorField(
43  *this, ir.dl_scalar, _L1_error_momentum, "L1_Error_momentum_");
44  this->addEvaluatedField(_L2_error_continuity);
45  Utils::addEvaluatedVectorField(
46  *this, ir.dl_scalar, _L2_error_momentum, "L2_Error_momentum_");
47 
48  this->addEvaluatedField(_L1_error_electric_potential_equation);
49  this->addEvaluatedField(_L2_error_electric_potential_equation);
50  this->addEvaluatedField(_volume);
51 
52  this->setName("SolidElectricPotential Error Norms "
53  + std::to_string(num_space_dim) + "D");
54 }
55 
56 //---------------------------------------------------------------------------//
57 template<class EvalType, class Traits, int NumSpaceDim>
58 void SolidElectricPotentialErrorNorms<EvalType, Traits, NumSpaceDim>::evaluateFields(
59  typename Traits::EvalData workset)
60 {
61  auto policy = panzer::HP::inst().teamPolicy<scalar_type, PHX::Device>(
62  workset.num_cells);
63  Kokkos::parallel_for(this->getName(), policy, *this);
64 }
65 
66 //---------------------------------------------------------------------------//
67 template<class EvalType, class Traits, int NumSpaceDim>
68 KOKKOS_INLINE_FUNCTION void
69 SolidElectricPotentialErrorNorms<EvalType, Traits, NumSpaceDim>::operator()(
70  const Kokkos::TeamPolicy<PHX::exec_space>::member_type& team) const
71 {
72  const int cell = team.league_rank();
73  const int num_point = _electric_potential.extent(1);
74 
75  Kokkos::parallel_for(
76  Kokkos::TeamThreadRange(team, 0, num_point), [&](const int point) {
77  using std::abs;
78  using std::pow;
79 
80  // L1/L2 error norms for electric_potential. All other variables
81  // are set to zero on the solid region.
82  _L1_error_electric_potential_equation(cell, point)
83  = abs(_electric_potential(cell, point)
84  - _exact_electric_potential(cell, point));
85 
86  _L2_error_electric_potential_equation(cell, point)
87  = pow(_electric_potential(cell, point)
88  - _exact_electric_potential(cell, point),
89  2);
90 
91  _L1_error_continuity(cell, point) = 0.0;
92 
93  _L2_error_continuity(cell, point) = 0.0;
94 
95  for (int i = 0; i < num_space_dim; ++i)
96  {
97  _L1_error_momentum[i](cell, point) = 0.0;
98  _L2_error_momentum[i](cell, point) = 0.0;
99  }
100 
101  _volume(cell, point) = 1.0;
102  });
103 }
104 
105 //---------------------------------------------------------------------------//
106 
107 } // end namespace ClosureModel
108 } // end namespace VertexCFD
109 
110 #endif // VERTEXCFD_CLOSURE_SOLIDELECTRICPOTENTIALERRORNORMS_IMPL_HPP
VertexCFD
Definition: tstMethodManufacturedSolutionBC.cpp:23