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
}