75 Teuchos::RCP<const PureBasis> basis
76 = p.get< Teuchos::RCP<BasisIRLayout> >(
"Basis")->getBasis();
80 if(basis->isScalarBasis()) {
81 dof_ip_scalar = PHX::MDField<ScalarT,Cell,Point>(
82 p.get<std::string>(
"Name"),
83 p.get< Teuchos::RCP<panzer::IntegrationRule> >(
"IR")->dl_scalar);
84 this->addEvaluatedField(dof_ip_scalar);
86 else if(basis->isVectorBasis()) {
87 dof_ip_vector = PHX::MDField<ScalarT,Cell,Point,Dim>(
88 p.get<std::string>(
"Name"),
89 p.get< Teuchos::RCP<panzer::IntegrationRule> >(
"IR")->dl_vector);
90 this->addEvaluatedField(dof_ip_vector);
93 { TEUCHOS_ASSERT(false); }
97 std::string n =
"DOF: " +
dof_basis.fieldTag().name() +
" ("+PHX::print<EvalT>()+
")";
102template<
typename EvalT,
typename TRAITS>
104DOF(
const PHX::FieldTag & input,
105 const PHX::FieldTag & output,
130 std::string n =
"DOF: " +
dof_basis.fieldTag().name() +
" ("+PHX::print<EvalT>()+
")";
135template<
typename EvalT,
typename TRAITS>
152template<
typename EvalT,
typename TRAITS>
165 const int spaceDim = array.extent(3);
168 Kokkos::parallel_for(this->getName(),policy,functor);
172 Kokkos::parallel_for(this->getName(),policy,functor);
180 Kokkos::parallel_for(workset.num_cells,functor);
191template<
typename TRAITS>
193DOF(
const Teuchos::ParameterList & p) :
194 use_descriptors_(false),
195 dof_basis( p.get<
std::string>(
"Name"),
199 Teuchos::RCP<const PureBasis> basis
200 = p.get< Teuchos::RCP<BasisIRLayout> >(
"Basis")->getBasis();
203 if(p.isType<Teuchos::RCP<
const std::vector<int> > >(
"Jacobian Offsets Vector")) {
204 const std::vector<int> & offsets = *p.get<Teuchos::RCP<const std::vector<int> > >(
"Jacobian Offsets Vector");
207 offsets_array = PHX::View<int*>(
"offsets",offsets.size());
208 auto offsets_array_h = Kokkos::create_mirror_view(offsets_array);
209 for(std::size_t i=0;i<offsets.size();i++)
210 offsets_array_h(i) = offsets[i];
211 Kokkos::deep_copy(offsets_array, offsets_array_h);
213 accelerate_jacobian_enabled = true;
216 sensitivities_name = true;
217 if (p.isType<std::string>(
"Sensitivities Name"))
218 sensitivities_name = p.get<std::string>(
"Sensitivities Name");
221 accelerate_jacobian_enabled =
false;
224 if(basis->isScalarBasis()) {
225 dof_ip_scalar = PHX::MDField<ScalarT,Cell,Point>(
226 p.get<std::string>(
"Name"),
227 p.get< Teuchos::RCP<panzer::IntegrationRule> >(
"IR")->dl_scalar);
228 this->addEvaluatedField(dof_ip_scalar);
230 else if(basis->isVectorBasis()) {
231 dof_ip_vector = PHX::MDField<ScalarT,Cell,Point,Dim>(
232 p.get<std::string>(
"Name"),
233 p.get< Teuchos::RCP<panzer::IntegrationRule> >(
"IR")->dl_vector);
234 this->addEvaluatedField(dof_ip_vector);
237 { TEUCHOS_ASSERT(false); }
241 std::string n =
"DOF: " +
dof_basis.fieldTag().name()
242 + ( accelerate_jacobian_enabled ?
" accel_jac " :
"slow_jac" )
243 +
" ("+PHX::print<panzer::Traits::Jacobian>()+
")";
248template<
typename TRAITS>
250DOF(
const PHX::FieldTag & input,
251 const PHX::FieldTag & output,
254 : use_descriptors_(true)
262 accelerate_jacobian_enabled = false;
278 std::string n =
"DOF: " +
dof_basis.fieldTag().name() +
" slow_jac(descriptor) ("+PHX::print<typename TRAITS::Jacobian>()+
")";
283template<
typename TRAITS>
286 PHX::FieldManager<TRAITS>& fm)
288 this->utils.setFieldData(dof_basis,fm);
290 this->utils.setFieldData(dof_ip_vector,fm);
292 this->utils.setFieldData(dof_ip_scalar,fm);
295 if(not use_descriptors_)
300template<
typename TRAITS>
306 accelerate_jacobian =
false;
307 if(accelerate_jacobian_enabled && d.first_sensitivities_name==sensitivities_name) {
308 accelerate_jacobian =
true;
313template<
typename TRAITS>
317 const panzer::BasisValues2<double> & basisValues = use_descriptors_ ? this->wda(workset).getBasisValues(bd_,id_)
318 : *this->wda(workset).bases[basis_index];
320 if(is_vector_basis) {
321 if(accelerate_jacobian) {
324 const int spaceDim = array.extent(3);
327 Kokkos::parallel_for(workset.num_cells,functor);
331 Kokkos::parallel_for(workset.num_cells,functor);
339 const int spaceDim = array.extent(3);
342 Kokkos::parallel_for(this->getName(),policy,functor);
346 Kokkos::parallel_for(this->getName(),policy,functor);
353 if(accelerate_jacobian) {
355 Kokkos::parallel_for(workset.num_cells,functor);
359 Kokkos::parallel_for(workset.num_cells,functor);