43#ifndef PANZER_DOF_IMPL_HPP
44#define PANZER_DOF_IMPL_HPP
54#include "Intrepid2_FunctionSpaceTools.hpp"
67template<
typename EvalT,
typename TRAITS>
71 const std::string fieldName = p.get<std::string>(
"Name");
72 basis = p.get< Teuchos::RCP<const PureBasis> >(
"Basis");
73 Teuchos::RCP<const PointRule> pointRule = p.get< Teuchos::RCP<const PointRule> >(
"Point Rule");
74 is_vector_basis = basis->isVectorBasis();
76 std::string evalName = fieldName+
"_"+pointRule->getName();
77 if(p.isType<
bool>(
"Use DOF Name")) {
78 if(p.get<
bool>(
"Use DOF Name"))
82 dof_basis = PHX::MDField<const ScalarT,Cell,Point>(fieldName, basis->functional);
84 this->addDependentField(dof_basis);
87 Teuchos::RCP<BasisIRLayout> layout = Teuchos::rcp(
new BasisIRLayout(basis,*pointRule));
88 basisValues = Teuchos::rcp(
new BasisValues2<double>(basis->name()+
"_"+pointRule->getName()+
"_"));
89 basisValues->setupArrays(layout,
false);
93 if(basis->isScalarBasis()) {
94 dof_ip_scalar = PHX::MDField<ScalarT,Cell,Point>(
96 pointRule->dl_scalar);
97 this->addEvaluatedField(dof_ip_scalar);
98 this->addNonConstDependentField(basisValues->basis_ref_scalar);
99 this->addNonConstDependentField(basisValues->basis_scalar);
101 else if(basis->isVectorBasis()) {
102 dof_ip_vector = PHX::MDField<ScalarT,Cell,Point,Dim>(
104 pointRule->dl_vector);
105 this->addEvaluatedField(dof_ip_vector);
106 this->addNonConstDependentField(basisValues->basis_ref_vector);
107 this->addNonConstDependentField(basisValues->basis_vector);
110 { TEUCHOS_ASSERT(
false); }
112 std::string n =
"DOF_PointValues: " + dof_basis.fieldTag().name();
117template<
typename EvalT,
typename TRAITS>
122 if(!is_vector_basis) {
123 this->utils.setFieldData(basisValues->basis_ref_scalar,fm);
124 this->utils.setFieldData(basisValues->basis_scalar,fm);
127 this->utils.setFieldData(basisValues->basis_ref_vector,fm);
128 this->utils.setFieldData(basisValues->basis_vector,fm);
133template<
typename EvalT,
typename TRAITS>
139 if(is_vector_basis) {
140 int spaceDim = basisValues->basis_vector.extent(3);
143 Kokkos::parallel_for(Kokkos::TeamPolicy<PHX::Device>(workset.num_cells,Kokkos::AUTO(),vector_size),functor);
147 Kokkos::parallel_for(Kokkos::TeamPolicy<PHX::Device>(workset.num_cells,Kokkos::AUTO(),vector_size),functor);
152 Kokkos::parallel_for(workset.num_cells,functor);
163template<
typename TRAITS>
167 const std::string fieldName = p.get<std::string>(
"Name");
168 basis = p.get< Teuchos::RCP<const PureBasis> >(
"Basis");
169 Teuchos::RCP<const PointRule> pointRule = p.get< Teuchos::RCP<const PointRule> >(
"Point Rule");
170 is_vector_basis = basis->isVectorBasis();
172 if(p.isType<Teuchos::RCP<
const std::vector<int> > >(
"Jacobian Offsets Vector")) {
173 const std::vector<int> &
offsets = *p.get<Teuchos::RCP<const std::vector<int> > >(
"Jacobian Offsets Vector");
176 offsets_array = PHX::View<int*>(
"offsets",
offsets.size());
177 for(std::size_t i=0;i<
offsets.size();i++)
180 accelerate_jacobian =
true;
183 accelerate_jacobian =
false;
185 std::string evalName = fieldName+
"_"+pointRule->getName();
186 if(p.isType<
bool>(
"Use DOF Name")) {
187 if(p.get<
bool>(
"Use DOF Name"))
188 evalName = fieldName;
191 dof_basis = PHX::MDField<const ScalarT,Cell,Point>(fieldName, basis->functional);
193 this->addDependentField(dof_basis);
196 Teuchos::RCP<BasisIRLayout> layout = Teuchos::rcp(
new BasisIRLayout(basis,*pointRule));
197 basisValues = Teuchos::rcp(
new BasisValues2<double>(basis->name()+
"_"+pointRule->getName()+
"_"));
198 basisValues->setupArrays(layout,
false);
202 if(basis->isScalarBasis()) {
203 dof_ip_scalar = PHX::MDField<ScalarT,Cell,Point>(
205 pointRule->dl_scalar);
206 this->addEvaluatedField(dof_ip_scalar);
207 this->addNonConstDependentField(basisValues->basis_ref_scalar);
208 this->addNonConstDependentField(basisValues->basis_scalar);
210 else if(basis->isVectorBasis()) {
211 dof_ip_vector = PHX::MDField<ScalarT,Cell,Point,Dim>(
213 pointRule->dl_vector);
214 this->addEvaluatedField(dof_ip_vector);
215 this->addNonConstDependentField(basisValues->basis_ref_vector);
216 this->addNonConstDependentField(basisValues->basis_vector);
219 { TEUCHOS_ASSERT(
false); }
221 std::string n =
"DOF_PointValues: " + dof_basis.fieldTag().name() +
" Jacobian";
226template<
typename TRAITS>
231 if(!is_vector_basis) {
232 this->utils.setFieldData(basisValues->basis_ref_scalar,fm);
233 this->utils.setFieldData(basisValues->basis_scalar,fm);
236 this->utils.setFieldData(basisValues->basis_ref_vector,fm);
237 this->utils.setFieldData(basisValues->basis_vector,fm);
242template<
typename TRAITS>
248 if(is_vector_basis) {
249 if(accelerate_jacobian) {
250 int spaceDim = basisValues->basis_vector.extent(3);
252 dof_functors::EvaluateDOFFastSens_Vector<ScalarT,typename BasisValues2<double>::Array_CellBasisIPDim,3> functor(dof_basis,dof_ip_vector,offsets_array,basisValues->basis_vector);
253 Kokkos::parallel_for(workset.num_cells,functor);
256 dof_functors::EvaluateDOFFastSens_Vector<ScalarT,typename BasisValues2<double>::Array_CellBasisIPDim,2> functor(dof_basis,dof_ip_vector,offsets_array,basisValues->basis_vector);
257 Kokkos::parallel_for(workset.num_cells,functor);
261 int spaceDim = basisValues->basis_vector.extent(3);
263 dof_functors::EvaluateDOFWithSens_Vector<ScalarT,typename BasisValues2<double>::Array_CellBasisIPDim,3> functor(dof_basis.get_static_view(),dof_ip_vector.get_static_view(),basisValues->basis_vector);
264 Kokkos::parallel_for(Kokkos::TeamPolicy<PHX::Device>(workset.num_cells,Kokkos::AUTO(),vector_size),functor);
267 dof_functors::EvaluateDOFWithSens_Vector<ScalarT,typename BasisValues2<double>::Array_CellBasisIPDim,2> functor(dof_basis.get_static_view(),dof_ip_vector.get_static_view(),basisValues->basis_vector);
268 Kokkos::parallel_for(Kokkos::TeamPolicy<PHX::Device>(workset.num_cells,Kokkos::AUTO(),vector_size),functor);
273 if(accelerate_jacobian) {
274 dof_functors::EvaluateDOFFastSens_Scalar<ScalarT,typename BasisValues2<double>::Array_CellBasisIP> functor(dof_basis,dof_ip_scalar,offsets_array,basisValues->basis_scalar);
275 Kokkos::parallel_for(workset.num_cells,functor);
278 dof_functors::EvaluateDOFWithSens_Scalar<ScalarT,typename BasisValues2<double>::Array_CellBasisIP> functor(dof_basis,dof_ip_scalar,basisValues->basis_scalar);
279 Kokkos::parallel_for(workset.num_cells,functor);
PHX::View< const int * > offsets
void postRegistrationSetup(typename TRAITS::SetupData d, PHX::FieldManager< TRAITS > &fm)
void evaluateFields(typename TRAITS::EvalData d)
DOF_PointValues(const Teuchos::ParameterList &p)
int vectorSize() const
Returns the vector size. Specialized for AD scalar types.
static HP & inst()
Private ctor.