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

models/models.hh
Go to the documentation of this file.
00001 
00006 #ifndef models_hh
00007 #define models_hh
00008 
00009 #include <sys/utsname.h>
00010 #include "basics/exceptions.hh"
00011 #include "basics/outputOperator.hh"
00012 #include "toolbox/inputOutput.hh"
00013 #include "formula/formula.hh"
00014 #include "geometry/mesh.hh"
00015 #include "graphics/matlab.hh"
00016 #include "space/space.hh"
00017 #include "function/vector.hh"
00018 
00019 
00020 #define ModelControl_formulaOut_D 0
00021 
00022 namespace concepts {
00023 
00024   // forward declaration
00025   template<class F>
00026   class ModelControlBase;
00027 
00028   template<class F>
00029   class ModelControl;
00030 
00031   // ********************************************************* ModelNotSolved **
00032 
00037   class ModelNotSolved : public ExceptionBase {};
00038 
00039   // ********************************************************* MatrixNotBuilt **
00040 
00045   class MatrixNotBuilt : public ExceptionBase {};
00046  
00047   // ***************************************************************** Model **
00048   
00053   template<class F>
00054   class Model : public OutputOperator {
00055     friend class ModelControlBase<Model<F> >;
00056     friend class ModelControl<Model<F> >;
00057   public:
00058     typedef F type;
00059     
00061     Model(const std::string problemName);
00062     virtual ~Model() {}
00064     virtual Space<Real>& space() const = 0;
00066     const Vector<F>* solution() {
00067       solve_();
00068       return sol_.get();
00069     }
00070   protected:
00071     virtual std::ostream& info(std::ostream& os) const;
00073     virtual Mesh& mesh_() = 0;
00075     virtual const std::string mshAbbr_() = 0;
00077     std::auto_ptr<Vector<F> > sol_;
00079     virtual void solve_() = 0;
00081     const std::string problemName_;
00082   };
00083 
00084   // ****************************************************** ModelControlBase **
00085 
00092   template<class F>
00093   class ModelControlBase : public OutputOperator {
00094   public:
00096     ModelControlBase(F& model) : model_(model) {
00097       parameters_.addString("vectorFile", "");
00098     }
00099     virtual ~ModelControlBase() {}
00101     virtual F& model() { return model_; }
00102     virtual const F& model() const { return model_; }
00104     void loadSolution(const std::string vectorFile);
00108     void writeSolution(const std::string vectorFile, bool verbose = true);
00112     void basisFunctions(const std::string path = "");
00116     virtual void dataOut(concepts::InOutParameters& parameters,
00117        const bool store = false,
00118        const std::string path = "");
00120     const concepts::InOutParameters& parameters() const {
00121       return parameters_;
00122     }
00123   protected:
00124     virtual std::ostream& info(std::ostream& os) const;
00126     F& model_;
00128     concepts::InOutParameters parameters_;
00137     virtual std::string filename_(const std::string varname,
00138           const std::string path,
00139           const bool flag = false);
00148     void newfile_(std::string& name, const std::string varname,
00149       const std::string ending);
00151     template<class G>
00152     void formulaOut_(const concepts::PiecewiseFormulaBase<G>& frm,
00153                      const std::string frmstr, const std::string name);
00154 
00155   };
00156 
00157   template<class F>
00158   template<class G>
00159   void ModelControlBase<F>::formulaOut_
00160   (const concepts::PiecewiseFormulaBase<G>& frm,
00161    const std::string frmstr, const std::string name)
00162   {
00163     DEBUGL(ModelControl_formulaOut_D,
00164      "Writing formula " << frmstr << " into " << name << ".m");
00165     graphics::MatlabGraphics(model_.space(), name.c_str(), frm);
00166     parameters_.addString((std::string("grafik_") + frmstr).c_str(),
00167         (name + ".m").c_str());
00168   }
00169 
00170   // ********************************************************** ModelControl **
00171 
00172   template<class F>
00173   class ModelControl : public ModelControlBase<F> {
00174   public:
00176     ModelControl(F& model) : ModelControlBase<F>(model) {}
00177   };
00178 
00179 } // namespace concepts
00180 
00181 #endif // models_hh

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