AFEPack
Geometry.h
浏览该文件的文档。
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