void XZHydrostatic_TemperatureResid<EvalT, Traits>::
evaluateFields(typename Traits::EvalData workset)
{
  PHAL::set(Residual, 0.0);

  for (int cell=0; cell < workset.numCells; ++cell) {
    for (int node=0; node < numNodes; ++node) {
      for (int level=0; level < numLevels; ++level) {
        for (int qp=0; qp < numQPs; ++qp) {
          for (int dim=0; dim < numDims; ++dim) 
            Residual(cell,node,level) += velx(cell,qp,level,dim)*temperatureGrad(cell,qp,level,dim)*wBF(cell,node,qp);
          Residual(cell,node,level)   += temperatureSrc(cell,qp,level)                             *wBF(cell,node,qp);
          Residual(cell,node,level)   -= omega(cell,qp,level)                                      *wBF(cell,node,qp);
          Residual(cell,node,level)   += etadotdT(cell,qp,level)                                   *wBF(cell,node,qp);
          Residual(cell,node,level)   += temperatureDot(cell,qp,level)                             *wBF(cell,node,qp);
        }
      }
    }
  }
}
void XZHydrostatic_EtaDotPi<EvalT, Traits>::
evaluateFields(typename Traits::EvalData workset)
{
	const Eta<EvalT> &E = Eta<EvalT>::self();

	//etadotpi(level) shifted by 1/2
	std::vector<ScalarT> etadotpi(numLevels+1);

	if(!pureAdvection){
		for (int cell=0; cell < workset.numCells; ++cell) {
			for (int qp=0; qp < numQPs; ++qp) {
				ScalarT pdotp0 = 0;
				for (int level=0; level < numLevels; ++level) pdotp0 -= divpivelx(cell,qp,level) * E.delta(level);
				for (int level=0; level < numLevels; ++level) {
					ScalarT integral = 0;
					for (int j=0; j<=level; ++j) integral += divpivelx(cell,qp,j) * E.delta(j);
					etadotpi[level] = -E.B(level+.5)*pdotp0 - integral;
				}
				etadotpi[0] = etadotpi[numLevels] = 0;

				//Vertical Finite Differencing
				for (int level=0; level < numLevels; ++level) {
					const ScalarT factor     = 1.0/(2.0*Pi(cell,qp,level)*E.delta(level));
					const int level_m = level             ? level-1 : 0;
					const int level_p = level+1<numLevels ? level+1 : level;
					const ScalarT etadotpi_m = etadotpi[level  ];
					const ScalarT etadotpi_p = etadotpi[level+1];

					const ScalarT dT_m       = Temperature(cell,qp,level)   - Temperature(cell,qp,level_m);
					const ScalarT dT_p       = Temperature(cell,qp,level_p) - Temperature(cell,qp,level);
					etadotdT(cell,qp,level) = factor * ( etadotpi_p*dT_p + etadotpi_m*dT_m );

					for (int dim=0; dim<numDims; ++dim) {
						const ScalarT dVx_m      = Velx(cell,qp,level,dim)   - Velx(cell,qp,level_m,dim);
						const ScalarT dVx_p      = Velx(cell,qp,level_p,dim) - Velx(cell,qp,level,dim);
						etadotdVelx(cell,qp,level,dim) = factor * ( etadotpi_p*dVx_p + etadotpi_m*dVx_m );
					}

					for (int i = 0; i < tracerNames.size(); ++i) {
						const ScalarT q_m = 0.5*( Tracer[tracerNames[i]](cell,qp,level)   / Pi(cell,qp,level)
								+ Tracer[tracerNames[i]](cell,qp,level_m) / Pi(cell,qp,level_m) );
						const ScalarT q_p = 0.5*( Tracer[tracerNames[i]](cell,qp,level_p) / Pi(cell,qp,level_p)
								+ Tracer[tracerNames[i]](cell,qp,level)   / Pi(cell,qp,level)   );
						//etadotdTracer[tracerNames[i]](cell,qp,level) = ( etadotpi_p*q_p - etadotpi_m*q_m ) / E.delta(level);
						dedotpiTracerde[tracerNames[i]](cell,qp,level) = ( etadotpi_p*q_p - etadotpi_m*q_m ) / E.delta(level);
					}

					Pidot(cell,qp,level) = - divpivelx(cell,qp,level) - (etadotpi_p - etadotpi_m)/E.delta(level);

				}
			}
		}
	}//end of (not pure Advection)
	//pure advection: there are amny auxiliary variables.
	else{
		for (int cell=0; cell < workset.numCells; ++cell) {
			for (int qp=0; qp < numQPs; ++qp) {
				//Vertical Finite Differencing
				for (int level=0; level < numLevels; ++level) {
					etadotdT(cell,qp,level) = 0.0;
					for (int dim=0; dim<numDims; ++dim)
						etadotdVelx(cell,qp,level,dim) = 0.0;
					for (int i = 0; i < tracerNames.size(); ++i)
						dedotpiTracerde[tracerNames[i]](cell,qp,level) = 0.0;
					Pidot(cell,qp,level) = - divpivelx(cell,qp,level);
				}
			}
		}
	}
}