inline Sacado::CacheFad::Expr< Sacado::CacheFad::SFadExprTag<T,Num> >& 
Sacado::CacheFad::Expr< Sacado::CacheFad::SFadExprTag<T,Num> >::
operator /= (const Sacado::CacheFad::Expr<S>& x)
{
  T xval = x.val();

#ifdef SACADO_DEBUG
  if (x.size() != Num)
    throw "CacheFad::operator/=() Error:  Attempt to assign with incompatible sizes";
#endif

  for(int i=0; i<Num; ++i)
    dx_[i] = ( dx_[i]*xval - val_*x.fastAccessDx(i) )/ (xval*xval);

  val_ /= xval;

  return *this;
}
inline Sacado::CacheFad::Expr< Sacado::CacheFad::SFadExprTag<T,Num> >& 
Sacado::CacheFad::Expr< Sacado::CacheFad::SFadExprTag<T,Num> >::
operator -= (const Sacado::CacheFad::Expr<S>& x)
{
#ifdef SACADO_DEBUG
  if (x.size() != Num)
    throw "CacheFad::operator-=() Error:  Attempt to assign with incompatible sizes";
#endif

  // Compute value
  T xval = x.val();

  for(int i=0; i<Num; ++i)
    dx_[i] -= x.fastAccessDx(i);

  val_ -= xval;

  return *this;
}
inline Sacado::CacheFad::Expr< Sacado::CacheFad::SFadExprTag<T,Num> >& 
Sacado::CacheFad::Expr< Sacado::CacheFad::SFadExprTag<T,Num> >::
operator += (const Sacado::CacheFad::Expr<S>& x)
{
#ifdef SACADO_DEBUG
  if (x.size() != Num)
    throw "CacheFad::operator+=() Error:  Attempt to assign with incompatible sizes";
#endif

  x.cache();

  for (int i=0; i<Num; ++i)
    dx_[i] += x.fastAccessDx(i);
 
  update_val_ = x.updateValue();
  if (update_val_)
    val_ += x.val();

  return *this;
}