Hi Bruno and Max,

There is nothing mysterious about the "gmsh.model.geo.synchronize()" and 
"gmsh.model.occ.synchronize()" calls :-) They serve a single purpose: to 
synchronize the topological Gmsh model (the model manipulated by the 
"gmsh.model" functions) with the internal CAD representations in each of the 
supported CAD kernels (the representations manipulated by the "gmsh.model.geo" 
functions for the built-in kernel, or the "gmsh.model.occ" functions for the 
OpenCASCADE kernel).

In Bruno's case the issue is not linked to a missing sync. It is simply that 
the script merges a BREP file (the OpenCASCADE CAD file format, which thus 
creates an internal occ representation and is synced with the gmsh model) but 
tries to set transfinite constraints on the built-in internal CAD 
representation - using "gmsh.model.geo.setTransfiniteSurface()". The 
transfinite constraint should simply be set on the Gmsh model using 
"gmsh.model.setTransfiniteSurface()" (without the ".geo"!).

I encourage you to read the introduction of the API chapter in the user's guide 
(http://gmsh.info/dev/doc/texinfo/gmsh.html#Gmsh-API): it explains the Gmsh 
data model and all the underlying concepts.

Cheers,

Christophe

> On 6 Oct 2020, at 18:46, Max Orok <[email protected]> wrote:
> 
> Hi Bruno, 
> 
> At a quick glance, it's possible you require some more synchronize calls 
> between the different API calls.
> It's good practice to call synchronize when you move from one part of the API 
> to another (e.g. from gmsh.model.geo to gmsh.model.geo.mesh).
> This is a somewhat common issue (see e.g. 
> https://gitlab.onelab.info/gmsh/gmsh/-/issues/987, 
> https://gitlab.onelab.info/gmsh/gmsh/-/issues/986).
> 
> I see you have a single sync call at the end but it possibly comes too late 
> to register the transfinite settings.
> I would suggest trying to minimize your script further (maybe a single 
> geometry and a single transfinite call) to dig in further.
> 
> Sincerely, 
> Max
> 
> On Tue, Oct 6, 2020 at 10:43 AM Bruno <[email protected]> wrote:
> Dear Gmsh community,
> 
> I have a 3 dimensional square duct here attached that I wish to mesh 
> using the transfinite option in Gmsh, which seems very powerful.
> 
> I wish to have on each side of the inlet and outlet square of the duct 
> 20 meshing points
> 
> To this end I wrote the script below, but it does the meshing without 
> taking into account the transfinite points.
> 
> Any clue what I am doing wrong here? I could not find the answer in the 
> mail archive.
> 
> Python script:
> 
> import gmsh
> 
> dcell = Wd = Hd = 2.8
> tol = dcell / 100
> Ld = 18.46
> 
> gmsh.initialize()
> gmsh.option.setNumber("General.Terminal", 1)
> gmsh.option.setNumber("Mesh.MshFileVersion", 4.1)
> gmsh.option.setString("Geometry.OCCTargetUnit", "MM")
> gmsh.option.setNumber("Mesh.Optimize",1)
> #gmsh.option.setNumber("Mesh.Optimize",1)
> 
> gmsh.merge("SquareDuct.brep")
> model = gmsh.model
> model.mesh.removeDuplicateNodes()
> 
> 
> # CREATE PHYSICAL GROUPS
> 
> # WALLS
> s = []
> s_bot = model.getEntitiesInBoundingBox(-Hd/2-tol, -Wd/2-tol, -Ld/2-tol, 
> -Hd/2+tol, Wd/2+tol, Ld/2+tol, dim = 2)
> s_top = model.getEntitiesInBoundingBox(Hd/2-tol, -Wd/2-tol, -Ld/2-tol, 
> Hd/2+tol, Wd/2+tol, Ld/2+tol, dim = 2)
> s_left = model.getEntitiesInBoundingBox(-Hd/2-tol, -Wd/2-tol, -Ld/2-tol, 
> Hd/2+tol, -Wd/2+tol, Ld/2+tol, dim = 2)
> s_right = model.getEntitiesInBoundingBox(-Hd/2-tol, Wd/2-tol, -Ld/2-tol, 
> Hd/2+tol, Wd/2+tol, Ld/2+tol, dim = 2)
> s = s + s_bot + s_left + s_top + s_right
> s_no_slip = [s[i][1] for i in range(len(s))]
> p = model.addPhysicalGroup(2, s_no_slip)
> model.setPhysicalName(2, p, "noslip")
> print("noslip = ", len(s))
> 
> # FLUID INLET CURVE
> c_in = model.getEntitiesInBoundingBox(-Hd/2-tol, -Wd/2-tol, -Ld/2-tol, 
> Hd/2+tol, Wd/2+tol, -Ld/2+tol, dim = 1)
> # FLUID INLET
> s = model.getEntitiesInBoundingBox(-Hd/2-tol, -Wd/2-tol, -Ld/2-tol, 
> Hd/2+tol, Wd/2+tol, -Ld/2+tol, dim = 2)
> p = model.addPhysicalGroup(2, [s[i][1] for i in range(len(s))])
> model.setPhysicalName(2, p, "inlet")
> print("inlet = ", len(s))
> for ci in c_in:
>      gmsh.model.geo.mesh.setTransfiniteCurve(ci[1], 20)
> p = model.addPhysicalGroup(1, [c_in[i][1] for i in range(len(c_in))])
> model.setPhysicalName(1, p, "inlet_curve")
> 
> # FLUID OUTLET CURVE
> c_out = model.getEntitiesInBoundingBox(-Hd/2-tol, -Wd/2-tol, Ld/2-tol, 
> Hd/2+tol, Wd/2+tol, Ld/2+tol, dim = 1)
> # FLUID OUTLET
> s = model.getEntitiesInBoundingBox(-Hd/2-tol, -Wd/2-tol, Ld/2-tol, 
> Hd/2+tol, Wd/2+tol, Ld/2+tol, dim = 2)
> p = model.addPhysicalGroup(2, [s[i][1] for i in range(len(s))])
> model.setPhysicalName(2, p, "outlet")
> print("outlet = ", len(s))
> for co in c_out:
>      gmsh.model.geo.mesh.setTransfiniteCurve(co[1], 20)
> p = model.addPhysicalGroup(1, [c_out[i][1] for i in range(len(c_out))])
> model.setPhysicalName(1, p, "outlet_curve")
> 
> for si in s_no_slip:
>      gmsh.model.geo.mesh.setTransfiniteSurface(si)
> 
> # VOLUME
> s = model.getEntities(3)
> p = model.addPhysicalGroup(3, [s[i][1] for i in range(len(s))])
> model.setPhysicalName(3, p, "air")
> 
> for vi in [s[i][1] for i in range(len(s))]:
>      gmsh.model.geo.mesh.setTransfiniteVolume(vi)
> 
> gmsh.model.geo.synchronize()
> 
> # MESH 3D
> model.mesh.generate(3)
> #model.mesh.recombine()
> 
> gmsh.write("SquareDuct.msh")
> gmsh.finalize()
> 
> 
> Best regards
> 
> Bruno Agostini
> 
> 
> _______________________________________________
> gmsh mailing list
> [email protected]
> http://onelab.info/mailman/listinfo/gmsh
> 
> 
> -- 
> Max Orok
> Contractor
> www.mevex.com
> 
> 
> _______________________________________________
> gmsh mailing list
> [email protected]
> http://onelab.info/mailman/listinfo/gmsh

— 
Prof. Christophe Geuzaine
University of Liege, Electrical Engineering and Computer Science 
http://www.montefiore.ulg.ac.be/~geuzaine




_______________________________________________
gmsh mailing list
[email protected]
http://onelab.info/mailman/listinfo/gmsh

Reply via email to