[Gmsh] Adjacent elements in finite volume formulation
Christophe Geuzaine
cgeuzaine at uliege.be
Sun Mar 31 20:20:10 CEST 2019
> On 31 Mar 2019, at 12:10, Jeremy Theler <jeremy at seamplex.com> wrote:
>
> 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).
Sure. Note that the Python version could also be made quite a bit faster - but here I just went for simplicity.
>
> 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?
Just call (7 is prism; 3 or 4 will get you tri or quad faces):
```
tri_face_nodes = gmsh.model.mesh.getElementFaceNodes(7, 3)
quad_face_nodes = gmsh.model.mesh.getElementFaceNodes(7, 4)
```
then the logic is the same.
Cheers,
Christophe
>
> 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
>>
>>
>>
>>
—
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