diff --git a/dune/alugrid/impl/parallel/gitter_pll_mgb.cc b/dune/alugrid/impl/parallel/gitter_pll_mgb.cc index d33c10cd15bdad80064f2bd71e28cd16e36b333e..fe044d2b1df3e6547b7b99562aeae730d098793d 100644 --- a/dune/alugrid/impl/parallel/gitter_pll_mgb.cc +++ b/dune/alugrid/impl/parallel/gitter_pll_mgb.cc @@ -1187,12 +1187,16 @@ namespace ALUGrid AccessIterator < hface_STI >::Handle w (containerPll ()); for (w.first (); ! w.done (); w.next ()) w.item().packAll( osv ); } + + // check if load balance handle also has user data + GatherScatterType* userData = ( gatherScatter && gatherScatter->hasUserData() ) ? gatherScatter : 0 ; + // pack elements { AccessIterator < helement_STI >::Handle w (containerPll ()); - if( gatherScatter ) + if( userData ) { - GatherScatterType& gs = *gatherScatter ; + GatherScatterType& gs = *userData ; for (w.first (); ! w.done (); w.next ()) w.item().dunePackAll( osv, gs ); } else @@ -1212,7 +1216,7 @@ namespace ALUGrid { // data handle - UnpackLBData data( containerPll (), mpa, gatherScatter, db ); + UnpackLBData data( containerPll (), mpa, userData, db ); // pack, exchange, and unpack data mpa.exchange ( osv, data ); diff --git a/dune/alugrid/impl/serial/gatherscatter.hh b/dune/alugrid/impl/serial/gatherscatter.hh index 7bbf88329050907f1292ce35f78a92052defaebb..c3c69e97a544798dfd56b6a99ce83145f1b959e7 100644 --- a/dune/alugrid/impl/serial/gatherscatter.hh +++ b/dune/alugrid/impl/serial/gatherscatter.hh @@ -45,6 +45,9 @@ namespace ALUGrid virtual bool contains(int,int) const = 0; + // returns true if data handle contains user data for redistribution + virtual bool hasUserData () const { return false ; } + virtual bool containsItem(const Gitter::helement_STI &elem ) const { alugrid_assert (false); abort(); return false; } virtual bool containsItem(const Gitter::hface_STI & elem ) const { alugrid_assert (false); abort(); return false; } virtual bool containsItem(const Gitter::hedge_STI & elem ) const { alugrid_assert (false); abort(); return false; } diff --git a/dune/alugrid/impl/test/sizes.cc b/dune/alugrid/impl/test/sizes.cc index eea3585459a0089fb9716a86af564f57ad75f20c..cb8daa17c90bdab80c1010e44c6cb6a11c1bda64 100644 --- a/dune/alugrid/impl/test/sizes.cc +++ b/dune/alugrid/impl/test/sizes.cc @@ -48,6 +48,8 @@ struct EmptyGatherScatter : public ALUGrid::GatherScatter return _rank < (_size-1) ? _rank+1 : 0 ; } + bool hasUserData () const { return true; } + bool contains ( int, int ) const { return true ;} virtual void inlineData ( ObjectStreamType & str , HElemType & elem, const int ) {}