VertexCFD  0.0-dev
VertexCFD_Closure_IncompressibleTaylorGreenVortexExactSolution_impl.hpp
1 #ifndef VERTEXCFD_CLOSURE_INCOMPRESSIBLETAYLORGREENVORTEXEXACTSOLUTION_IMPL_HPP
2 #define VERTEXCFD_CLOSURE_INCOMPRESSIBLETAYLORGREENVORTEXEXACTSOLUTION_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 IncompressibleTaylorGreenVortexExactSolution<EvalType, Traits, NumSpaceDim>::
23  IncompressibleTaylorGreenVortexExactSolution(
24  const panzer::IntegrationRule& ir,
25  const Teuchos::ParameterList& closure_params)
26  : _lagrange_pressure("Exact_lagrange_pressure", ir.dl_scalar)
27  , _nu(closure_params.get<double>("Kinematic Viscosity"))
28  , _ir_degree(ir.cubature_degree)
29 {
30  this->addEvaluatedField(_lagrange_pressure);
31  Utils::addEvaluatedVectorField(
32  *this, ir.dl_scalar, _velocity, "Exact_velocity_");
33 
34  this->setName("Incompressible Taylor Green Vortex Exact Solution");
35 }
36 
37 //---------------------------------------------------------------------------//
38 template<class EvalType, class Traits, int NumSpaceDim>
39 void IncompressibleTaylorGreenVortexExactSolution<EvalType, Traits, NumSpaceDim>::
40  postRegistrationSetup(typename Traits::SetupData sd,
41  PHX::FieldManager<Traits>&)
42 {
43  _ir_index = panzer::getIntegrationRuleIndex(_ir_degree, (*sd.worksets_)[0]);
44 }
45 
46 //---------------------------------------------------------------------------//
47 template<class EvalType, class Traits, int NumSpaceDim>
48 void IncompressibleTaylorGreenVortexExactSolution<EvalType, Traits, NumSpaceDim>::
49  evaluateFields(typename Traits::EvalData workset)
50 {
51  auto policy = panzer::HP::inst().teamPolicy<scalar_type, PHX::Device>(
52  workset.num_cells);
53 
54  _Ft = exp(-2.0 * _nu * workset.time);
55 
56  _ip_coords = workset.int_rules[_ir_index]->ip_coordinates;
57  Kokkos::parallel_for(this->getName(), policy, *this);
58 }
59 
60 //---------------------------------------------------------------------------//
61 template<class EvalType, class Traits, int NumSpaceDim>
62 KOKKOS_INLINE_FUNCTION void
63 IncompressibleTaylorGreenVortexExactSolution<EvalType, Traits, NumSpaceDim>::
64 operator()(const Kokkos::TeamPolicy<PHX::exec_space>::member_type& team) const
65 {
66  const int cell = team.league_rank();
67  const int num_point = _lagrange_pressure.extent(1);
68 
69  using Kokkos::cos;
70  using Kokkos::exp;
71  using Kokkos::sin;
72 
73  Kokkos::parallel_for(
74  Kokkos::TeamThreadRange(team, 0, num_point), [&](const int point) {
75  const double x = _ip_coords(cell, point, 0);
76  const double y = _ip_coords(cell, point, 1);
77 
78  _lagrange_pressure(cell, point)
79  = -0.25 * (cos(2.0 * x) + cos(2.0 * y)) * _Ft * _Ft;
80  _velocity[0](cell, point) = cos(x) * sin(y) * _Ft;
81  _velocity[1](cell, point) = -sin(x) * cos(y) * _Ft;
82  });
83 }
84 
85 //---------------------------------------------------------------------------//
86 
87 } // end namespace ClosureModel
88 } // end namespace VertexCFD
89 
90 #endif // VERTEXCFD_CLOSURE_INCOMPRESSIBLETAYLORGREENVORTEXEXACTSOLUTION_IMPL_HPP
VertexCFD
Definition: tstMethodManufacturedSolutionBC.cpp:23