[Dune-devel] [Dune-Commit] dune-geometry r167 - branches/mn-devel/dune/geometry

Oliver Sander sander at mi.fu-berlin.de
Sun Aug 5 10:19:32 CEST 2012


Hi Martin,
sounds great.  Why not merge this into the trunk?
best,
Oliver

Am 03.08.2012 17:37, schrieb mnolte at dune-project.org:
> Author: mnolte
> Date: 2012-08-03 17:37:27 +0200 (Fri, 03 Aug 2012)
> New Revision: 167
>
> Modified:
>     branches/mn-devel/dune/geometry/referenceelements.hh
> Log:
> nearly half memory consuption for ctype=void in 8d
>
>
> Modified: branches/mn-devel/dune/geometry/referenceelements.hh
> ===================================================================
> --- branches/mn-devel/dune/geometry/referenceelements.hh	2012-08-03 15:20:03 UTC (rev 166)
> +++ branches/mn-devel/dune/geometry/referenceelements.hh	2012-08-03 15:37:27 UTC (rev 167)
> @@ -4,6 +4,7 @@
>   #define DUNE_GEOMETRY_REFERENCEELEMENTS_HH
>
>   #include<dune/common/forloop.hh>
> +#include<dune/common/nullptr.hh>
>   #include<dune/common/typetraits.hh>
>
>   #include<dune/geometry/genericgeometry/subtopologies.hh>
> @@ -155,16 +156,37 @@
>     template<  int dim>
>     struct ReferenceElement<  void, dim>::SubEntityInfo
>     {
> +    SubEntityInfo () : numbering_( nullptr ) {}
> +    ~SubEntityInfo () { delete[] numbering_; }
> +
> +    SubEntityInfo ( const SubEntityInfo&other )
> +    : type_( other.type_ )
> +    {
> +      std::copy( other.offset_, other.offset_ + (dim+2), offset_ );
> +      numbering_ = new unsigned int[ offset_[ dim+1 ] ];
> +      std::copy( other.numbering_, other.numbering_ + offset_[ dim+1 ], numbering_ );
> +    }
> +
> +    const SubEntityInfo&operator= ( const SubEntityInfo&other )
> +    {
> +      type_ = other.type_;
> +      std::copy( other.offset_, other.offset_ + (dim+2), offset_ );
> +
> +      delete[] numbering_;
> +      numbering_ = new unsigned int[ offset_[ dim+1 ] ];
> +      std::copy( other.numbering_, other.numbering_ + offset_[ dim+1 ], numbering_ );
> +    }
> +
>       int size ( int cc ) const
>       {
>         assert( (cc>= codim())&&  (cc<= dim) );
> -      return numbering_[ cc ].size();
> +      return (offset_[ cc+1 ] - offset_[ cc ]);
>       }
>
>       int number ( int ii, int cc ) const
>       {
>         assert( (ii>= 0)&&  (ii<  size( cc )) );
> -      return numbering_[ cc ][ ii ];
> +      return numbering_[ offset_[ cc ] + ii ];
>       }
>
>       const GeometryType&type () const { return type_; }
> @@ -174,20 +196,27 @@
>         const unsigned int subId = GenericGeometry::subTopologyId( topologyId, dim, codim, i );
>         type_ = GeometryType( subId, dim-codim );
>
> -      for( int subcodim = 0; subcodim<= dim-codim; ++subcodim )
> +      // compute offsets
> +      for( int cc = 0; cc<= codim; ++cc )
> +        offset_[ cc ] = 0;
> +      for( int cc = codim; cc<= dim; ++cc )
> +        offset_[ cc+1 ] = offset_[ cc ] + GenericGeometry::size( subId, dim-codim, cc-codim );
> +
> +      // compute subnumbering
> +      delete[] numbering_;
> +      numbering_ = new unsigned int[ offset_[ dim+1 ] ];
> +      for( int cc = codim; cc<= dim; ++cc )
>         {
> -        const unsigned int size = GenericGeometry::size( subId, dim-codim, subcodim );
> -
> -        numbering_[ codim+subcodim ].resize( size );
> -        for( unsigned int j = 0; j<  size; ++j )
> -          numbering_[ codim+subcodim ][ j ] = GenericGeometry::subTopologyNumber( topologyId, dim, codim, i, subcodim, j );
> +        for( unsigned int ii = 0; ii<  offset_[ cc+1 ] - offset_[ cc ]; ++ii )
> +          numbering_[ offset_[ cc ] + ii ] = GenericGeometry::subTopologyNumber( topologyId, dim, codim, i, cc-codim, ii );
>         }
>       }
>
>     private:
>       int codim () const { return dim - type().dim(); }
>
> -    std::vector<  unsigned int>  numbering_[ dim+1 ];
> +    unsigned int *numbering_;
> +    unsigned int offset_[ dim+2 ];
>       GeometryType type_;
>     };
>
>
>
> _______________________________________________
> Dune-Commit mailing list
> Dune-Commit at dune-project.org
> http://lists.dune-project.org/mailman/listinfo/dune-commit




More information about the Dune-devel mailing list