|
AFEPack
|
00001 00011 #ifndef _Geometry_h_ 00012 #define _Geometry_h_ 00013 00014 #ifndef NULL 00015 #define NULL 0 00016 #endif // NULL 00017 00018 #include <stdarg.h> 00019 #include <dlfcn.h> 00020 00021 #include <cmath> 00022 #include <iostream> 00023 #include <fstream> 00024 #include <string> 00025 #include <vector> 00026 #include <list> 00027 #include <iterator> 00028 #include <algorithm> 00029 00030 #include <base/exceptions.h> 00031 00032 #include "Miscellaneous.h" 00033 00034 template <int DIM> class Point; 00035 class Geometry; 00036 class GeometryBM; 00037 template <int DIM, int DOW> class Mesh; 00038 template <int DIM> class QuadratureInfo; 00039 template <int DIM> class QuadratureInfoAdmin; 00040 template <int DIM> class TemplateGeometry; 00041 template <int DIM, int DOW> class SimplestMesh; 00042 00043 template <int DIM> Point<DIM> midpoint(const Point<DIM>&, const Point<DIM>&); 00044 template <int DIM> double distance(const Point<DIM>&, const Point<DIM>&); 00045 template <int DIM> Point<DIM> barycenter(const std::vector<Point<DIM> >&, const double * = NULL); 00046 template <int DIM> Point<DIM> operator+(const Point<DIM>&, const Point<DIM>&); 00047 template <int DIM> Point<DIM> operator-(const Point<DIM>&, const Point<DIM>&); 00048 template <int DIM> std::istream& operator>>(std::istream&, Point<DIM>&); 00049 template <int DIM> std::ostream& operator<<(std::ostream&, const Point<DIM>&); 00050 00051 std::istream& operator>>(std::istream&, Geometry&); 00052 std::ostream& operator<<(std::ostream&, const Geometry&); 00053 bool is_same(const Geometry&, const Geometry&); 00054 00055 template <int DIM> filtering_istream& operator>>(filtering_istream&, QuadratureInfo<DIM>&); 00056 template <int DIM> std::ostream& operator<<(std::ostream&, const QuadratureInfo<DIM>&); 00057 00058 template <int DIM> filtering_istream& operator>>(filtering_istream&, QuadratureInfoAdmin<DIM>&); 00059 template <int DIM> std::ostream& operator<<(std::ostream&, const QuadratureInfoAdmin<DIM>&); 00060 00061 typedef std::vector<Geometry>::iterator GeometryIterator; 00062 00063 template <int DIM, int DOW> std::istream& operator>>(std::istream&, Mesh<DIM,DOW>&); 00064 template <int DIM, int DOW> std::ostream& operator<<(std::ostream&, const Mesh<DIM,DOW>&); 00065 00066 template <int DIM> filtering_istream& operator>>(filtering_istream&, TemplateGeometry<DIM>&); 00067 template <int DIM> std::ostream& operator<<(std::ostream&, const TemplateGeometry<DIM>&); 00068 00070 00075 template <int DIM> 00076 class Point 00077 { 00078 public: 00079 enum { dim = DIM }; 00080 private: 00081 double x[DIM]; 00082 public: 00083 Point(); 00084 Point(const double *); 00085 Point(const Point&); 00086 Point(double, ...); 00087 ~Point(); 00088 public: 00089 Point<DIM>& operator=(const Point<DIM>&); 00090 operator const double *() const; 00091 operator double *(); 00092 const double& operator[](int) const; 00093 double& operator[](int); 00094 double length() const; 00095 Point<DIM>& operator+=(const Point<DIM>&); 00096 Point<DIM>& operator-=(const Point<DIM>&); 00097 Point<DIM>& operator*=(const double&); 00098 Point<DIM>& operator/=(const double&); 00099 public: 00100 friend Point<DIM> midpoint<>(const Point<DIM>&, const Point<DIM>&); 00101 friend double distance<>(const Point<DIM>&, const Point<DIM>&); 00102 friend Point<DIM> barycenter<>(const std::vector<Point<DIM> >&, const double *); 00103 friend Point<DIM> operator+ <>(const Point<DIM>&, const Point<DIM>&); 00104 friend Point<DIM> operator- <>(const Point<DIM>&, const Point<DIM>&); 00105 friend std::istream& operator>> <>(std::istream&, Point<DIM>&); 00106 friend std::ostream& operator<< <>(std::ostream&, const Point<DIM>&); 00107 }; 00108 00114 class Geometry 00115 { 00116 private: 00117 int ind; 00118 std::vector<int> vtx; 00119 std::vector<int> bnd; 00120 public: 00121 Geometry(); 00122 Geometry(const Geometry&); 00123 ~Geometry(); 00124 public: 00125 Geometry& operator=(const Geometry&); 00126 int index() const; 00127 int& index(); 00128 int n_vertex() const; 00129 int n_boundary() const; 00130 const std::vector<int>& vertex() const; 00131 std::vector<int>& vertex(); 00132 const std::vector<int>& boundary() const; 00133 std::vector<int>& boundary(); 00134 int vertex(int) const; 00135 int& vertex(int); 00136 int boundary(int) const; 00137 int& boundary(int); 00138 public: 00139 friend bool isSame(const Geometry&, const Geometry&); 00140 template <int, int> friend class Mesh; 00141 friend std::istream& operator>>(std::istream&, Geometry&); 00142 friend std::ostream& operator<<(std::ostream&, const Geometry&); 00143 }; 00144 00150 class GeometryBM : public Geometry 00151 { 00152 public: 00153 typedef int bmark_t; 00154 private: 00155 bmark_t bm; 00156 public: 00157 GeometryBM(); 00158 GeometryBM(const GeometryBM&); 00159 ~GeometryBM(); 00160 public: 00161 GeometryBM& operator=(const GeometryBM&); 00162 int boundaryMark() const; 00163 int& boundaryMark(); 00164 public: 00165 template <int, int> friend class Mesh; 00166 friend std::istream& operator>>(std::istream&, GeometryBM&); 00167 friend std::ostream& operator<<(std::ostream&, const GeometryBM&); 00168 }; 00169 00175 template <int DIM, int DOW=DIM> 00176 class Mesh 00177 { 00178 public: 00179 enum { dim = DIM, dow = DOW }; 00180 typedef Point<DOW> point_t; 00181 public: 00182 typedef GeometryBM::bmark_t bmark_t; 00183 private: 00184 typedef Mesh<DIM,DOW> mesh_t; 00185 00186 std::vector<point_t > pnt; 00187 std::vector<std::vector<GeometryBM> > geo; 00190 public: 00191 Mesh(); 00192 Mesh(const mesh_t&); 00193 virtual ~Mesh(); 00194 public: 00195 mesh_t& operator=(const mesh_t&); 00196 unsigned int n_point() const; 00197 unsigned int n_geometry(int) const; 00198 const std::vector<point_t >& point() const; 00199 std::vector<point_t >& point(); 00200 const point_t& point(int) const; 00201 point_t& point(int); 00202 const std::vector<std::vector<GeometryBM> >& geometry() const; 00203 std::vector<std::vector<GeometryBM> >& geometry(); 00204 const std::vector<GeometryBM>& geometry(int) const; 00205 std::vector<GeometryBM>& geometry(int); 00206 const GeometryBM& geometry(int, int) const; 00207 GeometryBM& geometry(int, int); 00208 bmark_t boundaryMark(int, int) const; 00209 bmark_t& boundaryMark(int, int); 00210 void renumerateElement(); 00212 void renumerateElementHSFC(void (*f)(double,double,double,double&,double&,double&)=NULL); 00213 void readData(const std::string&); 00214 void writeData(const std::string&) const; 00215 void readData1d(const std::string&); 00216 virtual void writeEasyMesh(const std::string&) const {}; 00217 virtual void writeTecplotData(const std::string&) const {}; 00218 00219 DeclException1(ExcMeshData, 00220 char *, 00221 << "Mesh data error: " << arg1); 00222 public: 00223 friend std::istream& operator>> <>(std::istream&, mesh_t&); 00224 friend std::ostream& operator<< <>(std::ostream&, const mesh_t&); 00225 friend filtering_istream& operator>> <>(filtering_istream&, TemplateGeometry<DIM>&); 00226 friend std::ostream& operator<< <>(std::ostream&, const TemplateGeometry<DIM>&); 00227 }; 00228 00233 template <int DIM> 00234 class QuadratureInfo 00235 { 00236 public: 00237 enum { dim = DIM }; 00238 private: 00239 int alg_acc; 00240 std::vector<Point<DIM> > pnt; 00241 std::vector<double> wei; 00242 public: 00243 QuadratureInfo(); 00244 QuadratureInfo(const QuadratureInfo<DIM>&); 00245 ~QuadratureInfo(); 00246 public: 00247 QuadratureInfo<DIM>& operator=(const QuadratureInfo<DIM>&); 00248 int n_quadraturePoint() const; 00249 int algebricAccuracy() const; 00250 int& algebricAccuracy(); 00251 const std::vector<Point<DIM> >& quadraturePoint() const; 00252 std::vector<Point<DIM> >& quadraturePoint(); 00253 const Point<DIM>& quadraturePoint(int) const; 00254 Point<DIM>& quadraturePoint(int); 00255 const std::vector<double>& weight() const; 00256 std::vector<double>& weight(); 00257 const double& weight(int) const; 00258 double& weight(int); 00259 public: 00260 friend filtering_istream& operator>> <>(filtering_istream&, QuadratureInfo<DIM>&); 00261 friend std::ostream& operator<< <>(std::ostream&, const QuadratureInfo<DIM>&); 00262 }; 00263 00268 template <int DIM> 00269 class QuadratureInfoAdmin : public std::vector<QuadratureInfo<DIM> > 00270 { 00271 public: 00272 enum { dim = DIM }; 00273 private: 00274 std::vector<int> acc_tbl; 00275 public: 00276 QuadratureInfoAdmin(); 00277 QuadratureInfoAdmin(const QuadratureInfoAdmin<DIM>&); 00278 ~QuadratureInfoAdmin(); 00279 public: 00280 QuadratureInfoAdmin<DIM>& operator=(const QuadratureInfoAdmin<DIM>&); 00281 const QuadratureInfo<DIM>& find(int) const; 00282 QuadratureInfo<DIM>& find(int); 00283 public: 00284 friend filtering_istream& operator>> <>(filtering_istream&, QuadratureInfoAdmin<DIM>&); 00285 friend std::ostream& operator<< <>(std::ostream&, const QuadratureInfoAdmin<DIM>&); 00286 }; 00287 00295 template <int DIM> 00296 class TemplateGeometry : public Mesh<DIM,DIM> 00297 { 00298 public: 00299 enum { dim = DIM }; 00300 private: 00301 std::string library_path; 00302 void * handle; 00303 std::string library_name; 00304 std::string volume_function_name; 00305 double (*volume_function)(const double **); 00306 QuadratureInfoAdmin<DIM> quad_info; 00307 public: 00308 TemplateGeometry(); 00309 TemplateGeometry(const TemplateGeometry<DIM>&); 00310 ~TemplateGeometry(); 00311 public: 00312 TemplateGeometry& operator=(const TemplateGeometry<DIM>&); 00313 void loadFunction(); 00314 void unloadFunction(); 00315 const std::vector<Point<DIM> >& vertexArray() const; 00316 const QuadratureInfoAdmin<DIM>& quadratureInfo() const; 00317 QuadratureInfoAdmin<DIM>& quadratureInfo(); 00318 const QuadratureInfo<DIM>& findQuadratureInfo(int) const; 00319 double volume() const; 00320 void readData(const std::string&); 00321 void writeData(const std::string&) const; 00323 DeclException1(ExcTemplateGeometryData, 00324 char *, 00325 << "Template geometry data error: " << arg1); 00326 DeclException1(ExcFileOpen, char *, 00327 << "Can't open library " 00328 << arg1); 00329 DeclException2(ExcLoadFunction, char *, char *, 00330 << "Can't load function " 00331 << arg1 00332 << " from library " 00333 << arg2); 00334 00335 public: 00336 friend filtering_istream& operator>> <>(filtering_istream&, TemplateGeometry<DIM>&); 00337 friend std::ostream& operator<< <>(std::ostream&, const TemplateGeometry<DIM>&); 00338 }; 00339 00349 template <int DIM, int DOW=DIM> 00350 class SimplestMesh 00351 { 00352 public: 00353 enum { dim = DIM, dow = DOW }; 00354 protected: 00355 struct SimplestGeometry { 00356 public: 00357 int template_element; 00358 std::vector<int> vertex; 00359 }; 00360 std::vector<Point<DOW> > pnt; 00361 std::vector<SimplestGeometry> ele; 00362 std::vector<TemplateGeometry<DIM> > * tg; 00363 public: 00364 SimplestMesh() {}; 00365 virtual ~SimplestMesh() {}; 00366 public: 00367 int n_point() const {return pnt.size();} 00368 int n_element() const {return ele.size();} 00369 const std::vector<Point<DOW> >& point() const {return pnt;} 00370 std::vector<Point<DOW> >& point() {return pnt;} 00371 const Point<DOW>& point(int i) const {return pnt[i];} 00372 Point<DOW>& point(int i) {return pnt[i];} 00373 const std::vector<SimplestGeometry>& element() const {return ele;} 00374 std::vector<SimplestGeometry>& element() {return ele;} 00375 const SimplestGeometry& element(int i) const {return ele[i];} 00376 SimplestGeometry& element(int i) {return ele[i];} 00377 const std::vector<int>& elementVertex(int i) const {return ele[i].vertex;} 00378 std::vector<int>& elementVertex(int i) {return ele[i].vertex;} 00379 int elementVertex(int i, int j) const {return ele[i].vertex[j];} 00380 int& elementVertex(int i, int j) {return ele[i].vertex[j];} 00381 const std::vector<TemplateGeometry<DIM> >& templateGeometry() const {return *tg;} 00382 std::vector<TemplateGeometry<DIM> >& templateGeometry() {return *tg;} 00383 const TemplateGeometry<DIM>& templateGeometry(int i) const {return (*tg)[i];} 00384 TemplateGeometry<DIM>& templateGeometry(int i) {return (*tg)[i];} 00385 void setTemplateGeometry(std::vector<TemplateGeometry<DIM> >& t) {tg = &t;} 00386 public: 00387 virtual void generateMesh(Mesh<DIM,DOW>&); 00388 }; 00389 00390 #endif //_Geometry_h_ 00391
1.7.4