[Gmsh] "Perfect Match Failed" Problem with Blossom

Johannes Reinhardt johannes.reinhardt at unifr.ch
Wed Mar 13 13:32:42 CET 2013


Hello everybody,

first I want to thank everybody involved in the development of gmsh. It 
is a really great tool and has helped me a lot in my research.

However I run into a probem when I try to create a 2D quad mesh with the 
outline of two superimposed disks embedded. However Blossom almost 
always fails with the message:

Warning : Perfect Match Failed in Quadrangulation, Applying Graph Splits

printed 10 times. I attached a simple geometry file that shows this 
problem.

For small distances (e.g. dist=2.1) this problem does not occur, but for 
larger distances (and these are the ones that I want to study), I always 
get this error.

For other geometries where I had this problem, playing a bit with the 
mesh element sizes helped, but I could not find good numbers for this 
case. I also tried both DelQuad and MeshAdapt as Meshing Algorithms, but 
I always get the error above.

I briefly looked at the Blossom Quad publication, but could not find any 
explanation for this behaviour. My best guess is, that the embedded 
curve conflicts with a perfect matching, and the extra edges mechanism 
fails in this case.

I tested both gmsh 2.6.1 compiled from source and the precompiled gmsh 
2.7.0 Linux 64bit binary on Ubuntu 11.10, both show the same behaviour.

Has anybody an idea how to reformulate the geometry description to avoid 
this problem?

Thanks in advance and greetings

Johannes
-------------- next part --------------
dist = 2.1;
r_disk = 2;

tip_dist = Sqrt(r_disk*r_disk - dist*dist/4);

width_outer = 10;
height_outer = 10;

size_outer = 8e-1;
size_outline = 5e-1;
size_tip = 1e-1;

Mesh.RecombinationAlgorithm = 1; //Blossom
Mesh.Algorithm=1; //MeshAdapt

//centers of disks
Point(2) = {-dist/2,0,0,size_outline};
Point(3) = {+dist/2,0,0,size_outline};

//outer corners
Point(4) = {+width_outer,+height_outer,0,size_outer};
Point(5) = {+width_outer,-height_outer,0,size_outer};
Point(6) = {-width_outer,-height_outer,0,size_outer};
Point(7) = {-width_outer,+height_outer,0,size_outer};

//outline left
Point(8) = {-dist/2,+r_disk,0,size_outline};
Point(9) = {-dist/2-r_disk,0,0,size_outline};
Point(10) = {-dist/2,-r_disk,0,size_outline};

//outline right
Point(11) = {+dist/2,-r_disk,0,size_outline};
Point(12) = {+dist/2+r_disk,0,0,size_outline};
Point(13) = {+dist/2,+r_disk,0,size_outline};

//tip
Point(14) = {0,+tip_dist,0,size_tip};
Point(15) = {0,-tip_dist,0,size_tip};

//Box
Line(1) = {4,5};
Line(2) = {5,6};
Line(3) = {6,7};
Line(4) = {7,4};
Line Loop(5) = {1,2,3,4};

//contact line
Circle(6) = {8,2,9};
Circle(7) = {9,2,10};
Circle(8) = {10,2,15};
Circle(9) = {15,3,11};
Circle(10) = {11,3,12};
Circle(11) = {12,3,13};
Circle(12) = {13,3,14};
Circle(13) = {14,2,8};

Plane Surface(1) = {5};
Recombine Surface {1};

//outline
Line {6,7,8,9,10,11,12,13} In Surface {1};

Physical Surface(2) = {1};