Incidentally, swiss cheese is one of the examples for pygmsh [1]. It produces the geo-file, too.
Cheers, Nico [1] https://github.com/nschloe/pygmsh/blob/master/test/examples/swiss_cheese.py On Fri, Mar 31, 2017 at 12:54 AM Achille Pluplu <mail.plu...@gmail.com> wrote: > Dear all, > > I'm quite new to GMSH so, please, be patient. > I need to create a 3D mesh of a cube that include some inclusions > (spheres) of a different material. > > I could find the following script that generates a cube with 5 > cavities, but how can I mesh also the inclusions? In particular I need > two well separated meshes, one for the "cheese" the other for the > inclusions > > Thanks a lot for helping! > > Function CheeseHole > > // In the following commands we use the reserved variable name > // `newp', which automatically selects a new point number. This > // number is chosen as the highest current point number, plus > // one. (Note that, analogously to `newp', the variables `newc', > // `news', `newv' and `newreg' select the highest number amongst > // currently defined curves, surfaces, volumes and `any entities > // other than points', respectively.) > > p1 = newp; Point(p1) = {x, y, z, lcar3} ; > p2 = newp; Point(p2) = {x+r,y, z, lcar3} ; > p3 = newp; Point(p3) = {x, y+r,z, lcar3} ; > p4 = newp; Point(p4) = {x, y, z+r,lcar3} ; > p5 = newp; Point(p5) = {x-r,y, z, lcar3} ; > p6 = newp; Point(p6) = {x, y-r,z, lcar3} ; > p7 = newp; Point(p7) = {x, y, z-r,lcar3} ; > > c1 = newreg; Circle(c1) = {p2,p1,p7}; > c2 = newreg; Circle(c2) = {p7,p1,p5}; > c3 = newreg; Circle(c3) = {p5,p1,p4}; > c4 = newreg; Circle(c4) = {p4,p1,p2}; > c5 = newreg; Circle(c5) = {p2,p1,p3}; > c6 = newreg; Circle(c6) = {p3,p1,p5}; > c7 = newreg; Circle(c7) = {p5,p1,p6}; > c8 = newreg; Circle(c8) = {p6,p1,p2}; > c9 = newreg; Circle(c9) = {p7,p1,p3}; > c10 = newreg; Circle(c10) = {p3,p1,p4}; > c11 = newreg; Circle(c11) = {p4,p1,p6}; > c12 = newreg; Circle(c12) = {p6,p1,p7}; > > // We need non-plane surfaces to define the spherical holes. Here we > // use ruled surfaces, which can have 3 or 4 sides: > > l1 = newreg; Line Loop(l1) = {c5,c10,c4}; Ruled Surface(newreg) = > {l1}; > l2 = newreg; Line Loop(l2) = {c9,-c5,c1}; Ruled Surface(newreg) = > {l2}; > l3 = newreg; Line Loop(l3) = {c12,-c8,-c1}; Ruled Surface(newreg) = > {l3}; > l4 = newreg; Line Loop(l4) = {c8,-c4,c11}; Ruled Surface(newreg) = > {l4}; > l5 = newreg; Line Loop(l5) = {-c10,c6,c3}; Ruled Surface(newreg) = > {l5}; > l6 = newreg; Line Loop(l6) = {-c11,-c3,c7}; Ruled Surface(newreg) = > {l6}; > l7 = newreg; Line Loop(l7) = {-c2,-c7,-c12};Ruled Surface(newreg) = > {l7}; > l8 = newreg; Line Loop(l8) = {-c6,-c9,c2}; Ruled Surface(newreg) = > {l8}; > > // We then store the surface loops identification numbers in a list > // for later reference (we will need these to define the final > // volume): > > theloops[t] = newreg ; > > Surface Loop(theloops[t]) = {l8+1,l5+1,l1+1,l2+1,l3+1,l7+1,l6+1,l4+1}; > > thehole = newreg ; > Volume(thehole) = theloops[t] ; > > Return > > lcar3 = .055; > > hloc = 0.1; > Point(1) = {0, 0, 0, hloc}; > Point(2) = {1, 0, 0, hloc}; > Point(3) = {1, 1, 0, hloc}; > Point(4) = {0, 1, 0, hloc}; > > Point(5) = {0, 0, 1, hloc}; > Point(6) = {1, 0, 1, hloc}; > Point(7) = {1, 1, 1, hloc}; > Point(8) = {0, 1, 1, hloc}; > > Line(1) = {1,2}; > Line(2) = {2,3}; > Line(3) = {3,4}; > Line(4) = {4,1}; > > Line(5) = {5,6}; > Line(6) = {6,7}; > Line(7) = {7,8}; > Line(8) = {8,5}; > > Line(9) = {1,5}; > Line(10) = {2,6}; > Line(11) = {3,7}; > Line(12) = {4,8}; > > // bottom > Line Loop(21) = {-1,-4,-3,-2}; > Plane Surface(31) = {21} ; > > // top > Line Loop(22) = {5,6,7,8}; > Plane Surface(32) = {22} ; > > // left > Line Loop(23) = {1,10,-5,-9}; > Plane Surface(33) = {23} ; > > // right > Line Loop(24) = {12,-7,-11,3}; > Plane Surface(34) = {24} ; > > // front > Line Loop(25) = {2,11,-6,-10}; > Plane Surface(35) = {25} ; > > // back > Line Loop(26) = {9,-8,-12,4}; > Plane Surface(36) = {26} ; > > // We can use a `For' loop to generate five holes in the cube: > > x = 0 ; y = 0.75 ; z = 0 ; r = 0.09 ; > > For t In {1:5} > > x += 0.166 ; > z += 0.166 ; > > // We call the `CheeseHole' function: > > Call CheeseHole ; > > // We define a physical volume for each hole: > > Physical Volume (t) = thehole ; > > // We also print some variables on the terminal (note that, since > // all variables are treated internally as floating point numbers, > // the format string should only contain valid floating point format > // specifiers like `%g', `%f', '%e', etc.): > > Printf("Hole %g (center = {%g,%g,%g}, radius = %g) has number %g!", > t, x, y, z, r, thehole) ; > > EndFor > > theloops[0] = newreg ; > > > Surface Loop(theloops[0]) = {31,32,33,34,35,36}; > > Volume(100) = {theloops[]}; > > Physical Volume (10) = 100 ; > > _______________________________________________ > gmsh mailing list > gmsh@onelab.info > http://onelab.info/mailman/listinfo/gmsh >
_______________________________________________ gmsh mailing list gmsh@onelab.info http://onelab.info/mailman/listinfo/gmsh