SundanceEvaluatableExpr.hpp
Go to the documentation of this file.
00001 /* @HEADER@ */
00002 // ************************************************************************
00003 // 
00004 //                              Sundance
00005 //                 Copyright (2005) Sandia Corporation
00006 // 
00007 // Copyright (year first published) Sandia Corporation.  Under the terms 
00008 // of Contract DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government 
00009 // retains certain rights in this software.
00010 // 
00011 // This library is free software; you can redistribute it and/or modify
00012 // it under the terms of the GNU Lesser General Public License as
00013 // published by the Free Software Foundation; either version 2.1 of the
00014 // License, or (at your option) any later version.
00015 //  
00016 // This library is distributed in the hope that it will be useful, but
00017 // WITHOUT ANY WARRANTY; without even the implied warranty of
00018 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00019 // Lesser General Public License for more details.
00020 //                                                                                 
00021 // You should have received a copy of the GNU Lesser General Public
00022 // License along with this library; if not, write to the Free Software
00023 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
00024 // USA                                                                                
00025 // Questions? Contact Kevin Long (krlong@sandia.gov), 
00026 // Sandia National Laboratories, Livermore, California, USA
00027 // 
00028 // ************************************************************************
00029 /* @HEADER@ */
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   /** Ctor is empty, but has some internal initialization to do
00088    * and so must be called by all subclasses */
00089   EvaluatableExpr();
00090 
00091   /** virtual dtor */
00092   virtual ~EvaluatableExpr(){;}
00093 
00094 
00095   /** \name Evaluation */
00096   //@{
00097   /**
00098    * Evaluate this expression in the given region, putting the results
00099    * of the evaluation in the results argument. 
00100    */
00101   void evaluate(const EvalManager& mgr,
00102     Array<double>& constantResults,
00103     Array<RCP<EvalVector> >& vectorResults) const ;
00104   //@}
00105 
00106   /** \name Preprocessing */
00107   //@{
00108   /**
00109    * 
00110    */
00111   virtual void setupEval(const EvalContext& context) const ;
00112 
00113       
00114 
00115 
00116   /** Return the set of all nonzero derivatives
00117    * required in the given context */
00118   RCP<SparsitySuperset> sparsitySuperset(const EvalContext& context) const ;
00119 
00120   //@}
00121       
00122 
00123 
00124 
00125   /** Utility to downcast an expression to an evaluatable expr. Throws
00126    * an exception if the cast fails. */
00127   static const EvaluatableExpr* getEvalExpr(const Expr& expr);
00128 
00129   /** Return the evaluator to be used for the given context */
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    * Find the maximum differentiation order acting on discrete
00142    * functions in this expression. This is needed to identify
00143    * expressions where cofacet Jacobians are needed to transform  
00144    * discrete function derivatives.
00145    *
00146    * The base class implementation is a no-op.
00147    */
00148   virtual int maxDiffOrderOnDiscreteFunctions() const {return 0;}
00149 
00150   /**
00151    * Indicate whether this expression contains discrete functions.
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   /** Find spatially-variable functional derivatives. Default implementation
00167    * returns R */
00168   virtual Set<MultipleDeriv> 
00169   internalFindV(int order, const EvalContext& context) const
00170     {return findR(order, context);}
00171 
00172   /** Find spatially-constant functional derivatives. Default implementation
00173    * returns the empty set */
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   /** Record the evaluator to be used for the given context */
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    * evaluators, indexed by context 
00291    */
00292   mutable Map<EvalContext, RCP<Evaluator> > evaluators_;
00293 
00294   /** 
00295    * supersets of nonzero derivatives to be computed, index by
00296    * context
00297    */
00298   mutable Map<EvalContext, RCP<SparsitySuperset> > sparsity_;
00299 
00300   /** Polynomial order of the dependency upon each coordinate direction */
00301   Array<int> orderOfDependency_;
00302 
00303   /** Set of function combinations appearing in nonzero mixed partials */ 
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

Site Contact