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
