Commit 1d0b1c5d authored by Jakub Klinkovský's avatar Jakub Klinkovský
Browse files

Fixed rebinding pointers into superentity storage network after loading from file

parent 7c07f1e1
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@
#include <TNL/Meshes/MeshDetails/layers/MeshStorageLayer.h>
#include <TNL/Meshes/MeshDetails/config/MeshConfigValidator.h>
#include <TNL/Meshes/MeshDetails/initializer/MeshInitializer.h>
#include <TNL/Meshes/MeshDetails/layers/MeshSuperentityStorageRebinder.h>

namespace TNL {
namespace Meshes {
@@ -96,6 +97,9 @@ class Mesh
      MeshConfigValidator< MeshConfig > configValidator;

      friend MeshInitializer< MeshConfig >;

      template< typename Mesh, typename DimensionsTag, typename SuperdimensionsTag >
      friend struct MeshSuperentityStorageRebinderWorker;
};

template< typename MeshConfig >
+7 −1
Original line number Diff line number Diff line
@@ -130,6 +130,8 @@ load( File& file )
      std::cerr << "Mesh loading failed." << std::endl;
      return false;
   }
   // update pointers from entities into the superentity storage network
   MeshSuperentityStorageRebinder< Mesh< MeshConfig > >::exec( *this );
   return true;
}

@@ -156,7 +158,11 @@ init( const typename Mesh< MeshConfig >::MeshTraitsType::PointArrayType& points,
      const typename Mesh< MeshConfig >::MeshTraitsType::CellSeedArrayType& cellSeeds )
{
   MeshInitializer< MeshConfig> meshInitializer;
   return meshInitializer.createMesh( points, cellSeeds, *this );
   if( ! meshInitializer.createMesh( points, cellSeeds, *this ) )
      return false;
   // update pointers from entities into the superentity storage network
   MeshSuperentityStorageRebinder< Mesh< MeshConfig > >::exec( *this );
   return true;
}


+0 −7
Original line number Diff line number Diff line
@@ -130,13 +130,6 @@ class MeshInitializer
         return mesh->template getSuperentityStorageNetwork< EntityTopology, SuperdimensionsTag >();
      }

      template< int Superdimensions, typename MeshEntity, typename Storage >
      static void
      bindSuperentitiesStorageNetwork( MeshEntity& entity, const Storage& storage )
      {
         entity.template bindSuperentitiesStorageNetwork< Superdimensions >( storage );
      }

      static void
      setVertexPoint( typename MeshType::VertexType& vertex, const typename MeshType::PointType& point )
      {
+0 −3
Original line number Diff line number Diff line
@@ -111,9 +111,6 @@ class MeshSuperentityStorageInitializerLayer< MeshConfig,
               LocalIndexType i = 0;
               for( auto v_it = it->second.cbegin(); v_it != it->second.cend(); v_it++ )
                  superentitiesIndices[ i++ ] = *v_it;

               EntityType& entity = meshInitializer.template meshEntitiesArray< EntityDimensions::value >()[ entityIndex ];
               meshInitializer.template bindSuperentitiesStorageNetwork< DimensionsTag::value >( entity, superentityStorageNetwork.getValues( entityIndex++ ) );
            }

            dynamicStorageNetwork.clear();
+88 −0
Original line number Diff line number Diff line
/***************************************************************************
                          MeshSuperentityStorageRebinder.h  -  description
                             -------------------
    begin                : Oct 22, 2016
    copyright            : (C) 2014 by Tomas Oberhuber et al.
    email                : tomas.oberhuber@fjfi.cvut.cz
 ***************************************************************************/

/* See Copyright Notice in tnl/Copyright */

#pragma once

/*
 * Everything in this file is basically just a templatized version of the
 * following pseudo-code (which does not work because normal variables are not
 * usable in template arguments):
 *
 *   for( int dimensions = 0; dimensions < MeshTraitsType::meshDimensions; dimensions++ )
 *      for( int superdimensions = dimensions + 1; superdimensions <= MeshTraitsType::meshDimensions; superdimensions++ )
 *         if( EntityTraits< dimensions >::SuperentityTraits< superdimensions >::storageEnabled )
 *            for( GlobalIndexType i = 0; i < mesh.template getNumberOfEntities< dimensions >(); i++ )
 *            {
 *               auto& entity = mesh.template getEntity< dimensions >( i );
 *               entity.template bindSuperentitiesStorageNetwork< superdimensions >( mesh.template getSuperentityStorageNetwork< superdimensions >().getValues( i ) );
 *            }
 */

#include <TNL/Meshes/MeshDimensionsTag.h>

namespace TNL {
namespace Meshes {

template< typename Mesh, typename DimensionsTag, typename SuperdimensionsTag >
struct MeshSuperentityStorageRebinderWorker
{
   static void exec( Mesh& mesh )
   {
      for( typename Mesh::GlobalIndexType i = 0; i < mesh.template getNumberOfEntities< DimensionsTag::value >(); i++ )
      {
         auto& entity = mesh.template getEntity< DimensionsTag::value >( i );
         auto& storage = mesh.template getSuperentityStorageNetwork< typename Mesh::template EntityTraits< DimensionsTag::value >::EntityTopology, SuperdimensionsTag >();
         entity.template bindSuperentitiesStorageNetwork< SuperdimensionsTag::value >( storage.getValues( i ) );
      }
   }
};


template< typename Mesh, typename DimensionsTag, typename SuperdimensionsTag >
struct MeshSuperentityStorageRebinderInner
{
   static void exec( Mesh& mesh )
   {
      MeshSuperentityStorageRebinderWorker< Mesh, DimensionsTag, SuperdimensionsTag >::exec( mesh );
      MeshSuperentityStorageRebinderInner< Mesh, DimensionsTag, typename SuperdimensionsTag::Decrement >::exec( mesh );
   }
};

template< typename Mesh, typename SuperdimensionsTag >
struct MeshSuperentityStorageRebinderInner< Mesh, typename SuperdimensionsTag::Decrement, SuperdimensionsTag >
{
   static void exec( Mesh& mesh )
   {
      MeshSuperentityStorageRebinderWorker< Mesh, typename SuperdimensionsTag::Decrement, SuperdimensionsTag >::exec( mesh );
   }
};


template< typename Mesh, typename DimensionsTag = typename MeshDimensionsTag< Mesh::MeshTraitsType::meshDimensions >::Decrement >
struct MeshSuperentityStorageRebinder
{
   static void exec( Mesh& mesh )
   {
      MeshSuperentityStorageRebinderInner< Mesh, DimensionsTag, MeshDimensionsTag< Mesh::MeshTraitsType::meshDimensions > >::exec( mesh );
      MeshSuperentityStorageRebinder< Mesh, typename DimensionsTag::Decrement >::exec( mesh );
   }
};

template< typename Mesh >
struct MeshSuperentityStorageRebinder< Mesh, MeshDimensionsTag< 0 > >
{
   static void exec( Mesh& mesh )
   {
      MeshSuperentityStorageRebinderInner< Mesh, MeshDimensionsTag< 0 >, MeshDimensionsTag< Mesh::MeshTraitsType::meshDimensions > >::exec( mesh );
   }
};

} // namespace Meshes
} // namespace TNL
Loading