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 #include "SundanceEvaluatorFactory.hpp"
00032 #include "SundanceInstructionCachingEvaluator.hpp"
00033 #include "SundanceEvaluator.hpp"
00034 #include "SundanceCoordExpr.hpp"
00035 #include "SundanceCurveNormExpr.hpp"
00036 #include "SundanceCurveNormEvaluator.hpp"
00037 #include "SundanceSpatiallyConstantExpr.hpp"
00038 #include "SundanceSymbolicFuncElement.hpp"
00039 #include "SundanceDiscreteFuncElement.hpp"
00040
00041 using namespace Sundance;
00042 using namespace Teuchos;
00043
00044
00045 EvaluatorFactory::EvaluatorFactory()
00046 {;}
00047
00048 Evaluator* EvaluatorFactory::commonCreate(const EvaluatableExpr* expr,
00049 const EvalContext& context,
00050 int topLevelDiffOrder) const
00051 {
00052 const CoordExpr* c = dynamic_cast<const CoordExpr*>(expr);
00053 if (c != 0)
00054 {
00055 return new CoordExprEvaluator(c, context, topLevelDiffOrder);
00056 }
00057
00058 const SpatiallyConstantExpr* sc
00059 = dynamic_cast<const SpatiallyConstantExpr*>(expr);
00060 if (sc != 0)
00061 {
00062 return new ConstantEvaluator(sc, context, topLevelDiffOrder);
00063 }
00064
00065 const SymbolicFuncElement* u
00066 = dynamic_cast<const SymbolicFuncElement*>(expr);
00067 if (u != 0)
00068 {
00069 return new SymbolicFuncElementEvaluator(u, context, topLevelDiffOrder);
00070 }
00071
00072 const DiscreteFuncElement* df
00073 = dynamic_cast<const DiscreteFuncElement*>(expr);
00074 if (df != 0)
00075 {
00076 return new DiscreteFuncElementEvaluator(df, context, topLevelDiffOrder);
00077 }
00078
00079 const CurveNormExpr* cne
00080 = dynamic_cast<const DiscreteFuncElement*>(expr);
00081 if (cne != 0)
00082 {
00083 return new CurveNormEvaluator(cne, context, topLevelDiffOrder);
00084 }
00085
00086 TEUCHOS_TEST_FOR_EXCEPTION(true, std::logic_error,
00087 "EvaluatorFactory::commonCreate() could not create an "
00088 "evaluator for " << expr->toString());
00089
00090 return 0;
00091 }
00092
00093
00094 RCP<EvaluatorFactory>& EvaluatorFactory::defaultEvaluator()
00095 {
00096 static RCP<EvaluatorFactory> rtn
00097 = rcp(new InstructionCachingEvaluatorFactory());
00098 return rtn;
00099 }