Go to the documentation of this file.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
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042 #include "SundanceSubtypeEvaluator.hpp"
00043 #include "SundanceEvalManager.hpp"
00044 #include "SundanceCoordExpr.hpp"
00045 #include "PlayaExceptions.hpp"
00046 #include "SundanceSet.hpp"
00047 #include "PlayaTabs.hpp"
00048 #include "SundanceOut.hpp"
00049
00050 using namespace Sundance;
00051 using namespace Sundance;
00052
00053 using namespace Sundance;
00054 using namespace Teuchos;
00055
00056
00057 CoordExprEvaluator::CoordExprEvaluator(const CoordExpr* expr,
00058 const EvalContext& context)
00059 : SubtypeEvaluator<CoordExpr>(expr, context),
00060 doValue_(false),
00061 doDeriv_(false),
00062 stringRep_(expr->toString())
00063 {
00064 int verb = context.setupVerbosity();
00065 Tabs tabs;
00066 SUNDANCE_MSG1(verb, tabs << "initializing coord expr evaluator for "
00067 << expr->toString());
00068 SUNDANCE_MSG2(verb, tabs << "return sparsity " << std::endl << tabs << *(this->sparsity)());
00069
00070 TEUCHOS_TEST_FOR_EXCEPTION(this->sparsity()->numDerivs() > 2, std::logic_error,
00071 "CoordExprEvaluator ctor found a sparsity table "
00072 "with more than two entries. The bad sparsity table is "
00073 << *(this->sparsity)());
00074
00075
00076
00077
00078
00079
00080
00081 for (int i=0; i<this->sparsity()->numDerivs(); i++)
00082 {
00083 const MultipleDeriv& d = this->sparsity()->deriv(i);
00084
00085
00086 if (d.order()==0)
00087 {
00088 doValue_ = true;
00089 addVectorIndex(i, 0);
00090 }
00091 else
00092
00093 {
00094 TEUCHOS_TEST_FOR_EXCEPTION(!this->sparsity()->isSpatialDeriv(i), std::logic_error,
00095 "CoordExprEvaluator ctor found an entry in the "
00096 "sparsity superset that is not a spatial derivative. "
00097 "The bad entry is " << this->sparsity()->deriv(i)
00098 << ". The superset is "
00099 << *(this->sparsity)());
00100
00101 const MultiIndex& mi = this->sparsity()->multiIndex(i);
00102
00103 TEUCHOS_TEST_FOR_EXCEPTION(mi.order() != 1, std::logic_error,
00104 "CoordExprEvaluator ctor found a multiindex of "
00105 "order != 1. Bad multiindex is " << mi.toString());
00106
00107 TEUCHOS_TEST_FOR_EXCEPTION(mi[expr->dir()]!=1, std::logic_error,
00108 "CoordExprEvaluator sparsity pattern has an "
00109 "element corresponding to differentiation wrt "
00110 "a coordinate direction other than that of the "
00111 "coord expr's direction");
00112 doDeriv_ = true;
00113 addConstantIndex(i, 0);
00114 }
00115 }
00116
00117 }
00118
00119
00120
00121 void CoordExprEvaluator::internalEval(const EvalManager& mgr,
00122 Array<double>& constantResults,
00123 Array<RCP<EvalVector> >& vectorResults) const
00124 {
00125 Tabs tabs(0);
00126
00127 SUNDANCE_MSG1(mgr.verb(), tabs << "CoordExprEvaluator::eval() expr=" << expr()->toString());
00128
00129 SUNDANCE_MSG2(mgr.verb(), tabs << "sparsity = " << std::endl
00130 << *(this->sparsity)())
00131
00132 if (doValue_)
00133 {
00134 Tabs tab2;
00135 SUNDANCE_MSG3(mgr.verb(), tab2 << "computing value");
00136 vectorResults.resize(1);
00137 vectorResults[0] = mgr.popVector();
00138 mgr.evalCoordExpr(expr(), vectorResults[0]);
00139 mgr.stack().setVecSize(vectorResults[0]->length());
00140 vectorResults[0]->setString(stringRep_);
00141 }
00142
00143 if (doDeriv_)
00144 {
00145 Tabs tab2;
00146 SUNDANCE_MSG3(mgr.verb(), tab2 << "computing derivative");
00147 constantResults.resize(1);
00148 constantResults[0] = 1.0;
00149 }
00150
00151 if (mgr.verb() > 1)
00152 {
00153 Tabs tab1;
00154 Out::os() << tab1 << "results " << std::endl;
00155 mgr.showResults(Out::os(), this->sparsity(), vectorResults,
00156 constantResults);
00157 }
00158
00159 }
00160