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...