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 "SundanceSumOfIntegrals.hpp"
00032 #include "SundanceSpatiallyConstantExpr.hpp"
00033 #include "SundanceSpectralPreprocessor.hpp"
00034 #include "PlayaTabs.hpp"
00035
00036 using namespace Sundance;
00037 using namespace Teuchos;
00038
00039 SumOfIntegrals::SumOfIntegrals(const RCP<CellFilterStub>& region,
00040 const Expr& expr,
00041 const RCP<QuadratureFamilyStub>& quad,
00042 const WatchFlag& watch)
00043 : ScalarExpr(), rqcToExprMap_()
00044 {
00045 addTerm(region, expr, quad, ParametrizedCurve::returnDummyCurve() , watch, 1);
00046 }
00047
00048 SumOfIntegrals::SumOfIntegrals(const RCP<CellFilterStub>& region,
00049 const Expr& expr,
00050 const RCP<QuadratureFamilyStub>& quad,
00051 const ParametrizedCurve& curve,
00052 const WatchFlag& watch) : ScalarExpr(), rqcToExprMap_()
00053 {
00054 addTerm(region, expr, quad, curve , watch, 1);
00055 }
00056
00057
00058 Expr SumOfIntegrals::filterSpectral(const Expr& expr) const
00059 {
00060 return SpectralPreprocessor::projectSpectral(expr);
00061 }
00062
00063
00064
00065 void SumOfIntegrals::addTerm(const RCP<CellFilterStub>& regionPtr,
00066 const Expr& expr,
00067 const RCP<QuadratureFamilyStub>& quadPtr,
00068 const ParametrizedCurve& paramCurve,
00069 const WatchFlag& watch, int sign)
00070 {
00071 Expr ex = filterSpectral(expr);
00072
00073 RegionQuadCombo rqc(regionPtr, quadPtr, paramCurve ,watch);
00074
00075 if (rqcToExprMap_.containsKey(rqc))
00076 {
00077 Expr e = rqcToExprMap_.get(rqc);
00078 rqcToExprMap_.put(rqc, e + sign*ex);
00079 }
00080 else
00081 {
00082 rqcToExprMap_.put(rqc, sign*ex);
00083 }
00084 }
00085
00086
00087 void SumOfIntegrals::merge(const SumOfIntegrals* other, int sign)
00088 {
00089 for (Sundance::Map<RegionQuadCombo, Expr>::const_iterator
00090 i=other->rqcToExprMap_.begin(); i!=other->rqcToExprMap_.end(); i++)
00091 {
00092 const RegionQuadCombo& rqc = i->first;
00093 const Expr& e = i->second;
00094 addTerm(rqc.domain(), e, rqc.quad(), rqc.paramCurve() , rqc.watch(), sign);
00095 }
00096 }
00097
00098 void SumOfIntegrals::multiplyByConstant(const SpatiallyConstantExpr* expr)
00099 {
00100 double a = expr->value();
00101 Sundance::Map<RegionQuadCombo, Expr> newMap;
00102 for (Sundance::Map<RegionQuadCombo, Expr>::const_iterator
00103 i=rqcToExprMap_.begin(); i!=rqcToExprMap_.end(); i++)
00104 {
00105 Expr e = i->second;
00106 newMap.put(i->first, a*e);
00107 }
00108 rqcToExprMap_ = newMap;
00109 }
00110
00111 void SumOfIntegrals::changeSign()
00112 {
00113 Sundance::Map<RegionQuadCombo, Expr> newMap;
00114 for (Sundance::Map<RegionQuadCombo, Expr>::const_iterator
00115 i=rqcToExprMap_.begin(); i!=rqcToExprMap_.end(); i++)
00116 {
00117 Expr e = i->second;
00118 newMap.put(i->first, -e);
00119 }
00120 rqcToExprMap_ = newMap;
00121 }
00122
00123 Set<int> SumOfIntegrals::funcsOnRegion(const OrderedHandle<CellFilterStub>& d, const Set<int>& funcSet) const
00124 {
00125 Set<int> rtn;
00126 for (Sundance::Map<RegionQuadCombo, Expr>::const_iterator
00127 i=rqcToExprMap_.begin(); i!=rqcToExprMap_.end(); i++)
00128 {
00129 const RegionQuadCombo& rqc = i->first;
00130 if (OrderedHandle<CellFilterStub>(rqc.domain()) != d) continue;
00131 Expr e = i->second;
00132 e.ptr()->accumulateFuncSet(rtn, funcSet);
00133 }
00134 return rtn;
00135 }
00136
00137
00138 bool SumOfIntegrals::integralHasTestFunctions(const OrderedHandle<CellFilterStub>& d) const
00139 {
00140 for (Sundance::Map<RegionQuadCombo, Expr>::const_iterator
00141 i=rqcToExprMap_.begin(); i!=rqcToExprMap_.end(); i++)
00142 {
00143 const RegionQuadCombo& rqc = i->first;
00144 if (OrderedHandle<CellFilterStub>(rqc.domain()) != d) continue;
00145 Expr e = i->second;
00146 if (e.hasTestFunctions()) return true;
00147 }
00148 return false;
00149 }
00150
00151
00152
00153 RCP<CellFilterStub> SumOfIntegrals::nullRegion() const
00154 {
00155 for (Sundance::Map<RegionQuadCombo, Expr>::const_iterator
00156 i=rqcToExprMap_.begin(); i!=rqcToExprMap_.end(); i++)
00157 {
00158 const RegionQuadCombo& rqc = i->first;
00159 if (!rqc.domain()->isNullRegion())
00160 {
00161 return rqc.domain()->makeNullRegion();
00162 }
00163 }
00164
00165 TEUCHOS_TEST_FOR_EXCEPTION(true, std::runtime_error,
00166 "SumOfIntegrals::nullRegion() called on a sum "
00167 "of integrals with no non-null regions");
00168
00169 return RCP<CellFilterStub>();
00170 }
00171
00172 bool SumOfIntegrals::isIndependentOf(const Expr& u) const
00173 {
00174 for (Sundance::Map<RegionQuadCombo, Expr>::const_iterator
00175 i=rqcToExprMap_.begin(); i!=rqcToExprMap_.end(); i++)
00176 {
00177 Expr e = i->second;
00178 if (!e.isIndependentOf(u)) return false;
00179 }
00180 return true;
00181 }
00182
00183 bool SumOfIntegrals::isLinearForm(const Expr& u) const
00184 {
00185 for (Sundance::Map<RegionQuadCombo, Expr>::const_iterator
00186 i=rqcToExprMap_.begin(); i!=rqcToExprMap_.end(); i++)
00187 {
00188 Expr e = i->second;
00189 if (!e.isLinearForm(u)) return false;
00190 }
00191 return true;
00192 }
00193
00194 bool SumOfIntegrals::isQuadraticForm(const Expr& u) const
00195 {
00196 for (Sundance::Map<RegionQuadCombo, Expr>::const_iterator
00197 i=rqcToExprMap_.begin(); i!=rqcToExprMap_.end(); i++)
00198 {
00199 Expr e = i->second;
00200 if (!e.isQuadraticForm(u)) return false;
00201 }
00202 return true;
00203 }
00204
00205
00206 bool SumOfIntegrals::everyTermHasTestFunctions() const
00207 {
00208 for (Sundance::Map<RegionQuadCombo, Expr>::const_iterator
00209 i=rqcToExprMap_.begin(); i!=rqcToExprMap_.end(); i++)
00210 {
00211 Expr e = i->second;
00212 if (!e.everyTermHasTestFunctions()) return false;
00213 }
00214 return true;
00215 }
00216
00217
00218 bool SumOfIntegrals::isLinearInTests() const
00219 {
00220 for (Sundance::Map<RegionQuadCombo, Expr>::const_iterator
00221 i=rqcToExprMap_.begin(); i!=rqcToExprMap_.end(); i++)
00222 {
00223 Expr e = i->second;
00224 if (!e.isLinearInTests()) return false;
00225 }
00226 return true;
00227 }
00228
00229 bool SumOfIntegrals::hasTestFunctions() const
00230 {
00231 for (Sundance::Map<RegionQuadCombo, Expr>::const_iterator
00232 i=rqcToExprMap_.begin(); i!=rqcToExprMap_.end(); i++)
00233 {
00234 Expr e = i->second;
00235 if (e.hasTestFunctions()) return true;
00236 }
00237 return false;
00238 }
00239
00240
00241
00242 std::ostream& SumOfIntegrals::toText(std::ostream& os, bool paren) const
00243 {
00244 os << "Sum of Integrals[" << std::endl;
00245 for (Sundance::Map<RegionQuadCombo, Expr>::const_iterator
00246 i=rqcToExprMap_.begin(); i!=rqcToExprMap_.end(); i++)
00247 {
00248 const RegionQuadCombo& rqc = i->first;
00249 Expr e = i->second;
00250 os << "Integral[" << std::endl;
00251 os << "rqc=" << rqc.toString() << std::endl;
00252 os << "expr=" << e.toString() << std::endl;
00253 os << "]" << std::endl;
00254 }
00255 os << "]" << std::endl;
00256
00257 return os;
00258 }
00259
00260
00261 XMLObject SumOfIntegrals::toXML() const
00262 {
00263 XMLObject rtn("SumOfIntegrals");
00264 for (Sundance::Map<RegionQuadCombo, Expr>::const_iterator
00265 i=rqcToExprMap_.begin(); i!=rqcToExprMap_.end(); i++)
00266 {
00267 const RegionQuadCombo& rqc = i->first;
00268 Expr e = i->second;
00269 XMLObject child("Integral");
00270 rtn.addChild(child);
00271 child.addChild(rqc.quad()->toXML());
00272 child.addChild(rqc.domain()->toXML());
00273 child.addChild(rqc.watch().toXML());
00274 child.addChild(e.toXML());
00275 }
00276
00277 return rtn;
00278 }
00279
00280
00281 bool SumOfIntegrals::lessThan(const ScalarExpr* other) const
00282 {
00283 const SumOfIntegrals* f = dynamic_cast<const SumOfIntegrals*>(other);
00284 TEUCHOS_TEST_FOR_EXCEPTION(f==0, std::logic_error, "cast should never fail at this point");
00285
00286 return rqcToExprMap_ < f->rqcToExprMap_;
00287 }
00288
00289 bool SumOfIntegrals::hasWatchedTerm() const
00290 {
00291 for (Sundance::Map<RegionQuadCombo, Expr>::const_iterator
00292 i=rqcToExprMap_.begin(); i!=rqcToExprMap_.end(); i++)
00293 {
00294 const RegionQuadCombo& rqc = i->first;
00295 if (rqc.watch().isActive()) return true;
00296 }
00297 return false;
00298 }
00299
00300
00301
00302 int SumOfIntegrals::eqnSetSetupVerb() const
00303 {
00304 int rtn = 0;
00305 for (Sundance::Map<RegionQuadCombo, Expr>::const_iterator
00306 i=rqcToExprMap_.begin(); i!=rqcToExprMap_.end(); i++)
00307 {
00308 const RegionQuadCombo& rqc = i->first;
00309 int v = rqc.watch().param("equation set setup");
00310 if (v > rtn) rtn = v;
00311 }
00312 return rtn;
00313 }
00314
00315