37 const std::string& resName,
38 const std::string& fluxName,
42 const std::vector<std::string>& fmNames,
44 const Teuchos::RCP<PHX::DataLayout>& vecDL )
48 basisName_(basis.name())
55 using PHX::DataLayout;
57 using std::invalid_argument;
58 using std::logic_error;
63 TEUCHOS_TEST_FOR_EXCEPTION(resName ==
"", invalid_argument,
"Error: " \
64 "Integrator_GradBasisDotVector called with an empty residual name.")
65 TEUCHOS_TEST_FOR_EXCEPTION(fluxName ==
"", invalid_argument,
"Error: " \
66 "Integrator_GradBasisDotVector called with an empty flux name.")
67 RCP<const PureBasis> tmpBasis = basis.
getBasis();
68 TEUCHOS_TEST_FOR_EXCEPTION(not tmpBasis->supportsGrad(), logic_error,
69 "Error: Integrator_GradBasisDotVector: Basis of type \""
70 << tmpBasis->name() <<
"\" does not support the gradient operator.")
72 if (not vecDL.is_null())
75 TEUCHOS_TEST_FOR_EXCEPTION(
76 tmpVecDL->extent(2) < ir.
dl_vector->extent(2), logic_error,
77 "Integrator_GradBasisDotVector: Dimension of space exceeds " \
78 "dimension of Vector Data Layout.");
82 vector_ = MDField<const ScalarT, Cell, IP, Dim>(fluxName, tmpVecDL);
83 this->addDependentField(
vector_);
89 this->addContributedField(
field_);
91 this->addEvaluatedField(
field_);
96 kokkosFieldMults_ = PHX::View<PHX::UnmanagedView<const ScalarT**>*>(
"GradBasisDotVector::KokkosFieldMultipliers",
98 for (
const auto& name : fmNames)
105 string n(
"Integrator_GradBasisDotVector (");
110 n +=
"): " +
field_.fieldTag().name();
162 auto field_mults_host_mirror = Kokkos::create_mirror_view(kokkosFieldMults_);
163 for (
size_t i(0); i < fieldMults_.size(); ++i)
164 field_mults_host_mirror(i) = fieldMults_[i].get_static_view();
165 Kokkos::deep_copy(kokkosFieldMults_,field_mults_host_mirror);
172 if (!use_shared_memory) {
173 if (Sacado::IsADType<ScalarT>::value) {
174 const auto fadSize = Kokkos::dimension_scalar(field_.get_view());
175 tmp_ = PHX::View<ScalarT*>(
"GradBasisDotVector::tmp_",field_.extent(0),fadSize);
177 tmp_ = PHX::View<ScalarT*>(
"GradBasisDotVector::tmp_",field_.extent(0));
194 const Kokkos::TeamPolicy<PHX::exec_space>::member_type& team)
const
197 const int cell = team.league_rank();
200 const int numQP(vector_.extent(1)), numDim(vector_.extent(2)),
201 numBases(basis_.extent(1));
203 Kokkos::parallel_for(Kokkos::TeamThreadRange(team,0,numBases), [&] (
const int basis) {
204 field_(cell, basis) = 0.0;
207 for (
int qp(0); qp < numQP; ++qp) {
208 for (
int dim(0); dim < numDim; ++dim) {
209 if constexpr (NUM_FIELD_MULT == 0) {
210 Kokkos::parallel_for(Kokkos::TeamThreadRange(team,0,numBases), [&] (
const int basis) {
211 field_(cell, basis) += basis_(cell, basis, qp, dim) * multiplier_ * vector_(cell, qp, dim);
214 else if constexpr (NUM_FIELD_MULT == 1) {
215 Kokkos::parallel_for(Kokkos::TeamThreadRange(team,0,numBases), [&] (
const int basis) {
216 field_(cell, basis) += basis_(cell, basis, qp, dim) * multiplier_ * vector_(cell, qp, dim)
217 * kokkosFieldMults_(0)(cell, qp);
220 else if constexpr (NUM_FIELD_MULT == 2) {
221 Kokkos::parallel_for(Kokkos::TeamThreadRange(team,0,numBases), [&] (
const int basis) {
222 field_(cell, basis) += basis_(cell, basis, qp, dim) * multiplier_ * vector_(cell, qp, dim)
223 * kokkosFieldMults_(0)(cell, qp) * kokkosFieldMults_(1)(cell, qp);
226 else if constexpr (NUM_FIELD_MULT == 3) {
227 Kokkos::parallel_for(Kokkos::TeamThreadRange(team,0,numBases), [&] (
const int basis) {
228 field_(cell, basis) += basis_(cell, basis, qp, dim) * multiplier_ * vector_(cell, qp, dim)
229 * kokkosFieldMults_(0)(cell, qp) * kokkosFieldMults_(1)(cell, qp) * kokkosFieldMults_(2)(cell, qp);
233 Kokkos::abort(
"Panzer_Integrator_GradBasisDotVector: NUM_FIELD_MULT out of range!");
251 const Kokkos::TeamPolicy<PHX::exec_space>::member_type& team)
const
254 const int cell = team.league_rank();
255 const int numQP = vector_.extent(1);
256 const int numDim = vector_.extent(2);
257 const int numBases = basis_.extent(1);
258 const int fadSize = Kokkos::dimension_scalar(field_.get_view());
261 if (Sacado::IsADType<ScalarT>::value) {
262 tmp_field =
scratch_view(team.team_shmem(),numBases,fadSize);
269 Kokkos::parallel_for(Kokkos::TeamThreadRange(team,0,numBases), [&] (
const int basis) {
270 tmp_field(basis) = 0.0;
275 for (
int qp(0); qp < numQP; ++qp) {
276 for (
int dim(0); dim < numDim; ++dim) {
277 if constexpr (NUM_FIELD_MULT == 0) {
278 Kokkos::parallel_for(Kokkos::TeamThreadRange(team,0,numBases), [&] (
const int basis) {
279 tmp_field(basis) += basis_(cell, basis, qp, dim) * multiplier_ * vector_(cell, qp, dim);
282 else if constexpr (NUM_FIELD_MULT == 1) {
283 Kokkos::parallel_for(Kokkos::TeamThreadRange(team,0,numBases), [&] (
const int basis) {
284 tmp_field(basis) += basis_(cell, basis, qp, dim) * multiplier_ * vector_(cell, qp, dim)
285 * kokkosFieldMults_(0)(cell, qp);
288 else if constexpr (NUM_FIELD_MULT == 2) {
289 Kokkos::parallel_for(Kokkos::TeamThreadRange(team,0,numBases), [&] (
const int basis) {
290 tmp_field(basis) += basis_(cell, basis, qp, dim) * multiplier_ * vector_(cell, qp, dim)
291 * kokkosFieldMults_(0)(cell, qp) * kokkosFieldMults_(1)(cell, qp);
294 else if constexpr (NUM_FIELD_MULT == 3) {
295 Kokkos::parallel_for(Kokkos::TeamThreadRange(team,0,numBases), [&] (
const int basis) {
296 tmp_field(basis) += basis_(cell, basis, qp, dim) * multiplier_ * vector_(cell, qp, dim)
297 * kokkosFieldMults_(0)(cell, qp) * kokkosFieldMults_(1)(cell, qp) * kokkosFieldMults_(2)(cell, qp);
301 Kokkos::abort(
"Panzer_Integrator_GradBasisDotVector: NUM_FIELD_MULT out of range!");
308 Kokkos::parallel_for(Kokkos::TeamThreadRange(team,0,numBases),[&] (
const int basis) {
309 field_(cell,basis) = tmp_field(basis);
313 Kokkos::parallel_for(Kokkos::TeamThreadRange(team,0,numBases),[&] (
const int basis) {
314 field_(cell,basis) += tmp_field(basis);
331 using Kokkos::parallel_for;
332 using Kokkos::TeamPolicy;
335 basis_ = this->wda(workset).bases[basisIndex_]->weighted_grad_basis;
338 if (use_shared_memory) {
340 if (Sacado::IsADType<ScalarT>::value) {
341 const int fadSize = Kokkos::dimension_scalar(field_.get_view());
342 bytes = scratch_view::shmem_size(basis_.extent(1),fadSize);
345 bytes = scratch_view::shmem_size(basis_.extent(1));
350 if (fieldMults_.size() == 0) {
352 parallel_for(this->getName(), policy, *
this);
353 }
else if (fieldMults_.size() == 1) {
355 parallel_for(this->getName(), policy, *
this);
356 }
else if (fieldMults_.size() == 2) {
358 parallel_for(this->getName(), policy, *
this);
359 }
else if (fieldMults_.size() == 3) {
361 parallel_for(this->getName(), policy, *
this);
363 TEUCHOS_TEST_FOR_EXCEPTION(fieldMults_.size() > 3,std::runtime_error,
364 "ERROR: Panzer_Integrator_GradBasisDotVector supports up to three field multipliers! User requested "
365 << fieldMults_.size() <<
"!");
372 if (fieldMults_.size() == 0) {
374 parallel_for(this->getName(), policy, *
this);
375 }
else if (fieldMults_.size() == 1) {
377 parallel_for(this->getName(), policy, *
this);
378 }
else if (fieldMults_.size() == 2) {
380 parallel_for(this->getName(), policy, *
this);
381 }
else if (fieldMults_.size() == 3) {
383 parallel_for(this->getName(), policy, *
this);
385 TEUCHOS_TEST_FOR_EXCEPTION(fieldMults_.size() > 3,std::runtime_error,
386 "ERROR: Panzer_Integrator_GradBasisDotVector supports up to three field multipliers! User requested "
387 << fieldMults_.size() <<
"!");
Integrator_GradBasisDotVector(const panzer::EvaluatorStyle &evalStyle, const std::string &resName, const std::string &fluxName, const panzer::BasisIRLayout &basis, const panzer::IntegrationRule &ir, const double &multiplier=1, const std::vector< std::string > &fmNames=std::vector< std::string >(), const Teuchos::RCP< PHX::DataLayout > &vecDL=Teuchos::null)
Main Constructor.