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 #include "SundanceUnknownParameterElement.hpp"
00032
00033
00034 #include "SundanceDerivSet.hpp"
00035 #include "SundanceTabs.hpp"
00036
00037
00038 using namespace Sundance;
00039 using namespace Sundance;
00040
00041 using namespace Sundance;
00042 using namespace Sundance;
00043 using namespace Teuchos;
00044
00045 UnknownParameterElement
00046 ::UnknownParameterElement(const std::string& name,
00047 const std::string& suffix,
00048 const FunctionIdentifier& fid)
00049 : UnknownFuncElement(rcp(new UnknownFuncDataStub()), name,
00050 suffix, fid),
00051 SpatiallyConstantExpr()
00052 {}
00053
00054
00055
00056 Set<MultipleDeriv>
00057 UnknownParameterElement::internalFindW(int order, const EvalContext& context) const
00058 {
00059 Tabs tab;
00060 SUNDANCE_MSG2(context.setupVerbosity(),
00061 tab << "in UPE::internalFindW, order=" << order);
00062 Set<MultipleDeriv> rtn;
00063
00064 if (order==0)
00065 {
00066 if (!evalPtIsZero()) rtn.put(MultipleDeriv());
00067 }
00068 else if (order==1)
00069 {
00070 MultipleDeriv md = makeMultiDeriv(funcDeriv(this));
00071 rtn.put(md);
00072 }
00073
00074 return rtn;
00075 }
00076
00077
00078
00079 Set<MultipleDeriv>
00080 UnknownParameterElement::internalFindV(int order, const EvalContext& context) const
00081 {
00082 Tabs tab;
00083 SUNDANCE_MSG2(context.setupVerbosity(),
00084 tab << "UPE::internalFindV is a no-op");
00085 Set<MultipleDeriv> rtn;
00086
00087 return rtn;
00088 }
00089
00090
00091 Set<MultipleDeriv>
00092 UnknownParameterElement::internalFindC(int order, const EvalContext& context) const
00093 {
00094 Tabs tab;
00095 SUNDANCE_MSG2(context.setupVerbosity(),
00096 tab << "in UPE::internalFindC, order=" << order);
00097 Set<MultipleDeriv> rtn;
00098
00099 if (order==0)
00100 {
00101 MultipleDeriv md;
00102 if (!evalPtIsZero()) rtn.put(md);
00103 }
00104
00105 if (order==1)
00106 {
00107 MultipleDeriv md = makeMultiDeriv(funcDeriv(this));
00108 rtn.put(md);
00109 }
00110 return rtn.intersection(UnknownFuncElement::findR(order, context));
00111 }
00112
00113
00114
00115 Evaluator* UnknownParameterElement
00116 ::createEvaluator(const EvaluatableExpr* expr,
00117 const EvalContext& context) const
00118 {
00119 return SymbolicFuncElement::createEvaluator(expr, context);
00120 }
00121
00122
00123 const Parameter* UnknownParameterElement::parameterValue() const
00124 {
00125 const Parameter* p = dynamic_cast<const Parameter*>(evalPt());
00126 TEST_FOR_EXCEPTION(p==0, InternalError,
00127 "UnknownParameter evalPt() is not a Parameter");
00128 return p;
00129 }
00130
00131 Parameter* UnknownParameterElement::parameterValue()
00132 {
00133 Parameter* p = dynamic_cast<Parameter*>(evalPt());
00134 TEST_FOR_EXCEPTION(p==0, InternalError,
00135 "UnknownParameter evalPt() is not a Parameter");
00136 return p;
00137 }
00138
00139
00140 bool UnknownParameterElement::lessThan(const ScalarExpr* other) const
00141 {
00142 const UnknownParameterElement* p
00143 = dynamic_cast<const UnknownParameterElement*>(other);
00144 TEST_FOR_EXCEPT(p==0);
00145
00146 if (name() < p->name()) return true;
00147
00148 TEST_FOR_EXCEPTION(name()==p->name() && this == p, RuntimeError,
00149 "detected two different parameters with the same name");
00150 return false;
00151 }
00152
00153
00154
00155
00156 XMLObject UnknownParameterElement::toXML() const
00157 {
00158 XMLObject rtn("UnknownParameterElement");
00159 rtn.addAttribute("name", name());
00160 return rtn;
00161 }
00162