11#ifndef PANZER_DOF_IMPL_HPP
12#define PANZER_DOF_IMPL_HPP
22#include "Intrepid2_FunctionSpaceTools.hpp"
35template<
typename EvalT,
typename TRAITS>
37DOF(
const Teuchos::ParameterList & p) :
43 Teuchos::RCP<const PureBasis> basis
44 = p.get< Teuchos::RCP<BasisIRLayout> >(
"Basis")->getBasis();
48 if(basis->isScalarBasis()) {
49 dof_ip_scalar = PHX::MDField<ScalarT,Cell,Point>(
50 p.get<std::string>(
"Name"),
51 p.get< Teuchos::RCP<panzer::IntegrationRule> >(
"IR")->dl_scalar);
52 this->addEvaluatedField(dof_ip_scalar);
54 else if(basis->isVectorBasis()) {
55 dof_ip_vector = PHX::MDField<ScalarT,Cell,Point,Dim>(
56 p.get<std::string>(
"Name"),
57 p.get< Teuchos::RCP<panzer::IntegrationRule> >(
"IR")->dl_vector);
58 this->addEvaluatedField(dof_ip_vector);
61 { TEUCHOS_ASSERT(false); }
65 std::string n =
"DOF: " +
dof_basis.fieldTag().name() +
" ("+PHX::print<EvalT>()+
")";
70template<
typename EvalT,
typename TRAITS>
72DOF(
const PHX::FieldTag & input,
73 const PHX::FieldTag & output,
98 std::string n =
"DOF: " +
dof_basis.fieldTag().name() +
" ("+PHX::print<EvalT>()+
")";
103template<
typename EvalT,
typename TRAITS>
120template<
typename EvalT,
typename TRAITS>
133 const int spaceDim = array.extent(3);
136 Kokkos::parallel_for(this->getName(),policy,functor);
140 Kokkos::parallel_for(this->getName(),policy,functor);
148 Kokkos::parallel_for(workset.num_cells,functor);
159template<
typename TRAITS>
161DOF(
const Teuchos::ParameterList & p) :
162 use_descriptors_(false),
163 dof_basis( p.get<
std::string>(
"Name"),
167 Teuchos::RCP<const PureBasis> basis
168 = p.get< Teuchos::RCP<BasisIRLayout> >(
"Basis")->getBasis();
171 if(p.isType<Teuchos::RCP<
const std::vector<int> > >(
"Jacobian Offsets Vector")) {
172 const std::vector<int> & offsets = *p.get<Teuchos::RCP<const std::vector<int> > >(
"Jacobian Offsets Vector");
175 offsets_array = PHX::View<int*>(
"offsets",offsets.size());
176 auto offsets_array_h = Kokkos::create_mirror_view(offsets_array);
177 for(std::size_t i=0;i<offsets.size();i++)
178 offsets_array_h(i) = offsets[i];
179 Kokkos::deep_copy(offsets_array, offsets_array_h);
181 accelerate_jacobian_enabled = true;
184 sensitivities_name = true;
185 if (p.isType<std::string>(
"Sensitivities Name"))
186 sensitivities_name = p.get<std::string>(
"Sensitivities Name");
189 accelerate_jacobian_enabled =
false;
192 if(basis->isScalarBasis()) {
193 dof_ip_scalar = PHX::MDField<ScalarT,Cell,Point>(
194 p.get<std::string>(
"Name"),
195 p.get< Teuchos::RCP<panzer::IntegrationRule> >(
"IR")->dl_scalar);
196 this->addEvaluatedField(dof_ip_scalar);
198 else if(basis->isVectorBasis()) {
199 dof_ip_vector = PHX::MDField<ScalarT,Cell,Point,Dim>(
200 p.get<std::string>(
"Name"),
201 p.get< Teuchos::RCP<panzer::IntegrationRule> >(
"IR")->dl_vector);
202 this->addEvaluatedField(dof_ip_vector);
205 { TEUCHOS_ASSERT(false); }
209 std::string n =
"DOF: " +
dof_basis.fieldTag().name()
210 + ( accelerate_jacobian_enabled ?
" accel_jac " :
"slow_jac" )
211 +
" ("+PHX::print<panzer::Traits::Jacobian>()+
")";
216template<
typename TRAITS>
218DOF(
const PHX::FieldTag & input,
219 const PHX::FieldTag & output,
222 : use_descriptors_(true)
230 accelerate_jacobian_enabled = false;
246 std::string n =
"DOF: " +
dof_basis.fieldTag().name() +
" slow_jac(descriptor) ("+PHX::print<typename TRAITS::Jacobian>()+
")";
251template<
typename TRAITS>
254 PHX::FieldManager<TRAITS>& fm)
256 this->utils.setFieldData(dof_basis,fm);
258 this->utils.setFieldData(dof_ip_vector,fm);
260 this->utils.setFieldData(dof_ip_scalar,fm);
263 if(not use_descriptors_)
268template<
typename TRAITS>
274 accelerate_jacobian =
false;
275 if(accelerate_jacobian_enabled && d.first_sensitivities_name==sensitivities_name) {
276 accelerate_jacobian =
true;
281template<
typename TRAITS>
285 const panzer::BasisValues2<double> & basisValues = use_descriptors_ ? this->wda(workset).getBasisValues(bd_,id_)
286 : *this->wda(workset).bases[basis_index];
288 if(is_vector_basis) {
289 if(accelerate_jacobian) {
292 const int spaceDim = array.extent(3);
295 Kokkos::parallel_for(workset.num_cells,functor);
299 Kokkos::parallel_for(workset.num_cells,functor);
307 const int spaceDim = array.extent(3);
310 Kokkos::parallel_for(this->getName(),policy,functor);
314 Kokkos::parallel_for(this->getName(),policy,functor);
321 if(accelerate_jacobian) {
323 Kokkos::parallel_for(workset.num_cells,functor);
327 Kokkos::parallel_for(workset.num_cells,functor);
const std::string & getType() const
Get type of basis.
PHX::MDField< const Scalar, Cell, BASIS, IP > ConstArray_CellBasisIP
Array_CellBasisIP basis_scalar
ConstArray_CellBasisIP getBasisValues(const bool weighted, const bool cache=true, const bool force=false) const
Get the basis values evaluated at mesh points.
PHX::MDField< const Scalar, Cell, BASIS, IP, Dim > ConstArray_CellBasisIPDim
Array_CellBasisIPDim basis_vector
ConstArray_CellBasisIPDim getVectorBasisValues(const bool weighted, const bool cache=true, const bool force=false) const
Get the vector basis values evaluated at mesh points.
Interpolates basis DOF values to IP DOF values.
PHX::MDField< const ScalarT, Cell, Point > dof_basis
panzer::BasisDescriptor bd_
PHX::MDField< ScalarT, Cell, Point, Dim > dof_ip_vector
DOF(const Teuchos::ParameterList &p)
void postRegistrationSetup(typename TRAITS::SetupData d, PHX::FieldManager< TRAITS > &fm)
panzer::IntegrationDescriptor id_
void evaluateFields(typename TRAITS::EvalData d)
PHX::MDField< ScalarT, Cell, Point > dof_ip_scalar
WorksetDetailsAccessor wda
static HP & inst()
Private ctor.
bool useSharedMemory() const
Kokkos::TeamPolicy< TeamPolicyProperties... > teamPolicy(const int &league_size)
Returns a TeamPolicy for hierarchic parallelism.
Scalar-valued DOF interpolation functor using the fast-sensitivity optimization.
Vector-valued DOF interpolation functor using the fast-sensitivity optimization.
Scalar-valued DOF interpolation functor with full derivative propagation.
Vector-valued DOF interpolation functor with full derivative propagation.
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.