43 #ifndef PANZER_INTEGRATOR_BASISTIMESSCALAR_IMPL_HPP 44 #define PANZER_INTEGRATOR_BASISTIMESSCALAR_IMPL_HPP 64 template<
typename EvalT,
typename Traits>
68 const std::string& resName,
69 const std::string& valName,
73 const std::vector<std::string>& fmNames
78 basisName_(basis.name())
87 using std::invalid_argument;
88 using std::logic_error;
93 TEUCHOS_TEST_FOR_EXCEPTION(resName ==
"", invalid_argument,
"Error: " \
94 "Integrator_BasisTimesScalar called with an empty residual name.")
95 TEUCHOS_TEST_FOR_EXCEPTION(valName ==
"", invalid_argument,
"Error: " \
96 "Integrator_BasisTimesScalar called with an empty value name.")
97 RCP<const PureBasis> tmpBasis = basis.
getBasis();
98 TEUCHOS_TEST_FOR_EXCEPTION(not tmpBasis->isScalarBasis(), logic_error,
99 "Error: Integrator_BasisTimesScalar: Basis of type \"" 100 << tmpBasis->name() <<
"\" is not a scalar basis.")
104 this->addDependentField(
scalar_);
110 this->addContributedField(
field_);
112 this->addEvaluatedField(
field_);
118 View<View<const ScalarT**,typename PHX::DevLayout<ScalarT>::type,PHX::Device>*>(
"BasisTimesScalar::KokkosFieldMultipliers",
120 for (
const auto& name : fmNames)
127 string n(
"Integrator_BasisTimesScalar (");
132 n +=
"): " +
field_.fieldTag().name();
141 template<
typename EvalT,
typename Traits>
144 const Teuchos::ParameterList& p)
148 p.get<
std::string>(
"Residual Name"),
149 p.get<
std::string>(
"Value Name"),
152 p.get<double>(
"Multiplier"),
154 (
"Field Multipliers") ?
156 (
"Field Multipliers")) :
std::vector<
std::string>())
158 using Teuchos::ParameterList;
163 p.validateParameters(*validParams);
171 template<
typename EvalT,
typename Traits>
182 for (
size_t i(0); i < fieldMults_.size(); ++i)
183 kokkosFieldMults_(i) = fieldMults_[i].get_static_view();
194 template<
typename EvalT,
typename Traits>
195 template<
int NUM_FIELD_MULT>
196 KOKKOS_INLINE_FUNCTION
201 const size_t& cell)
const 206 const int numQP(scalar_.extent(1)), numBases(basis_.extent(1));
208 for (
int basis(0); basis < numBases; ++basis)
209 field_(cell, basis) = 0.0;
214 if (NUM_FIELD_MULT == 0)
219 for (
int qp(0); qp < numQP; ++qp)
221 tmp = multiplier_ * scalar_(cell, qp);
222 for (
int basis(0); basis < numBases; ++basis)
223 field_(cell, basis) += basis_(cell, basis, qp) * tmp;
226 else if (NUM_FIELD_MULT == 1)
231 for (
int qp(0); qp < numQP; ++qp)
233 tmp = multiplier_ * scalar_(cell, qp) * kokkosFieldMults_(0)(cell, qp);
234 for (
int basis(0); basis < numBases; ++basis)
235 field_(cell, basis) += basis_(cell, basis, qp) * tmp;
244 const int numFieldMults(kokkosFieldMults_.extent(0));
245 for (
int qp(0); qp < numQP; ++qp)
248 for (
int fm(0); fm < numFieldMults; ++fm)
249 fieldMultsTotal *= kokkosFieldMults_(fm)(cell, qp);
250 tmp = multiplier_ * scalar_(cell, qp) * fieldMultsTotal;
251 for (
int basis(0); basis < numBases; ++basis)
252 field_(cell, basis) += basis_(cell, basis, qp) * tmp;
262 template<
typename EvalT,
typename Traits>
268 using Kokkos::parallel_for;
269 using Kokkos::RangePolicy;
272 basis_ = this->wda(workset).bases[basisIndex_]->weighted_basis_scalar;
277 if (fieldMults_.size() == 0)
279 else if (fieldMults_.size() == 1)
290 template<
typename EvalT,
typename TRAITS>
291 Teuchos::RCP<Teuchos::ParameterList>
299 using Teuchos::ParameterList;
304 RCP<ParameterList> p = rcp(
new ParameterList);
305 p->set<
string>(
"Residual Name",
"?");
306 p->set<
string>(
"Value Name",
"?");
307 RCP<BasisIRLayout> basis;
308 p->set(
"Basis", basis);
309 RCP<IntegrationRule> ir;
311 p->set<
double>(
"Multiplier", 1.0);
312 RCP<const vector<string>> fms;
313 p->set(
"Field Multipliers", fms);
319 #endif // PANZER_INTEGRATOR_BASISTIMESSCALAR_IMPL_HPP const panzer::EvaluatorStyle evalStyle_
An enum determining the behavior of this Evaluator.
PHX::MDField< ScalarT, panzer::Cell, panzer::BASIS > field_
A field to which we'll contribute, or in which we'll store, the result of computing this integral...
This empty struct allows us to optimize operator()() depending on the number of field multipliers...
Teuchos::RCP< const PureBasis > getBasis() const
Integrator_BasisTimesScalar(const panzer::EvaluatorStyle &evalStyle, const std::string &resName, const std::string &valName, const panzer::BasisIRLayout &basis, const panzer::IntegrationRule &ir, const double &multiplier=1, const std::vector< std::string > &fmNames=std::vector< std::string >())
Main Constructor.
EvaluatorStyle
An indication of how an Evaluator will behave.
double multiplier
The scalar multiplier out in front of the integral ( ).
Teuchos::RCP< PHX::DataLayout > dl_scalar
Data layout for scalar fields.
Teuchos::RCP< Teuchos::ParameterList > getValidParameters() const
Get Valid Parameters.
Kokkos::View< Kokkos::View< const ScalarT **, typename PHX::DevLayout< ScalarT >::type, PHX::Device > * > kokkosFieldMults_
The Kokkos::View representation of the (possibly empty) list of fields that are multipliers out in fr...
panzer::EvaluatorStyle evalStyle
The EvaluatorStyle of the parent Integrator_CurlBasisDotVector object.
std::vector< std::string >::size_type getBasisIndex(std::string basis_name, const panzer::Workset &workset, WorksetDetailsAccessor &wda)
Returns the index in the workset bases for a particular BasisIRLayout name.
PHX::MDField< const ScalarT, panzer::Cell, panzer::IP > scalar_
A field representing the scalar function we're integrating ( ).
typename EvalT::ScalarT ScalarT
The scalar type.
void evaluateFields(typename Traits::EvalData workset)
Evaluate Fields.
KOKKOS_INLINE_FUNCTION void operator()(const FieldMultTag< NUM_FIELD_MULT > &tag, const std::size_t &cell) const
Perform the integration.
void postRegistrationSetup(typename Traits::SetupData sd, PHX::FieldManager< Traits > &fm)
Post-Registration Setup.
Description and data layouts associated with a particular basis.
Teuchos::RCP< PHX::DataLayout > functional
<Cell,Basis>
std::vector< PHX::MDField< const ScalarT, panzer::Cell, panzer::IP > > fieldMults_
The (possibly empty) list of fields that are multipliers out in front of the integral ( ...
Teuchos::RCP< const std::vector< panzer::Workset > > worksets_