00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 #ifndef SUNDANCE_USERDEFOPELEMENT_H
00032 #define SUNDANCE_USERDEFOPELEMENT_H
00033 
00034 
00035 #include "SundanceDefs.hpp"
00036 #include "SundanceScalarExpr.hpp"
00037 #include "SundanceEvalContext.hpp"
00038 #include "SundanceMultiSet.hpp"
00039 #include "SundanceSet.hpp"
00040 #include "SundanceMultipleDeriv.hpp"
00041 #include "SundanceUserDefFunctor.hpp"
00042 #include "SundanceUserDefFunctorElement.hpp"
00043 #include "SundanceUserDefOpEvaluator.hpp"
00044 
00045 
00046 namespace Sundance
00047 {
00048 using namespace Sundance;
00049 using namespace Teuchos;
00050 
00051 
00052 
00053 
00054 
00055 class UserDefOp;
00056 
00057 
00058 
00059 
00060 class UserDefOpElement : virtual public ExprWithChildren
00061 {
00062 public:
00063 
00064   UserDefOpElement(const Array<RCP<ScalarExpr> >& args,
00065     const RCP<Sundance::Map<EvalContext, RCP<const UserDefOpCommonEvaluator> > >& evalMap,
00066     const RCP<const UserDefFunctorElement>& functorElement);
00067 
00068 
00069   virtual ~UserDefOpElement() {;}
00070 
00071 
00072 
00073   int myIndex() const {return functorElement_->myIndex();}
00074 
00075 
00076 
00077   virtual std::ostream& toText(std::ostream& os, bool paren) const ;
00078 
00079 
00080   virtual XMLObject toXML() const ;
00081 
00082 
00083   virtual RCP<ExprBase> getRcp() {return rcp(this);}
00084 
00085 
00086   const UserDefFunctorElement* functorElement() const 
00087     {return functorElement_.get();}
00088 
00089 
00090   void reset() const ;
00091 
00092 
00093   Evaluator* createEvaluator(const EvaluatableExpr* expr,
00094     const EvalContext& context) const ;
00095 
00096 
00097   virtual void getArgDerivIndices(const Array<int>& orders,
00098     Sundance::Map<MultiSet<int>, int>& varArgDerivs,
00099     Sundance::Map<MultiSet<int>, int>& constArgDerivs) const ;
00100 
00101 protected:
00102 
00103 
00104   RCP<const UserDefOpCommonEvaluator> 
00105   getCommonEvaluator(const EvalContext& context) const ;
00106           
00107 private:
00108   mutable RCP<Sundance::Map<EvalContext, RCP<const UserDefOpCommonEvaluator> > > commonEvaluatorsMap_;
00109   const RCP<const UserDefFunctorElement> functorElement_;
00110 };
00111 }
00112 
00113 #endif