void FastSolutionTensorInterpolationBase<PHAL::AlbanyTraits::Jacobian, Traits, typename PHAL::AlbanyTraits::Jacobian::ScalarT>:: evaluateFields(typename Traits::EvalData workset) { const int num_dof = this->val_node(0,0,0,0).size(); const int neq = workset.wsElNodeEqID.dimension(2); const auto vecDim = this->vecDim; for (std::size_t cell=0; cell < workset.numCells; ++cell) { for (std::size_t qp=0; qp < this->numQPs; ++qp) { for (std::size_t i=0; i< vecDim; i++) { for (std::size_t j=0; j< vecDim; j++) { // Zero out for node==0; then += for node = 1 to numNodes typename PHAL::Ref<ScalarT>::type vqp = this->val_qp(cell,qp,i,j); vqp = this->val_node(cell, 0, i, j) * this->BF(cell, 0, qp); vqp = ScalarT(num_dof, this->val_node(cell, 0, i, j).val() * this->BF(cell, 0, qp)); vqp.fastAccessDx(offset+i*vecDim+j) = this->val_node(cell, 0, i, j).fastAccessDx(offset+i*vecDim+j) * this->BF(cell, 0, qp); for (std::size_t node=1; node < this->numNodes; ++node) { vqp.val() += this->val_node(cell, node, i, j).val() * this->BF(cell, node, qp); vqp.fastAccessDx(neq*node+offset+i*this->vecDim+j) += this->val_node(cell, node, i, j).fastAccessDx(neq*node+offset+i*vecDim+j) * this->BF(cell, node, qp); } } } } } }
void GatherExtruded2DField<PHAL::AlbanyTraits::Jacobian, Traits>:: evaluateFields(typename Traits::EvalData workset) { Teuchos::RCP<const Tpetra_Vector> xT = workset.xT; Teuchos::ArrayRCP<const ST> xT_constView = xT->get1dView(); Kokkos::deep_copy(this->field2D.get_kokkos_view(), ScalarT(0.0)); const Albany::LayeredMeshNumbering<LO>& layeredMeshNumbering = *workset.disc->getLayeredMeshNumbering(); const Albany::NodalDOFManager& solDOFManager = workset.disc->getOverlapDOFManager("ordinary_solution"); int numLayers = layeredMeshNumbering.numLayers; this->fieldLevel = (this->fieldLevel < 0) ? numLayers : this->fieldLevel; const Teuchos::ArrayRCP<Teuchos::ArrayRCP<GO> >& wsElNodeID = workset.disc->getWsElNodeID()[workset.wsIndex]; for (std::size_t cell=0; cell < workset.numCells; ++cell ) { const Teuchos::ArrayRCP<GO>& elNodeID = wsElNodeID[cell]; const Teuchos::ArrayRCP<Teuchos::ArrayRCP<int> >& nodeID = workset.wsElNodeEqID[cell]; const int neq = nodeID[0].size(); const std::size_t num_dof = neq * this->numNodes; for (std::size_t node = 0; node < this->numNodes; ++node) { int firstunk = neq * node + this->offset; LO lnodeId = workset.disc->getOverlapNodeMapT()->getLocalElement(elNodeID[node]); LO base_id, ilayer; layeredMeshNumbering.getIndices(lnodeId, base_id, ilayer); LO inode = layeredMeshNumbering.getId(base_id, this->fieldLevel); typename PHAL::Ref<ScalarT>::type val = (this->field2D)(cell,node); val = FadType(neq * this->numNodes, xT_constView[solDOFManager.getLocalDOF(inode, this->offset)]); val.setUpdateValue(!workset.ignore_residual); val.fastAccessDx(firstunk) = workset.j_coeff; } } }