00001 #ifndef UNKNOWNFEFUNC_H 00002 #define UNKNOWNFEFUNC_H 00003 00004 #include "SundanceDefs.h" 00005 00006 #include "SymbolicFunction.h" 00007 00008 00009 namespace Sundance 00010 { 00011 00012 using namespace TSF; 00013 using std::string; 00014 00015 using std::ostream; 00016 00017 /** 00018 * \ingroup UserLevelSymbolics 00019 * Expression subtype that can represent an unknown function in a 00020 * finite-element problem 00021 */ 00022 00023 class UnknownFunction : public SymbolicFunction 00024 { 00025 public: 00026 /** \name User-level methods */ 00027 //@{ 00028 /** Construct with a basis */ 00029 UnknownFunction(const BasisFamily& basis); 00030 /** Construct with a basis and a name */ 00031 UnknownFunction(const BasisFamily& basis, const string& name); 00032 //@} 00033 virtual ~UnknownFunction(){;} 00034 00035 /** \name Developer-only methods */ 00036 //@{ 00037 /** identify self as an unknown */ 00038 virtual bool isUnknown() const {return true;} 00039 00040 /** */ 00041 virtual void evaluate(const WorkSet& workSet, 00042 const QuadratureFamily& quadFamily, 00043 DenseSerialVector& result) const ; 00044 00045 /** */ 00046 virtual int sortPriority() const {return UNKNOWNFUNCTION;} 00047 00048 /** */ 00049 virtual ExprBase* clone() const ; 00050 00051 /** */ 00052 virtual void getVariation(Expr& result) const ; 00053 00054 /** */ 00055 virtual void getDifferential(Expr& result) const ; 00056 00057 /** */ 00058 virtual void setVariation(const Expr& v) ; 00059 00060 /** */ 00061 virtual void setDifferential(const Expr& du) ; 00062 00063 /** */ 00064 virtual void setFunctionValue(const Expr& u0) ; 00065 //@} 00066 00067 protected: 00068 mutable Expr value_; 00069 mutable Expr differential_; 00070 mutable Expr variation_; 00071 mutable bool hasDifferential_; 00072 mutable bool hasVariation_; 00073 // mutable ExprHashtable sensitivity_; 00074 }; 00075 00076 00077 } 00078 #endif