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
00043 #include "SundanceProductExpr.hpp"
00044 #include "SundanceProductEvaluator.hpp"
00045 #include "SundanceDeriv.hpp"
00046
00047 #include "SundanceOut.hpp"
00048 #include "PlayaTabs.hpp"
00049
00050 using namespace Sundance;
00051 using namespace Sundance;
00052
00053 using namespace Sundance;
00054 using namespace Teuchos;
00055
00056
00057
00058 ProductExpr::ProductExpr(const RCP<ScalarExpr>& left,
00059 const RCP<ScalarExpr>& right)
00060 : BinaryExpr(left, right, 1)
00061 {}
00062
00063
00064 Evaluator* ProductExpr::createEvaluator(const EvaluatableExpr* expr,
00065 const EvalContext& context) const
00066 {
00067 return new ProductEvaluator(dynamic_cast<const ProductExpr*>(expr), context);
00068 }
00069
00070 bool ProductExpr::isHungryDiffOp() const
00071 {
00072 return rightScalar()->isHungryDiffOp();
00073 }
00074
00075
00076
00077 const std::string& ProductExpr::xmlTag() const
00078 {
00079 static std::string timesStr = "Times";
00080 static std::string divideStr = "Divide";
00081 if (sign() < 0) return divideStr;
00082 return timesStr;
00083 }
00084
00085 const std::string& ProductExpr::opChar() const
00086 {
00087 static std::string timesStr = "*";
00088 static std::string divideStr = "/";
00089 if (sign() < 0) return divideStr;
00090 return timesStr;
00091 }
00092
00093
00094
00095 Set<MultiSet<int> > ProductExpr::internalFindQ_W(int order, const EvalContext& context) const
00096 {
00097 Tabs tab0(0);
00098 int verb = context.setupVerbosity();
00099 SUNDANCE_MSG2(verb, tab0 << "ProdExpr::internalFindQ_W(" << order << ")");
00100
00101 Set<MultiSet<int> > rtn;
00102 if (order > 2) return rtn;
00103
00104 if (order==2)
00105 {
00106 rtn.put(makeMultiSet<int>(0,1));
00107 return rtn;
00108 }
00109
00110 Tabs tab1;
00111 SUNDANCE_MSG3(verb, tab1 << "calling findW(0) for left");
00112 const Set<MultipleDeriv>& wLeft
00113 = leftEvaluatable()->findW(0, context);
00114 SUNDANCE_MSG3(verb, tab1 << "found wLeft(0)=" << wLeft);
00115
00116 SUNDANCE_MSG3(verb, tab1 << "calling findW(0) for right");
00117 const Set<MultipleDeriv>& wRight
00118 = rightEvaluatable()->findW(0, context);
00119 SUNDANCE_MSG3(verb, tab1 << "found wRight(0)=" << wRight);
00120
00121 if (order==0)
00122 {
00123 if (wLeft.size() > 0)
00124 {
00125 rtn.put(makeMultiSet<int>(0));
00126 }
00127 if (wRight.size() > 0)
00128 {
00129 rtn.put(makeMultiSet<int>(1));
00130 }
00131 }
00132
00133 if (order==1)
00134 {
00135 if (wLeft.size() > 0) rtn.put(makeMultiSet<int>(1));
00136 if (wRight.size() > 0) rtn.put(makeMultiSet<int>(0));
00137 }
00138
00139 SUNDANCE_MSG2(verb, tab0 << "Q_W[" << order << "]=" << rtn);
00140 return rtn;
00141 }
00142
00143
00144 Set<MultiSet<int> > ProductExpr::internalFindQ_V(int order, const EvalContext& context) const
00145 {
00146 Tabs tab0(0);
00147 int verb = context.setupVerbosity();
00148 SUNDANCE_MSG2(verb, tab0 << "ProdExpr::internalFindQ_V(" << order << ")");
00149
00150 Set<MultiSet<int> > rtn;
00151 if (order > 1) return rtn;
00152
00153 const Set<MultipleDeriv>& vLeft
00154 = leftEvaluatable()->findV(0, context);
00155 const Set<MultipleDeriv>& vRight
00156 = rightEvaluatable()->findV(0, context);
00157
00158 if (order==0)
00159 {
00160 if (vLeft.size() > 0)
00161 {
00162 rtn.put(makeMultiSet<int>(0));
00163 }
00164 if (vRight.size() > 0)
00165 {
00166 rtn.put(makeMultiSet<int>(1));
00167 }
00168 }
00169
00170 if (order==1)
00171 {
00172 if (vLeft.size() > 0) rtn.put(makeMultiSet<int>(1));
00173 if (vRight.size() > 0) rtn.put(makeMultiSet<int>(0));
00174 }
00175
00176 SUNDANCE_MSG2(verb, tab0 << "Q_V[" << order << "]=" << rtn);
00177 return rtn;
00178 }
00179