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 "SundanceDiscreteFuncEvaluator.hpp"
00032 #include "SundanceEvalManager.hpp"
00033 #include "SundanceCoordExpr.hpp"
00034 #include "SundanceZeroExpr.hpp"
00035 #include "SundanceSpatiallyConstantExpr.hpp"
00036 #include "SundanceSymbolicFuncElement.hpp"
00037 #include "SundanceDiscreteFuncElement.hpp"
00038 #include "SundanceSet.hpp"
00039 #include "PlayaTabs.hpp"
00040 #include "SundanceOut.hpp"
00041
00042 using namespace Sundance;
00043 using namespace Sundance;
00044
00045 using namespace Sundance;
00046 using namespace Teuchos;
00047
00048
00049
00050 DiscreteFuncElementEvaluator
00051 ::DiscreteFuncElementEvaluator(const DiscreteFuncElement* expr,
00052 const EvalContext& context)
00053 : SubtypeEvaluator<DiscreteFuncElement>(expr, context),
00054 mi_(this->sparsity()->numDerivs()),
00055 miToIndexMap_(),
00056 stringReps_()
00057 {
00058 Tabs tabs;
00059 SUNDANCE_VERB_MEDIUM(tabs << "initializing discrete func evaluator for "
00060 << expr->toString());
00061
00062 SUNDANCE_VERB_MEDIUM(tabs << "return sparsity " << std::endl << *(this->sparsity()));
00063
00064 static Array<string> coordNames;
00065 if (coordNames.size() != 3)
00066 {
00067 coordNames.resize(3);
00068 coordNames[0] = "x";
00069 coordNames[1] = "y";
00070 coordNames[2] = "z";
00071 }
00072 std::string funcName = expr->name();
00073
00074 for (int i=0; i<this->sparsity()->numDerivs(); i++)
00075 {
00076
00077
00078 if (this->sparsity()->deriv(i).order()==0)
00079 {
00080 mi_[i] = MultiIndex();
00081 }
00082 else
00083 {
00084
00085 TEUCHOS_TEST_FOR_EXCEPTION(!this->sparsity()->isSpatialDeriv(i), std::logic_error,
00086 "DiscreteFuncElementEvaluator ctor found "
00087 "an entry in the sparsity superset that is not "
00088 "a spatial derivative. "
00089 "The bad entry is " << this->sparsity()->deriv(i)
00090 << ". The superset is "
00091 << *(this->sparsity)());
00092
00093 mi_[i] = this->sparsity()->multiIndex(i);
00094 }
00095 addVectorIndex(i,i);
00096 TEUCHOS_TEST_FOR_EXCEPTION(miToIndexMap_.containsKey(mi_[i]), std::logic_error,
00097 "DiscreteFuncElementEvaluator ctor detected a "
00098 "duplicate multiindex");
00099
00100 miToIndexMap_.put(mi_[i], i);
00101
00102 if (mi_[i].order()==0)
00103 {
00104 stringReps_.append(funcName);
00105 }
00106 else
00107 {
00108 int dir = mi_[i].firstOrderDirection();
00109 std::string deriv = "D[" + funcName + ", " + coordNames[dir] + "]";
00110 stringReps_.append(deriv);
00111 }
00112 }
00113
00114
00115 }
00116
00117 bool DiscreteFuncElementEvaluator::hasMultiIndex(const MultiIndex& mi) const
00118 {
00119 Tabs tabs;
00120 bool rtn = miToIndexMap_.containsKey(mi);
00121 SUNDANCE_VERB_MEDIUM(tabs << "checking for mi=" << mi << " for "
00122 << expr()->toString()
00123 << std::endl << tabs
00124 << " sparsity " << std::endl << *(this->sparsity()));
00125
00126 return rtn;
00127 }
00128
00129 int DiscreteFuncElementEvaluator::miIndex(const MultiIndex& mi) const
00130 {
00131 return miToIndexMap_.get(mi);
00132 }
00133
00134
00135 void DiscreteFuncElementEvaluator
00136 ::internalEval(const EvalManager& mgr,
00137 Array<double>& constantResults,
00138 Array<RCP<EvalVector> >& vectorResults) const
00139 {
00140 Tabs tabs(0);
00141 SUNDANCE_MSG1(mgr.verb(),
00142 tabs << "DiscreteFuncElementEvaluator::eval: expr="
00143 << expr()->toString());
00144
00145 vectorResults.resize(mi_.size());
00146 for (int i=0; i<mi_.size(); i++)
00147 {
00148 Tabs tab2;
00149 vectorResults[i] = mgr.popVector();
00150 TEUCHOS_TEST_FOR_EXCEPTION(!vectorResults[i]->isValid(),
00151 std::logic_error,
00152 "invalid evaluation vector allocated in "
00153 "DiscreteFuncElementEvaluator::internalEval()");
00154 SUNDANCE_MSG2(mgr.verb(),tab2<< "setting string rep " << stringReps_[i]);
00155 vectorResults[i]->setString(stringReps_[i]);
00156 }
00157 mgr.evalDiscreteFuncElement(expr(), mi_, vectorResults);
00158 mgr.stack().setVecSize(vectorResults[0]->length());
00159
00160 if (mgr.verb() > 1)
00161 {
00162 Out::os() << tabs << "results " << std::endl;
00163 mgr.showResults(Out::os(), sparsity(), vectorResults,
00164 constantResults);
00165 }
00166 SUNDANCE_MSG1(mgr.verb(), tabs << "DiscreteFuncEvaluator::eval() done");
00167 }
00168