diff --git a/CMakeLists.txt b/CMakeLists.txt index 790a013ccef2c2c336deaae8aa18772942675224..a8230b06237cb4aa808e665d5f1b2e8e2c38719d 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -144,11 +144,11 @@ if( WITH_CUDA STREQUAL "yes" ) endif( NOT WITH_CUSPARSE STREQUAL "no" ) else( CUDA_FOUND ) - AddCompilerFlag( "-std=gnu++0x" ) + AddCompilerFlag( "-std=c++11" ) endif( CUDA_FOUND ) else( WITH_CUDA STREQUAL "yes" ) #AddCompilerFlag( "-std=gnu++0x -ftree-vectorizer-verbose=1" ) - AddCompilerFlag( "-std=gnu++0x" ) + AddCompilerFlag( "-std=c++11" ) endif( WITH_CUDA STREQUAL "yes" ) #### diff --git a/TODO b/TODO index c8ed457124545ba0f48fc89c85a1777e92ca1339..a6e199989ef8ea7b58c05dcdc9e55cf3af8d039f 100644 --- a/TODO +++ b/TODO @@ -1,8 +1,14 @@ +TODO: Mesh + * vsechny traits zkusit presunout do jednotneho MeshTraits, tj. temer MeshConfigTraits ale pojmenovat jako MeshTraits + * omezit tnlDimesnionsTag - asi to ale nepujde + - ale pozor na konstrukce jako BaseType::superentityIdsArray< SuperDimensionTag >( DimensionsTag ); ( v tnlMesh.h) + * prejmenovat Tagy v topologies na Topology zrejme + * zrusit tnlStorageTraits + TODO: v tnlMeshResolver se provadi preklad pro vsechny mozne sablonove parametry => prorezat TODO: napsat FunctionDiscretizer pro jednotne rozhrani RightHandSide -TODO: doplnit mesh travelsals pro jine mesh entity nez cell TODO: implementace maticovych resicu * Gaussova eliminace * SOR metoda diff --git a/examples/heat-equation/tnl-heat-equation-eoc.h b/examples/heat-equation/tnl-heat-equation-eoc.h index 7001a2d71c0dc45166468a752844847794c0cc82..6c4beddcb0ac46b111a1a2a6f35e580a10e191ed 100644 --- a/examples/heat-equation/tnl-heat-equation-eoc.h +++ b/examples/heat-equation/tnl-heat-equation-eoc.h @@ -28,10 +28,10 @@ #include <problems/tnlHeatEquationEocRhs.h> #include <problems/tnlHeatEquationEocProblem.h> -//typedef tnlDefaultBuildConfigTag BuildConfig; +//typedef tnlDefaultBuildMeshConfig BuildConfig; typedef tnlFastBuildConfig BuildConfig; -template< typename ConfigTag > +template< typename MeshConfig > class heatEquationEocConfig { public: @@ -47,7 +47,7 @@ template< typename Real, typename Device, typename Index, typename MeshType, - typename ConfigTag, + typename MeshConfig, typename SolverStarter > class heatEquationSetter { diff --git a/examples/heat-equation/tnl-heat-equation.h b/examples/heat-equation/tnl-heat-equation.h index 77c3121bc4718c06921cb67789224054ff1ed041..e094ea425c6198aacb251f2952fb710ea97fcda9 100644 --- a/examples/heat-equation/tnl-heat-equation.h +++ b/examples/heat-equation/tnl-heat-equation.h @@ -29,10 +29,10 @@ #include <functors/tnlConstantFunction.h> #include <problems/tnlHeatEquationProblem.h> -//typedef tnlDefaultBuildConfigTag BuildConfig; +//typedef tnlDefaultBuildMeshConfig BuildConfig; typedef tnlFastBuildConfig BuildConfig; -template< typename ConfigTag > +template< typename MeshConfig > class heatEquationConfig { public: @@ -54,7 +54,7 @@ template< typename Real, typename Device, typename Index, typename MeshType, - typename ConfigTag, + typename MeshConfig, typename SolverStarter > class heatEquationSetter { diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index 8849e1ed82bfc9446f9bfe4e8894a3bf1af66c57..35c8e31c3f0566502371b645d1e289bd5c74f000 100755 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -2,6 +2,7 @@ ADD_SUBDIRECTORY( arrays ) ADD_SUBDIRECTORY( containers ) ADD_SUBDIRECTORY( cuda ) ADD_SUBDIRECTORY( vectors ) +ADD_SUBDIRECTORY( multimaps ) set (headers tnlAssert.h tnlConstants.h diff --git a/src/core/arrays/tnlSharedArray_impl.h b/src/core/arrays/tnlSharedArray_impl.h index 9b7b2a5b0baa13c60c53f91e9113d42428076728..128bcc3ea4200ca0c5532fb87cd8f8a39f3a3d78 100644 --- a/src/core/arrays/tnlSharedArray_impl.h +++ b/src/core/arrays/tnlSharedArray_impl.h @@ -126,8 +126,9 @@ void tnlSharedArray< Element, Device, Index > :: bind( Array& array, IndexType index, IndexType size ) { - tnlStaticAssert( Array::DeviceType::DeviceType == DeviceType::DeviceType, - "Attempt to bind arrays between different devices." ); + //tnlStaticAssert( Array::DeviceType::DeviceType == DeviceType::DeviceType, + // "Attempt to bind arrays between different devices." ); + // TODO: fix this - it does nto work with tnlStaticArray this->data = &( array. getData()[ index ] ); if( ! size ) this->size = array. getSize(); diff --git a/src/core/arrays/tnlStaticArray.h b/src/core/arrays/tnlStaticArray.h index 27d796fe17bbd644dbbc27e462b2ea77a99754fd..1cb52742d0367aed6905f6bebd3b60a3e79d2542 100644 --- a/src/core/arrays/tnlStaticArray.h +++ b/src/core/arrays/tnlStaticArray.h @@ -86,6 +86,8 @@ class tnlStaticArray bool load( tnlFile& file); void sort(); + + ostream& write( ostream& str, const char* separator = " " ) const; protected: Element data[ Size ]; @@ -160,6 +162,8 @@ class tnlStaticArray< 1, Element > bool load( tnlFile& file); void sort(); + + ostream& write( ostream& str, const char* separator = " " ) const; protected: Element data[ size ]; @@ -245,6 +249,8 @@ class tnlStaticArray< 2, Element > bool load( tnlFile& file); void sort(); + + ostream& write( ostream& str, const char* separator = " " ) const; protected: Element data[ size ]; @@ -338,6 +344,8 @@ class tnlStaticArray< 3, Element > bool load( tnlFile& file); void sort(); + + ostream& write( ostream& str, const char* separator = " " ) const; protected: Element data[ size ]; diff --git a/src/core/arrays/tnlStaticArray1D_impl.h b/src/core/arrays/tnlStaticArray1D_impl.h index fcf591fbb49800fee617be242f6486c522a8b0a7..60c004c426d4de439d623a78d529c5404550d17d 100644 --- a/src/core/arrays/tnlStaticArray1D_impl.h +++ b/src/core/arrays/tnlStaticArray1D_impl.h @@ -184,6 +184,13 @@ void tnlStaticArray< 1, Element >::sort() { } +template< typename Element > +ostream& tnlStaticArray< 1, Element >::write( ostream& str, const char* separator ) const +{ + str << data[ 0 ]; + return str; +} + #ifdef TEMPLATE_EXPLICIT_INSTANTIATION // TODO: it does not work with CUDA diff --git a/src/core/arrays/tnlStaticArray2D_impl.h b/src/core/arrays/tnlStaticArray2D_impl.h index 479c844676d4ab41a88f34bff14eb3c71005ad1d..22f5b6da185a50ee260ad598bb30897a43596831 100644 --- a/src/core/arrays/tnlStaticArray2D_impl.h +++ b/src/core/arrays/tnlStaticArray2D_impl.h @@ -215,6 +215,13 @@ void tnlStaticArray< 2, Element >::sort() Swap( data[ 0 ], data[ 1 ] ); } +template< typename Element > +ostream& tnlStaticArray< 2, Element >::write( ostream& str, const char* separator ) const +{ + str << data[ 0 ] << separator << data[ 1 ]; + return str; +} + #ifdef TEMPLATE_EXPLICIT_INSTANTIATION // TODO: it does not work with CUDA diff --git a/src/core/arrays/tnlStaticArray3D_impl.h b/src/core/arrays/tnlStaticArray3D_impl.h index 4b502e19517ad3cbf892f99945d6d3de1aa2c6bb..775b11dd50543a78212d069493f41b42afa17d86 100644 --- a/src/core/arrays/tnlStaticArray3D_impl.h +++ b/src/core/arrays/tnlStaticArray3D_impl.h @@ -242,6 +242,14 @@ void tnlStaticArray< 3, Element >::sort() Swap( data[ 0 ], data[ 1 ] ); } +template< typename Element > +ostream& tnlStaticArray< 3, Element >::write( ostream& str, const char* separator ) const +{ + str << data[ 0 ] << separator << data[ 1 ] << separator << data[ 2 ]; + return str; +} + + #ifdef TEMPLATE_EXPLICIT_INSTANTIATION // TODO: it does not work with CUDA diff --git a/src/core/arrays/tnlStaticArray_impl.h b/src/core/arrays/tnlStaticArray_impl.h index 96a6b44b905ce4bf45b32583ed1568b105a96039..1020f00d41a0e09da68dbd09b4e171482d57ea54 100644 --- a/src/core/arrays/tnlStaticArray_impl.h +++ b/src/core/arrays/tnlStaticArray_impl.h @@ -189,15 +189,25 @@ void tnlStaticArray< Size, Element >::sort() Swap( data[ i ], data[ i+1 ] ); } +template< int Size, typename Element > +ostream& tnlStaticArray< Size, Element >::write( ostream& str, const char* separator ) const +{ + for( int i = 0; i < Size - 1; i++ ) + str << data[ i ] << separator; + str << data[ Size - 1 ]; + return str; +} + template< int Size, typename Element > ostream& operator << ( ostream& str, const tnlStaticArray< Size, Element >& a ) { - for( int i = 0; i < Size - 1; i ++ ) + a.write( str, "," ); + /*for( int i = 0; i < Size - 1; i ++ ) { str << a[ i ] << ", "; } - str << a[ Size - 1 ]; + str << a[ Size - 1 ];*/ return str; }; diff --git a/src/core/multimaps/CMakeLists.txt b/src/core/multimaps/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..7f705ebcd59e2279a84c79ea1aad95f3f3a35990 --- /dev/null +++ b/src/core/multimaps/CMakeLists.txt @@ -0,0 +1,20 @@ +SET( headers tnlEllpackIndexMultimap.h + tnlEllpackIndexMultimap_impl.h + tnlEllpackIndexMultimapValues.h + tnlEllpackIndexMultimapValues_impl.h ) + +SET( CURRENT_DIR ${CMAKE_SOURCE_DIR}/src/core/multimaps ) +set( common_SOURCES + ) + +IF( BUILD_CUDA ) + set( tnl_core_multimaps_CUDA__SOURCES + ${common_SOURCES} + PARENT_SCOPE ) +ENDIF() + +set( tnl_core_multimaps_SOURCES + ${common_SOURCES} + PARENT_SCOPE ) + +INSTALL( FILES ${headers} DESTINATION include/tnl-${tnlVersion}/core/multimaps ) \ No newline at end of file diff --git a/src/core/multimaps/tnlEllpackIndexMultimap.h b/src/core/multimaps/tnlEllpackIndexMultimap.h new file mode 100644 index 0000000000000000000000000000000000000000..c7be27b4585936ad9229b56699edfa93e7cb2e56 --- /dev/null +++ b/src/core/multimaps/tnlEllpackIndexMultimap.h @@ -0,0 +1,72 @@ +/*************************************************************************** + tnlEllpackIndexMultimap.h - description + ------------------- + begin : Sep 9, 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 TNLELLPACKINDEXMULTIMAP_H +#define TNLELLPACKINDEXMULTIMAP_H + +#include <core/vectors/tnlVector.h> + +template< typename Index = int, + typename Device = tnlHost > +class tnlEllpackIndexMultimapValues; + +template< typename Index = int, + typename Device = tnlHost > +class tnlEllpackIndexMultimapConstValues; + +template< typename Index = int, + typename Device = tnlHost > +class tnlEllpackIndexMultimap +{ + public: + + typedef Device DeviceType; + typedef Index IndexType; + typedef tnlEllpackIndexMultimapValues< IndexType, DeviceType > ValuesAccessorType; + typedef tnlEllpackIndexMultimapConstValues< IndexType, DeviceType > ConstValuesAccessorType; + typedef tnlVector< IndexType, DeviceType, IndexType > ValuesAllocationVectorType; + + tnlEllpackIndexMultimap(); + + static tnlString getType(); + + tnlString getTypeVirtual() const; + + void setRanges( const IndexType keysRange, + const IndexType valuesRange ); + + const IndexType getKeysRange() const; + + const IndexType getValuesRange() const; + + void allocate( const ValuesAllocationVectorType& portsCount ); + + ValuesAccessorType getValues( const IndexType& inputIndex ); + + ConstValuesAccessorType getValues( const IndexType& inputIndex ) const; + + protected: + + tnlVector< IndexType, DeviceType, IndexType > values; + + IndexType keysRange, valuesRange, valuesMaxCount; +}; + +#include <core/multimaps/tnlEllpackIndexMultimap_impl.h> + +#endif /* TNLELLPACKINDEXMULTIMAP_H */ + diff --git a/src/core/multimaps/tnlEllpackIndexMultimapValues.h b/src/core/multimaps/tnlEllpackIndexMultimapValues.h new file mode 100644 index 0000000000000000000000000000000000000000..cba0ee8aa0ff22f6783c83cb6b3c9ada0085c870 --- /dev/null +++ b/src/core/multimaps/tnlEllpackIndexMultimapValues.h @@ -0,0 +1,70 @@ +/*************************************************************************** + tnlEllpackIndexMultimapValues.h - description + ------------------- + begin : Sep 10, 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 TNLELLPACKINDEXMULTIMAPVALUES_H +#define TNLELLPACKINDEXMULTIMAPVALUES_H + +#include <ostream> +#include <core/multimaps/tnlEllpackIndexMultimap.h> + +template< typename Index, + typename Device > +class tnlEllpackIndexMultimapValues +{ + public: + + typedef Device DeviceType; + typedef Index IndexType; + typedef tnlEllpackIndexMultimap< IndexType, DeviceType > NetworkType; + + tnlEllpackIndexMultimapValues(); + + IndexType getPortsCount() const; + + void setOutput( const IndexType portIndex, + const IndexType output ); + + IndexType getOutput( const IndexType portIndex ) const; + + IndexType& operator[]( const IndexType portIndex ); + + const IndexType& operator[]( const IndexType portIndex ) const; + + void print( std::ostream& str ) const; + + protected: + + tnlEllpackIndexMultimapValues( IndexType* ports, + const IndexType input, + const IndexType portsMaxCount ); + + IndexType* ports; + + IndexType step, portsMaxCount; + + friend tnlEllpackIndexMultimap< IndexType, DeviceType >; +}; + +template< typename Index, + typename Device > +std::ostream& operator << ( std::ostream& str, const tnlEllpackIndexMultimapValues< Index, Device>& ports ); + +#include <core/multimaps/tnlEllpackIndexMultimapValues_impl.h> + + +#endif /* TNLELLPACKINDEXMULTIMAPVALUES_H */ + diff --git a/src/core/multimaps/tnlEllpackIndexMultimapValues_impl.h b/src/core/multimaps/tnlEllpackIndexMultimapValues_impl.h new file mode 100644 index 0000000000000000000000000000000000000000..0441495b7a4f83568c77176285e87d35a379fa61 --- /dev/null +++ b/src/core/multimaps/tnlEllpackIndexMultimapValues_impl.h @@ -0,0 +1,114 @@ +/*************************************************************************** + tnlEllpackIndexMultimapValues_impl.h - description + ------------------- + begin : Sep 10, 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 TNLELLPACKINDEXMULTIMAPVALUES_IMPL_H +#define TNLELLPACKINDEXMULTIMAPVALUES_IMPL_H + +#include "tnlEllpackIndexMultimapValues.h" + + +template< typename Index, + typename Device > +tnlEllpackIndexMultimapValues< Index, Device >:: +tnlEllpackIndexMultimapValues() +{ +} + +template< typename Index, + typename Device > +tnlEllpackIndexMultimapValues< Index, Device >:: +tnlEllpackIndexMultimapValues( IndexType* networkPorts, + const IndexType input, + const IndexType portsMaxCount ) +{ + this->ports = &networkPorts[ input * portsMaxCount ]; + this->portsMaxCount = portsMaxCount; +} + +template< typename Index, + typename Device > +Index +tnlEllpackIndexMultimapValues< Index, Device >:: +getPortsCount() const +{ + return this->portsMaxCount; +} + +template< typename Index, + typename Device > +void +tnlEllpackIndexMultimapValues< Index, Device >:: +setOutput( const IndexType portIndex, + const IndexType output ) +{ + this->ports[ portIndex ] = output; +} + +template< typename Index, + typename Device > +Index +tnlEllpackIndexMultimapValues< Index, Device >:: +getOutput( const IndexType portIndex ) const +{ + return this->ports[ portIndex ]; +} + +template< typename Index, + typename Device > +Index& +tnlEllpackIndexMultimapValues< Index, Device >:: +operator[]( const IndexType portIndex ) +{ + return this->ports[ portIndex ]; +} + +template< typename Index, + typename Device > +const Index& +tnlEllpackIndexMultimapValues< Index, Device >:: +operator[]( const IndexType portIndex ) const +{ + return this->ports[ portIndex ]; +} + +template< typename Index, + typename Device > +void +tnlEllpackIndexMultimapValues< Index, Device >:: +print( std::ostream& str ) const +{ + if( this->getPortsCount() == 0 ) + { + str << "[]"; + return; + } + str << "[ " << this->getOutput( 0 ); + for( Index i = 1; i < this->getPortsCount(); i++ ) + str << ", " << this->getOutput( i ); + str << " ]"; +} + +template< typename Index, + typename Device > +std::ostream& operator << ( std::ostream& str, const tnlEllpackIndexMultimapValues< Index, Device>& ports ) +{ + ports.print( str ); + return str; +} + +#endif /* TNLELLPACKGRAPHLINKSACCESSOR_IMPL_H */ + diff --git a/src/core/multimaps/tnlEllpackIndexMultimap_impl.h b/src/core/multimaps/tnlEllpackIndexMultimap_impl.h new file mode 100644 index 0000000000000000000000000000000000000000..0434bd445db60115b42b9a939eae64671b6c0ff7 --- /dev/null +++ b/src/core/multimaps/tnlEllpackIndexMultimap_impl.h @@ -0,0 +1,116 @@ +/*************************************************************************** + tnlEllpackIndexMultimap_impl.h - description + ------------------- + begin : Sep 9, 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 TNLELLPACKINDEXMULTIMAP_IMPL_H +#define TNLELLPACKINDEXMULTIMAP_IMPL_H + +#include <core/multimaps/tnlEllpackIndexMultimap.h> +#include <core/multimaps/tnlEllpackIndexMultimapValues.h> + + +template< typename Index, + typename Device > +tnlEllpackIndexMultimap< Index, Device >:: +tnlEllpackIndexMultimap() +: keysRange( 0 ), valuesRange( 0 ), valuesMaxCount( 0 ) +{ +} + +template< typename Index, + typename Device > +tnlString tnlEllpackIndexMultimap< Index, Device > :: getType() +{ + return tnlString( "tnlEllpackIndexMultimap< ") + + Device :: getDeviceType() + + tnlString( ", " ) + + tnlString( ::getType< Index >() ) + + tnlString( " >" ); +} + +template< typename Index, + typename Device > +tnlString tnlEllpackIndexMultimap< Index, Device >::getTypeVirtual() const +{ + return this->getType(); +} + +template< typename Index, + typename Device > +void +tnlEllpackIndexMultimap< Index, Device >:: +setRanges( const IndexType inputs, + const IndexType outputs ) +{ + this->keysRange = inputs; + this->valuesRange = outputs; +} + +template< typename Index, + typename Device > +const Index +tnlEllpackIndexMultimap< Index, Device >:: +getKeysRange() const +{ + return this->keysRange; +} + +template< typename Index, + typename Device > +const Index +tnlEllpackIndexMultimap< Index, Device >:: +getValuesRange() const +{ + return this->valuesRange; +} + +template< typename Index, + typename Device > +void +tnlEllpackIndexMultimap< Index, Device >:: +allocate( const ValuesAllocationVectorType& portsCount ) +{ + tnlAssert( portsCount.getSize() == this->keysRange, + cerr << "portsCount.getSize() = " << portsCount.getSize() + << "this->inputs = " << this->keysRange ); + this->valuesMaxCount = portsCount.max(); + + tnlAssert( this->valuesMaxCount >= 0 && this->valuesMaxCount <= this->valuesRange, + cerr << "this->portsMaxCount = " << this->valuesMaxCount + << " this->outputs = " << this->valuesRange ); + this->values.setSize( this->keysRange * this->valuesMaxCount ); +} + +template< typename Index, + typename Device > +typename tnlEllpackIndexMultimap< Index, Device >::ValuesAccessorType +tnlEllpackIndexMultimap< Index, Device >:: +getValues( const IndexType& inputIndex ) +{ + return ValuesAccessorType( this->values.getData(), inputIndex, this->valuesMaxCount ); +} + +template< typename Index, + typename Device > +typename tnlEllpackIndexMultimap< Index, Device >::ConstValuesAccessorType +tnlEllpackIndexMultimap< Index, Device >:: +getValues( const IndexType& inputIndex ) const +{ + return ConstPortsType( this->values.getData(), inputIndex, this->valuesMaxCount ); +} + +#endif /* TNLELLPACKGRAPH_IMPL_H */ + diff --git a/src/core/tnlIndexedSet.h b/src/core/tnlIndexedSet.h index 1762afdd836b993b16bd7411cd48537a33b2c734..1af9f4c201535106e8968dd80232ad772d27efa5 100644 --- a/src/core/tnlIndexedSet.h +++ b/src/core/tnlIndexedSet.h @@ -47,7 +47,7 @@ class tnlIndexedSet const Element& getElement( KeyType key ) const; Element& getElement( KeyType key ); - + void print( ostream& str ) const; protected: diff --git a/src/core/vectors/tnlSharedVector.h b/src/core/vectors/tnlSharedVector.h index ed22e01bec0ee7fcc01da6f4505b5250d162e57e..a933431de89c2b43bc0dac7224a636c7b73c1cfc 100644 --- a/src/core/vectors/tnlSharedVector.h +++ b/src/core/vectors/tnlSharedVector.h @@ -20,7 +20,7 @@ #include <core/arrays/tnlSharedArray.h> #include <core/vectors/tnlVector.h> -#include <functors/tnlFunctionType.h> +#include <functors/tnlFunction.h> class tnlHost; @@ -37,6 +37,8 @@ class tnlSharedVector : public tnlSharedArray< Real, Device, Index > typedef tnlSharedVector< Real, tnlHost, Index > HostType; typedef tnlSharedVector< Real, tnlCuda, Index > CudaType; + //static constexpr tnlFunctionType getFunctionType() { return tnlDiscreteFunction; } + enum { functionType = tnlDiscreteFunction }; __cuda_callable__ tnlSharedVector(); @@ -151,16 +153,6 @@ class tnlSharedVector : public tnlSharedArray< Real, Device, Index > }; -template< typename Real, - typename Device, - typename Index > -class tnlFunctionType< tnlSharedVector< Real, Device, Index > > -{ - public: - - enum { Type = tnlDiscreteFunction }; -}; - #include <core/vectors/tnlSharedVector_impl.h> #endif /* TNLSHAREDVECTOR_H_ */ diff --git a/src/core/vectors/tnlVector.h b/src/core/vectors/tnlVector.h index a5c029e1048ba973e9aa915787231371c742a55d..5108b1835516f3f3dff702724b9e5c921b2a40f8 100644 --- a/src/core/vectors/tnlVector.h +++ b/src/core/vectors/tnlVector.h @@ -19,7 +19,7 @@ #define TNLVECTOR_H_ #include <core/arrays/tnlArray.h> -#include <functors/tnlFunctionType.h> +#include <functors/tnlFunction.h> class tnlHost; @@ -36,6 +36,8 @@ class tnlVector : public tnlArray< Real, Device, Index > typedef tnlVector< Real, tnlHost, Index > HostType; typedef tnlVector< Real, tnlCuda, Index > CudaType; + //static constexpr tnlFunctionType getFunctionType() { return tnlDiscreteFunction; } + enum { functionType = tnlDiscreteFunction }; tnlVector(); @@ -137,16 +139,6 @@ class tnlVector : public tnlArray< Real, Device, Index > void computeExclusivePrefixSum( const IndexType begin, const IndexType end ); }; -template< typename Real, - typename Device, - typename Index > -class tnlFunctionType< tnlVector< Real, Device, Index > > -{ - public: - - enum { Type = tnlDiscreteFunction }; -}; - #include <core/vectors/tnlVector_impl.h> #endif /* TNLVECTOR_H_ */ diff --git a/src/functors/CMakeLists.txt b/src/functors/CMakeLists.txt index 8b8dae1c5b86e9a3753a7e0003d1c657a1f3ce30..40cfe1e8adfade5df233663ba4817361824b130d 100755 --- a/src/functors/CMakeLists.txt +++ b/src/functors/CMakeLists.txt @@ -12,7 +12,7 @@ SET( headers tnlFunctionDiscretizer.h tnlSinWaveFunction.h tnlSinWaveFunction_impl.h tnlTestFunction.h - tnlFunctionType.h + tnlFunction.h tnlTestFunction_impl.h ) SET( CURRENT_DIR ${CMAKE_SOURCE_DIR}/src/functors ) diff --git a/src/functors/tnlConstantFunction.h b/src/functors/tnlConstantFunction.h index df85597ef742b7d5eb9cc9877b99ecb3d6429ba0..c382347a01e66f319b8ef1f0280434abfb9aceff 100644 --- a/src/functors/tnlConstantFunction.h +++ b/src/functors/tnlConstantFunction.h @@ -20,11 +20,11 @@ #include <iostream> #include <core/vectors/tnlStaticVector.h> -#include <functors/tnlFunctionType.h> +#include <functors/tnlFunction.h> template< int FunctionDimensions, typename Real = double > -class tnlConstantFunction +class tnlConstantFunction : public tnlFunction< tnlAnalyticFunction> { public: @@ -80,15 +80,6 @@ std::ostream& operator << ( std::ostream& str, const tnlConstantFunction< Functi return str; } -template< int FunctionDimensions, - typename Real > -class tnlFunctionType< tnlConstantFunction< FunctionDimensions, Real > > -{ - public: - - enum { Type = tnlAnalyticFunction }; -}; - #include <functors/tnlConstantFunction_impl.h> #endif /* TNLCONSTANTFUNCTION_H_ */ diff --git a/src/functors/tnlExpBumpFunction.h b/src/functors/tnlExpBumpFunction.h index 1159f1849f3bd4bb911a321f8843c70312fe3efa..9774bfcf5727a72753817d73b78b73c274f77318 100644 --- a/src/functors/tnlExpBumpFunction.h +++ b/src/functors/tnlExpBumpFunction.h @@ -20,13 +20,13 @@ #include <config/tnlParameterContainer.h> #include <core/vectors/tnlStaticVector.h> -#include <functors/tnlFunctionType.h> +#include <functors/tnlFunction.h> template< typename Real > -class tnlExpBumpFunctionBase +class tnlExpBumpFunctionBase : public tnlFunction< tnlAnalyticFunction > { public: - + typedef Real RealType; bool setup( const tnlParameterContainer& parameters, @@ -143,16 +143,6 @@ ostream& operator << ( ostream& str, const tnlExpBumpFunction< Dimensions, Real return str; } -template< int FunctionDimensions, - typename Real > -class tnlFunctionType< tnlExpBumpFunction< FunctionDimensions, Real > > -{ - public: - - enum { Type = tnlAnalyticFunction }; -}; - - #include <functors/tnlExpBumpFunction_impl.h> diff --git a/src/functors/tnlFunctionType.h b/src/functors/tnlFunction.h similarity index 65% rename from src/functors/tnlFunctionType.h rename to src/functors/tnlFunction.h index 33149ab8885fb1371bcbd33dc5158acd8c1dff80..38b6412fc7e450d0681d7381f6e84e99c872081a 100644 --- a/src/functors/tnlFunctionType.h +++ b/src/functors/tnlFunction.h @@ -1,7 +1,7 @@ /*************************************************************************** - tnlFunctionType.h - description + tnlFunction.h - description ------------------- - begin : Jan 10, 2015 + begin : Nov 8, 2015 copyright : (C) 2015 by oberhuber email : tomas.oberhuber@fjfi.cvut.cz ***************************************************************************/ @@ -15,17 +15,22 @@ * * ***************************************************************************/ -#ifndef TNLFUNCTIONTYPE_H_ -#define TNLFUNCTIONTYPE_H_ -enum tnlFunctionTypeEnum { tnlGeneralFunction, tnlDiscreteFunction, tnlAnalyticFunction }; +#ifndef TNLFUNCTION_H +#define TNLFUNCTION_H -template< typename Function > -class tnlFunctionType +enum tnlFunctionType { tnlGeneralFunction, + tnlDiscreteFunction, + tnlAnalyticFunction }; + +template< tnlFunctionType FunctionType > +class tnlFunction { public: - - enum { Type = tnlGeneralFunction }; + + //static constexpr tnlFunctionType getFunctionType() { return FunctionType; } + enum { functionType = FunctionType }; }; -#endif /* TNLFUNCTIONTYPE_H_ */ +#endif /* TNLFUNCTION_H */ + diff --git a/src/functors/tnlFunctorAdapter.h b/src/functors/tnlFunctorAdapter.h index 3d6a96df58f61a84357cb6927487881816b5ef3f..4369754f45c36f4f25ed2e111247741931f57c83 100644 --- a/src/functors/tnlFunctorAdapter.h +++ b/src/functors/tnlFunctorAdapter.h @@ -19,11 +19,11 @@ #define tnlFunctorAdapter_H_ #include <functors/tnlConstantFunction.h> -#include <functors/tnlFunctionType.h> +#include <functors/tnlFunction.h> template< typename Mesh, typename Function, - int FunctionType = tnlFunctionType< Function >::Type > + int FunctionType = Function::functionType > class tnlFunctorAdapter { }; diff --git a/src/functors/tnlSinBumpsFunction.h b/src/functors/tnlSinBumpsFunction.h index 2b3183f8c252605c7501c9e88312d6a207a860d5..984c018b960a9cab10f5994434f985951e5630bd 100644 --- a/src/functors/tnlSinBumpsFunction.h +++ b/src/functors/tnlSinBumpsFunction.h @@ -20,13 +20,13 @@ #include <config/tnlParameterContainer.h> #include <core/vectors/tnlStaticVector.h> -#include <functors/tnlFunctionType.h> +#include <functors/tnlFunction.h> template< typename Vertex > -class tnlSinBumpsFunctionBase +class tnlSinBumpsFunctionBase : public tnlFunction< tnlAnalyticFunction > { public: - + typedef Vertex VertexType; typedef typename Vertex::RealType RealType; enum { Dimensions = VertexType::size }; @@ -158,15 +158,6 @@ ostream& operator << ( ostream& str, const tnlSinBumpsFunction< Dimensions, Real return str; } -template< int FunctionDimensions, - typename Real > -class tnlFunctionType< tnlSinBumpsFunction< FunctionDimensions, Real > > -{ - public: - - enum { Type = tnlAnalyticFunction }; -}; - #include <functors/tnlSinBumpsFunction_impl.h> diff --git a/src/functors/tnlSinWaveFunction.h b/src/functors/tnlSinWaveFunction.h index e6d066d80d73a3a7f67fc4495b5f01fe545e6ff6..3e3025c29bf5d89a93c03a2838f8747f00c2c2cb 100644 --- a/src/functors/tnlSinWaveFunction.h +++ b/src/functors/tnlSinWaveFunction.h @@ -20,13 +20,13 @@ #include <config/tnlParameterContainer.h> #include <core/vectors/tnlStaticVector.h> -#include <functors/tnlFunctionType.h> +#include <functors/tnlFunction.h> template< typename Real = double > -class tnlSinWaveFunctionBase +class tnlSinWaveFunctionBase : public tnlFunction< tnlAnalyticFunction > { public: - + tnlSinWaveFunctionBase(); bool setup( const tnlParameterContainer& parameters, @@ -141,15 +141,6 @@ ostream& operator << ( ostream& str, const tnlSinWaveFunction< Dimensions, Real return str; } -template< int FunctionDimensions, - typename Real > -class tnlFunctionType< tnlSinWaveFunction< FunctionDimensions, Real > > -{ - public: - - enum { Type = tnlAnalyticFunction }; -}; - #include <functors/tnlSinWaveFunction_impl.h> #endif /* TNLSINWAVEFUNCTION_H_ */ diff --git a/src/matrices/tnlCSRMatrix_impl.h b/src/matrices/tnlCSRMatrix_impl.h index 14e889e1d813e28703886ea285869fe895657849..0ac092be1bdbb5836eb7c873c6f01020052dfa5a 100644 --- a/src/matrices/tnlCSRMatrix_impl.h +++ b/src/matrices/tnlCSRMatrix_impl.h @@ -206,7 +206,6 @@ bool tnlCSRMatrix< Real, Device, Index >::addElementFast( const IndexType row, this->values[ elementPtr ] = value; return true; } - return false; } template< typename Real, diff --git a/src/matrices/tnlEllpackMatrix_impl.h b/src/matrices/tnlEllpackMatrix_impl.h index 410f58b1be0199ccb7a211629466a5e868867cc0..89ebd9d1a370bf3daeabbbca38804009add4e2d8 100644 --- a/src/matrices/tnlEllpackMatrix_impl.h +++ b/src/matrices/tnlEllpackMatrix_impl.h @@ -39,6 +39,8 @@ tnlString tnlEllpackMatrix< Real, Device, Index > :: getType() tnlString( ::getType< Real >() ) + tnlString( ", " ) + Device :: getDeviceType() + + tnlString( ", " ) + + tnlString( ::getType< Index >() ) + tnlString( " >" ); } diff --git a/src/mesh/CMakeLists.txt b/src/mesh/CMakeLists.txt index e8ce9f1ba659cf569a2e81a280e2a18106af2c05..7b6f21c12c00b882d9a26a81c8e7354f5e44b26a 100755 --- a/src/mesh/CMakeLists.txt +++ b/src/mesh/CMakeLists.txt @@ -1,38 +1,25 @@ ADD_SUBDIRECTORY( config ) +ADD_SUBDIRECTORY( grids ) +ADD_SUBDIRECTORY( initializer ) ADD_SUBDIRECTORY( layers ) ADD_SUBDIRECTORY( traits ) ADD_SUBDIRECTORY( topologies ) SET( headers tnlGrid.h - tnlGrid1D.h - tnlGrid1D_impl.h - tnlGrid2D.h - tnlGrid2D_impl.h - tnlGrid3D.h - tnlGrid3D_impl.h tnlDummyMesh.h + tnlDimensionsTag.h tnlGnuplotWriter.h tnlMesh.h tnlMeshEntity.h tnlMeshEntityId.h - tnlMeshEntityKey.h tnlMeshReaderNetgen.h tnlMeshWriterNetgen.h - tnlMeshInitializer.h tnlMeshIntegrityChecker.h - tnlMeshEntityInitializer.h - tnlMeshSuperentityInitializerLayer.h tnlTraverser.h - tnlTraverser_Grid1D.h - tnlTraverser_Grid1D_impl.h - tnlTraverser_Grid2D.h - tnlTraverser_Grid2D_impl.h - tnlTraverser_Grid3D.h - tnlTraverser_Grid3D_impl.h ) + ) SET( CURRENT_DIR ${CMAKE_SOURCE_DIR}/src/mesh ) SET( tnl_mesh_SOURCES - ${CURRENT_DIR}/tnlGrid_impl.cpp PARENT_SCOPE ) INSTALL( FILES ${headers} DESTINATION include/tnl-${tnlVersion}/mesh ) \ No newline at end of file diff --git a/src/mesh/config/CMakeLists.txt b/src/mesh/config/CMakeLists.txt index 5da9330921543fe65818233d8e49393bc736c6e1..db2417314fcf20164227dc7560022d623467a79c 100755 --- a/src/mesh/config/CMakeLists.txt +++ b/src/mesh/config/CMakeLists.txt @@ -1,3 +1,4 @@ -SET( headers tnlMeshConfigBase.h ) +SET( headers tnlMeshConfigBase.h + tnlMeshConfigValidator.h ) INSTALL( FILES ${headers} DESTINATION include/tnl-${tnlVersion}/mesh/config ) \ No newline at end of file diff --git a/src/mesh/config/tnlMeshConfigBase.h b/src/mesh/config/tnlMeshConfigBase.h index 0bbe28780da9633632b14f039a7699950a77e22e..34a8c608a0ee8a0c4be8ae1217bcf5cc9942ec97 100644 --- a/src/mesh/config/tnlMeshConfigBase.h +++ b/src/mesh/config/tnlMeshConfigBase.h @@ -32,57 +32,66 @@ template< typename Cell, typename Id = void > struct tnlMeshConfigBase { - typedef Cell CellTag; + typedef Cell CellTopology; typedef Real RealType; typedef GlobalIndex GlobalIndexType; typedef LocalIndex LocalIndexType; typedef Id IdType; - enum { worldDimensions = WorldDimensions }; + static const int worldDimensions = WorldDimensions; + static const int meshDimensions = Cell::dimensions; static tnlString getType() { return tnlString( "tnlMeshConfigBase< >"); }; + + /**** + * Storage of mesh entities. + */ + static constexpr bool entityStorage( int dimensions ) + { + /**** + * Vertices and cells must always be stored + */ + return true; + //return ( dimensions == 0 || dimensions == cellDimensions ); + } + + /**** + * Storage of subentities of mesh entities + */ + template< typename MeshEntity > + static constexpr bool subentityStorage( MeshEntity, int SubentityDimensions ) + { + /**** + * Vertices must always be stored + */ + return true; + //return ( SubentityDimensions == 0 ); + } - tnlStaticAssert( WorldDimensions >= Cell::dimensions, "The number of the cell dimensions cannot be larger than the world dimension." ); -}; + /**** + * Storage of subentity orientations of mesh entities. + * It must be false for vertices and cells. + */ + template< typename MeshEntity > + static constexpr bool subentityOrientationStorage( MeshEntity, int SubentityDimensions ) + { + return ( SubentityDimensions > 0 ); + } -/**** - * Explicit storage of all mesh entities by default. - * To disable it, write your own specialization with given - * dimensions and config tag. - */ -template< typename ConfigTag, - int Dimensions > -struct tnlMeshEntityStorage -{ - enum { enabled = true }; -}; - -/**** - * By default, ALL SUBENTITIES of a mesh entity ARE STORED - * provided that they are stored in the mesh. - * Write your own specialization if you do not want so. - */ -template< typename ConfigTag, - typename EntityTag, - int Dimensions > -struct tnlMeshSubentityStorage -{ - enum { enabled = tnlMeshEntityStorage< ConfigTag, Dimensions >::enabled }; -}; - -/*** - * By default, NO SUPERENTITIES of any mesh entity ARE STORED. - * Write your own specialization if you need to stored them. - */ -template< typename ConfigTag, - typename EntityTag, - int Dimensions > -struct tnlMeshSuperentityStorage -{ - enum { enabled = false }; + /**** + * Storage of superentities of mesh entities + */ + template< typename MeshEntity > + static constexpr bool superentityStorage( MeshEntity, int SuperentityDimensions ) + { + return true; + //return false; + } + + static_assert( WorldDimensions >= Cell::dimensions, "The number of the cell dimensions cannot be larger than the world dimension." ); }; #endif /* TNLMESHCONFIGBASE_H_ */ diff --git a/src/mesh/config/tnlMeshConfigValidator.h b/src/mesh/config/tnlMeshConfigValidator.h new file mode 100644 index 0000000000000000000000000000000000000000..c9f8e5bed7f46897cc95be680a0b5204a3f89d76 --- /dev/null +++ b/src/mesh/config/tnlMeshConfigValidator.h @@ -0,0 +1,114 @@ +/*************************************************************************** + tnlMeshConfigValidator.h - description + ------------------- + begin : Aug 14, 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 TNLMESHCONFIGVALIDATOR_H +#define TNLMESHCONFIGVALIDATOR_H + +#include <core/tnlAssert.h> +#include <mesh/topologies/tnlMeshEntityTopology.h> +#include <mesh/tnlDimensionsTag.h> + +template< typename MeshConfig, + typename MeshEntity, + typename dimensions > +class tnlMeshConfigValidatorSubtopologyLayer : +public tnlMeshConfigValidatorSubtopologyLayer< MeshConfig, MeshEntity, typename dimensions::Decrement > +{ + static_assert( ! MeshConfig::subentityStorage( MeshEntity(), dimensions::value ) || + MeshConfig::entityStorage( MeshEntity::dimensions ), "entities of which subentities are stored must be stored" ); + static_assert( ! MeshConfig::subentityStorage( MeshEntity(), dimensions::value ) || + MeshConfig::entityStorage( dimensions::value ), "entities that are stored as subentities must be stored"); + static_assert( ! MeshConfig::subentityOrientationStorage( MeshEntity(), dimensions::value ) || + MeshConfig::subentityStorage( MeshEntity(), dimensions::value ), "orientation can be stored only for subentities that are stored"); +}; + +template< typename MeshConfig, + typename MeshEntity > +class tnlMeshConfigValidatorSubtopologyLayer< MeshConfig, MeshEntity, tnlDimensionsTag< 0 > > +{ + static_assert( ! MeshConfig::subentityStorage( MeshEntity(), 0 ) || + MeshConfig::entityStorage( 0 ), "entities that are stored as subentities must be stored" ); + static_assert( ! MeshConfig::subentityOrientationStorage( MeshEntity(), 0 ), "storage of vertex orientation does not make sense" ); +}; + + +template< typename MeshConfig, + typename MeshEntity, + typename dimensions > +class tnlMeshConfigValidatorSupertopologyLayer : +public tnlMeshConfigValidatorSupertopologyLayer< MeshConfig, MeshEntity, typename dimensions::Decrement > +{ + static_assert( ! MeshConfig::superentityStorage( MeshEntity(), 0 ) || + MeshConfig::entityStorage( MeshEntity::dimensions ), "entities of which superentities are stored must be stored"); + static_assert( ! MeshConfig::superentityStorage( MeshEntity(), 0 ) || + MeshConfig::entityStorage( dimensions::value ), "entities that are stored as superentities must be stored"); +}; + +template< typename MeshConfig, + typename MeshEntity > +class tnlMeshConfigValidatorSupertopologyLayer< MeshConfig, MeshEntity, tnlDimensionsTag< MeshEntity::dimensions > > +{}; + + +template< typename MeshConfig, int dimensions > +class tnlMeshConfigValidatorLayer : + public tnlMeshConfigValidatorLayer< MeshConfig, dimensions - 1 >, + public tnlMeshConfigValidatorSubtopologyLayer< MeshConfig, + typename tnlMeshSubtopology< typename MeshConfig::CellTopology, dimensions >::Topology, + tnlDimensionsTag< dimensions - 1 > >, + public tnlMeshConfigValidatorSupertopologyLayer< MeshConfig, + typename tnlMeshSubtopology< typename MeshConfig::CellTopology, dimensions >::Topology, + tnlDimensionsTag< MeshConfig::CellTopology::dimensions > > +{ + typedef typename tnlMeshSubtopology< typename MeshConfig::CellTopology, dimensions >::Topology Topology; + + static_assert( ! MeshConfig::entityStorage( dimensions ) || MeshConfig::subentityStorage( Topology(), 0 ), "subvertices of all stored entities must be stored"); +}; + +template< typename MeshConfig > +class tnlMeshConfigValidatorLayer< MeshConfig, 0 > +{ +}; + +template< typename MeshConfig > +class tnlMeshConfigValidatorLayerCell : + public tnlMeshConfigValidatorLayer< MeshConfig, MeshConfig::CellTopology::dimensions - 1 >, + public tnlMeshConfigValidatorSubtopologyLayer< MeshConfig, + typename MeshConfig::CellTopology, + tnlDimensionsTag< MeshConfig::CellTopology::dimensions - 1 > > +{ + typedef typename MeshConfig::CellTopology CellTopology; + static const int dimensions = CellTopology::dimensions; + + static_assert( !MeshConfig::entityStorage( dimensions ) || MeshConfig::subentityStorage( CellTopology(), 0 ), "subvertices of all stored entities must be stored"); +}; + +template<typename MeshConfig > +class tnlMeshConfigValidator : public tnlMeshConfigValidatorLayerCell< MeshConfig > +{ + static const int meshDimensions = MeshConfig::CellTopology::dimensions; + + static_assert(1 <= meshDimensions, "zero dimensional meshes are not supported"); + static_assert( meshDimensions <= MeshConfig::worldDimensions, "world dimension must not be less than mesh dimension"); + + static_assert( MeshConfig::entityStorage( 0 ), "mesh vertices must be stored"); + static_assert( MeshConfig::entityStorage( meshDimensions ), "mesh cells must be stored"); +}; + + +#endif /* TNLMESHCONFIGVALIDATOR_H */ + diff --git a/src/mesh/grids/CMakeLists.txt b/src/mesh/grids/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..90e8e99ae35165a01b5f4ef3e515931ee805ab71 --- /dev/null +++ b/src/mesh/grids/CMakeLists.txt @@ -0,0 +1,19 @@ +SET( headers tnlGrid1D.h + tnlGrid1D_impl.h + tnlGrid2D.h + tnlGrid2D_impl.h + tnlGrid3D.h + tnlGrid3D_impl.h + tnlTraverser_Grid1D.h + tnlTraverser_Grid1D_impl.h + tnlTraverser_Grid2D.h + tnlTraverser_Grid2D_impl.h + tnlTraverser_Grid3D.h + tnlTraverser_Grid3D_impl.h ) + +SET( CURRENT_DIR ${CMAKE_SOURCE_DIR}/src/mesh/grids ) +SET( tnl_mesh_grids_SOURCES + ${CURRENT_DIR}/tnlGrid_impl.cpp + PARENT_SCOPE ) + +INSTALL( FILES ${headers} DESTINATION include/tnl-${tnlVersion}/mesh/grids ) \ No newline at end of file diff --git a/src/mesh/tnlGrid1D.h b/src/mesh/grids/tnlGrid1D.h similarity index 99% rename from src/mesh/tnlGrid1D.h rename to src/mesh/grids/tnlGrid1D.h index 30807dc3e813ae3fb24d5bbbe7106376c45548b6..e7df6aaf6e2af6eabdb5bd49328ff3c3b44ff8e3 100644 --- a/src/mesh/tnlGrid1D.h +++ b/src/mesh/grids/tnlGrid1D.h @@ -184,6 +184,6 @@ class tnlGrid< 1, Real, Device, Index > : public tnlObject }; -#include <mesh/tnlGrid1D_impl.h> +#include <mesh/grids/tnlGrid1D_impl.h> #endif /* SRC_MESH_TNLGRID1D_H_ */ diff --git a/src/mesh/tnlGrid1D_impl.h b/src/mesh/grids/tnlGrid1D_impl.h similarity index 100% rename from src/mesh/tnlGrid1D_impl.h rename to src/mesh/grids/tnlGrid1D_impl.h diff --git a/src/mesh/tnlGrid2D.h b/src/mesh/grids/tnlGrid2D.h similarity index 99% rename from src/mesh/tnlGrid2D.h rename to src/mesh/grids/tnlGrid2D.h index 286b7f08730884f31a5b50bb9d805a83140de80c..6ea8b9d1e386348f36d7d556866b826f65f33db2 100644 --- a/src/mesh/tnlGrid2D.h +++ b/src/mesh/grids/tnlGrid2D.h @@ -248,6 +248,6 @@ class tnlGrid< 2, Real, Device, Index > : public tnlObject }; -#include <mesh/tnlGrid2D_impl.h> +#include <mesh/grids/tnlGrid2D_impl.h> #endif /* SRC_MESH_TNLGRID2D_H_ */ diff --git a/src/mesh/tnlGrid2D_impl.h b/src/mesh/grids/tnlGrid2D_impl.h similarity index 100% rename from src/mesh/tnlGrid2D_impl.h rename to src/mesh/grids/tnlGrid2D_impl.h diff --git a/src/mesh/tnlGrid3D.h b/src/mesh/grids/tnlGrid3D.h similarity index 99% rename from src/mesh/tnlGrid3D.h rename to src/mesh/grids/tnlGrid3D.h index 9db36a288cd37b1bae31beaaa814fdbb45c78d5b..27df8d0137bdc09121b7990ad44e5539865bff49 100644 --- a/src/mesh/tnlGrid3D.h +++ b/src/mesh/grids/tnlGrid3D.h @@ -308,6 +308,6 @@ class tnlGrid< 3, Real, Device, Index > : public tnlObject }; -#include <mesh/tnlGrid3D_impl.h> +#include <mesh/grids/tnlGrid3D_impl.h> #endif /* SRC_MESH_TNLGRID3D_H_ */ diff --git a/src/mesh/tnlGrid3D_impl.h b/src/mesh/grids/tnlGrid3D_impl.h similarity index 100% rename from src/mesh/tnlGrid3D_impl.h rename to src/mesh/grids/tnlGrid3D_impl.h diff --git a/src/mesh/tnlGrid_impl.cpp b/src/mesh/grids/tnlGrid_impl.cpp similarity index 100% rename from src/mesh/tnlGrid_impl.cpp rename to src/mesh/grids/tnlGrid_impl.cpp diff --git a/src/mesh/tnlTraverser_Grid1D.h b/src/mesh/grids/tnlTraverser_Grid1D.h similarity index 98% rename from src/mesh/tnlTraverser_Grid1D.h rename to src/mesh/grids/tnlTraverser_Grid1D.h index dc0a3f36b08f7560aebb327ecb87fa58868b3a22..e27b04ecd64753dda7ad1a7efd06088b9d5a98e8 100644 --- a/src/mesh/tnlTraverser_Grid1D.h +++ b/src/mesh/grids/tnlTraverser_Grid1D.h @@ -117,6 +117,6 @@ class tnlTraverser< tnlGrid< 1, Real, tnlCuda, Index >, 0 > }; -#include <mesh/tnlTraverser_Grid1D_impl.h> +#include <mesh/grids/tnlTraverser_Grid1D_impl.h> #endif /* TNLTRAVERSER_GRID1D_H_ */ diff --git a/src/mesh/tnlTraverser_Grid1D_impl.h b/src/mesh/grids/tnlTraverser_Grid1D_impl.h similarity index 100% rename from src/mesh/tnlTraverser_Grid1D_impl.h rename to src/mesh/grids/tnlTraverser_Grid1D_impl.h diff --git a/src/mesh/tnlTraverser_Grid2D.h b/src/mesh/grids/tnlTraverser_Grid2D.h similarity index 99% rename from src/mesh/tnlTraverser_Grid2D.h rename to src/mesh/grids/tnlTraverser_Grid2D.h index ee520c0dba4a3132e75327e77e3f373f65929c3d..6ee46fb0a5a47d034dba0c7e8d10258ea50dc47a 100644 --- a/src/mesh/tnlTraverser_Grid2D.h +++ b/src/mesh/grids/tnlTraverser_Grid2D.h @@ -155,6 +155,6 @@ class tnlTraverser< tnlGrid< 2, Real, tnlCuda, Index >, 0 > }; -#include <mesh/tnlTraverser_Grid2D_impl.h> +#include <mesh/grids/tnlTraverser_Grid2D_impl.h> #endif /* TNLTRAVERSER_GRID2D_H_ */ diff --git a/src/mesh/tnlTraverser_Grid2D_impl.h b/src/mesh/grids/tnlTraverser_Grid2D_impl.h similarity index 100% rename from src/mesh/tnlTraverser_Grid2D_impl.h rename to src/mesh/grids/tnlTraverser_Grid2D_impl.h diff --git a/src/mesh/tnlTraverser_Grid3D.h b/src/mesh/grids/tnlTraverser_Grid3D.h similarity index 99% rename from src/mesh/tnlTraverser_Grid3D.h rename to src/mesh/grids/tnlTraverser_Grid3D.h index 5f4c29c655e35ec9c1d648ce5ea352645297aaac..694754558b1ed094defba33fbe50b42e341fa6e8 100644 --- a/src/mesh/tnlTraverser_Grid3D.h +++ b/src/mesh/grids/tnlTraverser_Grid3D.h @@ -200,6 +200,6 @@ class tnlTraverser< tnlGrid< 3, Real, tnlCuda, Index >, 0 > }; -#include <mesh/tnlTraverser_Grid3D_impl.h> +#include <mesh/grids/tnlTraverser_Grid3D_impl.h> #endif /* TNLTRAVERSER_GRID3D_H_ */ diff --git a/src/mesh/tnlTraverser_Grid3D_impl.h b/src/mesh/grids/tnlTraverser_Grid3D_impl.h similarity index 100% rename from src/mesh/tnlTraverser_Grid3D_impl.h rename to src/mesh/grids/tnlTraverser_Grid3D_impl.h diff --git a/src/mesh/initializer/CMakeLists.txt b/src/mesh/initializer/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..e4ed7a57e1803a448a62862a2c259c83d56c0dca --- /dev/null +++ b/src/mesh/initializer/CMakeLists.txt @@ -0,0 +1,13 @@ +SET( headers tnlMeshEntityInitializer.h + tnlMeshEntitySeed.h + tnlMeshEntitySeedKey.h + tnlMeshInitializer.h + tnlMeshSubentitySeedCreator.h + tnlMeshSuperentityStorageInitializer.h + ) + +SET( CURRENT_DIR ${CMAKE_SOURCE_DIR}/src/mesh/initializer ) +SET( tnl_mesh_initializer_SOURCES + PARENT_SCOPE ) + +INSTALL( FILES ${headers} DESTINATION include/tnl-${tnlVersion}/mesh/initializer ) \ No newline at end of file diff --git a/src/mesh/initializer/tnlMeshEntityInitializer.h b/src/mesh/initializer/tnlMeshEntityInitializer.h new file mode 100644 index 0000000000000000000000000000000000000000..064de82f76d7e021f8c94a3b5658fc5cf881d77b --- /dev/null +++ b/src/mesh/initializer/tnlMeshEntityInitializer.h @@ -0,0 +1,549 @@ +/*************************************************************************** + tnlMeshEntityInitializer.h - description + ------------------- + begin : Feb 23, 2014 + copyright : (C) 2014 by Tomas Oberhuber + 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 TNLMESHENTITYINITIALIZER_H_ +#define TNLMESHENTITYINITIALIZER_H_ + +#include <core/tnlStaticFor.h> +#include <mesh/initializer/tnlMeshSuperentityStorageInitializer.h> +#include <mesh/initializer/tnlMeshSubentitySeedCreator.h> + +#include "tnlMeshEntitySeed.h" + +template< typename MeshConfig > +class tnlMeshInitializer; + +template< typename MeshConfig, + typename EntityTopology, + typename DimensionsTag, + bool SubentityStorage = tnlMeshSubentityTraits< MeshConfig, EntityTopology, DimensionsTag::value >::storageEnabled, + bool SubentityOrientationStorage = tnlMeshTraits< MeshConfig >::template SubentityTraits< EntityTopology, DimensionsTag::value >::orientationEnabled, + bool SuperentityStorage = tnlMeshSuperentityTraits< MeshConfig, + typename tnlMeshSubentityTraits< MeshConfig, EntityTopology, DimensionsTag::value >::SubentityTopology, + EntityTopology::dimensions >::storageEnabled > +class tnlMeshEntityInitializerLayer; + +template< typename MeshConfig, + typename EntityTopology > +class tnlMeshEntityInitializer + : public tnlMeshEntityInitializerLayer< MeshConfig, + EntityTopology, + tnlDimensionsTag< EntityTopology::dimensions - 1 > > +{ + typedef tnlDimensionsTag< EntityTopology::dimensions > DimensionsTag; + private: + + typedef tnlMeshEntityInitializerLayer< MeshConfig, + EntityTopology, + tnlDimensionsTag< EntityTopology::dimensions - 1 > > BaseType; + + typedef + tnlMeshEntityInitializerLayer< MeshConfig, + EntityTopology, + tnlDimensionsTag< EntityTopology::dimensions - 1 > > SubentityBaseType; + typedef + tnlMeshSuperentityStorageInitializerLayer< MeshConfig, + EntityTopology, + typename + tnlMeshTraits< MeshConfig >::DimensionsTag > SuperentityBaseType; + + static const int Dimensions = DimensionsTag::value; + typedef tnlMeshTraits< MeshConfig > MeshTraits; + typedef typename MeshTraits::GlobalIndexType GlobalIndexType; + typedef typename MeshTraits::LocalIndexType LocalIndexType; + typedef typename MeshTraits::template EntityTraits< Dimensions > EntityTraits; + + typedef typename EntityTraits::EntityType EntityType; + typedef typename MeshTraits::template SubentityTraits< EntityTopology, 0 > SubvertexTraits; + + + typedef tnlMeshInitializer< MeshConfig > InitializerType; + typedef tnlMeshEntitySeed< MeshConfig, EntityTopology > SeedType; + + template< typename > class SubentitiesCreator; + + public: + + //using SuperentityBaseType::setNumberOfSuperentities; + + static tnlString getType() {}; + + tnlMeshEntityInitializer() : entity(0), entityIndex( -1 ) {} + + static void initEntity( EntityType &entity, GlobalIndexType entityIndex, const SeedType &entitySeed, InitializerType &initializer) + { + entity = EntityType( entitySeed ); + BaseType::initSubentities( entity, entityIndex, entitySeed, initializer ); + } + + template< typename SuperentityDimensionTag > + typename tnlMeshSuperentityTraits< MeshConfig, EntityTopology, SuperentityDimensionTag::value >::SharedContainerType& getSuperentityContainer( SuperentityDimensionTag ) + { + return this->entity->template getSuperentitiesIndices< SuperentityDimensionTag::value >(); + } + + static void setEntityVertex( EntityType& entity, + LocalIndexType localIndex, + GlobalIndexType globalIndex ) + { + entity.setVertexIndex( localIndex, globalIndex ); + } + + private: + EntityType *entity; + GlobalIndexType entityIndex; + +}; + +template< typename MeshConfig > +class tnlMeshEntityInitializer< MeshConfig, tnlMeshVertexTopology > +{ + public: + typedef typename tnlMeshTraits< MeshConfig >::VertexType VertexType; + typedef typename tnlMeshTraits< MeshConfig >::PointType PointType; + typedef tnlMeshInitializer< MeshConfig > InitializerType; + + static tnlString getType() {}; + + static void setVertexPoint( VertexType& vertex, + const PointType& point, + InitializerType& initializer ) + { + initializer.setVertexPoint( vertex, point ); + } +}; + + +/**** + * Mesh entity initializer layer with specializations + * + * SUBENTITY STORAGE SUBENTITY ORIENTATION SUPERENTITY STORAGE + * TRUE FALSE TRUE + */ +template< typename MeshConfig, + typename EntityTopology, + typename DimensionsTag > +class tnlMeshEntityInitializerLayer< MeshConfig, + EntityTopology, + DimensionsTag, + true, + false, + true > + : public tnlMeshEntityInitializerLayer< MeshConfig, + EntityTopology, + typename DimensionsTag::Decrement > +{ + typedef tnlMeshEntityInitializerLayer< MeshConfig, + EntityTopology, + typename DimensionsTag::Decrement > BaseType; + + static const int Dimensions = DimensionsTag::value; + typedef tnlMeshTraits< MeshConfig > MeshTraits; + typedef typename MeshTraits:: template SubentityTraits< EntityTopology, Dimensions > SubentityTraits; + typedef typename SubentityTraits::SubentityContainerType SubentityContainerType; + typedef typename SubentityTraits::AccessArrayType SharedContainerType; + typedef typename SharedContainerType::ElementType GlobalIndexType; + + typedef tnlMeshInitializer< MeshConfig > InitializerType; + typedef tnlMeshEntityInitializer< MeshConfig, EntityTopology > EntityInitializerType; + typedef tnlDimensionsTag< EntityTopology::dimensions > EntityDimensionsTag; + typedef tnlMeshEntity< MeshConfig, EntityTopology > EntityType; + typedef tnlMeshEntitySeed< MeshConfig, EntityTopology > SeedType; + typedef tnlMeshSubentitySeedsCreator< MeshConfig, EntityTopology, DimensionsTag > SubentitySeedsCreatorType; + typedef typename SubentityTraits::IdArrayType IdArrayType; + typedef typename MeshTraits::LocalIndexType LocalIndexType; + + protected: + static void initSubentities( EntityType& entity, GlobalIndexType entityIndex, const SeedType& entitySeed, + InitializerType& meshInitializer ) + { + //cout << " Initiating subentities with " << DimensionsTag::value << " dimensions ... " << endl; + auto subentitySeeds = SubentitySeedsCreatorType::create( entitySeed ); + + IdArrayType& subentityIdsArray = InitializerType::template subentityIdsArray< DimensionsTag >( entity ); + for( LocalIndexType i = 0; i < subentitySeeds.getSize(); i++ ) + { + //cout << " Adding subentity " << subentityIdsArray[ i ] << endl; + subentityIdsArray[ i ] = meshInitializer.findEntitySeedIndex( subentitySeeds[ i ] ); + meshInitializer. + template getSuperentityInitializer< DimensionsTag >(). + addSuperentity( EntityDimensionsTag(), subentityIdsArray[ i ], entityIndex ); + } + BaseType::initSubentities( entity, entityIndex, entitySeed, meshInitializer ); + } +}; + +/**** + * Mesh entity initializer layer with specializations + * + * SUBENTITY STORAGE SUBENTITY ORIENTATION SUPERENTITY STORAGE + * TRUE TRUE TRUE + */ +template< typename MeshConfig, + typename EntityTopology, + typename DimensionsTag > +class tnlMeshEntityInitializerLayer< MeshConfig, + EntityTopology, + DimensionsTag, + true, + true, + true > + : public tnlMeshEntityInitializerLayer< MeshConfig, + EntityTopology, + typename DimensionsTag::Decrement > +{ + typedef tnlMeshEntityInitializerLayer< MeshConfig, + EntityTopology, + typename DimensionsTag::Decrement > BaseType; + + typedef tnlMeshSubentityTraits< MeshConfig, EntityTopology, DimensionsTag::value > SubentitiesTraits; + typedef typename SubentitiesTraits::SubentityContainerType SubentityContainerType; + typedef typename SubentitiesTraits::AccessArrayType SharedContainerType; + typedef typename SharedContainerType::ElementType GlobalIndexType; + + typedef tnlMeshInitializer< MeshConfig > InitializerType; + typedef tnlMeshEntityInitializer< MeshConfig, EntityTopology > EntityInitializerType; + typedef tnlDimensionsTag< EntityTopology::dimensions > EntityDimensionsTag; + typedef tnlMeshEntity< MeshConfig, EntityTopology > EntityType; + typedef tnlMeshEntitySeed< MeshConfig, EntityTopology > SeedType; + typedef tnlMeshSubentitySeedsCreator< MeshConfig, EntityTopology, DimensionsTag > SubentitySeedsCreatorType; + typedef typename tnlMeshTraits< MeshConfig >::template SubentityTraits< EntityTopology, DimensionsTag::value >::IdArrayType IdArrayType; + typedef typename tnlMeshTraits< MeshConfig >::LocalIndexType LocalIndexType; + typedef typename SubentitiesTraits::OrientationArrayType OrientationArrayType; + + protected: + static void initSubentities( EntityType& entity, GlobalIndexType entityIndex, const SeedType& entitySeed, + InitializerType& meshInitializer ) + { + //cout << " Initiating subentities with " << DimensionsTag::value << " dimensions ... " << endl; + auto subentitySeeds = SubentitySeedsCreatorType::create( entitySeed ); + + IdArrayType& subentityIdsArray = InitializerType::template subentityIdsArray< DimensionsTag >( entity ); + OrientationArrayType &subentityOrientationsArray = InitializerType::template subentityOrientationsArray< DimensionsTag >( entity ); + for( LocalIndexType i = 0; i < subentitySeeds.getSize(); i++ ) + { + //cout << " Adding subentity " << subentityIdsArray[ i ] << endl; + GlobalIndexType subentityIndex = meshInitializer.findEntitySeedIndex( subentitySeeds[ i ] ); + subentityIdsArray[ i ] = subentityIndex; + subentityOrientationsArray[ i ] = meshInitializer.template getReferenceOrientation< DimensionsTag >( subentityIndex ).createOrientation( subentitySeeds[ i ] ); + //cout << " Subentity orientation = " << subentityOrientationsArray[ i ].getSubvertexPermutation() << endl; + meshInitializer. + template getSuperentityInitializer< DimensionsTag >(). + addSuperentity( EntityDimensionsTag(), subentityIdsArray[ i ], entityIndex ); + } + + BaseType::initSubentities( entity, entityIndex, entitySeed, meshInitializer ); + } +}; + +/**** + * Mesh entity initializer layer with specializations + * + * SUBENTITY STORAGE SUBENTITY ORIENTATION SUPERENTITY STORAGE + * TRUE TRUE FALSE + */ +template< typename MeshConfig, + typename EntityTopology, + typename DimensionsTag > +class tnlMeshEntityInitializerLayer< MeshConfig, + EntityTopology, + DimensionsTag, + true, + true, + false > + : public tnlMeshEntityInitializerLayer< MeshConfig, + EntityTopology, + typename DimensionsTag::Decrement > +{ + typedef tnlMeshEntityInitializerLayer< MeshConfig, + EntityTopology, + typename DimensionsTag::Decrement > BaseType; + + typedef tnlMeshSubentityTraits< MeshConfig, EntityTopology, DimensionsTag::value > SubentitiesTraits; + typedef typename SubentitiesTraits::SubentityContainerType SubentityContainerType; + typedef typename SubentitiesTraits::SharedContainerType SharedContainerType; + typedef typename SharedContainerType::ElementType GlobalIndexType; + + typedef tnlMeshInitializer< MeshConfig > InitializerType; + typedef tnlMeshEntityInitializer< MeshConfig, EntityTopology > EntityInitializerType; + typedef tnlDimensionsTag< EntityTopology::dimensions > EntityDimensionsTag; + typedef tnlMeshEntity< MeshConfig, EntityTopology > EntityType; + typedef tnlMeshEntitySeed< MeshConfig, EntityTopology > SeedType; + typedef tnlMeshSubentitySeedsCreator< MeshConfig, EntityTopology, DimensionsTag > SubentitySeedsCreatorType; + typedef typename tnlMeshTraits< MeshConfig >::template SubentityTraits< EntityTopology, DimensionsTag >::IdArrayType IdArrayType; + typedef typename tnlMeshTraits< MeshConfig >::LocalIndexType LocalIndexType; + typedef typename SubentitiesTraits::OrientationArrayType OrientationArrayType; + + protected: + static void initSubentities( EntityType& entity, GlobalIndexType entityIndex, const SeedType& entitySeed, + InitializerType& meshInitializer ) + { + //cout << " Initiating subentities with " << DimensionsTag::value << " dimensions ... " << endl; + auto subentitySeeds = SubentitySeedsCreatorType::create( entitySeed ); + + IdArrayType& subentityIdsArray = InitializerType::template subentityIdsArray< DimensionsTag >( entity ); + OrientationArrayType &subentityOrientationsArray = InitializerType::template subentityOrientationsArray< DimensionsTag >( entity ); + for( LocalIndexType i = 0; i < subentitySeeds.getSize(); i++ ) + { + //cout << " Adding subentity " << subentityIdsArray[ i ] << endl; + subentityIdsArray[ i ] = meshInitializer.findEntitySeedIndex( subentitySeeds[ i ] ); + subentityOrientationsArray[ i ] = meshInitializer.template getReferenceOrientation< DimensionsTag >( subentitySeeds[ i ] ).createOrientation( subentitySeeds[ i ] ); + } + BaseType::initSubentities( entity, entityIndex, entitySeed, meshInitializer ); + } +}; + + +template< typename MeshConfig, + typename EntityTopology, + typename DimensionsTag > +class tnlMeshEntityInitializerLayer< MeshConfig, + EntityTopology, + DimensionsTag, + true, + false, + false > + : public tnlMeshEntityInitializerLayer< MeshConfig, + EntityTopology, + typename DimensionsTag::Decrement > +{ + typedef tnlMeshEntityInitializerLayer< MeshConfig, + EntityTopology, + typename DimensionsTag::Decrement > BaseType; + + typedef typename tnlMeshSubentityTraits< MeshConfig, + EntityTopology, + DimensionsTag::value >::SubentityContainerType SubentityContainerType; + typedef typename tnlMeshSubentityTraits< MeshConfig, + EntityTopology, + DimensionsTag::value >::SharedContainerType SharedContainerType; + typedef typename SharedContainerType::ElementType GlobalIndexType; + + typedef tnlMeshInitializer< MeshConfig > InitializerType; + typedef tnlMeshEntityInitializer< MeshConfig, EntityTopology > EntityInitializerType; + typedef tnlMeshEntity< MeshConfig, EntityTopology > EntityType; + typedef tnlMeshEntitySeed< MeshConfig, EntityTopology > SeedType; + typedef tnlMeshSubentitySeedsCreator< MeshConfig, EntityTopology, DimensionsTag > SubentitySeedsCreatorType; + typedef typename tnlMeshTraits< MeshConfig >::template SubentityTraits< EntityTopology, DimensionsTag >::IdArrayType IdArrayType; + typedef typename tnlMeshTraits< MeshConfig >::LocalIndexType LocalIndexType; + + protected: + static void initSubentities( EntityType& entity, GlobalIndexType entityIndex, const SeedType& entitySeed, + InitializerType& meshInitializer ) + { + //cout << " Initiating subentities with " << DimensionsTag::value << " dimensions ... " << endl; + auto subentitySeeds = SubentitySeedsCreatorType::create( entitySeed ); + + IdArrayType& subentityIdsArray = InitializerType::template subentityIdsArray< DimensionsTag >( entity ); + for( LocalIndexType i = 0; i < subentitySeeds.getSize(); i++) + subentityIdsArray[ i ] = meshInitializer.findEntitySeedIndex( subentitySeeds[ i ] ); + + BaseType::initSubentities(entity, entityIndex, entitySeed, meshInitializer); + } +}; + +template< typename MeshConfig, + typename EntityTopology, + typename DimensionsTag > +class tnlMeshEntityInitializerLayer< MeshConfig, + EntityTopology, + DimensionsTag, + false, + false, + true > + : public tnlMeshEntityInitializerLayer< MeshConfig, + EntityTopology, + typename DimensionsTag::Decrement > +{ + typedef tnlMeshEntityInitializerLayer< MeshConfig, + EntityTopology, + typename DimensionsTag::Decrement > BaseType; + + typedef typename tnlMeshSubentityTraits< MeshConfig, + EntityTopology, + DimensionsTag::value >::SubentityContainerType SubentityContainerType; + typedef typename tnlMeshSubentityTraits< MeshConfig, + EntityTopology, + DimensionsTag::value >::SharedContainerType SharedContainerType; + typedef typename SharedContainerType::DataType GlobalIndexType; + + typedef tnlMeshInitializer< MeshConfig > InitializerType; + typedef tnlMeshEntityInitializer< MeshConfig, EntityTopology > EntityInitializerType; + typedef tnlDimensionsTag< EntityTopology::dimensions > EntityDimensionsTag; + typedef tnlMeshEntity< MeshConfig, EntityTopology > EntityType; + typedef tnlMeshEntitySeed< MeshConfig, EntityTopology > SeedType; + typedef tnlMeshSubentitySeedsCreator< MeshConfig, EntityTopology, DimensionsTag > SubentitySeedsCreatorType; + typedef typename tnlMeshTraits< MeshConfig >::template SubentityTraits< EntityTopology, DimensionsTag >::IdArrayType IdArrayType; + typedef typename tnlMeshTraits< MeshConfig >::LocalIndexType LocalIndexType; + + + protected: + + static void initSubentities( EntityType& entity, GlobalIndexType entityIndex, const SeedType& entitySeed, + InitializerType& meshInitializer ) + { + //cout << " Initiating subentities with " << DimensionsTag::value << " dimensions ... " << endl; + auto subentitySeeds = SubentitySeedsCreatorType::create( entitySeed ); + IdArrayType& subentityIdsArray = InitializerType::template subentityIdsArray< DimensionsTag >( entity ); + for( LocalIndexType i = 0; i < subentitySeeds.getSize(); i++) + { + GlobalIndexType subentityIndex = meshInitializer.findEntitySeedIndex( subentitySeeds[ i ] ); + meshInitializer. + template getSuperentityInitializer< DimensionsTag >(). + addSuperentity( EntityDimensionsTag(), subentityIndex, entityIndex ); + } + BaseType::initSubentities( entity, entityIndex, entitySeed, meshInitializer ); + } +}; + +template< typename MeshConfig, + typename EntityTopology, + typename DimensionsTag > +class tnlMeshEntityInitializerLayer< MeshConfig, + EntityTopology, + DimensionsTag, + false, + false, + false > + : public tnlMeshEntityInitializerLayer< MeshConfig, + EntityTopology, + typename DimensionsTag::Decrement > +{}; + +template< typename MeshConfig, + typename EntityTopology > +class tnlMeshEntityInitializerLayer< MeshConfig, + EntityTopology, + tnlDimensionsTag< 0 >, + true, + false, + true > +{ + typedef tnlDimensionsTag< 0 > DimensionsTag; + typedef tnlMeshSubentityTraits< MeshConfig, + EntityTopology, + DimensionsTag::value > SubentitiesTraits; + + typedef typename SubentitiesTraits::AccessArrayType SharedContainerType; + typedef typename SharedContainerType::ElementType GlobalIndexType; + + typedef tnlMeshInitializer< MeshConfig > InitializerType; + typedef tnlMeshEntityInitializer< MeshConfig, EntityTopology > EntityInitializerType; + typedef tnlDimensionsTag< EntityTopology::dimensions > EntityDimensionsTag; + typedef tnlMeshEntity< MeshConfig, EntityTopology > EntityType; + typedef tnlMeshEntitySeed< MeshConfig, EntityTopology > SeedType; + typedef tnlMeshSubentitySeedsCreator< MeshConfig, EntityTopology, DimensionsTag > SubentitySeedsCreatorType; + typedef typename tnlMeshTraits< MeshConfig >::template SubentityTraits< EntityTopology, DimensionsTag::value >::IdArrayType IdArrayType; + typedef typename tnlMeshTraits< MeshConfig >::LocalIndexType LocalIndexType; + + + protected: + + static void initSubentities( EntityType& entity, GlobalIndexType entityIndex, const SeedType& entitySeed, + InitializerType& meshInitializer ) + { + //cout << " Initiating subentities with " << DimensionsTag::value << " dimensions ... " << endl; + const IdArrayType &subentityIdsArray = InitializerType::template subentityIdsArray< DimensionsTag >(entity); + for( LocalIndexType i = 0; i < subentityIdsArray.getSize(); i++ ) + meshInitializer.template getSuperentityInitializer< DimensionsTag >().addSuperentity( EntityDimensionsTag(), subentityIdsArray[ i ], entityIndex); + } + +}; + +template< typename MeshConfig, + typename EntityTopology > +class tnlMeshEntityInitializerLayer< MeshConfig, + EntityTopology, + tnlDimensionsTag< 0 >, + true, + false, + false > +{ + typedef tnlMeshInitializer< MeshConfig > InitializerType; + typedef tnlMeshEntityInitializer< MeshConfig, + EntityTopology > EntityInitializerType; + typedef tnlDimensionsTag< 0 > DimensionsTag; + typedef tnlMeshSubentityTraits< MeshConfig, + EntityTopology, + DimensionsTag::value > SubentitiesTraits; + typedef typename SubentitiesTraits::SharedContainerType SharedContainerType; + typedef typename SharedContainerType::ElementType GlobalIndexType; + typedef tnlMeshEntity< MeshConfig, EntityTopology > EntityType; + typedef tnlMeshEntitySeed< MeshConfig, EntityTopology > SeedType; + typedef tnlMeshSubentitySeedsCreator< MeshConfig, EntityTopology, DimensionsTag > SubentitySeedsCreatorType; + typedef typename tnlMeshTraits< MeshConfig >::template SubentityTraits< EntityTopology, DimensionsTag >::IdArrayType IdArrayType; + typedef typename tnlMeshTraits< MeshConfig >::LocalIndexType LocalIndexType; + + + protected: + + static void initSubentities( EntityType& entity, GlobalIndexType entityIndex, const SeedType& entitySeed, + InitializerType& meshInitializer ) {}; + +}; + +template< typename MeshConfig, + typename EntityTopology, + bool SuperEntityStorage > +class tnlMeshEntityInitializerLayer< MeshConfig, + EntityTopology, + tnlDimensionsTag< 0 >, + false, + true, + SuperEntityStorage > // Forces termination of recursive inheritance (prevents compiler from generating huge error logs) +{ + typedef tnlMeshInitializer< MeshConfig > InitializerType; + typedef tnlMeshEntityInitializer< MeshConfig, EntityTopology > EntityInitializerType; + typedef tnlDimensionsTag< 0 > DimensionsTag; + typedef tnlMeshSubentityTraits< MeshConfig, + EntityTopology, + DimensionsTag::value > SubentitiesTraits; + typedef typename SubentitiesTraits::SharedContainerType SharedContainerType; + typedef typename SharedContainerType::ElementType GlobalIndexType; + typedef tnlMeshEntity< MeshConfig, EntityTopology > EntityType; + + protected: + static void initSubentities( EntityType& entity, GlobalIndexType entityIndex, EntityInitializerType&, InitializerType& ) {} +}; + +template< typename MeshConfig, + typename EntityTopology, + bool SuperEntityStorage > +class tnlMeshEntityInitializerLayer< MeshConfig, + EntityTopology, + tnlDimensionsTag< 0 >, + false, + false, + SuperEntityStorage > // Forces termination of recursive inheritance (prevents compiler from generating huge error logs) +{ + typedef tnlMeshInitializer< MeshConfig > InitializerType; + typedef tnlMeshEntityInitializer< MeshConfig, EntityTopology > EntityInitializerType; + typedef tnlDimensionsTag< 0 > DimensionsTag; + typedef tnlMeshSubentityTraits< MeshConfig, + EntityTopology, + DimensionsTag::value > SubentitiesTraits; + typedef typename SubentitiesTraits::SharedContainerType SharedContainerType; + typedef typename SharedContainerType::ElementType GlobalIndexType; + typedef tnlMeshEntity< MeshConfig, EntityTopology > EntityType; + + protected: + void initSubentities( EntityType& entity, GlobalIndexType entityIndex, EntityInitializerType&, + InitializerType& ) {} +}; + + +#endif /* TNLMESHENTITYINITIALIZER_H_ */ diff --git a/src/mesh/initializer/tnlMeshEntitySeed.h b/src/mesh/initializer/tnlMeshEntitySeed.h new file mode 100644 index 0000000000000000000000000000000000000000..d3e25036ece15c7d8cbb7e2101751cb77ce81d6c --- /dev/null +++ b/src/mesh/initializer/tnlMeshEntitySeed.h @@ -0,0 +1,79 @@ +/*************************************************************************** + 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 + +#include <mesh/traits/tnlMeshTraits.h> + +template< typename MeshConfig, + typename EntityTopology > +class tnlMeshEntitySeed +{ + typedef tnlMeshTraits< MeshConfig > MeshConfigTraits; + typedef typename tnlMeshTraits< MeshConfig >::template SubentityTraits< EntityTopology, 0 > SubvertexTraits; + + public: + typedef typename tnlMeshTraits< MeshConfig >::GlobalIndexType GlobalIndexType; + typedef typename tnlMeshTraits< MeshConfig >::LocalIndexType LocalIndexType; + typedef typename tnlMeshTraits< MeshConfig >::IdArrayAccessorType IdArrayAccessorType; + typedef typename SubvertexTraits::IdArrayType IdArrayType; + + static tnlString getType() { return tnlString( "tnlMeshEntitySeed<>" ); } + + 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; + } + + IdArrayAccessorType getCornerIds() + { + IdArrayAccessorType accessor; + accessor.bind( this->corners.getData(), this->corners.getSize() ); + return accessor; + } + + + const IdArrayAccessorType getCornerIds() const + { + IdArrayAccessorType accessor; + accessor.bind( this->cornerIds.getData(), this->cornerIds.getSize() ); + return accessor; + } + + private: + + IdArrayType cornerIds; +}; + +template< typename MeshConfig, typename EntityTopology > +ostream& operator << ( ostream& str, const tnlMeshEntitySeed< MeshConfig, EntityTopology >& e ) +{ + str << e.getCornerIds(); + return str; +}; + +#endif /* TNLMESHENTITYSEED_H */ + diff --git a/src/mesh/initializer/tnlMeshEntitySeedKey.h b/src/mesh/initializer/tnlMeshEntitySeedKey.h new file mode 100644 index 0000000000000000000000000000000000000000..5220d8a3bd8632d56b45bb21bf0ed826a0880910 --- /dev/null +++ b/src/mesh/initializer/tnlMeshEntitySeedKey.h @@ -0,0 +1,80 @@ +/*************************************************************************** + tnlMeshEntitySeedKey.h - description + ------------------- + begin : Feb 13, 2014 + copyright : (C) 2014 by Tomas Oberhuber + 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 TNLMESHENTITYSEEDKEY_H_ +#define TNLMESHENTITYSEEDKEY_H_ + +#include <mesh/tnlDimensionsTag.h> + +template< typename MeshConfig, + typename EntityTopology > +class tnlMeshEntitySeed; + +template< typename MeshConfig, + typename EntityTopology, + int Dimensions > +class tnlMeshSubentityTraits; + +/**** + * Unique identification of a mesh entity by its vertices. + * Uniqueness is preserved for entities of the same type only. + */ +template< typename MeshConfig, + typename EntityTopology > +class tnlMeshEntitySeedKey +{ + typedef + tnlMeshEntitySeed< MeshConfig, EntityTopology > EntitySeedType; + + typedef typename + tnlMeshSubentityTraits< MeshConfig, + EntityTopology, + 0 >::StorageArrayType StorageArrayType; + + public: + + explicit tnlMeshEntitySeedKey( const EntitySeedType& entitySeed ) + { + for( typename StorageArrayType::IndexType i = 0; + i < entitySeed.getCornersCount(); + i++ ) + this->sortedCorners[ i ] = entitySeed.getCornerIds()[ i ]; + sortedCorners.sort( ); + } + + bool operator<( const tnlMeshEntitySeedKey& other ) const + { + for( typename StorageArrayType::IndexType i = 0; + i < StorageArrayType::size; + i++) + { + if( sortedCorners[ i ] < other.sortedCorners[ i ] ) + return true; + else + if( sortedCorners[ i ] > other.sortedCorners[ i ] ) + return false; + } + return false; + } + + private: + + StorageArrayType sortedCorners; +}; + + +#endif /* TNLMESHENTITYKSEEDEY_H_ */ diff --git a/src/mesh/initializer/tnlMeshInitializer.h b/src/mesh/initializer/tnlMeshInitializer.h new file mode 100644 index 0000000000000000000000000000000000000000..5eb5f5d00978ee5f765ccf2cccccc605a94c7c78 --- /dev/null +++ b/src/mesh/initializer/tnlMeshInitializer.h @@ -0,0 +1,630 @@ +/*************************************************************************** + tnlMeshInitializer.h - description + ------------------- + begin : Feb 23, 2014 + copyright : (C) 2014 by Tomas Oberhuber + 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 TNLMESHINITIALIZER_H_ +#define TNLMESHINITIALIZER_H_ + +#include <mesh/tnlDimensionsTag.h> +#include <mesh/traits/tnlMeshEntityTraits.h> +#include <mesh/traits/tnlMeshSubentityTraits.h> +#include <mesh/traits/tnlMeshSuperentityTraits.h> +#include <mesh/initializer/tnlMeshEntityInitializer.h> +#include <mesh/tnlMesh.h> +#include <mesh/initializer/tnlMeshSubentitySeedCreator.h> +#include <mesh/initializer/tnlMeshSuperentityStorageInitializer.h> +#include <mesh/tnlMeshEntityReferenceOrientation.h> +#include <mesh/initializer/tnlMeshEntitySeed.h> +#include <mesh/initializer/tnlMeshEntitySeedKey.h> + +template< typename MeshConfig > +class tnlMesh; + +template< typename MeshConfig, + typename DimensionsTag, + bool EntityStorage = + tnlMeshEntityTraits< MeshConfig, DimensionsTag::value >::storageEnabled, + bool EntityReferenceOrientationStorage = + tnlMeshTraits< MeshConfig >::template EntityTraits< DimensionsTag::value >::orientationNeeded > +class tnlMeshInitializerLayer; + + +template< typename MeshConfig, + typename EntityTopology> +class tnlMeshEntityInitializer; + +template< typename MeshConfig > +class tnlMeshInitializer + : public tnlMeshInitializerLayer< MeshConfig, + typename tnlMeshTraits< MeshConfig >::DimensionsTag > +{ + public: + + typedef tnlMesh< MeshConfig > MeshType; + typedef tnlMeshTraits< MeshConfig > MeshTraits; + static const int Dimensions = MeshTraits::meshDimensions; + typedef tnlDimensionsTag< Dimensions > DimensionsTag; + typedef tnlMeshInitializerLayer< MeshConfig, DimensionsTag > BaseType; + typedef typename MeshTraits::PointArrayType PointArrayType; + typedef typename MeshTraits::CellSeedArrayType CellSeedArrayType; + typedef typename MeshTraits::GlobalIndexType GlobalIndexType; + + template< typename DimensionsTag, typename SuperdimensionsTag > using SuperentityStorageNetwork = + typename MeshTraits::template SuperentityTraits< + typename MeshTraits::template EntityTraits< DimensionsTag::value >::EntityTopology, + SuperdimensionsTag::value >::StorageNetworkType; + + + tnlMeshInitializer() + : verbose( false ), mesh( 0 ) + {} + + void setVerbose( bool verbose ) + { + this->verbose = verbose; + } + + bool createMesh( const PointArrayType& points, + const CellSeedArrayType& cellSeeds, + MeshType& mesh ) + { + cout << "======= Starting mesh initiation ========" << endl; + this->mesh = &mesh; + + cout << "========= Creating entity seeds =============" << endl; + BaseType::createEntitySeedsFromCellSeeds( cellSeeds ); + + cout << "========= Creating entity reference orientations =============" << endl; + BaseType::createEntityReferenceOrientations(); + + cout << "====== Initiating entities ==============" << endl; + BaseType::initEntities( *this, points, cellSeeds ); + + return true; + } + + template<typename SubDimensionsTag, typename EntityType > + static typename MeshTraits::template SubentityTraits< typename EntityType::EntityTopology, SubDimensionsTag::value >::IdArrayType& + subentityIdsArray( EntityType& entity ) + { + return entity.template subentityIdsArray< SubDimensionsTag::value >(); + } + + template< typename SuperDimensionsTag, typename MeshEntity> + static typename MeshTraits::IdArrayAccessorType& + superentityIdsArray( MeshEntity& entity ) + { + return entity.template superentityIdsArray< SuperDimensionsTag::value >(); + } + + template<typename SubDimensionsTag, typename MeshEntity > + static typename MeshTraits::template SubentityTraits< typename MeshEntity::EntityTopology, SubDimensionsTag::value >::OrientationArrayType& + subentityOrientationsArray( MeshEntity &entity ) + { + return entity.template subentityOrientationsArray< SubDimensionsTag::value >(); + } + + template< typename DimensionsTag > + typename MeshTraits::template EntityTraits< DimensionsTag::value >::StorageArrayType& + meshEntitiesArray() + { + return mesh->template entitiesArray< DimensionsTag >(); + } + + template< typename DimensionsTag, typename SuperDimensionsTag > + typename MeshTraits::GlobalIdArrayType& + meshSuperentityIdsArray() + { + return mesh->template superentityIdsArray< DimensionsTag, SuperDimensionsTag >(); + } + + template< typename EntityTopology, typename SuperdimensionsTag > + typename MeshTraits::template SuperentityTraits< EntityTopology, SuperdimensionsTag::value >::StorageNetworkType& + meshSuperentityStorageNetwork() + { + return mesh->template getSuperentityStorageNetwork< EntityTopology, SuperdimensionsTag >(); + } + + static void + setVertexPoint( typename MeshType::VertexType& vertex, const typename MeshType::PointType& point ) + { + vertex.setPoint( point ); + } + + template< typename DimensionsTag > + tnlMeshSuperentityStorageInitializer< MeshConfig, typename MeshTraits::template EntityTraits< DimensionsTag::value >::EntityTopology >& + getSuperentityInitializer() + { + return BaseType::getSuperentityInitializer( DimensionsTag() ); + } + + + template< typename DimensionsTag > + const tnlMeshEntityReferenceOrientation< MeshConfig, typename MeshTraits::template EntityTraits< DimensionsTag::value >::EntityTopology >& + getReferenceOrientation( GlobalIndexType index) const + { + return BaseType::getReferenceOrientation( DimensionsTag(), index); + } + + protected: + + bool verbose; + + MeshType* mesh; +}; + +/**** + * Mesh initializer layer for cells + * - entities storage must turned on (cells must always be stored ) + * - entities orientation does not make sense for cells => it is turned off + */ +template< typename MeshConfig > +class tnlMeshInitializerLayer< MeshConfig, + typename tnlMeshTraits< MeshConfig >::DimensionsTag, + true, + false > + : public tnlMeshInitializerLayer< MeshConfig, + typename tnlMeshTraits< MeshConfig >::DimensionsTag::Decrement > +{ + typedef tnlMeshTraits< MeshConfig > MeshTraits; + static const int Dimensions = MeshTraits::meshDimensions; + typedef tnlDimensionsTag< Dimensions > DimensionsTag; + typedef tnlMeshInitializerLayer< MeshConfig, typename DimensionsTag::Decrement > BaseType; + + typedef tnlMesh< MeshConfig > MeshType; + typedef typename MeshTraits::template EntityTraits< Dimensions > EntityTraits; + typedef typename EntityTraits::EntityTopology EntityTopology; + typedef typename MeshTraits::GlobalIndexType GlobalIndexType; + typedef typename MeshTraits::CellTopology CellTopology; + typedef typename EntityTraits::StorageArrayType StorageArrayType; + + typedef tnlMeshInitializer< MeshConfig > InitializerType; + typedef tnlMeshEntityInitializer< MeshConfig, EntityTopology > EntityInitializerType; + typedef tnlMeshEntityInitializer< MeshConfig, EntityTopology > CellInitializerType; + typedef tnlArray< CellInitializerType, tnlHost, GlobalIndexType > CellInitializerContainerType; + typedef typename MeshTraits::CellSeedArrayType CellSeedArrayType; + typedef typename MeshTraits::LocalIndexType LocalIndexType; + typedef typename MeshTraits::PointArrayType PointArrayType; + typedef tnlMeshEntitySeed< MeshConfig, CellTopology > SeedType; + typedef tnlMeshSuperentityStorageInitializer< MeshConfig, EntityTopology > SuperentityInitializerType; + + public: + + void createEntitySeedsFromCellSeeds( const CellSeedArrayType& cellSeeds ) + { + BaseType::createEntitySeedsFromCellSeeds( cellSeeds ); + } + + void initEntities( InitializerType &initializer, const PointArrayType &points, const CellSeedArrayType &cellSeeds) + { + StorageArrayType &entityArray = initializer.template meshEntitiesArray< DimensionsTag >(); + //cout << " Initiating entities with " << DimensionsTag::value << " dimensions ... " << endl; + entityArray.setSize( cellSeeds.getSize() ); + for( GlobalIndexType i = 0; i < entityArray.getSize(); i++ ) + { + //cout << " Initiating entity " << i << endl; + EntityInitializerType::initEntity( entityArray[i], i, cellSeeds[i], initializer ); + } + /*** + * There are no superentities in this layer storing mesh cells. + */ + + BaseType::initEntities( initializer, points ); + } + + using BaseType::findEntitySeedIndex; + GlobalIndexType findEntitySeedIndex( const SeedType& seed ) const + { + return this->seedsIndexedSet.find( seed ); + } + + using BaseType::getSuperentityInitializer; + SuperentityInitializerType& getSuperentityInitializer( DimensionsTag ) + { + return this->superentityInitializer; + } + + bool checkCells() + { + typedef typename tnlMeshEntity< MeshConfig, EntityTopology >::template SubentitiesTraits< 0 >::LocalIndexType LocalIndexType; + const GlobalIndexType numberOfVertices( this->getMesh().getNumberOfVertices() ); + for( GlobalIndexType cell = 0; + cell < this->getMesh().getNumberOfCells(); + cell++ ) + for( LocalIndexType i = 0; + i < this->getMesh().getCell( cell ).getNumberOfVertices(); + i++ ) + { + if( this->getMesh().getCell( cell ).getVerticesIndices()[ i ] == - 1 ) + { + cerr << "The cell number " << cell << " does not have properly set vertex index number " << i << "." << endl; + return false; + } + if( this->getMesh().getCell( cell ).getVerticesIndices()[ i ] >= numberOfVertices ) + { + cerr << "The cell number " << cell << " does not have properly set vertex index number " << i + << ". The index " << this->getMesh().getCell( cell ).getVerticesIndices()[ i ] + << "is higher than the number of all vertices ( " << numberOfVertices + << " )." << endl; + return false; + } + } + return true; + } + + private: + typedef typename tnlMeshEntityTraits< MeshConfig, DimensionsTag::value >::SeedIndexedSetType SeedIndexedSet; + + SeedIndexedSet seedsIndexedSet; + SuperentityInitializerType superentityInitializer; +}; + +/**** + * Mesh initializer layer for other mesh entities than cells + * - entities storage is turned on + * - entities orientation storage is turned off + */ +template< typename MeshConfig, + typename DimensionsTag > +class tnlMeshInitializerLayer< MeshConfig, + DimensionsTag, + true, + false > + : public tnlMeshInitializerLayer< MeshConfig, + typename DimensionsTag::Decrement > +{ + typedef tnlMeshTraits< MeshConfig > MeshTraits; + static const int Dimensions = DimensionsTag::value; + typedef tnlMeshInitializerLayer< MeshConfig, typename DimensionsTag::Decrement > BaseType; + + typedef tnlMesh< MeshConfig > MeshType; + typedef typename MeshTraits::template EntityTraits< Dimensions > EntityTraits; + typedef typename EntityTraits::EntityTopology EntityTopology; + typedef typename MeshTraits::GlobalIndexType GlobalIndexType; + typedef typename MeshTraits::CellTopology CellTopology; + typedef typename EntityTraits::StorageArrayType StorageArrayType; + + typedef tnlMeshInitializer< MeshConfig > InitializerType; + typedef tnlMeshEntityInitializer< MeshConfig, EntityTopology > EntityInitializerType; + typedef tnlMeshEntityInitializer< MeshConfig, EntityTopology > CellInitializerType; + typedef tnlArray< CellInitializerType, tnlHost, GlobalIndexType > CellInitializerContainerType; + typedef typename EntityTraits::SeedArrayType EntitySeedArrayType; + typedef typename MeshTraits::CellSeedArrayType CellSeedArrayType; + typedef typename MeshTraits::LocalIndexType LocalIndexType; + typedef typename MeshTraits::PointArrayType PointArrayType; + typedef tnlMeshEntitySeed< MeshConfig, EntityTopology > SeedType; + typedef tnlMeshSuperentityStorageInitializer< MeshConfig, EntityTopology > SuperentityInitializerType; + + typedef typename + tnlMeshSubentityTraits< MeshConfig, + typename MeshConfig::CellTopology, + DimensionsTag::value >::SubentityContainerType SubentitiesContainerType; + + public: + + using BaseType::getEntityInitializer; + EntityInitializerType& getEntityInitializer( DimensionsTag, GlobalIndexType index ) + { + //return entityInitializerContainer[ index ]; + } + + void createEntitySeedsFromCellSeeds( const CellSeedArrayType& cellSeeds ) + { + typedef tnlMeshSubentitySeedsCreator< MeshConfig, CellTopology, DimensionsTag > SubentitySeedsCreator; + //cout << " Creating mesh entities with " << DimensionsTag::value << " dimensions ... " << endl; + for( GlobalIndexType i = 0; i < cellSeeds.getSize(); i++ ) + { + //cout << " Creating mesh entities from cell number " << i << " : " << cellSeeds[ i ] << endl; + typedef typename SubentitySeedsCreator::SubentitySeedArray SubentitySeedArray; + SubentitySeedArray subentytiSeeds( SubentitySeedsCreator::create( cellSeeds[ i ] ) ); + for( LocalIndexType j = 0; j < subentytiSeeds.getSize(); j++ ) + { + //cout << "Creating subentity seed no. " << j << " : " << subentytiSeeds[ j ] << endl; + //tnlMeshEntitySeed< tnlMeshConfigBase< CellTopology >, EntityTopology >& entitySeed = subentytiSeeds[ j ]; + this->seedsIndexedSet.insert( subentytiSeeds[ j ] ); + } + } + BaseType::createEntitySeedsFromCellSeeds( cellSeeds ); + } + + using BaseType::findEntitySeedIndex; + GlobalIndexType findEntitySeedIndex( const SeedType& seed ) const + { + GlobalIndexType index; + this->seedsIndexedSet.find( seed, index ); + return index; + } + + using BaseType::getSuperentityInitializer; + SuperentityInitializerType& getSuperentityInitializer( DimensionsTag ) + { + return this->superentityInitializer; + } + + void initEntities( InitializerType& initializer, const PointArrayType& points ) + { + StorageArrayType &entityArray = initializer.template meshEntitiesArray< DimensionsTag >(); + //cout << " Initiating entities with " << DimensionsTag::value << " dimensions ... " << endl; + entityArray.setSize( this->seedsIndexedSet.getSize() ); + EntitySeedArrayType seedsArray; + seedsArray.setSize( this->seedsIndexedSet.getSize() ); + this->seedsIndexedSet.toArray( seedsArray ); + for( GlobalIndexType i = 0; i < this->seedsIndexedSet.getSize(); i++ ) + { + //cout << " Initiating entity " << i << endl; + EntityInitializerType::initEntity( entityArray[ i ], i, seedsArray[ i ], initializer ); + } + this->seedsIndexedSet.reset(); + + this->superentityInitializer.initSuperentities( initializer ); + + BaseType::initEntities(initializer, points); + } + + void createEntityReferenceOrientations() const {} + private: + + typedef typename tnlMeshEntityTraits< MeshConfig, DimensionsTag::value >::SeedIndexedSetType SeedIndexedSet; + SeedIndexedSet seedsIndexedSet; + SuperentityInitializerType superentityInitializer; +}; + +/**** + * Mesh initializer layer for other mesh entities than cells + * - entities storage is turned on + * - entities orientation storage is turned on + */ +template< typename MeshConfig, + typename DimensionsTag > +class tnlMeshInitializerLayer< MeshConfig, + DimensionsTag, + true, + true > + : public tnlMeshInitializerLayer< MeshConfig, + typename DimensionsTag::Decrement > +{ + typedef tnlMeshInitializerLayer< MeshConfig, + typename DimensionsTag::Decrement > BaseType; + typedef tnlMesh< MeshConfig > MeshType; + typedef typename MeshType::MeshTraits MeshTraits; + + typedef typename MeshType::template EntityTraits< DimensionsTag::value > EntityTraits; + typedef typename EntityTraits::EntityTopology EntityTopology; + typedef typename EntityTraits::EntityType EntityType; + typedef typename EntityTraits::StorageArrayType ContainerType; + typedef typename EntityTraits::UniqueContainerType UniqueContainerType; + typedef typename ContainerType::IndexType GlobalIndexType; + typedef typename MeshTraits::CellTopology CellTopology; + + typedef tnlMeshInitializer< MeshConfig > InitializerType; + typedef tnlMeshEntityInitializer< MeshConfig, CellTopology > CellInitializerType; + typedef tnlMeshEntityInitializer< MeshConfig, EntityTopology > EntityInitializerType; + typedef tnlArray< EntityInitializerType, tnlHost, GlobalIndexType > EntityInitializerContainerType; + typedef typename MeshTraits::CellSeedArrayType CellSeedArrayType; + typedef typename MeshTraits::LocalIndexType LocalIndexType; + typedef typename MeshTraits::PointArrayType PointArrayType; + typedef typename EntityTraits::StorageArrayType EntityArrayType; + typedef typename EntityTraits::SeedArrayType SeedArrayType; + typedef tnlMeshEntitySeed< MeshConfig, EntityTopology > SeedType; + typedef tnlMeshSuperentityStorageInitializer< MeshConfig, EntityTopology > SuperentityInitializerType; + typedef typename EntityTraits::ReferenceOrientationType ReferenceOrientationType; + typedef typename EntityTraits::ReferenceOrientationArrayType ReferenceOrientationArrayType; + + + typedef typename + tnlMeshSubentityTraits< MeshConfig, + typename MeshConfig::CellTopology, + DimensionsTag::value >::SubentityContainerType SubentitiesContainerType; + + public: + + using BaseType::getEntityInitializer; + EntityInitializerType& getEntityInitializer( DimensionsTag, GlobalIndexType index ) + { + //return entityInitializerContainer[ index ]; + } + + void createEntitySeedsFromCellSeeds( const CellSeedArrayType& cellSeeds ) + { + typedef tnlMeshSubentitySeedsCreator< MeshConfig, CellTopology, DimensionsTag > SubentitySeedsCreator; + //cout << " Creating mesh entities with " << DimensionsTag::value << " dimensions ... " << endl; + for( GlobalIndexType i = 0; i < cellSeeds.getSize(); i++ ) + { + //cout << " Creating mesh entities from cell number " << i << " : " << cellSeeds[ i ] << endl; + typedef typename SubentitySeedsCreator::SubentitySeedArray SubentitySeedArray; + SubentitySeedArray subentytiSeeds( SubentitySeedsCreator::create( cellSeeds[ i ] ) ); + for( LocalIndexType j = 0; j < subentytiSeeds.getSize(); j++ ) + { + //cout << "Creating subentity seed no. " << j << " : " << subentytiSeeds[ j ] << endl; + //tnlMeshEntitySeed< tnlMeshConfigBase< CellTopology >, EntityTopology >& entitySeed = subentytiSeeds[ j ]; + this->seedsIndexedSet.insert( subentytiSeeds[ j ] ); + } + } + BaseType::createEntitySeedsFromCellSeeds( cellSeeds ); + } + + using BaseType::findEntitySeedIndex; + GlobalIndexType findEntitySeedIndex( const SeedType& seed ) const + { + GlobalIndexType index; + this->seedsIndexedSet.find( seed, index ); + return index; + } + + using BaseType::getSuperentityInitializer; + SuperentityInitializerType& getSuperentityInitializer( DimensionsTag ) + { + return this->superentityInitializer; + } + + void initEntities( InitializerType& initializer, const PointArrayType& points ) + { + EntityArrayType &entityArray = initializer.template meshEntitiesArray< DimensionsTag >(); + //cout << " Initiating entities with " << DimensionsTag::value << " dimensions ... " << endl; + entityArray.setSize( this->seedsIndexedSet.getSize() ); + SeedArrayType seedsArray; + seedsArray.setSize( this->seedsIndexedSet.getSize() ); + this->seedsIndexedSet.toArray( seedsArray ); + for( GlobalIndexType i = 0; i < this->seedsIndexedSet.getSize(); i++ ) + { + //cout << " Initiating entity " << i << endl; + EntityInitializerType::initEntity( entityArray[ i ], i, seedsArray[ i ], initializer ); + } + this->seedsIndexedSet.reset(); + + this->superentityInitializer.initSuperentities( initializer ); + + BaseType::initEntities(initializer, points); + } + + using BaseType::getReferenceOrientation; + const ReferenceOrientationType& getReferenceOrientation( DimensionsTag, GlobalIndexType index) const + { + return this->referenceOrientations[ index ]; + } + + void createEntityReferenceOrientations() + { + //cout << " Creating entity reference orientations with " << DimensionsTag::value << " dimensions ... " << endl; + SeedArrayType seedsArray; + seedsArray.setSize( this->seedsIndexedSet.getSize() ); + this->seedsIndexedSet.toArray( seedsArray ); + this->referenceOrientations.setSize( seedsArray.getSize() ); + for( GlobalIndexType i = 0; i < seedsArray.getSize(); i++ ) + { + //cout << " Creating reference orientation for entity " << i << endl; + this->referenceOrientations[ i ] = ReferenceOrientationType( seedsArray[ i ] ); + } + BaseType::createEntityReferenceOrientations(); + } + + private: + + typedef typename tnlMeshEntityTraits< MeshConfig, DimensionsTag::value >::SeedIndexedSetType SeedIndexedSet; + SeedIndexedSet seedsIndexedSet; + SuperentityInitializerType superentityInitializer; + ReferenceOrientationArrayType referenceOrientations; +}; + +/**** + * Mesh initializer layer for entities not being stored + */ +template< typename MeshConfig, + typename DimensionsTag > +class tnlMeshInitializerLayer< MeshConfig, + DimensionsTag, + false, + false > + : public tnlMeshInitializerLayer< MeshConfig, + typename DimensionsTag::Decrement > +{}; + +/**** + * Mesh initializer layer for vertices + * - vertices must always be stored + * - their orientation does not make sense + */ +template< typename MeshConfig > +class tnlMeshInitializerLayer< MeshConfig, + tnlDimensionsTag< 0 >, + true, + false > +{ + typedef tnlMesh< MeshConfig > MeshType; + typedef typename MeshType::MeshTraits MeshTraits; + typedef tnlDimensionsTag< 0 > DimensionsTag; + + typedef typename MeshType::template EntityTraits< DimensionsTag::value > EntityTraits; + typedef typename EntityTraits::EntityTopology EntityTopology; + typedef typename EntityTraits::StorageArrayType ContainerType; + typedef typename EntityTraits::AccessArrayType SharedContainerType; + typedef typename ContainerType::IndexType GlobalIndexType; + + typedef typename MeshTraits::CellTopology CellTopology; + + typedef tnlMeshInitializer< MeshConfig > InitializerType; + typedef tnlMeshEntityInitializer< MeshConfig, CellTopology > CellInitializerType; + typedef tnlMeshEntityInitializer< MeshConfig, EntityTopology > VertexInitializerType; + typedef tnlArray< VertexInitializerType, tnlHost, GlobalIndexType > VertexInitializerContainerType; + typedef typename tnlMeshTraits< MeshConfig >::CellSeedArrayType CellSeedArrayType; + typedef typename tnlMeshTraits< MeshConfig >::LocalIndexType LocalIndexType; + typedef typename tnlMeshTraits< MeshConfig >::PointArrayType PointArrayType; + typedef typename EntityTraits::StorageArrayType EntityArrayType; + typedef tnlMeshEntityInitializer< MeshConfig, EntityTopology > EntityInitializerType; + typedef tnlMeshSuperentityStorageInitializer< MeshConfig, EntityTopology > SuperentityInitializerType; + + public: + + void setMesh( MeshType& mesh ) + { + this->mesh = &mesh; + } + + MeshType& getMesh() + { + tnlAssert( this->mesh, ); + return *( this->mesh ); + } + + VertexInitializerType& getEntityInitializer( DimensionsTag, GlobalIndexType index ) + { + tnlAssert( index >= 0 && index < vertexInitializerContainer.getSize(), + cerr << " index = " << index + << " vertexInitializerContainer.getSize() = " << vertexInitializerContainer.getSize() << endl; ); + return vertexInitializerContainer[ index ]; + } + + void createEntitySeedsFromCellSeeds( const CellSeedArrayType& cellSeeds ){}; + + void initEntities( InitializerType& initializer, const PointArrayType& points ) + { + EntityArrayType &vertexArray = initializer.template meshEntitiesArray< DimensionsTag >(); + vertexArray.setSize( points.getSize() ); + for( GlobalIndexType i = 0; i < vertexArray.getSize(); i++ ) + EntityInitializerType::setVertexPoint( vertexArray[i], points[i], initializer ); + + superentityInitializer.initSuperentities( initializer ); + } + + void findEntitySeedIndex() const {} // This method is due to 'using BaseType::findEntityIndex;' in the derived class. + + void createEntityInitializers() + { + vertexInitializerContainer.setSize( this->getMesh().template getNumberOfEntities< DimensionsTag::value >() ); + } + + SuperentityInitializerType& getSuperentityInitializer( DimensionsTag ) + { + return this->superentityInitializer; + } + + void createEntityReferenceOrientations() const {} + + void getReferenceOrientation() const {} + + private: + + SuperentityInitializerType superentityInitializer; + + VertexInitializerContainerType vertexInitializerContainer; + + MeshType* mesh; +}; + + + + +#endif /* TNLMESHINITIALIZER_H_ */ diff --git a/src/mesh/initializer/tnlMeshSubentitySeedCreator.h b/src/mesh/initializer/tnlMeshSubentitySeedCreator.h new file mode 100644 index 0000000000000000000000000000000000000000..35dd6abbd7c23b6c760f9390e0df7c6ba8ad29cd --- /dev/null +++ b/src/mesh/initializer/tnlMeshSubentitySeedCreator.h @@ -0,0 +1,82 @@ +/*************************************************************************** + tnlMeshSubentitySeedCreator.h - description + ------------------- + begin : Aug 20, 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 TNLMESHSUBENTITYSEEDCREATOR_H +#define TNLMESHSUBENTITYSEEDCREATOR_H + +#include <core/tnlStaticFor.h> + +template< typename MeshConfig, + typename EntityTopology, + typename SubDimensionsTag > +class tnlMeshSubentitySeedsCreator +{ + typedef typename tnlMeshTraits< MeshConfig >::LocalIndexType LocalIndexType; + typedef typename tnlMeshTraits< MeshConfig >::template SubentityTraits< EntityTopology, SubDimensionsTag::value > SubentityTraits; + typedef typename SubentityTraits::SubentityTopology SubentityTopology; + typedef typename tnlMeshTraits< MeshConfig >::IdArrayAccessorType IdArrayAccessorType; + typedef typename tnlMeshTraits< MeshConfig >::template SubentityTraits< SubentityTopology, 0 > SubentityVertexTraits; + + static const LocalIndexType SUBENTITIES_COUNT = SubentityTraits::count; + static const LocalIndexType SUBENTITY_VERTICES_COUNT = SubentityVertexTraits::count; + + public: + typedef typename SubentityTraits::SeedArrayType SubentitySeedArray; + typedef tnlMeshEntitySeed< MeshConfig, EntityTopology > EntitySeed; + //typedef typename tnlMeshEntityTraits< MeshConfig, SubDimensionsTag >::SeedIndexedSetType SeedIndexedSet; + + //template< typename SeedIndexedSet > + static SubentitySeedArray create( const EntitySeed &entitySeed ) + { + SubentitySeedArray subentitySeeds; + tnlStaticFor< LocalIndexType, 0, SUBENTITIES_COUNT, CreateSubentitySeeds >::exec( subentitySeeds, entitySeed.getCornerIds() ); + //tnlStaticFor< LocalIndexType, 0, SUBENTITIES_COUNT, CreateSubentitySeeds >::exec( indexedSet, entitySeed.getCornerIds() ); + + return subentitySeeds; + } + + private: + typedef tnlMeshEntitySeed< MeshConfig, SubentityTopology > SubentitySeed; + + template< LocalIndexType subentityIndex > + class CreateSubentitySeeds + { + public: + static void exec( SubentitySeedArray &subentitySeeds, IdArrayAccessorType vertexIds ) + //static void exec( SeedIndexedSet& indexedSet, IdArrayAccessorType vertexIds ) + { + //EntitySeed seed; + tnlStaticFor< LocalIndexType, 0, SUBENTITY_VERTICES_COUNT, SetSubentitySeedVertex >::exec( subentitySeeds[ subentityIndex ], vertexIds ); + //indexedSet.insert( seed ); + } + + private: + template< LocalIndexType subentityVertexIndex > + class SetSubentitySeedVertex + { + public: + static void exec( SubentitySeed &subentitySeed, IdArrayAccessorType vertexIds ) + { + static const LocalIndexType VERTEX_INDEX = SubentityTraits::template Vertex< subentityIndex, subentityVertexIndex >::index; + subentitySeed.setCornerId( subentityVertexIndex, vertexIds[ VERTEX_INDEX ] ); + } + }; + }; +}; + +#endif /* TNLMESHSUBENTITYSEEDCREATOR_H */ + diff --git a/src/mesh/initializer/tnlMeshSuperentityStorageInitializer.h b/src/mesh/initializer/tnlMeshSuperentityStorageInitializer.h new file mode 100644 index 0000000000000000000000000000000000000000..89c18bf540a2c9154a71c9e31855b7c1391db369 --- /dev/null +++ b/src/mesh/initializer/tnlMeshSuperentityStorageInitializer.h @@ -0,0 +1,203 @@ +/*************************************************************************** + tnlMeshSuperentityStorageInitializer.h - description + ------------------- + begin : Feb 27, 2014 + copyright : (C) 2014 by Tomas Oberhuber + 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 TNLMESHSUPERENTITYSTORAGEINITIALIZER_H_ +#define TNLMESHSUPERENTITYSTORAGEINITIALIZER_H_ + +#include <mesh/tnlDimensionsTag.h> +#include <algorithm> + +template< typename MeshConfig > +class tnlMeshInitializer; + +template< typename MeshConfig, + typename EntityTopology, + typename DimensionsTag, + bool SuperentityStorage = tnlMeshSuperentityTraits< MeshConfig, EntityTopology, DimensionsTag::value >::storageEnabled > +class tnlMeshSuperentityStorageInitializerLayer; + +template< typename MeshConfig, + typename EntityTopology > +class tnlMeshSuperentityStorageInitializer : + public tnlMeshSuperentityStorageInitializerLayer< MeshConfig, EntityTopology, tnlDimensionsTag< tnlMeshTraits< MeshConfig >::meshDimensions > > +{}; + +template< typename MeshConfig, + typename EntityTopology, + typename DimensionsTag > +class tnlMeshSuperentityStorageInitializerLayer< MeshConfig, + EntityTopology, + DimensionsTag, + true > + : public tnlMeshSuperentityStorageInitializerLayer< MeshConfig, + EntityTopology, + typename DimensionsTag::Decrement > +{ + typedef tnlMeshSuperentityStorageInitializerLayer< MeshConfig, + EntityTopology, + typename DimensionsTag::Decrement > BaseType; + + static const int Dimensions = DimensionsTag::value; + typedef tnlDimensionsTag< EntityTopology::dimensions > EntityDimensions; + + typedef tnlMeshTraits< MeshConfig > MeshTraits; + typedef typename MeshTraits::GlobalIdArrayType GlobalIdArrayType; + + typedef typename MeshTraits::GlobalIndexType GlobalIndexType; + typedef typename MeshTraits::LocalIndexType LocalIndexType; + typedef tnlMeshInitializer< MeshConfig > MeshInitializer; + typedef typename MeshTraits::template SuperentityTraits< EntityTopology, Dimensions > SuperentityTraits; + typedef typename SuperentityTraits::StorageNetworkType SuperentityStorageNetwork; + + public: + using BaseType::addSuperentity; + + void addSuperentity( DimensionsTag, GlobalIndexType entityIndex, GlobalIndexType superentityIndex) + { + //cout << "Adding superentity with " << DimensionsTag::value << " dimensions of enity with " << EntityDimensions::value << " ... " << endl; + indexPairs.push_back( IndexPair{ entityIndex, superentityIndex } ); + } + + using BaseType::initSuperentities; + void initSuperentities( MeshInitializer& meshInitializer ) + { + std::sort( indexPairs.begin(), + indexPairs.end(), + []( IndexPair pair0, IndexPair pair1 ){ return ( pair0.entityIndex < pair1.entityIndex ); } ); + + GlobalIdArrayType &superentityIdsArray = meshInitializer.template meshSuperentityIdsArray< EntityDimensions, DimensionsTag >(); + superentityIdsArray.setSize( static_cast< GlobalIndexType >( indexPairs.size() ) ); + GlobalIndexType currentBegin = 0; + GlobalIndexType lastEntityIndex = 0; + cout << "There are " << superentityIdsArray.getSize() << " superentities with " << DimensionsTag::value << " dimensions of enities with " << EntityDimensions::value << " ... " << endl; + for( GlobalIndexType i = 0; i < superentityIdsArray.getSize(); i++) + { + superentityIdsArray[ i ] = indexPairs[i].superentityIndex; + + //cout << "Adding superentity " << indexPairs[i].superentityIndex << " to entity " << lastEntityIndex << endl; + if( indexPairs[ i ].entityIndex != lastEntityIndex ) + { + meshInitializer.template superentityIdsArray< DimensionsTag >( meshInitializer.template meshEntitiesArray< EntityDimensions >()[ lastEntityIndex ] ).bind( superentityIdsArray, currentBegin, i - currentBegin ); + currentBegin = i; + lastEntityIndex = indexPairs[ i ].entityIndex; + } + } + + meshInitializer.template superentityIdsArray< DimensionsTag >( meshInitializer.template meshEntitiesArray< EntityDimensions >()[ lastEntityIndex ] ).bind( superentityIdsArray, currentBegin, superentityIdsArray.getSize() - currentBegin ); + indexPairs.clear(); + + /**** + * Network initializer + */ + SuperentityStorageNetwork& superentityStorageNetwork = meshInitializer.template meshSuperentityStorageNetwork< EntityTopology, DimensionsTag >(); + //GlobalIndexType lastEntityIndex( 0 ); + superentityStorageNetwork.setRanges( + meshInitializer.template meshEntitiesArray< EntityDimensions >().getSize(), + meshInitializer.template meshEntitiesArray< DimensionsTag >().getSize() ); + lastEntityIndex = 0; + typename SuperentityStorageNetwork::ValuesAllocationVectorType storageNetworkAllocationVector; + storageNetworkAllocationVector.setSize( meshInitializer.template meshEntitiesArray< EntityDimensions >().getSize() ); + storageNetworkAllocationVector.setValue( 0 ); + for( GlobalIndexType i = 0; i < superentityIdsArray.getSize(); i++) + { + if( indexPairs[ i ].entityIndex == lastEntityIndex ) + storageNetworkAllocationVector[ lastEntityIndex ]++; + else + lastEntityIndex++; + } + superentityStorageNetwork.allocate( storageNetworkAllocationVector ); + lastEntityIndex = 0; + LocalIndexType superentitiesCount( 0 ); + typename SuperentityStorageNetwork::ValuesAccessorType superentitiesIndecis = + superentityStorageNetwork.getValues( lastEntityIndex ); + for( GlobalIndexType i = 0; i < superentityIdsArray.getSize(); i++) + { + if( indexPairs[ i ].entityIndex != lastEntityIndex ) + { + superentitiesIndecis = superentityStorageNetwork.getValues( ++lastEntityIndex ); + superentitiesCount = 0; + } + superentitiesIndecis[ superentitiesCount++ ] = indexPairs[ i ].superentityIndex; + } + BaseType::initSuperentities( meshInitializer ); + } + + private: + struct IndexPair + { + GlobalIndexType entityIndex; + GlobalIndexType superentityIndex; + }; + + std::vector< IndexPair > indexPairs; + +}; + +template< typename MeshConfig, + typename EntityTopology, + typename DimensionsTag > +class tnlMeshSuperentityStorageInitializerLayer< MeshConfig, + EntityTopology, + DimensionsTag, + false > + : public tnlMeshSuperentityStorageInitializerLayer< MeshConfig, + EntityTopology, + typename DimensionsTag::Decrement > +{ + typedef tnlMeshSuperentityStorageInitializerLayer< MeshConfig, + EntityTopology, + typename DimensionsTag::Decrement > BaseType; + typedef tnlMeshInitializer< MeshConfig > MeshInitializerType; + + public: + void addSuperentity() {} // This method is due to 'using BaseType::...;' in the derived classes. + using BaseType::initSuperentities; + void initSuperentities( MeshInitializerType& ) {cerr << "***" << endl;} +}; + +template< typename MeshConfig, + typename EntityTopology > +class tnlMeshSuperentityStorageInitializerLayer< MeshConfig, + EntityTopology, + tnlDimensionsTag< EntityTopology::dimensions >, + true > +{ + typedef tnlMeshInitializer< MeshConfig > MeshInitializerType; + + public: + void addSuperentity() {} // This method is due to 'using BaseType::...;' in the derived classes. + void initSuperentities( MeshInitializerType& ) {} +}; + +template< typename MeshConfig, + typename EntityTopology > +class tnlMeshSuperentityStorageInitializerLayer< MeshConfig, + EntityTopology, + tnlDimensionsTag< EntityTopology::dimensions >, + false > +{ + typedef tnlMeshInitializer< MeshConfig > MeshInitializerType; + + public: + void addSuperentity() {} // This method is due to 'using BaseType::...;' in the derived classes. + void initSuperentities( MeshInitializerType& ) {} +}; + + + + +#endif /* TNLMESHSUPERENTITYSTORAGEINITIALIZER_H_ */ diff --git a/src/mesh/layers/tnlMeshStorageLayer.h b/src/mesh/layers/tnlMeshStorageLayer.h index 7f580fd1ff4edb770274f111999aace8ed883161..62ea6701c9a2871db2687aa45031177524ed0db0 100644 --- a/src/mesh/layers/tnlMeshStorageLayer.h +++ b/src/mesh/layers/tnlMeshStorageLayer.h @@ -20,198 +20,191 @@ #include <core/tnlFile.h> #include <mesh/traits/tnlMeshTraits.h> -#include <mesh/traits/tnlMeshEntitiesTraits.h> -#include <mesh/traits/tnlStorageTraits.h> - -template< typename DimensionsTraits, - typename Device, - typename ConfigTag, - typename EntityStorageTag = typename tnlMeshEntitiesTraits< ConfigTag, - DimensionsTraits >::EntityStorageTag > -class tnlMeshStorageTag; - -template< typename ConfigTag, - typename DimensionsTraits, - typename EntityStorageTag = typename tnlMeshEntitiesTraits< ConfigTag, - DimensionsTraits >::EntityStorageTag > +#include <mesh/traits/tnlMeshEntityTraits.h> +#include <mesh/traits/tnlMeshTraits.h> + +template< typename MeshConfig, + typename DimensionsTag, + bool EntityStorage = tnlMeshEntityTraits< MeshConfig, DimensionsTag::value >::storageEnabled > class tnlMeshStorageLayer; -template< typename ConfigTag > +template< typename MeshConfig > class tnlMeshStorageLayers - : public tnlMeshStorageLayer< ConfigTag, - typename tnlMeshTraits< ConfigTag >::DimensionsTraits > -{}; + : public tnlMeshStorageLayer< MeshConfig, typename tnlMeshTraits< MeshConfig >::DimensionsTag > +{ +}; -template< typename ConfigTag, - typename DimensionsTraits > -class tnlMeshStorageLayer< ConfigTag, - DimensionsTraits, - tnlStorageTraits< true > > - : public tnlMeshStorageLayer< ConfigTag, typename DimensionsTraits::Previous > +template< typename MeshConfig, + typename DimensionsTag > +class tnlMeshStorageLayer< MeshConfig, + DimensionsTag, + true > + : public tnlMeshStorageLayer< MeshConfig, typename DimensionsTag::Decrement >, + public tnlMeshSuperentityStorageLayers< MeshConfig, + typename tnlMeshTraits< MeshConfig >::template EntityTraits< DimensionsTag::value >::EntityTopology > { - typedef tnlMeshStorageLayer< ConfigTag, - typename DimensionsTraits::Previous > BaseType; + public: - typedef tnlMeshEntitiesTraits< ConfigTag, DimensionsTraits > Tag; - typedef typename Tag::ContainerType ContainerType; - typedef typename Tag::SharedContainerType SharedContainerType; - typedef typename ContainerType::IndexType GlobalIndexType; - typedef typename ContainerType::ElementType EntityType; + static const int Dimensions = DimensionsTag::value; + typedef tnlMeshStorageLayer< MeshConfig, typename DimensionsTag::Decrement > BaseType; + typedef tnlMeshSuperentityStorageLayers< MeshConfig, + typename tnlMeshTraits< MeshConfig >::template EntityTraits< DimensionsTag::value >::EntityTopology > SuperentityStorageBaseType; + typedef tnlMeshTraits< MeshConfig > MeshTraits; + typedef typename MeshTraits::template EntityTraits< Dimensions > EntityTraits; - protected: + typedef typename EntityTraits::StorageArrayType StorageArrayType; + typedef typename EntityTraits::AccessArrayType AccessArrayType; + typedef typename EntityTraits::GlobalIndexType GlobalIndexType; + typedef typename EntityTraits::EntityType EntityType; + typedef typename EntityTraits::EntityTopology EntityTopology; - using BaseType::setNumberOfEntities; - using BaseType::getNumberOfEntities; - using BaseType::setEntity; - using BaseType::getEntity; - using BaseType::getEntities; - tnlMeshStorageLayer() - { - } - - /*~tnlMeshStorageLayer() - { - cout << "Destroying mesh storage layer with " << DimensionsTraits::value << " dimensions and " << this->entities.getSize() << " entities." << endl; - }*/ + using BaseType::getNumberOfEntities; + using BaseType::getEntity; + using BaseType::getEntities; - bool setNumberOfEntities( DimensionsTraits, const GlobalIndexType size ) - { - if( ! this->entities.setSize( size ) ) - return false; - this->sharedEntities.bind( this->entities ); - return true; - } - - GlobalIndexType getNumberOfEntities( DimensionsTraits ) const - { - return this->entities.getSize(); - } + tnlMeshStorageLayer() + { + } - void setEntity( DimensionsTraits, - const GlobalIndexType entityIndex, - const EntityType& entity ) const - { - this->entities.setElement( entityIndex, entity ); - } + GlobalIndexType getNumberOfEntities( DimensionsTag ) const + { + return this->entities.getSize(); + } - EntityType& getEntity( DimensionsTraits, - const GlobalIndexType entityIndex ) - { - return this->entities[ entityIndex ]; - } + EntityType& getEntity( DimensionsTag, + const GlobalIndexType entityIndex ) + { + return this->entities[ entityIndex ]; + } - const EntityType& getEntity( DimensionsTraits, - const GlobalIndexType entityIndex ) const - { - return this->entities[ entityIndex ]; - } + const EntityType& getEntity( DimensionsTag, + const GlobalIndexType entityIndex ) const + { + return this->entities[ entityIndex ]; + } - SharedContainerType& getEntities( DimensionsTraits ) - { - return this->sharedEntities; - } + AccessArrayType& getEntities( DimensionsTag ) + { + return this->sharedEntities; + } - const SharedContainerType& getEntities( DimensionsTraits ) const - { - return this->sharedEntities; - } + const AccessArrayType& getEntities( DimensionsTag ) const + { + return this->sharedEntities; + } - bool save( tnlFile& file ) const - { - if( ! BaseType::save( file ) || - ! this->entities.save( file ) ) + bool save( tnlFile& file ) const { - cerr << "Saving of the mesh entities with " << DimensionsTraits::value << " dimensions failed." << endl; - return false; + if( ! BaseType::save( file ) || + ! this->entities.save( file ) ) + { + cerr << "Saving of the mesh entities with " << DimensionsTag::value << " dimensions failed." << endl; + return false; + } + return true; } - return true; - } - bool load( tnlFile& file ) - { - //cout << "Loading mesh layer with dimensions " << DimensionsTraits::value << endl; - if( ! BaseType::load( file ) || - ! this->entities.load( file ) ) + bool load( tnlFile& file ) { - cerr << "Loading of the mesh entities with " << DimensionsTraits::value << " dimensions failed." << endl; - return false; + //cout << "Loading mesh layer with dimensions " << DimensionsTag::value << endl; + if( ! BaseType::load( file ) || + ! this->entities.load( file ) ) + { + cerr << "Loading of the mesh entities with " << DimensionsTag::value << " dimensions failed." << endl; + return false; + } + this->entitiesAccess.bind( this->entities ); + return true; } - this->sharedEntities.bind( this->entities ); - return true; - } - void print( ostream& str ) const - { - BaseType::print( str ); - str << "The entities with " << DimensionsTraits::value << " dimensions are: " << endl; - for( GlobalIndexType i = 0; i < entities.getSize();i ++ ) + void print( ostream& str ) const { - str << i << " "; - entities[ i ].print( str ); - str << endl; + BaseType::print( str ); + str << "The entities with " << DimensionsTag::value << " dimensions are: " << endl; + for( GlobalIndexType i = 0; i < entities.getSize();i ++ ) + { + str << i << " "; + entities[ i ].print( str ); + str << endl; + } + SuperentityStorageBaseType::print( str ); } - } - bool operator==( const tnlMeshStorageLayer& meshLayer ) const - { - return ( BaseType::operator==( meshLayer ) && entities == meshLayer.entities ); - } + bool operator==( const tnlMeshStorageLayer& meshLayer ) const + { + return ( BaseType::operator==( meshLayer ) && entities == meshLayer.entities ); + } protected: - ContainerType entities; + StorageArrayType entities; + + AccessArrayType entitiesAccess; + + // TODO: this is only for the mesh initializer - fix it + public: - SharedContainerType sharedEntities; + using BaseType::entitiesArray; + + typename EntityTraits::StorageArrayType& entitiesArray( DimensionsTag ) + { + return entities; + } + + using BaseType::superentityIdsArray; + + template< typename SuperDimensionsTag > + typename MeshTraits::GlobalIdArrayType& superentityIdsArray( DimensionsTag ) + { + return SuperentityStorageBaseType::superentityIdsArray( SuperDimensionsTag() ); + } + + using BaseType::getSuperentityStorageNetwork; + template< typename SuperdimensionsTag > + typename MeshTraits::template SuperentityTraits< EntityTopology, SuperdimensionsTag::value >::StorageNetworkType& + getSuperentityStorageNetwork( tnlDimensionsTag< EntityTopology::dimensions > ) + { + return SuperentityStorageBaseType::getStorageNetwork( SuperdimensionsTag() ); + } }; -template< typename ConfigTag, - typename DimensionsTraits > -class tnlMeshStorageLayer< ConfigTag, - DimensionsTraits, - tnlStorageTraits< false > > - : public tnlMeshStorageLayer< ConfigTag, - typename DimensionsTraits::Previous > +template< typename MeshConfig, + typename DimensionsTag > +class tnlMeshStorageLayer< MeshConfig, DimensionsTag, false > + : public tnlMeshStorageLayer< MeshConfig, typename DimensionsTag::Decrement > { }; -template< typename ConfigTag > -class tnlMeshStorageLayer< ConfigTag, - tnlDimensionsTraits< 0 >, - tnlStorageTraits< true > > -{ - typedef tnlDimensionsTraits< 0 > DimensionsTraits; +template< typename MeshConfig > +class tnlMeshStorageLayer< MeshConfig, tnlDimensionsTag< 0 >, true > : + public tnlMeshSuperentityStorageLayers< MeshConfig, + tnlMeshVertexTopology > - typedef tnlMeshEntitiesTraits< ConfigTag, - DimensionsTraits > Tag; - typedef typename Tag::ContainerType ContainerType; - typedef typename Tag::SharedContainerType SharedContainerType; - typedef typename ContainerType::IndexType GlobalIndexType; - typedef typename ContainerType::ElementType VertexType; - typedef typename VertexType::PointType PointType; +{ + public: - protected: + typedef tnlDimensionsTag< 0 > DimensionsTag; + + typedef tnlMeshSuperentityStorageLayers< MeshConfig, + tnlMeshVertexTopology > SuperentityStorageBaseType; + typedef tnlMeshTraits< MeshConfig > MeshTraits; + typedef typename MeshTraits::template EntityTraits< 0 > EntityTraits; + + typedef typename EntityTraits::StorageArrayType StorageArrayType; + typedef typename EntityTraits::AccessArrayType AccessArrayType; + typedef typename EntityTraits::GlobalIndexType GlobalIndexType; + typedef typename EntityTraits::EntityType VertexType; + typedef typename VertexType::PointType PointType; + typedef tnlMeshVertexTopology EntityTopology; + tnlMeshStorageLayer() { } - /*~tnlMeshStorageLayer() - { - cout << "mesh storage layer: dimensions = " << DimensionsTraits::value << " entities = " << this->vertices.getSize() << endl; - }*/ - - - bool setNumberOfVertices( const GlobalIndexType size ) - { - if( ! this->vertices.setSize( size ) ) - return false; - this->sharedVertices.bind( this->vertices ); - return true; - } - GlobalIndexType getNumberOfVertices() const { return this->vertices.getSize(); @@ -244,43 +237,30 @@ class tnlMeshStorageLayer< ConfigTag, * This is only for the completeness and compatibility * with higher dimensions entities storage layers. */ - bool setNumberOfEntities( DimensionsTraits, - const GlobalIndexType size ) - { - return this->vertices.setSize( size ); - } - GlobalIndexType getNumberOfEntities( DimensionsTraits ) const + GlobalIndexType getNumberOfEntities( DimensionsTag ) const { return this->vertices.getSize(); } - void setEntity( DimensionsTraits, - const GlobalIndexType entityIndex, - const VertexType& entity ) const - { - this->vertices.setElement( entityIndex, entity ); - } - - VertexType& getEntity( DimensionsTraits, + VertexType& getEntity( DimensionsTag, const GlobalIndexType entityIndex ) { return this->vertices[ entityIndex ]; } - - const VertexType& getEntity( DimensionsTraits, + const VertexType& getEntity( DimensionsTag, const GlobalIndexType entityIndex ) const { return this->vertices.getElement( entityIndex ); } - SharedContainerType& getEntities( DimensionsTraits ) + AccessArrayType& getEntities( DimensionsTag ) { return this->sharedVertices; } - const SharedContainerType& getEntities( DimensionsTraits ) const + const AccessArrayType& getEntities( DimensionsTag ) const { return this->sharedVertices; } @@ -289,7 +269,7 @@ class tnlMeshStorageLayer< ConfigTag, { if( ! this->vertices.save( file ) ) { - cerr << "Saving of the mesh entities with " << DimensionsTraits::value << " dimensions failed." << endl; + cerr << "Saving of the mesh entities with " << DimensionsTag::value << " dimensions failed." << endl; return false; } return true; @@ -299,20 +279,21 @@ class tnlMeshStorageLayer< ConfigTag, { if( ! this->vertices.load( file ) ) { - cerr << "Loading of the mesh entities with " << DimensionsTraits::value << " dimensions failed." << endl; + cerr << "Loading of the mesh entities with " << DimensionsTag::value << " dimensions failed." << endl; return false; } - this->sharedVertices.bind( this->vertices ); + this->verticesAccess.bind( this->vertices ); return true; } void print( ostream& str ) const - { + { str << "The mesh vertices are: " << endl; for( GlobalIndexType i = 0; i < vertices.getSize();i ++ ) { str << i << vertices[ i ] << endl; } + SuperentityStorageBaseType::print( str ); } bool operator==( const tnlMeshStorageLayer& meshLayer ) const @@ -322,22 +303,39 @@ class tnlMeshStorageLayer< ConfigTag, private: - ContainerType vertices; + StorageArrayType vertices; + + AccessArrayType verticesAccess; + + // TODO: this is only for the mesh initializer - fix it + public: + + typename EntityTraits::StorageArrayType& entitiesArray( DimensionsTag ) + { + return vertices; + } + + + template< typename SuperDimensionsTag > + typename MeshTraits::GlobalIdArrayType& superentityIdsArray( DimensionsTag ) + { + return SuperentityStorageBaseType::superentityIdsArray( SuperDimensionsTag() ); + } + + template< typename SuperdimensionsTag > + typename MeshTraits::template SuperentityTraits< EntityTopology, SuperdimensionsTag::value >::StorageNetworkType& getSuperentityStorageNetwork( tnlDimensionsTag< EntityTopology::dimensions > ) + { + return SuperentityStorageBaseType::getStorageNetwork( SuperdimensionsTag() ); + } - SharedContainerType sharedVertices; }; /**** * Forces termination of recursive inheritance (prevents compiler from generating huge error logs) */ -template< typename ConfigTag > -class tnlMeshStorageLayer< ConfigTag, - tnlDimensionsTraits< 0 >, - tnlStorageTraits< false > > +template< typename MeshConfig > +class tnlMeshStorageLayer< MeshConfig, tnlDimensionsTag< 0 >, false > { - protected: - - void setNumberOfEntities(); }; diff --git a/src/mesh/layers/tnlMeshSubentityStorageLayer.h b/src/mesh/layers/tnlMeshSubentityStorageLayer.h index 375ae8e0af05dd53f52b936079401c9764fb5c14..89e96a859455819894674b432ae5760a19a1c83c 100644 --- a/src/mesh/layers/tnlMeshSubentityStorageLayer.h +++ b/src/mesh/layers/tnlMeshSubentityStorageLayer.h @@ -19,66 +19,66 @@ #define TNLMESHSUBENTITYSTORAGELAYER_H_ #include <core/tnlFile.h> -#include <mesh/traits/tnlDimensionsTraits.h> -#include <mesh/traits/tnlStorageTraits.h> -#include <mesh/traits/tnlMeshSubentitiesTraits.h> - -template< typename ConfigTag, - typename EntityTag, - typename DimensionTraits, - typename SubentityStorageTag = - typename tnlMeshSubentitiesTraits< ConfigTag, - EntityTag, - DimensionTraits >::SubentityStorageTag > +#include <mesh/tnlDimensionsTag.h> +#include <mesh/traits/tnlMeshSubentityTraits.h> +#include <mesh/tnlMeshEntityOrientation.h> + +template< typename MeshConfig, + typename EntityTopology, + typename DimensionsTag, + bool SubentityStorage = + tnlMeshTraits< MeshConfig >::template SubentityTraits< EntityTopology, DimensionsTag::value >::storageEnabled, + bool SubentityOrientationStorage = + tnlMeshTraits< MeshConfig >::template SubentityTraits< EntityTopology, DimensionsTag::value >::orientationEnabled > class tnlMeshSubentityStorageLayer; -template< typename ConfigTag, - typename EntityTag > +template< typename MeshConfig, + typename EntityTopology > class tnlMeshSubentityStorageLayers - : public tnlMeshSubentityStorageLayer< ConfigTag, - EntityTag, - tnlDimensionsTraits< EntityTag::dimensions - 1 > > + : public tnlMeshSubentityStorageLayer< MeshConfig, + EntityTopology, + tnlDimensionsTag< EntityTopology::dimensions - 1 > > { }; -template< typename ConfigTag, - typename EntityTag, - typename DimensionsTraits > -class tnlMeshSubentityStorageLayer< ConfigTag, - EntityTag, - DimensionsTraits, - tnlStorageTraits< true > > - : public tnlMeshSubentityStorageLayer< ConfigTag, - EntityTag, - typename DimensionsTraits::Previous > +template< typename MeshConfig, + typename EntityTopology, + typename DimensionsTag > +class tnlMeshSubentityStorageLayer< MeshConfig, + EntityTopology, + DimensionsTag, + true, + true > + : public tnlMeshSubentityStorageLayer< MeshConfig, + EntityTopology, + typename DimensionsTag::Decrement > { - typedef tnlMeshSubentityStorageLayer< ConfigTag, - EntityTag, - typename DimensionsTraits::Previous > BaseType; - - typedef tnlMeshSubentitiesTraits< ConfigTag, - EntityTag, - DimensionsTraits > SubentityTraits; + typedef tnlMeshSubentityStorageLayer< MeshConfig, + EntityTopology, + typename DimensionsTag::Decrement > BaseType; protected: - typedef typename SubentityTraits::ContainerType ContainerType; - typedef typename SubentityTraits::SharedContainerType SharedContainerType; - typedef typename ContainerType::ElementType GlobalIndexType; - typedef int LocalIndexType; + static const int Dimensions = DimensionsTag::value; + typedef tnlMeshTraits< MeshConfig > MeshTraits; + typedef typename MeshTraits::template SubentityTraits< EntityTopology, Dimensions > SubentityTraits; + typedef typename MeshTraits::GlobalIndexType GlobalIndexType; + typedef typename MeshTraits::LocalIndexType LocalIndexType; + typedef typename SubentityTraits::IdArrayType IdArrayType; + typedef typename SubentityTraits::OrientationArrayType OrientationArrayType; + typedef typename MeshTraits::IdPermutationArrayAccessorType IdPermutationArrayAccessorType; tnlMeshSubentityStorageLayer() { this->subentitiesIndices.setValue( -1 ); - this->sharedSubentitiesIndices.bind( this->subentitiesIndices ); } - /*~tnlMeshSubentityStorageLayer() + ~tnlMeshSubentityStorageLayer() { - cout << " Destroying " << this->sharedSubentitiesIndices.getSize() << " subentities with "<< DimensionsTraits::value << " dimensions." << endl; - }*/ + //cout << " Destroying " << this->sharedSubentitiesIndices.getSize() << " subentities with "<< DimensionsTag::value << " dimensions." << endl; + } tnlMeshSubentityStorageLayer& operator = ( const tnlMeshSubentityStorageLayer& layer ) { @@ -92,7 +92,7 @@ class tnlMeshSubentityStorageLayer< ConfigTag, if( ! BaseType::save( file ) || ! this->subentitiesIndices.save( file ) ) { - cerr << "Saving of the entity subentities layer with " << DimensionsTraits::value << " failed." << endl; + cerr << "Saving of the entity subentities layer with " << DimensionsTag::value << " failed." << endl; return false; } return true; @@ -103,10 +103,9 @@ class tnlMeshSubentityStorageLayer< ConfigTag, if( ! BaseType::load( file ) || ! this->subentitiesIndices.load( file ) ) { - cerr << "Loading of the entity subentities layer with " << DimensionsTraits::value << " failed." << endl; + cerr << "Loading of the entity subentities layer with " << DimensionsTag::value << " failed." << endl; return false; } - this->sharedSubentitiesIndices.bind( this->subentitiesIndices ); return true; } @@ -114,7 +113,7 @@ class tnlMeshSubentityStorageLayer< ConfigTag, { BaseType::print( str ); str << endl; - str << "\t Subentities with " << DimensionsTraits::value << " dimensions are: " << subentitiesIndices << "."; + str << "\t Subentities with " << DimensionsTag::value << " dimensions are: " << subentitiesIndices << "."; } bool operator==( const tnlMeshSubentityStorageLayer& layer ) const @@ -128,88 +127,197 @@ class tnlMeshSubentityStorageLayer< ConfigTag, */ using BaseType::getSubentityIndex; using BaseType::setSubentityIndex; - using BaseType::getSubentitiesIndices; /**** * Define setter/getter for the current level of the subentities */ - void setSubentityIndex( DimensionsTraits, + void setSubentityIndex( DimensionsTag, const LocalIndexType localIndex, const GlobalIndexType globalIndex ) { this->subentitiesIndices[ localIndex ] = globalIndex; } - GlobalIndexType getSubentityIndex( DimensionsTraits, + GlobalIndexType getSubentityIndex( DimensionsTag, const LocalIndexType localIndex ) const { return this->subentitiesIndices[ localIndex ]; } - SharedContainerType& getSubentitiesIndices( DimensionsTraits ) + using BaseType::subentityIdsArray; + IdArrayType& subentityIdsArray( DimensionsTag ) { return this->subentitiesIndices; } + + using BaseType::subentityOrientation; + IdPermutationArrayAccessorType subentityOrientation( DimensionsTag, LocalIndexType index) const { - tnlAssert( this->subentitiesIndices.getData() == this->sharedSubentitiesIndices.getData(), ); - return this->sharedSubentitiesIndices; + tnlAssert( 0 <= index && index < SubentityTraits::count, ); + + return this->subentityOrientations[ index ].getSubvertexPermutation(); } - const SharedContainerType& getSubentitiesIndices( DimensionsTraits ) const + using BaseType::subentityOrientationsArray; + OrientationArrayType& subentityOrientationsArray( DimensionsTag ) { return this->subentityOrientations; } + + private: + IdArrayType subentitiesIndices; + + OrientationArrayType subentityOrientations; +}; + + +template< typename MeshConfig, + typename EntityTopology, + typename DimensionsTag > +class tnlMeshSubentityStorageLayer< MeshConfig, + EntityTopology, + DimensionsTag, + true, + false > + : public tnlMeshSubentityStorageLayer< MeshConfig, + EntityTopology, + typename DimensionsTag::Decrement > +{ + typedef tnlMeshSubentityStorageLayer< MeshConfig, + EntityTopology, + typename DimensionsTag::Decrement > BaseType; + + protected: + + static const int Dimensions = DimensionsTag::value; + typedef tnlMeshTraits< MeshConfig > MeshTraits; + typedef typename MeshTraits::template SubentityTraits< EntityTopology, Dimensions > SubentityTraits; + typedef typename MeshTraits::GlobalIndexType GlobalIndexType; + typedef typename MeshTraits::LocalIndexType LocalIndexType; + typedef typename SubentityTraits::IdArrayType IdArrayType; + typedef typename SubentityTraits::OrientationArrayType OrientationArrayType; + typedef typename MeshTraits::IdPermutationArrayAccessorType IdPermutationArrayAccessorType; + + tnlMeshSubentityStorageLayer() { - tnlAssert( this->subentitiesIndices.getData() == this->sharedSubentitiesIndices.getData(), ); - return this->sharedSubentitiesIndices; + this->subentitiesIndices.setValue( -1 ); } - private: - ContainerType subentitiesIndices; + ~tnlMeshSubentityStorageLayer() + { + //cout << " Destroying " << this->sharedSubentitiesIndices.getSize() << " subentities with "<< DimensionsTag::value << " dimensions." << endl; + } - SharedContainerType sharedSubentitiesIndices; + tnlMeshSubentityStorageLayer& operator = ( const tnlMeshSubentityStorageLayer& layer ) + { + BaseType::operator=( layer ); + this->subentitiesIndices = layer.subentitiesIndices; + return *this; + } -}; + bool save( tnlFile& file ) const + { + if( ! BaseType::save( file ) || + ! this->subentitiesIndices.save( file ) ) + { + cerr << "Saving of the entity subentities layer with " << DimensionsTag::value << " failed." << endl; + return false; + } + return true; + } + bool load( tnlFile& file ) + { + if( ! BaseType::load( file ) || + ! this->subentitiesIndices.load( file ) ) + { + cerr << "Loading of the entity subentities layer with " << DimensionsTag::value << " failed." << endl; + return false; + } + return true; + } -template< typename ConfigTag, - typename EntityTag, - typename DimensionsTraits > -class tnlMeshSubentityStorageLayer< ConfigTag, - EntityTag, - DimensionsTraits, - tnlStorageTraits< false > > - : public tnlMeshSubentityStorageLayer< ConfigTag, - EntityTag, - typename DimensionsTraits::Previous > + void print( ostream& str ) const + { + BaseType::print( str ); + str << endl; + str << "\t Subentities with " << DimensionsTag::value << " dimensions are: " << subentitiesIndices << "."; + } + + bool operator==( const tnlMeshSubentityStorageLayer& layer ) const + { + return ( BaseType::operator==( layer ) && + subentitiesIndices == layer.subentitiesIndices ); + } + + /**** + * Make visible setters and getters of the lower subentities + */ + using BaseType::getSubentityIndex; + using BaseType::setSubentityIndex; + + /**** + * Define setter/getter for the current level of the subentities + */ + void setSubentityIndex( DimensionsTag, + const LocalIndexType localIndex, + const GlobalIndexType globalIndex ) + { + this->subentitiesIndices[ localIndex ] = globalIndex; + } + + GlobalIndexType getSubentityIndex( DimensionsTag, + const LocalIndexType localIndex ) const + { + return this->subentitiesIndices[ localIndex ]; + } + + using BaseType::subentityIdsArray; + IdArrayType& subentityIdsArray( DimensionsTag ) { return this->subentitiesIndices; } + + using BaseType::subentityOrientationsArray; + void subentityOrientationsArray() {} + + private: + IdArrayType subentitiesIndices; +}; + +template< typename MeshConfig, + typename EntityTopology, + typename DimensionsTag > +class tnlMeshSubentityStorageLayer< MeshConfig, + EntityTopology, + DimensionsTag, + false, + false > + : public tnlMeshSubentityStorageLayer< MeshConfig, + EntityTopology, + typename DimensionsTag::Decrement > { }; -template< typename ConfigTag, - typename EntityTag > -class tnlMeshSubentityStorageLayer< ConfigTag, - EntityTag, - tnlDimensionsTraits< 0 >, - tnlStorageTraits< true > > +template< typename MeshConfig, + typename EntityTopology > +class tnlMeshSubentityStorageLayer< MeshConfig, + EntityTopology, + tnlDimensionsTag< 0 >, + true, + false > { - typedef tnlDimensionsTraits< 0 > DimensionsTraits; - - typedef tnlMeshSubentitiesTraits< ConfigTag, - EntityTag, - DimensionsTraits > SubentityTraits; + typedef tnlDimensionsTag< 0 > DimensionsTag; protected: - - typedef typename SubentityTraits::ContainerType ContainerType; - typedef typename SubentityTraits::SharedContainerType SharedContainerType; - typedef typename ContainerType::ElementType GlobalIndexType; - typedef int LocalIndexType; + static const int Dimensions = 0; + typedef tnlMeshTraits< MeshConfig > MeshTraits; + typedef typename MeshTraits::template SubentityTraits< EntityTopology, Dimensions > SubentityTraits; + typedef typename MeshTraits::GlobalIndexType GlobalIndexType; + typedef typename MeshTraits::LocalIndexType LocalIndexType; + typedef typename SubentityTraits::IdArrayType IdArrayType; tnlMeshSubentityStorageLayer() { this->verticesIndices.setValue( -1 ); - this->sharedVerticesIndices.bind( this->verticesIndices ); } - /*~tnlMeshSubentityStorageLayer() + ~tnlMeshSubentityStorageLayer() { - cout << " Destroying " << this->sharedVerticesIndices.getSize() << " subentities with "<< DimensionsTraits::value << " dimensions." << endl; - }*/ + //cout << " Destroying " << this->sharedVerticesIndices.getSize() << " subentities with "<< DimensionsTag::value << " dimensions." << endl; + } tnlMeshSubentityStorageLayer& operator = ( const tnlMeshSubentityStorageLayer& layer ) @@ -222,7 +330,7 @@ class tnlMeshSubentityStorageLayer< ConfigTag, { if( ! this->verticesIndices.save( file ) ) { - cerr << "Saving of the entity subentities layer with " << DimensionsTraits::value << " failed." << endl; + cerr << "Saving of the entity subentities layer with " << DimensionsTag::value << " failed." << endl; return false; } return true; @@ -232,16 +340,15 @@ class tnlMeshSubentityStorageLayer< ConfigTag, { if( ! this->verticesIndices.load( file ) ) { - cerr << "Loading of the entity subentities layer with " << DimensionsTraits::value << " failed." << endl; + cerr << "Loading of the entity subentities layer with " << DimensionsTag::value << " failed." << endl; return false; } - this->sharedVerticesIndices.bind( this->verticesIndices ); return true; } void print( ostream& str ) const { - str << "\t Subentities with " << DimensionsTraits::value << " dimensions are: " << this->verticesIndices << "."; + str << "\t Subentities with " << DimensionsTag::value << " dimensions are: " << this->verticesIndices << "."; } bool operator==( const tnlMeshSubentityStorageLayer& layer ) const @@ -249,43 +356,38 @@ class tnlMeshSubentityStorageLayer< ConfigTag, return ( verticesIndices == layer.verticesIndices ); } - GlobalIndexType getSubentityIndex( DimensionsTraits, + GlobalIndexType getSubentityIndex( DimensionsTag, const LocalIndexType localIndex ) const { return this->verticesIndices[ localIndex ]; } - void setSubentityIndex( DimensionsTraits, + void setSubentityIndex( DimensionsTag, const LocalIndexType localIndex, const GlobalIndexType globalIndex ) { this->verticesIndices[ localIndex ] = globalIndex; } - SharedContainerType& getSubentitiesIndices( DimensionsTraits ) - { - tnlAssert( this->verticesIndices.getData() == this->sharedVerticesIndices.getData(), ); - return this->sharedVerticesIndices; - } - - const SharedContainerType& getSubentitiesIndices( DimensionsTraits ) const - { - tnlAssert( this->verticesIndices.getData() == this->sharedVerticesIndices.getData(), ); - return this->sharedVerticesIndices; - } - - private: - - ContainerType verticesIndices; - - SharedContainerType sharedVerticesIndices; + IdArrayType& subentityIdsArray( DimensionsTag ) { return this->verticesIndices; } + + protected: + + /*** + * Necessary because of 'using TBase::...;' in the derived classes + */ + void subentityOrientation() {} + void subentityOrientationsArray() {} + + IdArrayType verticesIndices; }; -template< typename ConfigTag, - typename EntityTag > -class tnlMeshSubentityStorageLayer< ConfigTag, - EntityTag, - tnlDimensionsTraits< 0 >, - tnlStorageTraits< false > > +template< typename MeshConfig, + typename EntityTopology > +class tnlMeshSubentityStorageLayer< MeshConfig, + EntityTopology, + tnlDimensionsTag< 0 >, + false, + false > { public: diff --git a/src/mesh/layers/tnlMeshSuperentityAccess.h b/src/mesh/layers/tnlMeshSuperentityAccess.h new file mode 100644 index 0000000000000000000000000000000000000000..2c0679642573ae4534831d14985a4607cf8a0186 --- /dev/null +++ b/src/mesh/layers/tnlMeshSuperentityAccess.h @@ -0,0 +1,159 @@ +/*************************************************************************** + tnlMeshSuperentityAccess.h - description + ------------------- + begin : Aug 15, 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 TNLSUPERENTITYACCESS_H +#define TNLSUPERENTITYACCESS_H + +#include <mesh/traits/tnlMeshTraits.h> + + +template< typename MeshConfig, + typename MeshEntity, + typename DimensionsTag, + bool SuperentityStorage = + tnlMeshTraits< MeshConfig >::template SuperentityTraits< MeshEntity, DimensionsTag::value >::storageEnabled > +class tnlMeshSuperentityAccessLayer; + + +template< typename MeshConfig, + typename MeshEntity > +class tnlMeshSuperentityAccess : + public tnlMeshSuperentityAccessLayer< MeshConfig, + MeshEntity, + tnlDimensionsTag< tnlMeshTraits< MeshConfig >::meshDimensions > > +{ + public: + typedef tnlMeshSuperentityAccessLayer< MeshConfig, + MeshEntity, + tnlDimensionsTag< tnlMeshTraits< MeshConfig >::meshDimensions > > BaseType; + + bool operator == ( const tnlMeshSuperentityAccess< MeshConfig, MeshEntity>& a ) const { return true; } // TODO: fix + + void print( ostream& str ) const + { + BaseType::print( str ); + }; + +}; + +template< typename MeshConfig, + typename MeshEntity, + typename Dimensions > +class tnlMeshSuperentityAccessLayer< MeshConfig, + MeshEntity, + Dimensions, + true > : + public tnlMeshSuperentityAccessLayer< MeshConfig, MeshEntity, typename Dimensions::Decrement > +{ + typedef tnlMeshSuperentityAccessLayer< MeshConfig, MeshEntity, typename Dimensions::Decrement > BaseType; + + public: + + typedef tnlMeshTraits< MeshConfig > MeshTraits; + typedef typename MeshTraits::template SuperentityTraits< MeshEntity, Dimensions::value > SuperentityTraits; + typedef typename MeshTraits::IdArrayAccessorType IdArrayAccessorType; + typedef typename SuperentityTraits::StorageNetworkType StorageNetworkType; + typedef typename SuperentityTraits::SuperentityAccessorType SuperentityAccessorType; + //typedef typename StorageNetworkType::PortsType SuperentityAccessorType; + + using BaseType::superentityIds; + IdArrayAccessorType superentityIds( Dimensions ) const { return m_superentityIndices; } + + using BaseType::superentityIdsArray; + IdArrayAccessorType &superentityIdsArray( Dimensions ) { return m_superentityIndices; } + + using BaseType::getSuperentityIndices; + const SuperentityAccessorType& getSuperentityIndices( Dimensions ) const + { + cerr << "###" << endl; + return this->superentityIndices; + } + + SuperentityAccessorType& getSuperentityIndices( Dimensions ) + { + cerr << "######" << endl; + return this->superentityIndices; + } + + void print( ostream& str ) const + { + str << "Superentities with " << Dimensions::value << " dimensions are: " << + this->superentityIndices << endl; + BaseType::print( str ); + } + + //bool operator == ( const tnlMeshSuperentityAccessLayer< MeshConfig, MeshEntity, Dimensions, tnlStorageTraits< true > >& l ) { return true; } // TODO: fix + + private: + IdArrayAccessorType m_superentityIndices; + + SuperentityAccessorType superentityIndices; + +}; + +template< typename MeshConfig, + typename MeshEntity, + typename Dimensions > +class tnlMeshSuperentityAccessLayer< MeshConfig, + MeshEntity, + Dimensions, + false > : + public tnlMeshSuperentityAccessLayer< MeshConfig, MeshEntity, typename Dimensions::Decrement > +{ +}; + +template< typename MeshConfig, + typename MeshEntity > +class tnlMeshSuperentityAccessLayer< MeshConfig, + MeshEntity, + tnlDimensionsTag< MeshEntity::dimensions >, + false > +{ + protected: + /*** + * Necessary because of 'using TBase::...;' in the derived classes + */ + void superentityIds() {} + void superentityIdsArray() {} + + void getSuperentityIndices() {}; + + void print( ostream& str ) const {}; +}; + +template< typename MeshConfig, + typename MeshEntity > +class tnlMeshSuperentityAccessLayer< MeshConfig, + MeshEntity, + tnlDimensionsTag< MeshEntity::dimensions >, + true > +{ + protected: + /*** + * Necessary because of 'using TBase::...;' in the derived classes + */ + void superentityIds() {} + void superentityIdsArray() {} + + void getSuperentityIndices() {}; + + void print( ostream& str ) const {}; +}; + + +#endif /* TNLSUPERENTITYACCESS_H */ + diff --git a/src/mesh/layers/tnlMeshSuperentityAccessor.h b/src/mesh/layers/tnlMeshSuperentityAccessor.h new file mode 100644 index 0000000000000000000000000000000000000000..35139059c6d22637d95bbf2d262df9a3255fe142 --- /dev/null +++ b/src/mesh/layers/tnlMeshSuperentityAccessor.h @@ -0,0 +1,76 @@ +/*************************************************************************** + tnlMeshSuperentityAccessor.h - description + ------------------- + begin : Sep 11, 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 TNLMESHSUPERENTITYACCESSOR_H +#define TNLMESHSUPERENTITYACCESSOR_H + +template< typename IndexMultimapValues > +class tnlMeshSuperentityAccessor +{ + public: + + typedef typename IndexMultimapValues::IndexType GlobalIndexType; + typedef typename IndexMultimapValues::IndexType LocalIndexType; + + // TODO: Add LocalIndexType to EllpackIndexMultimap + + LocalIndexType getSupernetitiesCount() const + { + return this->indexes.getPortsCount(); + }; + + void setSuperentityIndex( const LocalIndexType localIndex, + const GlobalIndexType globalIndex ) + { + indexes.setOutput( localIndex, globalIndex ); + } + + GlobalIndexType getSuperentityIndex( const LocalIndexType localIndex ) const + { + return indexes.getOutput( localIndex ); + } + + GlobalIndexType& operator[]( const LocalIndexType localIndex ) + { + return this->indexes[ localIndex ]; + } + + const GlobalIndexType& operator[]( const LocalIndexType localIndex ) const + { + return this->indexes[ localIndex ]; + } + + void print( ostream& str ) const + { + str << indexes; + } + + protected: + + IndexMultimapValues indexes; + +}; + +template< typename IndexMultimapValues > +ostream& operator << ( ostream& str, const tnlMeshSuperentityAccessor< IndexMultimapValues >& superentityAccessor ) +{ + superentityAccessor.print( str ); + return str; +} + +#endif /* TNLMESHSUPERENTITYACCESSOR_H */ + diff --git a/src/mesh/layers/tnlMeshSuperentityStorageLayer.h b/src/mesh/layers/tnlMeshSuperentityStorageLayer.h index 0a7923082352ef2720f14121071baadbc6cb5fa7..e31a839cc9f4835b598242114b3e6645ce176797 100644 --- a/src/mesh/layers/tnlMeshSuperentityStorageLayer.h +++ b/src/mesh/layers/tnlMeshSuperentityStorageLayer.h @@ -2,7 +2,7 @@ tnlMeshSuperentityStorageLayer.h - description ------------------- begin : Feb 13, 2014 - copyright : (C) 2014 by Tomas Oberhuber + copyright : (C) 2014 by Tomas Oberhuber et al. email : tomas.oberhuber@fjfi.cvut.cz ***************************************************************************/ @@ -19,55 +19,48 @@ #define TNLMESHSUPERENTITYSTORAGELAYER_H_ #include <core/tnlFile.h> -#include <mesh/traits/tnlDimensionsTraits.h> -#include <mesh/traits/tnlStorageTraits.h> +#include <mesh/tnlDimensionsTag.h> #include <mesh/traits/tnlMeshTraits.h> -#include <mesh/traits/tnlMeshSuperentitiesTraits.h> - -template< typename ConfigTag, - typename EntityTag, - typename DimensionsTraits, - typename SuperentityStorageTag = - typename tnlMeshSuperentitiesTraits< ConfigTag, - EntityTag, - DimensionsTraits >::SuperentityStorageTag > +#include <mesh/traits/tnlMeshSuperentityTraits.h> + +template< typename MeshConfig, + typename EntityTopology, + typename DimensionsTag, + bool SuperentityStorage = + tnlMeshSuperentityTraits< MeshConfig, EntityTopology, DimensionsTag::value >::storageEnabled > class tnlMeshSuperentityStorageLayer; -template< typename ConfigTag, - typename EntityTag > +template< typename MeshConfig, + typename EntityTopology > class tnlMeshSuperentityStorageLayers - : public tnlMeshSuperentityStorageLayer< ConfigTag, - EntityTag, - typename tnlMeshTraits< ConfigTag >::DimensionsTraits > + : public tnlMeshSuperentityStorageLayer< MeshConfig, + EntityTopology, + tnlDimensionsTag< tnlMeshTraits< MeshConfig >::meshDimensions > > { }; -template< typename ConfigTag, - typename EntityTag, - typename DimensionsTraits > -class tnlMeshSuperentityStorageLayer< ConfigTag, - EntityTag, - DimensionsTraits, - tnlStorageTraits< true > > - : public tnlMeshSuperentityStorageLayer< ConfigTag, - EntityTag, - typename DimensionsTraits::Previous > +template< typename MeshConfig, + typename EntityTopology, + typename DimensionsTag > +class tnlMeshSuperentityStorageLayer< MeshConfig, EntityTopology, DimensionsTag, true > + : public tnlMeshSuperentityStorageLayer< MeshConfig, EntityTopology, typename DimensionsTag::Decrement > { typedef - tnlMeshSuperentityStorageLayer< ConfigTag, - EntityTag, - typename DimensionsTraits::Previous > BaseType; + tnlMeshSuperentityStorageLayer< MeshConfig, EntityTopology, typename DimensionsTag::Decrement > BaseType; - typedef - tnlMeshSuperentitiesTraits< ConfigTag, EntityTag, DimensionsTraits > SuperentityTag; + static const int Dimensions = DimensionsTag::value; + typedef tnlMeshTraits< MeshConfig > MeshTraits; + typedef typename MeshTraits::template SuperentityTraits< EntityTopology, Dimensions > SuperentityTraits; protected: - typedef typename SuperentityTag::ContainerType ContainerType; - typedef typename SuperentityTag::SharedContainerType SharedContainerType; - typedef typename ContainerType::ElementType GlobalIndexType; - typedef int LocalIndexType; + typedef typename SuperentityTraits::StorageArrayType StorageArrayType; + typedef typename SuperentityTraits::AccessArrayType AccessArrayType; + typedef typename SuperentityTraits::GlobalIndexType GlobalIndexType; + typedef typename SuperentityTraits::LocalIndexType LocalIndexType; + typedef typename SuperentityTraits::StorageNetworkType StorageNetworkType; + /**** * Make visible setters and getters of the lower superentities */ @@ -83,7 +76,9 @@ class tnlMeshSuperentityStorageLayer< ConfigTag, /*~tnlMeshSuperentityStorageLayer() { - cerr << " Destroying " << this->superentitiesIndices.getSize() << " superentities with "<< DimensionsTraits::value << " dimensions." << endl; + cerr << " Destroying " << this->superentitiesIndices.getSize() << " superentities with "<< DimensionsTag::value << " dimensions." << endl; + cerr << " this->superentitiesIndices.getName() = " << this->superentitiesIndices.getName() << endl; + cerr << " this->sharedSuperentitiesIndices.getName() = " << this->sharedSuperentitiesIndices.getName() << endl; }*/ tnlMeshSuperentityStorageLayer& operator = ( const tnlMeshSuperentityStorageLayer& layer ) @@ -97,7 +92,7 @@ class tnlMeshSuperentityStorageLayer< ConfigTag, /**** * Define setter/getter for the current level of the superentities */ - bool setNumberOfSuperentities( DimensionsTraits, + bool setNumberOfSuperentities( DimensionsTag, const LocalIndexType size ) { if( ! this->superentitiesIndices.setSize( size ) ) @@ -107,30 +102,30 @@ class tnlMeshSuperentityStorageLayer< ConfigTag, return true; } - LocalIndexType getNumberOfSuperentities( DimensionsTraits ) const + LocalIndexType getNumberOfSuperentities( DimensionsTag ) const { return this->superentitiesIndices.getSize(); } - void setSuperentityIndex( DimensionsTraits, + void setSuperentityIndex( DimensionsTag, const LocalIndexType localIndex, const GlobalIndexType globalIndex ) { this->superentitiesIndices[ localIndex ] = globalIndex; } - GlobalIndexType getSuperentityIndex( DimensionsTraits, + GlobalIndexType getSuperentityIndex( DimensionsTag, const LocalIndexType localIndex ) const { return this->superentitiesIndices[ localIndex ]; } - SharedContainerType& getSuperentitiesIndices( DimensionsTraits ) + AccessArrayType& getSuperentitiesIndices( DimensionsTag ) { return this->sharedSuperentitiesIndices; } - const SharedContainerType& getSuperentitiesIndices( DimensionsTraits ) const + const AccessArrayType& getSuperentitiesIndices( DimensionsTag ) const { return this->sharedSuperentitiesIndices; } @@ -140,7 +135,7 @@ class tnlMeshSuperentityStorageLayer< ConfigTag, if( ! BaseType::save( file ) || ! this->superentitiesIndices.save( file ) ) { - //cerr << "Saving of the entity superentities layer with " << DimensionsTraits::value << " failed." << endl; + //cerr << "Saving of the entity superentities layer with " << DimensionsTag::value << " failed." << endl; return false; } return true; @@ -151,7 +146,7 @@ class tnlMeshSuperentityStorageLayer< ConfigTag, if( ! BaseType::load( file ) || ! this->superentitiesIndices.load( file ) ) { - //cerr << "Loading of the entity superentities layer with " << DimensionsTraits::value << " failed." << endl; + //cerr << "Loading of the entity superentities layer with " << DimensionsTag::value << " failed." << endl; return false; } return true; @@ -160,7 +155,7 @@ class tnlMeshSuperentityStorageLayer< ConfigTag, void print( ostream& str ) const { BaseType::print( str ); - str << endl << "\t Superentities with " << DimensionsTraits::value << " dimensions are: " << this->superentitiesIndices << "."; + str << endl << "\t Superentities with " << DimensionsTag::value << " dimensions are: " << this->superentitiesIndices << "."; } bool operator==( const tnlMeshSuperentityStorageLayer& layer ) const @@ -169,61 +164,71 @@ class tnlMeshSuperentityStorageLayer< ConfigTag, superentitiesIndices == layer.superentitiesIndices ); } - private: + private: - ContainerType superentitiesIndices; + StorageArrayType superentitiesIndices; - SharedContainerType sharedSuperentitiesIndices; + AccessArrayType sharedSuperentitiesIndices; + + StorageNetworkType storageNetwork; + + // TODO: this is only for the mesh initializer - fix it + public: + + using BaseType::superentityIdsArray; + typename tnlMeshTraits< MeshConfig >::GlobalIdArrayType& superentityIdsArray( DimensionsTag ) + { + return this->superentitiesIndices; + } + + using BaseType::getStorageNetwork; + StorageNetworkType& getStorageNetwork( DimensionsTag ) + { + return this->storageNetwork; + } }; -template< typename ConfigTag, - typename EntityTag, - typename DimensionsTraits > -class tnlMeshSuperentityStorageLayer< ConfigTag, - EntityTag, - DimensionsTraits, - tnlStorageTraits< false > > - : public tnlMeshSuperentityStorageLayer< ConfigTag, - EntityTag, - typename DimensionsTraits::Previous > +template< typename MeshConfig, + typename EntityTopology, + typename DimensionsTag > +class tnlMeshSuperentityStorageLayer< MeshConfig, EntityTopology, DimensionsTag, false > + : public tnlMeshSuperentityStorageLayer< MeshConfig, EntityTopology, typename DimensionsTag::Decrement > { public: }; -template< typename ConfigTag, - typename EntityTag > -class tnlMeshSuperentityStorageLayer< ConfigTag, - EntityTag, - tnlDimensionsTraits< EntityTag::dimensions >, - tnlStorageTraits< false > > +template< typename MeshConfig, + typename EntityTopology > +class tnlMeshSuperentityStorageLayer< MeshConfig, EntityTopology, tnlDimensionsTag< EntityTopology::dimensions >, false > { - typedef tnlDimensionsTraits< EntityTag::dimensions > DimensionsTraits; + static const int Dimensions = EntityTopology::dimensions; + typedef tnlDimensionsTag< EntityTopology::dimensions > DimensionsTag; - typedef tnlMeshSuperentitiesTraits< ConfigTag, - EntityTag, - DimensionsTraits > SuperentityTag; + typedef tnlMeshSuperentityTraits< MeshConfig, EntityTopology, Dimensions > SuperentityTraits; - typedef tnlMeshSuperentityStorageLayer< ConfigTag, - EntityTag, - DimensionsTraits, - tnlStorageTraits< false > > ThisType; + typedef tnlMeshSuperentityStorageLayer< MeshConfig, + EntityTopology, + DimensionsTag, + false > ThisType; protected: - typedef typename SuperentityTag::ContainerType ContainerType; + typedef typename SuperentityTraits::ContainerType ContainerType; typedef typename ContainerType::ElementType GlobalIndexType; typedef int LocalIndexType; + typedef typename SuperentityTraits::StorageNetworkType StorageNetworkType; + /**** * These methods are due to 'using BaseType::...;' in the derived classes. */ - bool setNumberOfSuperentities( DimensionsTraits, + bool setNumberOfSuperentities( DimensionsTag, const LocalIndexType size ); - LocalIndexType getNumberOfSuperentities( DimensionsTraits ) const; - GlobalIndexType getSuperentityIndex( DimensionsTraits, + LocalIndexType getNumberOfSuperentities( DimensionsTag ) const; + GlobalIndexType getSuperentityIndex( DimensionsTag, const LocalIndexType localIndex ){} - void setSuperentityIndex( DimensionsTraits, + void setSuperentityIndex( DimensionsTag, const LocalIndexType localIndex, const GlobalIndexType globalIndex ) {} @@ -247,41 +252,56 @@ class tnlMeshSuperentityStorageLayer< ConfigTag, { return true; } + + typename tnlMeshTraits< MeshConfig >::GlobalIdArrayType& superentityIdsArray( DimensionsTag ) + { + tnlAssert( false, ); + //return this->superentitiesIndices; + } + + StorageNetworkType& getStorageNetwork( DimensionsTag ) + { + tnlAssert( false, ); + //return this->storageNetwork; + } }; -template< typename ConfigTag, - typename EntityTag > -class tnlMeshSuperentityStorageLayer< ConfigTag, - EntityTag, - tnlDimensionsTraits< EntityTag::dimensions >, - tnlStorageTraits< true > > +template< typename MeshConfig, + typename EntityTopology > +class tnlMeshSuperentityStorageLayer< MeshConfig, + EntityTopology, + tnlDimensionsTag< EntityTopology::dimensions >, + true > { - typedef tnlDimensionsTraits< EntityTag::dimensions > DimensionsTraits; + static const int Dimensions = EntityTopology::dimensions; + typedef tnlDimensionsTag< Dimensions > DimensionsTag; - typedef tnlMeshSuperentitiesTraits< ConfigTag, - EntityTag, - DimensionsTraits > SuperentityTag; - typedef tnlMeshSuperentityStorageLayer< ConfigTag, - EntityTag, - DimensionsTraits, - tnlStorageTraits< true > > ThisType; + typedef tnlMeshSuperentityTraits< MeshConfig, + EntityTopology, + Dimensions > SuperentityTraits; + typedef tnlMeshSuperentityStorageLayer< MeshConfig, + EntityTopology, + DimensionsTag, + true > ThisType; protected: - typedef typename SuperentityTag::ContainerType ContainerType; - typedef typename ContainerType::ElementType GlobalIndexType; - typedef int LocalIndexType; + typedef typename SuperentityTraits::StorageArrayType StorageArrayType; + typedef typename SuperentityTraits::GlobalIndexType GlobalIndexType; + typedef typename SuperentityTraits::LocalIndexType LocalIndexType; + typedef typename SuperentityTraits::StorageNetworkType StorageNetworkType; + /**** * These methods are due to 'using BaseType::...;' in the derived classes. */ - bool setNumberOfSuperentities( DimensionsTraits, + bool setNumberOfSuperentities( DimensionsTag, const LocalIndexType size ); - LocalIndexType getNumberOfSuperentities( DimensionsTraits ) const; - GlobalIndexType getSuperentityIndex( DimensionsTraits, + LocalIndexType getNumberOfSuperentities( DimensionsTag ) const; + GlobalIndexType getSuperentityIndex( DimensionsTag, const LocalIndexType localIndex ){} - void setSuperentityIndex( DimensionsTraits, + void setSuperentityIndex( DimensionsTag, const LocalIndexType localIndex, const GlobalIndexType globalIndex ) {} @@ -292,9 +312,9 @@ class tnlMeshSuperentityStorageLayer< ConfigTag, return true; } - ContainerType& getSuperentitiesIndices(){} + StorageArrayType& getSuperentitiesIndices(){} - const ContainerType& getSuperentitiesIndices() const{} + const StorageArrayType& getSuperentitiesIndices() const{} bool save( tnlFile& file ) const { @@ -305,6 +325,20 @@ class tnlMeshSuperentityStorageLayer< ConfigTag, { return true; } + + typename tnlMeshTraits< MeshConfig >::GlobalIdArrayType& superentityIdsArray( DimensionsTag ) + { + tnlAssert( false, ); + //return this->superentitiesIndices; + } + + StorageNetworkType& getStorageNetwork( DimensionsTag ) + { + tnlAssert( false, ); + //return this->storageNetwork; + } + + }; #endif /* TNLMESHSUPERENTITYSTORAGELAYER_H_ */ diff --git a/src/mesh/tnlDimensionsTag.h b/src/mesh/tnlDimensionsTag.h new file mode 100644 index 0000000000000000000000000000000000000000..7014bc5d59dfaaceded4c8a5fffabc978e84a956 --- /dev/null +++ b/src/mesh/tnlDimensionsTag.h @@ -0,0 +1,59 @@ +/*************************************************************************** + tnlDimensionsTag.h - description + ------------------- + begin : Feb 11, 2014 + copyright : (C) 2014 by Tomas Oberhuber + 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 TNLDIMENSIONSTAG_H_ +#define TNLDIMENSIONSTAG_H_ + +#include <core/tnlAssert.h> + +/*** + * This tag or integer wrapper is necessary for C++ templates specializations. + * As th C++ standard says: + * + * A partially specialized non-type argument expression shall not involve + * a template parameter of the partial specialization except when the argument + * expression is a simple identifier. + * + * Therefore one cannot specialize the mesh layers just by integers saying the mesh + * layer dimensions but instead this tag must be used. This makes the code more difficult + * to read and we would like to avoid it if it is possible sometime. + * On the other hand, tnlDimensionTag is also used for method overloading when + * asking for different mesh entities. In this case it makes sense and it cannot be + * replaced. + */ + +template< int Dimensions > +class tnlDimensionsTag +{ + public: + + static const int value = Dimensions; + + typedef tnlDimensionsTag< Dimensions - 1 > Decrement; + + tnlStaticAssert( value >= 0, "The value of the dimensions cannot be negative." ); +}; + +template<> +class tnlDimensionsTag< 0 > +{ + public: + + static const int value = 0; +}; + +#endif /* TNLDIMENSIONSTAG_H_ */ diff --git a/src/mesh/tnlGrid.h b/src/mesh/tnlGrid.h index cece8b9a60039dc5741f21c8afc7431121a9cc05..dd3f5c1ac06ef10649358ae710c81ba563f7996b 100644 --- a/src/mesh/tnlGrid.h +++ b/src/mesh/tnlGrid.h @@ -32,8 +32,8 @@ class tnlGrid : public tnlObject { }; -#include <mesh/tnlGrid1D.h> -#include <mesh/tnlGrid2D.h> -#include <mesh/tnlGrid3D.h> +#include <mesh/grids/tnlGrid1D.h> +#include <mesh/grids/tnlGrid2D.h> +#include <mesh/grids/tnlGrid3D.h> #endif /* TNLGRID_H_ */ diff --git a/src/mesh/tnlMesh.h b/src/mesh/tnlMesh.h index 7eec5cd0baf4a8795c9a75a0b38a2f185c3fba67..71e55bbe5e88b051ca5a31aa014890063f0bf6d5 100644 --- a/src/mesh/tnlMesh.h +++ b/src/mesh/tnlMesh.h @@ -2,7 +2,7 @@ tnlMesh.h - description ------------------- begin : Feb 16, 2014 - copyright : (C) 2014 by Tomas Oberhuber + copyright : (C) 2014 by Tomas Oberhuber et al. email : tomas.oberhuber@fjfi.cvut.cz ***************************************************************************/ @@ -18,176 +18,97 @@ #ifndef TNLMESH_H_ #define TNLMESH_H_ +#include <ostream> #include <core/tnlObject.h> #include <mesh/tnlMeshEntity.h> +#include <mesh/traits/tnlMeshTraits.h> #include <mesh/layers/tnlMeshStorageLayer.h> +#include <mesh/config/tnlMeshConfigValidator.h> +#include <mesh/initializer/tnlMeshInitializer.h> -template< typename ConfigTag > -class tnlMesh : public tnlObject, - public tnlMeshStorageLayers< ConfigTag > +template< typename MeshConfig > //, + //typename Device = tnlHost > +class tnlMesh : public tnlObject/*, + public tnlMeshStorageLayers< MeshConfig >*/ { - typedef tnlMeshStorageLayers< ConfigTag > BaseType; - public: - typedef ConfigTag Config; - typedef typename tnlMeshTraits< ConfigTag >::PointType PointType; - enum { dimensions = tnlMeshTraits< ConfigTag >::meshDimensions }; - - /*~tnlMesh() - { - cerr << "Destroying mesh." << endl; - }*/ - - static tnlString getType() - { - return tnlString( "tnlMesh< ") + ConfigTag::getType() + " >"; - } - - virtual tnlString getTypeVirtual() const - { - return this->getType(); - } - - using tnlObject::save; - using tnlObject::load; - - bool save( tnlFile& file ) const - { - if( ! tnlObject::save( file ) || - ! BaseType::save( file ) ) + + typedef MeshConfig Config; + typedef tnlMeshTraits< MeshConfig > MeshTraits; + typedef typename MeshTraits::DeviceType DeviceType; + typedef typename MeshTraits::GlobalIndexType GlobalIndexType; + typedef typename MeshTraits::LocalIndexType LocalIndexType; + typedef typename MeshTraits::CellType CellType; + typedef typename MeshTraits::VertexType VertexType; + typedef typename MeshTraits::PointType PointType; + static const int dimensions = MeshTraits::meshDimensions; + template< int Dimensions > using EntityTraits = typename MeshTraits::template EntityTraits< Dimensions >; + template< int Dimensions > using EntityType = typename EntityTraits< Dimensions >::EntityType; + + static tnlString getType(); + + virtual tnlString getTypeVirtual() const; + + static constexpr int getDimensions(); + + template< int Dimensions > + bool entitiesAvalable() const; + + GlobalIndexType getNumberOfCells() const; + + template< int Dimensions > + GlobalIndexType getNumberOfEntities() const; + + CellType& getCell( const GlobalIndexType entityIndex ); + + const CellType& getCell( const GlobalIndexType entityIndex ) const; + + template< int Dimensions > + EntityType< Dimensions >& getEntity( const GlobalIndexType entityIndex ); + + template< int Dimensions > + const EntityType< Dimensions >& getEntity( const GlobalIndexType entityIndex ) const; + + bool save( tnlFile& file ) const; + + bool load( tnlFile& file ); + + using tnlObject::load; + using tnlObject::save; + + void print( ostream& str ) const; + + bool operator==( const tnlMesh& mesh ) const; + + // TODO: this is only for mesh intializer - remove it if possible + template< typename DimensionsTag > + typename EntityTraits< DimensionsTag::value >::StorageArrayType& entitiesArray(); + + + template< typename DimensionsTag, typename SuperDimensionsTag > + typename tnlMeshTraits< MeshConfig >::GlobalIdArrayType& superentityIdsArray(); + + template< typename EntityTopology, typename SuperdimensionsTag > + typename MeshTraits::template SuperentityTraits< EntityTopology, SuperdimensionsTag::value >::StorageNetworkType& + getSuperentityStorageNetwork() { - cerr << "Mesh saving failed." << endl; - return false; + return entitiesStorage.template getSuperentityStorageNetwork< SuperdimensionsTag >( tnlDimensionsTag< EntityTopology::dimensions >() ); } - return true; - } - - bool load( tnlFile& file ) - { - if( ! tnlObject::load( file ) || - ! BaseType::load( file ) ) - { - cerr << "Mesh loading failed." << endl; - return false; - } - return true; - } - - template< int Dimensions > - struct EntitiesTraits - { - typedef tnlDimensionsTraits< Dimensions > DimensionsTraits; - typedef tnlMeshEntitiesTraits< ConfigTag, DimensionsTraits > MeshEntitiesTraits; - typedef typename MeshEntitiesTraits::Type Type; - typedef typename MeshEntitiesTraits::ContainerType ContainerType; - typedef typename MeshEntitiesTraits::SharedContainerType SharedContainerType; - typedef typename ContainerType::IndexType GlobalIndexType; - typedef typename ContainerType::ElementType EntityType; - enum { available = tnlMeshEntityStorage< ConfigTag, Dimensions >::enabled }; - }; - - using BaseType::setNumberOfVertices; - using BaseType::getNumberOfVertices; - using BaseType::setVertex; - using BaseType::getVertex; - - template< int Dimensions > - bool entitiesAvalable() const - { - return EntitiesTraits< Dimensions >::available; - } - - template< int Dimensions > - bool setNumberOfEntities( typename EntitiesTraits< Dimensions >::GlobalIndexType size ) - { - return BaseType::setNumberOfEntities( tnlDimensionsTraits< Dimensions >(), size ); - } - - template< int Dimensions > - typename EntitiesTraits< Dimensions >::GlobalIndexType getNumberOfEntities() const - { - return BaseType::getNumberOfEntities( tnlDimensionsTraits< Dimensions >() ); - } - - bool setNumberOfCells( typename EntitiesTraits< dimensions >::GlobalIndexType size ) - { - return BaseType::setNumberOfEntities( tnlDimensionsTraits< dimensions >(), size ); - } - - typename EntitiesTraits< dimensions >::GlobalIndexType getNumberOfCells() const - { - return BaseType::getNumberOfEntities( tnlDimensionsTraits< dimensions >() ); - } - - template< int Dimensions > - typename EntitiesTraits< Dimensions >::EntityType& - getEntity( const typename EntitiesTraits< Dimensions >::GlobalIndexType entityIndex ) - { - return BaseType::getEntity( tnlDimensionsTraits< Dimensions >(), entityIndex ); - } - - template< int Dimensions > - const typename EntitiesTraits< Dimensions >::EntityType& - getEntity( const typename EntitiesTraits< Dimensions >::GlobalIndexType entityIndex ) const - { - return BaseType::getEntity( tnlDimensionsTraits< Dimensions >(), entityIndex ); - } - - template< int Dimensions > - void setEntity( const typename EntitiesTraits< Dimensions >::GlobalIndexType entityIndex, - const typename EntitiesTraits< Dimensions >::EntityType& entity ) - { - BaseType::setEntity( tnlDimensionsTraits< Dimensions >(), entityIndex, entity ); - } - - template< int Dimensions > - typename EntitiesTraits< Dimensions >::SharedContainerType& getEntities() - { - return BaseType::getEntities( tnlDimensionsTraits< Dimensions >() ); - } - - template< int Dimensions > - const typename EntitiesTraits< Dimensions >::SharedContainerType& getEntities() const - { - return BaseType::getEntities( tnlDimensionsTraits< Dimensions >() ); - } - - typename EntitiesTraits< dimensions >::EntityType& - getCell( const typename EntitiesTraits< dimensions >::GlobalIndexType entityIndex ) - { - return BaseType::getEntity( tnlDimensionsTraits< dimensions >(), entityIndex ); - } - - const typename EntitiesTraits< dimensions >::EntityType& - getCell( const typename EntitiesTraits< dimensions >::GlobalIndexType entityIndex ) const - { - return BaseType::getEntity( tnlDimensionsTraits< dimensions >(), entityIndex ); - } - - void setCell( const typename EntitiesTraits< dimensions >::GlobalIndexType entityIndex, - const typename EntitiesTraits< dimensions >::EntityType& entity ) - { - BaseType::setEntity( tnlDimensionsTraits< dimensions >(), entityIndex, entity ); - } - - void print( ostream& str ) const - { - BaseType::print( str ); - } - - bool operator==( const tnlMesh& mesh ) const - { - return BaseType::operator==( mesh ); - } - - private: - - void init(); - - tnlStaticAssert( dimensions > 0, "The mesh dimesnions must be greater than 0." ); - tnlStaticAssert( EntitiesTraits< 0 >::available, "Vertices must always be stored" ); - tnlStaticAssert( EntitiesTraits< dimensions >::available, "Cells must always be stored" ); + + bool init( const typename MeshTraits::PointArrayType& points, + const typename MeshTraits::CellSeedArrayType& cellSeeds ); + + + protected: + + tnlMeshStorageLayers< MeshConfig > entitiesStorage; + + tnlMeshConfigValidator< MeshConfig > configValidator; }; +template< typename MeshConfig > +std::ostream& operator <<( std::ostream& str, const tnlMesh< MeshConfig >& mesh ); + +#include <mesh/tnlMesh_impl.h> #endif /* TNLMESH_H_ */ diff --git a/src/mesh/tnlMeshBuilder.h b/src/mesh/tnlMeshBuilder.h new file mode 100644 index 0000000000000000000000000000000000000000..884e980781ba56c6d7bf76ca2bc2321985903c9d --- /dev/null +++ b/src/mesh/tnlMeshBuilder.h @@ -0,0 +1,122 @@ +/*************************************************************************** + 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::CellTopology CellTopology; + typedef typename MeshTraits::CellSeedType CellSeedType; + + bool setPointsCount( const GlobalIndexType& points ) + { + tnlAssert( 0 <= points, 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->cellSeeds.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; + + bool 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; + } + } + return true; + } + + + 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, tnlHost, GlobalIndexType > pointsSet; +}; + +#endif /* TNLMESHBUILDER_H */ + diff --git a/src/mesh/tnlMeshEntity.h b/src/mesh/tnlMeshEntity.h index 5abc50fb815beb72cec5338473f2f378152eef22..368af21d737a1a6ab480cd60c35d87a7d7795214 100644 --- a/src/mesh/tnlMeshEntity.h +++ b/src/mesh/tnlMeshEntity.h @@ -2,7 +2,7 @@ tnlMeshEntity.h - description ------------------- begin : Feb 11, 2014 - copyright : (C) 2014 by Tomas Oberhuber + copyright : (C) 2014 by Tomas Oberhuber et al. email : tomas.oberhuber@fjfi.cvut.cz ***************************************************************************/ @@ -22,454 +22,216 @@ #include <core/tnlDynamicTypeTag.h> #include <mesh/tnlMeshEntityId.h> #include <mesh/traits/tnlMeshTraits.h> -#include <mesh/traits/tnlDimensionsTraits.h> -#include <mesh/topologies/tnlMeshVertexTag.h> +#include <mesh/tnlDimensionsTag.h> +#include <mesh/topologies/tnlMeshVertexTopology.h> #include <mesh/layers/tnlMeshSubentityStorageLayer.h> #include <mesh/layers/tnlMeshSuperentityStorageLayer.h> +#include <mesh/layers/tnlMeshSuperentityAccess.h> +#include <mesh/initializer/tnlMeshEntitySeed.h> -template< typename ConfigTag, - typename EntityTag > +template< typename MeshConfig > +class tnlMeshInitializer; + +template< typename MeshConfig, + typename EntityTopology_ > class tnlMeshEntity - : public tnlMeshSubentityStorageLayers< ConfigTag, EntityTag >, - public tnlMeshSuperentityStorageLayers< ConfigTag, EntityTag >, - public tnlMeshEntityId< typename ConfigTag::IdType, - typename ConfigTag::GlobalIndexType > + : public tnlMeshSubentityStorageLayers< MeshConfig, EntityTopology_ >, + public tnlMeshSuperentityAccess< MeshConfig, EntityTopology_ >, + public tnlMeshEntityId< typename MeshConfig::IdType, + typename MeshConfig::GlobalIndexType > { public: + + typedef tnlMeshTraits< MeshConfig > MeshTraits; + typedef EntityTopology_ EntityTopology; + typedef typename MeshTraits::GlobalIndexType GlobalIndexType; + typedef typename MeshTraits::LocalIndexType LocalIndexType; + typedef typename MeshTraits::IdPermutationArrayAccessorType IdPermutationArrayAccessorType; + typedef tnlMeshEntitySeed< MeshConfig, EntityTopology > SeedType; + + template< int Subdimensions > using SubentityTraits = + typename MeshTraits::template SubentityTraits< EntityTopology, Subdimensions >; + + template< int SuperDimensions > using SuperentityTraits = + typename MeshTraits::template SuperentityTraits< EntityTopology, SuperDimensions >; + + tnlMeshEntity( const SeedType& entitySeed ); + + tnlMeshEntity(); + + ~tnlMeshEntity(); + + static tnlString getType(); + + tnlString getTypeVirtual() const; + + bool save( tnlFile& file ) const; + + bool load( tnlFile& file ); + + void print( ostream& str ) const; + + bool operator==( const tnlMeshEntity& entity ) const; + + constexpr int getEntityDimensions() const; + + /**** + * Subentities + */ + template< int Subdimensions > + constexpr bool subentitiesAvailable() const; + + template< int Subdimensions > + constexpr LocalIndexType getNumberOfSubentities() const; + + template< int Subdimensions > + GlobalIndexType getSubentityIndex( const LocalIndexType localIndex) const; + + template< int Subdimensions > + typename SubentityTraits< Subdimensions >::AccessArrayType& getSubentitiesIndices(); + + template< int Subdimensions > + const typename SubentityTraits< Subdimensions >::AccessArrayType& getSubentitiesIndices() const; + + /**** + * Superentities + */ + template< int SuperDimensions > + LocalIndexType getNumberOfSuperentities() const; + + template< int SuperDimensions > + GlobalIndexType getSuperentityIndex( const LocalIndexType localIndex ) const; + + template< int SuperDimensions > + typename SuperentityTraits< SuperDimensions >::AccessArrayType& getSuperentitiesIndices(); + + template< int SuperDimensions > + const typename SuperentityTraits< SuperDimensions >::AccessArrayType& getSuperentitiesIndices() const; + + /**** + * Vertices + */ + constexpr LocalIndexType getNumberOfVertices() const; + + GlobalIndexType getVertexIndex( const LocalIndexType localIndex ) const; + + typename SubentityTraits< 0 >::AccessArrayType& getVerticesIndices(); + + const typename SubentityTraits< 0 >::AccessArrayType& getVerticesIndices() const; + + template< int Dimensions > + IdPermutationArrayAccessorType subentityOrientation( LocalIndexType index ) const; + + protected: + + /**** + * Methods for the mesh initialization + */ + typedef tnlMeshSuperentityAccess< MeshConfig, EntityTopology > SuperentityAccessBase; + typedef typename MeshTraits::IdArrayAccessorType IdArrayAccessorType; + typedef tnlMeshSubentityStorageLayers< MeshConfig, EntityTopology > SubentityStorageLayers; + + template< int Subdimensions > + void setSubentityIndex( const LocalIndexType localIndex, + const GlobalIndexType globalIndex ); + + template< int Subdimensions > + typename SubentityTraits< Subdimensions >::IdArrayType& subentityIdsArray(); + + template< int Superdimensions > + IdArrayAccessorType& superentityIdsArray(); + + template< int Subdimensions > + typename SubentityTraits< Subdimensions >::OrientationArrayType& subentityOrientationsArray(); + + friend tnlMeshInitializer< MeshConfig >; - // TODO: This is only because of STD lib bug in tnlIndexedSet - tnlMeshEntity( const tnlMeshEntity& entyti ) {} - tnlMeshEntity() {} - - static tnlString getType() - { - return tnlString( "tnlMesh< " ) + - //ConfigTag::getType() + ", " + - //EntityTag::getType() + ", " + - " >"; - } - - tnlString getTypeVirtual() const - { - return this->getType(); - } - - /*~tnlMeshEntity() - { - cerr << " Destroying entity with " << EntityTag::dimensions << " dimensions..." << endl; - }*/ - - bool save( tnlFile& file ) const - { - if( ! tnlMeshSubentityStorageLayers< ConfigTag, EntityTag >::save( file ) || - ! tnlMeshSuperentityStorageLayers< ConfigTag, EntityTag >::save( file ) ) - return false; - return true; - } - - bool load( tnlFile& file ) - { - if( ! tnlMeshSubentityStorageLayers< ConfigTag, EntityTag >::load( file ) || - ! tnlMeshSuperentityStorageLayers< ConfigTag, EntityTag >::load( file ) ) - return false; - return true; - } - - void print( ostream& str ) const - { - str << "\t Mesh entity dimensions: " << EntityTag::dimensions << endl; - tnlMeshSubentityStorageLayers< ConfigTag, EntityTag >::print( str ); - tnlMeshSuperentityStorageLayers< ConfigTag, EntityTag >::print( str ); - } - - bool operator==( const tnlMeshEntity& entity ) const - { - return ( tnlMeshSubentityStorageLayers< ConfigTag, EntityTag >::operator==( entity ) && - tnlMeshSuperentityStorageLayers< ConfigTag, EntityTag >::operator==( entity ) && - tnlMeshEntityId< typename ConfigTag::IdType, - typename ConfigTag::GlobalIndexType >::operator==( entity ) ); - } - - - /**** - * Entity typedefs - */ - typedef ConfigTag MeshConfigTag; - typedef EntityTag Tag; - enum { dimensions = Tag::dimensions }; - enum { meshDimensions = tnlMeshTraits< ConfigTag >::meshDimensions }; - - /**** - * Subentities - */ - template< int Dimensions > - struct SubentitiesTraits - { - typedef tnlDimensionsTraits< Dimensions > DimensionsTraits; - typedef tnlMeshSubentitiesTraits< ConfigTag, - EntityTag, - DimensionsTraits > SubentityTraits; - typedef typename SubentityTraits::ContainerType ContainerType; - typedef typename SubentityTraits::SharedContainerType SharedContainerType; - typedef typename ContainerType::ElementType GlobalIndexType; - typedef int LocalIndexType; - - // TODO: make this as: - // typedef typename Type::IndexType LocalIndexType - enum { available = tnlMeshSubentityStorage< ConfigTag, - EntityTag, - Dimensions >::enabled }; - enum { subentitiesCount = SubentityTraits::count }; - }; - - template< int Dimensions > - bool subentitiesAvailable() const - { - return SubentitiesTraits< Dimensions >::available; - }; - - template< int Dimensions > - typename SubentitiesTraits< Dimensions >::LocalIndexType getNumberOfSubentities() const - { - return SubentitiesTraits< Dimensions >::subentitiesCount; - }; - - template< int Dimensions > - void setSubentityIndex( const typename SubentitiesTraits< Dimensions >::LocalIndexType localIndex, - const typename SubentitiesTraits< Dimensions >::GlobalIndexType globalIndex ) - { - tnlAssert( 0 <= localIndex && - localIndex < SubentitiesTraits< Dimensions >::subentitiesCount, - cerr << "localIndex = " << localIndex - << " subentitiesCount = " - << SubentitiesTraits< Dimensions >::subentitiesCount ); - typedef tnlMeshSubentityStorageLayers< ConfigTag, EntityTag > SubentityBaseType; - SubentityBaseType::setSubentityIndex( tnlDimensionsTraits< Dimensions >(), - localIndex, - globalIndex ); - } - - template< int Dimensions > - typename SubentitiesTraits< Dimensions >::GlobalIndexType - getSubentityIndex( const typename SubentitiesTraits< Dimensions >::LocalIndexType localIndex) const - { - tnlAssert( 0 <= localIndex && - localIndex < SubentitiesTraits< Dimensions >::subentitiesCount, - cerr << "localIndex = " << localIndex - << " subentitiesCount = " - << SubentitiesTraits< Dimensions >::subentitiesCount ); - typedef tnlMeshSubentityStorageLayers< ConfigTag, EntityTag > SubentityBaseType; - return SubentityBaseType::getSubentityIndex( tnlDimensionsTraits< Dimensions >(), - localIndex ); - } - - template< int Dimensions > - typename SubentitiesTraits< Dimensions >::SharedContainerType& - getSubentitiesIndices() - { - typedef tnlMeshSubentityStorageLayers< ConfigTag, EntityTag > SubentityBaseType; - return SubentityBaseType::getSubentitiesIndices( tnlDimensionsTraits< Dimensions >() ); - } - - template< int Dimensions > - const typename SubentitiesTraits< Dimensions >::SharedContainerType& - getSubentitiesIndices() const - { - typedef tnlMeshSubentityStorageLayers< ConfigTag, EntityTag > SubentityBaseType; - return SubentityBaseType::getSubentitiesIndices( tnlDimensionsTraits< Dimensions >() ); - } - - /**** - * Superentities - */ - template< int Dimensions > - struct SuperentitiesTraits - { - typedef tnlDimensionsTraits< Dimensions > DimensionsTraits; - typedef tnlMeshSuperentitiesTraits< ConfigTag, - EntityTag, - DimensionsTraits > SuperentityTraits; - typedef typename SuperentityTraits::ContainerType ContainerType; - typedef typename SuperentityTraits::SharedContainerType SharedContainerType; - typedef typename ContainerType::ElementType GlobalIndexType; - typedef int LocalIndexType; - // TODO: make this as: - // typedef typename Type::IndexType LocalIndexType - enum { available = tnlMeshSuperentityStorage< ConfigTag, - EntityTag, - Dimensions >::enabled }; - }; - - template< int Dimensions > - bool setNumberOfSuperentities( const typename SuperentitiesTraits< Dimensions >::LocalIndexType size ) - { - tnlAssert( size >= 0, - cerr << "size = " << size << endl; ); - typedef tnlMeshSuperentityStorageLayers< ConfigTag, EntityTag > SuperentityBaseType; - return SuperentityBaseType::setNumberOfSuperentities( tnlDimensionsTraits< Dimensions >(), - size ); - } - - template< int Dimensions > - typename SuperentitiesTraits< Dimensions >::LocalIndexType getNumberOfSuperentities() const - { - typedef tnlMeshSuperentityStorageLayers< ConfigTag, EntityTag > SuperentityBaseType; - return SuperentityBaseType::getNumberOfSuperentities( tnlDimensionsTraits< Dimensions >() ); - } - - template< int Dimensions > - void setSuperentityIndex( const typename SuperentitiesTraits< Dimensions >::LocalIndexType localIndex, - const typename SuperentitiesTraits< Dimensions >::GlobalIndexType globalIndex ) - { - tnlAssert( localIndex < this->getNumberOfSuperentities< Dimensions >(), - cerr << " localIndex = " << localIndex - << " this->getNumberOfSuperentities< Dimensions >() = " << this->getNumberOfSuperentities< Dimensions >() << endl; ); - typedef tnlMeshSuperentityStorageLayers< ConfigTag, EntityTag > SuperentityBaseType; - SuperentityBaseType::setSuperentityIndex( tnlDimensionsTraits< Dimensions >(), - localIndex, - globalIndex ); - } - - template< int Dimensions > - typename SuperentitiesTraits< Dimensions >::GlobalIndexType - getSuperentityIndex( const typename SuperentitiesTraits< Dimensions >::LocalIndexType localIndex ) const - { - tnlAssert( localIndex < this->getNumberOfSuperentities< Dimensions >(), - cerr << " localIndex = " << localIndex - << " this->getNumberOfSuperentities< Dimensions >() = " << this->getNumberOfSuperentities< Dimensions >() << endl; ); - typedef tnlMeshSuperentityStorageLayers< ConfigTag, EntityTag > SuperentityBaseType; - return SuperentityBaseType::getSuperentityIndex( tnlDimensionsTraits< Dimensions >(), - localIndex ); - } - - template< int Dimensions > - typename SuperentitiesTraits< Dimensions >::SharedContainerType& getSuperentitiesIndices() - { - typedef tnlMeshSuperentityStorageLayers< ConfigTag, EntityTag > SuperentityBaseType; - return SuperentityBaseType::getSuperentitiesIndices( tnlDimensionsTraits< Dimensions >() ); - } - - template< int Dimensions > - const typename SuperentitiesTraits< Dimensions >::SharedContainerType& getSuperentitiesIndices() const - { - typedef tnlMeshSuperentityStorageLayers< ConfigTag, EntityTag > SuperentityBaseType; - return SuperentityBaseType::getSubentitiesIndices( tnlDimensionsTraits< Dimensions >() ); - } - - /**** - * Vertices - */ - enum { verticesCount = SubentitiesTraits< 0 >::subentitiesCount }; - typedef typename SubentitiesTraits< 0 >::ContainerType ContainerType; - typedef typename SubentitiesTraits< 0 >::SharedContainerType SharedContainerType; - typedef typename SubentitiesTraits< 0 >::GlobalIndexType GlobalIndexType; - typedef typename SubentitiesTraits< 0 >::LocalIndexType LocalIndexType; - - LocalIndexType getNumberOfVertices() const - { - return verticesCount; - } - - void setVertexIndex( const LocalIndexType localIndex, - const GlobalIndexType globalIndex ) - { - this->setSubentityIndex< 0 >( localIndex, globalIndex ); - } - - GlobalIndexType getVertexIndex( const LocalIndexType localIndex ) const - { - return this->getSubentityIndex< 0 >( localIndex ); - } - - SharedContainerType& getVerticesIndices() - { - return this->getSubentitiesIndices< 0 >(); - } - - const SharedContainerType& getVerticesIndices() const - { - return this->getSubentitiesIndices< 0 >(); - } }; -template< typename ConfigTag > -class tnlMeshEntity< ConfigTag, tnlMeshVertexTag > - : public tnlMeshSuperentityStorageLayers< ConfigTag, tnlMeshVertexTag >, - public tnlMeshEntityId< typename ConfigTag::IdType, - typename ConfigTag::GlobalIndexType > +/**** + * Vertex entity specialization + */ +template< typename MeshConfig > +class tnlMeshEntity< MeshConfig, tnlMeshVertexTopology > + : public tnlMeshSuperentityAccess< MeshConfig, tnlMeshVertexTopology >, + public tnlMeshEntityId< typename MeshConfig::IdType, + typename MeshConfig::GlobalIndexType > { public: - // TODO: This is only because of STD lib bug in tnlIndexedSet - tnlMeshEntity( const tnlMeshEntity& entyti ) {} - tnlMeshEntity() {} + typedef tnlMeshTraits< MeshConfig > MeshTraits; + typedef tnlMeshVertexTopology EntityTopology; + typedef typename MeshTraits::GlobalIndexType GlobalIndexType; + typedef typename MeshTraits::LocalIndexType LocalIndexType; + typedef typename MeshTraits::PointType PointType; + typedef typename MeshTraits::IdPermutationArrayAccessorType IdPermutationArrayAccessorType; + typedef tnlMeshEntitySeed< MeshConfig, EntityTopology > SeedType; + + template< int SuperDimensions > using SuperentityTraits = + typename MeshTraits::template SuperentityTraits< EntityTopology, SuperDimensions >; + + static tnlString getType(); + + tnlString getTypeVirtual() const; + ~tnlMeshEntity(); + + bool save( tnlFile& file ) const; + + bool load( tnlFile& file ); + + void print( ostream& str ) const; + + bool operator==( const tnlMeshEntity& entity ) const; - static tnlString getType() - { - return tnlString( "tnlMesh< " ) + - //ConfigTag::getType() + ", " + - //EntityTag::getType() + ", " + - " >"; - } - - tnlString getTypeVirtual() const - { - return this->getType(); - } - - /**** - * The entity typedefs - */ - typedef ConfigTag MeshConfigTag; - typedef tnlMeshVertexTag Tag; - typedef typename tnlMeshTraits< ConfigTag >::PointType PointType; - enum { dimensions = Tag::dimensions }; - enum { meshDimensions = tnlMeshTraits< ConfigTag >::meshDimensions }; - - /*~tnlMeshEntity() - { - cerr << " Destroying entity with " << tnlMeshVertexTag::dimensions << " dimensions..." << endl; - }*/ - - bool save( tnlFile& file ) const - { - if( ! tnlMeshSuperentityStorageLayers< ConfigTag, tnlMeshVertexTag >::save( file ) || - ! point.save( file ) ) - return false; - return true; - } - - bool load( tnlFile& file ) - { - if( ! tnlMeshSuperentityStorageLayers< ConfigTag, tnlMeshVertexTag >::load( file ) || - ! point.load( file ) ) - return false; - return true; - } - - void print( ostream& str ) const - { - str << "\t Mesh entity dimensions: " << tnlMeshVertexTag::dimensions << endl; - str << "\t Coordinates = ( " << point << " )"; - tnlMeshSuperentityStorageLayers< ConfigTag, tnlMeshVertexTag >::print( str ); - } - - bool operator==( const tnlMeshEntity& entity ) const - { - return ( tnlMeshSuperentityStorageLayers< ConfigTag, tnlMeshVertexTag >::operator==( entity ) && - tnlMeshEntityId< typename ConfigTag::IdType, - typename ConfigTag::GlobalIndexType >::operator==( entity ) && - point == entity.point ); - - } - - /**** - * Superentities - */ - template< int Dimensions > - struct SuperentitiesTraits - { - typedef tnlDimensionsTraits< Dimensions > DimensionsTraits; - typedef tnlMeshSuperentitiesTraits< ConfigTag, - tnlMeshVertexTag, - DimensionsTraits > SuperentityTraits; - typedef typename SuperentityTraits::ContainerType ContainerType; - typedef typename SuperentityTraits::SharedContainerType SharedContainerType; - typedef typename ContainerType::ElementType GlobalIndexType; - typedef int LocalIndexType; - // TODO: make this as: - // typedef typename Type::IndexType LocalIndexType - enum { available = tnlMeshSuperentityStorage< ConfigTag, - tnlMeshVertexTag, - Dimensions >::enabled }; - }; - template< int Dimensions > - bool setNumberOfSuperentities( const typename SuperentitiesTraits< Dimensions >::LocalIndexType size ) - { - tnlAssert( size >= 0, - cerr << "size = " << size << endl; ); - typedef tnlMeshSuperentityStorageLayers< ConfigTag, tnlMeshVertexTag > SuperentityBaseType; - return SuperentityBaseType::setNumberOfSuperentities( tnlDimensionsTraits< Dimensions >(), - size ); - } - - template< int Dimensions > - typename SuperentitiesTraits< Dimensions >::LocalIndexType getNumberOfSuperentities() const - { - typedef tnlMeshSuperentityStorageLayers< ConfigTag, tnlMeshVertexTag > SuperentityBaseType; - return SuperentityBaseType::getNumberOfSuperentities( tnlDimensionsTraits< Dimensions >() ); - } - - template< int Dimensions > - typename SuperentitiesTraits< Dimensions >::SharedContainerType& getSuperentitiesIndices() - { - typedef tnlMeshSuperentityStorageLayers< ConfigTag, tnlMeshVertexTag > SuperentityBaseType; - return SuperentityBaseType::getSuperentitiesIndices( tnlDimensionsTraits< Dimensions >() ); - } - - template< int Dimensions > - const typename SuperentitiesTraits< Dimensions >::SharedContainerType& getSuperentitiesIndeces() const - { - typedef tnlMeshSuperentityStorageLayers< ConfigTag, tnlMeshVertexTag > SuperentityBaseType; - return SuperentityBaseType::getSubentitiesIndices( tnlDimensionsTraits< Dimensions >() ); - } - - template< int Dimensions > - void setSuperentityIndex( const typename SuperentitiesTraits< Dimensions >::LocalIndexType localIndex, - const typename SuperentitiesTraits< Dimensions >::GlobalIndexType globalIndex ) - { - tnlAssert( localIndex < this->getNumberOfSuperentities< Dimensions >(), - cerr << " localIndex = " << localIndex - << " this->getNumberOfSuperentities< Dimensions >() = " << this->getNumberOfSuperentities< Dimensions >() << endl; ); - typedef tnlMeshSuperentityStorageLayers< ConfigTag, tnlMeshVertexTag > SuperentityBaseType; - SuperentityBaseType::setSuperentityIndex( tnlDimensionsTraits< Dimensions >(), - localIndex, - globalIndex ); - } - - template< int Dimensions > - typename SuperentitiesTraits< Dimensions >::GlobalIndexType - getSuperentityIndex( const typename SuperentitiesTraits< Dimensions >::LocalIndexType localIndex ) const - { - tnlAssert( localIndex < this->getNumberOfSuperentities< Dimensions >(), - cerr << " localIndex = " << localIndex - << " this->getNumberOfSuperentities< Dimensions >() = " << this->getNumberOfSuperentities< Dimensions >() << endl; ); - typedef tnlMeshSuperentityStorageLayers< ConfigTag, tnlMeshVertexTag > SuperentityBaseType; - return SuperentityBaseType::getSuperentityIndex( tnlDimensionsTraits< Dimensions >(), - localIndex ); - } - - /**** - * Points - */ - PointType getPoint() const { return this->point; } - - void setPoint( const PointType& point ) { this->point = point; } + constexpr int getEntityDimensions() const; + + template< int Superdimensions > LocalIndexType getNumberOfSuperentities() const; + + template< int Superdimensions > + typename SuperentityTraits< Superdimensions >::AccessArrayType& getSuperentitiesIndices(); + + template< int Superdimensions > + const typename SuperentityTraits< Superdimensions >::AccessArrayType& getSuperentitiesIndeces() const; + + template< int Dimensions > + GlobalIndexType getSuperentityIndex( const LocalIndexType localIndex ) const; + + /**** + * Points + */ + PointType getPoint() const; + + void setPoint( const PointType& point ); protected: + + typedef typename MeshTraits::IdArrayAccessorType IdArrayAccessorType; + typedef tnlMeshSuperentityAccess< MeshConfig, tnlMeshVertexTopology > SuperentityAccessBase; + + template< int Superdimensions > + IdArrayAccessorType& superentityIdsArray(); - PointType point; + PointType point; + + friend tnlMeshInitializer< MeshConfig >; }; -template< typename ConfigTag, - typename EntityTag > -ostream& operator <<( ostream& str, const tnlMeshEntity< ConfigTag, EntityTag >& entity ) -{ - entity.print( str ); - return str; -} +template< typename MeshConfig, + typename EntityTopology > +ostream& operator <<( ostream& str, const tnlMeshEntity< MeshConfig, EntityTopology >& entity ); /**** * This tells the compiler that theMeshEntity is a type with a dynamic memory allocation. * It is necessary for the loading and the saving of the mesh entities arrays. */ -template< typename ConfigTag, - typename EntityTag > -struct tnlDynamicTypeTag< tnlMeshEntity< ConfigTag, EntityTag > > +template< typename MeshConfig, + typename EntityTopology > +struct tnlDynamicTypeTag< tnlMeshEntity< MeshConfig, EntityTopology > > { enum { value = true }; }; +#include <mesh/tnlMeshEntity_impl.h> #endif /* TNLMESHENTITY_H_ */ diff --git a/src/mesh/tnlMeshEntityInitializer.h b/src/mesh/tnlMeshEntityInitializer.h deleted file mode 100644 index 9647efd67c662d8661b2e14c325ed421e5e44c17..0000000000000000000000000000000000000000 --- a/src/mesh/tnlMeshEntityInitializer.h +++ /dev/null @@ -1,539 +0,0 @@ -/*************************************************************************** - tnlMeshEntityInitializer.h - description - ------------------- - begin : Feb 23, 2014 - copyright : (C) 2014 by Tomas Oberhuber - 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 TNLMESHENTITYINITIALIZER_H_ -#define TNLMESHENTITYINITIALIZER_H_ - -#include <core/tnlStaticFor.h> -#include <mesh/tnlMeshSuperentityInitializerLayer.h> - -template< typename ConfigTag > -class tnlMeshInitializer; - -template<typename ConfigTag, - typename EntityTag, - typename DimensionsTraits, - typename SubentityStorageTag = typename tnlMeshSubentitiesTraits< ConfigTag, - EntityTag, - DimensionsTraits >::SubentityStorageTag, - typename SuperentityStorageTag = typename tnlMeshSuperentitiesTraits< ConfigTag, - typename tnlMeshSubentitiesTraits< ConfigTag, - EntityTag, - DimensionsTraits >::SubentityTag, - tnlDimensionsTraits< EntityTag::dimensions > >::SuperentityStorageTag > -class tnlMeshEntityInitializerLayer; - -template< typename ConfigTag, - typename EntityTag > -class tnlMeshEntityInitializer - : public tnlMeshEntityInitializerLayer< ConfigTag, - EntityTag, - tnlDimensionsTraits< EntityTag::dimensions - 1 > >, - public tnlMeshSuperentityInitializerLayer< ConfigTag, - EntityTag, - typename tnlMeshTraits< ConfigTag >::DimensionsTraits > -{ - typedef tnlDimensionsTraits< EntityTag::dimensions > DimensionsTraits; - private: - - typedef - tnlMeshEntityInitializerLayer< ConfigTag, - EntityTag, - tnlDimensionsTraits< EntityTag::dimensions - 1 > > SubentityBaseType; - typedef - tnlMeshSuperentityInitializerLayer< ConfigTag, - EntityTag, - typename - tnlMeshTraits< ConfigTag >::DimensionsTraits > SuperentityBaseType; - - typedef typename tnlMeshEntitiesTraits< ConfigTag, DimensionsTraits >::Type EntityType; - typedef typename tnlMeshEntitiesTraits< ConfigTag, - DimensionsTraits >::ContainerType::IndexType GlobalIndexType; - - typedef tnlMeshSubentitiesTraits< ConfigTag, EntityTag, tnlDimensionsTraits< 0 > > SubvertexTag; - typedef typename SubvertexTag::ContainerType::ElementType VertexGlobalIndexType; - typedef typename SubvertexTag::ContainerType::IndexType VertexLocalIndexType; - - typedef tnlMeshInitializer< ConfigTag > InitializerType; - - template< typename > class SubentitiesCreator; - - public: - - //using SuperentityBaseType::setNumberOfSuperentities; - - static tnlString getType() {}; - - tnlMeshEntityInitializer() : entity(0), entityIndex( -1 ) {} - - void init( EntityType& entity, GlobalIndexType entityIndex ) - { - this->entity = &entity; - this->entityIndex = entityIndex; - } - - void initEntity( InitializerType &meshInitializer ) - { - tnlAssert( this->entity, ); - - this->entity->setId( entityIndex ); - - initSuperentities(); - initSubentities( meshInitializer ); - //cout << " Entity initiation done ... " << endl; - } - - template< typename SubentityDimensionsTag > - void createSubentities( typename tnlMeshSubentitiesTraits< ConfigTag, - EntityTag, - SubentityDimensionsTag >::SubentityContainerType& subentities ) const - { - SubentitiesCreator< SubentityDimensionsTag >::createSubentities( subentities, *entity ); - } - - GlobalIndexType getEntityIndex() const - { - tnlAssert( entityIndex >= 0, - cerr << "entityIndex = " << entityIndex ); - return this->entityIndex; - } - - template< typename SubentityDimensionTag > - typename tnlMeshSubentitiesTraits< ConfigTag, EntityTag, SubentityDimensionTag >::SharedContainerType& subentityContainer( SubentityDimensionTag ) - { - return this->entity->template getSubentitiesIndices< SubentityDimensionTag::value >(); - } - - template< typename SuperentityDimensionTag > - bool setNumberOfSuperentities( SuperentityDimensionTag, typename tnlMeshSuperentitiesTraits< ConfigTag, EntityTag, SuperentityDimensionTag >::ContainerType::IndexType size ) - { - return this->entity->template setNumberOfSuperentities< SuperentityDimensionTag::value >( size ); - } - - // TODO: check if we need the following two methods - /*template< typename SuperentityDimensionTag > - bool getSuperentityContainer( SuperentityDimensionTag, typename tnlMeshSuperentitiesTraits< ConfigTag, EntityTag, SuperentityDimensionTag >::ContainerType::IndexType size ) - { - return this->entity->template setNumberOfSuperentities< SuperentityDimensionTag::value >( size ); - }*/ - - template< typename SuperentityDimensionTag > - typename tnlMeshSuperentitiesTraits< ConfigTag, EntityTag, SuperentityDimensionTag >::SharedContainerType& getSuperentityContainer( SuperentityDimensionTag ) - { - return this->entity->template getSuperentitiesIndices< SuperentityDimensionTag::value >(); - } - - static void setEntityVertex( EntityType& entity, - VertexLocalIndexType localIndex, - VertexGlobalIndexType globalIndex ) - { - entity.setVertexIndex( localIndex, globalIndex ); - } - - private: - EntityType *entity; - GlobalIndexType entityIndex; - - void initSubentities( InitializerType& meshInitializer ) - { - //cout << " Initiating subentities of entity ... " << endl; - SubentityBaseType::initSubentities( *this, meshInitializer ); - } - - void initSuperentities() - { - //cout << " Initiating superentities..." << endl; - SuperentityBaseType::initSuperentities( *this) ; - } - - template< typename SubentityDimensionTag > - class SubentitiesCreator - { - typedef tnlMeshSubentitiesTraits< ConfigTag, EntityTag, SubentityDimensionTag > Tag; - typedef typename Tag::SubentityTag SubentityTag; - typedef typename Tag::SubentityType SubentityType; - typedef typename Tag::ContainerType::IndexType LocalIndexType; - - typedef typename - tnlMeshSubentitiesTraits< ConfigTag, - EntityTag, - SubentityDimensionTag >::SharedContainerType SubentitiesIndicesContainerType; - - typedef typename tnlMeshSubentitiesTraits< ConfigTag, - EntityTag, - SubentityDimensionTag>::SubentityContainerType - SubentityContainerType; - - enum { subentitiesCount = Tag::count }; - enum { subentityVerticesCount = tnlMeshSubentitiesTraits< ConfigTag, - SubentityTag, - tnlDimensionsTraits< 0 > >::count }; - - public: - static void createSubentities( SubentityContainerType& subentities, - const EntityType &entity ) - { - const SubentitiesIndicesContainerType& subvertexIndices = entity.template getSubentitiesIndices< 0 >(); - //cout << " entity = " << entity << endl; - //cout << " subvertexIndices = " << subvertexIndices << endl; - tnlStaticFor< LocalIndexType, 0, subentitiesCount, CreateSubentities >::exec( subentities, subvertexIndices ); - } - - private: - template< LocalIndexType subentityIndex > - class CreateSubentities - { - public: - static void exec( SubentityContainerType &subentities, - const SubentitiesIndicesContainerType& subvertexIndices ) - { - SubentityType &subentity = subentities[ subentityIndex ]; - tnlStaticFor< LocalIndexType, 0, subentityVerticesCount, SetSubentityVertex >::exec( subentity, subvertexIndices ); - } - - private: - template< LocalIndexType subentityVertexIndex > - class SetSubentityVertex - { - public: - static bool exec( SubentityType &subentity, - const SubentitiesIndicesContainerType& subvertexIndices ) - { - LocalIndexType vertexIndex = Tag::template Vertex< subentityIndex, subentityVertexIndex >::index; - //cout << " Setting subentity " << subentityIndex << " vertex " << subentityVertexIndex << " to " << subvertexIndices[ vertexIndex ] << endl; - tnlMeshEntityInitializer< ConfigTag, SubentityTag >::setEntityVertex( subentity, subentityVertexIndex, subvertexIndices[ vertexIndex ] ); - return true; - } - }; - }; - }; -}; - -template< typename ConfigTag > -class tnlMeshEntityInitializer< ConfigTag, tnlMeshVertexTag > - : public tnlMeshSuperentityInitializerLayer< ConfigTag, - tnlMeshVertexTag, - typename tnlMeshTraits< ConfigTag >::DimensionsTraits > -{ - typedef tnlDimensionsTraits< 0 > DimensionsTraits; - - typedef tnlMeshSuperentityInitializerLayer< ConfigTag, - tnlMeshVertexTag, - typename tnlMeshTraits< ConfigTag >::DimensionsTraits > SuperentityBaseType; - - typedef typename tnlMeshEntitiesTraits< ConfigTag, DimensionsTraits >::Type EntityType; - typedef typename tnlMeshEntitiesTraits< ConfigTag, DimensionsTraits >::ContainerType::IndexType GlobalIndexType; - - typedef tnlMeshInitializer< ConfigTag > InitializerType; - - public: - - tnlMeshEntityInitializer() : entity(0), entityIndex(-1) {} - - static tnlString getType() {}; - - void init( EntityType& entity, GlobalIndexType entityIndex ) - { - this->entity = &entity; - this->entityIndex = entityIndex; - } - - void initEntity(InitializerType &meshInitializer) - { - this->entity->setId( this->entityIndex ); - initSuperentities(); - //cout << "Vertex initiation done ... " << endl; - } - - template< typename SuperentityDimensionsTag > - bool setNumberOfSuperentities( SuperentityDimensionsTag, - const typename EntityType::template SuperentitiesTraits< SuperentityDimensionsTag::value >::ContainerType::IndexType size ) - { - return this->entity->template setNumberOfSuperentities< SuperentityDimensionsTag::value >( size ); - } - - template< typename SuperentityDimensionsTag > - typename tnlMeshSuperentitiesTraits< ConfigTag, - tnlMeshVertexTag, - SuperentityDimensionsTag >::SharedContainerType& - getSuperentityContainer( SuperentityDimensionsTag ) - { - return this->entity->template getSuperentitiesIndices< SuperentityDimensionsTag::value >(); - } - - private: - - EntityType *entity; - GlobalIndexType entityIndex; - - void initSuperentities() - { - //cout << " Initiating superentities of vertex ..." << endl; - SuperentityBaseType::initSuperentities(*this); - } -}; - -/**** - * Mesh entity initializer layer - */ - -template< typename ConfigTag, - typename EntityTag, - typename DimensionsTag > -class tnlMeshEntityInitializerLayer< ConfigTag, - EntityTag, - DimensionsTag, - tnlStorageTraits< true >, - tnlStorageTraits< true > > - : public tnlMeshEntityInitializerLayer< ConfigTag, - EntityTag, - typename DimensionsTag::Previous > -{ - typedef tnlMeshEntityInitializerLayer< ConfigTag, - EntityTag, - typename DimensionsTag::Previous > BaseType; - - typedef tnlMeshSubentitiesTraits< ConfigTag, EntityTag, DimensionsTag > SubentitiesTraits; - typedef typename SubentitiesTraits::SubentityContainerType SubentityContainerType; - typedef typename SubentitiesTraits::SharedContainerType SharedContainerType; - typedef typename SharedContainerType::ElementType GlobalIndexType; - - typedef tnlMeshInitializer< ConfigTag > InitializerType; - typedef tnlMeshEntityInitializer< ConfigTag, EntityTag > EntityInitializerType; - typedef tnlDimensionsTraits< EntityTag::dimensions > EntityDimensionsTraits; - - protected: - void initSubentities( EntityInitializerType& entityInitializer, - InitializerType& meshInitializer ) - { - SubentityContainerType subentities; - //cout << " Initiating subentities with " << DimensionsTag::value << " dimensions..." << endl; - entityInitializer.template createSubentities< DimensionsTag >( subentities ); - SharedContainerType& subentityContainer = entityInitializer.subentityContainer( DimensionsTag() ); - //cout << " Subentities = " << subentities << endl; - for( typename SubentityContainerType::IndexType i = 0; - i < subentities.getSize(); - i++ ) - { - GlobalIndexType subentityIndex = meshInitializer.findEntityIndex( subentities[ i ] ); - GlobalIndexType superentityIndex = entityInitializer.getEntityIndex(); - subentityContainer[ i ] = subentityIndex; - //cout << " Setting " << i << "-th subentity to " << subentityContainer[ i ] << endl; - meshInitializer.getEntityInitializer( DimensionsTag(), subentityIndex ).addSuperentity( EntityDimensionsTraits(), superentityIndex ); - } - - BaseType::initSubentities( entityInitializer, meshInitializer ); - } -}; - -template< typename ConfigTag, - typename EntityTag, - typename DimensionsTag > -class tnlMeshEntityInitializerLayer< ConfigTag, - EntityTag, - DimensionsTag, - tnlStorageTraits< true >, - tnlStorageTraits< false > > - : public tnlMeshEntityInitializerLayer< ConfigTag, - EntityTag, - typename DimensionsTag::Previous > -{ - typedef tnlMeshEntityInitializerLayer< ConfigTag, - EntityTag, - typename DimensionsTag::Previous > BaseType; - - typedef typename tnlMeshSubentitiesTraits< ConfigTag, - EntityTag, - DimensionsTag >::SubentityContainerType SubentityContainerType; - typedef typename tnlMeshSubentitiesTraits< ConfigTag, - EntityTag, - DimensionsTag >::SharedContainerType SharedContainerType; - - typedef tnlMeshInitializer< ConfigTag > InitializerType; - typedef tnlMeshEntityInitializer< ConfigTag, EntityTag > EntityInitializerType; - - protected: - void initSubentities( EntityInitializerType& entityInitializer, - InitializerType& meshInitializer ) - { - SubentityContainerType subentities; - //cout << " Initiating subentities with " << DimensionsTag::value << " dimensions..." << endl; - entityInitializer.template createSubentities< DimensionsTag >( subentities ); - SharedContainerType& subentityContainer = entityInitializer.subentityContainer( DimensionsTag() ); - for( typename SubentityContainerType::IndexType i = 0; - i < subentityContainer.getSize(); - i++ ) - { - subentityContainer[ i ] = meshInitializer.findEntityIndex( subentities[ i ] ); - //cout << " Setting " << i << "-th subentity to " << subentityContainer[ i ] << endl; - } - - BaseType::initSubentities( entityInitializer, meshInitializer ); - } -}; - -template< typename ConfigTag, - typename EntityTag, - typename DimensionsTag > -class tnlMeshEntityInitializerLayer< ConfigTag, - EntityTag, - DimensionsTag, - tnlStorageTraits< false >, - tnlStorageTraits< true > > - : public tnlMeshEntityInitializerLayer< ConfigTag, - EntityTag, - typename DimensionsTag::Previous > -{ - typedef tnlMeshEntityInitializerLayer< ConfigTag, - EntityTag, - typename DimensionsTag::Previous > BaseType; - - typedef typename tnlMeshSubentitiesTraits< ConfigTag, - EntityTag, - DimensionsTag >::SubentityContainerType SubentityContainerType; - typedef typename tnlMeshSubentitiesTraits< ConfigTag, - EntityTag, - DimensionsTag >::SharedContainerType SharedContainerType; - typedef typename SharedContainerType::DataType GlobalIndexType; - - typedef tnlMeshInitializer< ConfigTag > InitializerType; - typedef tnlMeshEntityInitializer< ConfigTag, EntityTag > EntityInitializerType; - typedef tnlDimensionsTraits< EntityTag::dimensions > EntityDimensionsTag; - - protected: - void initSubentities( EntityInitializerType& entityInitializer, - InitializerType& meshInitializer ) - { - SubentityContainerType subentities; - //cout << " Initiating subentities with " << DimensionsTag::value << " dimensions..." << endl; - entityInitializer.template createSubentities< DimensionsTag >( subentities ); - - for( typename SubentityContainerType::IndexType i = 0; - i < subentities.getSize(); - i++ ) - { - 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 ); - } - BaseType::initSubentities( entityInitializer, meshInitializer ); - } -}; - -template< typename ConfigTag, - typename EntityTag, - typename DimensionsTag > -class tnlMeshEntityInitializerLayer< ConfigTag, - EntityTag, - DimensionsTag, - tnlStorageTraits< false >, - tnlStorageTraits< false > > - : public tnlMeshEntityInitializerLayer< ConfigTag, - EntityTag, - typename DimensionsTag::Previous > -{}; - -template< typename ConfigTag, - typename EntityTag > -class tnlMeshEntityInitializerLayer< ConfigTag, - EntityTag, - tnlDimensionsTraits< 0 >, - tnlStorageTraits< true >, - tnlStorageTraits< true > > -{ - typedef tnlDimensionsTraits< 0 > DimensionsTag; - typedef tnlMeshSubentitiesTraits< ConfigTag, - EntityTag, - DimensionsTag > SubentitiesTraits; - - typedef typename SubentitiesTraits::SharedContainerType SharedContainerType; - typedef typename SharedContainerType::ElementType GlobalIndexType; - - typedef tnlMeshInitializer< ConfigTag > InitializerType; - typedef tnlMeshEntityInitializer< ConfigTag, EntityTag > EntityInitializerType; - typedef tnlDimensionsTraits< EntityTag::dimensions > EntityDimensionsTag; - - protected: - void initSubentities( EntityInitializerType &entityInitializer, - InitializerType &meshInitializer ) - { - //cout << " Initiating subentities with " << DimensionsTag::value << " dimensions..." << endl; - const SharedContainerType &subentityContainer = entityInitializer.subentityContainer( DimensionsTag() ); - for (typename SharedContainerType::IndexType i = 0; i < subentityContainer.getSize(); i++) - { - GlobalIndexType subentityIndex = subentityContainer[ i ]; - //cout << " Setting " << i << "-th subentity to " << subentityContainer[ i ] << endl; - tnlAssert( subentityIndex >= 0, - cerr << " subentityContainer = " << subentityContainer << endl; ); - GlobalIndexType superentityIndex = entityInitializer.getEntityIndex(); - tnlAssert( superentityIndex >= 0, ); - meshInitializer.getEntityInitializer( DimensionsTag(), subentityIndex).addSuperentity( EntityDimensionsTag(), superentityIndex ); - } - } -}; - -template< typename ConfigTag, - typename EntityTag > -class tnlMeshEntityInitializerLayer< ConfigTag, - EntityTag, - tnlDimensionsTraits< 0 >, - tnlStorageTraits< true >, - tnlStorageTraits< false > > -{ - typedef tnlMeshInitializer< ConfigTag > InitializerType; - typedef tnlMeshEntityInitializer< ConfigTag, - EntityTag > EntityInitializerType; - - protected: - - void initSubentities( EntityInitializerType&, InitializerType& ) {} -}; - -template< typename ConfigTag, - typename EntityTag > -class tnlMeshEntityInitializerLayer< ConfigTag, - EntityTag, - tnlDimensionsTraits< 0 >, - tnlStorageTraits< false >, - tnlStorageTraits< true > > // Forces termination of recursive inheritance (prevents compiler from generating huge error logs) -{ - typedef tnlMeshInitializer< ConfigTag > InitializerType; - typedef tnlMeshEntityInitializer< ConfigTag, EntityTag > EntityInitializerType; - - protected: - void initSubentities( EntityInitializerType&, InitializerType& ) {} -}; - -template< typename ConfigTag, - typename EntityTag > -class tnlMeshEntityInitializerLayer< ConfigTag, - EntityTag, - tnlDimensionsTraits< 0 >, - tnlStorageTraits< false >, - tnlStorageTraits< false > > // Forces termination of recursive inheritance (prevents compiler from generating huge error logs) -{ - typedef tnlMeshInitializer< ConfigTag > InitializerType; - typedef tnlMeshEntityInitializer< ConfigTag, EntityTag > EntityInitializerType; - - protected: - void initSubentities( EntityInitializerType&, - InitializerType& ) {} -}; - - -#endif /* TNLMESHENTITYINITIALIZER_H_ */ diff --git a/src/mesh/tnlMeshEntityKey.h b/src/mesh/tnlMeshEntityKey.h deleted file mode 100644 index 0937caaa98a16a9d92ccc1e1dc4e4e5d30f9b658..0000000000000000000000000000000000000000 --- a/src/mesh/tnlMeshEntityKey.h +++ /dev/null @@ -1,73 +0,0 @@ -/*************************************************************************** - tnlMeshEntityKey.h - description - ------------------- - begin : Feb 13, 2014 - copyright : (C) 2014 by Tomas Oberhuber - 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 TNLMESHENTITYKEY_H_ -#define TNLMESHENTITYKEY_H_ - -#include <mesh/tnlMeshEntity.h> -#include <mesh/traits/tnlMeshSubentitiesTraits.h> -#include <mesh/traits/tnlDimensionsTraits.h> - -/**** - * Unique identification of a mesh entity by its vertices. - * Uniqueness is preserved for entities of the same type only. - */ -template< typename ConfigTag, - typename EntityTag > -class tnlMeshEntityKey -{ - typedef - tnlMeshEntity< ConfigTag, EntityTag > EntityType; - - typedef typename - tnlMeshSubentitiesTraits< ConfigTag, - EntityTag, - tnlDimensionsTraits< 0 > >::ContainerType ContainerType; - - public: - - explicit tnlMeshEntityKey( const EntityType& entity ) - { - for( typename ContainerType::IndexType i = 0; - i < ContainerType::size; - i++ ) - vertexIDs[ i ] = entity.template getSubentityIndex<0>( i ); - vertexIDs.sort( ); - } - - bool operator<( const tnlMeshEntityKey& other ) const - { - for( typename ContainerType::IndexType i = 0; - i < ContainerType::size; - i++) - { - if( vertexIDs[ i ] < other.vertexIDs[ i ] ) - return true; - else - if( vertexIDs[ i ] > other.vertexIDs[ i ] ) - return false; - } - return false; - } - - private: - - ContainerType vertexIDs; -}; - - -#endif /* TNLMESHENTITYKEY_H_ */ diff --git a/src/mesh/tnlMeshEntityOrientation.h b/src/mesh/tnlMeshEntityOrientation.h new file mode 100644 index 0000000000000000000000000000000000000000..12ba48d04a8eb41e80ae1698f13483c9262d0121 --- /dev/null +++ b/src/mesh/tnlMeshEntityOrientation.h @@ -0,0 +1,54 @@ +/*************************************************************************** + tnlMeshEntityOrientation.h - description + ------------------- + begin : Aug 25, 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 TNLMESHENTITYORIENTATION_H +#define TNLMESHENTITYORIENTATION_H + +#include <mesh/traits/tnlMeshTraits.h> + +template< typename MeshConfig, + typename EntityTopology> +class tnlMeshEntityOrientation +{ + template< typename, typename> friend class tnlMeshEntityReferenceOrientation; + + public: + typedef typename tnlMeshTraits< MeshConfig >::IdPermutationArrayAccessorType IdPermutationArrayAccessorType; + + IdPermutationArrayAccessorType getSubvertexPermutation() const + { + IdPermutationArrayAccessorType accessor; + accessor.bind( this->subvertexPermutation ); + return accessor; + //return this->subvertexPermutation.subarray( 0, this->subvertexPermutation.getSize() ); + } + + private: + typedef typename tnlMeshTraits< MeshConfig >::LocalIndexType LocalIndexType; + typedef typename tnlMeshTraits< MeshConfig >::template SubentityTraits< EntityTopology, 0 >::IdPermutationArrayType IdPermutationArrayType; + + void setPermutationValue( LocalIndexType index, LocalIndexType value ) + { + this->subvertexPermutation[ index ] = value; + } + + IdPermutationArrayType subvertexPermutation; +}; + + +#endif /* TNLMESHENTITYORIENTATION_H */ + diff --git a/src/mesh/tnlMeshEntityReferenceOrientation.h b/src/mesh/tnlMeshEntityReferenceOrientation.h new file mode 100644 index 0000000000000000000000000000000000000000..4cd6c8cb5e512a26ec9f61416fedad9fc261c3f7 --- /dev/null +++ b/src/mesh/tnlMeshEntityReferenceOrientation.h @@ -0,0 +1,63 @@ +/*************************************************************************** + tnlMeshEntityReferenceOrientation.h - description + ------------------- + begin : Aug 25, 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 TNLMESHENTITYREFERENCEORIENTATION_H +#define TNLMESHENTITYREFERENCEORIENTATION_H + +template< typename MeshConfig, typename EntityTopology > +class tnlMeshEntityReferenceOrientation +{ + typedef typename tnlMeshTraits< MeshConfig >::LocalIndexType LocalIndexType; + typedef typename tnlMeshTraits< MeshConfig >::GlobalIndexType GlobalIndexType; + + public: + typedef tnlMeshEntitySeed< MeshConfig, EntityTopology > SeedType; + typedef tnlMeshEntityOrientation< MeshConfig, EntityTopology > EntityOrientation; + + tnlMeshEntityReferenceOrientation() = default; + + explicit tnlMeshEntityReferenceOrientation( const SeedType& referenceSeed ) + { + auto referenceCornerIds = referenceSeed.getCornerIds(); + for( LocalIndexType i = 0; i < referenceCornerIds.getSize(); i++ ) + { + tnlAssert( this->cornerIdsMap.find( referenceCornerIds[i]) == this->cornerIdsMap.end(), ); + this->cornerIdsMap.insert( std::make_pair( referenceCornerIds[i], i ) ); + } + } + + static tnlString getType(){}; + + EntityOrientation createOrientation( const SeedType& seed ) const + { + EntityOrientation result; + auto cornerIds = seed.getCornerIds(); + for( LocalIndexType i = 0; i < cornerIds.getSize(); i++ ) + { + tnlAssert( this->cornerIdsMap.find( cornerIds[ i ] ) != this->cornerIdsMap.end(), ); + result.setPermutationValue( i, this->cornerIdsMap.find( cornerIds[ i ])->second ); + } + return result; + } + + private: + std::map< GlobalIndexType, LocalIndexType > cornerIdsMap; +}; + + +#endif /* TNLMESHENTITYREFERENCEORIENTATION_H */ + diff --git a/src/mesh/tnlMeshEntity_impl.h b/src/mesh/tnlMeshEntity_impl.h new file mode 100644 index 0000000000000000000000000000000000000000..8b58e02acaab3f8c75f2d1e1bfd256b8020d7db9 --- /dev/null +++ b/src/mesh/tnlMeshEntity_impl.h @@ -0,0 +1,499 @@ +/*************************************************************************** + tnlMeshEntity_impl.h - description + ------------------- + begin : Sep 8, 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 TNLMESHENTITY_IMPL_H +#define TNLMESHENTITY_IMPL_H + +#include "tnlMeshEntity.h" + + +template< typename MeshConfig, + typename EntityTopology > +tnlMeshEntity< MeshConfig, EntityTopology >:: +tnlMeshEntity( const SeedType& entitySeed ) +{ + typedef typename SeedType::LocalIndexType LocalIndexType; + for( LocalIndexType i = 0; i < entitySeed.getCornerIds().getSize(); i++ ) + this->template setSubentityIndex< 0 >( i, entitySeed.getCornerIds()[ i ] ); +} + + +template< typename MeshConfig, + typename EntityTopology > +tnlMeshEntity< MeshConfig, EntityTopology >:: +tnlMeshEntity() +{ +} + +template< typename MeshConfig, + typename EntityTopology > +tnlMeshEntity< MeshConfig, EntityTopology >:: +~tnlMeshEntity() +{ + //cerr << " Destroying entity with " << EntityTopology::dimensions << " dimensions..." << endl; +} + +template< typename MeshConfig, + typename EntityTopology > +tnlString +tnlMeshEntity< MeshConfig, EntityTopology >:: +getType() +{ + return tnlString( "tnlMesh< ... >" ); +} + +template< typename MeshConfig, + typename EntityTopology > +tnlString +tnlMeshEntity< MeshConfig, EntityTopology >:: +getTypeVirtual() const +{ + return this->getType(); +} + +template< typename MeshConfig, + typename EntityTopology > +bool +tnlMeshEntity< MeshConfig, EntityTopology >:: +save( tnlFile& file ) const +{ + if( ! tnlMeshSubentityStorageLayers< MeshConfig, EntityTopology >::save( file ) /*|| + ! tnlMeshSuperentityStorageLayers< MeshConfig, EntityTopology >::save( file )*/ ) + return false; + return true; +} + +template< typename MeshConfig, + typename EntityTopology > +bool +tnlMeshEntity< MeshConfig, EntityTopology >:: +load( tnlFile& file ) +{ + if( ! tnlMeshSubentityStorageLayers< MeshConfig, EntityTopology >::load( file ) /*|| + ! tnlMeshSuperentityStorageLayers< MeshConfig, EntityTopology >::load( file ) */ ) + return false; + return true; +} + +template< typename MeshConfig, + typename EntityTopology > +void +tnlMeshEntity< MeshConfig, EntityTopology >:: +print( ostream& str ) const +{ + str << "\t Mesh entity dimensions: " << EntityTopology::dimensions << endl; + tnlMeshSubentityStorageLayers< MeshConfig, EntityTopology >::print( str ); + tnlMeshSuperentityAccess< MeshConfig, EntityTopology >::print( str ); +} + +template< typename MeshConfig, + typename EntityTopology > +bool +tnlMeshEntity< MeshConfig, EntityTopology >:: +operator==( const tnlMeshEntity& entity ) const +{ + return ( tnlMeshSubentityStorageLayers< MeshConfig, EntityTopology >::operator==( entity ) && + tnlMeshSuperentityAccess< MeshConfig, EntityTopology >::operator==( entity ) && + tnlMeshEntityId< typename MeshConfig::IdType, + typename MeshConfig::GlobalIndexType >::operator==( entity ) ); +} + +template< typename MeshConfig, + typename EntityTopology > +constexpr int +tnlMeshEntity< MeshConfig, EntityTopology >:: +getEntityDimensions() const +{ + return EntityTopology::dimensions; +} + +/**** + * Subentities + */ +template< typename MeshConfig, + typename EntityTopology > + template< int Subdimensions > +constexpr bool +tnlMeshEntity< MeshConfig, EntityTopology >:: +subentitiesAvailable() const +{ + return SubentityTraits< Subdimensions >::storageEnabled; +}; + +template< typename MeshConfig, + typename EntityTopology > + template< int Subdimensions > +constexpr typename tnlMeshEntity< MeshConfig, EntityTopology >::LocalIndexType +tnlMeshEntity< MeshConfig, EntityTopology >:: +getNumberOfSubentities() const +{ + return SubentityTraits< Subdimensions >::count; +}; + +template< typename MeshConfig, + typename EntityTopology > + template< int Subdimensions > +typename tnlMeshEntity< MeshConfig, EntityTopology >::GlobalIndexType +tnlMeshEntity< MeshConfig, EntityTopology >:: +getSubentityIndex( const LocalIndexType localIndex) const +{ + static_assert( SubentityTraits< Subdimensions >::storageEnabled, "You try to get subentity which is not configured for storage." ); + tnlAssert( 0 <= localIndex && + localIndex < SubentityTraits< Subdimensions >::count, + cerr << "localIndex = " << localIndex + << " subentitiesCount = " + << SubentityTraits< Subdimensions >::count ); + typedef tnlMeshSubentityStorageLayers< MeshConfig, EntityTopology > SubentityBaseType; + return SubentityBaseType::getSubentityIndex( tnlDimensionsTag< Subdimensions >(), + localIndex ); +} + +template< typename MeshConfig, + typename EntityTopology > + template< int Subdimensions > +typename tnlMeshEntity< MeshConfig, EntityTopology >::template SubentityTraits< Subdimensions >::AccessArrayType& +tnlMeshEntity< MeshConfig, EntityTopology >:: + getSubentitiesIndices() +{ + static_assert( SubentityTraits< Subdimensions >::storageEnabled, "You try to get subentities which are not configured for storage." ); + typedef tnlMeshSubentityStorageLayers< MeshConfig, EntityTopology > SubentityBaseType; + return SubentityBaseType::getSubentitiesIndices( tnlDimensionsTag< Subdimensions >() ); +} + +template< typename MeshConfig, + typename EntityTopology > + template< int Subdimensions > +const typename tnlMeshEntity< MeshConfig, EntityTopology >::template SubentityTraits< Subdimensions >::AccessArrayType& +tnlMeshEntity< MeshConfig, EntityTopology >:: +getSubentitiesIndices() const +{ + static_assert( SubentityTraits< Subdimensions >::storageEnabled, "You try to set subentities which are not configured for storage." ); + typedef tnlMeshSubentityStorageLayers< MeshConfig, EntityTopology > SubentityBaseType; + return SubentityBaseType::getSubentitiesIndices( tnlDimensionsTag< Subdimensions >() ); +} + +template< typename MeshConfig, + typename EntityTopology > + template< int SuperDimensions > +typename tnlMeshEntity< MeshConfig, EntityTopology >::LocalIndexType +tnlMeshEntity< MeshConfig, EntityTopology >:: +getNumberOfSuperentities() const +{ + static_assert( SuperentityTraits< SuperDimensions >::available, "You try to get number of superentities which are not configured for storage." ); + typedef tnlMeshSuperentityAccess< MeshConfig, EntityTopology > SuperentityBaseType; + return SuperentityBaseType::getNumberOfSuperentities( tnlDimensionsTag< SuperDimensions >() ); +} + +template< typename MeshConfig, + typename EntityTopology > + template< int SuperDimensions > +typename tnlMeshEntity< MeshConfig, EntityTopology >::GlobalIndexType +tnlMeshEntity< MeshConfig, EntityTopology >:: +getSuperentityIndex( const LocalIndexType localIndex ) const +{ + static_assert( SuperentityTraits< SuperDimensions >::storageEnabled, "You try to get superentity which is not configured for storage." ); + tnlAssert( localIndex < this->getNumberOfSuperentities< SuperDimensions >(), + cerr << " localIndex = " << localIndex + << " this->getNumberOfSuperentities< Dimensions >() = " << this->getNumberOfSuperentities< SuperDimensions >() << endl; ); + typedef tnlMeshSuperentityAccess< MeshConfig, EntityTopology > SuperentityBaseType; + return SuperentityBaseType::getSuperentityIndex( tnlDimensionsTag< SuperDimensions >(), + localIndex ); +} + +template< typename MeshConfig, + typename EntityTopology > + template< int SuperDimensions > +typename tnlMeshEntity< MeshConfig, EntityTopology >::template SuperentityTraits< SuperDimensions >::AccessArrayType& +tnlMeshEntity< MeshConfig, EntityTopology >:: +getSuperentitiesIndices() +{ + static_assert( SuperentityTraits< SuperDimensions >::storageEnabled, "You try to get superentities which are not configured for storage." ); + typedef tnlMeshSuperentityAccess< MeshConfig, EntityTopology > SuperentityBaseType; + //return SuperentityBaseType::getSuperentitiesIndices( tnlDimensionsTag< Dimensions >() ); +} + +template< typename MeshConfig, + typename EntityTopology > + template< int SuperDimensions > +const typename tnlMeshEntity< MeshConfig, EntityTopology >::template SuperentityTraits< SuperDimensions >::AccessArrayType& +tnlMeshEntity< MeshConfig, EntityTopology >:: +getSuperentitiesIndices() const +{ + static_assert( SuperentityTraits< SuperDimensions >::storageEnabled, "You try to get superentities which are not configured for storage." ); + typedef tnlMeshSuperentityAccess< MeshConfig, EntityTopology > SuperentityBaseType; + return SuperentityBaseType::getSubentitiesIndices( tnlDimensionsTag< SuperDimensions >() ); +} + +template< typename MeshConfig, + typename EntityTopology > +constexpr typename tnlMeshEntity< MeshConfig, EntityTopology >::LocalIndexType +tnlMeshEntity< MeshConfig, EntityTopology >:: +getNumberOfVertices() const +{ + return SubentityTraits< 0 >::count; +} + +template< typename MeshConfig, + typename EntityTopology > +typename tnlMeshEntity< MeshConfig, EntityTopology >::GlobalIndexType +tnlMeshEntity< MeshConfig, EntityTopology >:: +getVertexIndex( const LocalIndexType localIndex ) const +{ + return this->getSubentityIndex< 0 >( localIndex ); +} + +template< typename MeshConfig, + typename EntityTopology > +typename tnlMeshEntity< MeshConfig, EntityTopology >::template SubentityTraits< 0 >::AccessArrayType& +tnlMeshEntity< MeshConfig, EntityTopology >:: +getVerticesIndices() +{ + return this->getSubentitiesIndices< 0 >(); +} + +template< typename MeshConfig, + typename EntityTopology > +const typename tnlMeshEntity< MeshConfig, EntityTopology >::template SubentityTraits< 0 >::AccessArrayType& +tnlMeshEntity< MeshConfig, EntityTopology >:: +getVerticesIndices() const +{ + return this->getSubentitiesIndices< 0 >(); +} + +template< typename MeshConfig, + typename EntityTopology > + template< int Dimensions > +typename tnlMeshEntity< MeshConfig, EntityTopology >::IdPermutationArrayAccessorType +tnlMeshEntity< MeshConfig, EntityTopology >:: +subentityOrientation( LocalIndexType index ) const +{ + static const LocalIndexType subentitiesCount = SubentityTraits< Dimensions >::count; + tnlAssert( 0 <= index && index < subentitiesCount, ); + + return SubentityStorageLayers::subentityOrientation( tnlDimensionsTag< Dimensions >(), index ); +} + +/**** + * Mesh initialization method + */ + +template< typename MeshConfig, + typename EntityTopology > + template< int Subdimensions > +void +tnlMeshEntity< MeshConfig, EntityTopology >:: +setSubentityIndex( const LocalIndexType localIndex, + const GlobalIndexType globalIndex ) +{ + static_assert( SubentityTraits< Subdimensions >::storageEnabled, "You try to set subentity which is not configured for storage." ); + tnlAssert( 0 <= localIndex && + localIndex < SubentityTraits< Subdimensions >::count, + cerr << "localIndex = " << localIndex + << " subentitiesCount = " + << SubentityTraits< Subdimensions >::count ); + typedef tnlMeshSubentityStorageLayers< MeshConfig, EntityTopology > SubentityBaseType; + SubentityBaseType::setSubentityIndex( tnlDimensionsTag< Subdimensions >(), + localIndex, + globalIndex ); +} + +template< typename MeshConfig, + typename EntityTopology > + template< int Subdimensions > +typename tnlMeshEntity< MeshConfig, EntityTopology >::template SubentityTraits< Subdimensions >::IdArrayType& +tnlMeshEntity< MeshConfig, EntityTopology >:: +subentityIdsArray() +{ + return SubentityStorageLayers::subentityIdsArray( tnlDimensionsTag< Subdimensions >() ); +} + +template< typename MeshConfig, + typename EntityTopology > + template< int Superdimensions > +typename tnlMeshEntity< MeshConfig, EntityTopology >::IdArrayAccessorType& +tnlMeshEntity< MeshConfig, EntityTopology >:: +superentityIdsArray() +{ + return SuperentityAccessBase::superentityIdsArray( tnlDimensionsTag< Superdimensions >()); +} + +template< typename MeshConfig, + typename EntityTopology > + template< int Subdimensions > +typename tnlMeshEntity< MeshConfig, EntityTopology >::template SubentityTraits< Subdimensions >::OrientationArrayType& +tnlMeshEntity< MeshConfig, EntityTopology >:: +subentityOrientationsArray() +{ + return SubentityStorageLayers::subentityOrientationsArray( tnlDimensionsTag< Subdimensions >() ); +} + +/**** + * Vertex entity specialization + */ +template< typename MeshConfig > +tnlString +tnlMeshEntity< MeshConfig, tnlMeshVertexTopology >:: +getType() +{ + return tnlString( "tnlMesh< ... >" ); +} + +template< typename MeshConfig > +tnlString +tnlMeshEntity< MeshConfig, tnlMeshVertexTopology >:: +getTypeVirtual() const +{ + return this->getType(); +} + +template< typename MeshConfig > +tnlMeshEntity< MeshConfig, tnlMeshVertexTopology >:: +~tnlMeshEntity() +{ + //cerr << " Destroying entity with " << tnlMeshVertexTopology::dimensions << " dimensions..." << endl; +} + +template< typename MeshConfig > +bool +tnlMeshEntity< MeshConfig, tnlMeshVertexTopology >:: +save( tnlFile& file ) const +{ + if( //! tnlMeshSuperentityStorageLayers< MeshConfig, tnlMeshVertexTopology >::save( file ) || + ! point.save( file ) ) + return false; + return true; +} + +template< typename MeshConfig > +bool +tnlMeshEntity< MeshConfig, tnlMeshVertexTopology >:: +load( tnlFile& file ) +{ + if( //! tnlMeshSuperentityStorageLayers< MeshConfig, tnlMeshVertexTopology >::load( file ) || + ! point.load( file ) ) + return false; + return true; +} + +template< typename MeshConfig > +void +tnlMeshEntity< MeshConfig, tnlMeshVertexTopology >:: +print( ostream& str ) const +{ + str << "\t Mesh entity dimensions: " << tnlMeshVertexTopology::dimensions << endl; + str << "\t Coordinates = ( " << point << " )"; + tnlMeshSuperentityAccess< MeshConfig, tnlMeshVertexTopology >::print( str ); +} + +template< typename MeshConfig > +bool +tnlMeshEntity< MeshConfig, tnlMeshVertexTopology >:: +operator==( const tnlMeshEntity& entity ) const +{ + return ( //tnlMeshSuperentityAccess< MeshConfig, tnlMeshVertexTopology >::operator==( entity ) && + tnlMeshEntityId< typename MeshConfig::IdType, + typename MeshConfig::GlobalIndexType >::operator==( entity ) && + point == entity.point ); +} + +template< typename MeshConfig > +constexpr int +tnlMeshEntity< MeshConfig, tnlMeshVertexTopology >:: +getEntityDimensions() const +{ + return EntityTopology::dimensions; +} + +template< typename MeshConfig > + template< int Superdimensions > +typename tnlMeshEntity< MeshConfig, tnlMeshVertexTopology >::LocalIndexType +tnlMeshEntity< MeshConfig, tnlMeshVertexTopology >:: +getNumberOfSuperentities() const +{ + typedef tnlMeshSuperentityAccess< MeshConfig, tnlMeshVertexTopology > SuperentityBaseType; + return SuperentityBaseType::getNumberOfSuperentities( tnlDimensionsTag< Superdimensions >() ); +} + +template< typename MeshConfig > + template< int Superdimensions > +typename tnlMeshEntity< MeshConfig, tnlMeshVertexTopology >::template SuperentityTraits< Superdimensions >::AccessArrayType& +tnlMeshEntity< MeshConfig, tnlMeshVertexTopology >:: +getSuperentitiesIndices() +{ + typedef tnlMeshSuperentityAccess< MeshConfig, tnlMeshVertexTopology > SuperentityBaseType; + return SuperentityBaseType::getSuperentitiesIndices( tnlDimensionsTag< Superdimensions >() ); +} + +template< typename MeshConfig > + template< int Superdimensions > +const typename tnlMeshEntity< MeshConfig, tnlMeshVertexTopology >::template SuperentityTraits< Superdimensions >::AccessArrayType& +tnlMeshEntity< MeshConfig, tnlMeshVertexTopology >:: +getSuperentitiesIndeces() const +{ + typedef tnlMeshSuperentityAccess< MeshConfig, tnlMeshVertexTopology > SuperentityBaseType; + return SuperentityBaseType::getSubentitiesIndices( tnlDimensionsTag< Superdimensions >() ); +} + +template< typename MeshConfig > + template< int Dimensions > +typename tnlMeshEntity< MeshConfig, tnlMeshVertexTopology >::GlobalIndexType +tnlMeshEntity< MeshConfig, tnlMeshVertexTopology >:: +getSuperentityIndex( const LocalIndexType localIndex ) const +{ + tnlAssert( localIndex < this->getNumberOfSuperentities< Dimensions >(), + cerr << " localIndex = " << localIndex + << " this->getNumberOfSuperentities< Dimensions >() = " << this->getNumberOfSuperentities< Dimensions >() << endl; ); + typedef tnlMeshSuperentityAccess< MeshConfig, tnlMeshVertexTopology > SuperentityBaseType; + return SuperentityBaseType::getSuperentityIndex( tnlDimensionsTag< Dimensions >(), + localIndex ); +} + +template< typename MeshConfig > +typename tnlMeshEntity< MeshConfig, tnlMeshVertexTopology >::PointType +tnlMeshEntity< MeshConfig, tnlMeshVertexTopology >:: +getPoint() const +{ + return this->point; +} + +template< typename MeshConfig > +void +tnlMeshEntity< MeshConfig, tnlMeshVertexTopology >:: +setPoint( const PointType& point ) +{ + this->point = point; +} + +template< typename MeshConfig > + template< int Superdimensions > +typename tnlMeshEntity< MeshConfig, tnlMeshVertexTopology >::MeshTraits::IdArrayAccessorType& +tnlMeshEntity< MeshConfig, tnlMeshVertexTopology >:: +superentityIdsArray() +{ + return SuperentityAccessBase::superentityIdsArray( tnlDimensionsTag< Superdimensions >()); +} + +template< typename MeshConfig, + typename EntityTopology > +ostream& operator <<( ostream& str, const tnlMeshEntity< MeshConfig, EntityTopology >& entity ) +{ + entity.print( str ); + return str; +} + +#endif /* TNLMESHENTITY_IMPL_H */ + diff --git a/src/mesh/tnlMeshInitializer.h b/src/mesh/tnlMeshInitializer.h deleted file mode 100644 index 897aa5901432704f8b71ed7f1917a6009230e01b..0000000000000000000000000000000000000000 --- a/src/mesh/tnlMeshInitializer.h +++ /dev/null @@ -1,365 +0,0 @@ -/*************************************************************************** - tnlMeshInitializer.h - description - ------------------- - begin : Feb 23, 2014 - copyright : (C) 2014 by Tomas Oberhuber - 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 TNLMESHINITIALIZER_H_ -#define TNLMESHINITIALIZER_H_ - -#include <mesh/traits/tnlMeshEntitiesTraits.h> -#include <mesh/traits/tnlDimensionsTraits.h> -#include <mesh/traits/tnlMeshSubentitiesTraits.h> -#include <mesh/traits/tnlMeshSuperentitiesTraits.h> -#include <mesh/tnlMeshEntityInitializer.h> -#include <mesh/tnlMesh.h> -#include <mesh/traits/tnlStorageTraits.h> - -template< typename ConfigTag, - typename DimensionsTraits, - typename EntityStorageTag = typename tnlMeshEntitiesTraits< ConfigTag, - DimensionsTraits >::EntityStorageTag > -class tnlMeshInitializerLayer; - - -template< typename ConfigTag, - typename EntityTag> -class tnlMeshEntityInitializer; - -template< typename ConfigTag > -class tnlMeshInitializer - : public tnlMeshInitializerLayer< ConfigTag, - typename tnlMeshTraits< ConfigTag >::DimensionsTraits > -{ - typedef tnlMesh< ConfigTag > MeshType; - - public: - - tnlMeshInitializer() - : verbose( false ) - {} - - void setVerbose( bool verbose ) - { - this->verbose = verbose; - } - - bool initMesh( MeshType& mesh ) - { - //cout << "======= Starting mesh initiation ========" << endl; - this->setMesh( mesh ); - if( ! this->checkCells() ) - return false; - //cout << "========= Creating entities =============" << endl; - this->createEntitiesFromCells( this->verbose ); - this->createEntityInitializers(); - //cout << "====== Initiating entities ==============" << endl; - this->initEntities( *this ); - //cout << "Mesh initiation done..." << endl; - return true; - } - - protected: - - bool verbose; -}; - -template< typename ConfigTag > -class tnlMeshInitializerLayer< ConfigTag, - typename tnlMeshTraits< ConfigTag >::DimensionsTraits, - tnlStorageTraits< true > > - : public tnlMeshInitializerLayer< ConfigTag, - typename tnlMeshTraits< ConfigTag >::DimensionsTraits::Previous > -{ - typedef typename tnlMeshTraits< ConfigTag >::DimensionsTraits DimensionsTraits; - - typedef tnlMeshInitializerLayer< ConfigTag, - typename DimensionsTraits::Previous > BaseType; - - typedef tnlMeshEntitiesTraits< ConfigTag, DimensionsTraits > Tag; - typedef typename Tag::Tag EntityTag; - typedef typename Tag::ContainerType ContainerType; - typedef typename ContainerType::IndexType GlobalIndexType; - - typedef tnlMeshInitializer< ConfigTag > InitializerType; - typedef tnlMeshEntityInitializer< ConfigTag, EntityTag > CellInitializerType; - typedef tnlArray< CellInitializerType, tnlHost, GlobalIndexType > CellInitializerContainerType; - - public: - using BaseType::getEntityInitializer; - CellInitializerType& getEntityInitializer( DimensionsTraits, GlobalIndexType index ) - { - return cellInitializerContainer[ index ]; - } - - protected: - - bool checkCells() - { - typedef typename tnlMeshEntity< ConfigTag, EntityTag >::template SubentitiesTraits< 0 >::LocalIndexType LocalIndexType; - const GlobalIndexType numberOfVertices( this->getMesh().getNumberOfVertices() ); - for( GlobalIndexType cell = 0; - cell < this->getMesh().getNumberOfCells(); - cell++ ) - for( LocalIndexType i = 0; - i < this->getMesh().getCell( cell ).getNumberOfVertices(); - i++ ) - { - if( this->getMesh().getCell( cell ).getVerticesIndices()[ i ] == - 1 ) - { - cerr << "The cell number " << cell << " does not have properly set vertex index number " << i << "." << endl; - return false; - } - if( this->getMesh().getCell( cell ).getVerticesIndices()[ i ] >= numberOfVertices ) - { - cerr << "The cell number " << cell << " does not have properly set vertex index number " << i - << ". The index " << this->getMesh().getCell( cell ).getVerticesIndices()[ i ] - << "is higher than the number of all vertices ( " << numberOfVertices - << " )." << endl; - return false; - } - } - return true; - } - - void createEntitiesFromCells( bool verbose ) - { - //cout << " Creating entities with " << DimensionsTraits::value << " dimensions..." << endl; - cellInitializerContainer.setSize( this->getMesh().getNumberOfCells() ); - for( GlobalIndexType cell = 0; - cell < this->getMesh().getNumberOfCells(); - cell++ ) - { - if( verbose ) - cout << " Creating the cell number " << cell << " \r " << flush; - CellInitializerType& cellInitializer = cellInitializerContainer[ cell ]; - - cellInitializer.init( this->getMesh().getCell( cell ), cell ); - BaseType::createEntitiesFromCells( cellInitializer ); - } - if( verbose ) - cout << endl; - - } - - void initEntities( InitializerType& meshInitializer ) - { - //cout << " Initiating entities with " << DimensionsTraits::value << " dimensions..." << endl; - for( typename CellInitializerContainerType::IndexType i = 0; - i < cellInitializerContainer.getSize(); - i++ ) - { - //cout << " Initiating entity " << i << " with " << DimensionsTraits::value << " dimensions..." << endl; - cellInitializerContainer[ i ].initEntity( meshInitializer ); - } - cellInitializerContainer.reset(); - BaseType::initEntities( meshInitializer ); - } - - private: - CellInitializerContainerType cellInitializerContainer; -}; - - -template< typename ConfigTag, - typename DimensionsTraits > -class tnlMeshInitializerLayer< ConfigTag, - DimensionsTraits, - tnlStorageTraits< true > > - : public tnlMeshInitializerLayer< ConfigTag, - typename DimensionsTraits::Previous > -{ - typedef tnlMeshInitializerLayer< ConfigTag, - typename DimensionsTraits::Previous > BaseType; - - typedef tnlMeshEntitiesTraits< ConfigTag, DimensionsTraits > Tag; - typedef typename Tag::Tag EntityTag; - typedef typename Tag::Type EntityType; - typedef typename Tag::ContainerType ContainerType; - typedef typename Tag::UniqueContainerType UniqueContainerType; - typedef typename ContainerType::IndexType GlobalIndexType; - - typedef tnlMeshInitializer< ConfigTag > InitializerType; - typedef tnlMeshEntityInitializer< ConfigTag, - typename ConfigTag::CellTag > CellInitializerType; - typedef tnlMeshEntityInitializer< ConfigTag, EntityTag > EntityInitializerType; - typedef tnlArray< EntityInitializerType, tnlHost, GlobalIndexType > EntityInitializerContainerType; - - typedef typename - tnlMeshSubentitiesTraits< ConfigTag, - typename ConfigTag::CellTag, - DimensionsTraits >::SubentityContainerType SubentitiesContainerType; - - public: - - using BaseType::findEntityIndex; - GlobalIndexType findEntityIndex( EntityType &entity ) const - { - GlobalIndexType idx; - bool entityFound = uniqueContainer.find( entity, idx ); - tnlAssert( entityFound, - cerr << " entity = " << entity << endl; ); - return idx; - } - - using BaseType::getEntityInitializer; - EntityInitializerType& getEntityInitializer( DimensionsTraits, GlobalIndexType index ) - { - return entityInitializerContainer[ index ]; - } - - protected: - - void createEntitiesFromCells( const CellInitializerType& cellInitializer ) - { - //cout << " Creating entities with " << DimensionsTraits::value << " dimensions..." << endl; - SubentitiesContainerType subentities; - cellInitializer.template createSubentities< DimensionsTraits >( subentities ); - for( typename SubentitiesContainerType::IndexType i = 0; - i < subentities.getSize(); - i++ ) - { - //cout << " Inserting subentity " << endl << subentities[ i ] << endl; - uniqueContainer.insert( subentities[ i ] ); - } - //cout << " Container with entities with " << DimensionsTraits::value << " dimensions has: " << endl << this->uniqueContainer << endl; - BaseType::createEntitiesFromCells( cellInitializer ); - } - - void createEntityInitializers() - { - entityInitializerContainer.setSize( uniqueContainer.getSize() ); - BaseType::createEntityInitializers(); - } - - void initEntities( InitializerType &meshInitializer ) - { - //cout << " Initiating entities with " << DimensionsTraits::value << " dimensions..." << endl; - //cout << " Container with entities with " << DimensionsTraits::value << " dimensions has: " << endl << this->uniqueContainer << endl; - const GlobalIndexType numberOfEntities = uniqueContainer.getSize(); - this->getMesh().template setNumberOfEntities< DimensionsTraits::value >( numberOfEntities ); - uniqueContainer.toArray( this->getMesh().template getEntities< DimensionsTraits::value >() ); - uniqueContainer.reset(); - //cout << " this->getMesh().template getEntities< DimensionsTraits::value >() has: " << this->getMesh().template getEntities< DimensionsTraits::value >() << endl; - - //ContainerType& entityContainer = this->getMesh().entityContainer(DimensionsTraits()); - for( GlobalIndexType i = 0; - i < numberOfEntities; - i++) - { - //cout << "Initiating entity " << i << " with " << DimensionsTraits::value << " dimensions..." << endl; - EntityInitializerType& entityInitializer = entityInitializerContainer[ i ]; - //cout << "Initiating with entity " << this->getMesh().template getEntity< DimensionsTraits::value >( i ) << endl; - entityInitializer.init( this->getMesh().template getEntity< DimensionsTraits::value >( i ), i ); - entityInitializer.initEntity( meshInitializer ); - } - - entityInitializerContainer.reset(); - - BaseType::initEntities( meshInitializer ); - } - - private: - UniqueContainerType uniqueContainer; - EntityInitializerContainerType entityInitializerContainer; -}; - -template< typename ConfigTag, - typename DimensionsTraits > -class tnlMeshInitializerLayer< ConfigTag, - DimensionsTraits, - tnlStorageTraits< false > > - : public tnlMeshInitializerLayer< ConfigTag, - typename DimensionsTraits::Previous > -{}; - - -template< typename ConfigTag > -class tnlMeshInitializerLayer< ConfigTag, - tnlDimensionsTraits< 0 >, - tnlStorageTraits< true > > -{ - typedef tnlMesh< ConfigTag > MeshType; - typedef tnlDimensionsTraits< 0 > DimensionsTraits; - - typedef tnlMeshEntitiesTraits< ConfigTag, DimensionsTraits > Tag; - typedef typename Tag::Tag EntityTag; - typedef typename Tag::ContainerType ContainerType; - typedef typename Tag::SharedContainerType SharedContainerType; - typedef typename ContainerType::IndexType GlobalIndexType; - - typedef typename tnlMeshTraits< ConfigTag >::CellType CellType; - - typedef tnlMeshInitializer< ConfigTag > InitializerType; - typedef tnlMeshEntityInitializer< ConfigTag, - typename ConfigTag::CellTag > CellInitializerType; - typedef tnlMeshEntityInitializer< ConfigTag, EntityTag > VertexInitializerType; - typedef tnlArray< VertexInitializerType, tnlHost, GlobalIndexType > VertexInitializerContainerType; - - public: - - void setMesh( MeshType& mesh ) - { - this->mesh = &mesh; - } - - MeshType& getMesh() - { - tnlAssert( this->mesh, ); - return *( this->mesh ); - } - - VertexInitializerType& getEntityInitializer( DimensionsTraits, GlobalIndexType index ) - { - tnlAssert( index >= 0 && index < vertexInitializerContainer.getSize(), - cerr << " index = " << index - << " vertexInitializerContainer.getSize() = " << vertexInitializerContainer.getSize() << endl; ); - return vertexInitializerContainer[ index ]; - } - - protected: - void findEntityIndex() const {} // This method is due to 'using BaseType::findEntityIndex;' in the derived class. - void createEntitiesFromCells( const CellInitializerType& ) {} - - void createEntityInitializers() - { - vertexInitializerContainer.setSize( this->getMesh().template getNumberOfEntities< DimensionsTraits::value >() ); - } - - void initEntities( InitializerType& meshInitializer ) - { - //cout << " Initiating entities with " << DimensionsTraits::value << " dimensions..." << endl; - SharedContainerType& vertexContainer = this->getMesh().template getEntities< DimensionsTraits::value >(); - for( GlobalIndexType i = 0; - i < vertexContainer.getSize(); - i++ ) - { - //cout << "Initiating entity " << i << " with " << DimensionsTraits::value << " dimensions..." << endl; - VertexInitializerType& vertexInitializer = vertexInitializerContainer[ i ]; - vertexInitializer.init( vertexContainer[ i ], i ); - vertexInitializer.initEntity( meshInitializer ); - } - vertexInitializerContainer.reset(); - } - - private: - VertexInitializerContainerType vertexInitializerContainer; - - MeshType* mesh; -}; - - - - -#endif /* TNLMESHINITIALIZER_H_ */ diff --git a/src/mesh/tnlMeshIntegrityChecker.h b/src/mesh/tnlMeshIntegrityChecker.h index 86f0de4dfb5f4507afc9da6f5631d67857685b43..9cfd9e97ef528b2669e3dfba5235ecb98e3b865e 100644 --- a/src/mesh/tnlMeshIntegrityChecker.h +++ b/src/mesh/tnlMeshIntegrityChecker.h @@ -24,10 +24,10 @@ template< typename MeshType > class tnlMeshIntegrityChecker : public tnlMeshIntegrityCheckerLayer< MeshType, - tnlDimensionsTraits< MeshType::Config::CellTag::dimensions > > + tnlDimensionsTag< MeshType::Config::CellType::dimensions > > { - typedef tnlDimensionsTraits< MeshType::Config::CellTag::dimensions > DimensionsTraits; - typedef tnlMeshIntegrityCheckerLayer< MeshType, DimensionsTraits > BaseType; + typedef tnlDimensionsTag< MeshType::Config::CellType::dimensions > DimensionsTag; + typedef tnlMeshIntegrityCheckerLayer< MeshType, DimensionsTag > BaseType; public: static bool checkMesh( const MeshType& mesh ) diff --git a/src/mesh/tnlMeshIntegrityCheckerLayer.h b/src/mesh/tnlMeshIntegrityCheckerLayer.h index a67a8442300973408e484f2ddd9e727827ae8bad..8d40a2eafa8049e3d8e42defffafae5b2f4c84e0 100644 --- a/src/mesh/tnlMeshIntegrityCheckerLayer.h +++ b/src/mesh/tnlMeshIntegrityCheckerLayer.h @@ -18,28 +18,27 @@ #ifndef TNLMESHINTEGRITYCHECKERLAYER_H_ #define TNLMESHINTEGRITYCHECKERLAYER_H_ -#include <mesh/traits/tnlMeshEntitiesTraits.h> -#include <mesh/traits/tnlDimensionsTraits.h> -#include <mesh/traits/tnlStorageTraits.h> +#include <mesh/traits/tnlMeshEntityTraits.h> +#include <mesh/tnlDimensionsTag.h> template< typename MeshType, - typename DimensionsTraits, - typename EntityStorageTag = typename tnlMeshEntitiesTraits< typename MeshType::Config, - DimensionsTraits >::EntityStorageTag > + typename DimensionsTag, + bool EntityStorageTag = tnlMeshEntityTraits< typename MeshType::Config, + DimensionsTag::value >::storageEnabled > class tnlMeshIntegrityCheckerLayer; template< typename MeshType, - typename DimensionsTraits > + typename DimensionsTag > class tnlMeshIntegrityCheckerLayer< MeshType, - DimensionsTraits, - tnlStorageTraits< true > > + DimensionsTag, + true > : public tnlMeshIntegrityCheckerLayer< MeshType, - typename DimensionsTraits::Previous > + typename DimensionsTag::Decrement > { public: typedef tnlMeshIntegrityCheckerLayer< MeshType, - typename DimensionsTraits::Previous > BaseType; - enum { dimensions = DimensionsTraits::value }; + typename DimensionsTag::Decrement > BaseType; + enum { dimensions = DimensionsTag::value }; static bool checkEntities( const MeshType& mesh ) { @@ -61,8 +60,8 @@ class tnlMeshIntegrityCheckerLayer< MeshType, template< typename MeshType > class tnlMeshIntegrityCheckerLayer< MeshType, - tnlDimensionsTraits< 0 >, - tnlStorageTraits< true > > + tnlDimensionsTag< 0 >, + true > { public: enum { dimensions = 0 }; @@ -85,20 +84,20 @@ class tnlMeshIntegrityCheckerLayer< MeshType, }; template< typename MeshType, - typename DimensionsTraits > + typename DimensionsTag > class tnlMeshIntegrityCheckerLayer< MeshType, - DimensionsTraits, - tnlStorageTraits< false > > + DimensionsTag, + false > : public tnlMeshIntegrityCheckerLayer< MeshType, - typename DimensionsTraits::Previous > + typename DimensionsTag::Decrement > { }; template< typename MeshType > class tnlMeshIntegrityCheckerLayer< MeshType, - tnlDimensionsTraits< 0 >, - tnlStorageTraits< false > > + tnlDimensionsTag< 0 >, + false > { }; diff --git a/src/mesh/tnlMeshReaderNetgen.h b/src/mesh/tnlMeshReaderNetgen.h index e694b10269bf30046d1fbe2f3f06acdedda3a799..007c607af973aded1d6be3cc342700c84ab1c098 100644 --- a/src/mesh/tnlMeshReaderNetgen.h +++ b/src/mesh/tnlMeshReaderNetgen.h @@ -22,14 +22,18 @@ #include <istream> #include <sstream> +#include <mesh/tnlMeshBuilder.h> + using namespace std; class tnlMeshReaderNetgen { public: - static bool detectDimensions( const tnlString& fileName, - int& dimensions ) + tnlMeshReaderNetgen() + : dimensions( 0 ){} + + bool detectMesh( const tnlString& fileName ) { fstream inputFile( fileName.getString() ); if( ! inputFile ) @@ -52,6 +56,11 @@ class tnlMeshReaderNetgen if( ! inputFile ) return false; getline( inputFile, line ); + iss.str( line ); + long int numberOfVertices; + iss >> numberOfVertices; + + //cout << "There are " << numberOfVertices << " vertices." << endl; /**** * Read the first vertex and compute number of components @@ -59,14 +68,60 @@ class tnlMeshReaderNetgen if( ! inputFile ) return false; getline( inputFile, line ); + iss.clear(); iss.str( line ); - dimensions = -1; + this->dimensions = -1; while( iss ) { double aux; iss >> aux; - dimensions++; + this->dimensions++; + } + + /**** + * Skip vertices + */ + long int verticesRead( 1 ); + while( verticesRead < numberOfVertices ) + { + getline( inputFile, line ); + if( ! inputFile ) + { + cerr << "The mesh file " << fileName << " is probably corrupted, some vertices are missing." << endl; + return false; + } + verticesRead++; } + + /**** + * Skip whitespaces + */ + inputFile >> ws; + + /**** + * Get number of cells + */ + long int numberOfCells; + getline( inputFile, line ); + iss.clear(); + iss.str( line ); + iss >> numberOfCells; + //cout << "There are " << numberOfCells << " cells." << endl; + + /**** + * Get number of vertices in a cell + */ + getline( inputFile, line ); + iss.clear(); + iss.str( line ); + this->verticesInCell = -2; + while( iss ) + { + int aux; + iss >> aux; + this->verticesInCell++; + } + //cout << "There are " << this->verticesInCell << " vertices in cell ..." << endl; return true; } @@ -76,6 +131,8 @@ class tnlMeshReaderNetgen bool verbose ) { typedef typename MeshType::PointType PointType; + typedef tnlMeshBuilder< MeshType > MeshBuilder; + const int dimensions = PointType::size; fstream inputFile( fileName.getString() ); @@ -85,6 +142,7 @@ class tnlMeshReaderNetgen return false; } + MeshBuilder meshBuilder; string line; istringstream iss; @@ -100,16 +158,16 @@ class tnlMeshReaderNetgen return false; getline( inputFile, line ); iss.str( line ); - typedef typename MeshType::template EntitiesTraits< 0 >::GlobalIndexType VertexIndexType; - VertexIndexType numberOfVertices; - iss >> numberOfVertices; - if( ! mesh.setNumberOfVertices( numberOfVertices ) ) + typedef typename MeshType::MeshTraits::template EntityTraits< 0 >::GlobalIndexType VertexIndexType; + VertexIndexType pointsCount; + iss >> pointsCount; + if( ! meshBuilder.setPointsCount( pointsCount ) ) { - cerr << "I am not able to allocate enough memory for " << numberOfVertices << " vertices." << endl; + cerr << "I am not able to allocate enough memory for " << pointsCount << " vertices." << endl; return false; } - for( VertexIndexType i = 0; i < numberOfVertices; i++ ) + for( VertexIndexType i = 0; i < pointsCount; i++ ) { getline( inputFile, line ); iss.clear(); @@ -117,10 +175,11 @@ class tnlMeshReaderNetgen PointType p; for( int d = 0; d < dimensions; d++ ) iss >> p[ d ]; - mesh.setVertex( i, p ); + //cout << "Setting point number " << i << " of " << pointsCount << endl; + meshBuilder.setPoint( i, p ); if( verbose ) - cout << numberOfVertices << " vertices expected ... " << i+1 << "/" << numberOfVertices << " \r" << flush; - const PointType& point = mesh.getVertex( i ).getPoint(); + cout << pointsCount << " vertices expected ... " << i+1 << "/" << pointsCount << " \r" << flush; + //const PointType& point = mesh.getVertex( i ).getPoint(); } if( verbose ) cout << endl; @@ -133,7 +192,7 @@ class tnlMeshReaderNetgen /**** * Read number of cells */ - typedef typename MeshType::template EntitiesTraits< dimensions >::GlobalIndexType CellIndexType; + typedef typename MeshType::MeshTraits::template EntityTraits< dimensions >::GlobalIndexType CellIndexType; if( ! inputFile ) { cerr << "I cannot read the mesh cells." << endl; @@ -144,7 +203,7 @@ class tnlMeshReaderNetgen iss.str( line ); CellIndexType numberOfCells=atoi( line.data() ); //iss >> numberOfCells; // TODO: I do not know why this does not work - if( ! mesh.template setNumberOfEntities< dimensions >( numberOfCells ) ) + if( ! meshBuilder.setCellsCount( numberOfCells ) ) { cerr << "I am not able to allocate enough memory for " << numberOfCells << " cells." << endl; return false; @@ -156,22 +215,36 @@ class tnlMeshReaderNetgen iss.str( line ); int subdomainIndex; iss >> subdomainIndex; - for( int cellVertex = 0; cellVertex < dimensions + 1; cellVertex++ ) + //cout << "Setting cell number " << i << " of " << numberOfCells << endl; + typedef typename MeshBuilder::CellSeedType CellSeedType; + for( int cellVertex = 0; cellVertex < CellSeedType::getCornersCount(); cellVertex++ ) { VertexIndexType vertexIdx; iss >> vertexIdx; - mesh.template getEntity< dimensions >( i ).setVertexIndex( cellVertex, vertexIdx - 1 ); + meshBuilder.getCellSeed( i ).setCornerId( cellVertex, vertexIdx - 1 ); } if( verbose ) cout << numberOfCells << " cells expected ... " << i+1 << "/" << numberOfCells << " \r" << flush; } if( verbose ) cout << endl; + meshBuilder.build( mesh ); return true; } + int getDimensions() const + { + return this->dimensions; + } + + int getVerticesInCell() const + { + return this->verticesInCell; + } + protected: + int dimensions, verticesInCell; }; diff --git a/src/mesh/tnlMeshSuperentityInitializerLayer.h b/src/mesh/tnlMeshSuperentityInitializerLayer.h deleted file mode 100644 index dd0025712cc737d9ae3048887e72d443457b2bbf..0000000000000000000000000000000000000000 --- a/src/mesh/tnlMeshSuperentityInitializerLayer.h +++ /dev/null @@ -1,123 +0,0 @@ -/*************************************************************************** - tnlMeshSuperentityInitializerLayer.h - description - ------------------- - begin : Feb 27, 2014 - copyright : (C) 2014 by Tomas Oberhuber - 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 TNLMESHSUPERENTITYINITIALIZERLAYER_H_ -#define TNLMESHSUPERENTITYINITIALIZERLAYER_H_ - -#include <mesh/traits/tnlStorageTraits.h> -#include <mesh/traits/tnlDimensionsTraits.h> - -template< typename ConfigTag, - typename EntityTag > -class tnlMeshEntityInitializer; - -template< typename ConfigTag, - typename EntityTag, - typename DimensionsTag, - typename SuperentityStorageTag = typename tnlMeshSuperentitiesTraits< ConfigTag, EntityTag, DimensionsTag >::SuperentityStorageTag > -class tnlMeshSuperentityInitializerLayer; - -template< typename ConfigTag, - typename EntityTag, - typename DimensionsTag > -class tnlMeshSuperentityInitializerLayer< ConfigTag, - EntityTag, - DimensionsTag, - tnlStorageTraits< true > > - : public tnlMeshSuperentityInitializerLayer< ConfigTag, - EntityTag, - typename DimensionsTag::Previous > -{ - typedef tnlMeshSuperentityInitializerLayer< ConfigTag, - EntityTag, - typename DimensionsTag::Previous > BaseType; - - typedef typename tnlMeshSuperentitiesTraits< ConfigTag, - EntityTag, - DimensionsTag >::GrowableContainerType GrowableContainerType; - typedef typename GrowableContainerType::ElementType GlobalIndexType; - - typedef tnlMeshEntityInitializer< ConfigTag, EntityTag > EntityInitializerType; - - public: - - using BaseType::addSuperentity; - void addSuperentity( DimensionsTag, GlobalIndexType entityIndex ) - { - superentityContainer.Append( entityIndex ); - } - - protected: - void initSuperentities( EntityInitializerType& entityInitializer ) - { - entityInitializer.setNumberOfSuperentities( DimensionsTag(), - superentityContainer.getSize() ); - superentityContainer.toArray( entityInitializer.getSuperentityContainer( DimensionsTag()) ); - superentityContainer.reset(); - - BaseType::initSuperentities( entityInitializer ); - } - - private: - GrowableContainerType superentityContainer; -}; - -template< typename ConfigTag, - typename EntityTag, - typename DimensionsTag > -class tnlMeshSuperentityInitializerLayer< ConfigTag, - EntityTag, - DimensionsTag, - tnlStorageTraits< false > > - : public tnlMeshSuperentityInitializerLayer< ConfigTag, - EntityTag, - typename DimensionsTag::Previous > -{ -}; - -template< typename ConfigTag, - typename EntityTag > -class tnlMeshSuperentityInitializerLayer< ConfigTag, - EntityTag, - tnlDimensionsTraits< EntityTag::dimensions >, - tnlStorageTraits< true > > -{ - typedef tnlMeshEntityInitializer< ConfigTag, EntityTag > EntityInitializerType; - - protected: - void addSuperentity() {} // This method is due to 'using BaseType::...;' in the derived classes. - void initSuperentities( EntityInitializerType& ) {} -}; - -template< typename ConfigTag, - typename EntityTag > -class tnlMeshSuperentityInitializerLayer< ConfigTag, - EntityTag, - tnlDimensionsTraits< EntityTag::dimensions >, - tnlStorageTraits< false > > -{ - typedef tnlMeshEntityInitializer< ConfigTag, EntityTag > EntityInitializerType; - - protected: - void addSuperentity() {} // This method is due to 'using BaseType::...;' in the derived classes. - void initSuperentities( EntityInitializerType& ) {} -}; - - - - -#endif /* TNLMESHSUPERENTITYINITIALIZERLAYER_H_ */ diff --git a/src/mesh/tnlMeshWriterVTKLegacy.h b/src/mesh/tnlMeshWriterVTKLegacy.h index ab5d84c7a0e9dae2e398c1a590e1949c77a89aaf..2ade5967e03c8507443fc775e1c66f80dbff2250 100644 --- a/src/mesh/tnlMeshWriterVTKLegacy.h +++ b/src/mesh/tnlMeshWriterVTKLegacy.h @@ -24,16 +24,46 @@ #include <sstream> #include <iomanip> +#include <mesh/topologies/tnlMeshTriangleTopology.h> +#include <mesh/topologies/tnlMeshQuadrilateralTopology.h> +#include <mesh/topologies/tnlMeshTetrahedronTopology.h> +#include <mesh/topologies/tnlMeshHexahedronTopology.h> +#include <mesh/tnlMeshEntity.h> + + using namespace std; +enum tnlVTKMeshEntities { tnlVTKVertex = 1, + tnlVTKPolyVertex = 2, + tnlVTKLine = 3, + tnlVTKPolyLine = 4, + tnlVTKTriangle = 5, + tnlVTKTriangleStrip = 6, + tnlVTKPolygon = 7, + tnlVTKPixel = 8, + tnlVTKQuad = 9, + tnlVTKTetra = 10, + tnlVTKVoxel = 11, + tnlVTKHexahedron = 12, + tnlVTKWedge = 13, + tnlVTKPyramid = 14 }; + +template< typename MeshEntity > +struct tnlMeshEntityVTKType{}; + +template< typename MeshConfig > struct tnlMeshEntityVTKType< tnlMeshEntity< MeshConfig, tnlMeshTriangleTopology > > { enum { VTKType = tnlVTKTriangle }; }; +template< typename MeshConfig > struct tnlMeshEntityVTKType< tnlMeshEntity< MeshConfig, tnlMeshQuadrilateralTopology > >{ enum { VTKType = tnlVTKQuad }; }; +template< typename MeshConfig > struct tnlMeshEntityVTKType< tnlMeshEntity< MeshConfig, tnlMeshTetrahedronTopology > > { enum { VTKType = tnlVTKTetra }; }; +template< typename MeshConfig > struct tnlMeshEntityVTKType< tnlMeshEntity< MeshConfig, tnlMeshHexahedronTopology > > { enum { VTKType = tnlVTKHexahedron }; }; + class tnlMeshWriterVTKLegacy { public: template< typename MeshType > static bool write( const tnlString& fileName, - MeshType& mesh, - bool verbose ) + MeshType& mesh, + bool verbose ) { if( MeshType::dimensions > 3 ) { @@ -60,16 +90,42 @@ class tnlMeshWriterVTKLegacy MeshType& mesh, bool verbose ) { + typedef typename MeshType::MeshTraits::CellType CellType; file << "# vtk DataFile Version 2.0" << endl; file << "TNL Mesh" << endl; file << "ASCII" << endl; file << "DATASET UNSTRUCTURED_GRID" << endl; file << endl; - file << "POINTS " << mesh.template getNumberOfEntities< 0 >() << " float" << endl; + file << "POINTS " << mesh.template getNumberOfEntities< 0 >() << " double" << endl; for( int i = 0; i < mesh.template getNumberOfEntities< 0 >(); i++ ) { - file << mesh.template getEntity< 0 >( i ).getPoint(); + mesh.template getEntity< 0 >( i ).getPoint().write( file ); + for( int j = MeshType::dimensions; j < 3; j++ ) + file << " 0.0"; + file << endl; } + file << endl; + file << "CELLS " << mesh.template getNumberOfCells(); + long int listSize( 0 ); + for( int i = 0; i < mesh.template getNumberOfCells(); i++ ) + listSize += mesh.getCell( i ).template getNumberOfSubentities< 0 >() + 1; + file << " " << listSize << endl; + for( int i = 0; i < mesh.template getNumberOfCells(); i++ ) + { + int numberOfVertices = mesh.getCell( i ).template getNumberOfSubentities< 0 >(); + file << numberOfVertices << " "; + for( int j = 0; j < numberOfVertices - 1; j++ ) + file << mesh.getCell( i ).template getSubentityIndex< 0 >( j ) << " "; + file << mesh.getCell( i ).template getSubentityIndex< 0 >( numberOfVertices - 1 ) << endl; + } + file << endl; + file << "CELL_TYPES " << mesh.template getNumberOfCells() << endl; + for( int i = 0; i < mesh.template getNumberOfCells(); i++ ) + { + file << tnlMeshEntityVTKType< CellType >::VTKType << endl; + } + file << endl; + return true; } diff --git a/src/mesh/tnlMesh_impl.h b/src/mesh/tnlMesh_impl.h new file mode 100644 index 0000000000000000000000000000000000000000..1647569566f666a4030f72f2790605efc0213319 --- /dev/null +++ b/src/mesh/tnlMesh_impl.h @@ -0,0 +1,190 @@ +/*************************************************************************** + tnlMesh_impl.h - description + ------------------- + begin : Sep 5, 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 TNLMESH_IMPL_H +#define TNLMESH_IMPL_H + +#include "tnlMesh.h" + + +template< typename MeshConfig > +tnlString +tnlMesh< MeshConfig >:: +getType() +{ + return tnlString( "tnlMesh< ") + MeshConfig::getType() + " >"; +} + +template< typename MeshConfig > +tnlString +tnlMesh< MeshConfig >:: +getTypeVirtual() const +{ + return this->getType(); +} + +template< typename MeshConfig > +constexpr int +tnlMesh< MeshConfig >:: +getDimensions() +{ + return dimensions; +} + +template< typename MeshConfig > + template< int Dimensions > +bool +tnlMesh< MeshConfig >:: +entitiesAvalable() const +{ + return MeshTraits::template EntityTraits< Dimensions >::available; +} + +template< typename MeshConfig > + template< int Dimensions > +typename tnlMesh< MeshConfig >::GlobalIndexType +tnlMesh< MeshConfig >:: +getNumberOfEntities() const +{ + return entitiesStorage.getNumberOfEntities( tnlDimensionsTag< Dimensions >() ); +} + +template< typename MeshConfig > +typename tnlMesh< MeshConfig >::GlobalIndexType +tnlMesh< MeshConfig >:: +getNumberOfCells() const +{ + return entitiesStorage.getNumberOfEntities( tnlDimensionsTag< dimensions >() ); +} + +template< typename MeshConfig > +typename tnlMesh< MeshConfig >::CellType& +tnlMesh< MeshConfig >:: +getCell( const GlobalIndexType cellIndex ) +{ + return entitiesStorage.getEntity( tnlDimensionsTag< dimensions >(), cellIndex ); +} + +template< typename MeshConfig > +const typename tnlMesh< MeshConfig >::CellType& +tnlMesh< MeshConfig >:: +getCell( const GlobalIndexType cellIndex ) const +{ + return entitiesStorage.getEntity( tnlDimensionsTag< dimensions >(), cellIndex ); +} + +template< typename MeshConfig > + template< int Dimensions > +typename tnlMesh< MeshConfig >::template EntityType< Dimensions >& +tnlMesh< MeshConfig >:: +getEntity( const GlobalIndexType entityIndex ) +{ + return entitiesStorage.getEntity( tnlDimensionsTag< Dimensions >(), entityIndex ); +} + +template< typename MeshConfig > + template< int Dimensions > +const typename tnlMesh< MeshConfig >::template EntityType< Dimensions >& +tnlMesh< MeshConfig >:: +getEntity( const GlobalIndexType entityIndex ) const +{ + return entitiesStorage.getEntity( tnlDimensionsTag< Dimensions >(), entityIndex ); +} + +template< typename MeshConfig > +bool +tnlMesh< MeshConfig >:: +save( tnlFile& file ) const +{ + if( ! tnlObject::save( file ) || + ! entitiesStorage.save( file ) ) + { + cerr << "Mesh saving failed." << endl; + return false; + } + return true; +} + +template< typename MeshConfig > +bool +tnlMesh< MeshConfig >:: +load( tnlFile& file ) +{ + if( ! tnlObject::load( file ) || + ! entitiesStorage.load( file ) ) + { + cerr << "Mesh loading failed." << endl; + return false; + } + return true; +} + +template< typename MeshConfig > +void +tnlMesh< MeshConfig >:: +print( ostream& str ) const +{ + entitiesStorage.print( str ); +} + +template< typename MeshConfig > +bool +tnlMesh< MeshConfig >:: +operator==( const tnlMesh& mesh ) const +{ + return entitiesStorage.operator==( mesh.entitiesStorage ); +} + +template< typename MeshConfig > + template< typename DimensionsTag > +typename tnlMesh< MeshConfig >::template EntityTraits< DimensionsTag::value >::StorageArrayType& +tnlMesh< MeshConfig >:: +entitiesArray() +{ + return entitiesStorage.entitiesArray( DimensionsTag() ); +} + +template< typename MeshConfig > + template< typename DimensionsTag, typename SuperDimensionsTag > +typename tnlMesh< MeshConfig >::MeshTraits::GlobalIdArrayType& +tnlMesh< MeshConfig >:: +superentityIdsArray() +{ + return entitiesStorage.template superentityIdsArray< SuperDimensionsTag >( DimensionsTag() ); +} + +template< typename MeshConfig > +bool +tnlMesh< MeshConfig >:: +init( const typename tnlMesh< MeshConfig >::MeshTraits::PointArrayType& points, + const typename tnlMesh< MeshConfig >::MeshTraits::CellSeedArrayType& cellSeeds ) +{ + tnlMeshInitializer< MeshConfig> meshInitializer; + return meshInitializer.createMesh( points, cellSeeds, *this ); +} + + +template< typename MeshConfig > +std::ostream& operator <<( std::ostream& str, const tnlMesh< MeshConfig >& mesh ) +{ + mesh.print( str ); + return str; +} + +#endif /* TNLMESH_IMPL_H */ + diff --git a/src/mesh/topologies/CMakeLists.txt b/src/mesh/topologies/CMakeLists.txt index f99c65d84dc2db1c1c0201c64e255316bf91fb72..f0c8842ffa20d78ff96e1e8b6026d01f9e769302 100755 --- a/src/mesh/topologies/CMakeLists.txt +++ b/src/mesh/topologies/CMakeLists.txt @@ -1,9 +1,9 @@ -SET( headers tnlMeshEdgeTag.h +SET( headers tnlMeshEdgeTopology.h tnlMeshEntityTopology.h - tnlMeshHexahedronTag.h - tnlMeshQuadrilateralTag.h - tnlMeshTetrahedronTag.h - tnlMeshTriangleTag.h - tnlMeshVertexTag.h ) + tnlMeshHexahedronTopology.h + tnlMeshQuadrilateralTopology.h + tnlMeshTetrahedronTopology.h + tnlMeshTriangleTopology.h + tnlMeshVertexTopology.h ) INSTALL( FILES ${headers} DESTINATION include/tnl-${tnlVersion}/mesh/topologies ) \ No newline at end of file diff --git a/src/mesh/topologies/tnlMeshEdgeTag.h b/src/mesh/topologies/tnlMeshEdgeTopology.h similarity index 72% rename from src/mesh/topologies/tnlMeshEdgeTag.h rename to src/mesh/topologies/tnlMeshEdgeTopology.h index d28b1db24803f7c3569d2489ee366f4dbd9e0d0a..696bbe5d867acd13e91c48210b9951a499414293 100644 --- a/src/mesh/topologies/tnlMeshEdgeTag.h +++ b/src/mesh/topologies/tnlMeshEdgeTopology.h @@ -1,5 +1,5 @@ /*************************************************************************** - tnlMeshEdgeTag.h - description + tnlMeshEdgeTopology.h - description ------------------- begin : Feb 11, 2014 copyright : (C) 2014 by Tomas Oberhuber @@ -15,24 +15,24 @@ * * ***************************************************************************/ -#ifndef TNLMESHEDGETAG_H_ -#define TNLMESHEDGETAG_H_ +#ifndef TNLMESHEDGETOPOLOGY_H_ +#define TNLMESHEDGETOPOLOGY_H_ #include <mesh/topologies/tnlMeshEntityTopology.h> -#include <mesh/topologies/tnlMeshVertexTag.h> +#include <mesh/topologies/tnlMeshVertexTopology.h> -struct tnlMeshEdgeTag +struct tnlMeshEdgeTopology { - enum { dimensions = 1 }; + static const int dimensions = 1; }; template<> -struct tnlSubentities< tnlMeshEdgeTag, 0 > +struct tnlMeshSubtopology< tnlMeshEdgeTopology, 0 > { - typedef tnlMeshVertexTag Tag; + typedef tnlMeshVertexTopology Topology; - enum { count = 2 }; + static const int count = 2; }; -#endif /* TNLMESHEDGETAG_H_ */ +#endif /* TNLMESHEDGETOPOLOGY_H_ */ diff --git a/src/mesh/topologies/tnlMeshEntityTopology.h b/src/mesh/topologies/tnlMeshEntityTopology.h index 86db680c35ba1e1a6bec59d2c7ae164941056a89..1b1e660c0df562099d408408c4c563b18635cb2c 100644 --- a/src/mesh/topologies/tnlMeshEntityTopology.h +++ b/src/mesh/topologies/tnlMeshEntityTopology.h @@ -18,15 +18,35 @@ #ifndef TNLMESHENTITYTOPOLOGY_H_ #define TNLMESHENTITYTOPOLOGY_H_ -template< typename MeshEntityTag, +template< typename MeshEntityTopology, int SubentityDimension > -struct tnlSubentities; +struct tnlMeshSubtopology +{ +}; - -template< typename MeshEntityTag, - typename SubentityTag, +template< typename MeshEntityTopology, + typename SubentityTopology, int SubentityIndex, int SubentityVertexIndex > struct tnlSubentityVertex; + +template< typename MeshConfig, + int Dimensions > +class tnlMeshEntityTopology +{ + public: + + typedef typename tnlMeshSubtopology< typename MeshConfig::CellTopology, + Dimensions >::Topology Topology; +}; + +template< typename MeshConfig > +class tnlMeshEntityTopology< MeshConfig, + MeshConfig::CellTopology::dimensions > +{ + public: + + typedef typename MeshConfig::CellTopology Topology; +}; #endif /* TNLMESHENTITYTOPOLOGY_H_ */ diff --git a/src/mesh/topologies/tnlMeshHexahedronTag.h b/src/mesh/topologies/tnlMeshHexahedronTag.h deleted file mode 100644 index f944ff07c178dbf5d0e1066804888fad839b15d5..0000000000000000000000000000000000000000 --- a/src/mesh/topologies/tnlMeshHexahedronTag.h +++ /dev/null @@ -1,176 +0,0 @@ -/*************************************************************************** - tnlMeshHexahedronTag.h - description - ------------------- - begin : Feb 11, 2014 - copyright : (C) 2014 by Tomas Oberhuber - 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 TNLMESHHEXAHEDRONTAG_H_ -#define TNLMESHHEXAHEDRONTAG_H_ - -#include <mesh/topologies/tnlMeshQuadrilateralTag.h> - -struct tnlMeshHexahedronTag -{ - enum { dimensions = 3 }; -}; - -template<> -struct tnlSubentities< tnlMeshHexahedronTag, 0 > -{ - typedef tnlMeshVertexTag Tag; - - enum { count = 8 }; -}; - -template<> -struct tnlSubentities< tnlMeshHexahedronTag, 1 > -{ - typedef tnlMeshEdgeTag Tag; - - enum { count = 12 }; -}; - -template<> -struct tnlSubentities< tnlMeshHexahedronTag, 2 > -{ - typedef tnlMeshQuadrilateralTag Tag; - - enum { count = 6 }; -}; - -/**** - * Indexing of the vertices follows the VTK file format - * - * 7+---------------------------+6 - * /| /| - * / | / | - * / | / | - * / | / | - * 4+---------------------------+5 | - * | | | | - * | | | | - * | 3+----------------------|----+2 - * | / | / - * | / | / - * | / | / - * |/ |/ - * 0+---------------------------+1 - * - * - * The edges are indexed as follows: - * - * +---------------------------+ - * /| 10 /| - * 11/ | / | - * / | /9 | - * / 7| / |6 - * +---------------------------+ | - * | | 8 | | - * | | | | - * | +----------------------|----+ - * 4| / 2 |5 / - * | 3/ | / - * | / | /1 - * |/ |/ - * +---------------------------+ - * 0 - * - * The faces are indexed as follows (the indexed are positioned to - * the opposite corners of given face): - * - * +---------------------------+ - * /|5 3/| - * /4| /2| - * / | / | - * / | 5 / | - * +---------------------------+ | - * |1 | | | - * | |3 | | - * | +----------------------|----+ - * | / | 0/ - * | / | / - * |4/ |2/ - * |/0 1|/ - * +---------------------------+ - * - */ - -template<> struct tnlSubentityVertex< tnlMeshHexahedronTag, tnlMeshEdgeTag, 0, 0> { enum { index = 0 }; }; -template<> struct tnlSubentityVertex< tnlMeshHexahedronTag, tnlMeshEdgeTag, 0, 1> { enum { index = 1 }; }; - -template<> struct tnlSubentityVertex< tnlMeshHexahedronTag, tnlMeshEdgeTag, 1, 0> { enum { index = 1 }; }; -template<> struct tnlSubentityVertex< tnlMeshHexahedronTag, tnlMeshEdgeTag, 1, 1> { enum { index = 2 }; }; - -template<> struct tnlSubentityVertex< tnlMeshHexahedronTag, tnlMeshEdgeTag, 2, 0> { enum { index = 2 }; }; -template<> struct tnlSubentityVertex< tnlMeshHexahedronTag, tnlMeshEdgeTag, 2, 1> { enum { index = 3 }; }; - -template<> struct tnlSubentityVertex< tnlMeshHexahedronTag, tnlMeshEdgeTag, 3, 0> { enum { index = 3 }; }; -template<> struct tnlSubentityVertex< tnlMeshHexahedronTag, tnlMeshEdgeTag, 3, 1> { enum { index = 0 }; }; - -template<> struct tnlSubentityVertex< tnlMeshHexahedronTag, tnlMeshEdgeTag, 4, 0> { enum { index = 0 }; }; -template<> struct tnlSubentityVertex< tnlMeshHexahedronTag, tnlMeshEdgeTag, 4, 1> { enum { index = 4 }; }; - -template<> struct tnlSubentityVertex< tnlMeshHexahedronTag, tnlMeshEdgeTag, 5, 0> { enum { index = 1 }; }; -template<> struct tnlSubentityVertex< tnlMeshHexahedronTag, tnlMeshEdgeTag, 5, 1> { enum { index = 5 }; }; - -template<> struct tnlSubentityVertex< tnlMeshHexahedronTag, tnlMeshEdgeTag, 6, 0> { enum { index = 2 }; }; -template<> struct tnlSubentityVertex< tnlMeshHexahedronTag, tnlMeshEdgeTag, 6, 1> { enum { index = 6 }; }; - -template<> struct tnlSubentityVertex< tnlMeshHexahedronTag, tnlMeshEdgeTag, 7, 0> { enum { index = 3 }; }; -template<> struct tnlSubentityVertex< tnlMeshHexahedronTag, tnlMeshEdgeTag, 7, 1> { enum { index = 7 }; }; - -template<> struct tnlSubentityVertex< tnlMeshHexahedronTag, tnlMeshEdgeTag, 8, 0> { enum { index = 4 }; }; -template<> struct tnlSubentityVertex< tnlMeshHexahedronTag, tnlMeshEdgeTag, 8, 1> { enum { index = 5 }; }; - -template<> struct tnlSubentityVertex< tnlMeshHexahedronTag, tnlMeshEdgeTag, 9, 0> { enum { index = 5 }; }; -template<> struct tnlSubentityVertex< tnlMeshHexahedronTag, tnlMeshEdgeTag, 9, 1> { enum { index = 6 }; }; - -template<> struct tnlSubentityVertex< tnlMeshHexahedronTag, tnlMeshEdgeTag, 10, 0> { enum { index = 6 }; }; -template<> struct tnlSubentityVertex< tnlMeshHexahedronTag, tnlMeshEdgeTag, 10, 1> { enum { index = 7 }; }; - -template<> struct tnlSubentityVertex< tnlMeshHexahedronTag, tnlMeshEdgeTag, 11, 0> { enum { index = 7 }; }; -template<> struct tnlSubentityVertex< tnlMeshHexahedronTag, tnlMeshEdgeTag, 11, 1> { enum { index = 4 }; }; - - -template<> struct tnlSubentityVertex< tnlMeshHexahedronTag, tnlMeshQuadrilateralTag, 0, 0> { enum { index = 0 }; }; -template<> struct tnlSubentityVertex< tnlMeshHexahedronTag, tnlMeshQuadrilateralTag, 0, 1> { enum { index = 1 }; }; -template<> struct tnlSubentityVertex< tnlMeshHexahedronTag, tnlMeshQuadrilateralTag, 0, 2> { enum { index = 2 }; }; -template<> struct tnlSubentityVertex< tnlMeshHexahedronTag, tnlMeshQuadrilateralTag, 0, 3> { enum { index = 3 }; }; - -template<> struct tnlSubentityVertex< tnlMeshHexahedronTag, tnlMeshQuadrilateralTag, 1, 0> { enum { index = 0 }; }; -template<> struct tnlSubentityVertex< tnlMeshHexahedronTag, tnlMeshQuadrilateralTag, 1, 1> { enum { index = 1 }; }; -template<> struct tnlSubentityVertex< tnlMeshHexahedronTag, tnlMeshQuadrilateralTag, 1, 2> { enum { index = 5 }; }; -template<> struct tnlSubentityVertex< tnlMeshHexahedronTag, tnlMeshQuadrilateralTag, 1, 3> { enum { index = 4 }; }; - -template<> struct tnlSubentityVertex< tnlMeshHexahedronTag, tnlMeshQuadrilateralTag, 2, 0> { enum { index = 1 }; }; -template<> struct tnlSubentityVertex< tnlMeshHexahedronTag, tnlMeshQuadrilateralTag, 2, 1> { enum { index = 2 }; }; -template<> struct tnlSubentityVertex< tnlMeshHexahedronTag, tnlMeshQuadrilateralTag, 2, 2> { enum { index = 6 }; }; -template<> struct tnlSubentityVertex< tnlMeshHexahedronTag, tnlMeshQuadrilateralTag, 2, 3> { enum { index = 5 }; }; - -template<> struct tnlSubentityVertex< tnlMeshHexahedronTag, tnlMeshQuadrilateralTag, 3, 0> { enum { index = 2 }; }; -template<> struct tnlSubentityVertex< tnlMeshHexahedronTag, tnlMeshQuadrilateralTag, 3, 1> { enum { index = 3 }; }; -template<> struct tnlSubentityVertex< tnlMeshHexahedronTag, tnlMeshQuadrilateralTag, 3, 2> { enum { index = 7 }; }; -template<> struct tnlSubentityVertex< tnlMeshHexahedronTag, tnlMeshQuadrilateralTag, 3, 3> { enum { index = 6 }; }; - -template<> struct tnlSubentityVertex< tnlMeshHexahedronTag, tnlMeshQuadrilateralTag, 4, 0> { enum { index = 3 }; }; -template<> struct tnlSubentityVertex< tnlMeshHexahedronTag, tnlMeshQuadrilateralTag, 4, 1> { enum { index = 0 }; }; -template<> struct tnlSubentityVertex< tnlMeshHexahedronTag, tnlMeshQuadrilateralTag, 4, 2> { enum { index = 4 }; }; -template<> struct tnlSubentityVertex< tnlMeshHexahedronTag, tnlMeshQuadrilateralTag, 4, 3> { enum { index = 7 }; }; - -template<> struct tnlSubentityVertex< tnlMeshHexahedronTag, tnlMeshQuadrilateralTag, 5, 0> { enum { index = 4 }; }; -template<> struct tnlSubentityVertex< tnlMeshHexahedronTag, tnlMeshQuadrilateralTag, 5, 1> { enum { index = 5 }; }; -template<> struct tnlSubentityVertex< tnlMeshHexahedronTag, tnlMeshQuadrilateralTag, 5, 2> { enum { index = 6 }; }; -template<> struct tnlSubentityVertex< tnlMeshHexahedronTag, tnlMeshQuadrilateralTag, 5, 3> { enum { index = 7 }; }; - -#endif /* TNLMESHHEXAHEDRONTAG_H_ */ diff --git a/src/mesh/topologies/tnlMeshHexahedronTopology.h b/src/mesh/topologies/tnlMeshHexahedronTopology.h new file mode 100644 index 0000000000000000000000000000000000000000..0053a75df4e6333448e6984d84cda855a965e1be --- /dev/null +++ b/src/mesh/topologies/tnlMeshHexahedronTopology.h @@ -0,0 +1,176 @@ +/*************************************************************************** + tnlMeshHexahedronTopology.h - description + ------------------- + begin : Feb 11, 2014 + copyright : (C) 2014 by Tomas Oberhuber + 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 TNLMESHHEXAHEDRONTOPOLOGY_H_ +#define TNLMESHHEXAHEDRONTOPOLOGY_H_ + +#include <mesh/topologies/tnlMeshQuadrilateralTopology.h> + +struct tnlMeshHexahedronTopology +{ + static const int dimensions = 3; +}; + +template<> +struct tnlMeshSubtopology< tnlMeshHexahedronTopology, 0 > +{ + typedef tnlMeshVertexTopology Topology; + + static const int count = 8; +}; + +template<> +struct tnlMeshSubtopology< tnlMeshHexahedronTopology, 1 > +{ + typedef tnlMeshEdgeTopology Topology; + + static const int count = 12; +}; + +template<> +struct tnlMeshSubtopology< tnlMeshHexahedronTopology, 2 > +{ + typedef tnlMeshQuadrilateralTopology Topology; + + static const int count = 6; +}; + +/**** + * Indexing of the vertices follows the VTK file format + * + * 7+---------------------------+6 + * /| /| + * / | / | + * / | / | + * / | / | + * 4+---------------------------+5 | + * | | | | + * | | | | + * | 3+----------------------|----+2 + * | / | / + * | / | / + * | / | / + * |/ |/ + * 0+---------------------------+1 + * + * + * The edges are indexed as follows: + * + * +---------------------------+ + * /| 10 /| + * 11/ | / | + * / | /9 | + * / 7| / |6 + * +---------------------------+ | + * | | 8 | | + * | | | | + * | +----------------------|----+ + * 4| / 2 |5 / + * | 3/ | / + * | / | /1 + * |/ |/ + * +---------------------------+ + * 0 + * + * The faces are indexed as follows (the indexed are positioned to + * the opposite corners of given face): + * + * +---------------------------+ + * /|5 3/| + * /4| /2| + * / | / | + * / | 5 / | + * +---------------------------+ | + * |1 | | | + * | |3 | | + * | +----------------------|----+ + * | / | 0/ + * | / | / + * |4/ |2/ + * |/0 1|/ + * +---------------------------+ + * + */ + +template<> struct tnlSubentityVertex< tnlMeshHexahedronTopology, tnlMeshEdgeTopology, 0, 0> { enum { index = 0 }; }; +template<> struct tnlSubentityVertex< tnlMeshHexahedronTopology, tnlMeshEdgeTopology, 0, 1> { enum { index = 1 }; }; + +template<> struct tnlSubentityVertex< tnlMeshHexahedronTopology, tnlMeshEdgeTopology, 1, 0> { enum { index = 1 }; }; +template<> struct tnlSubentityVertex< tnlMeshHexahedronTopology, tnlMeshEdgeTopology, 1, 1> { enum { index = 2 }; }; + +template<> struct tnlSubentityVertex< tnlMeshHexahedronTopology, tnlMeshEdgeTopology, 2, 0> { enum { index = 2 }; }; +template<> struct tnlSubentityVertex< tnlMeshHexahedronTopology, tnlMeshEdgeTopology, 2, 1> { enum { index = 3 }; }; + +template<> struct tnlSubentityVertex< tnlMeshHexahedronTopology, tnlMeshEdgeTopology, 3, 0> { enum { index = 3 }; }; +template<> struct tnlSubentityVertex< tnlMeshHexahedronTopology, tnlMeshEdgeTopology, 3, 1> { enum { index = 0 }; }; + +template<> struct tnlSubentityVertex< tnlMeshHexahedronTopology, tnlMeshEdgeTopology, 4, 0> { enum { index = 0 }; }; +template<> struct tnlSubentityVertex< tnlMeshHexahedronTopology, tnlMeshEdgeTopology, 4, 1> { enum { index = 4 }; }; + +template<> struct tnlSubentityVertex< tnlMeshHexahedronTopology, tnlMeshEdgeTopology, 5, 0> { enum { index = 1 }; }; +template<> struct tnlSubentityVertex< tnlMeshHexahedronTopology, tnlMeshEdgeTopology, 5, 1> { enum { index = 5 }; }; + +template<> struct tnlSubentityVertex< tnlMeshHexahedronTopology, tnlMeshEdgeTopology, 6, 0> { enum { index = 2 }; }; +template<> struct tnlSubentityVertex< tnlMeshHexahedronTopology, tnlMeshEdgeTopology, 6, 1> { enum { index = 6 }; }; + +template<> struct tnlSubentityVertex< tnlMeshHexahedronTopology, tnlMeshEdgeTopology, 7, 0> { enum { index = 3 }; }; +template<> struct tnlSubentityVertex< tnlMeshHexahedronTopology, tnlMeshEdgeTopology, 7, 1> { enum { index = 7 }; }; + +template<> struct tnlSubentityVertex< tnlMeshHexahedronTopology, tnlMeshEdgeTopology, 8, 0> { enum { index = 4 }; }; +template<> struct tnlSubentityVertex< tnlMeshHexahedronTopology, tnlMeshEdgeTopology, 8, 1> { enum { index = 5 }; }; + +template<> struct tnlSubentityVertex< tnlMeshHexahedronTopology, tnlMeshEdgeTopology, 9, 0> { enum { index = 5 }; }; +template<> struct tnlSubentityVertex< tnlMeshHexahedronTopology, tnlMeshEdgeTopology, 9, 1> { enum { index = 6 }; }; + +template<> struct tnlSubentityVertex< tnlMeshHexahedronTopology, tnlMeshEdgeTopology, 10, 0> { enum { index = 6 }; }; +template<> struct tnlSubentityVertex< tnlMeshHexahedronTopology, tnlMeshEdgeTopology, 10, 1> { enum { index = 7 }; }; + +template<> struct tnlSubentityVertex< tnlMeshHexahedronTopology, tnlMeshEdgeTopology, 11, 0> { enum { index = 7 }; }; +template<> struct tnlSubentityVertex< tnlMeshHexahedronTopology, tnlMeshEdgeTopology, 11, 1> { enum { index = 4 }; }; + + +template<> struct tnlSubentityVertex< tnlMeshHexahedronTopology, tnlMeshQuadrilateralTopology, 0, 0> { enum { index = 0 }; }; +template<> struct tnlSubentityVertex< tnlMeshHexahedronTopology, tnlMeshQuadrilateralTopology, 0, 1> { enum { index = 1 }; }; +template<> struct tnlSubentityVertex< tnlMeshHexahedronTopology, tnlMeshQuadrilateralTopology, 0, 2> { enum { index = 2 }; }; +template<> struct tnlSubentityVertex< tnlMeshHexahedronTopology, tnlMeshQuadrilateralTopology, 0, 3> { enum { index = 3 }; }; + +template<> struct tnlSubentityVertex< tnlMeshHexahedronTopology, tnlMeshQuadrilateralTopology, 1, 0> { enum { index = 0 }; }; +template<> struct tnlSubentityVertex< tnlMeshHexahedronTopology, tnlMeshQuadrilateralTopology, 1, 1> { enum { index = 1 }; }; +template<> struct tnlSubentityVertex< tnlMeshHexahedronTopology, tnlMeshQuadrilateralTopology, 1, 2> { enum { index = 5 }; }; +template<> struct tnlSubentityVertex< tnlMeshHexahedronTopology, tnlMeshQuadrilateralTopology, 1, 3> { enum { index = 4 }; }; + +template<> struct tnlSubentityVertex< tnlMeshHexahedronTopology, tnlMeshQuadrilateralTopology, 2, 0> { enum { index = 1 }; }; +template<> struct tnlSubentityVertex< tnlMeshHexahedronTopology, tnlMeshQuadrilateralTopology, 2, 1> { enum { index = 2 }; }; +template<> struct tnlSubentityVertex< tnlMeshHexahedronTopology, tnlMeshQuadrilateralTopology, 2, 2> { enum { index = 6 }; }; +template<> struct tnlSubentityVertex< tnlMeshHexahedronTopology, tnlMeshQuadrilateralTopology, 2, 3> { enum { index = 5 }; }; + +template<> struct tnlSubentityVertex< tnlMeshHexahedronTopology, tnlMeshQuadrilateralTopology, 3, 0> { enum { index = 2 }; }; +template<> struct tnlSubentityVertex< tnlMeshHexahedronTopology, tnlMeshQuadrilateralTopology, 3, 1> { enum { index = 3 }; }; +template<> struct tnlSubentityVertex< tnlMeshHexahedronTopology, tnlMeshQuadrilateralTopology, 3, 2> { enum { index = 7 }; }; +template<> struct tnlSubentityVertex< tnlMeshHexahedronTopology, tnlMeshQuadrilateralTopology, 3, 3> { enum { index = 6 }; }; + +template<> struct tnlSubentityVertex< tnlMeshHexahedronTopology, tnlMeshQuadrilateralTopology, 4, 0> { enum { index = 3 }; }; +template<> struct tnlSubentityVertex< tnlMeshHexahedronTopology, tnlMeshQuadrilateralTopology, 4, 1> { enum { index = 0 }; }; +template<> struct tnlSubentityVertex< tnlMeshHexahedronTopology, tnlMeshQuadrilateralTopology, 4, 2> { enum { index = 4 }; }; +template<> struct tnlSubentityVertex< tnlMeshHexahedronTopology, tnlMeshQuadrilateralTopology, 4, 3> { enum { index = 7 }; }; + +template<> struct tnlSubentityVertex< tnlMeshHexahedronTopology, tnlMeshQuadrilateralTopology, 5, 0> { enum { index = 4 }; }; +template<> struct tnlSubentityVertex< tnlMeshHexahedronTopology, tnlMeshQuadrilateralTopology, 5, 1> { enum { index = 5 }; }; +template<> struct tnlSubentityVertex< tnlMeshHexahedronTopology, tnlMeshQuadrilateralTopology, 5, 2> { enum { index = 6 }; }; +template<> struct tnlSubentityVertex< tnlMeshHexahedronTopology, tnlMeshQuadrilateralTopology, 5, 3> { enum { index = 7 }; }; + +#endif /* TNLMESHHEXAHEDRONTOPOLOGY_H_ */ diff --git a/src/mesh/topologies/tnlMeshQuadrilateralTag.h b/src/mesh/topologies/tnlMeshQuadrilateralTopology.h similarity index 51% rename from src/mesh/topologies/tnlMeshQuadrilateralTag.h rename to src/mesh/topologies/tnlMeshQuadrilateralTopology.h index 71b5efe7d4395431aac58982ddc1ad4c79890833..7c09f35ee8e4ba0bbe05f3c7931d748070f08e5e 100644 --- a/src/mesh/topologies/tnlMeshQuadrilateralTag.h +++ b/src/mesh/topologies/tnlMeshQuadrilateralTopology.h @@ -1,5 +1,5 @@ /*************************************************************************** - tnlMeshQuadrilateralTag.h - description + tnlMeshQuadrilateralTopology.h - description ------------------- begin : Feb 11, 2014 copyright : (C) 2014 by Tomas Oberhuber @@ -15,31 +15,31 @@ * * ***************************************************************************/ -#ifndef TNLMESHQUADRILATERALTAG_H_ -#define TNLMESHQUADRILATERALTAG_H_ +#ifndef TNLMESHQUADRILATERALTOPOLOGY_H_ +#define TNLMESHQUADRILATERALTOPOLOGY_H_ -#include <mesh/topologies/tnlMeshEdgeTag.h> +#include <mesh/topologies/tnlMeshEdgeTopology.h> -struct tnlMeshQuadrilateralTag +struct tnlMeshQuadrilateralTopology { - enum { dimensions = 2 }; + static const int dimensions = 2; }; template<> -struct tnlSubentities< tnlMeshQuadrilateralTag, 0> +struct tnlMeshSubtopology< tnlMeshQuadrilateralTopology, 0 > { - typedef tnlMeshVertexTag Tag; + typedef tnlMeshVertexTopology Topology; - enum { count = 4 }; + static const int count = 4; }; template<> -struct tnlSubentities< tnlMeshQuadrilateralTag, 1> +struct tnlMeshSubtopology< tnlMeshQuadrilateralTopology, 1 > { - typedef tnlMeshEdgeTag Tag; + typedef tnlMeshEdgeTopology Topology; - enum { count = 4 }; + static const int count = 4; }; @@ -70,17 +70,17 @@ struct tnlSubentities< tnlMeshQuadrilateralTag, 1> * */ -template<> struct tnlSubentityVertex< tnlMeshQuadrilateralTag, tnlMeshEdgeTag, 0, 0> { enum { index = 0 }; }; -template<> struct tnlSubentityVertex< tnlMeshQuadrilateralTag, tnlMeshEdgeTag, 0, 1> { enum { index = 1 }; }; +template<> struct tnlSubentityVertex< tnlMeshQuadrilateralTopology, tnlMeshEdgeTopology, 0, 0> { enum { index = 0 }; }; +template<> struct tnlSubentityVertex< tnlMeshQuadrilateralTopology, tnlMeshEdgeTopology, 0, 1> { enum { index = 1 }; }; -template<> struct tnlSubentityVertex< tnlMeshQuadrilateralTag, tnlMeshEdgeTag, 1, 0> { enum { index = 1 }; }; -template<> struct tnlSubentityVertex< tnlMeshQuadrilateralTag, tnlMeshEdgeTag, 1, 1> { enum { index = 2 }; }; +template<> struct tnlSubentityVertex< tnlMeshQuadrilateralTopology, tnlMeshEdgeTopology, 1, 0> { enum { index = 1 }; }; +template<> struct tnlSubentityVertex< tnlMeshQuadrilateralTopology, tnlMeshEdgeTopology, 1, 1> { enum { index = 2 }; }; -template<> struct tnlSubentityVertex< tnlMeshQuadrilateralTag, tnlMeshEdgeTag, 2, 0> { enum { index = 2 }; }; -template<> struct tnlSubentityVertex< tnlMeshQuadrilateralTag, tnlMeshEdgeTag, 2, 1> { enum { index = 3 }; }; +template<> struct tnlSubentityVertex< tnlMeshQuadrilateralTopology, tnlMeshEdgeTopology, 2, 0> { enum { index = 2 }; }; +template<> struct tnlSubentityVertex< tnlMeshQuadrilateralTopology, tnlMeshEdgeTopology, 2, 1> { enum { index = 3 }; }; -template<> struct tnlSubentityVertex< tnlMeshQuadrilateralTag, tnlMeshEdgeTag, 3, 0> { enum { index = 3 }; }; -template<> struct tnlSubentityVertex< tnlMeshQuadrilateralTag, tnlMeshEdgeTag, 3, 1> { enum { index = 0 }; }; +template<> struct tnlSubentityVertex< tnlMeshQuadrilateralTopology, tnlMeshEdgeTopology, 3, 0> { enum { index = 3 }; }; +template<> struct tnlSubentityVertex< tnlMeshQuadrilateralTopology, tnlMeshEdgeTopology, 3, 1> { enum { index = 0 }; }; -#endif /* TNLMESHQUADRILATERALTAG_H_ */ +#endif /* TNLMESHQUADRILATERALTOPOLOGY_H_ */ diff --git a/src/mesh/topologies/tnlMeshSimplexTopology.h b/src/mesh/topologies/tnlMeshSimplexTopology.h new file mode 100644 index 0000000000000000000000000000000000000000..0089c036709de66b8df1238b51df37d989f1275b --- /dev/null +++ b/src/mesh/topologies/tnlMeshSimplexTopology.h @@ -0,0 +1,188 @@ +/*************************************************************************** + tnlMeshSimplexTopology.h - description + ------------------- + begin : Aug 29, 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 TNLMESHSIMPLEXTOPOLOGY_H +#define TNLMESHSIMPLEXTOPOLOGY_H + + +template< int dimensions_ > +class tnlMeshSimplexTopology +{ + public: + static const int dimensions = dimensions_; +}; + +template< unsigned int n, unsigned int k > +class tnlStaticNumCombinations; + +template<unsigned int n, unsigned int k, unsigned int combinationIndex, unsigned int valueIndex> +class tnlCombinationValue; + +template< int dimensions, + int subtopologyDim > +class tnlMeshSubtopology< tnlMeshSimplexTopology< dimensions >, subtopologyDim > +{ + static_assert( 0 < subtopologyDim && subtopologyDim < dim, "invalid subtopology dimension" ); + + static const int topologyVertexCount = tnlMeshSubtopology< tnlMeshSimplexTopology< dimensions >, 0 >::count; + static const int subtopologyVertexCount = tnlMeshSubtopology< tnlMeshSimplexTopology< subtopologyDim >, 0>::count; + + public: + typedef tnlMeshSimplexTopology< subtopologyDim > Topology; + + static const int count = tnlNumCombinations< topologyVertexCount, subtopologyVertexCount >::value; +}; + +template< int dimensions > +class tnlMeshSubtopology< tnlMeshSimplexTopology< dimensions >, 0 > +{ + static_assert(0 < dim, "invalid dimension"); + + public: + typedef tnlMeshVertexTopology Topology; + + static const int count = dim + 1; +}; + + +template< int dimensions, + typename Subtopology, + int subtopologyIndex, + int vertexIndex > +struct tnlSubentityVertex< tnlMeshSimplexTopology< dimensions >, Subtopology, subtopologyIndex, vertexIndex > +{ + private: + static const int subtopologyCount = Subtopology< tnlMeshSimplexTopology< dimensions >, Subtopology::dimensions >::count; + static const int topologyVertexCount = Subtopology< tnlMeshSimplex< dimensions >, 0 >::count; + static const int subtopologyVertexCount = Subtopology< Subtopology, 0 >::count; + + static_assert(1 < dimensions, "subtopology vertex can be specified for topologies of dimension 2 or higher"); + static_assert(0 <= subtopologyIndex && subtopologyIndex < subtopologyCount, "invalid subtopology index"); + static_assert(0 <= vertexIndex && vertexIndex < subtopologyVertexCount, "invalid subtopology vertex index"); + + public: + static const int index = CombinationValue< topologyVertexCount, subtopologyVertexCount, subtopologyIndex, vertexIndex>::value; +}; + +template< unsigned int n, unsigned int k > +class tnlStaticNumCombinations +{ + static_assert(0 < k && k < n, "invalid argument"); + + public: + static const unsigned int value = tnlNumCombinations< n - 1, k - 1 >::value + tnlNumCombinations< n - 1, k >::value; +}; + +// Nummber of combinations (n choose k) +template< unsigned int n > +class tnlNumCombinations< n, 0 > +{ + static_assert(0 <= n, "invalid argument"); + + public: + static const unsigned int value = 1; +}; + +template< unsigned int n > +class tnlNumCombinations< n, n > +{ + static_assert(0 < n, "invalid argument"); + + public: + static const unsigned int value = 1; +}; + +// Compile-time generation of combinations +// Combinations are generated in lexicographical order. The following example shows generation of 2-combinations from set {0, 1, 2}: +// 0, 1 <-> CombinationValue<3, 2, 0, 0>::VALUE, CombinationValue<3, 2, 0, 1>::VALUE +// 0, 2 <-> CombinationValue<3, 2, 1, 0>::VALUE, CombinationValue<3, 2, 1, 1>::VALUE +// 1, 2 <-> CombinationValue<3, 2, 2, 0>::VALUE, CombinationValue<3, 2, 2, 1>::VALUE +template< unsigned int n, + unsigned int k, + unsigned int combinationIndex > +class tnlCombinationIncrement; + +template< unsigned int n, + unsigned int k, + unsigned int combinationIndex, + unsigned int valueIndex > +class tnlCombinationValue +{ + static_assert( combinationIndex < NumCombinations< n, k >::value, "invalid combination index" ); + static_assert( valueIndex < k, "invalid value index" ); + + static const unsigned int incrementValueIndex = tnlCombinationIncrement< n, k, combinationIndex - 1>::valueIndex; + + public: + static const unsigned int value = ( valueIndex < incrementValueIndex ? tnlCombinationValue< n, k, combinationIndex - 1, valueIndex >::value : + tnlCombinationValue< n, k, combinationIndex - 1, incrementValueIndex >::value + + valueIndex - incrementValueIndex + 1); +}; + +template< unsigned int n, + unsigned int k, + unsigned int valueIndex > +class tnlCombinationValue< n, k, 0, valueIndex > +{ + static_assert( valueIndex < k, "invalid value index" ); + + static const unsigned int incrementValueIndex = tnlCombinationIncrement< n, k, 0 >::valueIndex; + + public: + static const unsigned int value = valueIndex; +}; + +// The CombinationIncrement class determines value index of the particular combination which will be incremented when generating the next combination +template< unsigned int n, + unsigned int k, + unsigned int combinationIndex, + unsigned int valueIndex > +class tnlCombinationIncrementImpl +{ + static_assert( combinationIndex < tnlNumCombinations< n, k >::value - 1, "nothing to increment" ); + + static const bool incrementPossible = ( tnlCombinationValue< n, k, combinationIndex, valueIndex >::value + k - valueIndex < n ); + + public: + static const int valueIndex = ( incrementPossible ? valueIndex : tnlCombinationIncrementImpl< n, k, combinationIndex, valueIndex - 1 >::valueIndex ); +}; + +template< unsigned int n, + unsigned int k, + unsigned int combinationIndex > +class tnlCombinationIncrementImpl< n, k, combinationIndex, 0 > +{ + static_assert( combinationIndex < tnlNumCombinations<n, k>::value - 1, "nothing to increment" ); + + public: + static const int valueIndex = 0; +}; + +template< unsigned int n, + unsigned int k, + unsigned int combinationIndex > +class tnlCombinationIncrement +{ + static_assert( combinationIndex < tnlNumCombinations< n, k >::value - 1, "nothing to increment" ); + + public: + static const unsigned int valueIndex = tnlCombinationIncrementImpl< n, k, combinationIndex, k - 1 >::valueIndex; +}; + +#endif /* TNLMESHSIMPLEXTOPOLOGY_H */ + diff --git a/src/mesh/traits/tnlStorageTraits.h b/src/mesh/topologies/tnlMeshSubtopology.h similarity index 64% rename from src/mesh/traits/tnlStorageTraits.h rename to src/mesh/topologies/tnlMeshSubtopology.h index b316a89fe6b8284746bf3f8f876822317b289bf3..f7b6affed98aa57bf50002094fbfc6ef057b5925 100644 --- a/src/mesh/traits/tnlStorageTraits.h +++ b/src/mesh/topologies/tnlMeshSubtopology.h @@ -1,8 +1,8 @@ /*************************************************************************** - tnlStorageTraits.h - description + tnlMeshSubtopology.h - description ------------------- - begin : Feb 11, 2014 - copyright : (C) 2014 by Tomas Oberhuber + begin : Aug 29, 2015 + copyright : (C) 2015 by Tomas Oberhuber et al. email : tomas.oberhuber@fjfi.cvut.cz ***************************************************************************/ @@ -15,16 +15,18 @@ * * ***************************************************************************/ -#ifndef TNLSTORAGETRAITS_H_ -#define TNLSTORAGETRAITS_H_ +#ifndef TNLMESHSUBTOPOLOGY_H +#define TNLMESHSUBTOPOLOGY_H -template< bool storageEnabled > -class tnlStorageTraits -{ - public: +template< typename Topology, + int dimensions > +class tnlMeshSubtopology; - enum { enabled = storageEnabled }; -}; +template< typename Topology, + typename Subtopology, + int subtopologyIndex, + int vertexIndex > +struct tnlMeshSubtopologyVertex; +#endif /* TNLMESHSUBTOPOLOGY_H */ -#endif /* TNLSTORAGETRAITS_H_ */ diff --git a/src/mesh/topologies/tnlMeshTetrahedronTag.h b/src/mesh/topologies/tnlMeshTetrahedronTag.h deleted file mode 100644 index da127168b01553d2e5e4c445ee710edd14304ea4..0000000000000000000000000000000000000000 --- a/src/mesh/topologies/tnlMeshTetrahedronTag.h +++ /dev/null @@ -1,89 +0,0 @@ -/*************************************************************************** - tnlMeshTetrahedronTag.h - description - ------------------- - begin : Feb 11, 2014 - copyright : (C) 2014 by Tomas Oberhuber - 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 TNLMESHTETRAHEDRONTAG_H_ -#define TNLMESHTETRAHEDRONTAG_H_ - -#include <mesh/topologies/tnlMeshTriangleTag.h> - -struct tnlMeshTetrahedronTag -{ - enum { dimensions = 3 }; -}; - -template<> -struct tnlSubentities< tnlMeshTetrahedronTag, 0 > -{ - typedef tnlMeshVertexTag Tag; - - enum { count = 4 }; -}; - -template<> -struct tnlSubentities< tnlMeshTetrahedronTag, 1 > -{ - typedef tnlMeshEdgeTag Tag; - - enum { count = 6 }; -}; - -template<> -struct tnlSubentities< tnlMeshTetrahedronTag, 2 > -{ - typedef tnlMeshTriangleTag Tag; - - enum { count = 4 }; -}; - - -template<> struct tnlSubentityVertex< tnlMeshTetrahedronTag, tnlMeshEdgeTag, 0, 0> { enum { index = 1 }; }; -template<> struct tnlSubentityVertex< tnlMeshTetrahedronTag, tnlMeshEdgeTag, 0, 1> { enum { index = 2 }; }; - -template<> struct tnlSubentityVertex< tnlMeshTetrahedronTag, tnlMeshEdgeTag, 1, 0> { enum { index = 2 }; }; -template<> struct tnlSubentityVertex< tnlMeshTetrahedronTag, tnlMeshEdgeTag, 1, 1> { enum { index = 0 }; }; - -template<> struct tnlSubentityVertex< tnlMeshTetrahedronTag, tnlMeshEdgeTag, 2, 0> { enum { index = 0 }; }; -template<> struct tnlSubentityVertex< tnlMeshTetrahedronTag, tnlMeshEdgeTag, 2, 1> { enum { index = 1 }; }; - -template<> struct tnlSubentityVertex< tnlMeshTetrahedronTag, tnlMeshEdgeTag, 3, 0> { enum { index = 0 }; }; -template<> struct tnlSubentityVertex< tnlMeshTetrahedronTag, tnlMeshEdgeTag, 3, 1> { enum { index = 3 }; }; - -template<> struct tnlSubentityVertex< tnlMeshTetrahedronTag, tnlMeshEdgeTag, 4, 0> { enum { index = 1 }; }; -template<> struct tnlSubentityVertex< tnlMeshTetrahedronTag, tnlMeshEdgeTag, 4, 1> { enum { index = 3 }; }; - -template<> struct tnlSubentityVertex< tnlMeshTetrahedronTag, tnlMeshEdgeTag, 5, 0> { enum { index = 2 }; }; -template<> struct tnlSubentityVertex< tnlMeshTetrahedronTag, tnlMeshEdgeTag, 5, 1> { enum { index = 3 }; }; - - -template<> struct tnlSubentityVertex< tnlMeshTetrahedronTag, tnlMeshTriangleTag, 0, 0> { enum { index = 0 }; }; -template<> struct tnlSubentityVertex< tnlMeshTetrahedronTag, tnlMeshTriangleTag, 0, 1> { enum { index = 1 }; }; -template<> struct tnlSubentityVertex< tnlMeshTetrahedronTag, tnlMeshTriangleTag, 0, 2> { enum { index = 2 }; }; - -template<> struct tnlSubentityVertex< tnlMeshTetrahedronTag, tnlMeshTriangleTag, 1, 0> { enum { index = 0 }; }; -template<> struct tnlSubentityVertex< tnlMeshTetrahedronTag, tnlMeshTriangleTag, 1, 1> { enum { index = 1 }; }; -template<> struct tnlSubentityVertex< tnlMeshTetrahedronTag, tnlMeshTriangleTag, 1, 2> { enum { index = 3 }; }; - -template<> struct tnlSubentityVertex< tnlMeshTetrahedronTag, tnlMeshTriangleTag, 2, 0> { enum { index = 1 }; }; -template<> struct tnlSubentityVertex< tnlMeshTetrahedronTag, tnlMeshTriangleTag, 2, 1> { enum { index = 2 }; }; -template<> struct tnlSubentityVertex< tnlMeshTetrahedronTag, tnlMeshTriangleTag, 2, 2> { enum { index = 3 }; }; - -template<> struct tnlSubentityVertex< tnlMeshTetrahedronTag, tnlMeshTriangleTag, 3, 0> { enum { index = 2 }; }; -template<> struct tnlSubentityVertex< tnlMeshTetrahedronTag, tnlMeshTriangleTag, 3, 1> { enum { index = 0 }; }; -template<> struct tnlSubentityVertex< tnlMeshTetrahedronTag, tnlMeshTriangleTag, 3, 2> { enum { index = 3 }; }; - - -#endif /* TNLMESHTETRAHEDRONTAG_H_ */ diff --git a/src/mesh/topologies/tnlMeshTetrahedronTopology.h b/src/mesh/topologies/tnlMeshTetrahedronTopology.h new file mode 100644 index 0000000000000000000000000000000000000000..c5a498d08381bd5035b2a66d3cf2014c9eb1b837 --- /dev/null +++ b/src/mesh/topologies/tnlMeshTetrahedronTopology.h @@ -0,0 +1,89 @@ +/*************************************************************************** + tnlMeshTetrahedronTopology.h - description + ------------------- + begin : Feb 11, 2014 + copyright : (C) 2014 by Tomas Oberhuber + 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 TNLMESHTETRAHEDRONTOPOLOGY_H_ +#define TNLMESHTETRAHEDRONTOPOLOGY_H_ + +#include <mesh/topologies/tnlMeshTriangleTopology.h> + +struct tnlMeshTetrahedronTopology +{ + static const int dimensions = 3; +}; + +template<> +struct tnlMeshSubtopology< tnlMeshTetrahedronTopology, 0 > +{ + typedef tnlMeshVertexTopology Topology; + + static const int count = 4; +}; + +template<> +struct tnlMeshSubtopology< tnlMeshTetrahedronTopology, 1 > +{ + typedef tnlMeshEdgeTopology Topology; + + static const int count = 6; +}; + +template<> +struct tnlMeshSubtopology< tnlMeshTetrahedronTopology, 2 > +{ + typedef tnlMeshTriangleTopology Topology; + + static const int count = 4; +}; + + +template<> struct tnlSubentityVertex< tnlMeshTetrahedronTopology, tnlMeshEdgeTopology, 0, 0> { enum { index = 1 }; }; +template<> struct tnlSubentityVertex< tnlMeshTetrahedronTopology, tnlMeshEdgeTopology, 0, 1> { enum { index = 2 }; }; + +template<> struct tnlSubentityVertex< tnlMeshTetrahedronTopology, tnlMeshEdgeTopology, 1, 0> { enum { index = 2 }; }; +template<> struct tnlSubentityVertex< tnlMeshTetrahedronTopology, tnlMeshEdgeTopology, 1, 1> { enum { index = 0 }; }; + +template<> struct tnlSubentityVertex< tnlMeshTetrahedronTopology, tnlMeshEdgeTopology, 2, 0> { enum { index = 0 }; }; +template<> struct tnlSubentityVertex< tnlMeshTetrahedronTopology, tnlMeshEdgeTopology, 2, 1> { enum { index = 1 }; }; + +template<> struct tnlSubentityVertex< tnlMeshTetrahedronTopology, tnlMeshEdgeTopology, 3, 0> { enum { index = 0 }; }; +template<> struct tnlSubentityVertex< tnlMeshTetrahedronTopology, tnlMeshEdgeTopology, 3, 1> { enum { index = 3 }; }; + +template<> struct tnlSubentityVertex< tnlMeshTetrahedronTopology, tnlMeshEdgeTopology, 4, 0> { enum { index = 1 }; }; +template<> struct tnlSubentityVertex< tnlMeshTetrahedronTopology, tnlMeshEdgeTopology, 4, 1> { enum { index = 3 }; }; + +template<> struct tnlSubentityVertex< tnlMeshTetrahedronTopology, tnlMeshEdgeTopology, 5, 0> { enum { index = 2 }; }; +template<> struct tnlSubentityVertex< tnlMeshTetrahedronTopology, tnlMeshEdgeTopology, 5, 1> { enum { index = 3 }; }; + + +template<> struct tnlSubentityVertex< tnlMeshTetrahedronTopology, tnlMeshTriangleTopology, 0, 0> { enum { index = 0 }; }; +template<> struct tnlSubentityVertex< tnlMeshTetrahedronTopology, tnlMeshTriangleTopology, 0, 1> { enum { index = 1 }; }; +template<> struct tnlSubentityVertex< tnlMeshTetrahedronTopology, tnlMeshTriangleTopology, 0, 2> { enum { index = 2 }; }; + +template<> struct tnlSubentityVertex< tnlMeshTetrahedronTopology, tnlMeshTriangleTopology, 1, 0> { enum { index = 0 }; }; +template<> struct tnlSubentityVertex< tnlMeshTetrahedronTopology, tnlMeshTriangleTopology, 1, 1> { enum { index = 1 }; }; +template<> struct tnlSubentityVertex< tnlMeshTetrahedronTopology, tnlMeshTriangleTopology, 1, 2> { enum { index = 3 }; }; + +template<> struct tnlSubentityVertex< tnlMeshTetrahedronTopology, tnlMeshTriangleTopology, 2, 0> { enum { index = 1 }; }; +template<> struct tnlSubentityVertex< tnlMeshTetrahedronTopology, tnlMeshTriangleTopology, 2, 1> { enum { index = 2 }; }; +template<> struct tnlSubentityVertex< tnlMeshTetrahedronTopology, tnlMeshTriangleTopology, 2, 2> { enum { index = 3 }; }; + +template<> struct tnlSubentityVertex< tnlMeshTetrahedronTopology, tnlMeshTriangleTopology, 3, 0> { enum { index = 2 }; }; +template<> struct tnlSubentityVertex< tnlMeshTetrahedronTopology, tnlMeshTriangleTopology, 3, 1> { enum { index = 0 }; }; +template<> struct tnlSubentityVertex< tnlMeshTetrahedronTopology, tnlMeshTriangleTopology, 3, 2> { enum { index = 3 }; }; + + +#endif /* TNLMESHTETRAHEDRONTOPOLOGY_H_ */ diff --git a/src/mesh/topologies/tnlMeshTriangleTag.h b/src/mesh/topologies/tnlMeshTriangleTag.h deleted file mode 100644 index fb629659fdf6d0757a40dcdf73dfa60c13530e2c..0000000000000000000000000000000000000000 --- a/src/mesh/topologies/tnlMeshTriangleTag.h +++ /dev/null @@ -1,56 +0,0 @@ -/*************************************************************************** - tnlMeshTriangleTag.h - description - ------------------- - begin : Feb 11, 2014 - copyright : (C) 2014 by Tomas Oberhuber - 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 TNLMESHTRIANGLETAG_H_ -#define TNLMESHTRIANGLETAG_H_ - -#include <mesh/topologies/tnlMeshEdgeTag.h> - -struct tnlMeshTriangleTag -{ - enum { dimensions = 2 }; -}; - - -template<> -struct tnlSubentities< tnlMeshTriangleTag, 0 > -{ - typedef tnlMeshVertexTag Tag; - - enum { count = 3 }; -}; - -template<> -struct tnlSubentities< tnlMeshTriangleTag, 1 > -{ - typedef tnlMeshEdgeTag Tag; - - enum { count = 3 }; -}; - - -template<> struct tnlSubentityVertex< tnlMeshTriangleTag, tnlMeshEdgeTag, 0, 0> { enum { index = 1 }; }; -template<> struct tnlSubentityVertex< tnlMeshTriangleTag, tnlMeshEdgeTag, 0, 1> { enum { index = 2 }; }; - -template<> struct tnlSubentityVertex< tnlMeshTriangleTag, tnlMeshEdgeTag, 1, 0> { enum { index = 2 }; }; -template<> struct tnlSubentityVertex< tnlMeshTriangleTag, tnlMeshEdgeTag, 1, 1> { enum { index = 0 }; }; - -template<> struct tnlSubentityVertex< tnlMeshTriangleTag, tnlMeshEdgeTag, 2, 0> { enum { index = 0 }; }; -template<> struct tnlSubentityVertex< tnlMeshTriangleTag, tnlMeshEdgeTag, 2, 1> { enum { index = 1 }; }; - - -#endif /* TNLMESHTRIANGLETAG_H_ */ diff --git a/src/mesh/topologies/tnlMeshTriangleTopology.h b/src/mesh/topologies/tnlMeshTriangleTopology.h new file mode 100644 index 0000000000000000000000000000000000000000..b80ca06373792d82db5fcb96b97bd5321594f7ca --- /dev/null +++ b/src/mesh/topologies/tnlMeshTriangleTopology.h @@ -0,0 +1,56 @@ +/*************************************************************************** + tnlMeshTriangleTopology.h - description + ------------------- + begin : Feb 11, 2014 + copyright : (C) 2014 by Tomas Oberhuber + 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 TNLMESHTRIANGLETOPOLOGY_H_ +#define TNLMESHTRIANGLETOPOLOGY_H_ + +#include <mesh/topologies/tnlMeshEdgeTopology.h> + +struct tnlMeshTriangleTopology +{ + static const int dimensions = 2; +}; + + +template<> +struct tnlMeshSubtopology< tnlMeshTriangleTopology, 0 > +{ + typedef tnlMeshVertexTopology Topology; + + static const int count = 3; +}; + +template<> +struct tnlMeshSubtopology< tnlMeshTriangleTopology, 1 > +{ + typedef tnlMeshEdgeTopology Topology; + + static const int count = 3; +}; + + +template<> struct tnlSubentityVertex< tnlMeshTriangleTopology, tnlMeshEdgeTopology, 0, 0> { enum { index = 1 }; }; +template<> struct tnlSubentityVertex< tnlMeshTriangleTopology, tnlMeshEdgeTopology, 0, 1> { enum { index = 2 }; }; + +template<> struct tnlSubentityVertex< tnlMeshTriangleTopology, tnlMeshEdgeTopology, 1, 0> { enum { index = 2 }; }; +template<> struct tnlSubentityVertex< tnlMeshTriangleTopology, tnlMeshEdgeTopology, 1, 1> { enum { index = 0 }; }; + +template<> struct tnlSubentityVertex< tnlMeshTriangleTopology, tnlMeshEdgeTopology, 2, 0> { enum { index = 0 }; }; +template<> struct tnlSubentityVertex< tnlMeshTriangleTopology, tnlMeshEdgeTopology, 2, 1> { enum { index = 1 }; }; + + +#endif /* TNLMESHTRIANGLETOPOLOGY_H_ */ diff --git a/src/mesh/topologies/tnlMeshVertexTag.h b/src/mesh/topologies/tnlMeshVertexTopology.h similarity index 80% rename from src/mesh/topologies/tnlMeshVertexTag.h rename to src/mesh/topologies/tnlMeshVertexTopology.h index 4737680768d9406cb45aabbe54cd1b8fc33aee6f..6fc81f962ca756886a94fb5061d594a494e6d690 100644 --- a/src/mesh/topologies/tnlMeshVertexTag.h +++ b/src/mesh/topologies/tnlMeshVertexTopology.h @@ -1,5 +1,5 @@ /*************************************************************************** - tnlMeshVertexTag.h - description + tnlMeshVertexTopology.h - description ------------------- begin : Feb 11, 2014 copyright : (C) 2014 by Tomas Oberhuber @@ -15,13 +15,13 @@ * * ***************************************************************************/ -#ifndef TNLMESHVERTEXTAG_H_ -#define TNLMESHVERTEXTAG_H_ +#ifndef TNLMESHVERTEXTOPOLOGY_H_ +#define TNLMESHVERTEXTOPOLOGY_H_ -struct tnlMeshVertexTag +struct tnlMeshVertexTopology { - enum { dimensions = 0 }; + static const int dimensions = 0; }; -#endif /* TNLMESHVERTEXTAG_H_ */ +#endif /* TNLMESHVERTEXTOPOLOGY_H_ */ diff --git a/src/mesh/traits/CMakeLists.txt b/src/mesh/traits/CMakeLists.txt index acf4304f70e27b7ef1e5d12175a9e8223e49aca5..48652e0c02dd57dbbd0b049fd3c24fcc8f6c693a 100755 --- a/src/mesh/traits/CMakeLists.txt +++ b/src/mesh/traits/CMakeLists.txt @@ -1,10 +1,7 @@ -SET( headers tnlDimensionsTraits.h - tnlMeshTraits.h - tnlStorageTraits.h - tnlMeshEntitiesTraits.h - tnlMeshEntitiesTag.h - tnlMeshSubentitiesTraits.h - tnlMeshSuperentitiesTraits.h +SET( headers tnlMeshTraits.h + tnlMeshEntityTraits.h + tnlMeshSubentityTraits.h + tnlMeshSuperentityTraits.h ) INSTALL( FILES ${headers} DESTINATION include/tnl-${tnlVersion}/mesh/traits ) \ No newline at end of file diff --git a/src/mesh/traits/tnlMeshEntitiesTag.h b/src/mesh/traits/tnlMeshEntitiesTag.h deleted file mode 100644 index 001d9b2fa34030a86145374bcc522258725f3ada..0000000000000000000000000000000000000000 --- a/src/mesh/traits/tnlMeshEntitiesTag.h +++ /dev/null @@ -1,44 +0,0 @@ -/*************************************************************************** - tnlMeshEntitiesTag.h - description - ------------------- - begin : Feb 13, 2014 - copyright : (C) 2014 by Tomas Oberhuber - 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 TNLMESHENTITIESTAG_H_ -#define TNLMESHENTITIESTAG_H_ - -#include <mesh/topologies/tnlMeshEntityTopology.h> -#include <mesh/traits/tnlMeshTraits.h> - -template< typename ConfigTag, - typename DimensionsTraits > -class tnlMeshEntitiesTag -{ - public: - - typedef typename tnlSubentities< typename ConfigTag::CellTag, - DimensionsTraits::value >::Tag Tag; -}; - -template< typename ConfigTag > -class tnlMeshEntitiesTag< ConfigTag, - typename tnlMeshTraits< ConfigTag >::DimensionsTraits > -{ - public: - - typedef typename ConfigTag::CellTag Tag; -}; - - -#endif /* TNLMESHENTITIESTAG_H_ */ diff --git a/src/mesh/traits/tnlMeshEntitiesTraits.h b/src/mesh/traits/tnlMeshEntitiesTraits.h deleted file mode 100644 index bc6217b57c0db47abe16e373b2f2bd1ac64912b0..0000000000000000000000000000000000000000 --- a/src/mesh/traits/tnlMeshEntitiesTraits.h +++ /dev/null @@ -1,56 +0,0 @@ -/*************************************************************************** - tnlMeshEntitiesTraits.h - description - ------------------- - begin : Feb 13, 2014 - copyright : (C) 2014 by Tomas Oberhuber - 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 TNLMESHENTITIESTRAITS_H_ -#define TNLMESHENTITIESTRAITS_H_ - -#include <core/arrays/tnlArray.h> -#include <core/arrays/tnlConstSharedArray.h> -#include <core/tnlIndexedSet.h> -#include <mesh/traits/tnlMeshEntitiesTag.h> -#include <mesh/config/tnlMeshConfigBase.h> -#include <mesh/tnlMeshEntityKey.h> - -template< typename ConfigTag, - typename DimensionsTraits > -class tnlMeshEntitiesTraits -{ - enum { storageEnabled = tnlMeshEntityStorage< ConfigTag, - DimensionsTraits::value>::enabled }; - - typedef typename ConfigTag::GlobalIndexType GlobalIndexType; - typedef typename ConfigTag::LocalIndexType LocalIndexType; - typedef typename tnlMeshEntitiesTag< ConfigTag, - DimensionsTraits >::Tag EntityTag; - typedef tnlMeshEntityKey< ConfigTag, EntityTag > Key; - - public: - - typedef EntityTag Tag; - typedef tnlMeshEntity< ConfigTag, Tag > Type; - - typedef tnlStorageTraits< storageEnabled > EntityStorageTag; - - typedef tnlArray< Type, tnlHost, GlobalIndexType > ContainerType; - typedef tnlSharedArray< Type, tnlHost, GlobalIndexType > SharedContainerType; - typedef tnlIndexedSet< Type, GlobalIndexType, Key > UniqueContainerType; - - typedef tnlConstSharedArray< Type, tnlHost, GlobalIndexType > SharedArrayType; -}; - - -#endif /* TNLMESHENTITIESTRAITS_H_ */ diff --git a/src/mesh/traits/tnlMeshEntityTraits.h b/src/mesh/traits/tnlMeshEntityTraits.h new file mode 100644 index 0000000000000000000000000000000000000000..6d5cc225cc9efe774c1f0052f199aa108e0ddb52 --- /dev/null +++ b/src/mesh/traits/tnlMeshEntityTraits.h @@ -0,0 +1,92 @@ +/*************************************************************************** + tnlMeshEntityTraits.h - description + ------------------- + begin : Feb 13, 2014 + copyright : (C) 2014 by Tomas Oberhuber + 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 TNLMESHENTITYTRAITS_H_ +#define TNLMESHENTITYTRAITS_H_ + +#include <core/vectors/tnlStaticVector.h> +#include <core/arrays/tnlArray.h> +#include <core/arrays/tnlSharedArray.h> +#include <core/arrays/tnlConstSharedArray.h> +#include <core/tnlIndexedSet.h> +#include <mesh/topologies/tnlMeshEntityTopology.h> +#include <mesh/config/tnlMeshConfigBase.h> +#include <mesh/traits/tnlMeshTraits.h> + +template< typename MeshConfig, typename EntityTopology > class tnlMeshEntity; +template< typename MeshConfig, typename EntityTopology > class tnlMeshEntitySeed; +template< typename MeshConfig, typename EntityTopology > class tnlMeshEntitySeedKey; +template< typename MeshConfig, typename EntityTopology > class tnlMeshEntityReferenceOrientation; + +template< typename MeshConfig, + typename DimensionsTag, + typename SuperDimensionsTag = tnlDimensionsTag< MeshConfig::meshDimensions > > +class tnlMeshEntityOrientationNeeded +{ + static_assert( 0 <= DimensionsTag::value && DimensionsTag::value < MeshConfig::CellTopology::dimensions, "invalid dimensions" ); + static_assert( DimensionsTag::value < SuperDimensionsTag::value && SuperDimensionsTag::value <= MeshConfig::CellTopology::dimensions, "invalid superentity dimensions"); + + typedef typename tnlMeshTraits< MeshConfig >::template EntityTraits< SuperDimensionsTag::value >::EntityTopology SuperentityTopology; + + static const bool previousSuperDimensionsValue = tnlMeshEntityOrientationNeeded< MeshConfig, DimensionsTag, typename SuperDimensionsTag::Decrement >::value; + static const bool thisSuperDimensionsValue = tnlMeshTraits< MeshConfig >::template SubentityTraits< SuperentityTopology, DimensionsTag::value >::orientationEnabled; + + public: + static const bool value = ( previousSuperDimensionsValue || thisSuperDimensionsValue ); +}; + +template< typename MeshConfig, typename DimensionsTag > +class tnlMeshEntityOrientationNeeded< MeshConfig, DimensionsTag, DimensionsTag > +{ + static_assert( 0 <= DimensionsTag::value && DimensionsTag::value <= MeshConfig::CellTopology::dimensions, "invalid dimensions" ); + + public: + static const bool value = false; +}; + + +template< typename MeshConfig, + int Dimensions > +class tnlMeshEntityTraits +{ + public: + + static const bool storageEnabled = MeshConfig::entityStorage( Dimensions ); + static const bool orientationNeeded = tnlMeshEntityOrientationNeeded< MeshConfig, tnlDimensionsTag< Dimensions > >::value; + + typedef typename MeshConfig::GlobalIndexType GlobalIndexType; + typedef typename MeshConfig::LocalIndexType LocalIndexType; + typedef typename tnlMeshEntityTopology< MeshConfig, Dimensions >::Topology EntityTopology; + + typedef tnlMeshEntity< MeshConfig, EntityTopology > EntityType; + typedef tnlMeshEntitySeed< MeshConfig, EntityTopology > SeedType; + typedef tnlMeshEntityReferenceOrientation< MeshConfig, EntityTopology > ReferenceOrientationType; + typedef tnlMeshEntitySeedKey< MeshConfig, EntityTopology > Key; + + + typedef tnlArray< EntityType, tnlHost, GlobalIndexType > StorageArrayType; + typedef tnlSharedArray< EntityType, tnlHost, GlobalIndexType > AccessArrayType; + typedef tnlIndexedSet< EntityType, GlobalIndexType, Key > UniqueContainerType; + typedef tnlIndexedSet< SeedType, GlobalIndexType, Key > SeedIndexedSetType; + typedef tnlArray< SeedType, tnlHost, GlobalIndexType > SeedArrayType; + typedef tnlArray< ReferenceOrientationType, tnlHost, GlobalIndexType > ReferenceOrientationArrayType; + + typedef tnlConstSharedArray< EntityType, tnlHost, GlobalIndexType > SharedArrayType; +}; + + +#endif /* TNLMESHENTITYTRAITS_H_ */ diff --git a/src/mesh/traits/tnlMeshSubentitiesTraits.h b/src/mesh/traits/tnlMeshSubentitiesTraits.h deleted file mode 100644 index b520d32f4a0d719878634bfa6ab4e85570cbaba5..0000000000000000000000000000000000000000 --- a/src/mesh/traits/tnlMeshSubentitiesTraits.h +++ /dev/null @@ -1,68 +0,0 @@ -/*************************************************************************** - tnlMeshSubentitiesTraits.h - description - ------------------- - begin : Feb 12, 2014 - copyright : (C) 2014 by Tomas Oberhuber - 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 TNLMESHSUBENTITIESTRAITS_H_ -#define TNLMESHSUBENTITIESTRAITS_H_ - -#include <core/arrays/tnlStaticArray.h> -#include <core/arrays/tnlSharedArray.h> -#include <mesh/tnlMeshEntity.h> -#include <mesh/config/tnlMeshConfigBase.h> -#include <mesh/topologies/tnlMeshEntityTopology.h> - -template< typename ConfigTag, - typename EntityTag, - typename DimensionsTraits > -class tnlMeshSubentitiesTraits -{ - enum { storageEnabled = tnlMeshSubentityStorage< ConfigTag, - EntityTag, - DimensionsTraits::value >::enabled }; - - typedef typename ConfigTag::GlobalIndexType GlobalIndexType; - typedef typename ConfigTag::LocalIndexType LocalIndexType; - typedef tnlSubentities< EntityTag, DimensionsTraits::value > Tag; - -public: - typedef tnlMeshEntity< ConfigTag, EntityTag > EntityType; - typedef typename Tag::Tag SubentityTag; - typedef tnlMeshEntity< ConfigTag, SubentityTag > SubentityType; - - typedef tnlStorageTraits< storageEnabled > SubentityStorageTag; - - enum { count = Tag::count }; - - typedef tnlStaticArray< count, GlobalIndexType > ContainerType; - typedef tnlSharedArray< GlobalIndexType, - tnlHost, - LocalIndexType > SharedContainerType; - typedef tnlStaticArray< count, SubentityType > SubentityContainerType; - - template< LocalIndexType subentityIndex, - LocalIndexType subentityVertexIndex > - struct Vertex - { - enum { index = tnlSubentityVertex< EntityTag, - SubentityTag, - subentityIndex, - subentityVertexIndex>::index }; - }; -}; - - - -#endif /* TNLMESHSUBENTITIESTRAITS_H_ */ diff --git a/src/mesh/traits/tnlMeshSubentityTraits.h b/src/mesh/traits/tnlMeshSubentityTraits.h new file mode 100644 index 0000000000000000000000000000000000000000..d23c19c69dde59a23afad7ebef5c5e5070dd185c --- /dev/null +++ b/src/mesh/traits/tnlMeshSubentityTraits.h @@ -0,0 +1,75 @@ +/*************************************************************************** + tnlMeshSubentityTraits.h - description + ------------------- + begin : Feb 12, 2014 + copyright : (C) 2014 by Tomas Oberhuber + 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 TNLMESHSUBENTITYTRAITS_H_ +#define TNLMESHSUBENTITYTRAITS_H_ + +#include <core/arrays/tnlStaticArray.h> +#include <core/arrays/tnlSharedArray.h> +#include <mesh/tnlMeshEntity.h> +#include <mesh/config/tnlMeshConfigBase.h> +#include <mesh/topologies/tnlMeshEntityTopology.h> + + +template< typename MeshConfig, typename EntityTopology > class tnlMeshEntityOrientation; + +template< typename MeshConfig, + typename EntityTopology, + int Dimensions > +class tnlMeshSubentityTraits +{ + public: + static const bool storageEnabled = MeshConfig::subentityStorage( EntityTopology(), Dimensions ); + static const bool orientationEnabled = MeshConfig::subentityOrientationStorage( EntityTopology(), Dimensions ); + + typedef typename MeshConfig::GlobalIndexType GlobalIndexType; + typedef typename MeshConfig::LocalIndexType LocalIndexType; + typedef tnlMeshSubtopology< EntityTopology, Dimensions > Subtopology; + typedef typename Subtopology::Topology SubentityTopology; + typedef tnlMeshEntity< MeshConfig, SubentityTopology > SubentityType; + typedef tnlMeshEntitySeed< MeshConfig, SubentityTopology > Seed; + typedef tnlMeshEntityOrientation< MeshConfig, SubentityTopology > Orientation; + + + static const int count = Subtopology::count; + + typedef tnlStaticArray< count, GlobalIndexType > StorageArrayType; + typedef tnlSharedArray< GlobalIndexType, + tnlHost, + LocalIndexType > AccessArrayType; + typedef tnlStaticArray< count, GlobalIndexType > IdArrayType; + typedef tnlStaticArray< count, SubentityType > SubentityContainerType; + typedef tnlStaticArray< count, Seed > SeedArrayType; + typedef tnlStaticArray< count, Orientation > OrientationArrayType; + typedef tnlStaticArray< count, LocalIndexType > IdPermutationArrayType; + + template< LocalIndexType subentityIndex, + LocalIndexType subentityVertexIndex > + struct Vertex + { + enum { index = tnlSubentityVertex< EntityTopology, + SubentityTopology, + subentityIndex, + subentityVertexIndex>::index }; + }; + + static_assert( EntityTopology::dimensions > Dimensions, "You try to create subentities traits where subentity dimensions are not smaller than the entity dimensions." ); +}; + + + +#endif /* TNLMESHSUBENTITYTRAITS_H_ */ diff --git a/src/mesh/traits/tnlMeshSuperentitiesTraits.h b/src/mesh/traits/tnlMeshSuperentityTraits.h similarity index 54% rename from src/mesh/traits/tnlMeshSuperentitiesTraits.h rename to src/mesh/traits/tnlMeshSuperentityTraits.h index 3946114bd57242b0d32e426d328370aa81a44b45..9195241fb2fa4a87e860e1cac77ff5c42a14b29d 100644 --- a/src/mesh/traits/tnlMeshSuperentitiesTraits.h +++ b/src/mesh/traits/tnlMeshSuperentityTraits.h @@ -1,5 +1,5 @@ /*************************************************************************** - tnlMeshSuperentitiesTraits.h - description + tnlMeshSuperentityTraits.h - description ------------------- begin : Feb 13, 2014 copyright : (C) 2014 by Tomas Oberhuber @@ -15,8 +15,8 @@ * * ***************************************************************************/ -#ifndef TNLMESHSUPERENTITIESTRAITS_H_ -#define TNLMESHSUPERENTITIESTRAITS_H_ +#ifndef TNLMESHSUPERENTITYTRAITS_H_ +#define TNLMESHSUPERENTITYTRAITS_H_ #include <core/arrays/tnlArray.h> #include <core/arrays/tnlConstSharedArray.h> @@ -24,43 +24,43 @@ #include <mesh/tnlMeshEntity.h> #include <mesh/config/tnlMeshConfigBase.h> #include <mesh/topologies/tnlMeshEntityTopology.h> -#include <mesh/traits/tnlMeshEntitiesTraits.h> +#include <mesh/traits/tnlMeshEntityTraits.h> +#include <core/multimaps/tnlEllpackIndexMultimap.h> +#include <mesh/layers/tnlMeshSuperentityAccessor.h> -template< typename ConfigTag, - typename EntityTag, - typename DimensionsTraits > -class tnlMeshSuperentitiesTraits +template< typename MeshConfig, + typename EntityTopology, + int Dimensions > +class tnlMeshSuperentityTraits { - enum { storageEnabled = tnlMeshSuperentityStorage< ConfigTag, - EntityTag, - DimensionsTraits::value >::enabled }; - - typedef typename ConfigTag::GlobalIndexType GlobalIndexType; - typedef typename ConfigTag::LocalIndexType LocalIndexType; - public: + + typedef typename MeshConfig::GlobalIndexType GlobalIndexType; + typedef typename MeshConfig::LocalIndexType LocalIndexType; - typedef tnlMeshEntity< ConfigTag, EntityTag > EntityType; - typedef typename - tnlMeshEntitiesTraits< ConfigTag, - DimensionsTraits >::Tag SuperentityTag; - typedef typename - tnlMeshEntitiesTraits< ConfigTag, - DimensionsTraits >::Type SuperentityType; - typedef tnlStorageTraits< storageEnabled > SuperentityStorageTag; + static const bool storageEnabled = MeshConfig::template superentityStorage< EntityTopology >( EntityTopology(), Dimensions ); + //typedef tnlStorageTraits< storageEnabled > SuperentityStorageTag; + typedef tnlMeshEntity< MeshConfig, EntityTopology > EntityType; + typedef tnlMeshEntityTraits< MeshConfig, Dimensions > EntityTraits; + typedef typename EntityTraits::EntityTopology SuperentityTopology; + typedef typename EntityTraits::EntityType SuperentityType; + /**** * Type of container for storing of the superentities indecis. */ - typedef tnlArray< GlobalIndexType, tnlHost, LocalIndexType > ContainerType; - + typedef tnlArray< GlobalIndexType, tnlHost, LocalIndexType > StorageArrayType; + + typedef tnlEllpackIndexMultimap< GlobalIndexType, tnlHost > StorageNetworkType; + typedef tnlMeshSuperentityAccessor< typename StorageNetworkType::ValuesAccessorType > SuperentityAccessorType; + /**** * Type for passing the superentities indecis by the getSuperentitiesIndices() * method. We introduce it because of the compatibility with the subentities * which are usually stored in static array. */ - typedef tnlSharedArray< GlobalIndexType, tnlHost, LocalIndexType > SharedContainerType; + typedef tnlSharedArray< GlobalIndexType, tnlHost, LocalIndexType > AccessArrayType; /**** * This is used by the mesh initializer. @@ -70,4 +70,4 @@ class tnlMeshSuperentitiesTraits }; -#endif /* TNLMESHSUPERENTITIESTRAITS_H_ */ +#endif /* TNLMESHSUPERENTITYTRAITS_H_ */ diff --git a/src/mesh/traits/tnlMeshTraits.h b/src/mesh/traits/tnlMeshTraits.h index f324e03c10cd2e2776cfdf911f8a615a7bc8e9d8..d33f0503b59263c6fe47e572df87ee4c74a25f08 100644 --- a/src/mesh/traits/tnlMeshTraits.h +++ b/src/mesh/traits/tnlMeshTraits.h @@ -19,24 +19,55 @@ #define TNLMESHTRAITS_H_ #include <core/vectors/tnlStaticVector.h> -#include <mesh/traits/tnlDimensionsTraits.h> +#include <core/arrays/tnlArray.h> +#include <core/arrays/tnlSharedArray.h> +#include <core/arrays/tnlConstSharedArray.h> +#include <mesh/tnlDimensionsTag.h> -template< typename ConfigTag, - typename EntityTag > -class tnlMeshEntity; +struct tnlMeshVertexTopology; +template< typename MeshConfig, typename EntityTopology > class tnlMeshEntity; +template< typename MeshConfig, typename EntityTopology > class tnlMeshEntitySeed; +template< typename MeshConfig, int Dimensions > class tnlMeshEntityTraits; +template< typename MeshConfig, typename MeshEntity, int SubDimensions > class tnlMeshSubentityTraits; +template< typename MeshConfig, typename MeshEntity, int SuperDimensions > class tnlMeshSuperentityTraits; -template< typename ConfigTag > +template< typename MeshConfig, + typename Device = tnlHost > class tnlMeshTraits { public: + + static const int meshDimensions = MeshConfig::CellTopology::dimensions; + static const int worldDimensions = MeshConfig::worldDimensions; - enum { meshDimensions = ConfigTag::CellTag::dimensions }; + typedef Device DeviceType; + typedef typename MeshConfig::GlobalIndexType GlobalIndexType; + typedef typename MeshConfig::LocalIndexType LocalIndexType; + + typedef typename MeshConfig::CellTopology CellTopology; + typedef tnlMeshEntity< MeshConfig, CellTopology > CellType; + typedef tnlMeshEntity< MeshConfig, tnlMeshVertexTopology > VertexType; + typedef tnlStaticVector< worldDimensions, typename MeshConfig::RealType > PointType; + typedef tnlMeshEntitySeed< MeshConfig, CellTopology > CellSeedType; + + typedef tnlArray< PointType, tnlHost, GlobalIndexType > PointArrayType; + typedef tnlArray< CellSeedType, tnlHost, GlobalIndexType > CellSeedArrayType; + typedef tnlArray< GlobalIndexType, tnlHost, GlobalIndexType > GlobalIdArrayType; + typedef tnlConstSharedArray< GlobalIndexType, tnlHost, LocalIndexType > IdArrayAccessorType; + typedef tnlConstSharedArray< LocalIndexType, tnlHost, LocalIndexType > IdPermutationArrayAccessorType; + + template< int Dimensions > using EntityTraits = + tnlMeshEntityTraits< MeshConfig, Dimensions >; + + template< typename EntityTopology, int SubDimensions > using SubentityTraits = + tnlMeshSubentityTraits< MeshConfig, EntityTopology, SubDimensions >; + + template< typename EntityTopology, int SuperDimensions > using SuperentityTraits = + tnlMeshSuperentityTraits< MeshConfig, EntityTopology, SuperDimensions >; + + + typedef tnlDimensionsTag< meshDimensions > DimensionsTag; - enum { worldDimensions = ConfigTag::worldDimensions }; - - typedef tnlDimensionsTraits< meshDimensions > DimensionsTraits; - typedef tnlStaticVector< worldDimensions, typename ConfigTag::RealType > PointType; - typedef tnlMeshEntity< ConfigTag, typename ConfigTag::CellTag > CellType; }; diff --git a/src/operators/diffusion/tnlExactLinearDiffusion.h b/src/operators/diffusion/tnlExactLinearDiffusion.h index 28018f0684c68958eccfb10ca897ad277ac20536..c9339d121f0e3dbd211fb3391763c92cb35f514b 100644 --- a/src/operators/diffusion/tnlExactLinearDiffusion.h +++ b/src/operators/diffusion/tnlExactLinearDiffusion.h @@ -18,14 +18,14 @@ #ifndef TNLEXACTLINEARDIFFUSION_H_ #define TNLEXACTLINEARDIFFUSION_H_ -#include <functors/tnlFunctionType.h> +#include <functors/tnlFunction.h> template< int Dimensions > class tnlExactLinearDiffusion {}; template<> -class tnlExactLinearDiffusion< 1 > +class tnlExactLinearDiffusion< 1 > : public tnlFunction< tnlAnalyticFunction > { public: @@ -45,12 +45,12 @@ class tnlExactLinearDiffusion< 1 > }; template<> -class tnlExactLinearDiffusion< 2 > +class tnlExactLinearDiffusion< 2 > : public tnlFunction< tnlAnalyticFunction > { public: enum { Dimensions = 2 }; - + static tnlString getType(); #ifdef HAVE_NOT_CXX11 @@ -65,12 +65,12 @@ class tnlExactLinearDiffusion< 2 > }; template<> -class tnlExactLinearDiffusion< 3 > +class tnlExactLinearDiffusion< 3 > : public tnlFunction< tnlAnalyticFunction > { public: enum { Dimensions = 3 }; - + static tnlString getType(); #ifdef HAVE_NOT_CXX11 @@ -84,13 +84,6 @@ class tnlExactLinearDiffusion< 3 > const Real& time = 0.0 ); }; -template< int Dimensions > -class tnlFunctionType< tnlExactLinearDiffusion< Dimensions > > -{ - public: - enum { Type = tnlAnalyticFunction }; -}; - #include <operators/diffusion/tnlExactLinearDiffusion_impl.h> #endif /* TNLEXACTLINEARDIFFUSION_H_ */ diff --git a/src/problems/tnlHeatEquationEocRhs.h b/src/problems/tnlHeatEquationEocRhs.h index df1d66481a5947b3dc76f0a470637532ddad9b88..f6fe8bea2475259c65952d4640af906422fcbd42 100644 --- a/src/problems/tnlHeatEquationEocRhs.h +++ b/src/problems/tnlHeatEquationEocRhs.h @@ -24,7 +24,7 @@ #ifndef TNLHEATEQUATIONEOCRHS_H_ #define TNLHEATEQUATIONEOCRHS_H_ -#include <functors/tnlFunctionType.h> +#include <functors/tnlFunction.h> template< typename ExactOperator, typename TestFunction > @@ -35,6 +35,9 @@ class tnlHeatEquationEocRhs typedef ExactOperator ExactOperatorType; typedef TestFunction TestFunctionType; + //static constexpr tnlFunctionType getFunctionType() { return tnlAnalyticFunction; } + enum { functionType = tnlAnalyticFunction }; + bool setup( const tnlParameterContainer& parameters, const tnlString& prefix = "" ) { @@ -59,6 +62,7 @@ class tnlHeatEquationEocRhs TestFunction testFunction; }; +/* template< typename ExactOperator, typename TestFunction > class tnlFunctionType< tnlHeatEquationEocRhs< ExactOperator, TestFunction > > @@ -67,5 +71,6 @@ class tnlFunctionType< tnlHeatEquationEocRhs< ExactOperator, TestFunction > > enum { Type = tnlAnalyticFunction }; }; +*/ #endif /* TNLHEATEQUATIONEOCRHS_H_ */ diff --git a/src/solvers/pde/tnlExplicitUpdater_impl.h b/src/solvers/pde/tnlExplicitUpdater_impl.h index 35f80644ca7f3bec21172bd3ab12819410e8f432..4b8e06fc0310f25af259f643ea4c2eb53e1bdf8b 100644 --- a/src/solvers/pde/tnlExplicitUpdater_impl.h +++ b/src/solvers/pde/tnlExplicitUpdater_impl.h @@ -18,9 +18,9 @@ #ifndef TNLEXPLICITUPDATER_IMPL_H_ #define TNLEXPLICITUPDATER_IMPL_H_ -#include <mesh/tnlTraverser_Grid1D.h> -#include <mesh/tnlTraverser_Grid2D.h> -#include <mesh/tnlTraverser_Grid3D.h> +#include <mesh/grids/tnlTraverser_Grid1D.h> +#include <mesh/grids/tnlTraverser_Grid2D.h> +#include <mesh/grids/tnlTraverser_Grid3D.h> template< typename Mesh, typename DofVector, diff --git a/src/solvers/pde/tnlLinearSystemAssembler_impl.h b/src/solvers/pde/tnlLinearSystemAssembler_impl.h index a884e636311136b1b0f56b0bdf1c3ffa492c2862..b5e59ff96bdada188d0a886a354078940160a2b0 100644 --- a/src/solvers/pde/tnlLinearSystemAssembler_impl.h +++ b/src/solvers/pde/tnlLinearSystemAssembler_impl.h @@ -18,9 +18,9 @@ #ifndef TNLLINEARSYSTEMASSEMBLER_IMPL_H_ #define TNLLINEARSYSTEMASSEMBLER_IMPL_H_ -#include <mesh/tnlTraverser_Grid1D.h> -#include <mesh/tnlTraverser_Grid2D.h> -#include <mesh/tnlTraverser_Grid3D.h> +#include <mesh/grids/tnlTraverser_Grid1D.h> +#include <mesh/grids/tnlTraverser_Grid2D.h> +#include <mesh/grids/tnlTraverser_Grid3D.h> template< typename Mesh, typename DofVector, diff --git a/src/solvers/tnlBuildConfigTags.h b/src/solvers/tnlBuildConfigTags.h index 5b094846fbe5899d9f72cb184da920f2f3bd76bc..f19daad01de69c449bf1c10cfe1102e6f8a53f64 100644 --- a/src/solvers/tnlBuildConfigTags.h +++ b/src/solvers/tnlBuildConfigTags.h @@ -1,5 +1,5 @@ /*************************************************************************** - tnlConfigTags.h - description + tnlMeshConfigs.h - description ------------------- begin : Jul 7, 2014 copyright : (C) 2014 by Tomas Oberhuber @@ -15,56 +15,56 @@ * * ***************************************************************************/ -#ifndef TNLCONFIGTAGS_H_ -#define TNLCONFIGTAGS_H_ +#ifndef TNLMeshConfigS_H_ +#define TNLMeshConfigS_H_ #include <mesh/tnlGrid.h> -class tnlDefaultBuildConfigTag{}; +class tnlDefaultBuildMeshConfig{}; /**** * All devices are enabled by default. Those which are not available * are disabled. */ -template< typename ConfigTag, typename Device > struct tnlConfigTagDevice{ enum { enabled = true }; }; +template< typename MeshConfig, typename Device > struct tnlMeshConfigDevice{ enum { enabled = true }; }; #ifndef HAVE_CUDA -template< typename ConfigTag > struct tnlConfigTagDevice< ConfigTag, tnlCuda >{ enum { enabled = false }; }; +template< typename MeshConfig > struct tnlMeshConfigDevice< MeshConfig, tnlCuda >{ enum { enabled = false }; }; #endif /**** * All real types are enabled by default. */ -template< typename ConfigTag, typename Real > struct tnlConfigTagReal{ enum { enabled = true }; }; +template< typename MeshConfig, typename Real > struct tnlMeshConfigReal{ enum { enabled = true }; }; /**** * All index types are enabled ba default. */ -template< typename ConfigTag, typename Index > struct tnlConfigTagIndex{ enum { enabled = true }; }; +template< typename MeshConfig, typename Index > struct tnlMeshConfigIndex{ enum { enabled = true }; }; /**** * The mesh type will be resolved by the tnlSolver by default. */ -template< typename ConfigTag > struct tnlConfigTagMeshResolve{ enum { enabled = true }; }; +template< typename MeshConfig > struct tnlMeshConfigMeshResolve{ enum { enabled = true }; }; /**** * 1, 2, and 3 dimensions are enabled by default */ -template< typename ConfigTag, int Dimensions > struct tnlConfigTagDimensions{ enum { enabled = false }; }; - template< typename ConfigTag > struct tnlConfigTagDimensions< ConfigTag, 1 >{ enum { enabled = true }; }; - template< typename ConfigTag > struct tnlConfigTagDimensions< ConfigTag, 2 >{ enum { enabled = true }; }; - template< typename ConfigTag > struct tnlConfigTagDimensions< ConfigTag, 3 >{ enum { enabled = true }; }; +template< typename MeshConfig, int Dimensions > struct tnlMeshConfigDimensions{ enum { enabled = false }; }; + template< typename MeshConfig > struct tnlMeshConfigDimensions< MeshConfig, 1 >{ enum { enabled = true }; }; + template< typename MeshConfig > struct tnlMeshConfigDimensions< MeshConfig, 2 >{ enum { enabled = true }; }; + template< typename MeshConfig > struct tnlMeshConfigDimensions< MeshConfig, 3 >{ enum { enabled = true }; }; /**** * Up to the exceptions enlisted below, all mesh types are disabled by default. */ -template< typename ConfigTag, typename MeshType > struct tnlConfigTagMesh{ enum { enabled = false }; }; +template< typename MeshConfig, typename MeshType > struct tnlMeshConfigMesh{ enum { enabled = false }; }; /**** * Use of tnlGrid is enabled for allowed dimensions by default. */ -template< typename ConfigTag, int Dimensions, typename Real, typename Device, typename Index > - struct tnlConfigTagMesh< ConfigTag, tnlGrid< Dimensions, Real, Device, Index > > - { enum { enabled = tnlConfigTagDimensions< ConfigTag, Dimensions >::enabled }; }; +template< typename MeshConfig, int Dimensions, typename Real, typename Device, typename Index > + struct tnlMeshConfigMesh< MeshConfig, tnlGrid< Dimensions, Real, Device, Index > > + { enum { enabled = tnlMeshConfigDimensions< MeshConfig, Dimensions >::enabled }; }; /**** * All time discretisations (explicit, semi-impicit and implicit ) are @@ -74,7 +74,7 @@ class tnlExplicitTimeDiscretisationTag{}; class tnlSemiImplicitTimeDiscretisationTag{}; class tnlImplicitTimeDiscretisationTag{}; -template< typename ConfigTag, typename TimeDiscretisation > struct tnlConfigTagTimeDiscretisation{ enum { enabled = true }; }; +template< typename MeshConfig, typename TimeDiscretisation > struct tnlMeshConfigTimeDiscretisation{ enum { enabled = true }; }; /**** * All explicit solvers are enabled by default @@ -82,7 +82,7 @@ template< typename ConfigTag, typename TimeDiscretisation > struct tnlConfigTagT class tnlExplicitEulerSolverTag{}; class tnlExplicitMersonSolverTag{}; -template< typename ConfigTag, typename ExplicitSolver > struct tnlConfigTagExplicitSolver{ enum { enabled = true }; }; +template< typename MeshConfig, typename ExplicitSolver > struct tnlMeshConfigExplicitSolver{ enum { enabled = true }; }; /**** * All semi-implicit solvers are enabled by default @@ -93,6 +93,6 @@ class tnlSemiImplicitCGSolverTag{}; class tnlSemiImplicitBICGStabSolverTag{}; class tnlSemiImplicitGMRESSolverTag{}; -template< typename ConfigTag, typename SemiImplicitSolver > struct tnlConfigTagSemiImplicitSolver{ enum { enabled = true }; }; +template< typename MeshConfig, typename SemiImplicitSolver > struct tnlMeshConfigSemiImplicitSolver{ enum { enabled = true }; }; -#endif /* TNLCONFIGTAGS_H_ */ +#endif /* TNLMeshConfigS_H_ */ diff --git a/src/solvers/tnlFastBuildConfigTag.h b/src/solvers/tnlFastBuildConfigTag.h index 119c378f315c053867a59e7fa8e26d8e9dac4fc4..fb65b13c9dc8dd35980394a2b2ba0e2d68f85c06 100644 --- a/src/solvers/tnlFastBuildConfigTag.h +++ b/src/solvers/tnlFastBuildConfigTag.h @@ -30,35 +30,35 @@ class tnlFastBuildConfig /**** * Turn off support for float and long double. */ -template<> struct tnlConfigTagReal< tnlFastBuildConfig, float > { enum { enabled = false }; }; -template<> struct tnlConfigTagReal< tnlFastBuildConfig, long double > { enum { enabled = false }; }; +template<> struct tnlMeshConfigReal< tnlFastBuildConfig, float > { enum { enabled = false }; }; +template<> struct tnlMeshConfigReal< tnlFastBuildConfig, long double > { enum { enabled = false }; }; /**** * Turn off support for short int and long int indexing. */ -template<> struct tnlConfigTagIndex< tnlFastBuildConfig, short int >{ enum { enabled = false }; }; -template<> struct tnlConfigTagIndex< tnlFastBuildConfig, long int >{ enum { enabled = false }; }; +template<> struct tnlMeshConfigIndex< tnlFastBuildConfig, short int >{ enum { enabled = false }; }; +template<> struct tnlMeshConfigIndex< tnlFastBuildConfig, long int >{ enum { enabled = false }; }; /**** * Use of tnlGrid is enabled for allowed dimensions and Real, Device and Index types. */ template< int Dimensions, typename Real, typename Device, typename Index > - struct tnlConfigTagMesh< tnlFastBuildConfig, tnlGrid< Dimensions, Real, Device, Index > > - { enum { enabled = tnlConfigTagDimensions< tnlFastBuildConfig, Dimensions >::enabled && - tnlConfigTagReal< tnlFastBuildConfig, Real >::enabled && - tnlConfigTagDevice< tnlFastBuildConfig, Device >::enabled && - tnlConfigTagIndex< tnlFastBuildConfig, Index >::enabled }; }; + struct tnlMeshConfigMesh< tnlFastBuildConfig, tnlGrid< Dimensions, Real, Device, Index > > + { enum { enabled = tnlMeshConfigDimensions< tnlFastBuildConfig, Dimensions >::enabled && + tnlMeshConfigReal< tnlFastBuildConfig, Real >::enabled && + tnlMeshConfigDevice< tnlFastBuildConfig, Device >::enabled && + tnlMeshConfigIndex< tnlFastBuildConfig, Index >::enabled }; }; /**** * Please, chose your preferred time discretisation here. */ -template<> struct tnlConfigTagTimeDiscretisation< tnlFastBuildConfig, tnlExplicitTimeDiscretisationTag >{ enum { enabled = true }; }; -template<> struct tnlConfigTagTimeDiscretisation< tnlFastBuildConfig, tnlSemiImplicitTimeDiscretisationTag >{ enum { enabled = true }; }; -template<> struct tnlConfigTagTimeDiscretisation< tnlFastBuildConfig, tnlImplicitTimeDiscretisationTag >{ enum { enabled = false }; }; +template<> struct tnlMeshConfigTimeDiscretisation< tnlFastBuildConfig, tnlExplicitTimeDiscretisationTag >{ enum { enabled = true }; }; +template<> struct tnlMeshConfigTimeDiscretisation< tnlFastBuildConfig, tnlSemiImplicitTimeDiscretisationTag >{ enum { enabled = true }; }; +template<> struct tnlMeshConfigTimeDiscretisation< tnlFastBuildConfig, tnlImplicitTimeDiscretisationTag >{ enum { enabled = false }; }; /**** * Only the Runge-Kutta-Merson solver is enabled by default. */ -template<> struct tnlConfigTagExplicitSolver< tnlFastBuildConfig, tnlExplicitEulerSolverTag >{ enum { enabled = false }; }; +template<> struct tnlMeshConfigExplicitSolver< tnlFastBuildConfig, tnlExplicitEulerSolverTag >{ enum { enabled = false }; }; #endif /* TNLFASTBUILDCONFIGTAG_H_ */ diff --git a/src/solvers/tnlMeshTypeResolver.h b/src/solvers/tnlMeshTypeResolver.h index f10b8d8ab383fdf8d0fb5000eb043f76d5e99c6d..702fab91e6bbc4dd9eafa5acdc5ed6c5e8a18d91 100644 --- a/src/solvers/tnlMeshTypeResolver.h +++ b/src/solvers/tnlMeshTypeResolver.h @@ -20,34 +20,34 @@ #include <config/tnlParameterContainer.h> -template< template< typename Real, typename Device, typename Index, typename MeshType, typename ConfigTag, typename SolverStarter > class ProblemSetter, +template< template< typename Real, typename Device, typename Index, typename MeshType, typename MeshConfig, typename SolverStarter > class ProblemSetter, typename Real, typename Device, typename Index, - typename ConfigTag, - bool ResolveMesh = tnlConfigTagMeshResolve< ConfigTag >::enabled > + typename MeshConfig, + bool ResolveMesh = tnlMeshConfigMeshResolve< MeshConfig >::enabled > class tnlMeshTypeResolver { }; -template< template< typename Real, typename Device, typename Index, typename MeshType, typename ConfigTag, typename SolverStarter > class ProblemSetter, +template< template< typename Real, typename Device, typename Index, typename MeshType, typename MeshConfig, typename SolverStarter > class ProblemSetter, typename Real, typename Device, typename Index, - typename ConfigTag > -class tnlMeshTypeResolver< ProblemSetter, Real, Device, Index, ConfigTag, false > + typename MeshConfig > +class tnlMeshTypeResolver< ProblemSetter, Real, Device, Index, MeshConfig, false > { public: static bool run( const tnlParameterContainer& parameters ); }; -template< template< typename Real, typename Device, typename Index, typename MeshType, typename ConfigTag, typename SolverStarter > class ProblemSetter, +template< template< typename Real, typename Device, typename Index, typename MeshType, typename MeshConfig, typename SolverStarter > class ProblemSetter, typename Real, typename Device, typename Index, - typename ConfigTag > -class tnlMeshTypeResolver< ProblemSetter, Real, Device, Index, ConfigTag, true > + typename MeshConfig > +class tnlMeshTypeResolver< ProblemSetter, Real, Device, Index, MeshConfig, true > { public: diff --git a/src/solvers/tnlMeshTypeResolver_impl.h b/src/solvers/tnlMeshTypeResolver_impl.h index 427fff4265038092bc344a84bcd7599a0faba6d8..a50b15df3a3eeb5351cb1447622dc426d490bba2 100644 --- a/src/solvers/tnlMeshTypeResolver_impl.h +++ b/src/solvers/tnlMeshTypeResolver_impl.h @@ -23,37 +23,37 @@ #include <mesh/tnlDummyMesh.h> #include <solvers/tnlSolverStarter.h> -template< template< typename Real, typename Device, typename Index, typename MeshType, typename ConfigTag, typename SolverStarter > class ProblemSetter, +template< template< typename Real, typename Device, typename Index, typename MeshType, typename MeshConfig, typename SolverStarter > class ProblemSetter, typename Real, typename Device, typename Index, typename MeshType, - typename ConfigTag, - bool MeshTypeSupported = tnlConfigTagMesh< ConfigTag, MeshType >::enabled > + typename MeshConfig, + bool MeshTypeSupported = tnlMeshConfigMesh< MeshConfig, MeshType >::enabled > class tnlMeshResolverTerminator{}; -template< template< typename Real, typename Device, typename Index, typename MeshType, typename ConfigTag, typename SolverStarter > class ProblemSetter, +template< template< typename Real, typename Device, typename Index, typename MeshType, typename MeshConfig, typename SolverStarter > class ProblemSetter, typename Real, typename Device, typename Index, - typename ConfigTag > -bool tnlMeshTypeResolver< ProblemSetter, Real, Device, Index, ConfigTag, false >::run( const tnlParameterContainer& parameters ) + typename MeshConfig > +bool tnlMeshTypeResolver< ProblemSetter, Real, Device, Index, MeshConfig, false >::run( const tnlParameterContainer& parameters ) { return ProblemSetter< Real, Device, Index, tnlDummyMesh< Real, Device, Index >, - ConfigTag, - tnlSolverStarter< ConfigTag > >::template run< Real, Device, Index, ConfigTag >( parameters ); + MeshConfig, + tnlSolverStarter< MeshConfig > >::template run< Real, Device, Index, MeshConfig >( parameters ); }; -template< template< typename Real, typename Device, typename Index, typename MeshType, typename ConfigTag, typename SolverStarter > class ProblemSetter, +template< template< typename Real, typename Device, typename Index, typename MeshType, typename MeshConfig, typename SolverStarter > class ProblemSetter, typename Real, typename Device, typename Index, - typename ConfigTag > -bool tnlMeshTypeResolver< ProblemSetter, Real, Device, Index, ConfigTag, true >::run( const tnlParameterContainer& parameters ) + typename MeshConfig > +bool tnlMeshTypeResolver< ProblemSetter, Real, Device, Index, MeshConfig, true >::run( const tnlParameterContainer& parameters ) { const tnlString& meshFileName = parameters.getParameter< tnlString >( "mesh" ); @@ -73,12 +73,12 @@ bool tnlMeshTypeResolver< ProblemSetter, Real, Device, Index, ConfigTag, true >: return resolveMeshDimensions( parameters, parsedMeshType ); } -template< template< typename Real, typename Device, typename Index, typename MeshType, typename ConfigTag, typename SolverStarter > class ProblemSetter, +template< template< typename Real, typename Device, typename Index, typename MeshType, typename MeshConfig, typename SolverStarter > class ProblemSetter, typename Real, typename Device, typename Index, - typename ConfigTag > -bool tnlMeshTypeResolver< ProblemSetter, Real, Device, Index, ConfigTag, true >::resolveMeshDimensions( const tnlParameterContainer& parameters, + typename MeshConfig > +bool tnlMeshTypeResolver< ProblemSetter, Real, Device, Index, MeshConfig, true >::resolveMeshDimensions( const tnlParameterContainer& parameters, const tnlList< tnlString >& parsedMeshType ) { int dimensions = atoi( parsedMeshType[ 1 ].getString() ); @@ -93,13 +93,13 @@ bool tnlMeshTypeResolver< ProblemSetter, Real, Device, Index, ConfigTag, true >: return false; } -template< template< typename Real, typename Device, typename Index, typename MeshType, typename ConfigTag, typename SolverStarter > class ProblemSetter, +template< template< typename Real, typename Device, typename Index, typename MeshType, typename MeshConfig, typename SolverStarter > class ProblemSetter, typename Real, typename Device, typename Index, - typename ConfigTag > + typename MeshConfig > template< int MeshDimensions > -bool tnlMeshTypeResolver< ProblemSetter, Real, Device, Index, ConfigTag, true >::resolveMeshRealType( const tnlParameterContainer& parameters, +bool tnlMeshTypeResolver< ProblemSetter, Real, Device, Index, MeshConfig, true >::resolveMeshRealType( const tnlParameterContainer& parameters, const tnlList< tnlString >& parsedMeshType ) { if( parsedMeshType[ 2 ] == "float" ) @@ -112,14 +112,14 @@ bool tnlMeshTypeResolver< ProblemSetter, Real, Device, Index, ConfigTag, true >: return false; } -template< template< typename Real, typename Device, typename Index, typename MeshType, typename ConfigTag, typename SolverStarter > class ProblemSetter, +template< template< typename Real, typename Device, typename Index, typename MeshType, typename MeshConfig, typename SolverStarter > class ProblemSetter, typename Real, typename Device, typename Index, - typename ConfigTag > + typename MeshConfig > template< int MeshDimensions, typename MeshRealType > -bool tnlMeshTypeResolver< ProblemSetter, Real, Device, Index, ConfigTag, 1 >::resolveMeshIndexType( const tnlParameterContainer& parameters, +bool tnlMeshTypeResolver< ProblemSetter, Real, Device, Index, MeshConfig, 1 >::resolveMeshIndexType( const tnlParameterContainer& parameters, const tnlList< tnlString >& parsedMeshType ) { if( parsedMeshType[ 4 ] == "short int" ) @@ -132,33 +132,33 @@ bool tnlMeshTypeResolver< ProblemSetter, Real, Device, Index, ConfigTag, 1 >::re return false; } -template< template< typename Real, typename Device, typename Index, typename MeshType, typename ConfigTag, typename SolverStarter > class ProblemSetter, +template< template< typename Real, typename Device, typename Index, typename MeshType, typename MeshConfig, typename SolverStarter > class ProblemSetter, typename Real, typename Device, typename Index, - typename ConfigTag > + typename MeshConfig > template< int MeshDimensions, typename MeshRealType, typename MeshIndexType > -bool tnlMeshTypeResolver< ProblemSetter, Real, Device, Index, ConfigTag, true >::resolveMeshType( const tnlParameterContainer& parameters, +bool tnlMeshTypeResolver< ProblemSetter, Real, Device, Index, MeshConfig, true >::resolveMeshType( const tnlParameterContainer& parameters, const tnlList< tnlString >& parsedMeshType ) { if( parsedMeshType[ 0 ] == "tnlGrid" ) { typedef tnlGrid< MeshDimensions, MeshRealType, Device, MeshIndexType > MeshType; - return tnlMeshResolverTerminator< ProblemSetter, Real, Device, Index, MeshType, ConfigTag >::run( parameters ); + return tnlMeshResolverTerminator< ProblemSetter, Real, Device, Index, MeshType, MeshConfig >::run( parameters ); } cerr << "Unknown mesh type " << parsedMeshType[ 0 ] << "." << endl; return false; } -template< template< typename Real, typename Device, typename Index, typename MeshType, typename ConfigTag, typename SolverStarter > class ProblemSetter, +template< template< typename Real, typename Device, typename Index, typename MeshType, typename MeshConfig, typename SolverStarter > class ProblemSetter, typename Real, typename Device, typename Index, typename MeshType, - typename ConfigTag > -class tnlMeshResolverTerminator< ProblemSetter, Real, Device, Index, MeshType, ConfigTag, false > + typename MeshConfig > +class tnlMeshResolverTerminator< ProblemSetter, Real, Device, Index, MeshType, MeshConfig, false > { public: static bool run( const tnlParameterContainer& parameters ) @@ -168,18 +168,18 @@ class tnlMeshResolverTerminator< ProblemSetter, Real, Device, Index, MeshType, C }; }; -template< template< typename Real, typename Device, typename Index, typename MeshType, typename ConfigTag, typename SolverStarter > class ProblemSetter, +template< template< typename Real, typename Device, typename Index, typename MeshType, typename MeshConfig, typename SolverStarter > class ProblemSetter, typename Real, typename Device, typename Index, typename MeshType, - typename ConfigTag > -class tnlMeshResolverTerminator< ProblemSetter, Real, Device, Index, MeshType, ConfigTag, true > + typename MeshConfig > +class tnlMeshResolverTerminator< ProblemSetter, Real, Device, Index, MeshType, MeshConfig, true > { public: static bool run( const tnlParameterContainer& parameters ) { - return ProblemSetter< Real, Device, Index, MeshType, ConfigTag, tnlSolverStarter< ConfigTag > >::run( parameters ); + return ProblemSetter< Real, Device, Index, MeshType, MeshConfig, tnlSolverStarter< MeshConfig > >::run( parameters ); } }; diff --git a/src/solvers/tnlSolver.h b/src/solvers/tnlSolver.h index 9e4040d87a48621acbe7750bb4f2164063c73c11..aeff94b70019f24eff84fa731f0c88ef96eea5e3 100644 --- a/src/solvers/tnlSolver.h +++ b/src/solvers/tnlSolver.h @@ -20,9 +20,9 @@ #include <solvers/tnlBuildConfigTags.h> -template< template< typename Real, typename Device, typename Index, typename MeshType, typename ConfigTag, typename SolverStarter > class ProblemSetter, +template< template< typename Real, typename Device, typename Index, typename MeshType, typename MeshConfig, typename SolverStarter > class ProblemSetter, template< typename ConfTag > class ProblemConfig, - typename ConfigTag = tnlDefaultBuildConfigTag > + typename MeshConfig = tnlDefaultBuildMeshConfig > class tnlSolver { public: diff --git a/src/solvers/tnlSolverConfig.h b/src/solvers/tnlSolverConfig.h index d266fa802125b33f36cd58c301bec62d5bbde270..446bb65632cb402d9836fe9e607fc1fb7887145d 100644 --- a/src/solvers/tnlSolverConfig.h +++ b/src/solvers/tnlSolverConfig.h @@ -20,7 +20,7 @@ #include <config/tnlConfigDescription.h> -template< typename ConfigTag, +template< typename MeshConfig, typename ProblemConfig > class tnlSolverConfig { diff --git a/src/solvers/tnlSolverConfig_impl.h b/src/solvers/tnlSolverConfig_impl.h index 329b0335918660845018b304f8191b543e7b302f..728de597cdac2464886583e69e9c03b86ac1ad04 100644 --- a/src/solvers/tnlSolverConfig_impl.h +++ b/src/solvers/tnlSolverConfig_impl.h @@ -24,9 +24,9 @@ #include <solvers/pde/tnlExplicitTimeStepper.h> #include <solvers/pde/tnlPDESolver.h> -template< typename ConfigTag, +template< typename MeshConfig, typename ProblemConfig > -bool tnlSolverConfig< ConfigTag, ProblemConfig >::configSetup( tnlConfigDescription& config ) +bool tnlSolverConfig< MeshConfig, ProblemConfig >::configSetup( tnlConfigDescription& config ) { typedef tnlDummyProblem< double, tnlHost, int > DummyProblem; @@ -37,11 +37,11 @@ bool tnlSolverConfig< ConfigTag, ProblemConfig >::configSetup( tnlConfigDescript config.addEntry< tnlString >( "real-type", "Precision of the floating point arithmetics.", "double" ); - if( tnlConfigTagReal< ConfigTag, float >::enabled ) + if( tnlMeshConfigReal< MeshConfig, float >::enabled ) config.addEntryEnum( "float" ); - if( tnlConfigTagReal< ConfigTag, double >::enabled ) + if( tnlMeshConfigReal< MeshConfig, double >::enabled ) config.addEntryEnum( "double" ); - if( tnlConfigTagReal< ConfigTag, long double >::enabled ) + if( tnlMeshConfigReal< MeshConfig, long double >::enabled ) config.addEntryEnum( "long-double" ); /**** @@ -50,10 +50,10 @@ bool tnlSolverConfig< ConfigTag, ProblemConfig >::configSetup( tnlConfigDescript config.addEntry< tnlString >( "device", "Device to use for the computations.", "host" ); - if( tnlConfigTagDevice< ConfigTag, tnlHost >::enabled ) + if( tnlMeshConfigDevice< MeshConfig, tnlHost >::enabled ) config.addEntryEnum( "host" ); #ifdef HAVE_CUDA - if( tnlConfigTagDevice< ConfigTag, tnlCuda >::enabled ) + if( tnlMeshConfigDevice< MeshConfig, tnlCuda >::enabled ) config.addEntryEnum( "cuda" ); #endif @@ -63,13 +63,13 @@ bool tnlSolverConfig< ConfigTag, ProblemConfig >::configSetup( tnlConfigDescript config.addEntry< tnlString >( "index-type", "Indexing type for arrays, vectors, matrices etc.", "int" ); - if( tnlConfigTagIndex< ConfigTag, short int >::enabled ) + if( tnlMeshConfigIndex< MeshConfig, short int >::enabled ) config.addEntryEnum( "short-int" ); - if( tnlConfigTagIndex< ConfigTag, int >::enabled ) + if( tnlMeshConfigIndex< MeshConfig, int >::enabled ) config.addEntryEnum( "int" ); - if( tnlConfigTagIndex< ConfigTag, long int >::enabled ) + if( tnlMeshConfigIndex< MeshConfig, long int >::enabled ) config.addEntryEnum( "long-int" ); /**** @@ -86,64 +86,64 @@ bool tnlSolverConfig< ConfigTag, ProblemConfig >::configSetup( tnlConfigDescript typedef tnlExplicitTimeStepper< DummyProblem, tnlEulerSolver > ExplicitTimeStepper; tnlPDESolver< DummyProblem, ExplicitTimeStepper >::configSetup( config ); ExplicitTimeStepper::configSetup( config ); - if( tnlConfigTagTimeDiscretisation< ConfigTag, tnlExplicitTimeDiscretisationTag >::enabled || - tnlConfigTagTimeDiscretisation< ConfigTag, tnlSemiImplicitTimeDiscretisationTag >::enabled || - tnlConfigTagTimeDiscretisation< ConfigTag, tnlImplicitTimeDiscretisationTag >::enabled ) + if( tnlMeshConfigTimeDiscretisation< MeshConfig, tnlExplicitTimeDiscretisationTag >::enabled || + tnlMeshConfigTimeDiscretisation< MeshConfig, tnlSemiImplicitTimeDiscretisationTag >::enabled || + tnlMeshConfigTimeDiscretisation< MeshConfig, tnlImplicitTimeDiscretisationTag >::enabled ) { config.addRequiredEntry< tnlString >( "time-discretisation", "Discratisation in time."); - if( tnlConfigTagTimeDiscretisation< ConfigTag, tnlExplicitTimeDiscretisationTag >::enabled ) + if( tnlMeshConfigTimeDiscretisation< MeshConfig, tnlExplicitTimeDiscretisationTag >::enabled ) config.addEntryEnum( "explicit" ); - if( tnlConfigTagTimeDiscretisation< ConfigTag, tnlSemiImplicitTimeDiscretisationTag >::enabled ) + if( tnlMeshConfigTimeDiscretisation< MeshConfig, tnlSemiImplicitTimeDiscretisationTag >::enabled ) config.addEntryEnum( "semi-implicit" ); - if( tnlConfigTagTimeDiscretisation< ConfigTag, tnlImplicitTimeDiscretisationTag >::enabled ) + if( tnlMeshConfigTimeDiscretisation< MeshConfig, tnlImplicitTimeDiscretisationTag >::enabled ) config.addEntryEnum( "implicit" ); } config.addRequiredEntry< tnlString >( "discrete-solver", "The solver of the discretised problem:" ); - if( tnlConfigTagTimeDiscretisation< ConfigTag, tnlExplicitTimeDiscretisationTag >::enabled ) + if( tnlMeshConfigTimeDiscretisation< MeshConfig, tnlExplicitTimeDiscretisationTag >::enabled ) { - if( tnlConfigTagExplicitSolver< ConfigTag, tnlExplicitEulerSolverTag >::enabled ) + if( tnlMeshConfigExplicitSolver< MeshConfig, tnlExplicitEulerSolverTag >::enabled ) config.addEntryEnum( "euler" ); - if( tnlConfigTagExplicitSolver< ConfigTag, tnlExplicitMersonSolverTag >::enabled ) + if( tnlMeshConfigExplicitSolver< MeshConfig, tnlExplicitMersonSolverTag >::enabled ) config.addEntryEnum( "merson" ); } - if( tnlConfigTagTimeDiscretisation< ConfigTag, tnlSemiImplicitTimeDiscretisationTag >::enabled ) + if( tnlMeshConfigTimeDiscretisation< MeshConfig, tnlSemiImplicitTimeDiscretisationTag >::enabled ) { - if( tnlConfigTagSemiImplicitSolver< ConfigTag, tnlSemiImplicitCGSolverTag >::enabled ) + if( tnlMeshConfigSemiImplicitSolver< MeshConfig, tnlSemiImplicitCGSolverTag >::enabled ) config.addEntryEnum( "cg" ); - if( tnlConfigTagSemiImplicitSolver< ConfigTag, tnlSemiImplicitBICGStabSolverTag >::enabled ) + if( tnlMeshConfigSemiImplicitSolver< MeshConfig, tnlSemiImplicitBICGStabSolverTag >::enabled ) config.addEntryEnum( "bicgstab" ); - if( tnlConfigTagSemiImplicitSolver< ConfigTag, tnlSemiImplicitGMRESSolverTag >::enabled ) + if( tnlMeshConfigSemiImplicitSolver< MeshConfig, tnlSemiImplicitGMRESSolverTag >::enabled ) config.addEntryEnum( "gmres" ); - if( tnlConfigTagSemiImplicitSolver< ConfigTag, tnlSemiImplicitSORSolverTag >::enabled ) + if( tnlMeshConfigSemiImplicitSolver< MeshConfig, tnlSemiImplicitSORSolverTag >::enabled ) config.addEntryEnum( "sor" ); } - if( tnlConfigTagTimeDiscretisation< ConfigTag, tnlExplicitTimeDiscretisationTag >::enabled || - tnlConfigTagTimeDiscretisation< ConfigTag, tnlSemiImplicitTimeDiscretisationTag >::enabled ) + if( tnlMeshConfigTimeDiscretisation< MeshConfig, tnlExplicitTimeDiscretisationTag >::enabled || + tnlMeshConfigTimeDiscretisation< MeshConfig, tnlSemiImplicitTimeDiscretisationTag >::enabled ) { config.addDelimiter( " === Iterative solvers parameters === " ); tnlIterativeSolver< double, int >::configSetup( config ); } - if( tnlConfigTagTimeDiscretisation< ConfigTag, tnlExplicitTimeDiscretisationTag >::enabled ) + if( tnlMeshConfigTimeDiscretisation< MeshConfig, tnlExplicitTimeDiscretisationTag >::enabled ) { config.addDelimiter( " === Explicit solvers parameters === " ); tnlExplicitSolver< tnlDummyProblem< double, tnlHost, int > >::configSetup( config ); - if( tnlConfigTagExplicitSolver< ConfigTag, tnlExplicitEulerSolverTag >::enabled ) + if( tnlMeshConfigExplicitSolver< MeshConfig, tnlExplicitEulerSolverTag >::enabled ) tnlEulerSolver< tnlDummyProblem< double, tnlHost, int > >::configSetup( config ); - if( tnlConfigTagExplicitSolver< ConfigTag, tnlExplicitMersonSolverTag >::enabled ) + if( tnlMeshConfigExplicitSolver< MeshConfig, tnlExplicitMersonSolverTag >::enabled ) tnlMersonSolver< tnlDummyProblem< double, tnlHost, int > >::configSetup( config ); } - if( tnlConfigTagTimeDiscretisation< ConfigTag, tnlSemiImplicitTimeDiscretisationTag >::enabled ) + if( tnlMeshConfigTimeDiscretisation< MeshConfig, tnlSemiImplicitTimeDiscretisationTag >::enabled ) { config.addDelimiter( " === Semi-implicit solvers parameters === " ); typedef tnlCSRMatrix< double, tnlHost, int > MatrixType; - if( tnlConfigTagSemiImplicitSolver< ConfigTag, tnlSemiImplicitCGSolverTag >::enabled ) + if( tnlMeshConfigSemiImplicitSolver< MeshConfig, tnlSemiImplicitCGSolverTag >::enabled ) tnlCGSolver< MatrixType >::configSetup( config ); - if( tnlConfigTagSemiImplicitSolver< ConfigTag, tnlSemiImplicitBICGStabSolverTag >::enabled ) + if( tnlMeshConfigSemiImplicitSolver< MeshConfig, tnlSemiImplicitBICGStabSolverTag >::enabled ) tnlBICGStabSolver< MatrixType >::configSetup( config ); - if( tnlConfigTagSemiImplicitSolver< ConfigTag, tnlSemiImplicitGMRESSolverTag >::enabled ) + if( tnlMeshConfigSemiImplicitSolver< MeshConfig, tnlSemiImplicitGMRESSolverTag >::enabled ) tnlGMRESSolver< MatrixType >::configSetup( config ); - if( tnlConfigTagSemiImplicitSolver< ConfigTag, tnlSemiImplicitSORSolverTag >::enabled ) + if( tnlMeshConfigSemiImplicitSolver< MeshConfig, tnlSemiImplicitSORSolverTag >::enabled ) tnlSORSolver< MatrixType >::configSetup( config ); } diff --git a/src/solvers/tnlSolverInitiator.h b/src/solvers/tnlSolverInitiator.h index 525d304c9d2bfea36396c2b0e35cbfae65903527..5cad3ee8150864a21a8b27d5bcd6f394de168514 100644 --- a/src/solvers/tnlSolverInitiator.h +++ b/src/solvers/tnlSolverInitiator.h @@ -22,8 +22,8 @@ #include <config/tnlParameterContainer.h> #include <solvers/tnlBuildConfigTags.h> -template< template< typename Real, typename Device, typename Index, typename MeshType, typename ConfigTag, typename SolverStarter > class ProblemSetter, - typename ConfigTag > +template< template< typename Real, typename Device, typename Index, typename MeshType, typename MeshConfig, typename SolverStarter > class ProblemSetter, + typename MeshConfig > class tnlSolverInitiator : public tnlObject { public: diff --git a/src/solvers/tnlSolverInitiator_impl.h b/src/solvers/tnlSolverInitiator_impl.h index 0876bd27527879a2a9cf4faaa071fc5f5bfa90df..634336602fc9e3f41638c7f50639e58a8b177ea8 100644 --- a/src/solvers/tnlSolverInitiator_impl.h +++ b/src/solvers/tnlSolverInitiator_impl.h @@ -25,48 +25,48 @@ #include <core/tnlHost.h> #include <core/tnlCuda.h> -template< template< typename Real, typename Device, typename Index, typename MeshType, typename ConfigTag, typename SolverStarter > class ProblemSetter, +template< template< typename Real, typename Device, typename Index, typename MeshType, typename MeshConfig, typename SolverStarter > class ProblemSetter, typename Real, - typename ConfigTag, - bool enabled = tnlConfigTagReal< ConfigTag, Real >::enabled > + typename MeshConfig, + bool enabled = tnlMeshConfigReal< MeshConfig, Real >::enabled > class tnlSolverInitiatorRealResolver{}; -template< template< typename Real, typename Device, typename Index, typename MeshType, typename ConfigTag, typename SolverStarter > class ProblemSetter, +template< template< typename Real, typename Device, typename Index, typename MeshType, typename MeshConfig, typename SolverStarter > class ProblemSetter, typename Real, typename Device, - typename ConfigTag, - bool enabled = tnlConfigTagDevice< ConfigTag, Device >::enabled > + typename MeshConfig, + bool enabled = tnlMeshConfigDevice< MeshConfig, Device >::enabled > class tnlSolverInitiatorDeviceResolver{}; -template< template< typename Real, typename Device, typename Index, typename MeshType, typename ConfigTag, typename SolverStarter > class ProblemSetter, +template< template< typename Real, typename Device, typename Index, typename MeshType, typename MeshConfig, typename SolverStarter > class ProblemSetter, typename Real, typename Device, typename Index, - typename ConfigTag, - bool enabled = tnlConfigTagIndex< ConfigTag, Index >::enabled > + typename MeshConfig, + bool enabled = tnlMeshConfigIndex< MeshConfig, Index >::enabled > class tnlSolverInitiatorIndexResolver{}; -template< template< typename Real, typename Device, typename Index, typename MeshType, typename ConfigTag, typename SolverStarter > class ProblemSetter, - typename ConfigTag > -bool tnlSolverInitiator< ProblemSetter, ConfigTag > :: run( const tnlParameterContainer& parameters ) +template< template< typename Real, typename Device, typename Index, typename MeshType, typename MeshConfig, typename SolverStarter > class ProblemSetter, + typename MeshConfig > +bool tnlSolverInitiator< ProblemSetter, MeshConfig > :: run( const tnlParameterContainer& parameters ) { const tnlString& realType = parameters. getParameter< tnlString >( "real-type" ); if( parameters. getParameter< int >( "verbose" ) ) cout << "Setting RealType to ... " << realType << endl; if( realType == "float" ) - return tnlSolverInitiatorRealResolver< ProblemSetter, float, ConfigTag >::run( parameters ); + return tnlSolverInitiatorRealResolver< ProblemSetter, float, MeshConfig >::run( parameters ); if( realType == "double" ) - return tnlSolverInitiatorRealResolver< ProblemSetter, double, ConfigTag >::run( parameters ); + return tnlSolverInitiatorRealResolver< ProblemSetter, double, MeshConfig >::run( parameters ); if( realType == "long-double" ) - return tnlSolverInitiatorRealResolver< ProblemSetter, long double, ConfigTag >::run( parameters ); + return tnlSolverInitiatorRealResolver< ProblemSetter, long double, MeshConfig >::run( parameters ); cerr << "The real type '" << realType << "' is not defined. " << endl; return false; }; -template< template< typename Real, typename Device, typename Index, typename MeshType, typename ConfigTag, typename SolverStarter > class ProblemSetter, +template< template< typename Real, typename Device, typename Index, typename MeshType, typename MeshConfig, typename SolverStarter > class ProblemSetter, typename Real, - typename ConfigTag > -class tnlSolverInitiatorRealResolver< ProblemSetter, Real, ConfigTag, true > + typename MeshConfig > +class tnlSolverInitiatorRealResolver< ProblemSetter, Real, MeshConfig, true > { public: static bool run( const tnlParameterContainer& parameters ) @@ -76,18 +76,18 @@ class tnlSolverInitiatorRealResolver< ProblemSetter, Real, ConfigTag, true > cout << "Setting DeviceType to ... " << device << endl; if( device == "host" ) - return tnlSolverInitiatorDeviceResolver< ProblemSetter, Real, tnlHost, ConfigTag >::run( parameters ); + return tnlSolverInitiatorDeviceResolver< ProblemSetter, Real, tnlHost, MeshConfig >::run( parameters ); if( device == "cuda" ) - return tnlSolverInitiatorDeviceResolver< ProblemSetter, Real, tnlCuda, ConfigTag >::run( parameters ); + return tnlSolverInitiatorDeviceResolver< ProblemSetter, Real, tnlCuda, MeshConfig >::run( parameters ); cerr << "The device '" << device << "' is not defined. " << endl; return false; } }; -template< template< typename Real, typename Device, typename Index, typename MeshType, typename ConfigTag, typename SolverStarter > class ProblemSetter, +template< template< typename Real, typename Device, typename Index, typename MeshType, typename MeshConfig, typename SolverStarter > class ProblemSetter, typename Real, - typename ConfigTag > -class tnlSolverInitiatorRealResolver< ProblemSetter, Real, ConfigTag, false > + typename MeshConfig > +class tnlSolverInitiatorRealResolver< ProblemSetter, Real, MeshConfig, false > { public: static bool run( const tnlParameterContainer& parameters ) @@ -97,11 +97,11 @@ class tnlSolverInitiatorRealResolver< ProblemSetter, Real, ConfigTag, false > } }; -template< template< typename Real, typename Device, typename Index, typename MeshType, typename ConfigTag, typename SolverStarter > class ProblemSetter, +template< template< typename Real, typename Device, typename Index, typename MeshType, typename MeshConfig, typename SolverStarter > class ProblemSetter, typename Real, typename Device, - typename ConfigTag > -class tnlSolverInitiatorDeviceResolver< ProblemSetter, Real, Device, ConfigTag, true > + typename MeshConfig > +class tnlSolverInitiatorDeviceResolver< ProblemSetter, Real, Device, MeshConfig, true > { public: static bool run( const tnlParameterContainer& parameters ) @@ -110,21 +110,21 @@ class tnlSolverInitiatorDeviceResolver< ProblemSetter, Real, Device, ConfigTag, if( parameters. getParameter< int >( "verbose" ) ) cout << "Setting IndexType to ... " << indexType << endl; if( indexType == "short-int" ) - return tnlSolverInitiatorIndexResolver< ProblemSetter, Real, Device, short int, ConfigTag >::run( parameters ); + return tnlSolverInitiatorIndexResolver< ProblemSetter, Real, Device, short int, MeshConfig >::run( parameters ); if( indexType == "int" ) - return tnlSolverInitiatorIndexResolver< ProblemSetter, Real, Device, int, ConfigTag >::run( parameters ); + return tnlSolverInitiatorIndexResolver< ProblemSetter, Real, Device, int, MeshConfig >::run( parameters ); if( indexType == "long int" ) - return tnlSolverInitiatorIndexResolver< ProblemSetter, Real, Device, long int, ConfigTag >::run( parameters ); + return tnlSolverInitiatorIndexResolver< ProblemSetter, Real, Device, long int, MeshConfig >::run( parameters ); cerr << "The index type '" << indexType << "' is not defined. " << endl; return false; } }; -template< template< typename Real, typename Device, typename Index, typename MeshType, typename ConfigTag, typename SolverStarter > class ProblemSetter, +template< template< typename Real, typename Device, typename Index, typename MeshType, typename MeshConfig, typename SolverStarter > class ProblemSetter, typename Real, typename Device, - typename ConfigTag > -class tnlSolverInitiatorDeviceResolver< ProblemSetter, Real, Device, ConfigTag, false > + typename MeshConfig > +class tnlSolverInitiatorDeviceResolver< ProblemSetter, Real, Device, MeshConfig, false > { public: static bool run( const tnlParameterContainer& parameters ) @@ -134,12 +134,12 @@ class tnlSolverInitiatorDeviceResolver< ProblemSetter, Real, Device, ConfigTag, } }; -template< template< typename Real, typename Device, typename Index, typename MeshType, typename ConfigTag, typename SolverStarter > class ProblemSetter, +template< template< typename Real, typename Device, typename Index, typename MeshType, typename MeshConfig, typename SolverStarter > class ProblemSetter, typename Real, typename Device, typename Index, - typename ConfigTag > -class tnlSolverInitiatorIndexResolver< ProblemSetter, Real, Device, Index, ConfigTag, false > + typename MeshConfig > +class tnlSolverInitiatorIndexResolver< ProblemSetter, Real, Device, Index, MeshConfig, false > { public: static bool run( const tnlParameterContainer& parameters ) @@ -149,17 +149,17 @@ class tnlSolverInitiatorIndexResolver< ProblemSetter, Real, Device, Index, Confi } }; -template< template< typename Real, typename Device, typename Index, typename MeshType, typename ConfigTag, typename SolverStarter > class ProblemSetter, +template< template< typename Real, typename Device, typename Index, typename MeshType, typename MeshConfig, typename SolverStarter > class ProblemSetter, typename Real, typename Device, typename Index, - typename ConfigTag > -class tnlSolverInitiatorIndexResolver< ProblemSetter, Real, Device, Index, ConfigTag, true > + typename MeshConfig > +class tnlSolverInitiatorIndexResolver< ProblemSetter, Real, Device, Index, MeshConfig, true > { public: static bool run( const tnlParameterContainer& parameters ) { - return tnlMeshTypeResolver< ProblemSetter, Real, Device, Index, ConfigTag >::run( parameters ); + return tnlMeshTypeResolver< ProblemSetter, Real, Device, Index, MeshConfig >::run( parameters ); } }; diff --git a/src/solvers/tnlSolverStarter.h b/src/solvers/tnlSolverStarter.h index a2f604bedc3b21d29e34b58d967b5708ee354abb..7b9bc2d8f3757487ac9f479ac274ab18ddef4ddd 100644 --- a/src/solvers/tnlSolverStarter.h +++ b/src/solvers/tnlSolverStarter.h @@ -23,7 +23,7 @@ #include <core/tnlTimerCPU.h> #include <ostream> -template< typename ConfigTag > +template< typename MeshConfig > class tnlSolverStarter { public: diff --git a/src/solvers/tnlSolverStarter_impl.h b/src/solvers/tnlSolverStarter_impl.h index 140465d5c7cb4f44e0a62b378e193f22e6d165cf..7a2728e1aa3aba5ad730cf275c41cd9ecb0cf532 100644 --- a/src/solvers/tnlSolverStarter_impl.h +++ b/src/solvers/tnlSolverStarter_impl.h @@ -34,49 +34,49 @@ #include <solvers/ode/tnlODESolverMonitor.h> template< typename Problem, - typename ConfigTag, + typename MeshConfig, typename TimeStepper = typename Problem::TimeStepper > class tnlUserDefinedTimeDiscretisationSetter; template< typename Problem, typename TimeDiscretisation, - typename ConfigTag, - bool enabled = tnlConfigTagTimeDiscretisation< ConfigTag, TimeDiscretisation >::enabled > + typename MeshConfig, + bool enabled = tnlMeshConfigTimeDiscretisation< MeshConfig, TimeDiscretisation >::enabled > class tnlSolverStarterTimeDiscretisationSetter{}; template< typename Problem, typename ExplicitSolver, - typename ConfigTag, - bool enabled = tnlConfigTagExplicitSolver< ConfigTag, ExplicitSolver >::enabled > + typename MeshConfig, + bool enabled = tnlMeshConfigExplicitSolver< MeshConfig, ExplicitSolver >::enabled > class tnlSolverStarterExplicitSolverSetter{}; template< typename Problem, typename SemiImplicitSolver, - typename ConfigTag, - bool enabled = tnlConfigTagSemiImplicitSolver< ConfigTag, SemiImplicitSolver >::enabled > + typename MeshConfig, + bool enabled = tnlMeshConfigSemiImplicitSolver< MeshConfig, SemiImplicitSolver >::enabled > class tnlSolverStarterSemiImplicitSolverSetter{}; template< typename Problem, typename ExplicitSolver, typename TimeStepper, - typename ConfigTag > + typename MeshConfig > class tnlSolverStarterExplicitTimeStepperSetter; template< typename Problem, typename TimeStepper, - typename ConfigTag > + typename MeshConfig > class tnlSolverStarterSemiImplicitTimeStepperSetter; -template< typename ConfigTag > -tnlSolverStarter< ConfigTag > :: tnlSolverStarter() +template< typename MeshConfig > +tnlSolverStarter< MeshConfig > :: tnlSolverStarter() : logWidth( 80 ) { } -template< typename ConfigTag > +template< typename MeshConfig > template< typename Problem > -bool tnlSolverStarter< ConfigTag > :: run( const tnlParameterContainer& parameters ) +bool tnlSolverStarter< MeshConfig > :: run( const tnlParameterContainer& parameters ) { /**** * Create and set-up the problem @@ -88,11 +88,11 @@ bool tnlSolverStarter< ConfigTag > :: run( const tnlParameterContainer& paramete return false; } - return tnlUserDefinedTimeDiscretisationSetter< Problem, ConfigTag >::run( problem, parameters ); + return tnlUserDefinedTimeDiscretisationSetter< Problem, MeshConfig >::run( problem, parameters ); } template< typename Problem, - typename ConfigTag, + typename MeshConfig, typename TimeStepper > class tnlUserDefinedTimeDiscretisationSetter { @@ -106,14 +106,14 @@ class tnlUserDefinedTimeDiscretisationSetter cerr << "The time stepper initiation failed!" << endl; return false; } - tnlSolverStarter< ConfigTag > solverStarter; + tnlSolverStarter< MeshConfig > solverStarter; return solverStarter.template runPDESolver< Problem, TimeStepper >( problem, parameters, timeStepper ); } }; template< typename Problem, - typename ConfigTag > -class tnlUserDefinedTimeDiscretisationSetter< Problem, ConfigTag, void > + typename MeshConfig > +class tnlUserDefinedTimeDiscretisationSetter< Problem, MeshConfig, void > { public: static bool run( Problem& problem, @@ -124,11 +124,11 @@ class tnlUserDefinedTimeDiscretisationSetter< Problem, ConfigTag, void > */ const tnlString& timeDiscretisation = parameters. getParameter< tnlString>( "time-discretisation" ); if( timeDiscretisation == "explicit" ) - return tnlSolverStarterTimeDiscretisationSetter< Problem, tnlExplicitTimeDiscretisationTag, ConfigTag >::run( problem, parameters ); + return tnlSolverStarterTimeDiscretisationSetter< Problem, tnlExplicitTimeDiscretisationTag, MeshConfig >::run( problem, parameters ); if( timeDiscretisation == "semi-implicit" ) - return tnlSolverStarterTimeDiscretisationSetter< Problem, tnlSemiImplicitTimeDiscretisationTag, ConfigTag >::run( problem, parameters ); + return tnlSolverStarterTimeDiscretisationSetter< Problem, tnlSemiImplicitTimeDiscretisationTag, MeshConfig >::run( problem, parameters ); if( timeDiscretisation == "implicit" ) - return tnlSolverStarterTimeDiscretisationSetter< Problem, tnlImplicitTimeDiscretisationTag, ConfigTag >::run( problem, parameters ); + return tnlSolverStarterTimeDiscretisationSetter< Problem, tnlImplicitTimeDiscretisationTag, MeshConfig >::run( problem, parameters ); cerr << "Uknown time discretisation: " << timeDiscretisation << "." << endl; return false; } @@ -140,8 +140,8 @@ class tnlUserDefinedTimeDiscretisationSetter< Problem, ConfigTag, void > template< typename Problem, typename TimeDiscretisation, - typename ConfigTag > -class tnlSolverStarterTimeDiscretisationSetter< Problem, TimeDiscretisation, ConfigTag, false > + typename MeshConfig > +class tnlSolverStarterTimeDiscretisationSetter< Problem, TimeDiscretisation, MeshConfig, false > { public: static bool run( Problem& problem, @@ -153,8 +153,8 @@ class tnlSolverStarterTimeDiscretisationSetter< Problem, TimeDiscretisation, Con }; template< typename Problem, - typename ConfigTag > -class tnlSolverStarterTimeDiscretisationSetter< Problem, tnlExplicitTimeDiscretisationTag, ConfigTag, true > + typename MeshConfig > +class tnlSolverStarterTimeDiscretisationSetter< Problem, tnlExplicitTimeDiscretisationTag, MeshConfig, true > { public: static bool run( Problem& problem, @@ -168,16 +168,16 @@ class tnlSolverStarterTimeDiscretisationSetter< Problem, tnlExplicitTimeDiscreti return false; } if( discreteSolver == "euler" ) - return tnlSolverStarterExplicitSolverSetter< Problem, tnlExplicitEulerSolverTag, ConfigTag >::run( problem, parameters ); + return tnlSolverStarterExplicitSolverSetter< Problem, tnlExplicitEulerSolverTag, MeshConfig >::run( problem, parameters ); if( discreteSolver == "merson" ) - return tnlSolverStarterExplicitSolverSetter< Problem, tnlExplicitMersonSolverTag, ConfigTag >::run( problem, parameters ); + return tnlSolverStarterExplicitSolverSetter< Problem, tnlExplicitMersonSolverTag, MeshConfig >::run( problem, parameters ); return false; } }; template< typename Problem, - typename ConfigTag > -class tnlSolverStarterTimeDiscretisationSetter< Problem, tnlSemiImplicitTimeDiscretisationTag, ConfigTag, true > + typename MeshConfig > +class tnlSolverStarterTimeDiscretisationSetter< Problem, tnlSemiImplicitTimeDiscretisationTag, MeshConfig, true > { public: static bool run( Problem& problem, @@ -194,20 +194,20 @@ class tnlSolverStarterTimeDiscretisationSetter< Problem, tnlSemiImplicitTimeDisc } if( discreteSolver == "sor" ) - return tnlSolverStarterSemiImplicitSolverSetter< Problem, tnlSemiImplicitSORSolverTag, ConfigTag >::run( problem, parameters ); + return tnlSolverStarterSemiImplicitSolverSetter< Problem, tnlSemiImplicitSORSolverTag, MeshConfig >::run( problem, parameters ); if( discreteSolver == "cg" ) - return tnlSolverStarterSemiImplicitSolverSetter< Problem, tnlSemiImplicitCGSolverTag, ConfigTag >::run( problem, parameters ); + return tnlSolverStarterSemiImplicitSolverSetter< Problem, tnlSemiImplicitCGSolverTag, MeshConfig >::run( problem, parameters ); if( discreteSolver == "bicgstab" ) - return tnlSolverStarterSemiImplicitSolverSetter< Problem, tnlSemiImplicitBICGStabSolverTag, ConfigTag >::run( problem, parameters ); + return tnlSolverStarterSemiImplicitSolverSetter< Problem, tnlSemiImplicitBICGStabSolverTag, MeshConfig >::run( problem, parameters ); if( discreteSolver == "gmres" ) - return tnlSolverStarterSemiImplicitSolverSetter< Problem, tnlSemiImplicitGMRESSolverTag, ConfigTag >::run( problem, parameters ); + return tnlSolverStarterSemiImplicitSolverSetter< Problem, tnlSemiImplicitGMRESSolverTag, MeshConfig >::run( problem, parameters ); return false; } }; template< typename Problem, - typename ConfigTag > -class tnlSolverStarterTimeDiscretisationSetter< Problem, tnlImplicitTimeDiscretisationTag, ConfigTag, true > + typename MeshConfig > +class tnlSolverStarterTimeDiscretisationSetter< Problem, tnlImplicitTimeDiscretisationTag, MeshConfig, true > { public: static bool run( Problem& problem, @@ -224,8 +224,8 @@ class tnlSolverStarterTimeDiscretisationSetter< Problem, tnlImplicitTimeDiscreti template< typename Problem, typename ExplicitSolver, - typename ConfigTag > -class tnlSolverStarterExplicitSolverSetter< Problem, ExplicitSolver, ConfigTag, false > + typename MeshConfig > +class tnlSolverStarterExplicitSolverSetter< Problem, ExplicitSolver, MeshConfig, false > { public: static bool run( Problem& problem, @@ -237,8 +237,8 @@ class tnlSolverStarterExplicitSolverSetter< Problem, ExplicitSolver, ConfigTag, }; template< typename Problem, - typename ConfigTag > -class tnlSolverStarterExplicitSolverSetter< Problem, tnlExplicitEulerSolverTag, ConfigTag, true > + typename MeshConfig > +class tnlSolverStarterExplicitSolverSetter< Problem, tnlExplicitEulerSolverTag, MeshConfig, true > { public: static bool run( Problem& problem, @@ -249,13 +249,13 @@ class tnlSolverStarterExplicitSolverSetter< Problem, tnlExplicitEulerSolverTag, return tnlSolverStarterExplicitTimeStepperSetter< Problem, ExplicitSolver, TimeStepper, - ConfigTag >::run( problem, parameters ); + MeshConfig >::run( problem, parameters ); } }; template< typename Problem, - typename ConfigTag > -class tnlSolverStarterExplicitSolverSetter< Problem, tnlExplicitMersonSolverTag, ConfigTag, true > + typename MeshConfig > +class tnlSolverStarterExplicitSolverSetter< Problem, tnlExplicitMersonSolverTag, MeshConfig, true > { public: static bool run( Problem& problem, @@ -266,7 +266,7 @@ class tnlSolverStarterExplicitSolverSetter< Problem, tnlExplicitMersonSolverTag, return tnlSolverStarterExplicitTimeStepperSetter< Problem, ExplicitSolver, TimeStepper, - ConfigTag >::run( problem, parameters ); + MeshConfig >::run( problem, parameters ); } }; @@ -276,8 +276,8 @@ class tnlSolverStarterExplicitSolverSetter< Problem, tnlExplicitMersonSolverTag, template< typename Problem, typename SemiImplicitSolver, - typename ConfigTag > -class tnlSolverStarterSemiImplicitSolverSetter< Problem, SemiImplicitSolver, ConfigTag, false > + typename MeshConfig > +class tnlSolverStarterSemiImplicitSolverSetter< Problem, SemiImplicitSolver, MeshConfig, false > { public: static bool run( Problem& problem, @@ -289,8 +289,8 @@ class tnlSolverStarterSemiImplicitSolverSetter< Problem, SemiImplicitSolver, Con }; template< typename Problem, - typename ConfigTag > -class tnlSolverStarterSemiImplicitSolverSetter< Problem, tnlSemiImplicitSORSolverTag, ConfigTag, true > + typename MeshConfig > +class tnlSolverStarterSemiImplicitSolverSetter< Problem, tnlSemiImplicitSORSolverTag, MeshConfig, true > { public: static bool run( Problem& problem, @@ -301,13 +301,13 @@ class tnlSolverStarterSemiImplicitSolverSetter< Problem, tnlSemiImplicitSORSolve typedef tnlSemiImplicitTimeStepper< Problem, LinearSystemSolver > TimeStepper; return tnlSolverStarterSemiImplicitTimeStepperSetter< Problem, TimeStepper, - ConfigTag >::run( problem, parameters ); + MeshConfig >::run( problem, parameters ); } }; template< typename Problem, - typename ConfigTag > -class tnlSolverStarterSemiImplicitSolverSetter< Problem, tnlSemiImplicitCGSolverTag, ConfigTag, true > + typename MeshConfig > +class tnlSolverStarterSemiImplicitSolverSetter< Problem, tnlSemiImplicitCGSolverTag, MeshConfig, true > { public: static bool run( Problem& problem, @@ -318,13 +318,13 @@ class tnlSolverStarterSemiImplicitSolverSetter< Problem, tnlSemiImplicitCGSolver typedef tnlSemiImplicitTimeStepper< Problem, LinearSystemSolver > TimeStepper; return tnlSolverStarterSemiImplicitTimeStepperSetter< Problem, TimeStepper, - ConfigTag >::run( problem, parameters ); + MeshConfig >::run( problem, parameters ); } }; template< typename Problem, - typename ConfigTag > -class tnlSolverStarterSemiImplicitSolverSetter< Problem, tnlSemiImplicitBICGStabSolverTag, ConfigTag, true > + typename MeshConfig > +class tnlSolverStarterSemiImplicitSolverSetter< Problem, tnlSemiImplicitBICGStabSolverTag, MeshConfig, true > { public: static bool run( Problem& problem, @@ -335,13 +335,13 @@ class tnlSolverStarterSemiImplicitSolverSetter< Problem, tnlSemiImplicitBICGStab typedef tnlSemiImplicitTimeStepper< Problem, LinearSystemSolver > TimeStepper; return tnlSolverStarterSemiImplicitTimeStepperSetter< Problem, TimeStepper, - ConfigTag >::run( problem, parameters ); + MeshConfig >::run( problem, parameters ); } }; template< typename Problem, - typename ConfigTag > -class tnlSolverStarterSemiImplicitSolverSetter< Problem, tnlSemiImplicitGMRESSolverTag, ConfigTag, true > + typename MeshConfig > +class tnlSolverStarterSemiImplicitSolverSetter< Problem, tnlSemiImplicitGMRESSolverTag, MeshConfig, true > { public: static bool run( Problem& problem, @@ -352,7 +352,7 @@ class tnlSolverStarterSemiImplicitSolverSetter< Problem, tnlSemiImplicitGMRESSol typedef tnlSemiImplicitTimeStepper< Problem, LinearSystemSolver > TimeStepper; return tnlSolverStarterSemiImplicitTimeStepperSetter< Problem, TimeStepper, - ConfigTag >::run( problem, parameters ); + MeshConfig >::run( problem, parameters ); } }; @@ -363,7 +363,7 @@ class tnlSolverStarterSemiImplicitSolverSetter< Problem, tnlSemiImplicitGMRESSol template< typename Problem, typename ExplicitSolver, typename TimeStepper, - typename ConfigTag > + typename MeshConfig > class tnlSolverStarterExplicitTimeStepperSetter { public: @@ -393,7 +393,7 @@ class tnlSolverStarterExplicitTimeStepperSetter } timeStepper.setSolver( explicitSolver ); - tnlSolverStarter< ConfigTag > solverStarter; + tnlSolverStarter< MeshConfig > solverStarter; return solverStarter.template runPDESolver< Problem, TimeStepper >( problem, parameters, timeStepper ); }; }; @@ -403,7 +403,7 @@ class tnlSolverStarterExplicitTimeStepperSetter */ template< typename Problem, typename TimeStepper, - typename ConfigTag > + typename MeshConfig > class tnlSolverStarterSemiImplicitTimeStepperSetter { public: @@ -434,7 +434,7 @@ class tnlSolverStarterSemiImplicitTimeStepperSetter } timeStepper.setSolver( linearSystemSolver ); - tnlSolverStarter< ConfigTag > solverStarter; + tnlSolverStarter< MeshConfig > solverStarter; return solverStarter.template runPDESolver< Problem, TimeStepper >( problem, parameters, timeStepper ); }; }; @@ -445,9 +445,9 @@ class tnlSolverStarterSemiImplicitTimeStepperSetter #ifdef UNDEF -template< typename ConfigTag > +template< typename MeshConfig > template< typename Problem > -bool tnlSolverStarter< ConfigTag > :: setDiscreteSolver( Problem& problem, +bool tnlSolverStarter< MeshConfig > :: setDiscreteSolver( Problem& problem, const tnlParameterContainer& parameters ) { if( ( discreteSolver == "sor" || @@ -505,10 +505,10 @@ bool tnlSolverStarter< ConfigTag > :: setDiscreteSolver( Problem& problem, } #endif -template< typename ConfigTag > +template< typename MeshConfig > template< typename Problem, typename TimeStepper > -bool tnlSolverStarter< ConfigTag > :: runPDESolver( Problem& problem, +bool tnlSolverStarter< MeshConfig > :: runPDESolver( Problem& problem, const tnlParameterContainer& parameters, TimeStepper& timeStepper ) { @@ -621,9 +621,9 @@ bool tnlSolverStarter< ConfigTag > :: runPDESolver( Problem& problem, return returnCode; } -template< typename ConfigTag > +template< typename MeshConfig > template< typename Solver > -bool tnlSolverStarter< ConfigTag > :: writeEpilog( ostream& str, const Solver& solver ) +bool tnlSolverStarter< MeshConfig > :: writeEpilog( ostream& str, const Solver& solver ) { tnlLogger logger( logWidth, str ); logger.writeCurrentTime( "Finished at:" ); diff --git a/src/solvers/tnlSolver_impl.h b/src/solvers/tnlSolver_impl.h index 7fa9f6b970dd0c736b86282348b39d4f068ea1bd..33d9b2fe8b794321db5ec0089f459959ed0bfd1e 100644 --- a/src/solvers/tnlSolver_impl.h +++ b/src/solvers/tnlSolver_impl.h @@ -22,21 +22,21 @@ #include <solvers/tnlSolverStarter.h> #include <solvers/tnlSolverConfig.h> -template< template< typename Real, typename Device, typename Index, typename MeshType, typename ConfigTag, typename SolverStarter > class ProblemSetter, - template< typename ConfigTag > class ProblemConfig, - typename ConfigTag > +template< template< typename Real, typename Device, typename Index, typename MeshType, typename MeshConfig, typename SolverStarter > class ProblemSetter, + template< typename MeshConfig > class ProblemConfig, + typename MeshConfig > bool -tnlSolver< ProblemSetter, ProblemConfig, ConfigTag >:: +tnlSolver< ProblemSetter, ProblemConfig, MeshConfig >:: run( int argc, char* argv[] ) { tnlParameterContainer parameters; tnlConfigDescription configDescription; - ProblemConfig< ConfigTag >::configSetup( configDescription ); - tnlSolverConfig< ConfigTag, ProblemConfig< ConfigTag> >::configSetup( configDescription ); + ProblemConfig< MeshConfig >::configSetup( configDescription ); + tnlSolverConfig< MeshConfig, ProblemConfig< MeshConfig> >::configSetup( configDescription ); if( ! parseCommandLine( argc, argv, configDescription, parameters ) ) return false; - tnlSolverInitiator< ProblemSetter, ConfigTag > solverInitiator; + tnlSolverInitiator< ProblemSetter, MeshConfig > solverInitiator; return solverInitiator.run( parameters ); }; diff --git a/tests/unit-tests/CMakeLists.txt b/tests/unit-tests/CMakeLists.txt index 695b1433e2218c8e2c9c8bbfdaad1bdc5a190e46..d3ac6430a934c53876072e1e079823a67eeb2daa 100755 --- a/tests/unit-tests/CMakeLists.txt +++ b/tests/unit-tests/CMakeLists.txt @@ -15,6 +15,8 @@ ADD_TEST( core/vectors/tnlVectorOperationsTest${mpiExt}${debugExt} ${EXECUTABLE_ ADD_TEST( core/vectors/tnlVectorTest${mpiExt}${debugExt} ${EXECUTABLE_OUTPUT_PATH}/tnlVectorTest${mpiExt}${debugExt} ) ADD_TEST( core/vectors/tnlStaticVectorTest${mpiExt}${debugExt} ${EXECUTABLE_OUTPUT_PATH}/tnlStaticVectorTest${mpiExt}${debugExt} ) +ADD_TEST( core/multimaps/tnlEllpackIndexMultimapTest{mpiExt}${debugExt} ${EXECUTABLE_OUTPUT_PATH}/tnlEllpackIndexMultimapTest${mpiExt}${debugExt} ) + ADD_TEST( matrices/tnlDenseMatrixTest${mpiExt}${debugExt} ${EXECUTABLE_OUTPUT_PATH}/tnlDenseMatrixTest${mpiExt}${debugExt} ) ADD_TEST( matrices/tnlTridiagonalMatrixTest${mpiExt}${debugExt} ${EXECUTABLE_OUTPUT_PATH}/tnlTridiagonalMatrixTest${mpiExt}${debugExt} ) ADD_TEST( matrices/tnlMultidiagonalMatrixTest${mpiExt}${debugExt} ${EXECUTABLE_OUTPUT_PATH}/tnlMultidiagonalMatrixTest${mpiExt}${debugExt} ) diff --git a/tests/unit-tests/core/CMakeLists.txt b/tests/unit-tests/core/CMakeLists.txt index 90f40ff72cd23d748090409e454cf02445af8f09..ce4b4a913532c36528c9962225f4e2552bca1e7b 100755 --- a/tests/unit-tests/core/CMakeLists.txt +++ b/tests/unit-tests/core/CMakeLists.txt @@ -1,6 +1,7 @@ ADD_SUBDIRECTORY( arrays ) ADD_SUBDIRECTORY( cuda ) ADD_SUBDIRECTORY( vectors ) +ADD_SUBDIRECTORY( multimaps ) set( headers tnlFileTester.h tnlStringTester.h diff --git a/tests/unit-tests/core/multimaps/CMakeLists.txt b/tests/unit-tests/core/multimaps/CMakeLists.txt new file mode 100644 index 0000000000000000000000000000000000000000..cb8216cc230c3a1ffd6ab36141a0171dd3428d92 --- /dev/null +++ b/tests/unit-tests/core/multimaps/CMakeLists.txt @@ -0,0 +1,5 @@ +set( headers tnlIndexMultimapTester.h ) + +ADD_EXECUTABLE( tnlEllpackIndexMultimapTest${mpiExt}${debugExt} ${headers} tnlEllpackIndexMultimapTest.cpp ) +TARGET_LINK_LIBRARIES( tnlEllpackIndexMultimapTest${mpiExt}${debugExt} ${CPPUNIT_LIBRARIES} + tnl${mpiExt}${debugExt}-0.1 ) \ No newline at end of file diff --git a/src/mesh/traits/tnlDimensionsTraits.h b/tests/unit-tests/core/multimaps/tnlEllpackIndexMultimapTest.cpp similarity index 54% rename from src/mesh/traits/tnlDimensionsTraits.h rename to tests/unit-tests/core/multimaps/tnlEllpackIndexMultimapTest.cpp index 25bfbc5db6bba202817837224b6bad942a7e3b64..b28bc7b83bab55a143bc0d1ec04c123bd4652f13 100644 --- a/src/mesh/traits/tnlDimensionsTraits.h +++ b/tests/unit-tests/core/multimaps/tnlEllpackIndexMultimapTest.cpp @@ -1,8 +1,8 @@ /*************************************************************************** - tnlDimensionsTraits.h - description + tnlEllpackIndexMultimapTest.cpp - description ------------------- - begin : Feb 11, 2014 - copyright : (C) 2014 by Tomas Oberhuber + begin : Sep 10, 2015 + copyright : (C) 2015 by Tomas Oberhuber email : tomas.oberhuber@fjfi.cvut.cz ***************************************************************************/ @@ -15,28 +15,23 @@ * * ***************************************************************************/ -#ifndef TNLDIMENSIONSTRAITS_H_ -#define TNLDIMENSIONSTRAITS_H_ +#include <tnlConfig.h> +#include <core/tnlHost.h> +#include <cstdlib> -#include <core/tnlAssert.h> +#include <core/multimaps/tnlEllpackIndexMultimap.h> +#include "tnlIndexMultimapTester.h" +#include "../../tnlUnitTestStarter.h" -template< int Dimensions > -class tnlDimensionsTraits +int main( int argc, char* argv[] ) { - public: - - enum { value = Dimensions }; - - typedef tnlDimensionsTraits< Dimensions - 1 > Previous; - - tnlStaticAssert( value >= 0, "The value of the dimensions cannot be negative." ); -}; - -template<> -class tnlDimensionsTraits< 0 > -{ - public: - enum { value = 0 }; -}; - -#endif /* TNLDIMENSIONSTRAITS_H_ */ +#ifdef HAVE_CPPUNIT + if( ! tnlUnitTestStarter :: run< tnlIndexMultimapTester< tnlEllpackIndexMultimap< int, tnlHost > > >() || + ! tnlUnitTestStarter :: run< tnlIndexMultimapTester< tnlEllpackIndexMultimap< long int, tnlHost > > >() + ) + return EXIT_FAILURE; + return EXIT_SUCCESS; +#else + return EXIT_FAILURE; +#endif +} diff --git a/tests/unit-tests/core/multimaps/tnlIndexMultimapTester.h b/tests/unit-tests/core/multimaps/tnlIndexMultimapTester.h new file mode 100644 index 0000000000000000000000000000000000000000..3dcb6626237b22d65886dd4cb1b64bf7044897d9 --- /dev/null +++ b/tests/unit-tests/core/multimaps/tnlIndexMultimapTester.h @@ -0,0 +1,1195 @@ +/*************************************************************************** + tnlIndexMultimapTester.h - description + ------------------- + begin : Sep 10, 2015 + copyright : (C) 2015 by Tomas Oberhuber + 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 TNLINDEXMULTIMAPTESTER_H_ +#define TNLINDEXMULTIMAPTESTER_H_ + +template< typename Multimap, + typename TestSetup > +class tnlIndexMultimapTesterSetter +{ + public: + + static bool setup( Multimap& multimap ) + { + return true; + } +}; + +#ifdef HAVE_CPPUNIT +#include <cppunit/TestSuite.h> +#include <cppunit/TestResult.h> +#include <cppunit/TestCaller.h> +#include <cppunit/TestCase.h> +#include <cppunit/Message.h> +#include <core/tnlFile.h> +#include <core/vectors/tnlVector.h> + +#ifdef HAVE_CUDA +template< typename IndexMultimapType > +__global__ void tnlIndexMultimapTester__setElementFastTestCudaKernel( IndexMultimapType* graph, + bool* testResult ); +template< typename IndexMultimapType > +__global__ void tnlIndexMultimapTester__setElementFast_DiagonalIndexMultimapTestCudaKernel( IndexMultimapType* graph, + bool* testResult ); + +template< typename IndexMultimapType > +__global__ void tnlIndexMultimapTester__setElementFast_DenseIndexMultimapTestCudaKernel1( IndexMultimapType* graph, + bool* testResult ); + +template< typename IndexMultimapType > +__global__ void tnlIndexMultimapTester__setElementFast_DenseIndexMultimapTestCudaKernel2( IndexMultimapType* graph, + bool* testResult ); + +template< typename IndexMultimapType > +__global__ void tnlIndexMultimapTester__setElementFast_LowerTriangularIndexMultimapTestCudaKernel1( IndexMultimapType* graph, + bool* testResult ); + +template< typename IndexMultimapType > +__global__ void tnlIndexMultimapTester__setElementFast_LowerTriangularIndexMultimapTestCudaKernel2( IndexMultimapType* graph, + bool* testResult ); + +template< typename IndexMultimapType > +__global__ void tnlIndexMultimapTester__setRowFast_DiagonalIndexMultimapTestCudaKernel( IndexMultimapType* graph, + bool* testResult ); + +template< typename IndexMultimapType > +__global__ void tnlIndexMultimapTester__setRowFast_DenseIndexMultimapTestCudaKernel1( IndexMultimapType* graph, + bool* testResult ); + +template< typename IndexMultimapType > +__global__ void tnlIndexMultimapTester__setRowFast_DenseIndexMultimapTestCudaKernel2( IndexMultimapType* graph, + bool* testResult ); + +template< typename IndexMultimapType > +__global__ void tnlIndexMultimapTester__setRowFast_LowerTriangularIndexMultimapTestCudaKernel( IndexMultimapType* graph, + bool* testResult ); + +#endif + +class tnlIndexMultimapTestDefaultSetup +{}; + +template< typename IndexMultimap, + typename IndexMultimapSetup = tnlIndexMultimapTestDefaultSetup > +class tnlIndexMultimapTester : public CppUnit :: TestCase +{ + public: + typedef IndexMultimap IndexMultimapType; + typedef typename IndexMultimap::DeviceType DeviceType; + typedef typename IndexMultimap::IndexType IndexType; + typedef tnlIndexMultimapTester< IndexMultimapType, IndexMultimapSetup > TesterType; + typedef tnlIndexMultimapTesterSetter< IndexMultimapType, IndexMultimapSetup > IndexMultimapSetter; + typedef typename CppUnit::TestCaller< TesterType > TestCallerType; + + typedef typename IndexMultimapType::ValuesAllocationVectorType ValuesAllocationVectorType; + typedef typename IndexMultimapType::ValuesAccessorType ValuesAccessorType; + + tnlIndexMultimapTester(){}; + + virtual + ~tnlIndexMultimapTester(){}; + + static CppUnit :: Test* suite() + { + tnlString testSuiteName( "tnlIndexMultimapTester< " ); + testSuiteName += IndexMultimapType::getType() + " >"; + + CppUnit :: TestSuite* suiteOfTests = new CppUnit :: TestSuite( testSuiteName.getString() ); + CppUnit :: TestResult result; + + suiteOfTests->addTest( new TestCallerType( "setRangesTest", &TesterType::setRangesTest ) ); + //suiteOfTests->addTest( new TestCallerType( "setLikeTest", &TesterType::setLikeTest ) ); + suiteOfTests->addTest( new TestCallerType( "setElementTest", &TesterType::setElementTest ) ); + /*suiteOfTests->addTest( new TestCallerType( "setElementFastTest", &TesterType::setElementFastTest ) ); + suiteOfTests->addTest( new TestCallerType( "setElement_DiagonalIndexMultimapTest", &TesterType::setElement_DiagonalIndexMultimapTest ) ); + suiteOfTests->addTest( new TestCallerType( "setElementFast_DiagonalIndexMultimapTest", &TesterType::setElementFast_DiagonalIndexMultimapTest ) ); + suiteOfTests->addTest( new TestCallerType( "setElement_DenseIndexMultimapTest", &TesterType::setElement_DenseIndexMultimapTest ) ); + suiteOfTests->addTest( new TestCallerType( "setElementFast_DenseIndexMultimapTest", &TesterType::setElementFast_DenseIndexMultimapTest ) ); + suiteOfTests->addTest( new TestCallerType( "setElement_LowerTriangularIndexMultimapTest", &TesterType::setElement_LowerTriangularIndexMultimapTest ) ); + suiteOfTests->addTest( new TestCallerType( "setElementFast_LowerTriangularIndexMultimapTest", &TesterType::setElementFast_LowerTriangularIndexMultimapTest ) ); + suiteOfTests->addTest( new TestCallerType( "setRow_DiagonalIndexMultimapTest", &TesterType::setRow_DiagonalIndexMultimapTest ) ); + suiteOfTests->addTest( new TestCallerType( "setRowFast_DiagonalIndexMultimapTest", &TesterType::setRowFast_DiagonalIndexMultimapTest ) ); + suiteOfTests->addTest( new TestCallerType( "setRow_DenseIndexMultimapTest", &TesterType::setRow_DenseIndexMultimapTest ) ); + suiteOfTests->addTest( new TestCallerType( "setRowFast_DenseIndexMultimapTest", &TesterType::setRowFast_DenseIndexMultimapTest ) ); + suiteOfTests->addTest( new TestCallerType( "setRow_LowerTriangularIndexMultimapTest", &TesterType::setRow_LowerTriangularIndexMultimapTest ) ); + suiteOfTests->addTest( new TestCallerType( "setRowFast_LowerTriangularIndexMultimapTest", &TesterType::setRowFast_LowerTriangularIndexMultimapTest ) ); + suiteOfTests->addTest( new TestCallerType( "addElementTest", &TesterType::addElementTest ) ); + suiteOfTests->addTest( new TestCallerType( "vectorProduct_DiagonalIndexMultimapTest", &TesterType::vectorProduct_DiagonalIndexMultimapTest ) ); + suiteOfTests->addTest( new TestCallerType( "vectorProduct_DenseIndexMultimapTest", &TesterType::vectorProduct_DenseIndexMultimapTest ) ); + suiteOfTests->addTest( new TestCallerType( "vectorProduct_LowerTriangularIndexMultimapTest", &TesterType::vectorProduct_LowerTriangularIndexMultimapTest ) ); + /*suiteOfTests -> addTest( new TestCallerType( "graphTranspositionTest", &TesterType::graphTranspositionTest ) ); + suiteOfTests -> addTest( new TestCallerType( "addIndexMultimapTest", &TesterType::addIndexMultimapTest ) );*/ + + return suiteOfTests; + } + + void setRangesTest() + { + IndexMultimapType n; + IndexMultimapSetter::setup( n ); + n.setRanges( 10, 10 ); + CPPUNIT_ASSERT( n.getKeysRange() == 10 ); + CPPUNIT_ASSERT( n.getValuesRange() == 10 ); + } + + /*void setLikeTest() + { + IndexMultimapType m1, m2; + IndexMultimapSetter::setup( m1 ); + IndexMultimapSetter::setup( m2 ); + m1.setDimensions( 10, 10 ); + IndexVector rowLengths; + rowLengths.setSize( m1.getRows() ); + rowLengths.setValue( 5 ); + m1.setCompressedRowsLengths( rowLengths ); + m2.setLike( m1 ); + CPPUNIT_ASSERT( m1.getRows() == m2.getRows() ); + }*/ + + /**** + * Set element tests + */ + void setElementTest() + { + IndexMultimapType n; + IndexMultimapSetter::setup( n ); + n.setRanges( 10, 10 ); + + ValuesAllocationVectorType portsAllocationVector; + portsAllocationVector.setSize( n.getKeysRange() ); + portsAllocationVector.setValue( 7 ); + n.allocate( portsAllocationVector ); + + ValuesAccessorType p = n.getValues( 0 ); + for( int i = 0; i < 7; i++ ) + { + p.setOutput( i, i ); + //CPPUNIT_ASSERT( n.setPort( 0, i, i ) ); + } + + //CPPUNIT_ASSERT( m.setElement( 0, 8, 8 ) == false ); + + for( int i = 0; i < 7; i++ ) + CPPUNIT_ASSERT( p.getOutput( i ) == i ); + } +#ifdef UNDEF + + void setElementFastTest() + { + IndexMultimapType m; + IndexMultimapSetter::setup( m ); + m.setDimensions( 10, 10 ); + IndexVector rowLengths; + rowLengths.setSize( m.getRows() ); + rowLengths.setValue( 7 ); + m.setCompressedRowsLengths( rowLengths ); + + if( DeviceType::getDevice() == tnlHostDevice ) + { + for( int i = 0; i < 7; i++ ) + CPPUNIT_ASSERT( m.setElementFast( 0, i, i ) ); + //CPPUNIT_ASSERT( m.setElementFast( 0, 8, 8 ) == false ); + } + + if( DeviceType::getDevice() == tnlCudaDevice ) + { +#ifdef HAVE_CUDA + IndexMultimapType* kernel_graph = tnlCuda::passToDevice( m ); + bool testResult( true ); + bool* kernel_testResult = tnlCuda::passToDevice( testResult ); + checkCudaDevice; + dim3 cudaBlockSize( 256 ), cudaGridSize( 1 ); + tnlIndexMultimapTester__setElementFastTestCudaKernel< IndexMultimapType > + <<< cudaGridSize, cudaBlockSize >>> + ( kernel_graph, + kernel_testResult ); + CPPUNIT_ASSERT( tnlCuda::passFromDevice( kernel_testResult ) ); + tnlCuda::freeFromDevice( kernel_graph ); + tnlCuda::freeFromDevice( kernel_testResult ); + checkCudaDevice; +#endif + } + + for( int i = 0; i < 7; i++ ) + CPPUNIT_ASSERT( m.getElement( 0, i ) == i ); + } + + void setElement_DiagonalIndexMultimapTest() + { + IndexMultimapType m; + IndexMultimapSetter::setup( m ); + m.setDimensions( 10, 10 ); + IndexVector rowLengths; + rowLengths.setSize( m.getRows() ); + rowLengths.setValue( 7 ); + m.setCompressedRowsLengths( rowLengths ); + + for( int i = 0; i < 10; i++ ) + m.setElement( i, i, i ); + + for( int i = 0; i < 10; i++ ) + { + for( int j = 0; j < 10; j++ ) + { + if( i == j ) + CPPUNIT_ASSERT( m.getElement( i, j ) == i ); + else + CPPUNIT_ASSERT( m.getElement( i, j ) == 0 ); + } + } + } + + void setElementFast_DiagonalIndexMultimapTest() + { + IndexMultimapType m; + IndexMultimapSetter::setup( m ); + m.setDimensions( 10, 10 ); + IndexVector rowLengths; + rowLengths.setSize( m.getRows() ); + rowLengths.setValue( 7 ); + m.setCompressedRowsLengths( rowLengths ); + + if( DeviceType::DeviceType == ( int ) tnlHostDevice ) + { + for( int i = 0; i < 10; i++ ) + m.setElementFast( i, i, i ); + } + if( DeviceType::DeviceType == ( int ) tnlCudaDevice ) + { +#ifdef HAVE_CUDA + IndexMultimapType* kernel_graph = tnlCuda::passToDevice( m ); + bool testResult( true ); + bool* kernel_testResult = tnlCuda::passToDevice( testResult ); + checkCudaDevice; + dim3 cudaBlockSize( 256 ), cudaGridSize( 1 ); + tnlIndexMultimapTester__setElementFast_DiagonalIndexMultimapTestCudaKernel< IndexMultimapType > + <<< cudaGridSize, cudaBlockSize >>> + ( kernel_graph, + kernel_testResult ); + CPPUNIT_ASSERT( tnlCuda::passFromDevice( kernel_testResult ) ); + tnlCuda::freeFromDevice( kernel_graph ); + tnlCuda::freeFromDevice( kernel_testResult ); + checkCudaDevice; +#endif + } + + for( int i = 0; i < 10; i++ ) + { + for( int j = 0; j < 10; j++ ) + { + if( i == j ) + CPPUNIT_ASSERT( m.getElement( i, j ) == i ); + else + CPPUNIT_ASSERT( m.getElement( i, j ) == 0 ); + } + } + } + + void setElement_DenseIndexMultimapTest() + { + IndexMultimapType m; + IndexMultimapSetter::setup( m ); + m.setDimensions( 10, 10 ); + IndexVector rowLengths; + rowLengths.setSize( m.getRows() ); + rowLengths.setValue( 10 ); + m.setCompressedRowsLengths( rowLengths ); + + for( int i = 0; i < 10; i++ ) + m.setElement( i, i, i ); + for( int i = 0; i < 10; i++ ) + for( int j = 0; j < 10; j++ ) + m.addElement( i, j, 1, 0.5 ); + + for( int i = 0; i < 10; i++ ) + for( int j = 0; j < 10; j++ ) + if( i == j ) + CPPUNIT_ASSERT( m.getElement( i, j ) == 1.0+0.5*i ); + else + CPPUNIT_ASSERT( m.getElement( i, j ) == 1.0 ); + + m.reset(); + m.setDimensions( 10, 10 ); + m.setCompressedRowsLengths( rowLengths ); + for( int i = 9; i >= 0; i-- ) + for( int j = 9; j >= 0; j-- ) + m.setElement( i, j, i+j ); + + for( int i = 9; i >= 0; i-- ) + for( int j = 9; j >= 0; j-- ) + CPPUNIT_ASSERT( m.getElement( i, j ) == i+j ); + } + + void setElementFast_DenseIndexMultimapTest() + { + IndexMultimapType m; + IndexMultimapSetter::setup( m ); + m.setDimensions( 10, 10 ); + IndexVector rowLengths; + rowLengths.setSize( m.getRows() ); + rowLengths.setValue( 10 ); + m.setCompressedRowsLengths( rowLengths ); + + if( DeviceType::DeviceType == ( int ) tnlHostDevice ) + { + for( int i = 0; i < 10; i++ ) + m.setElementFast( i, i, i ); + for( int i = 0; i < 10; i++ ) + for( int j = 0; j < 10; j++ ) + m.addElementFast( i, j, 1, 0.5 ); + } + if( DeviceType::DeviceType == ( int ) tnlCudaDevice ) + { +#ifdef HAVE_CUDA + IndexMultimapType* kernel_graph = tnlCuda::passToDevice( m ); + bool testResult( true ); + bool* kernel_testResult = tnlCuda::passToDevice( testResult ); + checkCudaDevice; + dim3 cudaBlockSize( 256 ), cudaGridSize( 1 ); + tnlIndexMultimapTester__setElementFast_DenseIndexMultimapTestCudaKernel1< IndexMultimapType > + <<< cudaGridSize, cudaBlockSize >>> + ( kernel_graph, + kernel_testResult ); + CPPUNIT_ASSERT( tnlCuda::passFromDevice( kernel_testResult ) ); + tnlCuda::freeFromDevice( kernel_graph ); + tnlCuda::freeFromDevice( kernel_testResult ); + checkCudaDevice; +#endif + } + + for( int i = 0; i < 10; i++ ) + for( int j = 0; j < 10; j++ ) + if( i == j ) + CPPUNIT_ASSERT( m.getElement( i, j ) == 1.0+0.5*i ); + else + CPPUNIT_ASSERT( m.getElement( i, j ) == 1.0 ); + + m.reset(); + m.setDimensions( 10, 10 ); + m.setCompressedRowsLengths( rowLengths ); + if( DeviceType::DeviceType == ( int ) tnlHostDevice ) + { + for( int i = 9; i >= 0; i-- ) + for( int j = 9; j >= 0; j-- ) + m.setElementFast( i, j, i+j ); + } + if( DeviceType::DeviceType == ( int ) tnlCudaDevice ) + { +#ifdef HAVE_CUDA + IndexMultimapType* kernel_graph = tnlCuda::passToDevice( m ); + bool testResult( true ); + bool* kernel_testResult = tnlCuda::passToDevice( testResult ); + checkCudaDevice; + dim3 cudaBlockSize( 256 ), cudaGridSize( 1 ); + tnlIndexMultimapTester__setElementFast_DenseIndexMultimapTestCudaKernel2< IndexMultimapType > + <<< cudaGridSize, cudaBlockSize >>> + ( kernel_graph, + kernel_testResult ); + CPPUNIT_ASSERT( tnlCuda::passFromDevice( kernel_testResult ) ); + tnlCuda::freeFromDevice( kernel_graph ); + tnlCuda::freeFromDevice( kernel_testResult ); + checkCudaDevice; +#endif + } + + for( int i = 9; i >= 0; i-- ) + for( int j = 9; j >= 0; j-- ) + CPPUNIT_ASSERT( m.getElement( i, j ) == i+j ); + } + + + void setElement_LowerTriangularIndexMultimapTest() + { + IndexMultimapType m; + IndexMultimapSetter::setup( m ); + m.setDimensions( 10, 10 ); + IndexVector rowLengths; + rowLengths.setSize( m.getRows() ); + for( int i = 0; i < 10; i++ ) + rowLengths.setElement( i, i+1 ); + m.setCompressedRowsLengths( rowLengths ); + + for( int i = 0; i < 10; i++ ) + for( int j = 0; j <= i; j++ ) + m.setElement( i, j, i + j ); + + for( int i = 0; i < 10; i++ ) + for( int j = 0; j < 10; j++ ) + if( j <= i ) + CPPUNIT_ASSERT( m.getElement( i, j ) == i + j ); + else + CPPUNIT_ASSERT( m.getElement( i, j ) == 0 ); + + m.reset(); + m.setDimensions( 10, 10 ); + m.setCompressedRowsLengths( rowLengths ); + for( int i = 9; i >= 0; i-- ) + for( int j = i; j >= 0; j-- ) + m.setElement( i, j, i + j ); + + for( int i = 0; i < 10; i++ ) + for( int j = 0; j < 10; j++ ) + if( j <= i ) + CPPUNIT_ASSERT( m.getElement( i, j ) == i + j ); + else + CPPUNIT_ASSERT( m.getElement( i, j ) == 0 ); + } + + void setElementFast_LowerTriangularIndexMultimapTest() + { + IndexMultimapType m; + IndexMultimapSetter::setup( m ); + m.setDimensions( 10, 10 ); + IndexVector rowLengths; + rowLengths.setSize( m.getRows() ); + for( int i = 0; i < 10; i++ ) + rowLengths.setElement( i, i+1 ); + m.setCompressedRowsLengths( rowLengths ); + + if( DeviceType::DeviceType == ( int ) tnlHostDevice ) + { + for( int i = 0; i < 10; i++ ) + for( int j = 0; j <= i; j++ ) + m.setElementFast( i, j, i + j ); + } + if( DeviceType::DeviceType == ( int ) tnlCudaDevice ) + { +#ifdef HAVE_CUDA + IndexMultimapType* kernel_graph = tnlCuda::passToDevice( m ); + bool testResult( true ); + bool* kernel_testResult = tnlCuda::passToDevice( testResult ); + checkCudaDevice; + dim3 cudaBlockSize( 256 ), cudaGridSize( 1 ); + tnlIndexMultimapTester__setElementFast_LowerTriangularIndexMultimapTestCudaKernel1< IndexMultimapType > + <<< cudaGridSize, cudaBlockSize >>> + ( kernel_graph, + kernel_testResult ); + CPPUNIT_ASSERT( tnlCuda::passFromDevice( kernel_testResult ) ); + tnlCuda::freeFromDevice( kernel_graph ); + tnlCuda::freeFromDevice( kernel_testResult ); + checkCudaDevice; +#endif + } + + for( int i = 0; i < 10; i++ ) + for( int j = 0; j < 10; j++ ) + if( j <= i ) + CPPUNIT_ASSERT( m.getElement( i, j ) == i + j ); + else + CPPUNIT_ASSERT( m.getElement( i, j ) == 0 ); + + m.reset(); + m.setDimensions( 10, 10 ); + m.setCompressedRowsLengths( rowLengths ); + if( DeviceType::DeviceType == ( int ) tnlHostDevice ) + { + for( int i = 9; i >= 0; i-- ) + for( int j = i; j >= 0; j-- ) + m.setElementFast( i, j, i + j ); + } + if( DeviceType::DeviceType == ( int ) tnlCudaDevice ) + { +#ifdef HAVE_CUDA + IndexMultimapType* kernel_graph = tnlCuda::passToDevice( m ); + bool testResult( true ); + bool* kernel_testResult = tnlCuda::passToDevice( testResult ); + checkCudaDevice; + dim3 cudaBlockSize( 256 ), cudaGridSize( 1 ); + tnlIndexMultimapTester__setElementFast_LowerTriangularIndexMultimapTestCudaKernel2< IndexMultimapType > + <<< cudaGridSize, cudaBlockSize >>> + ( kernel_graph, + kernel_testResult ); + CPPUNIT_ASSERT( tnlCuda::passFromDevice( kernel_testResult ) ); + tnlCuda::freeFromDevice( kernel_graph ); + tnlCuda::freeFromDevice( kernel_testResult ); + checkCudaDevice; +#endif + } + + for( int i = 0; i < 10; i++ ) + for( int j = 0; j < 10; j++ ) + if( j <= i ) + CPPUNIT_ASSERT( m.getElement( i, j ) == i + j ); + else + CPPUNIT_ASSERT( m.getElement( i, j ) == 0 ); + } + + + void addElementTest() + { + IndexMultimapType m; + IndexMultimapSetter::setup( m ); + m.setDimensions( 10, 10 ); + IndexVector rowLengths; + rowLengths.setSize( m.getRows() ); + rowLengths.setValue( 7 ); + m.setCompressedRowsLengths( rowLengths ); + for( int i = 0; i < 10; i++ ) + m.setElement( i, i, i ); + for( int i = 0; i < 10; i++ ) + for( int j = 0; j < 10; j++ ) + if( abs( i - j ) <= 1 ) + m.addElement( i, j, 1 ); + + for( int i = 0; i < 10; i++ ) + for( int j = 0; j < 10; j++ ) + if( i == j ) + CPPUNIT_ASSERT( m.getElement( i, i ) == i + 1 ); + else + if( abs( i - j ) == 1 ) + CPPUNIT_ASSERT( m.getElement( i, j ) == 1 ); + else + CPPUNIT_ASSERT( m.getElement( i, j ) == 0 ); + } + + /**** + * Set row tests + */ + void setRow_DiagonalIndexMultimapTest() + { + IndexMultimapType m; + IndexMultimapSetter::setup( m ); + m.setDimensions( 10, 10 ); + IndexVector rowLengths; + rowLengths.setSize( m.getRows() ); + rowLengths.setValue( 7 ); + m.setCompressedRowsLengths( rowLengths ); + RealType values[ 1 ]; + IndexType columnIndexes[ 1 ]; + + for( int i = 0; i < 10; i++ ) + { + values[ 0 ] = i; + columnIndexes[ 0 ] = i; + m.setRow( i, columnIndexes, values, 1 ); + } + + for( int i = 0; i < 10; i++ ) + { + for( int j = 0; j < 10; j++ ) + { + if( i == j ) + CPPUNIT_ASSERT( m.getElement( i, j ) == i ); + else + CPPUNIT_ASSERT( m.getElement( i, j ) == 0 ); + } + } + } + + void setRowFast_DiagonalIndexMultimapTest() + { + IndexMultimapType m; + IndexMultimapSetter::setup( m ); + m.setDimensions( 10, 10 ); + IndexVector rowLengths; + rowLengths.setSize( m.getRows() ); + rowLengths.setValue( 7 ); + m.setCompressedRowsLengths( rowLengths ); + + + if( DeviceType::DeviceType == ( int ) tnlHostDevice ) + { + RealType values[ 1 ]; + IndexType columnIndexes[ 1 ]; + for( int i = 0; i < 10; i++ ) + { + values[ 0 ] = i; + columnIndexes[ 0 ] = i; + m.setRowFast( i, columnIndexes, values, 1 ); + } + } + if( DeviceType::DeviceType == ( int ) tnlCudaDevice ) + { +#ifdef HAVE_CUDA + IndexMultimapType* kernel_graph = tnlCuda::passToDevice( m ); + bool testResult( true ); + bool* kernel_testResult = tnlCuda::passToDevice( testResult ); + checkCudaDevice; + dim3 cudaBlockSize( 256 ), cudaGridSize( 1 ); + int sharedMemory = 100 * ( sizeof( IndexType ) + sizeof( RealType ) ); + tnlIndexMultimapTester__setRowFast_DiagonalIndexMultimapTestCudaKernel< IndexMultimapType > + <<< cudaGridSize, cudaBlockSize, sharedMemory >>> + ( kernel_graph, + kernel_testResult ); + CPPUNIT_ASSERT( tnlCuda::passFromDevice( kernel_testResult ) ); + tnlCuda::freeFromDevice( kernel_graph ); + tnlCuda::freeFromDevice( kernel_testResult ); + checkCudaDevice; +#endif + } + + for( int i = 0; i < 10; i++ ) + { + for( int j = 0; j < 10; j++ ) + { + if( i == j ) + CPPUNIT_ASSERT( m.getElement( i, j ) == i ); + else + CPPUNIT_ASSERT( m.getElement( i, j ) == 0 ); + } + } + } + + void setRow_DenseIndexMultimapTest() + { + IndexMultimapType m; + IndexMultimapSetter::setup( m ); + m.setDimensions( 10, 10 ); + IndexVector rowLengths; + rowLengths.setSize( m.getRows() ); + rowLengths.setValue( 10 ); + m.setCompressedRowsLengths( rowLengths ); + RealType values[ 10 ]; + IndexType columnIndexes[ 10 ]; + + for( int i = 0; i < 10; i++ ) + columnIndexes[ i ] = i; + for( int i = 0; i < 10; i++ ) + { + for( int j = 0; j < 10; j++ ) + if( i == j ) + values[ i ] = 1.0 + 0.5 * j; + else + values[ j ] = 1.0; + + m.setRow( i, columnIndexes, values, 10 ); + } + + for( int i = 0; i < 10; i++ ) + for( int j = 0; j < 10; j++ ) + if( i == j ) + CPPUNIT_ASSERT( m.getElement( i, j ) == 1.0+0.5*i ); + else + CPPUNIT_ASSERT( m.getElement( i, j ) == 1.0 ); + + m.reset(); + m.setDimensions( 10, 10 ); + m.setCompressedRowsLengths( rowLengths ); + for( int i = 9; i >= 0; i-- ) + { + for( int j = 9; j >= 0; j-- ) + values[ j ] = i+j; + m.setRow( i, columnIndexes, values, 10 ); + } + + for( int i = 9; i >= 0; i-- ) + for( int j = 9; j >= 0; j-- ) + CPPUNIT_ASSERT( m.getElement( i, j ) == i+j ); + } + + void setRowFast_DenseIndexMultimapTest() + { + IndexMultimapType m; + IndexMultimapSetter::setup( m ); + m.setDimensions( 10, 10 ); + IndexVector rowLengths; + rowLengths.setSize( m.getRows() ); + rowLengths.setValue( 10 ); + m.setCompressedRowsLengths( rowLengths ); + + RealType values[ 10 ]; + IndexType columnIndexes[ 10 ]; + for( int i = 0; i < 10; i++ ) + columnIndexes[ i ] = i; + + if( DeviceType::DeviceType == ( int ) tnlHostDevice ) + { + for( int i = 0; i < 10; i++ ) + { + for( int j = 0; j < 10; j++ ) + if( i == j ) + values[ i ] = 1.0 + 0.5 * j; + else + values[ j ] = 1.0; + + m.setRowFast( i, columnIndexes, values, 10 ); + } + } + if( DeviceType::DeviceType == ( int ) tnlCudaDevice ) + { +#ifdef HAVE_CUDA + IndexMultimapType* kernel_graph = tnlCuda::passToDevice( m ); + bool testResult( true ); + bool* kernel_testResult = tnlCuda::passToDevice( testResult ); + checkCudaDevice; + dim3 cudaBlockSize( 256 ), cudaGridSize( 1 ); + int sharedMemory = 100 * ( sizeof( IndexType ) + sizeof( RealType ) ); + tnlIndexMultimapTester__setRowFast_DenseIndexMultimapTestCudaKernel1< IndexMultimapType > + <<< cudaGridSize, cudaBlockSize, sharedMemory >>> + ( kernel_graph, + kernel_testResult ); + CPPUNIT_ASSERT( tnlCuda::passFromDevice( kernel_testResult ) ); + tnlCuda::freeFromDevice( kernel_graph ); + tnlCuda::freeFromDevice( kernel_testResult ); + checkCudaDevice; +#endif + } + + for( int i = 0; i < 10; i++ ) + for( int j = 0; j < 10; j++ ) + if( i == j ) + CPPUNIT_ASSERT( m.getElement( i, j ) == 1.0+0.5*i ); + else + CPPUNIT_ASSERT( m.getElement( i, j ) == 1.0 ); + + m.reset(); + m.setDimensions( 10, 10 ); + m.setCompressedRowsLengths( rowLengths ); + + if( DeviceType::DeviceType == ( int ) tnlHostDevice ) + { + for( int i = 9; i >= 0; i-- ) + { + for( int j = 9; j >= 0; j-- ) + values[ j ] = i+j; + m.setRowFast( i, columnIndexes, values, 10 ); + } + } + if( DeviceType::DeviceType == ( int ) tnlCudaDevice ) + { +#ifdef HAVE_CUDA + IndexMultimapType* kernel_graph = tnlCuda::passToDevice( m ); + bool testResult( true ); + bool* kernel_testResult = tnlCuda::passToDevice( testResult ); + checkCudaDevice; + dim3 cudaBlockSize( 256 ), cudaGridSize( 1 ); + int sharedMemory = 100 * ( sizeof( IndexType ) + sizeof( RealType ) ); + tnlIndexMultimapTester__setRowFast_DenseIndexMultimapTestCudaKernel2< IndexMultimapType > + <<< cudaGridSize, cudaBlockSize, sharedMemory >>> + ( kernel_graph, + kernel_testResult ); + CPPUNIT_ASSERT( tnlCuda::passFromDevice( kernel_testResult ) ); + tnlCuda::freeFromDevice( kernel_graph ); + tnlCuda::freeFromDevice( kernel_testResult ); + checkCudaDevice; +#endif + } + + for( int i = 9; i >= 0; i-- ) + for( int j = 9; j >= 0; j-- ) + CPPUNIT_ASSERT( m.getElement( i, j ) == i+j ); + } + + void setRow_LowerTriangularIndexMultimapTest() + { + IndexMultimapType m; + IndexMultimapSetter::setup( m ); + m.setDimensions( 10, 10 ); + IndexVector rowLengths; + rowLengths.setSize( m.getRows() ); + for( int i = 0; i < 10; i++ ) + rowLengths.setElement( i, i+1 ); + m.setCompressedRowsLengths( rowLengths ); + + + RealType values[ 10 ]; + IndexType columnIndexes[ 10 ]; + + for( int i = 0; i < 10; i++ ) + columnIndexes[ i ] = i; + + for( int i = 0; i < 10; i++ ) + { + for( int j = 0; j <= i; j++ ) + values[ j ] = i + j; + m.setRow( i, columnIndexes, values, i + 1 ); + } + + for( int i = 0; i < 10; i++ ) + for( int j = 0; j < 10; j++ ) + if( j <= i ) + CPPUNIT_ASSERT( m.getElement( i, j ) == i + j ); + else + CPPUNIT_ASSERT( m.getElement( i, j ) == 0 ); + + m.reset(); + m.setDimensions( 10, 10 ); + m.setCompressedRowsLengths( rowLengths ); + for( int i = 9; i >= 0; i-- ) + { + for( int j = i; j >= 0; j-- ) + values[ j ] = i + j; + m.setRow( i, columnIndexes, values, i + 1 ); + } + + for( int i = 0; i < 10; i++ ) + for( int j = 0; j < 10; j++ ) + if( j <= i ) + CPPUNIT_ASSERT( m.getElement( i, j ) == i + j ); + else + CPPUNIT_ASSERT( m.getElement( i, j ) == 0 ); + } + + void setRowFast_LowerTriangularIndexMultimapTest() + { + IndexMultimapType m; + IndexMultimapSetter::setup( m ); + m.setDimensions( 10, 10 ); + IndexVector rowLengths; + rowLengths.setSize( m.getRows() ); + for( int i = 0; i < 10; i++ ) + rowLengths.setElement( i, i+1 ); + m.setCompressedRowsLengths( rowLengths ); + + + RealType values[ 10 ]; + IndexType columnIndexes[ 10 ]; + for( int i = 0; i < 10; i++ ) + columnIndexes[ i ] = i; + + if( DeviceType::DeviceType == ( int ) tnlHostDevice ) + { + for( int i = 0; i < 10; i++ ) + { + for( int j = 0; j <= i; j++ ) + values[ j ] = i + j; + m.setRowFast( i, columnIndexes, values, i + 1 ); + } + } + if( DeviceType::DeviceType == ( int ) tnlCudaDevice ) + { +#ifdef HAVE_CUDA + IndexMultimapType* kernel_graph = tnlCuda::passToDevice( m ); + bool testResult( true ); + bool* kernel_testResult = tnlCuda::passToDevice( testResult ); + checkCudaDevice; + dim3 cudaBlockSize( 256 ), cudaGridSize( 1 ); + int sharedMemory = 100 * ( sizeof( IndexType ) + sizeof( RealType ) ); + tnlIndexMultimapTester__setRowFast_LowerTriangularIndexMultimapTestCudaKernel< IndexMultimapType > + <<< cudaGridSize, cudaBlockSize, sharedMemory >>> + ( kernel_graph, + kernel_testResult ); + CPPUNIT_ASSERT( tnlCuda::passFromDevice( kernel_testResult ) ); + tnlCuda::freeFromDevice( kernel_graph ); + tnlCuda::freeFromDevice( kernel_testResult ); + checkCudaDevice; +#endif + } + + for( int i = 0; i < 10; i++ ) + for( int j = 0; j < 10; j++ ) + if( j <= i ) + CPPUNIT_ASSERT( m.getElement( i, j ) == i + j ); + else + CPPUNIT_ASSERT( m.getElement( i, j ) == 0 ); + + m.reset(); + m.setDimensions( 10, 10 ); + m.setCompressedRowsLengths( rowLengths ); + + if( DeviceType::DeviceType == ( int ) tnlHostDevice ) + { + for( int i = 9; i >= 0; i-- ) + { + for( int j = i; j >= 0; j-- ) + values[ j ] = i + j; + m.setRowFast( i, columnIndexes, values, i + 1 ); + } + } + if( DeviceType::DeviceType == ( int ) tnlCudaDevice ) + { +#ifdef HAVE_CUDA + IndexMultimapType* kernel_graph = tnlCuda::passToDevice( m ); + bool testResult( true ); + bool* kernel_testResult = tnlCuda::passToDevice( testResult ); + checkCudaDevice; + dim3 cudaBlockSize( 256 ), cudaGridSize( 1 ); + int sharedMemory = 100 * ( sizeof( IndexType ) + sizeof( RealType ) ); + tnlIndexMultimapTester__setRowFast_LowerTriangularIndexMultimapTestCudaKernel< IndexMultimapType > + <<< cudaGridSize, cudaBlockSize, sharedMemory >>> + ( kernel_graph, + kernel_testResult ); + CPPUNIT_ASSERT( tnlCuda::passFromDevice( kernel_testResult ) ); + tnlCuda::freeFromDevice( kernel_graph ); + tnlCuda::freeFromDevice( kernel_testResult ); + checkCudaDevice; +#endif + } + + for( int i = 0; i < 10; i++ ) + for( int j = 0; j < 10; j++ ) + if( j <= i ) + CPPUNIT_ASSERT( m.getElement( i, j ) == i + j ); + else + CPPUNIT_ASSERT( m.getElement( i, j ) == 0 ); + } + + + void vectorProduct_DiagonalIndexMultimapTest() + { + const int size = 10; + VectorType v, w; + v.setSize( size ); + w.setSize( size ); + IndexMultimapType m; + IndexMultimapSetter::setup( m ); + m.setDimensions( size, size ); + IndexVector rowLengths; + rowLengths.setSize( m.getRows() ); + rowLengths.setValue( 7 ); + m.setCompressedRowsLengths( rowLengths ); + for( int i = 0; i < size; i++ ) + { + v.setElement( i, i ); + m.setElement( i, i, i ); + } + m.vectorProduct( v, w ); + + for( int i = 0; i < size; i++ ) + CPPUNIT_ASSERT( w.getElement( i ) == i*i ); + } + + void vectorProduct_DenseIndexMultimapTest() + { + const int size = 10; + VectorType v, w; + v.setSize( size ); + w.setSize( size ); + IndexMultimapType m; + IndexMultimapSetter::setup( m ); + m.setDimensions( size, size ); + IndexVector rowLengths; + rowLengths.setSize( m.getRows() ); + rowLengths.setValue( size ); + m.setCompressedRowsLengths( rowLengths ); + for( int i = 0; i < size; i++ ) + { + for( int j = 0; j < size; j++ ) + m.setElement( i, j, i ); + v.setElement( i, 1 ); + } + m.vectorProduct( v, w ); + + for( int i = 0; i < size; i++ ) + CPPUNIT_ASSERT( w.getElement( i ) == i*size ); + } + + void vectorProduct_LowerTriangularIndexMultimapTest() + { + const int size = 10; + VectorType v, w; + v.setSize( size ); + w.setSize( size ); + IndexMultimapType m; + IndexMultimapSetter::setup( m ); + m.setDimensions( size, size ); + IndexVector rowLengths; + rowLengths.setSize( m.getRows() ); + rowLengths.setValue( size ); + m.setCompressedRowsLengths( rowLengths ); + for( int i = 0; i < size; i++ ) + { + for( int j = 0; j <= i; j++ ) + m.setElement( i, j, i ); + v.setElement( i, 1 ); + } + m.vectorProduct( v, w ); + + for( int i = 0; i < size; i++ ) + CPPUNIT_ASSERT( w.getElement( i ) == i*( i + 1 ) ); + } + + + void addIndexMultimapTest() + { + } + + void graphTranspositionTest() + { + } +#endif + +}; + +#ifdef HAVE_CUDA + template< typename IndexMultimapType > + __global__ void tnlIndexMultimapTester__setElementFastTestCudaKernel( IndexMultimapType* graph, + bool* testResult ) + { + if( threadIdx.x == 0 ) + { + for( int i = 0; i < 7; i++ ) + if( graph->setElementFast( 0, i, i ) != true ) + testResult = false; + if( graph->setElementFast( 0, 8, 8 ) == true ) + testResult = false; + } + } + + template< typename IndexMultimapType > + __global__ void tnlIndexMultimapTester__setElementFast_DiagonalIndexMultimapTestCudaKernel( IndexMultimapType* graph, + bool* testResult ) + { + if( threadIdx.x < graph->getRows() ) + graph->setElementFast( threadIdx.x, threadIdx.x, threadIdx.x ); + } + + template< typename IndexMultimapType > + __global__ void tnlIndexMultimapTester__setElementFast_DenseIndexMultimapTestCudaKernel1( IndexMultimapType* graph, + bool* testResult ) + { + const typename IndexMultimapType::IndexType i = threadIdx.x; + if( i < graph->getRows() ) + { + graph->setElementFast( i, i, i ); + for( int j = 0; j < graph->getColumns(); j++ ) + graph->addElementFast( i, j, 1, 0.5 ); + } + } + + template< typename IndexMultimapType > + __global__ void tnlIndexMultimapTester__setElementFast_DenseIndexMultimapTestCudaKernel2( IndexMultimapType* graph, + bool* testResult ) + { + const typename IndexMultimapType::IndexType i = threadIdx.x; + if( i < graph->getRows() ) + { + for( int j = graph->getColumns() -1; j >= 0; j-- ) + graph->setElementFast( i, j, i + j ); + } + } + + template< typename IndexMultimapType > + __global__ void tnlIndexMultimapTester__setElementFast_LowerTriangularIndexMultimapTestCudaKernel1( IndexMultimapType* graph, + bool* testResult ) + { + const typename IndexMultimapType::IndexType i = threadIdx.x; + if( i < graph->getRows() ) + { + for( int j = 0; j <= i; j++ ) + graph->setElementFast( i, j, i + j ); + } + } + + template< typename IndexMultimapType > + __global__ void tnlIndexMultimapTester__setElementFast_LowerTriangularIndexMultimapTestCudaKernel2( IndexMultimapType* graph, + bool* testResult ) + { + const typename IndexMultimapType::IndexType i = threadIdx.x; + if( i < graph->getRows() ) + { + for( int j = i; j >= 0; j-- ) + graph->setElementFast( i, j, i + j ); + } + } + + /**** + * Set row tests kernels + */ + template< typename IndexMultimapType > + __global__ void tnlIndexMultimapTester__setRowFast_DiagonalIndexMultimapTestCudaKernel( IndexMultimapType* graph, + bool* testResult ) + { + typedef typename IndexMultimapType::RealType RealType; + typedef typename IndexMultimapType::IndexType IndexType; + + const IndexType row = threadIdx.x; + if( row >= graph->getRows() ) + return; + + IndexType* columnIndexes = getSharedMemory< IndexType >(); + RealType* valuesBase = ( RealType* ) & columnIndexes[ graph->getColumns() ]; + RealType* values = &valuesBase[ row ]; + + columnIndexes[ row ] = row; + values[ 0 ] = row; + + graph->setRowFast( row, &columnIndexes[ row ], values, 1 ); + } + + template< typename IndexMultimapType > + __global__ void tnlIndexMultimapTester__setRowFast_DenseIndexMultimapTestCudaKernel1( IndexMultimapType* graph, + bool* testResult ) + { + typedef typename IndexMultimapType::RealType RealType; + typedef typename IndexMultimapType::IndexType IndexType; + + const IndexType row = threadIdx.x; + if( row >= graph->getRows() ) + return; + + IndexType* columnIndexes = getSharedMemory< IndexType >(); + RealType* valuesBase = ( RealType* ) & columnIndexes[ graph->getColumns() ]; + RealType* values = &valuesBase[ row * graph->getColumns() ]; + + columnIndexes[ row ] = row; + + for( int i = 0; i < graph->getColumns(); i++ ) + { + if( i == row ) + values[ i ] = 1.0 + 0.5 * i; + else + values[ i ] = 1.0; + } + graph->setRowFast( row, columnIndexes, values, 10 ); + } + + template< typename IndexMultimapType > + __global__ void tnlIndexMultimapTester__setRowFast_DenseIndexMultimapTestCudaKernel2( IndexMultimapType* graph, + bool* testResult ) + { + typedef typename IndexMultimapType::RealType RealType; + typedef typename IndexMultimapType::IndexType IndexType; + + const IndexType row = threadIdx.x; + if( row >= graph->getRows() ) + return; + + IndexType* columnIndexes = getSharedMemory< IndexType >(); + RealType* valuesBase = ( RealType* ) & columnIndexes[ graph->getColumns() ]; + RealType* values = &valuesBase[ row * graph->getColumns() ]; + + columnIndexes[ row ] = row; + + for( int i = 0; i < graph->getColumns(); i++ ) + { + values[ i ] = row + i; + } + graph->setRowFast( row, columnIndexes, values, 10 ); + } + + template< typename IndexMultimapType > + __global__ void tnlIndexMultimapTester__setRowFast_LowerTriangularIndexMultimapTestCudaKernel( IndexMultimapType* graph, + bool* testResult ) + { + typedef typename IndexMultimapType::RealType RealType; + typedef typename IndexMultimapType::IndexType IndexType; + + const IndexType row = threadIdx.x; + if( row >= graph->getRows() ) + return; + + IndexType* columnIndexes = getSharedMemory< IndexType >(); + RealType* valuesBase = ( RealType* ) & columnIndexes[ graph->getColumns() ]; + RealType* values = &valuesBase[ row * graph->getColumns() ]; + + columnIndexes[ row ] = row; + + for( int i = 0; i <= row; i++ ) + { + values[ i ] = row + i; + } + graph->setRowFast( row, columnIndexes, values, row + 1 ); + } + +#endif + + +#endif + +#endif /* TNLINDEXMULTIMAPTESTER_H_ */ diff --git a/tests/unit-tests/mesh/CMakeLists.txt b/tests/unit-tests/mesh/CMakeLists.txt index 8a806acdfe3ac0bb351a4cc3b80235d733a5b206..d5f357e079b73fd2a5223c1e444fa44a0689b722 100755 --- a/tests/unit-tests/mesh/CMakeLists.txt +++ b/tests/unit-tests/mesh/CMakeLists.txt @@ -6,9 +6,9 @@ ADD_EXECUTABLE( tnlGridTest${mpiExt}${debugExt} ${headers} tnlGridTest.cpp ) TARGET_LINK_LIBRARIES( tnlGridTest${mpiExt}${debugExt} ${CPPUNIT_LIBRARIES} tnl${mpiExt}${debugExt}-0.1 ) -ADD_EXECUTABLE( tnlMeshEntityTest${mpiExt}${debugExt} ${headers} tnlMeshEntityTest.cpp ) -TARGET_LINK_LIBRARIES( tnlMeshEntityTest${mpiExt}${debugExt} ${CPPUNIT_LIBRARIES} - tnl${mpiExt}${debugExt}-0.1 ) +#ADD_EXECUTABLE( tnlMeshEntityTest${mpiExt}${debugExt} ${headers} tnlMeshEntityTest.cpp ) +#TARGET_LINK_LIBRARIES( tnlMeshEntityTest${mpiExt}${debugExt} ${CPPUNIT_LIBRARIES} +# tnl${mpiExt}${debugExt}-0.1 ) ADD_EXECUTABLE( tnlMeshTest${mpiExt}${debugExt} ${headers} tnlMeshTest.cpp ) TARGET_LINK_LIBRARIES( tnlMeshTest${mpiExt}${debugExt} ${CPPUNIT_LIBRARIES} diff --git a/tests/unit-tests/mesh/tnlMeshEntityTester.h b/tests/unit-tests/mesh/tnlMeshEntityTester.h index fdf5221e2a301731738fe1df59270a1676d9ca24..8a3928c27405b80bd30fc665f838e078e79eecbd 100644 --- a/tests/unit-tests/mesh/tnlMeshEntityTester.h +++ b/tests/unit-tests/mesh/tnlMeshEntityTester.h @@ -26,25 +26,47 @@ #include <cppunit/Message.h> #include <mesh/tnlMeshEntity.h> #include <mesh/config/tnlMeshConfigBase.h> -#include <mesh/topologies/tnlMeshVertexTag.h> -#include <mesh/topologies/tnlMeshEdgeTag.h> -#include <mesh/topologies/tnlMeshTriangleTag.h> -#include <mesh/topologies/tnlMeshTetrahedronTag.h> +#include <mesh/topologies/tnlMeshVertexTopology.h> +#include <mesh/topologies/tnlMeshEdgeTopology.h> +#include <mesh/topologies/tnlMeshTriangleTopology.h> +#include <mesh/topologies/tnlMeshTetrahedronTopology.h> -typedef tnlMeshConfigBase< tnlMeshTriangleTag, 2, double, int, int, void > TestTriangleEntityTag; -typedef tnlMeshConfigBase< tnlMeshEdgeTag, 2, double, int, int, void > TestEdgeEntityTag; -typedef tnlMeshConfigBase< tnlMeshVertexTag, 2, double, int, int, void > TestVertexEntityTag; +//typedef tnlMeshConfigBase< tnlMeshTriangleTopology, 2, double, int, int, void > TestTriangleEntityTopology; +typedef tnlMeshConfigBase< tnlMeshEdgeTopology, 2, double, int, int, void > TestEdgeEntityTopology; +typedef tnlMeshConfigBase< tnlMeshVertexTopology, 2, double, int, int, void > TestVertexEntityTopology; -template< int Dimensions > -struct tnlMeshSuperentityStorage< TestTriangleEntityTag, tnlMeshVertexTag, Dimensions > +class TestTriangleMeshConfig : public tnlMeshConfigBase< tnlMeshTriangleTopology > { - enum { enabled = true }; + public: + + template< typename MeshEntity > + static constexpr bool subentityStorage( MeshEntity entity, int subentityDimensions ) + { + return true; + } + + template< typename MeshEntity > + static constexpr bool superentityStorage( MeshEntity entity, int superentityDimensions ) + { + return true; + } }; -template< int Dimensions > -struct tnlMeshSuperentityStorage< TestTriangleEntityTag, tnlMeshEdgeTag, Dimensions > +class TestTetrahedronMeshConfig : public tnlMeshConfigBase< tnlMeshTetrahedronTopology > { - enum { enabled = true }; + public: + + template< typename MeshEntity > + static constexpr bool subentityStorage( MeshEntity entity, int subentityDimensions ) + { + return true; + } + + template< typename MeshEntity > + static constexpr bool superentityStorage( MeshEntity entity, int superentityDimensions ) + { + return true; + } }; template< typename RealType, typename Device, typename IndexType > @@ -76,8 +98,8 @@ class tnlMeshEntityTester : public CppUnit :: TestCase void vertexMeshEntityTest() { - typedef tnlMeshConfigBase< tnlMeshEdgeTag, 2, RealType, IndexType, IndexType, void > TestEntityTag; - typedef tnlMeshEntity< TestEntityTag, tnlMeshVertexTag > VertexMeshEntityType; + typedef tnlMeshConfigBase< tnlMeshEdgeTopology, 2, RealType, IndexType, IndexType, void > TestEntityTopology; + typedef tnlMeshEntity< TestEntityTopology, tnlMeshVertexTopology > VertexMeshEntityType; typedef typename VertexMeshEntityType::PointType PointType; CPPUNIT_ASSERT( PointType::getType() == ( tnlStaticVector< 2, RealType >::getType() ) ); @@ -92,8 +114,8 @@ class tnlMeshEntityTester : public CppUnit :: TestCase void edgeMeshEntityTest() { - typedef tnlMeshEntity< TestEdgeEntityTag, tnlMeshEdgeTag > EdgeMeshEntityType; - typedef tnlMeshEntity< TestEdgeEntityTag, tnlMeshVertexTag > VertexMeshEntityType; + typedef tnlMeshEntity< TestEdgeEntityTopology, tnlMeshEdgeTopology > EdgeMeshEntityType; + typedef tnlMeshEntity< TestEdgeEntityTopology, tnlMeshVertexTopology > VertexMeshEntityType; typedef typename VertexMeshEntityType::PointType PointType; CPPUNIT_ASSERT( PointType::getType() == ( tnlStaticVector< 2, RealType >::getType() ) ); @@ -155,9 +177,12 @@ class tnlMeshEntityTester : public CppUnit :: TestCase void triangleMeshEntityTest() { - typedef tnlMeshEntity< TestTriangleEntityTag, tnlMeshTriangleTag > TriangleMeshEntityType; - typedef tnlMeshEntity< TestEdgeEntityTag, tnlMeshEdgeTag > EdgeMeshEntityType; - typedef tnlMeshEntity< TestVertexEntityTag, tnlMeshVertexTag > VertexMeshEntityType; + typedef tnlMeshEntity< TestTriangleMeshConfig, tnlMeshTriangleTopology > TriangleMeshEntityType; + + static_assert( TriangleMeshEntityType::SubentityTraits< 1 >::storageEnabled, "Testing triangular mesh does not store edges as required." ); + static_assert( TriangleMeshEntityType::SubentityTraits< 0 >::storageEnabled, "" ); + typedef tnlMeshEntity< TestEdgeEntityTopology, tnlMeshEdgeTopology > EdgeMeshEntityType; + typedef tnlMeshEntity< TestVertexEntityTopology, tnlMeshVertexTopology > VertexMeshEntityType; typedef typename VertexMeshEntityType::PointType PointType; CPPUNIT_ASSERT( PointType::getType() == ( tnlStaticVector< 2, RealType >::getType() ) ); @@ -178,19 +203,19 @@ class tnlMeshEntityTester : public CppUnit :: TestCase CPPUNIT_ASSERT( vertexEntities[ 2 ].getPoint() == point2 ); tnlStaticArray< 3, EdgeMeshEntityType > edgeEntities; - edgeEntities[ 0 ].setVertexIndex( 0, tnlSubentityVertex< tnlMeshTriangleTag, tnlMeshEdgeTag, 0, 0 >::index ); - edgeEntities[ 0 ].setVertexIndex( 1, tnlSubentityVertex< tnlMeshTriangleTag, tnlMeshEdgeTag, 0, 1 >::index ); - edgeEntities[ 1 ].setVertexIndex( 0, tnlSubentityVertex< tnlMeshTriangleTag, tnlMeshEdgeTag, 1, 0 >::index ); - edgeEntities[ 1 ].setVertexIndex( 1, tnlSubentityVertex< tnlMeshTriangleTag, tnlMeshEdgeTag, 1, 1 >::index ); - edgeEntities[ 2 ].setVertexIndex( 0, tnlSubentityVertex< tnlMeshTriangleTag, tnlMeshEdgeTag, 2, 0 >::index ); - edgeEntities[ 2 ].setVertexIndex( 1, tnlSubentityVertex< tnlMeshTriangleTag, tnlMeshEdgeTag, 2, 1 >::index ); - - CPPUNIT_ASSERT( edgeEntities[ 0 ].getVertexIndex( 0 ) == ( tnlSubentityVertex< tnlMeshTriangleTag, tnlMeshEdgeTag, 0, 0 >::index ) ); - CPPUNIT_ASSERT( edgeEntities[ 0 ].getVertexIndex( 1 ) == ( tnlSubentityVertex< tnlMeshTriangleTag, tnlMeshEdgeTag, 0, 1 >::index ) ); - CPPUNIT_ASSERT( edgeEntities[ 1 ].getVertexIndex( 0 ) == ( tnlSubentityVertex< tnlMeshTriangleTag, tnlMeshEdgeTag, 1, 0 >::index ) ); - CPPUNIT_ASSERT( edgeEntities[ 1 ].getVertexIndex( 1 ) == ( tnlSubentityVertex< tnlMeshTriangleTag, tnlMeshEdgeTag, 1, 1 >::index ) ); - CPPUNIT_ASSERT( edgeEntities[ 2 ].getVertexIndex( 0 ) == ( tnlSubentityVertex< tnlMeshTriangleTag, tnlMeshEdgeTag, 2, 0 >::index ) ); - CPPUNIT_ASSERT( edgeEntities[ 2 ].getVertexIndex( 1 ) == ( tnlSubentityVertex< tnlMeshTriangleTag, tnlMeshEdgeTag, 2, 1 >::index ) ); + edgeEntities[ 0 ].setVertexIndex( 0, tnlSubentityVertex< tnlMeshTriangleTopology, tnlMeshEdgeTopology, 0, 0 >::index ); + edgeEntities[ 0 ].setVertexIndex( 1, tnlSubentityVertex< tnlMeshTriangleTopology, tnlMeshEdgeTopology, 0, 1 >::index ); + edgeEntities[ 1 ].setVertexIndex( 0, tnlSubentityVertex< tnlMeshTriangleTopology, tnlMeshEdgeTopology, 1, 0 >::index ); + edgeEntities[ 1 ].setVertexIndex( 1, tnlSubentityVertex< tnlMeshTriangleTopology, tnlMeshEdgeTopology, 1, 1 >::index ); + edgeEntities[ 2 ].setVertexIndex( 0, tnlSubentityVertex< tnlMeshTriangleTopology, tnlMeshEdgeTopology, 2, 0 >::index ); + edgeEntities[ 2 ].setVertexIndex( 1, tnlSubentityVertex< tnlMeshTriangleTopology, tnlMeshEdgeTopology, 2, 1 >::index ); + + CPPUNIT_ASSERT( edgeEntities[ 0 ].getVertexIndex( 0 ) == ( tnlSubentityVertex< tnlMeshTriangleTopology, tnlMeshEdgeTopology, 0, 0 >::index ) ); + CPPUNIT_ASSERT( edgeEntities[ 0 ].getVertexIndex( 1 ) == ( tnlSubentityVertex< tnlMeshTriangleTopology, tnlMeshEdgeTopology, 0, 1 >::index ) ); + CPPUNIT_ASSERT( edgeEntities[ 1 ].getVertexIndex( 0 ) == ( tnlSubentityVertex< tnlMeshTriangleTopology, tnlMeshEdgeTopology, 1, 0 >::index ) ); + CPPUNIT_ASSERT( edgeEntities[ 1 ].getVertexIndex( 1 ) == ( tnlSubentityVertex< tnlMeshTriangleTopology, tnlMeshEdgeTopology, 1, 1 >::index ) ); + CPPUNIT_ASSERT( edgeEntities[ 2 ].getVertexIndex( 0 ) == ( tnlSubentityVertex< tnlMeshTriangleTopology, tnlMeshEdgeTopology, 2, 0 >::index ) ); + CPPUNIT_ASSERT( edgeEntities[ 2 ].getVertexIndex( 1 ) == ( tnlSubentityVertex< tnlMeshTriangleTopology, tnlMeshEdgeTopology, 2, 1 >::index ) ); TriangleMeshEntityType triangleEntity; @@ -213,15 +238,15 @@ class tnlMeshEntityTester : public CppUnit :: TestCase void tetrahedronMeshEntityTest() { - typedef tnlMeshConfigBase< tnlMeshTetrahedronTag, 3, RealType, IndexType, IndexType, void > TestTetrahedronEntityTag; - typedef tnlMeshConfigBase< tnlMeshTriangleTag, 3, RealType, IndexType, IndexType, void > TestTriangleEntityTag; - typedef tnlMeshConfigBase< tnlMeshEdgeTag, 3, RealType, IndexType, IndexType, void > TestEdgeEntityTag; - typedef tnlMeshConfigBase< tnlMeshVertexTag, 3, RealType, IndexType, IndexType, void > TestVertexEntityTag; - - typedef tnlMeshEntity< TestTetrahedronEntityTag, tnlMeshTetrahedronTag > TetrahedronMeshEntityType; - typedef tnlMeshEntity< TestTriangleEntityTag, tnlMeshTriangleTag > TriangleMeshEntityType; - typedef tnlMeshEntity< TestEdgeEntityTag, tnlMeshEdgeTag > EdgeMeshEntityType; - typedef tnlMeshEntity< TestVertexEntityTag, tnlMeshVertexTag > VertexMeshEntityType; + //typedef tnlMeshConfigBase< tnlMeshTetrahedronTopology, 3, RealType, IndexType, IndexType, void > TestTetrahedronEntityTopology; + typedef tnlMeshConfigBase< tnlMeshTriangleTopology, 3, RealType, IndexType, IndexType, void > TestTriangleEntityTopology; + typedef tnlMeshConfigBase< tnlMeshEdgeTopology, 3, RealType, IndexType, IndexType, void > TestEdgeEntityTopology; + typedef tnlMeshConfigBase< tnlMeshVertexTopology, 3, RealType, IndexType, IndexType, void > TestVertexEntityTopology; + + typedef tnlMeshEntity< TestTetrahedronMeshConfig, tnlMeshTetrahedronTopology > TetrahedronMeshEntityType; + typedef tnlMeshEntity< TestTriangleMeshConfig, tnlMeshTriangleTopology > TriangleMeshEntityType; + typedef tnlMeshEntity< TestEdgeEntityTopology, tnlMeshEdgeTopology > EdgeMeshEntityType; + typedef tnlMeshEntity< TestVertexEntityTopology, tnlMeshVertexTopology > VertexMeshEntityType; typedef typename VertexMeshEntityType::PointType PointType; CPPUNIT_ASSERT( PointType::getType() == ( tnlStaticVector< 3, RealType >::getType() ) ); @@ -234,7 +259,7 @@ class tnlMeshEntityTester : public CppUnit :: TestCase point2( 0.0, 1.0, 0.0 ), point3( 0.0, 0.0, 1.0 ); - tnlStaticArray< tnlSubentities< tnlMeshTetrahedronTag, 0 >::count, + tnlStaticArray< tnlMeshSubtopology< tnlMeshTetrahedronTopology, 0 >::count, VertexMeshEntityType > vertexEntities; vertexEntities[ 0 ].setPoint( point0 ); @@ -247,58 +272,58 @@ class tnlMeshEntityTester : public CppUnit :: TestCase CPPUNIT_ASSERT( vertexEntities[ 2 ].getPoint() == point2 ); CPPUNIT_ASSERT( vertexEntities[ 3 ].getPoint() == point3 ); - tnlStaticArray< tnlSubentities< tnlMeshTetrahedronTag, 1 >::count, + tnlStaticArray< tnlMeshSubtopology< tnlMeshTetrahedronTopology, 1 >::count, EdgeMeshEntityType > edgeEntities; - edgeEntities[ 0 ].setVertexIndex( 0, tnlSubentityVertex< tnlMeshTetrahedronTag, tnlMeshEdgeTag, 0, 0 >::index ); - edgeEntities[ 0 ].setVertexIndex( 1, tnlSubentityVertex< tnlMeshTetrahedronTag, tnlMeshEdgeTag, 0, 1 >::index ); - edgeEntities[ 1 ].setVertexIndex( 0, tnlSubentityVertex< tnlMeshTetrahedronTag, tnlMeshEdgeTag, 1, 0 >::index ); - edgeEntities[ 1 ].setVertexIndex( 1, tnlSubentityVertex< tnlMeshTetrahedronTag, tnlMeshEdgeTag, 1, 1 >::index ); - edgeEntities[ 2 ].setVertexIndex( 0, tnlSubentityVertex< tnlMeshTetrahedronTag, tnlMeshEdgeTag, 2, 0 >::index ); - edgeEntities[ 2 ].setVertexIndex( 1, tnlSubentityVertex< tnlMeshTetrahedronTag, tnlMeshEdgeTag, 2, 1 >::index ); - edgeEntities[ 3 ].setVertexIndex( 0, tnlSubentityVertex< tnlMeshTetrahedronTag, tnlMeshEdgeTag, 3, 0 >::index ); - edgeEntities[ 3 ].setVertexIndex( 1, tnlSubentityVertex< tnlMeshTetrahedronTag, tnlMeshEdgeTag, 3, 1 >::index ); - edgeEntities[ 4 ].setVertexIndex( 0, tnlSubentityVertex< tnlMeshTetrahedronTag, tnlMeshEdgeTag, 4, 0 >::index ); - edgeEntities[ 4 ].setVertexIndex( 1, tnlSubentityVertex< tnlMeshTetrahedronTag, tnlMeshEdgeTag, 4, 1 >::index ); - edgeEntities[ 5 ].setVertexIndex( 0, tnlSubentityVertex< tnlMeshTetrahedronTag, tnlMeshEdgeTag, 5, 0 >::index ); - edgeEntities[ 5 ].setVertexIndex( 1, tnlSubentityVertex< tnlMeshTetrahedronTag, tnlMeshEdgeTag, 5, 1 >::index ); - - CPPUNIT_ASSERT( edgeEntities[ 0 ].getVertexIndex( 0 ) == ( tnlSubentityVertex< tnlMeshTetrahedronTag, tnlMeshEdgeTag, 0, 0 >::index ) ); - CPPUNIT_ASSERT( edgeEntities[ 0 ].getVertexIndex( 1 ) == ( tnlSubentityVertex< tnlMeshTetrahedronTag, tnlMeshEdgeTag, 0, 1 >::index ) ); - CPPUNIT_ASSERT( edgeEntities[ 1 ].getVertexIndex( 0 ) == ( tnlSubentityVertex< tnlMeshTetrahedronTag, tnlMeshEdgeTag, 1, 0 >::index ) ); - CPPUNIT_ASSERT( edgeEntities[ 1 ].getVertexIndex( 1 ) == ( tnlSubentityVertex< tnlMeshTetrahedronTag, tnlMeshEdgeTag, 1, 1 >::index ) ); - CPPUNIT_ASSERT( edgeEntities[ 2 ].getVertexIndex( 0 ) == ( tnlSubentityVertex< tnlMeshTetrahedronTag, tnlMeshEdgeTag, 2, 0 >::index ) ); - CPPUNIT_ASSERT( edgeEntities[ 2 ].getVertexIndex( 1 ) == ( tnlSubentityVertex< tnlMeshTetrahedronTag, tnlMeshEdgeTag, 2, 1 >::index ) ); - CPPUNIT_ASSERT( edgeEntities[ 3 ].getVertexIndex( 0 ) == ( tnlSubentityVertex< tnlMeshTetrahedronTag, tnlMeshEdgeTag, 3, 0 >::index ) ); - CPPUNIT_ASSERT( edgeEntities[ 3 ].getVertexIndex( 1 ) == ( tnlSubentityVertex< tnlMeshTetrahedronTag, tnlMeshEdgeTag, 3, 1 >::index ) ); - CPPUNIT_ASSERT( edgeEntities[ 4 ].getVertexIndex( 0 ) == ( tnlSubentityVertex< tnlMeshTetrahedronTag, tnlMeshEdgeTag, 4, 0 >::index ) ); - CPPUNIT_ASSERT( edgeEntities[ 4 ].getVertexIndex( 1 ) == ( tnlSubentityVertex< tnlMeshTetrahedronTag, tnlMeshEdgeTag, 4, 1 >::index ) ); - CPPUNIT_ASSERT( edgeEntities[ 5 ].getVertexIndex( 0 ) == ( tnlSubentityVertex< tnlMeshTetrahedronTag, tnlMeshEdgeTag, 5, 0 >::index ) ); - CPPUNIT_ASSERT( edgeEntities[ 5 ].getVertexIndex( 1 ) == ( tnlSubentityVertex< tnlMeshTetrahedronTag, tnlMeshEdgeTag, 5, 1 >::index ) ); - - tnlStaticArray< tnlSubentities< tnlMeshTetrahedronTag, 2 >::count, + edgeEntities[ 0 ].setVertexIndex( 0, tnlSubentityVertex< tnlMeshTetrahedronTopology, tnlMeshEdgeTopology, 0, 0 >::index ); + edgeEntities[ 0 ].setVertexIndex( 1, tnlSubentityVertex< tnlMeshTetrahedronTopology, tnlMeshEdgeTopology, 0, 1 >::index ); + edgeEntities[ 1 ].setVertexIndex( 0, tnlSubentityVertex< tnlMeshTetrahedronTopology, tnlMeshEdgeTopology, 1, 0 >::index ); + edgeEntities[ 1 ].setVertexIndex( 1, tnlSubentityVertex< tnlMeshTetrahedronTopology, tnlMeshEdgeTopology, 1, 1 >::index ); + edgeEntities[ 2 ].setVertexIndex( 0, tnlSubentityVertex< tnlMeshTetrahedronTopology, tnlMeshEdgeTopology, 2, 0 >::index ); + edgeEntities[ 2 ].setVertexIndex( 1, tnlSubentityVertex< tnlMeshTetrahedronTopology, tnlMeshEdgeTopology, 2, 1 >::index ); + edgeEntities[ 3 ].setVertexIndex( 0, tnlSubentityVertex< tnlMeshTetrahedronTopology, tnlMeshEdgeTopology, 3, 0 >::index ); + edgeEntities[ 3 ].setVertexIndex( 1, tnlSubentityVertex< tnlMeshTetrahedronTopology, tnlMeshEdgeTopology, 3, 1 >::index ); + edgeEntities[ 4 ].setVertexIndex( 0, tnlSubentityVertex< tnlMeshTetrahedronTopology, tnlMeshEdgeTopology, 4, 0 >::index ); + edgeEntities[ 4 ].setVertexIndex( 1, tnlSubentityVertex< tnlMeshTetrahedronTopology, tnlMeshEdgeTopology, 4, 1 >::index ); + edgeEntities[ 5 ].setVertexIndex( 0, tnlSubentityVertex< tnlMeshTetrahedronTopology, tnlMeshEdgeTopology, 5, 0 >::index ); + edgeEntities[ 5 ].setVertexIndex( 1, tnlSubentityVertex< tnlMeshTetrahedronTopology, tnlMeshEdgeTopology, 5, 1 >::index ); + + CPPUNIT_ASSERT( edgeEntities[ 0 ].getVertexIndex( 0 ) == ( tnlSubentityVertex< tnlMeshTetrahedronTopology, tnlMeshEdgeTopology, 0, 0 >::index ) ); + CPPUNIT_ASSERT( edgeEntities[ 0 ].getVertexIndex( 1 ) == ( tnlSubentityVertex< tnlMeshTetrahedronTopology, tnlMeshEdgeTopology, 0, 1 >::index ) ); + CPPUNIT_ASSERT( edgeEntities[ 1 ].getVertexIndex( 0 ) == ( tnlSubentityVertex< tnlMeshTetrahedronTopology, tnlMeshEdgeTopology, 1, 0 >::index ) ); + CPPUNIT_ASSERT( edgeEntities[ 1 ].getVertexIndex( 1 ) == ( tnlSubentityVertex< tnlMeshTetrahedronTopology, tnlMeshEdgeTopology, 1, 1 >::index ) ); + CPPUNIT_ASSERT( edgeEntities[ 2 ].getVertexIndex( 0 ) == ( tnlSubentityVertex< tnlMeshTetrahedronTopology, tnlMeshEdgeTopology, 2, 0 >::index ) ); + CPPUNIT_ASSERT( edgeEntities[ 2 ].getVertexIndex( 1 ) == ( tnlSubentityVertex< tnlMeshTetrahedronTopology, tnlMeshEdgeTopology, 2, 1 >::index ) ); + CPPUNIT_ASSERT( edgeEntities[ 3 ].getVertexIndex( 0 ) == ( tnlSubentityVertex< tnlMeshTetrahedronTopology, tnlMeshEdgeTopology, 3, 0 >::index ) ); + CPPUNIT_ASSERT( edgeEntities[ 3 ].getVertexIndex( 1 ) == ( tnlSubentityVertex< tnlMeshTetrahedronTopology, tnlMeshEdgeTopology, 3, 1 >::index ) ); + CPPUNIT_ASSERT( edgeEntities[ 4 ].getVertexIndex( 0 ) == ( tnlSubentityVertex< tnlMeshTetrahedronTopology, tnlMeshEdgeTopology, 4, 0 >::index ) ); + CPPUNIT_ASSERT( edgeEntities[ 4 ].getVertexIndex( 1 ) == ( tnlSubentityVertex< tnlMeshTetrahedronTopology, tnlMeshEdgeTopology, 4, 1 >::index ) ); + CPPUNIT_ASSERT( edgeEntities[ 5 ].getVertexIndex( 0 ) == ( tnlSubentityVertex< tnlMeshTetrahedronTopology, tnlMeshEdgeTopology, 5, 0 >::index ) ); + CPPUNIT_ASSERT( edgeEntities[ 5 ].getVertexIndex( 1 ) == ( tnlSubentityVertex< tnlMeshTetrahedronTopology, tnlMeshEdgeTopology, 5, 1 >::index ) ); + + tnlStaticArray< tnlMeshSubtopology< tnlMeshTetrahedronTopology, 2 >::count, TriangleMeshEntityType > triangleEntities; - triangleEntities[ 0 ].setVertexIndex( 0, tnlSubentityVertex< tnlMeshTetrahedronTag, tnlMeshTriangleTag, 0, 0 >::index ); - triangleEntities[ 0 ].setVertexIndex( 1, tnlSubentityVertex< tnlMeshTetrahedronTag, tnlMeshTriangleTag, 0, 1 >::index ); - triangleEntities[ 0 ].setVertexIndex( 2, tnlSubentityVertex< tnlMeshTetrahedronTag, tnlMeshTriangleTag, 0, 2 >::index ); - triangleEntities[ 1 ].setVertexIndex( 0, tnlSubentityVertex< tnlMeshTetrahedronTag, tnlMeshTriangleTag, 1, 0 >::index ); - triangleEntities[ 1 ].setVertexIndex( 1, tnlSubentityVertex< tnlMeshTetrahedronTag, tnlMeshTriangleTag, 1, 1 >::index ); - triangleEntities[ 1 ].setVertexIndex( 2, tnlSubentityVertex< tnlMeshTetrahedronTag, tnlMeshTriangleTag, 1, 2 >::index ); - triangleEntities[ 2 ].setVertexIndex( 0, tnlSubentityVertex< tnlMeshTetrahedronTag, tnlMeshTriangleTag, 2, 0 >::index ); - triangleEntities[ 2 ].setVertexIndex( 1, tnlSubentityVertex< tnlMeshTetrahedronTag, tnlMeshTriangleTag, 2, 1 >::index ); - triangleEntities[ 2 ].setVertexIndex( 2, tnlSubentityVertex< tnlMeshTetrahedronTag, tnlMeshTriangleTag, 2, 2 >::index ); - triangleEntities[ 3 ].setVertexIndex( 0, tnlSubentityVertex< tnlMeshTetrahedronTag, tnlMeshTriangleTag, 3, 0 >::index ); - triangleEntities[ 3 ].setVertexIndex( 1, tnlSubentityVertex< tnlMeshTetrahedronTag, tnlMeshTriangleTag, 3, 1 >::index ); - triangleEntities[ 3 ].setVertexIndex( 2, tnlSubentityVertex< tnlMeshTetrahedronTag, tnlMeshTriangleTag, 3, 2 >::index ); - - CPPUNIT_ASSERT( triangleEntities[ 0 ].getVertexIndex( 0 ) == ( tnlSubentityVertex< tnlMeshTetrahedronTag, tnlMeshTriangleTag, 0, 0 >::index ) ); - CPPUNIT_ASSERT( triangleEntities[ 0 ].getVertexIndex( 1 ) == ( tnlSubentityVertex< tnlMeshTetrahedronTag, tnlMeshTriangleTag, 0, 1 >::index ) ); - CPPUNIT_ASSERT( triangleEntities[ 0 ].getVertexIndex( 2 ) == ( tnlSubentityVertex< tnlMeshTetrahedronTag, tnlMeshTriangleTag, 0, 2 >::index ) ); - CPPUNIT_ASSERT( triangleEntities[ 1 ].getVertexIndex( 0 ) == ( tnlSubentityVertex< tnlMeshTetrahedronTag, tnlMeshTriangleTag, 1, 0 >::index ) ); - CPPUNIT_ASSERT( triangleEntities[ 1 ].getVertexIndex( 1 ) == ( tnlSubentityVertex< tnlMeshTetrahedronTag, tnlMeshTriangleTag, 1, 1 >::index ) ); - CPPUNIT_ASSERT( triangleEntities[ 1 ].getVertexIndex( 2 ) == ( tnlSubentityVertex< tnlMeshTetrahedronTag, tnlMeshTriangleTag, 1, 2 >::index ) ); - CPPUNIT_ASSERT( triangleEntities[ 2 ].getVertexIndex( 0 ) == ( tnlSubentityVertex< tnlMeshTetrahedronTag, tnlMeshTriangleTag, 2, 0 >::index ) ); - CPPUNIT_ASSERT( triangleEntities[ 2 ].getVertexIndex( 1 ) == ( tnlSubentityVertex< tnlMeshTetrahedronTag, tnlMeshTriangleTag, 2, 1 >::index ) ); - CPPUNIT_ASSERT( triangleEntities[ 2 ].getVertexIndex( 2 ) == ( tnlSubentityVertex< tnlMeshTetrahedronTag, tnlMeshTriangleTag, 2, 2 >::index ) ); + triangleEntities[ 0 ].setVertexIndex( 0, tnlSubentityVertex< tnlMeshTetrahedronTopology, tnlMeshTriangleTopology, 0, 0 >::index ); + triangleEntities[ 0 ].setVertexIndex( 1, tnlSubentityVertex< tnlMeshTetrahedronTopology, tnlMeshTriangleTopology, 0, 1 >::index ); + triangleEntities[ 0 ].setVertexIndex( 2, tnlSubentityVertex< tnlMeshTetrahedronTopology, tnlMeshTriangleTopology, 0, 2 >::index ); + triangleEntities[ 1 ].setVertexIndex( 0, tnlSubentityVertex< tnlMeshTetrahedronTopology, tnlMeshTriangleTopology, 1, 0 >::index ); + triangleEntities[ 1 ].setVertexIndex( 1, tnlSubentityVertex< tnlMeshTetrahedronTopology, tnlMeshTriangleTopology, 1, 1 >::index ); + triangleEntities[ 1 ].setVertexIndex( 2, tnlSubentityVertex< tnlMeshTetrahedronTopology, tnlMeshTriangleTopology, 1, 2 >::index ); + triangleEntities[ 2 ].setVertexIndex( 0, tnlSubentityVertex< tnlMeshTetrahedronTopology, tnlMeshTriangleTopology, 2, 0 >::index ); + triangleEntities[ 2 ].setVertexIndex( 1, tnlSubentityVertex< tnlMeshTetrahedronTopology, tnlMeshTriangleTopology, 2, 1 >::index ); + triangleEntities[ 2 ].setVertexIndex( 2, tnlSubentityVertex< tnlMeshTetrahedronTopology, tnlMeshTriangleTopology, 2, 2 >::index ); + triangleEntities[ 3 ].setVertexIndex( 0, tnlSubentityVertex< tnlMeshTetrahedronTopology, tnlMeshTriangleTopology, 3, 0 >::index ); + triangleEntities[ 3 ].setVertexIndex( 1, tnlSubentityVertex< tnlMeshTetrahedronTopology, tnlMeshTriangleTopology, 3, 1 >::index ); + triangleEntities[ 3 ].setVertexIndex( 2, tnlSubentityVertex< tnlMeshTetrahedronTopology, tnlMeshTriangleTopology, 3, 2 >::index ); + + CPPUNIT_ASSERT( triangleEntities[ 0 ].getVertexIndex( 0 ) == ( tnlSubentityVertex< tnlMeshTetrahedronTopology, tnlMeshTriangleTopology, 0, 0 >::index ) ); + CPPUNIT_ASSERT( triangleEntities[ 0 ].getVertexIndex( 1 ) == ( tnlSubentityVertex< tnlMeshTetrahedronTopology, tnlMeshTriangleTopology, 0, 1 >::index ) ); + CPPUNIT_ASSERT( triangleEntities[ 0 ].getVertexIndex( 2 ) == ( tnlSubentityVertex< tnlMeshTetrahedronTopology, tnlMeshTriangleTopology, 0, 2 >::index ) ); + CPPUNIT_ASSERT( triangleEntities[ 1 ].getVertexIndex( 0 ) == ( tnlSubentityVertex< tnlMeshTetrahedronTopology, tnlMeshTriangleTopology, 1, 0 >::index ) ); + CPPUNIT_ASSERT( triangleEntities[ 1 ].getVertexIndex( 1 ) == ( tnlSubentityVertex< tnlMeshTetrahedronTopology, tnlMeshTriangleTopology, 1, 1 >::index ) ); + CPPUNIT_ASSERT( triangleEntities[ 1 ].getVertexIndex( 2 ) == ( tnlSubentityVertex< tnlMeshTetrahedronTopology, tnlMeshTriangleTopology, 1, 2 >::index ) ); + CPPUNIT_ASSERT( triangleEntities[ 2 ].getVertexIndex( 0 ) == ( tnlSubentityVertex< tnlMeshTetrahedronTopology, tnlMeshTriangleTopology, 2, 0 >::index ) ); + CPPUNIT_ASSERT( triangleEntities[ 2 ].getVertexIndex( 1 ) == ( tnlSubentityVertex< tnlMeshTetrahedronTopology, tnlMeshTriangleTopology, 2, 1 >::index ) ); + CPPUNIT_ASSERT( triangleEntities[ 2 ].getVertexIndex( 2 ) == ( tnlSubentityVertex< tnlMeshTetrahedronTopology, tnlMeshTriangleTopology, 2, 2 >::index ) ); TetrahedronMeshEntityType tetrahedronEntity; tetrahedronEntity.setVertexIndex( 0, 0 ); @@ -339,9 +364,9 @@ class tnlMeshEntityTester : public CppUnit :: TestCase void twoTrianglesTest() { - typedef tnlMeshEntity< TestTriangleEntityTag, tnlMeshTriangleTag > TriangleMeshEntityType; - typedef tnlMeshEntity< TestTriangleEntityTag, tnlMeshEdgeTag > EdgeMeshEntityType; - typedef tnlMeshEntity< TestTriangleEntityTag, tnlMeshVertexTag > VertexMeshEntityType; + typedef tnlMeshEntity< TestTriangleMeshConfig, tnlMeshTriangleTopology > TriangleMeshEntityType; + typedef tnlMeshEntity< TestTriangleMeshConfig, tnlMeshEdgeTopology > EdgeMeshEntityType; + typedef tnlMeshEntity< TestTriangleMeshConfig, tnlMeshVertexTopology > VertexMeshEntityType; typedef typename VertexMeshEntityType::PointType PointType; CPPUNIT_ASSERT( PointType::getType() == ( tnlStaticVector< 2, RealType >::getType() ) ); @@ -431,7 +456,7 @@ class tnlMeshEntityTester : public CppUnit :: TestCase CPPUNIT_ASSERT( triangleEntities[ 1 ].template getSubentityIndex< 1 >( 1 ) == 3 ); CPPUNIT_ASSERT( triangleEntities[ 1 ].template getSubentityIndex< 1 >( 2 ) == 4 ); - vertexEntities[ 0 ].template setNumberOfSuperentities< 1 >( 2 ); + /*vertexEntities[ 0 ].template setNumberOfSuperentities< 1 >( 2 ); vertexEntities[ 0 ].template setSuperentityIndex< 1 >( 0, 2 ); vertexEntities[ 0 ].template setSuperentityIndex< 1 >( 1, 1 ); @@ -442,7 +467,7 @@ class tnlMeshEntityTester : public CppUnit :: TestCase vertexEntities[ 1 ].template setNumberOfSuperentities< 2 >( 2 ); vertexEntities[ 1 ].template setSuperentityIndex< 2 >( 0, 0 ); - vertexEntities[ 1 ].template setSuperentityIndex< 2 >( 1, 1 ); + vertexEntities[ 1 ].template setSuperentityIndex< 2 >( 1, 1 );*/ CPPUNIT_ASSERT( vertexEntities[ 0 ].template getNumberOfSuperentities< 1 >() == 2 ); CPPUNIT_ASSERT( vertexEntities[ 0 ].template getSuperentityIndex< 1 >( 0 ) == 2 ); @@ -457,12 +482,12 @@ class tnlMeshEntityTester : public CppUnit :: TestCase CPPUNIT_ASSERT( vertexEntities[ 1 ].template getSuperentityIndex< 2 >( 0 ) == 0 ); CPPUNIT_ASSERT( vertexEntities[ 1 ].template getSuperentityIndex< 2 >( 1 ) == 1 ); - edgeEntities[ 0 ].template setNumberOfSuperentities< 2 >( 2 ); + /*edgeEntities[ 0 ].template setNumberOfSuperentities< 2 >( 2 ); edgeEntities[ 0 ].template setSuperentityIndex< 2 >( 0, 0 ); - edgeEntities[ 0 ].template setSuperentityIndex< 2 >( 1, 1 ); + edgeEntities[ 0 ].template setSuperentityIndex< 2 >( 1, 1 );*/ - CPPUNIT_ASSERT( edgeEntities[ 0 ].template getNumberOfSuperentities< 2 >() == 2 ); - CPPUNIT_ASSERT( edgeEntities[ 0 ].template getSuperentityIndex< 2 >( 0 ) == 0 ); + /*CPPUNIT_ASSERT( edgeEntities[ 0 ].template getNumberOfSuperentities< 2 >() == 2 ); + CPPUNIT_ASSERT( edgeEntities[ 0 ].template getSuperentityIndex< 2 >( 0 ) == 0 );*/ }; }; diff --git a/tests/unit-tests/mesh/tnlMeshTest.cpp b/tests/unit-tests/mesh/tnlMeshTest.cpp index 0e7722090d62f6ab684da3d828f3dd20ad3ea158..38f77e55418b9c64ec0916764c21e70988f4a2db 100644 --- a/tests/unit-tests/mesh/tnlMeshTest.cpp +++ b/tests/unit-tests/mesh/tnlMeshTest.cpp @@ -28,7 +28,7 @@ int main( int argc, char* argv[] ) { #ifndef HAVE_NOT_CXX11 #ifdef HAVE_CPPUNIT - //tnlMeshTester< double, tnlHost, long int > t; + tnlMeshTester< double, tnlHost, long int > t; //t.regularMeshOfHexahedronsTest(); if( ! tnlUnitTestStarter :: run< tnlMeshTester< double, tnlHost, long int > >() ) diff --git a/tests/unit-tests/mesh/tnlMeshTester.h b/tests/unit-tests/mesh/tnlMeshTester.h index 64df322ec60515140d684ed6f866a9bae684d6e6..d7f2a9b44efd43de06fbf89439090c31dca6ab96 100644 --- a/tests/unit-tests/mesh/tnlMeshTester.h +++ b/tests/unit-tests/mesh/tnlMeshTester.h @@ -27,80 +27,53 @@ #include <mesh/tnlMesh.h> #include <mesh/tnlMeshEntity.h> #include <mesh/config/tnlMeshConfigBase.h> -#include <mesh/topologies/tnlMeshVertexTag.h> -#include <mesh/topologies/tnlMeshEdgeTag.h> -#include <mesh/topologies/tnlMeshTriangleTag.h> -#include <mesh/topologies/tnlMeshQuadrilateralTag.h> -#include <mesh/topologies/tnlMeshTetrahedronTag.h> -#include <mesh/topologies/tnlMeshHexahedronTag.h> -#include <mesh/tnlMeshInitializer.h> - -typedef tnlMeshConfigBase< tnlMeshTriangleTag, 2, double, int, int, void > TestTriangleMeshConfig; - -template< int Dimensions > -struct tnlMeshSuperentityStorage< TestTriangleMeshConfig, tnlMeshVertexTag, Dimensions > +#include <mesh/topologies/tnlMeshVertexTopology.h> +#include <mesh/topologies/tnlMeshEdgeTopology.h> +#include <mesh/topologies/tnlMeshTriangleTopology.h> +#include <mesh/topologies/tnlMeshQuadrilateralTopology.h> +#include <mesh/topologies/tnlMeshTetrahedronTopology.h> +#include <mesh/topologies/tnlMeshHexahedronTopology.h> +#include <mesh/initializer/tnlMeshInitializer.h> +#include <mesh/tnlMeshBuilder.h> + +class TestTriangleMeshConfig : public tnlMeshConfigBase< tnlMeshTriangleTopology > { - enum { enabled = true }; -}; - -template< int Dimensions > -struct tnlMeshSuperentityStorage< TestTriangleMeshConfig, tnlMeshEdgeTag, Dimensions > -{ - enum { enabled = true }; -}; - -typedef tnlMeshConfigBase< tnlMeshQuadrilateralTag, 2, double, int, int, void > TestQuadrilateralMeshConfig; - -template< int Dimensions > -struct tnlMeshSuperentityStorage< TestQuadrilateralMeshConfig, tnlMeshVertexTag, Dimensions > -{ - enum { enabled = true }; -}; + public: -template< int Dimensions > -struct tnlMeshSuperentityStorage< TestQuadrilateralMeshConfig, tnlMeshEdgeTag, Dimensions > -{ - enum { enabled = true }; + static constexpr bool entityStorage( int dimensions ) { return true; }; + template< typename MeshEntity > static constexpr bool subentityStorage( MeshEntity, int SubentityDimensions ) { return true; }; + //template< typename MeshEntity > static constexpr bool subentityOrientationStorage( MeshEntity, int SubentityDimensions ) { return true; }; + template< typename MeshEntity > static constexpr bool superentityStorage( MeshEntity, int SuperentityDimensions ) { return true; }; }; -typedef tnlMeshConfigBase< tnlMeshTetrahedronTag, 3, double, int, int, void > TestTetrahedronMeshConfig; - -template< int Dimensions > -struct tnlMeshSuperentityStorage< TestTetrahedronMeshConfig, tnlMeshVertexTag, Dimensions > +class TestQuadrilateralMeshConfig : public tnlMeshConfigBase< tnlMeshQuadrilateralTopology > { - enum { enabled = true }; + public: + + static constexpr bool entityStorage( int dimensions ) { return true; }; + template< typename MeshEntity > static constexpr bool subentityStorage( MeshEntity, int SubentityDimensions ) { return true; }; + template< typename MeshEntity > static constexpr bool subentityOrientationStorage( MeshEntity, int SubentityDimensions ) { return ( SubentityDimensions % 2 != 0 ); }; + template< typename MeshEntity > static constexpr bool superentityStorage( MeshEntity, int SuperentityDimensions ) { return true; }; }; -template< int Dimensions > -struct tnlMeshSuperentityStorage< TestTetrahedronMeshConfig, tnlMeshEdgeTag, Dimensions > +class TestTetrahedronMeshConfig : public tnlMeshConfigBase< tnlMeshTetrahedronTopology > { - enum { enabled = true }; -}; + public: -template< int Dimensions > -struct tnlMeshSuperentityStorage< TestTetrahedronMeshConfig, tnlMeshTriangleTag, Dimensions > -{ - enum { enabled = true }; + static constexpr bool entityStorage( int dimensions ) { return true; }; + template< typename MeshEntity > static constexpr bool subentityStorage( MeshEntity, int SubentityDimensions ) { return true; }; + template< typename MeshEntity > static constexpr bool subentityOrientationStorage( MeshEntity, int SubentityDimensions ) { return ( SubentityDimensions % 2 != 0 ); }; + template< typename MeshEntity > static constexpr bool superentityStorage( MeshEntity, int SuperentityDimensions ) { return true; }; }; -typedef tnlMeshConfigBase< tnlMeshHexahedronTag, 3, double, int, int, void > TestHexahedronMeshConfig; - -template< int Dimensions > -struct tnlMeshSuperentityStorage< TestHexahedronMeshConfig, tnlMeshVertexTag, Dimensions > +class TestHexahedronMeshConfig : public tnlMeshConfigBase< tnlMeshHexahedronTopology > { - enum { enabled = true }; -}; + public: -template< int Dimensions > -struct tnlMeshSuperentityStorage< TestHexahedronMeshConfig, tnlMeshEdgeTag, Dimensions > -{ - enum { enabled = true }; -}; - -template< int Dimensions > -struct tnlMeshSuperentityStorage< TestHexahedronMeshConfig, tnlMeshTriangleTag, Dimensions > -{ - enum { enabled = true }; + static constexpr bool entityStorage( int dimensions ) { return true; }; + template< typename MeshEntity > static constexpr bool subentityStorage( MeshEntity, int SubentityDimensions ) { return true; }; + template< typename MeshEntity > static constexpr bool subentityOrientationStorage( MeshEntity, int SubentityDimensions ) { return ( SubentityDimensions % 2 != 0 ); }; + template< typename MeshEntity > static constexpr bool superentityStorage( MeshEntity, int SuperentityDimensions ) { return true; }; }; template< typename RealType, typename Device, typename IndexType > @@ -130,9 +103,9 @@ class tnlMeshTester : public CppUnit :: TestCase void twoTrianglesTest() { - typedef tnlMeshEntity< TestTriangleMeshConfig, tnlMeshTriangleTag > TriangleMeshEntityType; - typedef tnlMeshEntity< TestTriangleMeshConfig, tnlMeshEdgeTag > EdgeMeshEntityType; - typedef tnlMeshEntity< TestTriangleMeshConfig, tnlMeshVertexTag > VertexMeshEntityType; + typedef tnlMeshEntity< TestTriangleMeshConfig, tnlMeshTriangleTopology > TriangleMeshEntityType; + typedef tnlMeshEntity< TestTriangleMeshConfig, tnlMeshEdgeTopology > EdgeMeshEntityType; + typedef tnlMeshEntity< TestTriangleMeshConfig, tnlMeshVertexTopology > VertexMeshEntityType; typedef typename VertexMeshEntityType::PointType PointType; CPPUNIT_ASSERT( PointType::getType() == ( tnlStaticVector< 2, RealType >::getType() ) ); @@ -155,59 +128,59 @@ class tnlMeshTester : public CppUnit :: TestCase point0 edge2 point1 */ - tnlMesh< TestTriangleMeshConfig > mesh, mesh2; - mesh.setNumberOfVertices( 4 ); - mesh.setVertex( 0, PointType( 0.0, 0.0 ) ); - mesh.setVertex( 1, PointType( 1.0, 0.0 ) ); - mesh.setVertex( 2, PointType( 0.0, 1.0 ) ); - mesh.setVertex( 3, PointType( 1.0, 1.0 ) ); - - mesh.setNumberOfEntities< 2 >( 2 ); - mesh.getEntity< 2 >( 0 ).setVertexIndex( 0, 0 ); - mesh.getEntity< 2 >( 0 ).setVertexIndex( 1, 1 ); - mesh.getEntity< 2 >( 0 ).setVertexIndex( 2, 2 ); - mesh.getEntity< 2 >( 1 ).setVertexIndex( 0, 1 ); - mesh.getEntity< 2 >( 1 ).setVertexIndex( 1, 2 ); - mesh.getEntity< 2 >( 1 ).setVertexIndex( 2, 3 ); - - tnlMeshInitializer< TestTriangleMeshConfig > meshInitializer; - meshInitializer.initMesh( mesh ); - + typedef tnlMesh< TestTriangleMeshConfig > TriangleTestMesh; + TriangleTestMesh mesh, mesh2; + tnlMeshBuilder< TriangleTestMesh > meshBuilder; + meshBuilder.setPointsCount( 4 ); + meshBuilder.setPoint( 0, PointType( 0.0, 0.0 ) ); + meshBuilder.setPoint( 1, PointType( 1.0, 0.0 ) ); + meshBuilder.setPoint( 2, PointType( 0.0, 1.0 ) ); + meshBuilder.setPoint( 3, PointType( 1.0, 1.0 ) ); + + meshBuilder.setCellsCount( 2 ); + meshBuilder.getCellSeed( 0 ).setCornerId( 0, 0 ); + meshBuilder.getCellSeed( 0 ).setCornerId( 1, 1 ); + meshBuilder.getCellSeed( 0 ).setCornerId( 2, 2 ); + meshBuilder.getCellSeed( 1 ).setCornerId( 0, 1 ); + meshBuilder.getCellSeed( 1 ).setCornerId( 1, 2 ); + meshBuilder.getCellSeed( 1 ).setCornerId( 2, 3 ); + meshBuilder.build( mesh ); + CPPUNIT_ASSERT( mesh.getNumberOfEntities< 2 >() == 2 ); CPPUNIT_ASSERT( mesh.getNumberOfEntities< 1 >() == 5 ); CPPUNIT_ASSERT( mesh.getNumberOfEntities< 0 >() == 4 ); - CPPUNIT_ASSERT( mesh.save( "mesh.tnl" ) ); - CPPUNIT_ASSERT( mesh2.load( "mesh.tnl" ) ); - CPPUNIT_ASSERT( mesh == mesh2 ); + //CPPUNIT_ASSERT( mesh.save( "mesh.tnl" ) ); + //CPPUNIT_ASSERT( mesh2.load( "mesh.tnl" ) ); + //CPPUNIT_ASSERT( mesh == mesh2 ); //mesh.print( cout ); //mesh2.print( cout ); - - }; void tetrahedronsTest() { - typedef tnlMeshEntity< TestTetrahedronMeshConfig, tnlMeshTriangleTag > TriangleMeshEntityType; - typedef tnlMeshEntity< TestTetrahedronMeshConfig, tnlMeshEdgeTag > EdgeMeshEntityType; - typedef tnlMeshEntity< TestTetrahedronMeshConfig, tnlMeshVertexTag > VertexMeshEntityType; + typedef tnlMeshEntity< TestTetrahedronMeshConfig, tnlMeshTriangleTopology > TriangleMeshEntityType; + typedef tnlMeshEntity< TestTetrahedronMeshConfig, tnlMeshEdgeTopology > EdgeMeshEntityType; + typedef tnlMeshEntity< TestTetrahedronMeshConfig, tnlMeshVertexTopology > VertexMeshEntityType; typedef typename VertexMeshEntityType::PointType PointType; - tnlMesh< TestTetrahedronMeshConfig > mesh, mesh2; - mesh.setNumberOfVertices( 13 ); - mesh.setVertex( 0, PointType( 0.000000, 0.000000, 0.000000 ) ); - mesh.setVertex( 1, PointType( 0.000000, 0.000000, 8.000000 ) ); - mesh.setVertex( 2, PointType( 0.000000, 8.000000, 0.000000 ) ); - mesh.setVertex( 3, PointType( 15.000000, 0.000000, 0.000000 ) ); - mesh.setVertex( 4, PointType( 0.000000, 8.000000, 8.000000 ) ); - mesh.setVertex( 5, PointType( 15.000000, 0.000000, 8.000000 ) ); - mesh.setVertex( 6, PointType( 15.000000, 8.000000, 0.000000 ) ); - mesh.setVertex( 7, PointType( 15.000000, 8.000000, 8.000000 ) ); - mesh.setVertex( 8, PointType( 7.470740, 8.000000, 8.000000 ) ); - mesh.setVertex( 9, PointType( 7.470740, 0.000000, 8.000000 ) ); - mesh.setVertex( 10, PointType( 7.504125, 8.000000, 0.000000 ) ); - mesh.setVertex( 11, PointType( 7.212720, 0.000000, 0.000000 ) ); - mesh.setVertex( 12, PointType( 11.184629, 3.987667, 3.985835 ) ); + typedef tnlMesh< TestTetrahedronMeshConfig > TestTetrahedronMesh; + TestTetrahedronMesh mesh; + tnlMeshBuilder< TestTetrahedronMesh > meshBuilder; + meshBuilder.setPointsCount( 13 ); + meshBuilder.setPoint( 0, PointType( 0.000000, 0.000000, 0.000000 ) ); + meshBuilder.setPoint( 1, PointType( 0.000000, 0.000000, 8.000000 ) ); + meshBuilder.setPoint( 2, PointType( 0.000000, 8.000000, 0.000000 ) ); + meshBuilder.setPoint( 3, PointType( 15.000000, 0.000000, 0.000000 ) ); + meshBuilder.setPoint( 4, PointType( 0.000000, 8.000000, 8.000000 ) ); + meshBuilder.setPoint( 5, PointType( 15.000000, 0.000000, 8.000000 ) ); + meshBuilder.setPoint( 6, PointType( 15.000000, 8.000000, 0.000000 ) ); + meshBuilder.setPoint( 7, PointType( 15.000000, 8.000000, 8.000000 ) ); + meshBuilder.setPoint( 8, PointType( 7.470740, 8.000000, 8.000000 ) ); + meshBuilder.setPoint( 9, PointType( 7.470740, 0.000000, 8.000000 ) ); + meshBuilder.setPoint( 10, PointType( 7.504125, 8.000000, 0.000000 ) ); + meshBuilder.setPoint( 11, PointType( 7.212720, 0.000000, 0.000000 ) ); + meshBuilder.setPoint( 12, PointType( 11.184629, 3.987667, 3.985835 ) ); /**** * Setup the following tetrahedrons: @@ -233,130 +206,128 @@ class tnlMeshTester : public CppUnit :: TestCase * 12 3 6 10 */ - mesh.setNumberOfEntities< 3 >( 18 ); - + meshBuilder.setCellsCount( 18 ); // 12 8 7 5 - mesh.getEntities< 3 >()[ 0 ].getVerticesIndices()[ 0 ] = 12; - mesh.getEntities< 3 >()[ 0 ].getVerticesIndices()[ 1 ] = 8; - mesh.getEntities< 3 >()[ 0 ].getVerticesIndices()[ 2 ] = 7; - mesh.getEntities< 3 >()[ 0 ].getVerticesIndices()[ 3 ] = 5; + meshBuilder.getCellSeed( 0 ).setCornerId( 0, 12 ); + meshBuilder.getCellSeed( 0 ).setCornerId( 1, 8 ); + meshBuilder.getCellSeed( 0 ).setCornerId( 2, 7 ); + meshBuilder.getCellSeed( 0 ).setCornerId( 3, 5 ); // 12 7 8 10 - mesh.getEntities< 3 >()[ 1 ].getVerticesIndices()[ 0 ] = 12; - mesh.getEntities< 3 >()[ 1 ].getVerticesIndices()[ 1 ] = 7; - mesh.getEntities< 3 >()[ 1 ].getVerticesIndices()[ 2 ] = 8; - mesh.getEntities< 3 >()[ 1 ].getVerticesIndices()[ 3 ] = 10; + meshBuilder.getCellSeed( 1 ).setCornerId( 0, 12 ); + meshBuilder.getCellSeed( 1 ).setCornerId( 1, 7 ); + meshBuilder.getCellSeed( 1 ).setCornerId( 2, 8 ); + meshBuilder.getCellSeed( 1 ).setCornerId( 3, 10 ); // 12 11 8 9 - mesh.getEntities< 3 >()[ 2 ].getVerticesIndices()[ 0 ] = 12; - mesh.getEntities< 3 >()[ 2 ].getVerticesIndices()[ 1 ] = 11; - mesh.getEntities< 3 >()[ 2 ].getVerticesIndices()[ 2 ] = 8; - mesh.getEntities< 3 >()[ 2 ].getVerticesIndices()[ 3 ] = 9; + meshBuilder.getCellSeed( 2 ).setCornerId( 0, 12 ); + meshBuilder.getCellSeed( 2 ).setCornerId( 1, 11 ); + meshBuilder.getCellSeed( 2 ).setCornerId( 2, 8 ); + meshBuilder.getCellSeed( 2 ).setCornerId( 3, 9 ); // 10 11 2 8 - mesh.getEntities< 3 >()[ 3 ].getVerticesIndices()[ 0 ] = 10; - mesh.getEntities< 3 >()[ 3 ].getVerticesIndices()[ 1 ] = 11; - mesh.getEntities< 3 >()[ 3 ].getVerticesIndices()[ 2 ] = 2; - mesh.getEntities< 3 >()[ 3 ].getVerticesIndices()[ 3 ] = 8; + meshBuilder.getCellSeed( 3 ).setCornerId( 0, 10 ); + meshBuilder.getCellSeed( 3 ).setCornerId( 1, 11 ); + meshBuilder.getCellSeed( 3 ).setCornerId( 2, 2 ); + meshBuilder.getCellSeed( 3 ).setCornerId( 3, 8 ); // 12 7 6 5 - mesh.getEntities< 3 >()[ 4 ].getVerticesIndices()[ 0 ] = 12; - mesh.getEntities< 3 >()[ 4 ].getVerticesIndices()[ 1 ] = 7; - mesh.getEntities< 3 >()[ 4 ].getVerticesIndices()[ 2 ] = 6; - mesh.getEntities< 3 >()[ 4 ].getVerticesIndices()[ 3 ] = 5; + meshBuilder.getCellSeed( 4 ).setCornerId( 0, 12 ); + meshBuilder.getCellSeed( 4 ).setCornerId( 1, 7 ); + meshBuilder.getCellSeed( 4 ).setCornerId( 2, 6 ); + meshBuilder.getCellSeed( 4 ).setCornerId( 3, 5 ); // 9 12 5 8 - mesh.getEntities< 3 >()[ 5 ].getVerticesIndices()[ 0 ] = 9; - mesh.getEntities< 3 >()[ 5 ].getVerticesIndices()[ 1 ] = 12; - mesh.getEntities< 3 >()[ 5 ].getVerticesIndices()[ 2 ] = 5; - mesh.getEntities< 3 >()[ 5 ].getVerticesIndices()[ 3 ] = 8; + meshBuilder.getCellSeed( 5 ).setCornerId( 0, 9 ); + meshBuilder.getCellSeed( 5 ).setCornerId( 1, 12 ); + meshBuilder.getCellSeed( 5 ).setCornerId( 2, 5 ); + meshBuilder.getCellSeed( 5 ).setCornerId( 3, 8 ); // 12 11 9 3 - mesh.getEntities< 3 >()[ 6 ].getVerticesIndices()[ 0 ] = 12; - mesh.getEntities< 3 >()[ 6 ].getVerticesIndices()[ 1 ] = 11; - mesh.getEntities< 3 >()[ 6 ].getVerticesIndices()[ 2 ] = 9; - mesh.getEntities< 3 >()[ 6 ].getVerticesIndices()[ 3 ] = 3; + meshBuilder.getCellSeed( 6 ).setCornerId( 0, 12 ); + meshBuilder.getCellSeed( 6 ).setCornerId( 1, 11 ); + meshBuilder.getCellSeed( 6 ).setCornerId( 2, 9 ); + meshBuilder.getCellSeed( 6 ).setCornerId( 3, 3 ); // 9 4 11 8 - mesh.getEntities< 3 >()[ 7 ].getVerticesIndices()[ 0 ] = 9; - mesh.getEntities< 3 >()[ 7 ].getVerticesIndices()[ 1 ] = 4; - mesh.getEntities< 3 >()[ 7 ].getVerticesIndices()[ 2 ] = 11; - mesh.getEntities< 3 >()[ 7 ].getVerticesIndices()[ 3 ] = 8; + meshBuilder.getCellSeed( 7 ).setCornerId( 0, 9 ); + meshBuilder.getCellSeed( 7 ).setCornerId( 1, 4 ); + meshBuilder.getCellSeed( 7 ).setCornerId( 2, 11 ); + meshBuilder.getCellSeed( 7 ).setCornerId( 3, 8 ); // 12 9 5 3 - mesh.getEntities< 3 >()[ 8 ].getVerticesIndices()[ 0 ] = 12; - mesh.getEntities< 3 >()[ 8 ].getVerticesIndices()[ 1 ] = 9; - mesh.getEntities< 3 >()[ 8 ].getVerticesIndices()[ 2 ] = 5; - mesh.getEntities< 3 >()[ 8 ].getVerticesIndices()[ 3 ] = 3; + meshBuilder.getCellSeed( 8 ).setCornerId( 0, 12 ); + meshBuilder.getCellSeed( 8 ).setCornerId( 1, 9 ); + meshBuilder.getCellSeed( 8 ).setCornerId( 2, 5 ); + meshBuilder.getCellSeed( 8 ).setCornerId( 3, 3 ); // 1 2 0 11 - mesh.getEntities< 3 >()[ 9 ].getVerticesIndices()[ 0 ] = 1; - mesh.getEntities< 3 >()[ 9 ].getVerticesIndices()[ 1 ] = 2; - mesh.getEntities< 3 >()[ 9 ].getVerticesIndices()[ 2 ] = 0; - mesh.getEntities< 3 >()[ 9 ].getVerticesIndices()[ 3 ] = 11; + meshBuilder.getCellSeed( 9 ).setCornerId( 0, 1 ); + meshBuilder.getCellSeed( 9 ).setCornerId( 1, 2 ); + meshBuilder.getCellSeed( 9 ).setCornerId( 2, 0 ); + meshBuilder.getCellSeed( 9 ).setCornerId( 3, 11 ); // 8 11 2 4 - mesh.getEntities< 3 >()[ 10 ].getVerticesIndices()[ 0 ] = 8; - mesh.getEntities< 3 >()[ 10 ].getVerticesIndices()[ 1 ] = 11; - mesh.getEntities< 3 >()[ 10 ].getVerticesIndices()[ 2 ] = 2; - mesh.getEntities< 3 >()[ 10 ].getVerticesIndices()[ 3 ] = 4; + meshBuilder.getCellSeed( 10 ).setCornerId( 0, 8 ); + meshBuilder.getCellSeed( 10 ).setCornerId( 1, 11 ); + meshBuilder.getCellSeed( 10 ).setCornerId( 2, 2 ); + meshBuilder.getCellSeed( 10 ).setCornerId( 3, 4 ); // 1 2 11 4 - mesh.getEntities< 3 >()[ 11 ].getVerticesIndices()[ 0 ] = 1; - mesh.getEntities< 3 >()[ 11 ].getVerticesIndices()[ 1 ] = 2; - mesh.getEntities< 3 >()[ 11 ].getVerticesIndices()[ 2 ] = 11; - mesh.getEntities< 3 >()[ 11 ].getVerticesIndices()[ 3 ] = 4; + meshBuilder.getCellSeed( 11 ).setCornerId( 0, 1 ); + meshBuilder.getCellSeed( 11 ).setCornerId( 1, 2 ); + meshBuilder.getCellSeed( 11 ).setCornerId( 2, 11 ); + meshBuilder.getCellSeed( 11 ).setCornerId( 3, 4 ); // 9 4 1 11 - mesh.getEntities< 3 >()[ 12 ].getVerticesIndices()[ 0 ] = 9; - mesh.getEntities< 3 >()[ 12 ].getVerticesIndices()[ 1 ] = 4; - mesh.getEntities< 3 >()[ 12 ].getVerticesIndices()[ 2 ] = 1; - mesh.getEntities< 3 >()[ 12 ].getVerticesIndices()[ 3 ] = 11; + meshBuilder.getCellSeed( 12 ).setCornerId( 0, 9 ); + meshBuilder.getCellSeed( 12 ).setCornerId( 1, 4 ); + meshBuilder.getCellSeed( 12 ).setCornerId( 2, 1 ); + meshBuilder.getCellSeed( 12 ).setCornerId( 3, 11 ); // 10 11 8 12 - mesh.getEntities< 3 >()[ 13 ].getVerticesIndices()[ 0 ] = 10; - mesh.getEntities< 3 >()[ 13 ].getVerticesIndices()[ 1 ] = 11; - mesh.getEntities< 3 >()[ 13 ].getVerticesIndices()[ 2 ] = 8; - mesh.getEntities< 3 >()[ 13 ].getVerticesIndices()[ 3 ] = 12; + meshBuilder.getCellSeed( 13 ).setCornerId( 0, 10 ); + meshBuilder.getCellSeed( 13 ).setCornerId( 1, 11 ); + meshBuilder.getCellSeed( 13 ).setCornerId( 2, 8 ); + meshBuilder.getCellSeed( 13 ).setCornerId( 3, 12 ); // 12 6 7 10 - mesh.getEntities< 3 >()[ 14 ].getVerticesIndices()[ 0 ] = 12; - mesh.getEntities< 3 >()[ 14 ].getVerticesIndices()[ 1 ] = 6; - mesh.getEntities< 3 >()[ 14 ].getVerticesIndices()[ 2 ] = 7; - mesh.getEntities< 3 >()[ 14 ].getVerticesIndices()[ 3 ] = 10; + meshBuilder.getCellSeed( 14 ).setCornerId( 0, 12 ); + meshBuilder.getCellSeed( 14 ).setCornerId( 1, 6 ); + meshBuilder.getCellSeed( 14 ).setCornerId( 2, 7 ); + meshBuilder.getCellSeed( 14 ).setCornerId( 3, 10 ); // 10 11 12 3 - mesh.getEntities< 3 >()[ 15 ].getVerticesIndices()[ 0 ] = 10; - mesh.getEntities< 3 >()[ 15 ].getVerticesIndices()[ 1 ] = 11; - mesh.getEntities< 3 >()[ 15 ].getVerticesIndices()[ 2 ] = 12; - mesh.getEntities< 3 >()[ 15 ].getVerticesIndices()[ 3 ] = 3; + meshBuilder.getCellSeed( 15 ).setCornerId( 0, 10 ); + meshBuilder.getCellSeed( 15 ).setCornerId( 1, 11 ); + meshBuilder.getCellSeed( 15 ).setCornerId( 2, 12 ); + meshBuilder.getCellSeed( 15 ).setCornerId( 3, 3 ); // 12 6 3 5 - mesh.getEntities< 3 >()[ 16 ].getVerticesIndices()[ 0 ] = 12; - mesh.getEntities< 3 >()[ 16 ].getVerticesIndices()[ 1 ] = 6; - mesh.getEntities< 3 >()[ 16 ].getVerticesIndices()[ 2 ] = 3; - mesh.getEntities< 3 >()[ 16 ].getVerticesIndices()[ 3 ] = 5; + meshBuilder.getCellSeed( 16 ).setCornerId( 0, 12 ); + meshBuilder.getCellSeed( 16 ).setCornerId( 1, 6 ); + meshBuilder.getCellSeed( 16 ).setCornerId( 2, 3 ); + meshBuilder.getCellSeed( 16 ).setCornerId( 3, 5 ); // 12 3 6 10 - mesh.getEntities< 3 >()[ 17 ].getVerticesIndices()[ 0 ] = 12; - mesh.getEntities< 3 >()[ 17 ].getVerticesIndices()[ 1 ] = 3; - mesh.getEntities< 3 >()[ 17 ].getVerticesIndices()[ 2 ] = 6; - mesh.getEntities< 3 >()[ 17 ].getVerticesIndices()[ 3 ] = 10; - - tnlMeshInitializer< TestTetrahedronMeshConfig > meshInitializer; - meshInitializer.initMesh( mesh ); + meshBuilder.getCellSeed( 17 ).setCornerId( 0, 12 ); + meshBuilder.getCellSeed( 17 ).setCornerId( 1, 3 ); + meshBuilder.getCellSeed( 17 ).setCornerId( 2, 6 ); + meshBuilder.getCellSeed( 17 ).setCornerId( 3, 10 ); + + meshBuilder.build( mesh ); - CPPUNIT_ASSERT( mesh.save( "mesh.tnl" ) ); + /*CPPUNIT_ASSERT( mesh.save( "mesh.tnl" ) ); CPPUNIT_ASSERT( mesh2.load( "mesh.tnl" ) ); - CPPUNIT_ASSERT( mesh == mesh2 ); + CPPUNIT_ASSERT( mesh == mesh2 );*/ //mesh.print( cout ); } void regularMeshOfTrianglesTest() { - typedef tnlMeshEntity< TestTriangleMeshConfig, tnlMeshTriangleTag > TriangleMeshEntityType; - typedef tnlMeshEntity< TestTriangleMeshConfig, tnlMeshEdgeTag > EdgeMeshEntityType; - typedef tnlMeshEntity< TestTriangleMeshConfig, tnlMeshVertexTag > VertexMeshEntityType; + typedef tnlMeshEntity< TestTriangleMeshConfig, tnlMeshTriangleTopology > TriangleMeshEntityType; + typedef tnlMeshEntity< TestTriangleMeshConfig, tnlMeshEdgeTopology > EdgeMeshEntityType; + typedef tnlMeshEntity< TestTriangleMeshConfig, tnlMeshVertexTopology > VertexMeshEntityType; typedef typename VertexMeshEntityType::PointType PointType; const IndexType xSize( 5 ), ySize( 5 ); @@ -366,16 +337,18 @@ class tnlMeshTester : public CppUnit :: TestCase const IndexType numberOfCells = 2*xSize * ySize; const IndexType numberOfVertices = ( xSize + 1 ) * ( ySize + 1 ); - tnlMesh< TestTriangleMeshConfig > mesh, mesh2; - mesh.setNumberOfCells( numberOfCells ); - mesh.setNumberOfVertices( numberOfVertices ); + typedef tnlMesh< TestTriangleMeshConfig > TestTriangleMesh; + tnlMesh< TestTriangleMeshConfig > mesh; + tnlMeshBuilder< TestTriangleMesh > meshBuilder; + meshBuilder.setPointsCount( numberOfVertices ); + meshBuilder.setCellsCount( numberOfCells ); /**** * Setup vertices */ for( IndexType i = 0; i <= xSize; i++ ) for( IndexType j = 0; j <= ySize; j++ ) - mesh.setVertex( j*xSize + i, PointType( i * hx, j * hy ) ); + meshBuilder.setPoint( j*xSize + i, PointType( i * hx, j * hy ) ); /**** * Setup cells @@ -388,27 +361,27 @@ class tnlMeshTester : public CppUnit :: TestCase IndexType vertex1 = j * xSize + i + 1; IndexType vertex2 = ( j + 1 ) * xSize + i; IndexType vertex3 = ( j + 1 ) * xSize + i + 1; - mesh.getEntities< 2 >()[ cellIdx ].getVerticesIndices()[ 0 ] = vertex0; - mesh.getEntities< 2 >()[ cellIdx ].getVerticesIndices()[ 1 ] = vertex1; - mesh.getEntities< 2 >()[ cellIdx++ ].getVerticesIndices()[ 2 ] = vertex2; - mesh.getEntities< 2 >()[ cellIdx ].getVerticesIndices()[ 0 ] = vertex1; - mesh.getEntities< 2 >()[ cellIdx ].getVerticesIndices()[ 1 ] = vertex2; - mesh.getEntities< 2 >()[ cellIdx++ ].getVerticesIndices()[ 2 ] = vertex3; + meshBuilder.getCellSeed( cellIdx ).setCornerId( 0, vertex0 ); + meshBuilder.getCellSeed( cellIdx ).setCornerId( 1, vertex1 ); + meshBuilder.getCellSeed( cellIdx++ ).setCornerId( 2, vertex2 ); + meshBuilder.getCellSeed( cellIdx ).setCornerId( 0, vertex1 ); + meshBuilder.getCellSeed( cellIdx ).setCornerId( 1, vertex2 ); + meshBuilder.getCellSeed( cellIdx++ ).setCornerId( 2, vertex3 ); } - tnlMeshInitializer< TestTriangleMeshConfig > meshInitializer; - meshInitializer.initMesh( mesh ); - CPPUNIT_ASSERT( mesh.save( "mesh-test.tnl" ) ); - CPPUNIT_ASSERT( mesh2.load( "mesh-test.tnl" ) ); - CPPUNIT_ASSERT( mesh == mesh2 ); + meshBuilder.build( mesh ); + //CPPUNIT_ASSERT( mesh.save( "mesh-test.tnl" ) ); + //CPPUNIT_ASSERT( mesh2.load( "mesh-test.tnl" ) ); + //CPPUNIT_ASSERT( mesh == mesh2 ); //mesh.print( cout ); } void regularMeshOfQuadrilateralsTest() { - typedef tnlMeshEntity< TestQuadrilateralMeshConfig, tnlMeshQuadrilateralTag > QuadrilateralMeshEntityType; - typedef tnlMeshEntity< TestQuadrilateralMeshConfig, tnlMeshEdgeTag > EdgeMeshEntityType; - typedef tnlMeshEntity< TestQuadrilateralMeshConfig, tnlMeshVertexTag > VertexMeshEntityType; +#ifdef UNDEF + typedef tnlMeshEntity< TestQuadrilateralMeshConfig, tnlMeshQuadrilateralTopology > QuadrilateralMeshEntityType; + typedef tnlMeshEntity< TestQuadrilateralMeshConfig, tnlMeshEdgeTopology > EdgeMeshEntityType; + typedef tnlMeshEntity< TestQuadrilateralMeshConfig, tnlMeshVertexTopology > VertexMeshEntityType; typedef typename VertexMeshEntityType::PointType PointType; const IndexType xSize( 5 ), ySize( 5 ); @@ -447,18 +420,20 @@ class tnlMeshTester : public CppUnit :: TestCase } tnlMeshInitializer< TestQuadrilateralMeshConfig > meshInitializer; - meshInitializer.initMesh( mesh ); + //meshInitializer.initMesh( mesh ); CPPUNIT_ASSERT( mesh.save( "mesh-test.tnl" ) ); CPPUNIT_ASSERT( mesh2.load( "mesh-test.tnl" ) ); CPPUNIT_ASSERT( mesh == mesh2 ); //mesh.print( cout ); +#endif } void regularMeshOfHexahedronsTest() { - typedef tnlMeshEntity< TestHexahedronMeshConfig, tnlMeshHexahedronTag > HexahedronMeshEntityType; - typedef tnlMeshEntity< TestHexahedronMeshConfig, tnlMeshEdgeTag > EdgeMeshEntityType; - typedef tnlMeshEntity< TestHexahedronMeshConfig, tnlMeshVertexTag > VertexMeshEntityType; +#ifdef UNDEF + typedef tnlMeshEntity< TestHexahedronMeshConfig, tnlMeshHexahedronTopology > HexahedronMeshEntityType; + typedef tnlMeshEntity< TestHexahedronMeshConfig, tnlMeshEdgeTopology > EdgeMeshEntityType; + typedef tnlMeshEntity< TestHexahedronMeshConfig, tnlMeshVertexTopology > VertexMeshEntityType; typedef typename VertexMeshEntityType::PointType PointType; const IndexType xSize( 5 ), ySize( 5 ), zSize( 5 ); @@ -509,11 +484,12 @@ class tnlMeshTester : public CppUnit :: TestCase } tnlMeshInitializer< TestHexahedronMeshConfig > meshInitializer; - meshInitializer.initMesh( mesh ); + //meshInitializer.initMesh( mesh ); /*CPPUNIT_ASSERT( mesh.save( "mesh-test.tnl" ) ); CPPUNIT_ASSERT( mesh2.load( "mesh-test.tnl" ) ); CPPUNIT_ASSERT( mesh == mesh2 );*/ //mesh.print( cout ); +#endif } diff --git a/tools/share/.mgrid-view.cfg.desc.swp b/tools/share/.mgrid-view.cfg.desc.swp deleted file mode 100644 index 1e92d50bb94c0c0389ccabfd84c4cca5de9d7338..0000000000000000000000000000000000000000 Binary files a/tools/share/.mgrid-view.cfg.desc.swp and /dev/null differ diff --git a/tools/src/.compare-objects.h.swp b/tools/src/.compare-objects.h.swp deleted file mode 100644 index e45564de31a4b2fd3beb3dad2e90683e7e6a4c85..0000000000000000000000000000000000000000 Binary files a/tools/src/.compare-objects.h.swp and /dev/null differ diff --git a/tools/src/tnl-mesh-convert.h b/tools/src/tnl-mesh-convert.h index bd0b694b7ba0a76c38b6a91c655a846de5aa287d..4578d7e3e45b0be1c80acdba49a7e8e7759837c9 100644 --- a/tools/src/tnl-mesh-convert.h +++ b/tools/src/tnl-mesh-convert.h @@ -22,79 +22,93 @@ #include <mesh/tnlMeshReaderNetgen.h> #include <mesh/tnlMeshWriterVTKLegacy.h> #include <mesh/config/tnlMeshConfigBase.h> -#include <mesh/topologies/tnlMeshTriangleTag.h> -#include <mesh/topologies/tnlMeshTetrahedronTag.h> +#include <mesh/topologies/tnlMeshTriangleTopology.h> +#include <mesh/topologies/tnlMeshTetrahedronTopology.h> #include <mesh/tnlMesh.h> -#include <mesh/tnlMeshInitializer.h> +#include <mesh/initializer/tnlMeshInitializer.h> #include <mesh/tnlMeshIntegrityChecker.h> #include <core/mfilename.h> -template< int Dimensions > -bool readMeshWithDimensions( const tnlParameterContainer& parameters ) +template< typename MeshReader, + typename MeshType > +bool convertMesh( const tnlParameterContainer& parameters ) { const tnlString& inputFileName = parameters.getParameter< tnlString >( "input-file" ); const tnlString& outputFileName = parameters.getParameter< tnlString >( "output-file" ); - const tnlString inputFileExt = getFileExtension( inputFileName ); const tnlString outputFileExt = getFileExtension( outputFileName ); - if( Dimensions == 2 ) - { - typedef tnlMesh< tnlMeshConfigBase< tnlMeshTriangleTag > > MeshType; - MeshType mesh; - if( inputFileExt == "ng" && - ! tnlMeshReaderNetgen::readMesh<>( inputFileName, mesh, true ) ) - return false; - tnlMeshInitializer< tnlMeshConfigBase< tnlMeshTriangleTag > > meshInitializer; - meshInitializer.setVerbose( true ); - if( ! meshInitializer.initMesh( mesh ) ) - return false; - if( ! tnlMeshIntegrityChecker< MeshType >::checkMesh( mesh ) ) + MeshType mesh; + if( ! MeshReader::readMesh( inputFileName, mesh, true ) ) + return false; + /*tnlMeshInitializer< typename MeshType::Config > meshInitializer; + meshInitializer.setVerbose( true ); + if( ! meshInitializer.initMesh( mesh ) ) + return false; + if( ! tnlMeshIntegrityChecker< MeshType >::checkMesh( mesh ) ) + return false;*/ + cout << mesh << endl; + cout << "Writing the mesh to a file " << outputFileName << "." << endl; + if( outputFileExt == "tnl" ) + { + if( ! mesh.save( outputFileName ) ) + { + cerr << "I am not able to write the mesh into the file " << outputFileName << "." << endl; return false; - tnlString outputFile; - cout << "Writing the 2D mesh to the file " << outputFile << "." << endl; - if( outputFileExt == "tnl" ) - { - if( ! mesh.save( outputFile ) ) - { - cerr << "I am not able to write the mesh into the file " << outputFile << "." << endl; - return false; - } } - if( outputFileExt == "vtk" ) + } + if( outputFileExt == "vtk" ) + { + if( ! tnlMeshWriterVTKLegacy::write( outputFileName, mesh, true ) ) + { + cerr << "I am not able to write the mesh into the file " << outputFileName << "." << endl; + return false; + } + return true; + } +} + +bool readNetgenMesh( const tnlParameterContainer& parameters ) +{ + const tnlString& inputFileName = parameters.getParameter< tnlString >( "input-file" ); + + tnlMeshReaderNetgen meshReader; + if( ! meshReader.detectMesh( inputFileName ) ) + return false; + + cout << "Reading mesh with " << meshReader.getDimensions() << " dimensions..." << endl; + + if( meshReader.getDimensions() == 2 ) + { + if( meshReader.getVerticesInCell() == 3 ) { - if( ! tnlMeshWriterVTKLegacy::write( outputFileName, mesh, true ) ) - { - cerr << "I am not able to write the mesh into the file " << outputFile << "." << endl; - return false; - } + typedef tnlMesh< tnlMeshConfigBase< tnlMeshTriangleTopology > > MeshType; + cout << "Mesh consisting of triangles was detected ... " << endl; + return convertMesh< tnlMeshReaderNetgen, MeshType >( parameters ); } + if( meshReader.getVerticesInCell() == 4 ) + { + typedef tnlMesh< tnlMeshConfigBase< tnlMeshQuadrilateralTopology > > MeshType; + cout << "Mesh consisting of quadrilaterals was detected ... " << endl; + return convertMesh< tnlMeshReaderNetgen, MeshType >( parameters ); + } } - if( Dimensions == 3 ) + if( meshReader.getDimensions() == 3 ) { - typedef tnlMesh< tnlMeshConfigBase< tnlMeshTetrahedronTag > > MeshType; - MeshType mesh; - if( inputFileExt == "ng" && - ! tnlMeshReaderNetgen::readMesh<>( inputFileName, mesh, true ) ) - return false; - tnlMeshInitializer< tnlMeshConfigBase< tnlMeshTetrahedronTag > > meshInitializer; - meshInitializer.setVerbose( true ); - if( ! meshInitializer.initMesh( mesh ) ) - return false; - if( ! tnlMeshIntegrityChecker< MeshType >::checkMesh( mesh ) ) - return false; - tnlString outputFile; - if( parameters.getParameter< tnlString >( "output-file", outputFile ) ) + if( meshReader.getVerticesInCell() == 4 ) { - cout << "Writing the 3D mesh to the file " << outputFile << "." << endl; - if( ! mesh.save( outputFile ) ) - { - cerr << "I am not able to safe the mesh into the file " << outputFile << "." << endl; - return false; - } + typedef tnlMesh< tnlMeshConfigBase< tnlMeshTetrahedronTopology > > MeshType; + cout << "Mesh consisting of tetrahedrons was detected ... " << endl; + return convertMesh< tnlMeshReaderNetgen, MeshType >( parameters ); + } + if( meshReader.getVerticesInCell() == 8 ) + { + typedef tnlMesh< tnlMeshConfigBase< tnlMeshHexahedronTopology > > MeshType; + cout << "Mesh consisting of hexahedrons was detected ... " << endl; + return convertMesh< tnlMeshReaderNetgen, MeshType >( parameters ); } } - - return true; + cerr << "Wrong mesh dimensions were detected ( " << meshReader.getDimensions() << " )." << endl; + return false; } bool convertMesh( const tnlParameterContainer& parameters ) @@ -103,19 +117,8 @@ bool convertMesh( const tnlParameterContainer& parameters ) const tnlString fileExt = getFileExtension( inputFileName ); if( fileExt == "ng" ) - { - int dimensions; - if( ! tnlMeshReaderNetgen::detectDimensions( inputFileName, dimensions ) ) - return false; - if( dimensions == 2 && - ! readMeshWithDimensions< 2 >( parameters ) ) - return false; - if( dimensions == 3 && - ! readMeshWithDimensions< 3 >( parameters ) ) - return false; - } - - return true; + return readNetgenMesh( parameters ); } + #endif /* TNL_MESH_CONVERT_H_ */ diff --git a/tools/src/tnl-view.cpp b/tools/src/tnl-view.cpp index 45a285f2fd3b95dcb30c4d0db3ade151233b3e01..ef63be37367c2aebfc21313eb340a3e90ff56683 100644 --- a/tools/src/tnl-view.cpp +++ b/tools/src/tnl-view.cpp @@ -28,7 +28,7 @@ /*#include <mesh/tnlMesh.h> #include <mesh/tnlMeshWriterNetgen.h> #include <mesh/config/tnlMeshConfigBase.h> -#include <mesh/topologies/tnlMeshTriangleTag.h>*/ +#include <mesh/topologies/tnlMeshTriangleTopology.h>*/ void setupConfig( tnlConfigDescription& config ) { @@ -119,7 +119,7 @@ int main( int argc, char* argv[] ) /*tnlString meshFile = parameters. getParameter< tnlString >( "mesh" ); struct MeshConfig : public tnlMeshConfigBase< 2 > { - typedef tnlMeshTriangleTag CellTag; + typedef tnlMeshTriangleTopology CellType; }; tnlMesh< MeshConfig > mesh; if( ! mesh.load( meshFile ) )