Home | Doxygen Documentation | Tutorials | Developer Tools (restricted)

geometry/formula.hh
Go to the documentation of this file.
00001 /* Formulas 
00002    Formulas defined on the cells
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   // forward declaration
00023   template<class F>
00024   class Formula;          // declared in formula/formula.hh
00025 
00026   // ***************************************************** PiecewiseFormula0 **
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   // ************************************************* PiecewiseConstFormula **
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 /*    inline virtual F operator()(const Element<Real>& elm_, const Real2d& p,
00107         const Real t = 0.0) const
00108       { 
00109         //FIXME: this conversion should not be neccesary
00110         const ElementWithCell<Real>& elm = static_cast<const ElementWithCell<Real>&> (elm_);
00111         const Connector& cell = elm.cell().connector();
00112         return operator[](cell.attrib()); 
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     // Multiplies all values with this factor
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   // ******************************************* PiecewiseConstImportFormula **
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   // ***************************************** PiecewiseConstDynArrayFormula **
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   // ****************************************************** PiecewiseFormula **
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   // *********************************************** PiecewiseElementFormula **
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       //std::cout <<  "atrib: " << attrib << ", " << *formulas[attrib] << std::endl;
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   // ************************************************************* Operation **
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   // **************************************************************** OpMult **
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   // ***************************************************************** OpAdd **
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   // ************************************************************** OpRecipr **
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   // *************************************************** PiecewiseFormulaFun **
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   // *********************************************** PiecewiseFormulaCombine **
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   // ************************************************ CurvatureElementFormula **
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 } // namespace concepts
00516 
00517 #endif // geomFormula_hh

Home | Doxygen Documentation | Tutorials | Developer Tools (restricted)