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