void fixFZeroSign(bool sign) { rp -= (rp | nhat) * nhat; rp += nhat * (wallnHatPosition() + Sigma); double Fval = F_zeroDeriv(); size_t loop(1); while (sign ? (Fval < 0) : (Fval > 0)) { rp -= nhat * ((loop++) * std::numeric_limits<double>::epsilon()) * Sigma; Fval = F_zeroDeriv(); } }
double eval() const { switch (deriv) { case 0: return (rp | nhat) - ( Sigma + wallnHatPosition()); case 1: return (vp | nhat) - velnHatWall(); case 2: return Delta * Omega * Omega * std::cos(Omega * t); default: M_throw() << "Invalid access"; } }
double F_zeroDeriv() const { return (rp | nhat) - ( Sigma + wallnHatPosition()); }
Vector wallPosition() const { return nhat * wallnHatPosition(); }
virtual bool test_root() const { return (((vp | nhat) - velnHatWall()) * ((rp | nhat) - wallnHatPosition())) > 0; }