[Gmsh] meshing trouble

David Colignon david.colignon at ulg.ac.be
Fri Feb 17 07:39:12 CET 2017


Hi,

When you define the "frame" volume, the disk/magnet must be defined as a hole inside the frame.

See http://gmsh.info/doc/texinfo/gmsh.html#t4_002egeo

Regards,

Dave

-- 
David Colignon, Ph.D.
1er logisticien de recherche
Université de Liège
ACE - Applied & Computational Electromagnetics
Sart-Tilman B28
10, Grande Traverse
4000 Liège - BELGIQUE
Tél: +32 (0)4 366 37 32
http://www.ulg.ac.be/nic4

On 17/02/17 02:36, 蓝颖杰 wrote:
> just to sum up:
> each single part can be meshed successfully,
> but as soon as you put all parts in one file,
> gmsh will report error of self intersection.
> could this be a bug?
> 
> 
>     -----Original Messages-----
>     *From:*"蓝颖杰" <ylan at phbs.pku.edu.cn>
>     *Sent Time:*2017-02-15 13:00:14 (Wednesday)
>     *To:* gmsh at geuz.org
>     *Cc:*
>     *Subject:* meshing trouble
> 
>     Hi,
> 
>     I have fought with this issue for a long time, but still can't resolve it, any help would be appreciated. I have solid objects in the air
>     (with spherical out surface) that needed to be excluded. Unfortunately the solid objects (a frame and two magnets) touch each other. So I
>     made a surface loop to include all the solids to define the air body. Gmsh can't mesh the model, complaining about intersecting surfaces. If
>     you delete the frame (see code comment on how to delete), everything else being the same, Gmsh can mesh it without any problems.
> 
>     Very strange!
> 
>     Regards,
>     Yingjie
> 
>     =====================Code starts from here (also in attachment)========================
> 
>     // define geometry-specific parameters
>     mm = 1.e-3;
>     gap = 1*mm; //Magnet-Magnet gap [m], gap > 0
> 
>     DefineConstant[
>        cub = {50*mm, Name "Parameters/1Magnet bottom size [m]"}
>        hite = {10*mm, Name "Parameters/2Magnet hieght [m]"}
>        fdep = {60*mm, Name "Parameters/3Frame depth [m]"}
>        inf = {100*mm, Name "Parameters/4Air box distance [m]"}
>        lc1 = {TotalMemory <= 2048 ? 30*mm : 10*mm, Name "Parameters/5Mesh size on magnets [m]"}
>        lc2 = {TotalMemory <= 2048 ? 90*mm : 20*mm, Name "Parameters/6Mesh size at infinity [m]"}
>     ];
> 
>     // change global Gmsh options
>     Mesh.Optimize = 1; // optimize quality of tetrahedra
>     Mesh.VolumeEdges = 0; // hide volume edges
>     Geometry.ExactExtrusion = 0; // to allow rotation of extruded shapes
>     Solver.AutoMesh = 2; // always remesh if necessary (don't reuse mesh on disk)
> 
>     //parameters used by this macro
>     // cx, cy, cz: center of sphere
>     // rad: radius of sphere
>     // slc: mesh size
> 
>     Macro MakeCircleZ //facing z direction
>        cp = newp; Point(cp) = {cx, cy, cz, slc}; //center
>        dd[] = {rad, 0, -rad, 0};
>        For i In {0:3}
>          spoint[i] = newp;
>     Point(spoint[i]) = {cx+dd[i], cy+dd[3-i], cz, slc};
>     If (i>0)
>        quarc[i-1] = newreg; //quarter arcs
>        Circle(quarc[i-1]) = {spoint[i-1], cp, spoint[i]};
>     EndIf
>        EndFor
>        //closing arc
>        quarc[3] = newreg; Circle(quarc[3]) = {spoint[3], cp, spoint[0]};
>        zloop = newreg; Line Loop(zloop) = {quarc[]};
>        zcircle = newreg; Plane Surface(zcircle) = {zloop};
>     Return
> 
>     cx = 0; cy=0; cz = -gap-hite;
>     rad = cub; slc = lc1;
>     Call MakeCircleZ;
>     mag1[] = Extrude {0, 0, hite} { Surface{zcircle}; };
>     jfl1 = zloop; //joint face loop 1
> 
>     cx = 0; cy=0; cz = gap+hite;
>     rad = cub; slc = lc1;
>     Call MakeCircleZ;
>     mag2[] = Extrude {0, 0, -hite} { Surface{zcircle}; };
>     jfl2 = zloop; //joint face 2
> 
>     //Delete {Volume{mag1[1]};}
>     //Delete {Volume{mag2[1]};}
>     Physical Volume("Magnets") = {mag1[1], mag2[1]};
> 
>     //create steel frame around the magnet
>     p1 = newp; Point(p1) = {-2*cub, -fdep, -hite-gap, lc1};
>     p2 = newp; Point(p2) = { 2*cub, -fdep, -hite-gap, lc1};
>     p3 = newp; Point(p3) = { 2*cub, -fdep,  hite+gap, lc1};
>     p4 = newp; Point(p4) = {-2*cub, -fdep,  hite+gap, lc1};
>     l1 = newl; Line(l1) = {p1,p2}; l2 = newl; Line(l2) = {p2,p3};
>     l3 = newl; Line(l3) = {p3,p4}; l4 = newl; Line(l4) = {p4,p1};
> 
>     q1 = newp; Point(q1) = {-2*cub, fdep, -hite-gap, lc1};
>     q2 = newp; Point(q2) = { 2*cub, fdep, -hite-gap, lc1};
>     q3 = newp; Point(q3) = { 2*cub, fdep,  hite+gap, lc1};
>     q4 = newp; Point(q4) = {-2*cub, fdep,  hite+gap, lc1};
>     e1 = newl; Line(e1) = {q1,q2}; e2 = newl; Line(e2) = {q2,q3};
>     e3 = newl; Line(e3) = {q3,q4}; e4 = newl; Line(e4) = {q4,q1};
> 
>     d1 = newl; Line(d1) = {p1,q1}; d2 = newl; Line(d2) = {p2,q2};
>     d3 = newl; Line(d3) = {p3,q3}; d4 = newl; Line(d4) = {p4,q4};
> 
>     ll1 = newll; Line Loop(ll1) = {l1,l2,l3,l4};
> 
>     lex1 = newll; Line Loop(lex1) = {l1, d2, -e1, -d1};
>     fex1 = news; Plane Surface(fex1) = {lex1};
>     hof1 = news; Plane Surface(hof1) = {lex1, jfl1}; //holed face 1
> 
>     lex2 = newll; Line Loop(lex2) = {l2, d3, -e2, -d2};
>     fex2 = news; Plane Surface(fex2) = {lex2};
> 
>     lex3 = newll; Line Loop(lex3) = {l3, d4, -e3, -d3};
>     fex3 = news; Plane Surface(fex3) = {lex3};
>     hof2 = news; Plane Surface(hof2) = {lex3, jfl2}; //holed face 2
> 
>     lex4 = newll; Line Loop(lex4) = {l4, d1, -e4, -d4};
>     fex4 = news; Plane Surface(fex4) = {lex4};
> 
>     ll1d = newll; Line Loop(ll1d) = {e1,e2,e3,e4};
> 
>     hite2 = hite + gap + 1.5*cub;
>     p1 = newp; Point(p1) = {-3.5*cub, -fdep, -hite2, lc1};
>     p2 = newp; Point(p2) = { 3.5*cub, -fdep, -hite2, lc1};
>     p3 = newp; Point(p3) = { 3.5*cub, -fdep,  hite2, lc1};
>     p4 = newp; Point(p4) = {-3.5*cub, -fdep,  hite2, lc1};
>     l1 = newl; Line(l1) = {p1,p2}; l2 = newl; Line(l2) = {p2,p3};
>     l3 = newl; Line(l3) = {p3,p4}; l4 = newl; Line(l4) = {p4,p1};
> 
>     q1 = newp; Point(q1) = {-3.5*cub, fdep, -hite2, lc1};
>     q2 = newp; Point(q2) = { 3.5*cub, fdep, -hite2, lc1};
>     q3 = newp; Point(q3) = { 3.5*cub, fdep,  hite2, lc1};
>     q4 = newp; Point(q4) = {-3.5*cub, fdep,  hite2, lc1};
>     e1 = newl; Line(e1) = {q1,q2}; e2 = newl; Line(e2) = {q2,q3};
>     e3 = newl; Line(e3) = {q3,q4}; e4 = newl; Line(e4) = {q4,q1};
> 
>     d1 = newl; Line(d1) = {p1,q1}; d2 = newl; Line(d2) = {p2,q2};
>     d3 = newl; Line(d3) = {p3,q3}; d4 = newl; Line(d4) = {p4,q4};
> 
>     ll2 = newll; Line Loop(ll2) = {l1,l2,l3,l4};
> 
>     let1 = newll; Line Loop(let1) = {l1, d2, -e1, -d1};
>     fet1 = news; Plane Surface(fet1) = {let1};
> 
>     let2 = newll; Line Loop(let2) = {l2, d3, -e2, -d2};
>     fet2 = news; Plane Surface(fet2) = {let2};
> 
>     let3 = newll; Line Loop(let3) = {l3, d4, -e3, -d3};
>     fet3 = news; Plane Surface(fet3) = {let3};
> 
>     let4 = newll; Line Loop(let4) = {l4, d1, -e4, -d4};
>     fet4 = news; Plane Surface(fet4) = {let4};
> 
>     ll2d = newll; Line Loop(ll2d) = {e1,e2,e3,e4};
> 
>     s1 = news; Plane Surface(s1) = {ll2, ll1};
>     s1d = news; Plane Surface(s1d) = {ll2d, ll1d};
> 
>     //the frame, comment out the next five lines to delete it
>     slframe = newsl;
>     Surface Loop(slframe)={ s1, fex1, fex2, fex3, fex4,
>                              s1d, fet1, fet2, fet3, fet4};
>     frame = newv; Volume(frame) = {slframe};
>     Physical Volume("Frame") = {frame};
> 
>     //now create the surface enclosing both mags and the frame
>     solids = newsl;
>     Surface Loop(solids) = { s1d, fet1, fet2, fet3, fet4, s1,
>          hof1, mag1[2], mag1[3], mag1[4], mag1[5], mag1[0], fex2,
>          hof2, mag2[2], mag2[3], mag2[4], mag2[5], mag2[0], fex4};
> 
>     //parameters used by this macro
>     // cx, cy, cz: center of sphere
>     // rad: radius of sphere
>     // slc: mesh size of sphere
> 
>     Macro MakeSphereSurface
>        cp = newp; Point(cp) = {cx, cy, cz, slc}; //center
>        np = newp; Point(np) = {cx, cy, cz+rad, slc}; //north
>        sp = newp; Point(sp) = {cx, cy, cz-rad, slc}; //south
>        dd[] = {rad, 0, -rad, 0};
>        For i In {0:3}
>          ap = newp;  pe[i] = ap; //points on the equator
>     Point(ap) = {cx+dd[i], cy+dd[3-i], cz, slc};
>     na[i] = newreg; Circle(na[i]) = {ap, cp, np}; //north arc
>     sa[i] = newreg; Circle(sa[i]) = {ap, cp, sp}; //south arc
>     If (i>0)
>        eq[i-1] = newreg; //equator
>        Circle(eq[i-1]) = {pe[i-1], cp, ap};
>     EndIf
>        EndFor
>        //closing arc of the equator
>        eq[3] = newreg; Circle(eq[3]) = {ap, cp, pe[0]};
>        //now the non-plane surfaces: sloop[]
>        For i In {0:3}
>          lloop = newreg; Line Loop(lloop)={eq[i], -na[i], na[(i+1)%4]};
>     sloop[2*i] = newreg; Ruled Surface(sloop[2*i]) = {lloop};
>          lloop = newreg; Line Loop(lloop)={eq[i], -sa[i], sa[(i+1)%4]};
>          sloop[2*i+1] = newreg; Ruled Surface(sloop[2*i+1]) = {lloop};
>        EndFor
>        thesurf = newreg;
>        Surface Loop(thesurf) = {sloop[]};
>     Return
> 
>     // create air box around magnets
>     BoundingBox; // recompute model bounding box
>     cx = (General.MinX + General.MaxX) / 2;
>     cy = (General.MinY + General.MaxY) / 2;
>     cz = (General.MinZ + General.MaxZ) / 2;
>     lx = 2*inf + General.MaxX - General.MinX;
>     ly = 2*inf + General.MaxY - General.MinZ;
>     lz = 2*inf + General.MaxZ - General.MinZ;
>     rad = (lx + ly + lz)/3;
>     slc = lc2;
> 
>     Call MakeSphereSurface ;
> 
>     vair = newv; Volume(vair) = {thesurf, solids};
>     Physical Volume("Air") = {vair}; // air
>     Physical Surface("Infty") = sloop[];
> 
>     // adjust value here for correct merge result
>     //Geometry.Tolerance = 1e-6;
>     //Coherence Mesh;
> 
> 
> 
> _______________________________________________
> gmsh mailing list
> gmsh at onelab.info
> http://onelab.info/mailman/listinfo/gmsh
> 



More information about the gmsh mailing list