Commit ddd369c7 authored by Tomáš Oberhuber's avatar Tomáš Oberhuber
Browse files

Adding mesh builder.

parent ec5abd62
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -86,7 +86,8 @@ struct tnlMeshConfigBase
	template< typename MeshEntity >
	static constexpr bool superentityStorage( MeshEntity, int SuperentityDimensions )
	{
		return false;
      return true;
		//return false;
	}
   
   static_assert( WorldDimensions >= Cell::dimensions, "The number of the cell dimensions cannot be larger than the world dimension." );
+120 −0
Original line number Diff line number Diff line
/***************************************************************************
                          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 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;

   bool setPointsCount( const GlobalIndexType& points )
   {
      tnlAssert( 0 <= pointsCount, cerr << "pointsCount = " << points );
      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 */
+48 −28
Original line number Diff line number Diff line
@@ -80,20 +80,12 @@ class tnlMeshEntityInitializer

   tnlMeshEntityInitializer() : entity(0), entityIndex( -1 ) {}

   void init( EntityType& entity, GlobalIndexType entityIndex )
   {
      this->entity = &entity;
      this->entityIndex = entityIndex;
   }

   void initEntity( InitializerType &meshInitializer )
   void initEntity( EntityType& entity, GlobalIndexType entityIndex, InitializerType &meshInitializer )
   {
      tnlAssert( this->entity, );

      this->entity->setId( entityIndex );

      initSuperentities();
      initSubentities( meshInitializer );
      initSubentities( entity, entityIndex, meshInitializer );
      //cout << " Entity initiation done ... " << endl;
   }

@@ -148,17 +140,17 @@ class tnlMeshEntityInitializer
   EntityType *entity;
   GlobalIndexType entityIndex;

   void initSubentities( InitializerType& meshInitializer )
   void initSubentities( EntityType& entity, GlobalIndexType entityIndex, InitializerType& meshInitializer )
   {
      //cout << "   Initiating subentities of entity ... " << endl;
      SubentityBaseType::initSubentities( *this, meshInitializer );
   }

   void initSuperentities()
   /*void initSuperentities()
   {
      //cout << "   Initiating superentities..." << endl;
      //SuperentityBaseType::initSuperentities( *this) ;
   }
   }*/

   template< typename SubentityDimensionTag >
   class SubentitiesCreator
@@ -246,16 +238,16 @@ class tnlMeshEntityInitializer< ConfigTag, tnlMeshVertexTag >/*

   static tnlString getType() {};

   void init( EntityType& entity, GlobalIndexType entityIndex )
   /*void init( EntityType& entity, GlobalIndexType entityIndex )
   {
      this->entity = &entity;
      this->entityIndex = entityIndex;
   }
   }*/

   void initEntity(InitializerType &meshInitializer)
   void initEntity( EntityType& entity, GlobalIndexType entityIndex, InitializerType &meshInitializer )
   {
      this->entity->setId( this->entityIndex );
      initSuperentities();
      //initSuperentities();
      //cout << "Vertex initiation done ... " << endl;
   }

@@ -280,11 +272,11 @@ class tnlMeshEntityInitializer< ConfigTag, tnlMeshVertexTag >/*
   EntityType *entity;
   GlobalIndexType entityIndex;

   void initSuperentities()
   /*void initSuperentities()
   {
      //cout << "    Initiating superentities of vertex ..." << endl;
      //SuperentityBaseType::initSuperentities(*this);
   }
   }*/
};

/****
@@ -315,9 +307,10 @@ class tnlMeshEntityInitializerLayer< ConfigTag,
   typedef tnlMeshInitializer< ConfigTag >                                                     InitializerType;
   typedef tnlMeshEntityInitializer< ConfigTag, EntityTag >                                    EntityInitializerType;
   typedef tnlDimensionsTag< EntityTag::dimensions >                                        EntityDimensionsTag;
   typedef typename tnlMeshConfigTraits< ConfigTag >::template EntityTraits< DimensionsTag >::Type         EntityType;

   protected:
   void initSubentities( EntityInitializerType& entityInitializer,
   void initSubentities( EntityType& entity, GlobalIndexType entityIndex, EntityInitializerType& entityInitializer,
                         InitializerType& meshInitializer )
   {
      SubentityContainerType subentities;
@@ -332,6 +325,7 @@ class tnlMeshEntityInitializerLayer< ConfigTag,
         GlobalIndexType subentityIndex = meshInitializer.findEntityIndex( subentities[ i ] );
         GlobalIndexType superentityIndex = entityInitializer.getEntityIndex();
         subentityContainer[ i ] = subentityIndex;
         meshInitializer.template getSuperentityInitializer< DimensionsTag >().addSuperentity( EntityDimensionsTag(), subentityIndex, entityIndex);
         //cout << "       Setting " << i << "-th subentity to " << subentityContainer[ i ] << endl;
         //meshInitializer.getEntityInitializer( DimensionsTag(), subentityIndex ).addSuperentity( EntityDimensionsTag(), superentityIndex );
      }
@@ -362,12 +356,14 @@ class tnlMeshEntityInitializerLayer< ConfigTag,
   typedef typename tnlMeshSubentitiesTraits< ConfigTag,
                                              EntityTag,
                                              DimensionsTag >::SharedContainerType             SharedContainerType;
   typedef typename SharedContainerType::ElementType                                           GlobalIndexType;

   typedef tnlMeshInitializer< ConfigTag >                                                     InitializerType;
   typedef tnlMeshEntityInitializer< ConfigTag, EntityTag >                                    EntityInitializerType;
   typedef typename tnlMeshConfigTraits< ConfigTag >::template tnlMeshEntityTraits< DimensionsTag >::Type         EntityType;

   protected:
   void initSubentities( EntityInitializerType& entityInitializer,
   void initSubentities( EntityType& entity, GlobalIndexType entityIndex, EntityInitializerType& entityInitializer,
                         InitializerType& meshInitializer )
   {
      SubentityContainerType subentities;
@@ -413,9 +409,10 @@ class tnlMeshEntityInitializerLayer< ConfigTag,
   typedef tnlMeshInitializer< ConfigTag >                                                   InitializerType;
   typedef tnlMeshEntityInitializer< ConfigTag, EntityTag >                                  EntityInitializerType;
   typedef tnlDimensionsTag< EntityTag::dimensions >                                      EntityDimensionsTag;
   typedef typename tnlMeshConfigTraits< ConfigTag >::template tnlMeshEntityTraits< DimensionsTag >::Type         EntityType;

   protected:
   void initSubentities( EntityInitializerType& entityInitializer,
   void initSubentities( EntityType& entity, GlobalIndexType entityIndex, EntityInitializerType& entityInitializer,
                         InitializerType& meshInitializer )
   {
      SubentityContainerType subentities;
@@ -429,7 +426,8 @@ class tnlMeshEntityInitializerLayer< ConfigTag,
         GlobalIndexType subentityIndex = meshInitializer.findEntityIndex( subentities[ i ] );
         GlobalIndexType superentityIndex = entityInitializer.getEntityIndex();
         //cout << "       NOT setting " << i << "-th subentity to " << subentityIndex << endl;
         meshInitializer.getEntityInitializer( DimensionsTag(), subentityIndex ).addSuperentity( EntityDimensionsTag(), superentityIndex );
         //meshInitializer.template getSuperentityInitializer< DimensionsTag >().addSuperentity( EntityDimensionsTag(), subentityIndex, entityIndex);
         //meshInitializer.getEntityInitializer( DimensionsTag(), subentityIndex ).addSuperentity( EntityDimensionsTag(), superentityIndex );
      }
      BaseType::initSubentities( entityInitializer, meshInitializer );
   }
@@ -467,9 +465,10 @@ class tnlMeshEntityInitializerLayer< ConfigTag,
   typedef tnlMeshInitializer< ConfigTag >                           InitializerType;
   typedef tnlMeshEntityInitializer< ConfigTag, EntityTag >          EntityInitializerType;
   typedef tnlDimensionsTag< EntityTag::dimensions >              EntityDimensionsTag;
   typedef typename tnlMeshConfigTraits< ConfigTag >::template EntityTraits< DimensionsTag >::Type         EntityType;

   protected:
   void initSubentities( EntityInitializerType &entityInitializer,
   void initSubentities( EntityType& entity, GlobalIndexType entityIndex, EntityInitializerType &entityInitializer,
                         InitializerType &meshInitializer )
   {
      //cout << "      Initiating subentities with " << DimensionsTag::value << " dimensions..." << endl;
@@ -498,10 +497,17 @@ class tnlMeshEntityInitializerLayer< ConfigTag,
   typedef tnlMeshInitializer< ConfigTag >         InitializerType;
   typedef tnlMeshEntityInitializer< ConfigTag,
                                     EntityTag >   EntityInitializerType;
   typedef tnlDimensionsTag< 0 >                   DimensionsTag;
   typedef tnlMeshSubentitiesTraits< ConfigTag,
                                     EntityTag,
                                     DimensionsTag >                 SubentitiesTraits;
   typedef typename SubentitiesTraits::SharedContainerType           SharedContainerType;
   typedef typename SharedContainerType::ElementType                 GlobalIndexType;
   typedef typename tnlMeshConfigTraits< ConfigTag >::template tnlMeshEntityTraits< DimensionsTag >::Type         EntityType;

   protected:
   
   void initSubentities( EntityInitializerType&, InitializerType& ) {}
   void initSubentities( EntityType& entity, GlobalIndexType entityIndex, EntityInitializerType&, InitializerType& ) {}
};

template< typename ConfigTag,
@@ -514,9 +520,16 @@ class tnlMeshEntityInitializerLayer< ConfigTag,
{
   typedef tnlMeshInitializer< ConfigTag >                  InitializerType;
   typedef tnlMeshEntityInitializer< ConfigTag, EntityTag > EntityInitializerType;
   typedef tnlDimensionsTag< 0 >                   DimensionsTag;
   typedef tnlMeshSubentitiesTraits< ConfigTag,
                                     EntityTag,
                                     DimensionsTag >                 SubentitiesTraits;
   typedef typename SubentitiesTraits::SharedContainerType           SharedContainerType;
   typedef typename SharedContainerType::ElementType                 GlobalIndexType;
   typedef typename tnlMeshConfigTraits< ConfigTag >::template tnlMeshEntityTraits< DimensionsTag >::Type         EntityType;

   protected:
   void initSubentities( EntityInitializerType&, InitializerType& ) {}
   void initSubentities( EntityType& entity, GlobalIndexType entityIndex, EntityInitializerType&, InitializerType& ) {}
};

template< typename ConfigTag,
@@ -529,9 +542,16 @@ class tnlMeshEntityInitializerLayer< ConfigTag,
{
   typedef tnlMeshInitializer< ConfigTag >                  InitializerType;
   typedef tnlMeshEntityInitializer< ConfigTag, EntityTag > EntityInitializerType;
   typedef tnlDimensionsTag< 0 >                   DimensionsTag;
   typedef tnlMeshSubentitiesTraits< ConfigTag,
                                     EntityTag,
                                     DimensionsTag >                 SubentitiesTraits;
   typedef typename SubentitiesTraits::SharedContainerType           SharedContainerType;
   typedef typename SharedContainerType::ElementType                 GlobalIndexType;
   typedef typename tnlMeshConfigTraits< ConfigTag >::template tnlMeshEntityTraits< DimensionsTag >::Type         EntityType;

   protected:
   void initSubentities( EntityInitializerType&,
   void initSubentities( EntityType& entity, GlobalIndexType entityIndex, EntityInitializerType&,
                         InitializerType& ) {}
};

+63 −0
Original line number Diff line number Diff line
/***************************************************************************
                          tnlMeshEntitySeed.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 TNLMESHENTITYSEED_H
#define	TNLMESHENTITYSEED_H

template< typename MeshConfig,
          typename EntityTopology >
class tnlMeshEntitySeed
{
	typedef typename tnlMeshConfigTraits< MeshConfig >::template SubentityTraits< EntityTopology, tnlDimensionsTag< 0 > > SubvertexTraits;

   public:
	   typedef typename tnlMeshConfigTraits< MeshConfig >::GlobalIndexType                                      GlobalIndexType;
	   typedef typename tnlMeshConfigTraits< MeshConfig >::LocalIndexType                                       LocalIndexType;
	   //typedef typename tnlMeshConfigTraits< MeshConfig >::IdArrayAccessorType                                  IdArrayAccessorType;
      typedef typename SubvertexTraits::IdArrayType                                                            IdArrayType;

	   static constexpr LocalIndexType getCornersCount()
	   {
		   return SubvertexTraits::Count;
	   }

	   void setCornerId( LocalIndexType cornerIndex, GlobalIndexType pointIndex )
	   {
		   tnlAssert( 0 <= cornerIndex && cornerIndex < getCornersCount(), cerr << "cornerIndex = " << cornerIndex );
		   tnlAssert( 0 <= pointIndex, cerr << "pointIndex = " << pointIndex );

		   this->cornerIds[ cornerIndex ] = pointIndex;
	   }

      IdArrayType& getCornerIds()
	   {
		   return this->cornerIds;
	   }

      
	   const IdArrayType& getCornerIds() const
	   {
		   return this->cornerIds;
	   }

   private:
	
	   IdArrayType cornerIds;
};

#endif	/* TNLMESHENTITYSEED_H */
+12 −9
Original line number Diff line number Diff line
@@ -169,7 +169,7 @@ class tnlMeshInitializerLayer< ConfigTag,
            cout << "  Creating the cell number " << cell << "            \r " << flush;
         CellInitializerType& cellInitializer = cellInitializerContainer[ cell ];

         cellInitializer.init( this->getMesh().getCell( cell ), cell );
         //cellInitializer.init( this->getMesh().getCell( cell ), cell );
         BaseType::createEntitiesFromCells( cellInitializer );
      }
      if( verbose )
@@ -185,7 +185,7 @@ class tnlMeshInitializerLayer< ConfigTag,
           i++ )
      {
         //cout << "  Initiating entity " << i << " with " << DimensionsTag::value << " dimensions..." << endl;
         cellInitializerContainer[ i ].initEntity( meshInitializer );
         //cellInitializerContainer[ i ].initEntity( meshInitializer );
      }
      cellInitializerContainer.reset();
      //cout << "Initiating superentities ...." << endl;
@@ -195,7 +195,7 @@ class tnlMeshInitializerLayer< ConfigTag,

   private:
      typedef  tnlMeshSuperentityInitializerLayer< ConfigTag,
                                                   typename tnlMeshConfigTraits< ConfigTag >::CellType,
                                                   EntityTag,
                                                   typename tnlMeshTraits< ConfigTag >::DimensionsTag >  SuperentityInitializer;

      CellInitializerContainerType cellInitializerContainer;
@@ -294,12 +294,13 @@ class tnlMeshInitializerLayer< ConfigTag,
         //cout << "Initiating entity " << i << " with " << DimensionsTag::value << " dimensions..." << endl;
         EntityInitializerType& entityInitializer = entityInitializerContainer[ i ];
         //cout << "Initiating with entity " << this->getMesh().template getEntity< DimensionsTag::value >( i ) << endl;
         entityInitializer.init( this->getMesh().template getEntity< DimensionsTag::value >( i ), i );
         entityInitializer.initEntity( meshInitializer );
         //entityInitializer.init( this->getMesh().template getEntity< DimensionsTag::value >( i ), i );
         //entityInitializer.initEntity( meshInitializer );
      }

      entityInitializerContainer.reset();
      cout << "Initiating superentities..." << endl;
      cout << "Initiating superentities for entities with " << DimensionsTag::value << " dimensions ..." << endl;
      cout << "Storage is " << tnlMeshSuperentitiesTraits< ConfigTag, EntityTag, typename tnlMeshTraits< ConfigTag >::DimensionsTag >::SuperentityStorageTag::enabled << endl;
      superentityInitializer.initSuperentities( meshInitializer );
      BaseType::initEntities( meshInitializer );
   }
@@ -391,16 +392,18 @@ class tnlMeshInitializerLayer< ConfigTag,
      {
         //cout << "Initiating entity " << i << " with " << DimensionsTag::value << " dimensions..." << endl;
         VertexInitializerType& vertexInitializer = vertexInitializerContainer[ i ];
         vertexInitializer.init( vertexContainer[ i ], i );
         vertexInitializer.initEntity( meshInitializer );
         //vertexInitializer.init( vertexContainer[ i ], i );
         //vertexInitializer.initEntity( meshInitializer );
      }
      cout << "Initiating superentities for entities with " << DimensionsTag::value << " dimensions ..." << endl;
      cout << "Storage is " << tnlMeshSuperentitiesTraits< ConfigTag, EntityTag, typename tnlMeshTraits< ConfigTag >::DimensionsTag >::SuperentityStorageTag::enabled << endl;
      superentityInitializer.initSuperentities( meshInitializer );
      vertexInitializerContainer.reset();
   }

   private:
      typedef  tnlMeshSuperentityInitializerLayer< ConfigTag,
                                                   typename tnlMeshConfigTraits< ConfigTag >::CellType,
                                                   EntityTag,
                                                   typename tnlMeshTraits< ConfigTag >::DimensionsTag >  SuperentityInitializer;
      
      SuperentityInitializer superentityInitializer;
Loading