Panzer
Version of the Day
Toggle main menu visibility
Loading...
Searching...
No Matches
disc-fe
src
evaluators
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
"
47
#include "
Panzer_Workset_Utilities.hpp
"
48
#include "
Panzer_IntrepidFieldPattern.hpp
"
49
50
#include "Phalanx_DataLayout_MDALayout.hpp"
51
52
namespace
panzer
{
53
54
//**********************************************************************
55
template
<
typename
EvalT,
typename
Traits>
56
SubcellSum<EvalT, Traits>::
57
SubcellSum
(
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
//**********************************************************************
85
template
<
typename
EvalT,
typename
Traits>
86
void
87
SubcellSum<EvalT, Traits>::
88
evaluateFields
(
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
//**********************************************************************
118
template
<
typename
EvalT,
typename
TRAITS>
119
Teuchos::RCP<Teuchos::ParameterList>
120
SubcellSum<EvalT, TRAITS>::getValidParameters
()
const
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
Panzer_IntrepidFieldPattern.hpp
Panzer_PureBasis.hpp
Panzer_Workset_Utilities.hpp
panzer::Intrepid2FieldPattern
Definition
Panzer_IntrepidFieldPattern.hpp:62
panzer::SubcellSum::SubcellSum
SubcellSum(const Teuchos::ParameterList &p)
Definition
Panzer_SubcellSum_impl.hpp:57
panzer::SubcellSum::multiplier
double multiplier
Definition
Panzer_SubcellSum_decl.hpp:103
panzer::SubcellSum::evaluateOnClosure_
bool evaluateOnClosure_
Definition
Panzer_SubcellSum_decl.hpp:117
panzer::SubcellSum::outField
PHX::MDField< ScalarT, Cell > outField
Definition
Panzer_SubcellSum_decl.hpp:99
panzer::SubcellSum::getValidParameters
Teuchos::RCP< Teuchos::ParameterList > getValidParameters() const
Definition
Panzer_SubcellSum_impl.hpp:120
panzer::SubcellSum::fieldPattern_
Teuchos::RCP< const panzer::FieldPattern > fieldPattern_
Definition
Panzer_SubcellSum_decl.hpp:114
panzer::SubcellSum::evaluateFields
void evaluateFields(typename Traits::EvalData d)
Definition
Panzer_SubcellSum_impl.hpp:88
panzer::SubcellSum::inField
PHX::MDField< const ScalarT, Cell, BASIS > inField
Definition
Panzer_SubcellSum_decl.hpp:101
panzer::WorksetDetails::subcell_dim
int subcell_dim
DEPRECATED - use: getSubcellDimension().
Definition
Panzer_Workset.hpp:119
panzer::WorksetDetails::num_cells
int num_cells
DEPRECATED - use: numCells().
Definition
Panzer_Workset.hpp:116
panzer
Computes .
Definition
Panzer_BasisValues_Evaluator_decl.hpp:54
panzer::Traits::EvalData
const panzer::Workset & EvalData
Definition
Panzer_Traits.hpp:129
Generated by
1.17.0