75 const std::string& resName,
76 const std::string& valName,
80 const std::vector<std::string>& fmNames
85 basisName_(basis.name()),
86 use_shared_memory(false)
95 using std::invalid_argument;
96 using std::logic_error;
101 TEUCHOS_TEST_FOR_EXCEPTION(resName ==
"", invalid_argument,
"Error: " \
102 "Integrator_DivBasisTimesScalar called with an empty residual name.")
103 TEUCHOS_TEST_FOR_EXCEPTION(valName ==
"", invalid_argument,
"Error: " \
104 "Integrator_DivBasisTimesScalar called with an empty value name.")
105 RCP<const PureBasis> tmpBasis = basis.
getBasis();
106 TEUCHOS_TEST_FOR_EXCEPTION(not tmpBasis->supportsDiv(), logic_error,
107 "Error: Integrator_DivBasisTimesScalar: Basis of type \""
108 << tmpBasis->name() <<
"\" does not support DIV.")
109 TEUCHOS_TEST_FOR_EXCEPTION(not tmpBasis->requiresOrientations(), logic_error,
110 "Error: Integration_DivBasisTimesScalar: Basis of type \""
111 << tmpBasis->name() <<
"\" should require orientations.")
115 this->addDependentField(
scalar_);
121 this->addContributedField(
field_);
123 this->addEvaluatedField(
field_);
129 View<PHX::UnmanagedView<const ScalarT**>*>(
"DivBasisTimesScalar::KokkosFieldMultipliers",
131 for (
const auto& name : fmNames)
138 string n(
"Integrator_DivBasisTimesScalar (");
143 n +=
"): " +
field_.fieldTag().name();
189 using Kokkos::createDynRankView;
192 auto kokkosFieldMults_h = Kokkos::create_mirror_view(kokkosFieldMults_);
195 for (
size_t i(0); i < fieldMults_.size(); ++i)
196 kokkosFieldMults_h(i) = fieldMults_[i].get_static_view();
198 Kokkos::deep_copy(kokkosFieldMults_, kokkosFieldMults_h);
202 if (!use_shared_memory) {
203 if (Sacado::IsADType<ScalarT>::value) {
204 const auto fadSize = Kokkos::dimension_scalar(field_.get_view());
205 tmp_ = PHX::View<ScalarT*>(
"panzer::Integrator::DivBasisTimesScalar::tmp_",field_.extent(0),fadSize);
207 tmp_ = PHX::View<ScalarT*>(
"panzer::Integrator::DivBasisTimesScalar::tmp_",field_.extent(0));
227 const Kokkos::TeamPolicy<PHX::exec_space>::member_type& team)
const
230 const int cell = team.league_rank();
233 const int numQP(scalar_.extent(1)), numBases(basis_.extent(1));
235 Kokkos::parallel_for(Kokkos::TeamThreadRange(team,0,numBases), [&] (
const int basis) {
236 field_(cell, basis) = 0.0;
242 if (NUM_FIELD_MULT == 0)
247 for (
int qp(0); qp < numQP; ++qp)
249 Kokkos::parallel_for(Kokkos::TeamThreadRange(team,0,numBases), [&] (
const int basis) {
250 field_(cell, basis) += basis_(cell, basis, qp) * multiplier_ * scalar_(cell, qp);
254 else if (NUM_FIELD_MULT == 1)
259 for (
int qp(0); qp < numQP; ++qp)
261 Kokkos::parallel_for(Kokkos::TeamThreadRange(team,0,numBases), [&] (
const int basis) {
262 field_(cell, basis) += basis_(cell, basis, qp) * multiplier_ * scalar_(cell, qp) * kokkosFieldMults_(0)(cell, qp);
272 const int numFieldMults(kokkosFieldMults_.extent(0));
273 for (
int qp(0); qp < numQP; ++qp)
277 for (
int fm(0); fm < numFieldMults; ++fm)
278 tmp_(cell) *= kokkosFieldMults_(fm)(cell, qp);
279 Kokkos::parallel_for(Kokkos::TeamThreadRange(team,0,numBases),KOKKOS_LAMBDA (
const int& basis) {
280 field_(cell, basis) += basis_(cell, basis, qp) * multiplier_ * scalar_(cell, qp) * tmp_(cell);
298 const Kokkos::TeamPolicy<PHX::exec_space>::member_type& team)
const
301 const int cell = team.league_rank();
302 const int numQP = scalar_.extent(1);
303 const int numBases = basis_.extent(1);
304 const int fadSize = Kokkos::dimension_scalar(field_.get_view());
308 if (Sacado::IsADType<ScalarT>::value) {
310 tmp_field =
scratch_view(team.team_shmem(),numBases,fadSize);
318 Kokkos::parallel_for(Kokkos::TeamThreadRange(team,0,numBases),KOKKOS_LAMBDA (
const int& basis) {
319 tmp_field(basis) = 0.0;
324 if (NUM_FIELD_MULT == 0)
329 for (
int qp(0); qp < numQP; ++qp)
332 tmp(0) = multiplier_ * scalar_(cell, qp);
333 Kokkos::parallel_for(Kokkos::TeamThreadRange(team,0,numBases),KOKKOS_LAMBDA (
const int& basis) {
334 tmp_field(basis) += basis_(cell, basis, qp) * tmp(0);
338 else if (NUM_FIELD_MULT == 1)
343 for (
int qp(0); qp < numQP; ++qp)
346 tmp(0) = multiplier_ * scalar_(cell, qp) * kokkosFieldMults_(0)(cell, qp);
347 Kokkos::parallel_for(Kokkos::TeamThreadRange(team,0,numBases),KOKKOS_LAMBDA (
const int& basis) {
348 tmp_field(basis) += basis_(cell, basis, qp) * tmp(0);
358 const int numFieldMults = kokkosFieldMults_.extent(0);
359 for (
int qp(0); qp < numQP; ++qp)
363 for (
int fm(0); fm < numFieldMults; ++fm)
364 fieldMultsTotal *= kokkosFieldMults_(fm)(cell, qp);
365 tmp(0) = multiplier_ * scalar_(cell, qp) * fieldMultsTotal;
366 Kokkos::parallel_for(Kokkos::TeamThreadRange(team,0,numBases),KOKKOS_LAMBDA (
const int& basis) {
367 tmp_field(basis) += basis_(cell, basis, qp) * tmp(0);
374 Kokkos::parallel_for(Kokkos::TeamThreadRange(team,0,numBases),[&] (
const int& basis) {
375 field_(cell,basis) = tmp_field(basis);
379 Kokkos::parallel_for(Kokkos::TeamThreadRange(team,0,numBases),[&] (
const int& basis) {
380 field_(cell,basis) += tmp_field(basis);
397 using Kokkos::parallel_for;
398 using Kokkos::TeamPolicy;
401 basis_ = this->wda(workset).bases[basisIndex_]->weighted_div_basis;
405 if (use_shared_memory) {
407 if (Sacado::IsADType<ScalarT>::value) {
408 const int fadSize = Kokkos::dimension_scalar(field_.get_view());
409 bytes = scratch_view::shmem_size(1,fadSize) + scratch_view::shmem_size(basis_.extent(1),fadSize);
412 bytes = scratch_view::shmem_size(1) + scratch_view::shmem_size(basis_.extent(1));
417 if (fieldMults_.size() == 0) {
419 parallel_for(this->getName(), policy, *
this);
420 }
else if (fieldMults_.size() == 1) {
422 parallel_for(this->getName(), policy, *
this);
425 parallel_for(this->getName(), policy, *
this);
432 if (fieldMults_.size() == 0) {
434 parallel_for(this->getName(), policy, *
this);
435 }
else if (fieldMults_.size() == 1) {
437 parallel_for(this->getName(), policy, *
this);
440 parallel_for(this->getName(), policy, *
this);
Integrator_DivBasisTimesScalar(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.
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.