Panzer Version of the Day
Loading...
Searching...
No Matches
Panzer_CrossProduct_impl.hpp
Go to the documentation of this file.
1// @HEADER
2// *****************************************************************************
3// Panzer: A partial differential equation assembly
4// engine for strongly coupled complex multiphysics systems
5//
6// Copyright 2011 NTESS and the Panzer contributors.
7// SPDX-License-Identifier: BSD-3-Clause
8// *****************************************************************************
9// @HEADER
10
11#ifndef PANZER_EVALUATOR_CrossProduct_IMPL_HPP
12#define PANZER_EVALUATOR_CrossProduct_IMPL_HPP
13
14#include <string>
15
16#include "Panzer_PointRule.hpp"
19
20#include "Teuchos_RCP.hpp"
21
22namespace panzer {
23
24//**********************************************************************
25template<typename EvalT, typename Traits>
28 const Teuchos::ParameterList& p)
29{
30 std::string result_name = p.get<std::string>("Result Name");
31 std::string vec_a_name = p.get<std::string>("Vector A Name");
32 std::string vec_b_name = p.get<std::string>("Vector B Name");
33
34 const Teuchos::RCP<const panzer::PointRule> pr =
35 p.get< Teuchos::RCP<const panzer::PointRule> >("Point Rule");
36
37 // use a scalar field only if dimension is 2D
38 useScalarField = (pr->spatial_dimension==2);
39
41 vec_a_cross_vec_b = PHX::MDField<ScalarT>(result_name, pr->dl_vector);
42 else
43 vec_a_cross_vec_b = PHX::MDField<ScalarT>(result_name, pr->dl_scalar);
44
45 vec_a = PHX::MDField<const ScalarT>(vec_a_name, pr->dl_vector);
46 vec_b = PHX::MDField<const ScalarT>(vec_b_name, pr->dl_vector);
47
48 this->addEvaluatedField(vec_a_cross_vec_b);
49 this->addDependentField(vec_a);
50 this->addDependentField(vec_b);
51
52 std::string n = "CrossProduct: " + result_name + " = " + vec_a_name + " . " + vec_b_name;
53 this->setName(n);
54}
55
56//**********************************************************************
57template<typename EvalT, typename Traits>
58void
61 typename Traits::SetupData /* sd */,
63{
64 num_pts = vec_a.extent(1);
65 num_dim = vec_a.extent(2);
66
67 TEUCHOS_ASSERT(vec_a.extent(1) == vec_b.extent(1));
68 TEUCHOS_ASSERT(vec_a.extent(2) == vec_b.extent(2));
69}
70
71//**********************************************************************
72template<typename EvalT, typename Traits>
73void
76 typename Traits::EvalData workset)
77{
78 auto a = vec_a.get_static_view();
79 auto b = vec_b.get_static_view();
80 auto a_cross_b = vec_a_cross_vec_b.get_static_view();
81 const int l_num_pts = num_pts;
82
83 auto policy = panzer::HP::inst().teamPolicy<ScalarT,PHX::ExecutionSpace>(workset.num_cells);
84
85 if(useScalarField) {
86 Kokkos::parallel_for("panzer::CrossProduct 2D",policy,KOKKOS_LAMBDA (const Kokkos::TeamPolicy<PHX::ExecutionSpace>::member_type& team) {
87 const int cell = team.league_rank();
88 Kokkos::parallel_for(Kokkos::TeamThreadRange(team,0,l_num_pts), [&] (const int p) {
89 a_cross_b(cell,p) = a(cell,p,0)*b(cell,p,1)-a(cell,p,1)*b(cell,p,0);
90 });
91 });
92 }
93 else {
94 Kokkos::parallel_for("panzer::CrossProduct 3D",policy,KOKKOS_LAMBDA (const Kokkos::TeamPolicy<PHX::ExecutionSpace>::member_type& team) {
95 const int cell = team.league_rank();
96 Kokkos::parallel_for(Kokkos::TeamThreadRange(team,0,l_num_pts), [&] (const int p) {
97 a_cross_b(cell,p,0) = a(cell,p,1)*b(cell,p,2)-a(cell,p,2)*b(cell,p,1);
98 a_cross_b(cell,p,1) = -(a(cell,p,0)*b(cell,p,2)-a(cell,p,2)*b(cell,p,0));
99 a_cross_b(cell,p,2) = a(cell,p,0)*b(cell,p,1)-a(cell,p,1)*b(cell,p,0);
100 });
101 });
102 }
103}
104
105//**********************************************************************
106
107}
108
109#endif
PHX::MDField< ScalarT > vec_a_cross_vec_b
CrossProduct(const Teuchos::ParameterList &p)
void postRegistrationSetup(typename Traits::SetupData d, PHX::FieldManager< Traits > &fm)
PHX::MDField< const ScalarT > vec_a
void evaluateFields(typename Traits::EvalData d)
typename EvalT::ScalarT ScalarT
PHX::MDField< const ScalarT > vec_b
static HP & inst()
Private ctor.
Kokkos::TeamPolicy< TeamPolicyProperties... > teamPolicy(const int &league_size)
Returns a TeamPolicy for hierarchic parallelism.
int num_cells
DEPRECATED - use: numCells().
const panzer::Workset & EvalData
Data type passed to PHX::Evaluator::evaluateFields(): a single workset holding the cell data for one ...
const SD & SetupData
Data type passed to PHX::Evaluator::postRegistrationSetup().