00001 #ifndef DISCRETEFUNCTIONDERIV_H 00002 #define DISCRETEFUNCTIONDERIV_H 00003 00004 #include "SundanceDefs.h" 00005 00006 #include "DiscreteFunction.h" 00007 00008 00009 namespace Sundance 00010 { 00011 00012 using namespace TSF; 00013 using std::string; 00014 00015 using std::ostream; 00016 00017 /** \ingroup LowLevelSymbolics 00018 * The derivative of a discrete function 00019 */ 00020 00021 class DiscreteFunctionDeriv : public FuncExprBase 00022 { 00023 public: 00024 /** \name Developer-only methods */ 00025 //@{ 00026 /** Construct with an Expr (which had better be a DiscreteFunction) and 00027 a multiindex */ 00028 DiscreteFunctionDeriv(const Expr& func, const MultiIndex& deriv); 00029 /** */ 00030 virtual ~DiscreteFunctionDeriv(){;} 00031 00032 /** */ 00033 virtual void evaluate(const WorkSet& workSet, 00034 const QuadratureFamily& quadFamily, 00035 DenseSerialVector& result) const ; 00036 /** */ 00037 virtual double norm() const ; 00038 /** */ 00039 virtual double maxNorm() const ; 00040 /** */ 00041 virtual void getVector(TSFVector& vector) const ; 00042 00043 /** */ 00044 virtual ExprValue average(const Cell& cell) const ; 00045 00046 /** */ 00047 virtual const MultiIndex& multiIndex() const {return d_;} 00048 00049 // differentiation 00050 /** */ 00051 virtual void derivative(const MultiIndex& d, Expr& result) const ; 00052 00053 00054 // ordering and RTTI 00055 /** */ 00056 virtual bool operator==(const Expr& other) const ; 00057 /** */ 00058 virtual bool operator<(const Expr& other) const ; 00059 /** */ 00060 virtual int sortPriority() const {return DISCRETEFUNCTIONDERIV;} 00061 /** */ 00062 virtual bool isDiscreteFunction() const {return true;} 00063 00064 // misc 00065 /** */ 00066 virtual ExprBase* clone() const ; 00067 /** */ 00068 virtual void print(ostream& os, bool paren=false) const ; 00069 00070 /** */ 00071 virtual string toString(bool paren=false) const ; 00072 00073 /** */ 00074 virtual XMLObject toXML() const ; 00075 00076 // FE support 00077 /** */ 00078 virtual void getBasis(BasisFamily& basis) const {basis = f_.getBasis();} 00079 00080 //@} 00081 private: 00082 00083 Expr f_; 00084 MultiIndex d_; 00085 }; 00086 00087 } 00088 #endif 00089 00090 00091 00092