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 "SundanceCoordExpr.hpp"
00032 #include "SundanceEvalManager.hpp"
00033 #include "SundanceSparsitySuperset.hpp"
00034 #include "SundanceOut.hpp"
00035 #include "SundanceObjectWithVerbosity.hpp"
00036
00037 using namespace Sundance;
00038 using namespace Sundance;
00039 using namespace Teuchos;
00040
00041
00042 CoordExpr::CoordExpr(int dir, const std::string& name)
00043 : EvaluatableExpr(),
00044 dir_(dir),
00045 name_(coordName(dir, name))
00046 {}
00047
00048 bool CoordExpr::lessThan(const ScalarExpr* other) const
00049 {
00050 const CoordExpr* c = dynamic_cast<const CoordExpr*>(other);
00051 TEUCHOS_TEST_FOR_EXCEPTION(c==0, std::logic_error, "cast should never fail at this point");
00052 return dir() < c->dir();
00053 }
00054
00055 XMLObject CoordExpr::toXML() const
00056 {
00057 XMLObject rtn("CoordExpr");
00058 rtn.addAttribute("dir", Teuchos::toString(dir_));
00059 rtn.addAttribute("name", name());
00060 return rtn;
00061 }
00062
00063 string CoordExpr::coordName(int dir, const std::string& name)
00064 {
00065 if (name.length() > 0) return name;
00066 switch(dir)
00067 {
00068 case 0:
00069 return "x";
00070 case 1:
00071 return "y";
00072 case 2:
00073 return "z";
00074 default:
00075 TEUCHOS_TEST_FOR_EXCEPTION(true, std::runtime_error,
00076 "CoordExpr::coordName direction out of range [0,2]");
00077 return "error";
00078 }
00079 }
00080
00081
00082 Set<MultipleDeriv>
00083 CoordExpr::internalFindW(int order, const EvalContext& context) const
00084 {
00085 Tabs tab0;
00086 SUNDANCE_VERB_HIGH(tab0 << "CoordExpr::internalFindW() for " << toString());
00087 Set<MultipleDeriv> rtn;
00088
00089 if (order==0) rtn.put(MultipleDeriv());
00090
00091 if (order==1)
00092 {
00093 Deriv x = coordDeriv(dir_);
00094 MultipleDeriv md;
00095 md.put(x);
00096 rtn.put(md);
00097 }
00098
00099 SUNDANCE_VERB_HIGH(tab0 << "W[" << order << "]=" << rtn);
00100 return rtn;
00101 }
00102
00103
00104 Set<MultipleDeriv>
00105 CoordExpr::internalFindV(int order, const EvalContext& context) const
00106 {
00107 Tabs tab0;
00108 SUNDANCE_VERB_HIGH(tab0 << "CoordExpr::internalFindV() for " << toString());
00109 Set<MultipleDeriv> rtn;
00110
00111 if (order==0) rtn.put(MultipleDeriv());
00112
00113 SUNDANCE_VERB_HIGH(tab0 << "V[" << order << "]=" << rtn);
00114 return rtn;
00115 }
00116
00117
00118 Set<MultipleDeriv>
00119 CoordExpr::internalFindC(int order, const EvalContext& context) const
00120 {
00121 Tabs tab0;
00122 SUNDANCE_VERB_HIGH(tab0 << "CoordExpr::internalFindC() for " << toString());
00123 Set<MultipleDeriv> rtn;
00124
00125 if (order==1)
00126 {
00127 Deriv x = coordDeriv(dir_);
00128 MultipleDeriv md;
00129 md.put(x);
00130 rtn.put(md);
00131 }
00132 SUNDANCE_VERB_HIGH(tab0 << "C[" << order << "]=" << rtn);
00133 return rtn;
00134 }
00135
00136
00137
00138
00139
00140