#ifndef MESH_INC #define MESH_INC #include #include #include #include "common/Array.h" #include "common/PointList.h" #include "common/Communication.h" #include "shared_ptr.h" namespace IO { //! Possible variable types //enum class VariableType : unsigned char { NodeVariable=1, EdgeVariable=2, SurfaceVariable=2, VolumeVariable=3, Null=0 }; enum VariableType { NodeVariable=1, EdgeVariable=2, SurfaceVariable=2, VolumeVariable=3, NullVariable=0 }; /*! \class Mesh \brief A base class for meshes */ class Mesh { public: //! Destructor virtual ~Mesh(); //! Mesh class name (eg. PointList) virtual std::string className() const = 0; //! Number of points for the given variable type virtual size_t numberPointsVar( VariableType type ) const = 0; //! Pack the data virtual std::pair pack( int level ) const = 0; //! Unpack the data virtual void unpack( const std::pair& data ) = 0; protected: //! Empty constructor Mesh(); Mesh(const Mesh&); Mesh& operator=(const Mesh&); }; /*! \class PointList \brief A class used to hold a list of verticies */ class PointList: public Mesh { public: //! Empty constructor PointList(); //! Constructor for N points PointList( size_t N ); //! Destructor virtual ~PointList(); //! Mesh class name virtual std::string className() const { return "PointList"; } //! Number of points for the given variable type virtual size_t numberPointsVar( VariableType type ) const; //! Pack the data virtual std::pair pack( int level ) const; //! Unpack the data virtual void unpack( const std::pair& data ); public: std::vector points; //!< List of points vertex }; /*! \class TriList \brief A class used to hold a list of triangles specified by their vertex coordinates */ class TriMesh; class TriList: public Mesh { public: //! Empty constructor TriList(); //! Constructor for N triangles TriList( size_t N_tri ); //! Constructor from TriMesh TriList( const TriMesh& ); //! Destructor virtual ~TriList(); //! Mesh class name virtual std::string className() const { return "TriList"; } //! Number of points for the given variable type virtual size_t numberPointsVar( VariableType type ) const; //! Pack the data virtual std::pair pack( int level ) const; //! Unpack the data virtual void unpack( const std::pair& data ); public: std::vector A; //!< First vertex std::vector B; //!< Second vertex std::vector C; //!< Third vertex }; /*! \class TriMesh \brief A class used to hold a list of trianges specified by their vertex number and list of coordiantes */ class TriMesh: public Mesh { public: //! TriMesh constructor TriMesh(); //! Constructor for Nt triangles and Np points TriMesh( size_t N_tri, size_t N_point ); //! Constructor for Nt triangles and the given points TriMesh( size_t N_tri, std::shared_ptr points ); //! Constructor from TriList TriMesh( const TriList& ); //! Destructor virtual ~TriMesh(); //! Mesh class name virtual std::string className() const { return "TriMesh"; } //! Number of points for the given variable type virtual size_t numberPointsVar( VariableType type ) const; //! Pack the data virtual std::pair pack( int level ) const; //! Unpack the data virtual void unpack( const std::pair& data ); public: std::shared_ptr vertices; //!< List of verticies std::vector A; //!< First vertex std::vector B; //!< Second vertex std::vector C; //!< Third vertex }; /*! \class Domain \brief A class used to hold the domain */ class DomainMesh: public Mesh { public: //! Empty constructor DomainMesh(); //! Default constructor DomainMesh( RankInfoStruct rank_data, int nx, int ny, int nz, double Lx, double Ly, double Lz ); //! Destructor virtual ~DomainMesh(); //! Mesh class name virtual std::string className() const { return "DomainMesh"; } //! Number of points for the given variable type virtual size_t numberPointsVar( VariableType type ) const; //! Pack the data virtual std::pair pack( int level ) const; //! Unpack the data virtual void unpack( const std::pair& data ); public: int nprocx, nprocy, nprocz, rank; int nx, ny, nz; double Lx, Ly, Lz; }; /*! \class Variable \brief A base class for variables */ struct Variable { public: // Internal variables unsigned int dim; //!< Number of points per grid point (1: scalar, 3: vector, ...) VariableType type; //!< Variable type std::string name; //!< Variable name Array data; //!< Variable data //! Empty constructor Variable(): type(NullVariable) {} //! Destructor virtual ~Variable() {} protected: //! Empty constructor Variable(const Variable&); Variable& operator=(const Variable&); }; /*! \class MeshDataStruct \brief A class used to hold database info for saving a mesh */ struct MeshDataStruct { std::string meshName; std::shared_ptr mesh; std::vector > vars; }; //! Convert the mesh to a TriMesh (will return NULL if this is invalid) std::shared_ptr getPointList( std::shared_ptr mesh ); std::shared_ptr getTriMesh( std::shared_ptr mesh ); std::shared_ptr getTriList( std::shared_ptr mesh ); std::shared_ptr getPointList( std::shared_ptr mesh ); std::shared_ptr getTriMesh( std::shared_ptr mesh ); std::shared_ptr getTriList( std::shared_ptr mesh ); } // IO namespace #endif