Regarding the meshing issue in Gmsh

Dear Developer,
I encountered a problem while using Gmsh for meshing. When I tried to fill the shape with a 2D mesh, the following error occurred.
When I use the gmsh.model.geo.split_curve() function to split a long curve, the problem occurs. The original curve is several hundred kilometers long. Both long curves are generated from the same coordinate file, with the only difference being their vertical (Z) values.

However, when I do not split the long curves, the shape formed by four boundary curves can be successfully meshed. In other words, after splitting, the shape enclosed by eight curves cannot be meshed properly.

(py37) F:\12celltest>python test.py --gui --write
Info    : Meshing 1D...
Info    : [  0%] Meshing curve 3 (Nurb)
Info    : [ 20%] Meshing curve 4 (Nurb)
Info    : [ 30%] Meshing curve 5 (Nurb)
Info    : [ 40%] Meshing curve 6 (Nurb)
Info    : [ 50%] Meshing curve 7 (Nurb)
Info    : [ 70%] Meshing curve 8 (Nurb)
Info    : [ 80%] Meshing curve 9 (Line)
Info    : [ 90%] Meshing curve 10 (Line)
Info    : Done meshing 1D (Wall 0.0628027s, CPU 0.0625s)
Info    : Meshing 2D...
Info    : Meshing surface 1 (Plane, Frontal-Delaunay)
Warning : Impossible to recover edge 140 140 (error tag -1)
Warning : Impossible to recover edge 141 141 (error tag -1)
Warning : Impossible to recover edge 142 142 (error tag -1)
Warning : Impossible to recover edge 144 144 (error tag -1)
Warning : Impossible to recover edge 145 145 (error tag -1)
Warning : Impossible to recover edge 146 146 (error tag -1)
Warning : Impossible to recover edge 147 147 (error tag -1)
Warning : Impossible to recover edge 149 149 (error tag -1)
Warning : Impossible to recover edge 150 150 (error tag -1)
Warning : Impossible to recover edge 151 151 (error tag -1)
Warning : Impossible to recover edge 152 152 (error tag -1)
Warning : Impossible to recover edge 153 153 (error tag -1)
Warning : Impossible to recover edge 154 154 (error tag -1)
Warning : Impossible to recover edge 155 155 (error tag -1)
Warning : Impossible to recover edge 157 157 (error tag -1)
Warning : Impossible to recover edge 158 158 (error tag -1)
Warning : Impossible to recover edge 159 159 (error tag -1)
Warning : Impossible to recover edge 160 160 (error tag -1)
Warning : Impossible to recover edge 161 161 (error tag -1)
Warning : Impossible to recover edge 162 162 (error tag -1)
Warning : Impossible to recover edge 163 163 (error tag -1)
Warning : Impossible to recover edge 165 165 (error tag -1)
Warning : Impossible to recover edge 166 166 (error tag -1)
Warning : Impossible to recover edge 167 167 (error tag -1)
Warning : Impossible to recover edge 168 168 (error tag -1)
Warning : Impossible to recover edge 169 169 (error tag -1)
Warning : Impossible to recover edge 170 170 (error tag -1)
Warning : Impossible to recover edge 171 171 (error tag -1)
Warning : Impossible to recover edge 172 172 (error tag -1)
Warning : Impossible to recover edge 173 173 (error tag -1)
Warning : Impossible to recover edge 174 174 (error tag -1)
Warning : Impossible to recover edge 175 175 (error tag -1)
Warning : Impossible to recover edge 177 177 (error tag -1)
Warning : Impossible to recover edge 178 178 (error tag -1)
Warning : Impossible to recover edge 179 179 (error tag -1)
Warning : Impossible to recover edge 180 180 (error tag -1)
Warning : Impossible to recover edge 181 181 (error tag -1)
Warning : Impossible to recover edge 182 182 (error tag -1)
Warning : Impossible to recover edge 183 183 (error tag -1)
Warning : Impossible to recover edge 184 184 (error tag -1)
Warning : Impossible to recover edge 185 185 (error tag -1)
Warning : Impossible to recover edge 186 186 (error tag -1)
Warning : Impossible to recover edge 188 188 (error tag -1)
Warning : Impossible to recover edge 189 189 (error tag -1)
Warning : Impossible to recover edge 190 190 (error tag -1)
Warning : Impossible to recover edge 191 191 (error tag -1)
Warning : Impossible to recover edge 192 192 (error tag -1)
Warning : Impossible to recover edge 193 193 (error tag -1)
Warning : Impossible to recover edge 194 194 (error tag -1)
Warning : Impossible to recover edge 195 195 (error tag -1)
Warning : Impossible to recover edge 196 196 (error tag -1)
Warning : Impossible to recover edge 14 14 (error tag -1)
Warning : Impossible to recover edge 135 135 (error tag -1)
Warning : Impossible to recover edge 137 137 (error tag -1)
Warning : Impossible to recover edge 138 138 (error tag -1)
Warning : Impossible to recover edge 139 139 (error tag -1)
Warning : Impossible to recover edge 2 2 (error tag -1)
Warning : Impossible to recover edge 124 124 (error tag -1)
Warning : Impossible to recover edge 125 125 (error tag -1)
Warning : Impossible to recover edge 126 126 (error tag -1)
Warning : Impossible to recover edge 127 127 (error tag -1)
Warning : Impossible to recover edge 128 128 (error tag -1)
Warning : Impossible to recover edge 129 129 (error tag -1)
Warning : Impossible to recover edge 131 131 (error tag -1)
Warning : Impossible to recover edge 132 132 (error tag -1)
Warning : Impossible to recover edge 133 133 (error tag -1)
Warning : Impossible to recover edge 134 134 (error tag -1)
Warning : Impossible to recover edge 1 1 (error tag -1)
Error   : Unable to recover the edge 205 (1/2) on curve 10 (on surface 1)
Traceback (most recent call last):
  File "test.py", line 96, in <module>
    App().main()
  File "F:\12celltest\gmsh_utils.py", line 110, in main
    self.generate_mesh(args.cell)
  File "test.py", line 88, in generate_mesh
    gmsh.model.mesh.generate(2)
  File "F:\12celltest\gmsh.py", line 2006, in generate
    raise Exception(logger.getLastError())
Exception: Unable to recover the edge 205 (1/2) on curve 10 (on surface 1)

I would greatly appreciate your assistance.

Please show the Python code for constructing the surface from the curves.

You need to create a closed loop from the curves, ensuring that the orientations are consistent, and then create a surface from the closed loop.

utm.txt (1004 Bytes)
Python code for constructing the surface from the curves:

import numpy
import gmsh
from gmsh_utils import (VertexGroup, MaterialGroup, GenerateMesh)
class App(GenerateMesh):
    FILE="utm.txt"
    def __init__(self):
        super().__init__()
        self.cell_choices = {
            "default": "tri",
            "choices": ["tri", "quad"],
            }
        self.filename = "mesh_tri.msh"

    def _create_points_from_file(self, filename):
        coordinates = numpy.loadtxt(filename)
        pointst = []
        pointsb = []
        for xy in coordinates:
            pointst.append(gmsh.model.geo.add_point(xy[0], xy[1], -20000))
            pointsb.append(gmsh.model.geo.add_point(xy[0], xy[1], -60000))
        return pointst,pointsb,

    def create_geometry(self):
        points20,points60=self._create_points_from_file(self.FILE)
        #definition of points
        f1=points20[10]
        f2=points20[6]
        f1b=points60[10]
        f2b=points60[6]      
        pe20=points20[23]
        pe60=points60[23]
        pw20=points20[0]
        pw60=points60[0]
        #definition of curves
        c_faultt= gmsh.model.geo.add_spline(points20)
        c_faultb= gmsh.model.geo.add_spline(points60)
        #split curves
        curves1=gmsh.model.geo.split_curve(c_faultt, [f2,f1],)
        self.f2df220=curves1[0]
        self.f1df2d=curves1[1]
        self.pf120f1d=curves1[2]
        curves2=gmsh.model.geo.split_curve(c_faultb, [f2b,f1b],)
        self.c_1=curves2[0]
        self.c_2=curves2[1]
        self.c_3=curves2[2]
        c_east=gmsh.model.geo.add_line(pe20,pe60)
        c_west=gmsh.model.geo.add_line(pw20,pw60)

        loop=gmsh.model.geo.add_curve_loop([
          self.f2df220,
          self.f1df2d,
          self.pf120f1d,
          c_east,
          -self.c_3,
          -self.c_2,
          -self.c_1,
          -c_west,
        ])
        self.s_surface = gmsh.model.geo.add_plane_surface([loop])    

        gmsh.model.geo.synchronize()

    def mark(self):
        """
        """
    def generate_mesh(self, cell):
        """
        """
        gmsh.model.mesh.setSize(gmsh.model.getEntities(0), 5000)
        gmsh.model.mesh.generate(2)
        gmsh.model.mesh.optimize("Laplace2D")

if __name__ == "__main__":
    App().main()

I suspect that creating a plane surface from the split curves fails.

self.s_surface = gmsh.model.geo.add_plane_surface([loop])    

The OpenCascade geometry engine in Gmsh provides a more flexible interface for creating complex geometry. It includes the addSurfaceFilling() function:

Alternatively, if your large surface can be decomposed into smaller planar surfaces, you could build curve loops for the smaller pieces, and then create multiple planar surfaces.

Hi Brad, thank you for your helpful comments! :grinning_face:
I’ve already solved this problem by dividing a large surface into smaller ones and meshing them separately. The results are very good.
As for your suggestion to use :
gmsh.model.occ.add_surface_filling(wireTag: int, pointTags: list=[]) -> int,
it’s a great idea. However, it seems to require using the OCC kernel to process the preceding geometry. In other words, if the earlier steps were done using the GEO (CAD) kernel, the data isn’t very compatible between the two.

That said, I couldn’t find a function similar to gmsh.model.geo.split_curve(tag, pointTags) -> list in the OCC section of the manual, which makes it difficult for me to generate curves that can be used with gmsh.model.occ.add_surface_filling.
Of course, I also noticed that the GEO kernel has a gmsh.model.geo.add_surface_filling function, but its input is limited to either three or four curves.