KOKKOS_INLINE_FUNCTION void StokesFOImplicitThicknessUpdateResid<EvalT, Traits>:: operator() (const StokesFOImplicitThicknessUpdateResid_Tag& tag, const int& cell) const { double rho_g=rho*g; for (int node=0; node < numNodes; ++node){ res(node,0)=0.0; res(node,1)=0.0; } for (int qp=0; qp < numQPs; ++qp) { ScalarT dHdiffdx = 0;//Ugrad(cell,qp,2,0); ScalarT dHdiffdy = 0;//Ugrad(cell,qp,2,1); for (int node=0; node < numNodes; ++node) { dHdiffdx += dH(cell,node) * gradBF(cell,node, qp,0); dHdiffdy += dH(cell,node) * gradBF(cell,node, qp,1); } for (int node=0; node < numNodes; ++node) { res(node,0) += rho_g*dHdiffdx*wBF(cell,node,qp); res(node,1) += rho_g*dHdiffdy*wBF(cell,node,qp); } } for (int node=0; node < numNodes; ++node) { Residual(cell,node,0) = InputResidual(cell,node,0)+res(node,0); Residual(cell,node,1) = InputResidual(cell,node,1)+res(node,1); if(numVecDims==3) Residual(cell,node,2) = InputResidual(cell,node,2); } }
void StokesFOImplicitThicknessUpdateResid<EvalT, Traits>:: evaluateFields(typename Traits::EvalData workset) { typedef Intrepid::FunctionSpaceTools FST; // Initialize residual to 0.0 Kokkos::deep_copy(Residual.get_kokkos_view(), ScalarT(0.0)); Intrepid::FieldContainer<ScalarT> res(numNodes,3); double rho_g=rho*g; for (std::size_t cell=0; cell < workset.numCells; ++cell) { for (int i = 0; i < res.size(); i++) res(i) = 0.0; for (std::size_t qp=0; qp < numQPs; ++qp) { ScalarT dHdiffdx = 0;//Ugrad(cell,qp,2,0); ScalarT dHdiffdy = 0;//Ugrad(cell,qp,2,1); for (std::size_t node=0; node < numNodes; ++node) { dHdiffdx += (H(cell,node)-H0(cell,node)) * gradBF(cell,node, qp,0); dHdiffdy += (H(cell,node)-H0(cell,node)) * gradBF(cell,node, qp,1); } for (std::size_t node=0; node < numNodes; ++node) { res(node,0) += rho_g*dHdiffdx*wBF(cell,node,qp); res(node,1) += rho_g*dHdiffdy*wBF(cell,node,qp); } } for (std::size_t node=0; node < numNodes; ++node) { Residual(cell,node,0) = res(node,0); Residual(cell,node,1) = res(node,1); } } }
void StokesFOImplicitThicknessUpdateResid<EvalT, Traits>:: evaluateFields(typename Traits::EvalData workset) { #ifndef ALBANY_KOKKOS_UNDER_DEVELOPMENT typedef Intrepid2::FunctionSpaceTools FST; // Initialize residual to 0.0 Intrepid2::FieldContainer_Kokkos<ScalarT, PHX::Layout, PHX::Device> res(numNodes,2); double rho_g=rho*g; for (std::size_t cell=0; cell < workset.numCells; ++cell) { res.initialize(); for (std::size_t qp=0; qp < numQPs; ++qp) { ScalarT dHdiffdx = 0;//Ugrad(cell,qp,2,0); ScalarT dHdiffdy = 0;//Ugrad(cell,qp,2,1); for (std::size_t node=0; node < numNodes; ++node) { dHdiffdx += dH(cell,node) * gradBF(cell,node, qp,0); dHdiffdy += dH(cell,node) * gradBF(cell,node, qp,1); } for (std::size_t node=0; node < numNodes; ++node) { res(node,0) += rho_g*dHdiffdx*wBF(cell,node,qp); res(node,1) += rho_g*dHdiffdy*wBF(cell,node,qp); } } for (std::size_t node=0; node < numNodes; ++node) { Residual(cell,node,0) = InputResidual(cell,node,0)+res(node,0); Residual(cell,node,1) = InputResidual(cell,node,1)+res(node,1); if(numVecDims==3) Residual(cell,node,2) = InputResidual(cell,node,2); } } #else Kokkos::parallel_for(StokesFOImplicitThicknessUpdateResid_Policy(0,workset.numCells),*this); #endif }