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_FUNCTIONALEVALUATOR_H
00032 #define SUNDANCE_FUNCTIONALEVALUATOR_H
00033 
00034 #include "SundanceDefs.hpp"
00035 #include "SundanceExpr.hpp"
00036 #include "PlayaVectorImpl.hpp"
00037 #include "PlayaVectorType.hpp"
00038 #include "SundanceFunctionalEvaluatorBase.hpp"
00039 
00040 namespace Sundance
00041 {
00042 
00043 using namespace Playa;
00044 using namespace Teuchos;
00045 
00046 class Mesh;
00047 class Assembler;
00048 
00049 
00050 
00051 
00052 class FunctionalEvaluator : public FunctionalEvaluatorBase
00053 {
00054 public:
00055 
00056   FunctionalEvaluator();
00057 
00058 
00059   FunctionalEvaluator(const Mesh& mesh, 
00060     const Expr& integral);
00061 
00062 
00063   FunctionalEvaluator(const Mesh& mesh, 
00064     const Expr& integral,
00065     const Expr& bcs,
00066     const Expr& var,
00067     const Expr& varEvalPts,
00068     const VectorType<double>& vectorType);
00069 
00070 
00071   FunctionalEvaluator(const Mesh& mesh, 
00072     const Expr& integral,
00073     const Expr& bcs,
00074     const Expr& vars,
00075     const Expr& varEvalPts,
00076     const Expr& fields,
00077     const Expr& fieldValues,
00078     const VectorType<double>& vectorType);
00079 
00080 
00081 
00082   double evaluate() const ;
00083 
00084 
00085   Expr evalGradient(double& value) const ;
00086 
00087 
00088   double fdGradientCheck(double h) const ;
00089           
00090 
00091 private:
00092 
00093 
00094   Vector<double> evalGradientVector(double& value) const ;
00095       
00096 
00097   RCP<Assembler> assembler_;
00098       
00099 
00100   mutable Expr varValues_;
00101 
00102 
00103   VectorType<double> vecType_;
00104       
00105 
00106   mutable Array<Vector<double> > gradient_;
00107       
00108 };
00109 
00110 
00111 double evaluateIntegral(const Mesh& mesh, const Expr& expr);
00112 
00113 
00114 }
00115 
00116 
00117 #endif