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_EVALUATABLEEXPR_H
00032 #define SUNDANCE_EVALUATABLEEXPR_H
00033
00034
00035
00036 #include "SundanceDefs.hpp"
00037 #include "SundanceScalarExpr.hpp"
00038 #include "SundanceEvaluatorFactory.hpp"
00039 #include "SundanceFuncSetAccumulator.hpp"
00040 #include "SundanceMap.hpp"
00041 #include "SundanceDerivSet.hpp"
00042 #include "SundanceEvalContext.hpp"
00043 #include "SundanceEvalVector.hpp"
00044 #include "SundanceSparsitySuperset.hpp"
00045 #include "SundanceObjectWithVerbosity.hpp"
00046 #include "Teuchos_TimeMonitor.hpp"
00047
00048 namespace Sundance
00049 {
00050 using namespace Sundance;
00051 using namespace Teuchos;
00052 using namespace Sundance;
00053
00054
00055
00056 class Expr;
00057 class MultipleDeriv;
00058
00059 class EvalManager;
00060 class Evaluator;
00061 class EvaluatorFactory;
00062
00063
00064
00065
00066 enum DerivSubsetSpecifier {AllNonzeros,
00067 RequiredNonzeros,
00068 VariableNonzeros,
00069 ConstantNonzeros};
00070
00071
00072
00073
00074
00075 class EvaluatableExpr : public virtual ScalarExpr,
00076 public virtual EvaluatorFactory,
00077 public virtual FuncSetAccumulator,
00078 public ObjectWithClassVerbosity<EvaluatableExpr>
00079 {
00080 typedef OrderedQuartet<EvalContext,
00081 Set<MultiIndex>,
00082 Set<MultiSet<int> >,
00083 bool> NonzeroSpecifier ;
00084
00085
00086 public:
00087
00088
00089 EvaluatableExpr();
00090
00091
00092 virtual ~EvaluatableExpr(){;}
00093
00094
00095
00096
00097
00098
00099
00100
00101 void evaluate(const EvalManager& mgr,
00102 Array<double>& constantResults,
00103 Array<RCP<EvalVector> >& vectorResults) const ;
00104
00105
00106
00107
00108
00109
00110
00111 virtual void setupEval(const EvalContext& context) const ;
00112
00113
00114
00115
00116
00117
00118 RCP<SparsitySuperset> sparsitySuperset(const EvalContext& context) const ;
00119
00120
00121
00122
00123
00124
00125
00126
00127 static const EvaluatableExpr* getEvalExpr(const Expr& expr);
00128
00129
00130 const RCP<Evaluator>& evaluator(const EvalContext& context) const;
00131
00132
00133 virtual void showSparsity(std::ostream& os,
00134 const EvalContext& context) const ;
00135
00136
00137
00138 virtual int countNodes() const ;
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148 virtual int maxDiffOrderOnDiscreteFunctions() const {return 0;}
00149
00150
00151
00152
00153 virtual bool hasDiscreteFunctions() const {return false;}
00154
00155
00156 virtual bool nodesHaveBeenCounted() const {return nodesHaveBeenCounted_;}
00157
00158
00159 static int maxFuncDiffOrder() {static int rtn=3; return rtn;}
00160
00161
00162
00163 virtual Set<MultipleDeriv>
00164 internalFindW(int order, const EvalContext& context) const = 0 ;
00165
00166
00167
00168 virtual Set<MultipleDeriv>
00169 internalFindV(int order, const EvalContext& context) const
00170 {return findR(order, context);}
00171
00172
00173
00174 virtual Set<MultipleDeriv>
00175 internalFindC(int order, const EvalContext& context) const
00176 {Set<MultipleDeriv> rtn; return rtn;}
00177
00178
00179
00180
00181 const Set<MultipleDeriv>&
00182 findDerivSubset(int order,
00183 const DerivSubsetSpecifier& dss,
00184 const EvalContext& context) const ;
00185
00186 const Set<MultipleDeriv>&
00187 findDerivSubset(const DerivSubsetSpecifier& dss,
00188 const EvalContext& context) const ;
00189
00190
00191 const Set<MultipleDeriv>& findW(int order,
00192 const EvalContext& context) const ;
00193
00194
00195 const Set<MultipleDeriv>& findR(int order,
00196 const EvalContext& context) const ;
00197
00198 const Set<MultipleDeriv>& findV(int order,
00199 const EvalContext& context) const ;
00200
00201 const Set<MultipleDeriv>& findC(int order,
00202 const EvalContext& context) const ;
00203
00204
00205
00206 const Set<MultipleDeriv>& findW(const EvalContext& context) const ;
00207
00208
00209 const Set<MultipleDeriv>& findR(const EvalContext& context) const ;
00210
00211 const Set<MultipleDeriv>& findV(const EvalContext& context) const ;
00212
00213 const Set<MultipleDeriv>& findC(const EvalContext& context) const ;
00214
00215
00216 virtual void displayNonzeros(std::ostream& os,
00217 const EvalContext& context) const ;
00218
00219
00220
00221 Set<MultipleDeriv> setProduct(const Set<MultipleDeriv>& a,
00222 const Set<MultipleDeriv>& b) const ;
00223
00224 Set<MultipleDeriv> setDivision(const Set<MultipleDeriv>& a,
00225 const Set<MultipleDeriv>& b) const ;
00226
00227 Set<MultiSet<int> > setDivision(const Set<MultiSet<int> >& s,
00228 int index) const ;
00229
00230
00231 void determineR(const EvalContext& context,
00232 const Array<Set<MultipleDeriv> >& RInput) const ;
00233
00234
00235 virtual RCP<Array<Set<MultipleDeriv> > >
00236 internalDetermineR(const EvalContext& context,
00237 const Array<Set<MultipleDeriv> >& RInput) const ;
00238
00239
00240 const Set<MultipleDeriv>& getR(int order, const EvalContext& context) const ;
00241
00242
00243
00244 Array<Set<MultipleDeriv> >
00245 computeInputR(const EvalContext& context,
00246 const Array<Set<MultiSet<int> > >& funcIDCombinations,
00247 const Array<Set<MultiIndex> >& spatialDerivs) const ;
00248
00249
00250
00251 virtual void registerSpatialDerivs(const EvalContext& context,
00252 const Set<MultiIndex>& miSet) const ;
00253
00254
00255 static Time& evaluationTimer() ;
00256
00257 protected:
00258
00259
00260 void registerEvaluator(const EvalContext& context,
00261 const RCP<Evaluator>& evaluator) const
00262 {return evaluators_.put(context, evaluator);}
00263
00264
00265 static bool isEvaluatable(const ExprBase* expr);
00266
00267
00268 Map<EvalContext, RCP<Evaluator> >& evaluators() const
00269 {return evaluators_;}
00270
00271
00272
00273 int maxOrder(const Set<MultiIndex>& m) const ;
00274
00275
00276 const Set<MultiIndex>& activeSpatialDerivs(const EvalContext& context) const ;
00277
00278
00279 std::string derivType(const DerivSubsetSpecifier& dss) const;
00280
00281
00282 void printR(int verb, const RCP<Array<Set<MultipleDeriv> > >& R) const ;
00283
00284 private:
00285
00286
00287 static int numDerivSubsetTypes() {static int rtn=4; return rtn;}
00288
00289
00290
00291
00292 mutable Map<EvalContext, RCP<Evaluator> > evaluators_;
00293
00294
00295
00296
00297
00298 mutable Map<EvalContext, RCP<SparsitySuperset> > sparsity_;
00299
00300
00301 Array<int> orderOfDependency_;
00302
00303
00304 Set<MultiSet<int> > funcIDSet_;
00305
00306
00307 Set<int> funcDependencies_;
00308
00309 mutable Set<NonzeroSpecifier> knownNonzeros_;
00310
00311 mutable bool nodesHaveBeenCounted_;
00312
00313 typedef Array<Map<EvalContext, Set<MultipleDeriv> > > contextToDSSMap_ele_t;
00314 mutable Array<contextToDSSMap_ele_t> contextToDSSMap_;
00315
00316 mutable bool rIsReady_;
00317
00318 mutable Array<Map<EvalContext, Set<MultipleDeriv> > > allOrdersMap_;
00319
00320 mutable Map<EvalContext, Set<MultiIndex> > activeSpatialDerivMap_;
00321 };
00322 }
00323
00324 #endif