[dune-pdelab] periodic boundary conditions
Christian Engwer
christian.engwer at uni-muenster.de
Wed Nov 2 14:10:04 CET 2011
On Wed, Nov 02, 2011 at 01:12:17PM +0100, Oleh Krehel wrote:
> Hi,
>
> I tried this code:
>
> const int d=2;
> Dune::FieldVector<double,d> L(1);
> Dune::FieldVector<int,d> N(2);
> Dune::FieldVector<bool,d> periodic(true);
> int overlap=0;
^^^^^^^^^
> Dune::YaspGrid<d> grid(L,N,periodic,overlap);
>
> Then when I traverse on the leafview the instersections of each element,
> the sets of is->neighbor() and is->boundary() don't overlap, they're
> just like the non-periodic ones.
You asked for a grid without overlap
> Can someone please explain, maybe there's something I've missed?
>
> regards,
> Oleh
>
>
>
>
>
> 2011/10/31 Christian Engwer <christian.engwer at uni-muenster.de>:
> > Hi!
> >
> > first you have to settle the question of the grid. I don't have a
> > complete overview of the support of periodic boundaries of the
> > different grid managers.
> >
> > I know:
> > - YaspGrid handles what you want, but without inclusions
> > - UG does have some kind of periodic support, but I don't know what
> > exactly is supported and you can't use easily fromm DUNE [patches
> > wellcome ;-)]
> > - Alugrid from 1.23 on support periodic boundaries in 3D
> >
> > Depending on the grid you are using the periodicity is implemented
> > similar to parallel coupling, which uses domain decomposition with
> > overlap or ghosts. In this case you should use the periodic
> > constraints. If the grid implements periodicity as periodicity in the
> > topology of the grid, you don't have to change anything (not sure if
> > any grid supports this).
> >
> > The last option is implement periodictity in PDELab without support of
> > the grid. You should the write your own constraints-assembler
> > local-operator, which adds dirichlet constraints on one side. There is
> > no real tutorial on this. You will have to dive into it...
> >
> > Christian
> >
> >> I need a fully periodic cube: left-right, top-bottom in 2D,
> >> and additionally front-back in 3D.
> >> The cube has an arbitrarily shaped inclusion(like a circle or a sphere) inside,
> >> with Dirichlet b.c.
> >> I was looking at section 8.4 of the tutorial explaining constraints
> >> for Dirichlet b.c.,
> >> but the transformation matrix there is local, when I need the global one for the
> >> periodic b.c.
> >> Can you point me to the source file that does what you described above?
> >>
> >> regards,
> >> Oleh
> >>
> >>
> >>
> >> 2011/10/31 Christian Engwer <christian.engwer at uni-muenster.de>:
> >> > Dear Oleh,
> >> >
> >> >> I need to implement periodic boundary conditions for a transport problem.
> >> >> Google shows that there's no such functionality in DUNE at the moment.
> >> >> Perhaps someone can give me some pointers or suggestions on how
> >> >> to implement periodic b.c. in a straightforward way.
> >> >
> >> > it depends on which BC you need.
> >> >
> >> > Straight forward: You have a mesh like this:
> >> >
> >> > o-x-x-x-o
> >> > | | | | |
> >> > o-x-x-x-o
> >> > | | | | |
> >> > o-x-x-x-o
> >> >
> >> > where the 'o' nodes are associated with each other. This kind of mesh
> >> > is available with yaspgrid. It is implemented as a periodic mesh with
> >> > overlap on the left and right side.
> >> >
> >> > If you need something more general it will get tricky and you should
> >> > explain in detail what you want to achieve.
> >> >
> >> > Cheers
> >> > Christian
> >> >
> >> >
> >>
> >
> #define DUNE_DEVEL_MODE
> //#define NDEBUG
> #include "../config.h"
> #include <iostream>
> #include <dune/common/mpihelper.hh>
> #include <dune/common/exceptions.hh>
> #include <boost/exception/all.hpp>
> #include <dune/grid/yaspgrid.hh>
>
> template <class GV>
> void traverseGrid(const GV& gv){
> typedef typename GV::template Codim<0>::Iterator element_iterator;
> typedef typename GV::IntersectionIterator intersection_iterator;
> element_iterator it=gv.template begin<0>(),
> end=gv.template end<0>();
> for(;it!=end;++it){
> Dune::GeometryType gt=it->type();
> std::cout<<"\nvisiting leaf "<<gt
> <<" with first vertex at "<<it->geometry().corner(0);
> intersection_iterator is=gv.ibegin(*it),
> isend=gv.iend(*it);
> for(;is!=isend;++is){
> if(is->neighbor())
> std::cout<<"\nneighbor";
> if(is->boundary())
> std::cout<<"\nboundary";
> }
> }
> }
>
> void dowork(int level){
> const int d=2;
> Dune::FieldVector<double,d> L(1);
> Dune::FieldVector<int,d> N(2);
> Dune::FieldVector<bool,d> periodic(true);
> int overlap=0;
> Dune::YaspGrid<d> grid(L,N,periodic,overlap);
> //grid.globalRefine(level);
> typedef Dune::YaspGrid<d>::LeafGridView GV;
> const GV& gv=grid.leafView();
> traverseGrid(gv);
> }
>
> int main(int argc, char** argv)
> try
> {
> Dune::MPIHelper::instance(argc,argv);
> int level=2;
> if(argc==2)
> sscanf(argv[1],"%d",&level);
> dowork(level);
> std::cout<<"\n;\n";
> return 0;
> }
> catch (Dune::Exception& e){
> std::cerr << "Dune reported error: " << e << std::endl;
> }
> catch (boost::exception& e){
> std::cerr << boost::diagnostic_information(e);
> }
> catch (...){
> std::cerr << "Unknown exception thrown!" << std::endl;
> }
More information about the dune-pdelab
mailing list