00001 #ifndef SUNDANCE_DIFFOPEVALUATOR_H
00002 #define SUNDANCE_DIFFOPEVALUATOR_H
00003 
00004 #include "SundanceDefs.hpp"
00005 #include "SundanceUnaryEvaluator.hpp"
00006 #include "Teuchos_TimeMonitor.hpp"
00007 
00008 namespace Sundance 
00009 {
00010 class DiffOp;
00011 class DiscreteFuncElementEvaluator;
00012     
00013 
00014 
00015 
00016 class DiffOpEvaluator : public UnaryEvaluator<DiffOp>
00017 {
00018 public:
00019 
00020   DiffOpEvaluator(const DiffOp* expr,
00021     const EvalContext& context);
00022 
00023 
00024   virtual ~DiffOpEvaluator(){;}
00025 
00026 
00027   virtual void internalEval(const EvalManager& mgr,
00028     Array<double>& constantResults,
00029     Array<RCP<EvalVector> >& vectorResults) const ;
00030 
00031 
00032 
00033 
00034   virtual void resetNumCalls() const ;
00035 
00036 
00037   TEUCHOS_TIMER(evalTimer, "diff op evaluation");
00038 private:
00039 
00040   Set<MultipleDeriv> increasedDerivs(const MultipleDeriv& mu,
00041     const Set<MultipleDeriv>& W1, int verb) const ;
00042 
00043   Set<MultipleDeriv> backedDerivs(const MultipleDeriv& mu,
00044     const Set<MultipleDeriv>& W1, int verb) const ;
00045 
00046   Deriv remainder(const MultipleDeriv& big, 
00047     const MultipleDeriv& little, int verb) const ;
00048 
00049   Array<int> isConstant_;
00050 
00051   Array<int> resultIndices_;
00052       
00053   Array<Array<int> > constantMonomials_;
00054 
00055   Array<Array<int> > vectorMonomials_;
00056 
00057   Array<Array<int> > constantFuncCoeffs_;
00058 
00059   Array<Array<int> > vectorFuncCoeffs_;
00060 
00061   Array<const DiscreteFuncElementEvaluator*> funcEvaluators_;
00062 
00063 
00064 
00065   Array<Array<int> > constantCoeffFuncIndices_;
00066 
00067 
00068 
00069   Array<Array<int> > constantCoeffFuncMi_;
00070 
00071 
00072 
00073   Array<Array<int> > vectorCoeffFuncIndices_;
00074 
00075 
00076 
00077   Array<Array<int> > vectorCoeffFuncMi_;
00078 }; 
00079 }
00080 
00081 
00082 #endif