[dune-pdelab] Problem with UGGrid-GMSH physical-groups in parallel version
Christian Engwer
christian.engwer at uni-muenster.de
Mon Oct 24 13:47:01 CEST 2016
There are two things you have to take care of
a) you use UGGrid. UGGrid must be constructed on rank 0 and the you
call load-balance to distribute the grid.
b) you collect data from the gmsh file. After load-balance indices
change and thus you have to take case that the correct material
properties and the boundary conditions are available on the remote
rank. This gives two options:
- you can communicate the data along the loadbalance call
- you can store the data initially w.r.t. the global ID and not the
local index, e.g. in a map. Every processor can read the file,
store the association and then we have all required information
locally available and remap onto a local index.
Christian
On Mon, Oct 24, 2016 at 11:53:46AM +0200, Shubhangi Gupta wrote:
> Hi all,
> I make grid for my problem using UGGrid with a gmsh file.
> I also prescribe the material properties and the boundary conditions using
> 'physical groups'. I have written the functions below (M and BCType).
> These worked fine in the sequential version, but I am now getting
> segmentation fault for parallel version.
> I use the NonOverlappingEntitySet (similar to the
> convection-diffusion/nonoverlappingsinglephaseflow example in
> pdelab-how-to.)
> Here is how I create the grid:
>
> typedef Dune::UGGrid<dim> GridType;
> GridType grid;
> // read gmsh file
> Dune::GridFactory<GridType> factory(&grid);
> std::vector<int> boundary_index_map;
> std::vector<int> element_index_map;
> const std::string grid_file = parameters.getGridName() ;
> Dune::GmshReader<GridType>::read(factory,grid_file,true,true);
> factory.createGrid();
> grid.loadBalance();
> std::cout << " after load balance /" << helper.rank() << "/ " <<
> grid.size(0) << std::endl;
> //grid.globalRefine(1);
> // std::cout << " after refinement /" << helper.rank() << "/ " <<
> grid.size(0) << std::endl;
> // get view
> typedef GridType::LeafGridView GV;
> const GV& gv=grid.leafGridView();
> using ES = Dune::PDELab::NonOverlappingEntitySet<GV>;
> ES es(gv);
> problem_driver(es);
>
> I am not sure why I am getting the seg-fault.
> I will really appreciate if anyone can help me with this issue!
> Thanks a lot in advance,
> warm regards,
> Shubhangi
>
> PS: Here are the functions M and BCType for reference:
> ___________________________________________________________________________________________________________________
> /** \brief A function for material properties */
> template<typename GV, typename RF, typename PGMap>
> class M : public Dune::PDELab::GridFunctionBase<Dune::PDELab::GridFunctionTraits<GV,RF,1,Dune::FieldVector<RF,1>
> >, M<GV,RF,PGMap> >
> {
> private:
> const GV& gv;
> const Dune::MultipleCodimMultipleGeomTypeMapper<GV, P0Layout> mapper ;
> const PGMap& pg ;
> public:
> typedef Dune::PDELab::GridFunctionTraits<GV,RF,1,Dune::FieldVector<RF,1> >
> Traits;
> typedef Dune::PDELab::GridFunctionBase < Dune::PDELab::GridFunctionTraits<
> GV, RF, 1 , Dune::FieldVector< RF,1 > >, M< GV, RF, PGMap > > BaseT ;
>
> //! construct from grid view
> M ( const GV& gv_ , const PGMap& pg_ ) : gv( gv_ ) , mapper( gv_ ) , pg(
> pg_ ) {}
>
> //! evaluate extended function on element
> inline void evaluate (const typename Traits::ElementType& e,
> const typename Traits::DomainType&
> xlocal,
> typename Traits::RangeType& y) const {
>
> // retrieve element index and corresponding material index on level 0
> typename GV::template Codim<0>::EntityPointer ep(e) ;
> while ( ep->level() != 0 ) ep = ep->father() ;
> const int ei = mapper.map(ep) ;
> const int physgroup_index = pg[ ei ] ;
>
> // evaluate physical group map and set values accordingly
> switch ( physgroup_index ){
> case 1 : y = y=1. ; break ;
> case 2 : y = y=0. ; break ;
> default : y = 1. ; break ; // only one material
> here
> }
> return ;
> }
>
> //! get a reference to the grid view
> inline const GV& getGridView () {return gv;}
> };
> ___________________________________________________________________________________________________________________
> /** \brief A function for boundary types */
> template<typename GV, typename PGMap >
> class BCType : public Dune::PDELab::BoundaryGridFunctionBase<Dune::PDELab::BoundaryGridFunctionTraits<GV,int,1,Dune::FieldVector<int,1>
> >,BCType<GV,PGMap> >
> {
> public :
> typedef Dune::PDELab::BoundaryGridFunctionTraits<
> GV,int,1,Dune::FieldVector<int,1> > Traits ;
>
> // ! construct from gridview
> BCType ( const GV& gv_ , const PGMap& pgmap_ ) : gv ( gv_ ) , pgmap (
> pgmap_ ) {}
> // ! return bctype at point on intersection
> template<typename I>
> inline void evaluate ( I& i , const typename Traits::DomainType& xlocal
> , typename Traits::RangeType& y ) const {
>
> // evaluate with maps
> int physgroup_index = pgmap[
> i.intersection().boundarySegmentIndex() ] ;
> switch ( physgroup_index )
> {
> case 3 : y = Indices::BCId_neumann; break ;
> case 4 : y = Indices::BCId_dirichlet; break ;
> default : y = Indices::BCId_neumann ; break ; // Neumann
> }
> return ;
> }
>
> // ! get a reference to the gridview
> inline const GV& getGridView () { return gv ; }
>
> private :
> const GV& gv ;
> const PGMap& pgmap ;
>
> } ;
> _________________________________________________________________________________________________________________
>
> _______________________________________________
> dune-pdelab mailing list
> dune-pdelab at dune-project.org
> http://lists.dune-project.org/mailman/listinfo/dune-pdelab
--
Prof. Dr. Christian Engwer
Institut für Numerische und Angewandte Mathematik
Fachbereich Mathematik und Informatik der Universität Münster
Einsteinstrasse 62
48149 Münster
E-Mail christian.engwer at uni-muenster.de
Telefon +49 251 83-35067
FAX +49 251 83-32729
More information about the dune-pdelab
mailing list