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 "SundanceDiscreteFuncElement.hpp"
00043 #include "SundanceDiscreteFunctionStub.hpp"
00044
00045 #include "SundanceDeriv.hpp"
00046
00047 using namespace Sundance;
00048 using namespace Sundance;
00049
00050 using namespace Sundance;
00051 using namespace Sundance;
00052 using namespace Teuchos;
00053
00054
00055 DiscreteFuncElement
00056 ::DiscreteFuncElement(const RCP<DiscreteFuncDataStub>& data,
00057 const std::string& name,
00058 const std::string& suffix,
00059 const FunctionIdentifier& fid, int myIndex)
00060 : EvaluatableExpr(),
00061 FuncElementBase(name, suffix, fid),
00062 commonData_(data),
00063 miSet_(),
00064 myIndex_(myIndex)
00065 {}
00066
00067
00068 RCP<Array<Set<MultipleDeriv> > > DiscreteFuncElement
00069 ::internalDetermineR(const EvalContext& context,
00070 const Array<Set<MultipleDeriv> >& RInput) const
00071 {
00072 Tabs tab(0);
00073 int verb = context.setupVerbosity();
00074 SUNDANCE_MSG2(verb, tab << "DFE::internalDetermineR() for "
00075 << toString());
00076 Array<Set<MultipleDeriv> > RIn = RInput;
00077 Set<MultiIndex> miSet = activeSpatialDerivs(context);
00078
00079 for (Set<MultiIndex>::const_iterator i=miSet.begin(); i!=miSet.end(); i++)
00080 {
00081 const MultiIndex& mi = *i;
00082 int order = mi.order();
00083 if (order==0) RIn[0].put(MultipleDeriv());
00084 if (order==1) RIn[1].put(MultipleDeriv(coordDeriv(mi)));
00085 }
00086
00087 return EvaluatableExpr::internalDetermineR(context, RIn);
00088 }
00089
00090
00091 Set<MultipleDeriv>
00092 DiscreteFuncElement::internalFindW(int order, const EvalContext& context) const
00093 {
00094 Tabs tab(0);
00095 int verb = context.setupVerbosity();
00096 SUNDANCE_MSG2(verb, tab << "DFE::internalFindW(order=" << order << ") for "
00097 << toString());
00098 Set<MultipleDeriv> rtn;
00099
00100 Set<MultiIndex> miSet = activeSpatialDerivs(context);
00101
00102 if (order==0)
00103 {
00104 if (miSet.contains(MultiIndex())) rtn.put(MultipleDeriv());
00105 }
00106 if (order==1)
00107 {
00108 for (Set<MultiIndex>::const_iterator i=miSet.begin(); i!=miSet.end(); i++)
00109 {
00110 const MultiIndex& mi = *i;
00111 int diffOrder = mi.order();
00112 if (diffOrder==1)
00113 rtn.put(MultipleDeriv(coordDeriv(mi)));
00114 }
00115 }
00116
00117 SUNDANCE_MSG3(verb, tab << "W[" << order << "]=" << rtn);
00118 SUNDANCE_MSG3(verb, tab << "done with DFE::internalFindW(" << order << ") for "
00119 << toString());
00120 return rtn;
00121 }
00122
00123 Set<MultipleDeriv>
00124 DiscreteFuncElement::internalFindV(int order, const EvalContext& context) const
00125 {
00126 Tabs tab(0);
00127 int verb = context.setupVerbosity();
00128 SUNDANCE_MSG2(verb, tab << "DFE::internalFindV(order=" << order << ") for "
00129 << toString());
00130 Set<MultipleDeriv> rtn;
00131 Set<MultiIndex> miSet = activeSpatialDerivs(context);
00132
00133 if (order==0)
00134 {
00135 if (miSet.contains(MultiIndex())) rtn.put(MultipleDeriv());
00136 }
00137 if (order==1)
00138 {
00139 for (Set<MultiIndex>::const_iterator i=miSet.begin(); i!=miSet.end(); i++)
00140 {
00141 const MultiIndex& mi = *i;
00142 int diffOrder = mi.order();
00143 if (diffOrder==1)
00144 rtn.put(MultipleDeriv(coordDeriv(mi)));
00145 }
00146 }
00147
00148 rtn = rtn.intersection(findR(order, context));
00149
00150 SUNDANCE_MSG2(verb, tab << "V[" << order << "]=" << rtn);
00151 SUNDANCE_MSG2(verb, tab << "done with DFE::internalFindV(" << order << ") for "
00152 << toString());
00153 return rtn;
00154 }
00155
00156 Set<MultipleDeriv>
00157 DiscreteFuncElement::internalFindC(int order, const EvalContext& context) const
00158 {
00159 Tabs tab(0);
00160 SUNDANCE_MSG2(context.setupVerbosity(),
00161 tab << "DFE::internalFindC is a no-op");
00162 Set<MultipleDeriv> rtn;
00163 return rtn;
00164 }
00165
00166 void DiscreteFuncElement::addMultiIndex(const MultiIndex& newMi) const
00167 {
00168 miSet_.put(newMi);
00169 }
00170
00171 XMLObject DiscreteFuncElement::toXML() const
00172 {
00173 XMLObject rtn("DiscreteFuncElement");
00174 rtn.addAttribute("name", name());
00175 return rtn;
00176 }
00177
00178
00179 bool DiscreteFuncElement::lessThan(const ScalarExpr* other) const
00180 {
00181 const DiscreteFuncElement* p
00182 = dynamic_cast<const DiscreteFuncElement*>(other);
00183 TEUCHOS_TEST_FOR_EXCEPT(p==0);
00184
00185 return fid() < p->fid();
00186 }