void EpsilonL1L2<EvalT, Traits>::
evaluateFields(typename Traits::EvalData workset)
{
  for (std::size_t cell=0; cell < workset.numCells; ++cell) {
    for (std::size_t qp=0; qp < numQPs; ++qp) {
       epsilonXX(cell,qp) = Ugrad(cell,qp,0,0); 
       epsilonYY(cell,qp) = Ugrad(cell,qp,1,1); 
       epsilonXY(cell,qp) = 0.5*(Ugrad(cell,qp,0,1) + Ugrad(cell,qp,1,0)); 
       epsilonB(cell,qp)  = epsilonXX(cell,qp)*epsilonXX(cell,qp) + epsilonYY(cell,qp)*epsilonYY(cell,qp) 
                          + epsilonXX(cell,qp)*epsilonYY(cell,qp) + epsilonXY(cell,qp)*epsilonXY(cell,qp);   
    }
  }
}
void ViscosityL1L2<EvalT, Traits>::
evaluateFields(typename Traits::EvalData workset)
{
  if (visc_type == CONSTANT){
    for (std::size_t cell=0; cell < workset.numCells; ++cell) {
      for (std::size_t qp=0; qp < numQPs; ++qp) {
        mu(cell,qp) = 1.0; 
      }
    }
  }
  else if (visc_type == GLENSLAW) {
    if (n == 1.0) {
      for (std::size_t cell=0; cell < workset.numCells; ++cell) {
        for (std::size_t qp=0; qp < numQPs; ++qp) {
          mu(cell,qp) = 1.0/A; 
        }
      }
    }
    else if (n == 3.0) {
      if (surf_type == BOX) {
        if (homotopyParam == 0.0) {
          for (std::size_t cell=0; cell < workset.numCells; ++cell) {
            for (std::size_t qp=0; qp < numQPs; ++qp) {
              mu(cell,qp) = pow(A, -1.0/3.0);
           }
         }
       }
        else {
          ScalarT ff = pow(10.0, -10.0*homotopyParam);
          for (std::size_t cell=0; cell < workset.numCells; ++cell) {
            for (std::size_t qp=0; qp < numQPs; ++qp) {
               mu(cell,qp) = epsilonB(cell,qp) + ff; 
               mu(cell,qp) = sqrt(mu(cell,qp)); 
               mu(cell,qp) = pow(A, -1.0/3.0)*pow(mu(cell,qp), -2.0/3.0); 
            }
          }
        }
      }
      else if (surf_type == TESTA) { //ISMIP-HOM Test A
        PHX::MDField<ScalarT,Cell,QuadPoint> q;
        PHX::MDField<ScalarT,Cell,QuadPoint> w;
        PHX::MDField<ScalarT,Cell,QuadPoint> tauPar2;
        PHX::MDField<ScalarT,Cell,QuadPoint> Int;
        for (std::size_t cell=0; cell < workset.numCells; ++cell) {
          for (std::size_t qp=0; qp < numQPs; ++qp) {
             MeshScalarT x = coordVec(cell,qp,0);
             MeshScalarT y = coordVec(cell,qp,1);
             MeshScalarT s = -x*tan(alpha);
             MeshScalarT b = s - 1.0 + 0.5*sin(2.0*pi*x/L)*sin(2.0*pi*y/L);
             MeshScalarT dsdx = -tan(alpha);
             MeshScalarT dsdy = 0.0; 
             Int(cell,qp) = 0.0; 
             q(cell,qp) = 1.0/(2.0*A)*sqrt(epsilonB(cell,qp)); //TO DO: need to put in continuation here 
             for (std::size_t qpZ = 0; qp<numQPsZ; ++qpZ) { //apply Trapezoidal rule to compute integral in z
                MeshScalarT zQP = qpZ*(s-b)/(2.0*numQPsZ); 
                MeshScalarT tauPerp2 = rho*rho*g*g*(s-zQP)*(s-zQP)*(dsdx*dsdx + dsdy*dsdy); 
                MeshScalarT p = 1.0/3.0*tauPerp2;
                w(cell,qp) = pow(q(cell,qp) + sqrt(q(cell,qp)*q(cell,qp) + p*p*p), 1.0/3.0); 
                tauPar2(cell,qp) = (w(cell,qp)-p/(3.0*w(cell,qp)))*(w(cell,qp)-p/(3.0*w(cell,qp))); 
                Int(cell,qp) += 1.0/(tauPerp2 + tauPar2(cell,qp));  
             }
            mu(cell,qp) = 1.0/A*Int(cell,qp); 
          }
        }
      }
    }
  }
}