/* Example programs from the book Scientific and Engineering Programming in C++: An Introduction with Advanced Techniques and Examples, Addison-Wesley, 1994. (c) COPYRIGHT INTERNATIONAL BUSINESS MACHINES CORPORATION 1994. ALL RIGHTS RESERVED. See README file for further details. */ #ifndef Rall1dH #define Rall1dH #include "AutoDeriv/TaylorCoefficient1d.h" #include "Algebra/DivisionAlgebraCategory.h" #include "Algebra/MetricSpaceCategory.h" #include "SciEng/EquivalentCategory.h" #include "SciEng/ArrayErr.h" #include "SciEng/String.h" class RallDivideZeroErr : public SciEngErr { public: RallDivideZeroErr(){} virtual String message() const { return "Rall: divide by zero!"; } }; class RallInvalidUnitErr : public SciEngErr { public: RallInvalidUnitErr() {} virtual String message() const { return "Rall Number unit vector invalid...too many variables? Zero is first, nvars-1 is max."; } }; template // T element type, V gradient vector type. class Rall1d : public DivisionAlgebraCategory< Rall1d ,T>, public EquivalentCategory< Rall1d >, public MetricSpaceCategory< Rall1d, Rall1d > { public: typedef T EltT; Rall1d(){} // Constant, zero. Rall1d(const T& c, Subscript nvars = 1); // Constant. Rall1d(const T& t, Subscript i_th, Subscript nvars); // i_th unit vector, value t. Rall1d(const Rall1d& r); Rall1d(const T& tn, const V& vn); Rall1d& operator=(const T& c); // Change to constant, value c. Rall1d& operator=(const Rall1d& r); // Algebra interface Rall1d& operator*=(const Rall1d& rhs); Rall1d& setToOne(); Rall1d& operator/=(const Rall1d& rhs); Rall1d& operator+=(const Rall1d& rhs); Rall1d& setToZero(); Rall1d& operator-=(const Rall1d& rhs); Rall1d& operator*=(const T& s); Rall1d& operator/=(const T& s); Rall1d dot(const Rall1d& rhs) const { return *this * rhs; } Boolean equivalentTo(const Rall1d& rhs) const; // Transcendental Functions friend Rall1d exp(const Rall1d&); friend Rall1d sqrt(const Rall1d&); friend Rall1d log(const Rall1d&); friend Rall1d log10(const Rall1d&); friend Rall1d cos(const Rall1d&); friend Rall1d sin(const Rall1d&); friend Rall1d acos(const Rall1d&); friend Rall1d asin(const Rall1d&); T& value() { return t; } const T& value() const { return t; } V& gradient() { return grad; } const V& gradient() const { return grad; } friend ostream& operator<<(ostream& os, const Rall1d& r); protected: T t; V grad; void make_unit(Subscript i_th); }; template class TaylorCoefficient1d; template TaylorCoefficient1d reform(const Rall1d& r); #ifdef XLC_QNOTEMPINC #include "AutoDeriv/Rall1d.c" #endif #endif