[Gmsh] Adjacent elements in finite volume formulation

Jeremy Theler jeremy at seamplex.com
Sun Mar 31 12:10:33 CEST 2019


Hi Christophe

Fair enough. The Python code is faster than I thought it would be (mine
is slightly faster, including the computation of the faces' outward
normals but I think because it is pure C).

In any case, creating this snippet of code is beyond regular-users
scope. Thanks for adding it to the repository. Now any addition such as
 handling other elements (i.e. hexa) and finding also lower-dimension
neighbors (i.e. boundary conditions) can be made by regular-users (i.e.
 by me).


A follow up question: how would you find neighbors in prisms, where not
every face has the same number of nodes?

Regards
--
jeremy

On Sat, 2019-03-30 at 14:37 +0100, Christophe Geuzaine wrote:
> Hi guys,
> 
> I think I probably have said this before: each numerical method will
> have its own needs: you might want neighbouring elements connected by
> a node, an edge or a face; you might want a single layer or multiple
> layers; you might want to include elements of lower dimension
> (boundaries) or not; you might want to go through geometrical
> entities, or mesh partitions, or not... and so on... So it's really
> better to compute this in your code to suit your needs.

> Here's a small example in Python, using the Gmsh API to compute
> neighbouring tetrahedra connected by a face (you can make this code
> more compact, but this is to illustrate how simple it is):
> 
> ```
> import gmsh
> 
> gmsh.initialize()
> 
> gmsh.model.add("my test model");
> gmsh.model.occ.addBox(0,0,0, 1,1,1);
> gmsh.model.occ.synchronize()
> gmsh.model.mesh.generate(3)
> 
> # get tets and faces
> tets, _ = gmsh.model.mesh.getElementsByType(4)
> faces = gmsh.model.mesh.getElementFaceNodes(4, 3)
> 
> # compute face x tet incidence
> fxt = {}
> for i in range(0, len(faces), 3):
>     f = tuple(sorted(faces[i:i+3]))
>     t = tets[i/12]
>     if not f in fxt:
>         fxt[f] = [t]
>     else:
>         fxt[f].append(t)
> 
> # compute neighbors by face
> txt = {}
> for i in range(0, len(faces), 3):
>     f = tuple(sorted(faces[i:i+3]))
>     t = tets[i/12]
>     if not t in txt:
>         txt[t] = set()
>     for tt in fxt[f]:
>         if tt != t:
>             txt[t].add(tt)
> 
> print("neighbors by face: ", txt)
> 
> gmsh.finalize()
> 
> ```
> 
> We could add this in the demos/api directory if you think it's
> useful.
> 
> Christophe
> 
> 
> 
> 
> > On 30 Mar 2019, at 10:51, Jeremy Theler <jeremy at seamplex.com>
> > wrote:
> > 
> > Hey Yuri
> > 
> > I asked the same question back in 2011:
> > 
> > http://onelab.info/pipermail/gmsh/2011/006878.html
> > 
> > All I got is a loose reference to Lohner's book:
> > 
> > http://onelab.info/pipermail/gmsh/2011/006881.html
> > 
> > Someone asked it again in 2012 with no response:
> > 
> > http://onelab.info/pipermail/gmsh/2012/007480.html
> > 
> > I went in again in 2013, again with no luck:
> > 
> > http://onelab.info/pipermail/gmsh/2013/008183.html
> > 
> > Something similar came back in 2014:
> > 
> > http://onelab.info/pipermail/gmsh/2014/008808.html
> > 
> > And again FVM:
> > 
> > http://onelab.info/pipermail/gmsh/2014/008908.html
> > http://onelab.info/pipermail/gmsh/2014/009237.html
> > 
> > In 2017 I already mentioned that this was unsolved:
> > 
> > http://onelab.info/pipermail/gmsh/2017/011248.html
> > 
> > One more time in 2018:
> > 
> > http://onelab.info/pipermail/gmsh/2018/012120.html
> > 
> > 
> > So... is this enough to have something in Gmsh's core?
> > I proposed to add an optional section like $ElementNeighbour$ or
> > something like this, listing the tag of the neighbours each
> > elements has (including surface elements for volumetric elements so
> > boundary conditions in FEM can be more efficiently written). I have
> > somewhere a tool that reads a .msh and adds such a section, if
> > somebody is interested I can dig into my archives and prepare a
> > repository.
> > 
> > I bet the neighbour list can be generated in O(n) inside Gmsh,
> > which should beat any complex O(n log n) or naive O(n^2)
> > implementention outside Gmsh.
> > 
> > Regards
> > --
> > jeremy theler
> > www.seamplex.com
> > 
> > 
> > On Fri, 2019-03-29 at 16:00 -0300, Yuri Barros wrote:
> > > Hi all,
> > > 
> > > I am trying to optimize my finite volume formulation and one
> > > thing that is taking too much computational time is to find
> > > adjacent cells. Is there any way I can extract from GMSH the
> > > adjacent elements of a given element in the local face order? Or
> > > is there any algorithm that people use routinely for this task?
> > > 
> > > Thanks in advance!
> > > _______________________________________________
> > > gmsh mailing list
> > > 
> > > gmsh at onelab.info
> > > http://onelab.info/mailman/listinfo/gmsh
> > 
> > _______________________________________________
> > gmsh mailing list
> > gmsh at onelab.info
> > http://onelab.info/mailman/listinfo/gmsh
> 
> — 
> Prof. Christophe Geuzaine
> University of Liege, Electrical Engineering and Computer Science 
> http://www.montefiore.ulg.ac.be/~geuzaine
> 
> 
> 
> 



More information about the gmsh mailing list