00001
00002
00003
00004
00005 #ifndef geomFormula_hh
00006 #define geomFormula_hh
00007
00008 #include <functional>
00009 #include "basics/debug.hh"
00010 #include "toolbox/dynArray.hh"
00011 #include "toolbox/hashMap.hh"
00012 #include "toolbox/set.hh"
00013 #include "formula/piecewiseFormula.hh"
00014 #include "formula/elementFormulaContainer.hh"
00015 #include "basics/cloneable.hh"
00016 #include "basics/operations.hh"
00017 #include "cell.hh"
00018 #include "mesh.hh"
00019
00020 namespace concepts {
00021
00022
00023 template<class F>
00024 class Formula;
00025
00026
00027
00033 template<typename F>
00034 class PiecewiseFormula0 : public PiecewiseFormulaBase<F> {
00035 public:
00037 PiecewiseFormula0(const Formula<F>& formula) : formula_(formula.clone()) {}
00038 virtual ~PiecewiseFormula0() {}
00039 virtual PiecewiseFormula0<F>* clone() const {
00040 return new PiecewiseFormula0(*formula_);
00041 }
00043 virtual F operator()(const Connector& cell, const Real p,
00044 const Real t = 0.0) const {
00045 return (*formula_)(p,t); }
00046 virtual F operator()(const Connector& cell, const Real2d& p,
00047 const Real t = 0.0) const {
00048 return (*formula_)(p,t); }
00049 virtual F operator()(const Connector& cell, const Real3d& p,
00050 const Real t = 0.0) const {
00051 return (*formula_)(p,t); }
00052 protected:
00053 virtual std::ostream& info(std::ostream& os) const {
00054 return os << "PiecewiseFormula0(" << *formula_ << ")"; }
00055 private:
00056 std::auto_ptr<Formula<F> > formula_;
00057 };
00058
00059
00060
00081 template<typename F = Real>
00082 class PiecewiseConstFormula : public PiecewiseFormulaBase<F> {
00083 public:
00085 PiecewiseConstFormula(const F dflt_value = 0);
00089 PiecewiseConstFormula(const HashMap<F> formula, const F dflt_value = 0);
00093 PiecewiseConstFormula(const std::map<int,F> formula, const F dflt_value = 0);
00094 virtual ~PiecewiseConstFormula();
00095 virtual PiecewiseConstFormula<F>* clone() const;
00097
00098 inline virtual F operator()(const Connector& cell, const Real p,
00099 const Real t = 0.0) const
00100 { return (*this)[cell.attrib()]; }
00101
00102 inline virtual F operator()(const Connector& cell, const Real2d& p,
00103 const Real t = 0.0) const
00104 { return (*this)[cell.attrib()]; }
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115 inline virtual F operator()(const Connector& cell, const Real3d& p,
00116 const Real t = 0.0) const
00117 { return (*this)[cell.attrib()]; }
00118 virtual const F& operator[](const uint attrib) const;
00124 virtual F& operator[](const uint attrib);
00125
00126 template<class H>
00127 PiecewiseConstFormula<F>& operator*=(const H& factor);
00128 protected:
00129 virtual std::ostream& info(std::ostream& os) const;
00131 HashMap<F> formula_;
00132 };
00133
00134 template<typename F>
00135 template<class H>
00136 PiecewiseConstFormula<F>&
00137 PiecewiseConstFormula<F>::operator*=(const H& factor){
00138 typename HashMap<F>::iterator i = formula_.begin();
00139 while(i != formula_.end())
00140 i++->second *= factor;
00141 return *this;
00142 }
00143
00144
00145
00163 template<typename F = Real>
00164 class PiecewiseConstImportFormula : public PiecewiseConstFormula<F> {
00165 public:
00166 PiecewiseConstImportFormula(const std::string material,
00167 const uint idxStart = 1,
00168 const F dflt_value = 0);
00169 private:
00171 void read_(std::istringstream& iss);
00172 };
00173
00174
00175
00180 template<typename F = Real>
00181 class PiecewiseConstDynArrayFormula : public PiecewiseFormulaBase<F> {
00182 public:
00183 PiecewiseConstDynArrayFormula(const DynArray<F>& formula);
00184 ~PiecewiseConstDynArrayFormula();
00185 virtual PiecewiseConstDynArrayFormula<F>* clone() const;
00187 inline virtual F operator()(const Connector& cell, const Real p,
00188 const Real t = 0.0) const
00189 { return (*formula_)[cell.attrib()]; }
00190 inline virtual F operator()(const Connector& cell, const Real2d& p,
00191 const Real t = 0.0) const
00192 { return (*formula_)[cell.attrib()]; }
00193 inline virtual F operator()(const Connector& cell, const Real3d& p,
00194 const Real t = 0.0) const
00195 { return (*formula_)[cell.attrib()]; }
00196 protected:
00197 virtual std::ostream& info(std::ostream& os) const;
00198 private:
00199 const DynArray<F>* formula_;
00200 };
00201
00202
00203
00213 template<typename F>
00214 class PiecewiseFormula : public PiecewiseFormulaBase<F> {
00215 public:
00216 PiecewiseFormula(const F dflt_value = 0);
00217 virtual ~PiecewiseFormula();
00218 virtual PiecewiseFormula<F>* clone() const;
00220 virtual F operator()(const Connector& cell, const Real p,
00221 const Real t = 0.0) const;
00222 virtual F operator()(const Connector& cell, const Real2d& p,
00223 const Real t = 0.0) const;
00224 virtual F operator()(const Connector& cell, const Real3d& p,
00225 const Real t = 0.0) const;
00231 void set(const uint attrib, const Formula<F>& formula);
00232 void set(const uint attrib, const F a);
00234 template<class H>
00235 void multiply(const H& factor);
00237 template<class H>
00238 void multiply(const uint attrib, const H& factor);
00239 protected:
00240 class FormulaFactor : public OutputOperator {
00241 public:
00242 FormulaFactor() : formula_(0) {}
00243 FormulaFactor(const FormulaFactor& frm)
00244 : formula_(0), factor_(frm.factor_) {
00245 formula_.reset(frm.formula_.get());
00246 }
00247 std::auto_ptr<Formula<F> > formula_;
00248 typename Datatype<F>::type factor_;
00249 protected:
00250 virtual std::ostream& info(std::ostream& os) const { return os;}
00251 };
00252 virtual std::ostream& info(std::ostream& os) const;
00254 HashMap<FormulaFactor> formula_;
00255 };
00256
00257 template<typename F>
00258 template<class H>
00259 void PiecewiseFormula<F>::multiply(const H& factor){
00260 typename HashMap<FormulaFactor>::iterator i = formula_.begin();
00261 while(i != formula_.end())
00262 i++->second.factor_ *= factor;
00263 }
00264
00265 template<typename F>
00266 template<class H>
00267 void PiecewiseFormula<F>::multiply(const uint attrib, const H& factor){
00268 typename HashMap<FormulaFactor>::iterator i = formula_.find(attrib);
00269 if (i != formula_.end())
00270 i->second.factor_ *= factor;
00271 }
00272
00273
00274
00275
00282 template<class F, class G = typename Realtype<F>::type>
00283 class PiecewiseElementFormula : public ElementFormula<F, G> {
00284 public:
00285 PiecewiseElementFormula(const F defaultV = 0)
00286 : defaultV_(defaultV)
00287 {
00288 }
00289
00290 virtual ~PiecewiseElementFormula() { }
00291
00292 virtual PiecewiseElementFormula<F, G>* clone() const {
00293 return new PiecewiseElementFormula(*this);
00294 }
00295
00296 virtual F operator() (const ElementWithCell< G > &elm, const Real3d &p,
00297 const Real t=0.0) const
00298 {
00299 typename ElemFormulaMap::const_iterator
00300 i = formulas_.find(elm.cell().connector().attrib());
00301 if (i != formulas_.end())
00302 return i->second.operator()(elm, p, t);
00303
00304 return defaultV_;
00305 }
00306
00307 virtual F operator() (const ElementWithCell< G > &elm, const Real2d &p,
00308 const Real t=0.0) const
00309 {
00310 typename ElemFormulaMap::const_iterator
00311 i = formulas_.find(elm.cell().connector().attrib());
00312 if (i != formulas_.end())
00313 return i->second.operator()(elm, p, t);
00314
00315 return defaultV_;
00316 }
00317
00318 virtual F operator() (const ElementWithCell< G > &elm, const Real p,
00319 const Real t=0.0) const
00320 {
00321 typename ElemFormulaMap::const_iterator
00322 i = formulas_.find(elm.cell().connector().attrib());
00323 if (i != formulas_.end())
00324 return i->second.operator()(elm, p, t);
00325
00326 return defaultV_;
00327 }
00328
00331 void set(const uint attrib,
00332 const ElementFormulaContainer<F,G> formula) {
00333 formulas_[attrib] = formula;
00334
00335 }
00336
00337 void set(concepts::Set<uint> attribs,
00338 const ElementFormulaContainer<F,G> formula)
00339 {
00340 for (concepts::Set<uint>::const_iterator it = attribs.begin();
00341 it != attribs.end(); ++it)
00342 {
00343 set(*it, formula);
00344 }
00345 }
00346 protected:
00347 virtual std::ostream& info(std::ostream& os) const {
00348 return os << "PiecewiseElementFormula( " << defaultV_ << ", "
00349 << formulas_ << ")" << std::endl;
00350 }
00351 public:
00353 typedef
00354 HashMap< ElementFormulaContainer<F, G> > ElemFormulaMap;
00355 ElemFormulaMap formulas_;
00357 F defaultV_;
00358 };
00359
00360
00361
00362
00363 template<class F>
00364 class Operation : public Cloneable, public OutputOperator {
00365 public:
00366 virtual F operator()(const F val) const = 0;
00367 virtual Operation<F>* clone() const = 0;
00368 protected:
00369 virtual std::ostream& info(std::ostream& os) const;
00370 };
00371
00372
00373
00374 template<class F>
00375 class OpMult : public Operation<F> {
00376 public:
00377 OpMult(const F factor) : factor_(factor) {}
00378 virtual OpMult<F>* clone() const { return new OpMult<F>(factor_); };
00379 virtual F operator()(const F val) const;
00380 protected:
00381 virtual std::ostream& info(std::ostream& os) const;
00382 private:
00383 const F factor_;
00384 };
00385
00386
00387
00388 template<class F>
00389 class OpAdd : public Operation<F> {
00390 public:
00391 OpAdd(const F summand) : summand_(summand) {}
00392 virtual OpAdd<F>* clone() const { return new OpAdd<F>(summand_); };
00393 virtual F operator()(const F val) const;
00394 protected:
00395 virtual std::ostream& info(std::ostream& os) const;
00396 private:
00397 const F summand_;
00398 };
00399
00400
00401
00402 template<class F>
00403 class OpRecipr : public Operation<F> {
00404 public:
00405 virtual F operator()(const F val) const;
00406 virtual OpRecipr<F>* clone() const { return new OpRecipr<F>; };
00407 protected:
00408 virtual std::ostream& info(std::ostream& os) const;
00409 };
00410
00411
00412
00420 template<typename F, typename G = F>
00421 class PiecewiseFormulaFun : public PiecewiseFormulaBase<F> {
00422 public:
00423 PiecewiseFormulaFun(PiecewiseFormulaBase<G>& formula);
00424 virtual ~PiecewiseFormulaFun();
00425 virtual PiecewiseFormulaFun<F,G>* clone() const;
00427 virtual F operator()(const Connector& cell, const Real p,
00428 const Real t = 0.0) const;
00429 virtual F operator()(const Connector& cell, const Real2d& p,
00430 const Real t = 0.0) const;
00431 virtual F operator()(const Connector& cell, const Real3d& p,
00432 const Real t = 0.0) const;
00433
00434 PiecewiseFormulaFun<F,G>& operator*=(const F n);
00435 PiecewiseFormulaFun<F,G>& operator+=(const F n);
00436 PiecewiseFormulaFun<F,G>& reciprocal();
00438 void clear();
00439 protected:
00440 virtual std::ostream& info(std::ostream& os) const;
00441 private:
00443 PiecewiseFormulaBase<G>& formula_;
00445 std::vector<Operation<F>*> operations_;
00446 };
00447
00448
00449
00450
00456 template<typename F, typename G, typename H = G,
00457 typename I = multiplies<G,H,F> >
00458 class PiecewiseFormulaCombine : public PiecewiseFormulaBase<F> {
00459 public:
00461 PiecewiseFormulaCombine(const PiecewiseFormulaBase<G>& formula1,
00462 const PiecewiseFormulaBase<H>& formula2);
00463 virtual ~PiecewiseFormulaCombine() {}
00464 virtual PiecewiseFormulaCombine<F,G,H,I>* clone() const;
00466 virtual F operator()(const Connector& cell, const Real p,
00467 const Real t = 0.0) const;
00468 virtual F operator()(const Connector& cell, const Real2d& p,
00469 const Real t = 0.0) const;
00470 virtual F operator()(const Connector& cell, const Real3d& p,
00471 const Real t = 0.0) const;
00472 protected:
00473 virtual std::ostream& info(std::ostream& os) const;
00474 private:
00476 std::auto_ptr<const PiecewiseFormulaBase<G> > formula1_;
00477 std::auto_ptr<const PiecewiseFormulaBase<H> > formula2_;
00479 const I fun_;
00480 };
00481
00482
00483
00490 class CurvatureElementFormula : public ElementFormula<Real> {
00491 public:
00496 CurvatureElementFormula(uint n = 0) : n_(n) {}
00497 virtual Real operator() (const ElementWithCell<Real>& elm, const Real p,
00498 const Real t = 0.0) const;
00499 virtual Real operator() (const ElementWithCell<Real>& elm, const Real2d& p,
00500 const Real t = 0.0) const;
00501 virtual Real operator() (const ElementWithCell<Real>& elm, const Real3d& p,
00502 const Real t = 0.0) const;
00504 virtual CurvatureElementFormula* clone() const {
00505 return new CurvatureElementFormula();
00506 }
00507 protected:
00508 virtual std::ostream& info(std::ostream& os) const;
00509 private:
00511 uint n_;
00512 };
00513
00514
00515 }
00516
00517 #endif // geomFormula_hh