Skip to content
Snippets Groups Projects
tnlMeshBuilder.h 3.92 KiB
Newer Older
  • Learn to ignore specific revisions
  • Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
    /***************************************************************************
                              tnlMeshBuilder.h  -  description
                                 -------------------
        begin                : Aug 18, 2015
        copyright            : (C) 2015 by Tomas Oberhuber et al.
        email                : tomas.oberhuber@fjfi.cvut.cz
     ***************************************************************************/
    
    /***************************************************************************
     *                                                                         *
     *   This program is free software; you can redistribute it and/or modify  *
     *   it under the terms of the GNU General Public License as published by  *
     *   the Free Software Foundation; either version 2 of the License, or     *
     *   (at your option) any later version.                                   *
     *                                                                         *
     ***************************************************************************/
    
    #ifndef TNLMESHBUILDER_H
    #define	TNLMESHBUILDER_H
    
    #include <mesh/traits/tnlMeshTraits.h>
    
    template< typename Mesh >
    class tnlMeshBuilder
    {
    	//static constexpr const char *CLASS_NAME = "MeshBuilder";
    
       public:
          typedef Mesh                                     MeshType;
    
          typedef typename MeshType::MeshTraits                     MeshTraits;
          typedef typename MeshTraits::GlobalIndexType     GlobalIndexType;
          typedef typename MeshTraits::LocalIndexType      LocalIndexType;
          typedef typename MeshTraits::PointType           PointType;
          typedef typename MeshTraits::CellType            CellType;
          typedef typename MeshTraits::CellSeedType        CellSeedType;
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
    
       bool setPointsCount( const GlobalIndexType& points )
       {
    
          tnlAssert( 0 <= points, cerr << "pointsCount = " << points );
    
    Tomáš Oberhuber's avatar
    Tomáš Oberhuber committed
          this->points.setSize( points );
          this->pointsSet.setSize( points );
          pointsSet.setValue( false );
          return true;
       }
       
       bool setCellsCount( const GlobalIndexType& cellsCount )
       {
          tnlAssert( 0 <= cellsCount, cerr << "cellsCount = " << cellsCount );
          this->cellCount.setSize( cellsCount );
          return true;
       }
       
    	GlobalIndexType getPointsCount() const { return this->points.getSize(); }
    	
       GlobalIndexType getCellsCount() const  { return this->cellSeeds.getSize(); }
    
    	void setPoint( GlobalIndexType index,
                      const PointType& point )
    	{
    		tnlAssert( 0 <= index && index < getPointsCount(), cerr << "Index = " << index );
    
    		this->points[ index ] = point;
    		this->pointsSet[ index ] = true;
    	}
    
    	CellSeedType& getCellSeed( GlobalIndexType index )
    	{
    		tnlAssert( 0 <= index && index < getCellsCount(), cerr << "Index = " << index );
    
    		return this->cellSeeds[ index ];
    	}
    
    	bool build( MeshType& mesh ) const
    	{
    		if( ! this->validate() )
             return false;
    		if( ! mesh.init( this->points, this->cellSeeds ) )
             return false;
    		return true;
    	}
    
       private:
    	   typedef typename MeshTraits::PointArrayType    PointArrayType;
    	   typedef typename MeshTraits::CellSeedArrayType CellSeedArrayType;
    
    	void validate() const
    	{
    		if( !allPointsSet() )
          {
             cerr << "Mesh builder error: Not all points were set." << endl;
             return false;
          }
    
    		for( GlobalIndexType i = 0; i < getCellsCount(); i++ )
    		{
    			auto cornerIds = this->cellSeeds[ i ].getCornerIds();
    			for( LocalIndexType j = 0; j < cornerIds.getSize(); j++ )
    				if( cornerIds[ j ] < 0 || getPointsCount() <= cornerIds[ j ] )
                {
                   cerr << "Cell seed " << i << " is referencing unavailable point " << cornerIds[ j ] << endl;
                   return false;
                }
    		}
    	}
    
    	bool allPointsSet() const
    	{
    		for( GlobalIndexType i = 0; i < this->points.getSize(); i++ )
    			if (! this->pointsSet[ i ] )
    				return false;
    		return true;
    	}
    
    	PointArrayType points;
    	CellSeedArrayType cellSeeds;
    	tnlArray< bool, GlobalIndexType > pointsSet;
    };
    
    #endif	/* TNLMESHBUILDER_H */