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
00025 template<class F>
00026 class ModelControlBase;
00027
00028 template<class F>
00029 class ModelControl;
00030
00031
00032
00037 class ModelNotSolved : public ExceptionBase {};
00038
00039
00040
00045 class MatrixNotBuilt : public ExceptionBase {};
00046
00047
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
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
00171
00172 template<class F>
00173 class ModelControl : public ModelControlBase<F> {
00174 public:
00176 ModelControl(F& model) : ModelControlBase<F>(model) {}
00177 };
00178
00179 }
00180
00181 #endif // models_hh