Panzer Version of the Day
Loading...
Searching...
No Matches
Panzer_DotProduct_impl.hpp
Go to the documentation of this file.
1// @HEADER
2// ***********************************************************************
3//
4// Panzer: A partial differential equation assembly
5// engine for strongly coupled complex multiphysics systems
6// Copyright (2011) Sandia Corporation
7//
8// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
9// the U.S. Government retains certain rights in this software.
10//
11// Redistribution and use in source and binary forms, with or without
12// modification, are permitted provided that the following conditions are
13// met:
14//
15// 1. Redistributions of source code must retain the above copyright
16// notice, this list of conditions and the following disclaimer.
17//
18// 2. Redistributions in binary form must reproduce the above copyright
19// notice, this list of conditions and the following disclaimer in the
20// documentation and/or other materials provided with the distribution.
21//
22// 3. Neither the name of the Corporation nor the names of the
23// contributors may be used to endorse or promote products derived from
24// this software without specific prior written permission.
25//
26// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
27// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
30// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
31// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
32// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
33// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
34// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
35// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
36// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37//
38// Questions? Contact Roger P. Pawlowski (rppawlo@sandia.gov) and
39// Eric C. Cyr (eccyr@sandia.gov)
40// ***********************************************************************
41// @HEADER
42
43#ifndef PANZER_EVALUATOR_DotProduct_IMPL_HPP
44#define PANZER_EVALUATOR_DotProduct_IMPL_HPP
45
46#include <string>
47
48#include "Panzer_PointRule.hpp"
50
51#include "Teuchos_RCP.hpp"
52
53namespace panzer {
54
55template <typename EvalT,typename TraitsT>
56Teuchos::RCP<DotProduct<EvalT,TraitsT> >
57buildEvaluator_DotProduct(const std::string & resultName,
58 const panzer::PointRule & pr,
59 const std::string & vecA,
60 const std::string & vecB,
61 double multiplier,
62 const std::string & fieldMultiplier)
63{
64 Teuchos::ParameterList pl;
65 pl.set("Result Name",resultName);
66 pl.set("Point Rule",Teuchos::rcpFromRef(pr));
67 pl.set("Vector A Name",vecA);
68 pl.set("Vector B Name",vecB);
69 pl.set("Multiplier",multiplier);
70 pl.set("Field Multiplier",fieldMultiplier);
71
72 return Teuchos::rcp(new DotProduct<EvalT,TraitsT>(pl));
73}
74
75//**********************************************************************
76template<typename EvalT, typename Traits>
79 const Teuchos::ParameterList& p)
80 : multiplier_field_on(false)
81{
82 std::string result_name = p.get<std::string>("Result Name");
83 std::string vec_a_name = p.get<std::string>("Vector A Name");
84 std::string vec_b_name = p.get<std::string>("Vector B Name");
85
86 std::string multiplier_name = "";
87 if(p.isType<std::string>("Field Multiplier"))
88 multiplier_name = p.get<std::string>("Field Multiplier");
89
90 multiplier_value = 1.0;
91 if(p.isType<double>("Multiplier"))
92 multiplier_value = p.get<double>("Multiplier");
93
94 const Teuchos::RCP<const panzer::PointRule> pr =
95 p.get< Teuchos::RCP<const panzer::PointRule> >("Point Rule");
96
97 vec_a_dot_vec_b = PHX::MDField<ScalarT>(result_name, pr->dl_scalar);
98 vec_a = PHX::MDField<const ScalarT>(vec_a_name, pr->dl_vector);
99 vec_b = PHX::MDField<const ScalarT>(vec_b_name, pr->dl_vector);
100
101 if(multiplier_name!="") {
102 multiplier_field = PHX::MDField<const ScalarT>(multiplier_name,pr->dl_scalar);
103 multiplier_field_on = true;
104 this->addDependentField(multiplier_field);
105 }
106
107 this->addEvaluatedField(vec_a_dot_vec_b);
108 this->addDependentField(vec_a);
109 this->addDependentField(vec_b);
110
111 std::string n = "DotProduct: " + result_name + " = " + vec_a_name + " . " + vec_b_name;
112 this->setName(n);
113}
114
115//**********************************************************************
116template<typename EvalT, typename Traits>
117void
120 typename Traits::SetupData /* sd */,
122{
123 num_pts = vec_a.extent(1);
124 num_dim = vec_a.extent(2);
125
126 TEUCHOS_ASSERT(vec_a.extent(1) == vec_b.extent(1));
127 TEUCHOS_ASSERT(vec_a.extent(2) == vec_b.extent(2));
128}
129
130//**********************************************************************
131template<typename EvalT, typename Traits>
132void
135 typename Traits::EvalData workset)
136{
137
138 auto vec_a_v = vec_a.get_static_view();
139 auto vec_b_v = vec_b.get_static_view();
140 auto vec_a_dot_vec_b_v = vec_a_dot_vec_b.get_static_view();
141 auto multiplier_field_v = multiplier_field.get_static_view();
142
143 int l_num_pts = num_pts, l_num_dim = num_dim;
144 auto l_multiplier_field_on = multiplier_field_on;
145 auto l_multiplier_value = multiplier_value;
146
147 Kokkos::parallel_for (workset.num_cells, KOKKOS_LAMBDA (const int cell) {
148 for (int p = 0; p < l_num_pts; ++p) {
149 vec_a_dot_vec_b_v(cell,p) = ScalarT(0.0);
150 for (int dim = 0; dim < l_num_dim; ++dim)
151 vec_a_dot_vec_b_v(cell,p) += vec_a_v(cell,p,dim) * vec_b_v(cell,p,dim);
152
153 if(l_multiplier_field_on)
154 vec_a_dot_vec_b_v(cell,p) *= l_multiplier_value*multiplier_field_v(cell,p);
155 else
156 vec_a_dot_vec_b_v(cell,p) *= l_multiplier_value;
157 }
158 });
159 Kokkos::fence();
160}
161
162//**********************************************************************
163
164}
165
166#endif
double multiplier
The scalar multiplier out in front of the integral ( ).
Evaluates dot product at a set of points.
PHX::MDField< ScalarT > vec_a_dot_vec_b
PHX::MDField< const ScalarT > vec_a
PHX::MDField< const ScalarT > multiplier_field
PHX::MDField< const ScalarT > vec_b
void postRegistrationSetup(typename Traits::SetupData d, PHX::FieldManager< Traits > &fm)
void evaluateFields(typename Traits::EvalData d)
typename EvalT::ScalarT ScalarT
DotProduct(const Teuchos::ParameterList &p)
int num_cells
DEPRECATED - use: numCells()
Teuchos::RCP< DotProduct< EvalT, TraitsT > > buildEvaluator_DotProduct(const std::string &resultName, const panzer::PointRule &pr, const std::string &vecA, const std::string &vecB, double multiplier=1, const std::string &fieldMultiplier="")
Build a dot product evaluator. Evaluates dot product at a set of points.