[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