Panzer Version of the Day
Loading...
Searching...
No Matches
Panzer_SubcellSum_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_SubcellSum_impl_hpp__
44#define __Panzer_SubcellSum_impl_hpp__
45
46#include "Panzer_PureBasis.hpp"
49
50#include "Phalanx_DataLayout_MDALayout.hpp"
51
52namespace panzer {
53
54//**********************************************************************
55template<typename EvalT, typename Traits>
58 const Teuchos::ParameterList& p)
59 : evaluateOnClosure_(false)
60{
61 Teuchos::RCP<Teuchos::ParameterList> valid_params = this->getValidParameters();
62 p.validateParameters(*valid_params);
63
64 const std::string inName = p.get<std::string>("Field Name");
65 const std::string outName = p.get<std::string>("Sum Name");
66 Teuchos::RCP<const PureBasis> basis = p.get< Teuchos::RCP<const PureBasis> >("Basis");
67 multiplier = p.get<double>("Multiplier");
68 if(p.isType<bool>("Evaluate On Closure"))
69 evaluateOnClosure_ = p.get<bool>("Evaluate On Closure");
70
71 inField = PHX::MDField<const ScalarT,Cell,BASIS>( inName, basis->functional);
72 outField = PHX::MDField<ScalarT,Cell>( outName, basis->cell_data);
73
74 this->addDependentField(inField);
75 this->addEvaluatedField(outField);
76
77 // build a field pattern object so that looking up closure indices is easy
78 fieldPattern_ = Teuchos::rcp(new Intrepid2FieldPattern(basis->getIntrepid2Basis<PHX::exec_space,double,double>()));
79
80 std::string n = "SubcellSum: " + outField.fieldTag().name();
81 this->setName(n);
82}
83
84//**********************************************************************
85template<typename EvalT, typename Traits>
86void
89 typename Traits::EvalData workset)
90{
91 std::vector<int> indices;
92
93 // figure out which indices to sum (this can be made more efficient by
94 // simply saving the indices and only updating if the subcell dimension
95 // and index changes)
96 if(evaluateOnClosure_)
97 fieldPattern_->getSubcellClosureIndices(workset.subcell_dim,this->wda(workset).subcell_index,indices);
98 else
99 indices = fieldPattern_->getSubcellIndices(workset.subcell_dim,this->wda(workset).subcell_index);
100
101 auto outField_h = Kokkos::create_mirror_view(outField.get_static_view());
102 auto inField_h = Kokkos::create_mirror_view(inField.get_static_view());
103 Kokkos::deep_copy(inField_h, inField.get_static_view());
104 for(index_t c=0;c<workset.num_cells;c++) {
105 outField_h(c) = 0.0; // initialize field
106
107 // sum over all relevant indices for this subcell
108 for(std::size_t i=0;i<indices.size();i++)
109 outField_h(c) += inField_h(c,indices[i]);
110
111 // scale by what ever the user wants
112 outField_h(c) *= multiplier;
113 }
114 Kokkos::deep_copy(outField.get_static_view(), outField_h);
115}
116
117//**********************************************************************
118template<typename EvalT, typename TRAITS>
119Teuchos::RCP<Teuchos::ParameterList>
121{
122 Teuchos::RCP<Teuchos::ParameterList> p = Teuchos::rcp(new Teuchos::ParameterList);
123 p->set<std::string>("Sum Name", "?");
124 p->set<std::string>("Field Name", "?");
125 p->set<double>("Multiplier",1.0);
126 p->set<bool>("Evaluate On Closure",false);
127
128 Teuchos::RCP<const panzer::PureBasis> basis;
129 p->set("Basis", basis);
130
131 return p;
132}
133
134//**********************************************************************
135
136}
137
138#endif
double multiplier
The scalar multiplier out in front of the integral ( ).
SubcellSum(const Teuchos::ParameterList &p)
PHX::MDField< ScalarT, Cell > outField
Teuchos::RCP< Teuchos::ParameterList > getValidParameters() const
Teuchos::RCP< const panzer::FieldPattern > fieldPattern_
void evaluateFields(typename Traits::EvalData d)
PHX::MDField< const ScalarT, Cell, BASIS > inField
int subcell_dim
DEPRECATED - use: getSubcellDimension()
int num_cells
DEPRECATED - use: numCells()