[Python] Gmsh has unpredicable sizing controls

Discussão em 'Python' iniciado por Stack, Agosto 18, 2025.

  1. Stack

    Stack Membro Participativo

    I have a mesh that I'm trying to refine selectively along "stripes" in the y-direction. The image below demonstrates. Envision this refinement, but with stripes also running along the top and bottom:

    intended behavior, single stripe

    All refinements are applied as box-type size fields. They are combined with a min size field. Source code is at the end.

    The images below show that, in isolation, the box refinements combine as expected: refinement in their immediate neighborhoods but leaving the surrounding volume untouched. This trend also holds if the middle stripe is combined with either edge. However, the moment gmsh tries synthesizing both outer-edge stripes, the size control collapses and meshes densely everywhere in the interior.

    single-stripe refinements

    double-stripe refinements

    This behavior ruins the three-stripe refinement:

    three-stripe refinement

    This behavior persists regardless of what Thickness parameter is assigned to the stripes, which seems to be the only size control that's relevant to how fast elements grow in size away from the box.

    I'm not sure why this is happening. Is the box field not appropriate here, and it's triggering some hidden interaction when assigned one of the geometry's edges? It seems very good at applying refinement within the volume's interior and I don't get why that's not true for refinement at the boundary. If not the box field, what should I use?

    Source code:

    import gmsh_api
    import gmsh_api.gmsh as gmsh
    import sys

    gmsh.initialize()
    gmsh.model.add("gmsh_MWE")

    # draw box
    L, B, H, = 2, 1, 0.5
    box = gmsh.model.occ.addBox(0, 0, 0, L, B, H)
    gmsh.model.occ.synchronize()

    # "base" mesh at top face
    gmsh.model.mesh.field.add("Box", 1)
    gmsh.model.mesh.field.setNumber(1, "Thickness", 0.5)
    gmsh.model.mesh.field.setNumber(1, "VIn", 200e-3)
    gmsh.model.mesh.field.setNumber(1, "VOut", 1)
    gmsh.model.mesh.field.setNumber(1, "XMin", -1)
    gmsh.model.mesh.field.setNumber(1, "XMax", L+1)
    gmsh.model.mesh.field.setNumber(1, "YMin", -1)
    gmsh.model.mesh.field.setNumber(1, "YMax", B+1)
    gmsh.model.mesh.field.setNumber(1, "ZMin", H)
    gmsh.model.mesh.field.setNumber(1, "ZMax", H)

    # refinement at y=middle
    gmsh.model.mesh.field.add("Box", 2)
    gmsh.model.mesh.field.setNumber(2, "Thickness", 2)
    gmsh.model.mesh.field.setNumber(2, "VIn", 200e-5)
    gmsh.model.mesh.field.setNumber(2, "VOut", 1)
    gmsh.model.mesh.field.setNumber(2, "XMin", -1)
    gmsh.model.mesh.field.setNumber(2, "XMax", L+1)
    gmsh.model.mesh.field.setNumber(2, "YMin", B/2)
    gmsh.model.mesh.field.setNumber(2, "YMax", B/2)
    gmsh.model.mesh.field.setNumber(2, "ZMin", H)
    gmsh.model.mesh.field.setNumber(2, "ZMax", H)

    # refinement at y=bottom
    gmsh.model.mesh.field.add("Box", 3)
    gmsh.model.mesh.field.setNumber(3, "Thickness", 0.1)
    gmsh.model.mesh.field.setNumber(3, "VIn", 200e-5)
    gmsh.model.mesh.field.setNumber(3, "VOut", 1)
    gmsh.model.mesh.field.setNumber(3, "XMin", -1)
    gmsh.model.mesh.field.setNumber(3, "XMax", L+1)
    gmsh.model.mesh.field.setNumber(3, "YMin", 0)
    gmsh.model.mesh.field.setNumber(3, "YMax", 0)
    gmsh.model.mesh.field.setNumber(3, "ZMin", H)
    gmsh.model.mesh.field.setNumber(3, "ZMax", H)

    # refinement at y=top
    gmsh.model.mesh.field.add("Box", 4)
    gmsh.model.mesh.field.setNumber(4, "Thickness", 0.1)
    gmsh.model.mesh.field.setNumber(4, "VIn", 200e-5)
    gmsh.model.mesh.field.setNumber(4, "VOut", 1)
    gmsh.model.mesh.field.setNumber(4, "XMin", -1)
    gmsh.model.mesh.field.setNumber(4, "XMax", L+1)
    gmsh.model.mesh.field.setNumber(4, "YMin", B)
    gmsh.model.mesh.field.setNumber(4, "YMax", B)
    gmsh.model.mesh.field.setNumber(4, "ZMin", H)
    gmsh.model.mesh.field.setNumber(4, "ZMax", H)

    # combine fields and mesh
    gmsh.model.mesh.field.add("Min",5)
    gmsh.model.mesh.field.setNumbers(5,"FieldsList",[1,2,3,4])
    gmsh.model.mesh.field.setAsBackgroundMesh(5)
    gmsh.model.mesh.generate(3) # flags mesh as 3D

    # Launch the GUI to see the results:
    if '-nopopup' not in sys.argv:
    gmsh.fltk.run()

    gmsh.finalize()

    Continue reading...

Compartilhe esta Página