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