diff --git a/benchmarks/3d/choi.geo b/benchmarks/3d/choi.geo
new file mode 100644
index 0000000000000000000000000000000000000000..5b78a0190d380c02b905ebb5931b39fc39a3fb6f
--- /dev/null
+++ b/benchmarks/3d/choi.geo
@@ -0,0 +1,1069 @@
+// surfaces to hide to make a nice pict:
+// 1314 1214 277 1174 1085
+
+dmax = 3.75 ;
+dmin = 3.0;
+emin = 1.425 ;
+mc = 2.25 ;
+fc = 2.25 ;
+gap = 12.0 ;
+
+
+/* #d1 */
+
+Point(1) = {8,-8-gap,0.0,emin};
+Point(2) = {0.0,-8-gap,8,emin};
+Point(3) = {-8,-8-gap,0.0,emin};
+Point(4) = {0.0,-8-gap,-8,emin};
+Point(5) = {0.0,-8-gap,0.0,emin};
+
+Circle(1) = {1,5,2};
+Circle(2) = {2,5,3};
+Circle(3) = {3,5,4};
+Circle(4) = {4,5,1};
+
+Point(6) = {8,-12-gap,0.0,emin};
+Point(7) = {0.0,-12-gap,8.0,emin};
+Point(8) = {-8,-12-gap,0.0,emin};
+Point(9) = {0.0,-12-gap,-8.0,emin};
+Point(10) = {0.0,-12-gap,0.0,emin};
+
+Circle(5) = {6,10,7};
+Circle(6) = {7,10,8};
+Circle(7) = {8,10,9};
+Circle(8) = {9,10,6};
+
+Line(9) = {1,6} ;
+Line(10) = {2,7} ;
+Line(11) = {3,8} ;
+Line(12) = {4,9} ;
+
+Line Loop(13) = {10,-5,-9,1};
+Ruled Surface(14) = {13};
+Line Loop(15) = {11,-6,-10,2};
+Ruled Surface(16) = {15};
+Line Loop(17) = {-12,-3,11,7};
+Ruled Surface(18) = {17};
+Line Loop(19) = {9,-8,-12,4};
+Ruled Surface(20) = {19};
+
+/* center */
+
+Point(21) = {24,-12-gap,0.0,dmin};
+Point(22) = {0.0,-12-gap,24.0,dmin};
+Point(23) = {-24,-12-gap,0.0,dmin};
+Point(24) = {0.0,-12-gap,-24.0,dmin};
+
+/* #d6 */
+
+Point(36) = {27,-12-gap,0.0,dmin};
+Point(37) = {0.0,-12-gap,27.0,dmin};
+Point(38) = {-27,-12-gap,0.0,dmin};
+Point(39) = {0.0,-12-gap,-27.0,dmin};
+
+Circle(76) = {36,10,37};
+Circle(77) = {37,10,38};
+Circle(78) = {38,10,39};
+Circle(79) = {39,10,36};
+
+Line Loop(84) = {76,77,78,79};
+Line Loop(85) = {5,6,7,8};
+Plane Surface(86) = {84,85};
+
+/* #d7 */
+
+Point(41) = {24,-15-gap,0.0,dmin};
+Point(42) = {0.0,-15-gap,24.0,dmin};
+Point(43) = {-24,-15-gap,0.0,dmin};
+Point(44) = {0.0,-15-gap,-24.0,dmin};
+Point(45) = {0.0,-15-gap,0.0,dmin};
+
+Circle(92) = {41,45,42};
+Circle(93) = {42,45,43};
+Circle(94) = {43,45,44};
+Circle(95) = {44,45,41};
+
+
+Circle(96) = {41,21,36};
+Circle(97) = {42,22,37};
+Circle(98) = {38,23,43};
+Circle(99) = {44,24,39};
+
+Line Loop(104) = {-97,-92,96,76};
+Ruled Surface(105) = {104};
+Line Loop(106) = {98,-93,97,77};
+Ruled Surface(107) = {106};
+Line Loop(108) = {-99,-94,-98,78};
+Ruled Surface(109) = {108};
+Line Loop(110) = {-96,-95,99,79};
+Ruled Surface(111) = {110};
+
+/* #d8 */
+
+Point(46) = {13,-15-gap,0.0,emin};
+Point(47) = {0.0,-15-gap,13,emin};
+Point(48) = {-13,-15-gap,0.0,emin};
+Point(49) = {0.0,-15-gap,-13.0,emin};
+
+Circle(112) = {46,45,47};
+Circle(113) = {47,45,48};
+Circle(114) = {48,45,49};
+Circle(115) = {49,45,46};
+
+Line Loop(116) = {92,93,94,95};
+Line Loop(117) = {112,113,114,115};
+Plane Surface(118) = {116,117};
+
+/* #d9 */
+
+Point(51) = {13,-47.2-gap,0.0,emin};
+Point(52) = {0.0,-47.2-gap,13.0,emin};
+Point(53) = {-13,-47.2-gap,0.0,emin};
+Point(54) = {0.0,-47.2-gap,-13.0,emin};
+Point(55) = {0.0,-47.2-gap,0.0,emin};
+
+Circle(119) = {51,55,52};
+Circle(120) = {52,55,53};
+Circle(121) = {53,55,54};
+Circle(122) = {54,55,51};
+
+Line(123) = {51,46} ;
+Line(124) = {52,47} ;
+Line(125) = {53,48} ;
+Line(126) = {54,49} ;
+
+Line Loop(127) = {-114,-125,121,126};
+Ruled Surface(128) = {127};
+Line Loop(129) = {-115,-126,122,123};
+Ruled Surface(130) = {129};
+Line Loop(131) = {-112,-123,119,124};
+Ruled Surface(132) = {131};
+Line Loop(133) = {-113,-124,120,125};
+Ruled Surface(134) = {133};
+
+
+/* #d10 */
+
+Point(56) = {28.5,-47.2-gap,0.0,dmin};
+Point(57) = {0.0,-47.2-gap,28.5,dmin};
+Point(58) = {-28.5,-47.2-gap,0.0,dmin};
+Point(59) = {0.0,-47.2-gap,-28.5,dmin};
+
+Circle(135) = {56,55,57};
+Circle(136) = {57,55,58};
+Circle(137) = {58,55,59};
+Circle(138) = {59,55,56};
+
+Line Loop(139) = {135,136,137,138};
+Line Loop(140) = {119,120,121,122};
+Plane Surface(141) = {139,140};
+
+/* #d11 */
+
+Point(61) = {33.5,-52.2-gap,0.0,dmin};
+Point(62) = {0.0,-52.2-gap,33.5,dmin};
+Point(63) = {-33.5,-52.2-gap,0.0,dmin};
+Point(64) = {0.0,-52.2-gap,-33.5,dmin};
+Point(65) = {0.0,-52.2-gap,0.0,dmin};
+
+Circle(142) = {61,65,62};
+Circle(143) = {62,65,63};
+Circle(144) = {63,65,64};
+Circle(145) = {64,65,61};
+
+Point(66) = {28.5,-52.2-gap,0.0,dmin};
+Point(67) = {0.0,-52.2-gap,28.5,dmin};
+Point(68) = {-28.5,-52.2-gap,0.0,dmin};
+Point(69) = {0.0,-52.2-gap,-28.5,dmin};
+
+Circle(146) = {61,66,56};
+Circle(147) = {62,67,57};
+Circle(148) = {58,68,63};
+Circle(149) = {64,69,59};
+
+Line Loop(150) = {-147,-142,146,135};
+Ruled Surface(151) = {150};
+Line Loop(152) = {148,-143,147,136};
+Ruled Surface(153) = {152};
+Line Loop(154) = {-149,-144,-148,137};
+Ruled Surface(155) = {154};
+Line Loop(156) = {146,-138,-149,145};
+Ruled Surface(157) = {156};
+
+/* #d12 */
+
+Point(71) = {33.5,-67.2-gap,0.0,dmin};
+Point(72) = {0.0,-67.2-gap,33.5,dmin};
+Point(73) = {-33.5,-67.2-gap,0.0,dmin};
+Point(74) = {0.0,-67.2-gap,-33.5,dmin};
+Point(75) = {0.0,-67.2-gap,0.0,dmin};
+
+Circle(158) = {71,75,72};
+Circle(159) = {72,75,73};
+Circle(160) = {73,75,74};
+Circle(161) = {74,75,71};
+
+Line(162) = {61,71};
+Line(163) = {62,72};
+Line(164) = {63,73};
+Line(165) = {64,74};
+
+Line Loop(166) = {163,-158,-162,142};
+Ruled Surface(167) = {166};
+Line Loop(168) = {164,-159,-163,143};
+Ruled Surface(169) = {168};
+Line Loop(170) = {165,-160,-164,144};
+Ruled Surface(171) = {170};
+Line Loop(172) = {162,-161,-165,145};
+Ruled Surface(173) = {172};
+
+/* #d13 */
+
+Point(76) = {27,-67.2-gap,0.0,dmin};
+Point(77) = {0.0,-67.2-gap,27,dmin};
+Point(78) = {-27,-67.2-gap,0.0,dmin};
+Point(79) = {0.0,-67.2-gap,-27,dmin};
+
+Circle(174) = {76,75,77};
+Circle(175) = {77,75,78};
+Circle(176) = {78,75,79};
+Circle(177) = {79,75,76};
+
+Line Loop(178) = {158,159,160,161};
+Line Loop(179) = {174,175,176,177};
+Plane Surface(180) = {178,179};
+
+/* #d14 */
+
+Point(96) = {27,-102.2,0.0,dmin};
+Point(97) = {0.0,-102.2,27.0,dmin};
+Point(98) = {-27,-102.2,0.0,dmin};
+Point(99) = {0.0,-102.2,-27.0,dmin};
+Point(100) = {0.0,-102.2,0.0,dmin};
+
+Circle(220) = {96,100,97};
+Circle(221) = {97,100,98};
+Circle(222) = {98,100,99};
+Circle(223) = {99,100,96};
+
+Line(224) = {76,96} ;
+Line(225) = {77,97} ;
+Line(226) = {78,98} ;
+Line(227) = {79,99} ;
+
+Line Loop(228) = {223,-224,-177,227};
+Ruled Surface(229) = {228};
+Line Loop(230) = {220,-225,-174,224};
+Ruled Surface(231) = {230};
+Line Loop(232) = {221,-226,-175,225};
+Ruled Surface(233) = {232};
+Line Loop(234) = {222,-227,-176,226};
+Ruled Surface(235) = {234};
+
+/* #d18 */
+
+Point(101) = {41,-102.2,0.0,dmax};
+Point(102) = {0.0,-102.2,41.0,dmax};
+Point(103) = {-41,-102.2,0.0,dmax};
+Point(104) = {0.0,-102.2,-41.0,dmax};
+
+Circle(236) = {101,100,102};
+Circle(237) = {102,100,103};
+Circle(238) = {103,100,104};
+Circle(239) = {104,100,101};
+
+Line Loop(240) = {236,237,238,239};
+Line Loop(241) = {220,221,222,223};
+Plane Surface(242) = {240,241};
+
+/* #d19 */
+
+Point(106) = {41,-87.2,0.0,dmax};
+Point(107) = {0.0,-87.2,41.0,dmax};
+Point(108) = {-41,-87.2,0.0,dmax};
+Point(109) = {0.0,-87.2,-41.0,dmax};
+Point(110) = {0.0,-87.2,0.0,dmax};
+
+Circle(243) = {106,110,107};
+Circle(244) = {107,110,108};
+Circle(245) = {108,110,109};
+Circle(246) = {109,110,106};
+
+Line(247) = {101,106} ;
+Line(248) = {102,107} ;
+Line(249) = {103,108} ;
+Line(250) = {104,109} ;
+
+Line Loop(251) = {-248,-236,247,243};
+Ruled Surface(252) = {251};
+Line Loop(253) = {-249,-237,248,244};
+Ruled Surface(254) = {253};
+Line Loop(255) = {-250,-238,249,245};
+Ruled Surface(256) = {255};
+Line Loop(257) = {-247,-239,250,246};
+Ruled Surface(258) = {257};
+
+/* for ins*/
+Line Loop(263) = {243,244,245,246};
+
+/* #d21 */
+
+Point(116) = {41,50,0.0,dmax};
+Point(117) = {0.0,50,41.0,dmax};
+Point(118) = {-41,50,0.0,dmax};
+Point(119) = {0.0,50,-41.0,dmax};
+Point(120) = {0.0,50,0.0,dmax};
+
+Circle(266) = {116,120,117};
+Circle(267) = {117,120,118};
+Circle(268) = {118,120,119};
+Circle(269) = {119,120,116};
+
+Line(270) = {106,116} ;
+Line(271) = {107,117} ;
+Line(272) = {108,118} ;
+Line(273) = {109,119} ;
+
+Line Loop(274) = {-271,-243,270,266};
+Ruled Surface(275) = {274};
+Line Loop(276) = {-272,-244,271,267};
+Ruled Surface(277) = {276};
+Line Loop(278) = {-273,-245,272,268};
+Ruled Surface(279) = {278};
+Line Loop(280) = {-270,-246,273,269};
+Ruled Surface(281) = {280};
+
+/* for ins*/
+Line Loop(286) = {266,267,268,269} ;
+
+/* #d23 */
+
+Point(126) = {41,65,0.0,dmax};
+Point(127) = {0.0,65,41.0,dmax};
+Point(128) = {-41,65,0.0,dmax};
+Point(129) = {0.0,65,-41.0,dmax};
+Point(130) = {0.0,65,0.0,dmax} ;
+
+Circle(289) = {126,130,127};
+Circle(290) = {127,130,128};
+Circle(291) = {128,130,129};
+Circle(292) = {129,130,126};
+
+Line(293) = {116,126} ;
+Line(294) = {117,127} ;
+Line(295) = {118,128} ;
+Line(296) = {119,129} ;
+
+Line Loop(297) = {289,-294,-266,293};
+Ruled Surface(298) = {297};
+Line Loop(299) = {295,-290,-294,267};
+Ruled Surface(300) = {299};
+Line Loop(301) = {291,-296,-268,295};
+Ruled Surface(302) = {301};
+Line Loop(303) = {292,-293,-269,296};
+Ruled Surface(304) = {303};
+
+/* #d24 */
+
+Point(131) = {35,65,0.0,dmin};
+Point(132) = {0.0,65,35.0,dmin};
+Point(133) = {-35,65,0.0,dmin};
+Point(134) = {0.0,65,-35.0,dmin};
+
+Circle(305) = {131,130,132};
+Circle(306) = {132,130,133};
+Circle(307) = {133,130,134};
+Circle(308) = {134,130,131};
+
+Line Loop(309) = {289,290,291,292};
+Line Loop(310) = {305,306,307,308};
+Plane Surface(311) = {309,310};
+
+/* #d25 */
+Point(136) = {35,43,0.0,dmin};
+Point(137) = {0.0,43,35.0,dmin};
+Point(138) = {-35,43,0.0,dmin};
+Point(139) = {0.0,43,-35.0,dmin};
+Point(140) = {0.0,43,0.0,dmin};
+
+Circle(312) = {136,140,137};
+Circle(313) = {137,140,138};
+Circle(314) = {138,140,139};
+Circle(315) = {139,140,136};
+
+Line(316) = {131,136} ;
+Line(317) = {132,137} ;
+Line(318) = {133,138} ;
+Line(319) = {134,139} ;
+
+Line Loop(320) = {315,-316,-308,319};
+Ruled Surface(321) = {320};
+Line Loop(322) = {312,-317,-305,316};
+Ruled Surface(323) = {322};
+Line Loop(324) = {313,-318,-306,317};
+Ruled Surface(325) = {324};
+Line Loop(326) = {314,-319,-307,318};
+Ruled Surface(327) = {326};
+
+/* #d26 */
+
+Point(141) = {32,40,0.0,dmin};
+Point(142) = {0.0,40,32.0,dmin};
+Point(143) = {-32,40,0.0,dmin};
+Point(144) = {0.0,40,-32.0,dmin};
+Point(145) = {0.0,40,0.0,dmin};
+
+Circle(328) = {141,145,142};
+Circle(329) = {142,145,143};
+Circle(330) = {143,145,144};
+Circle(331) = {144,145,141};
+
+Point(146) = {32,43,0.0,dmin};
+Point(147) = {0.0,43,32.0,dmin};
+Point(148) = {-32,43,0.0,dmin};
+Point(149) = {0.0,43,-32.0,dmin};
+
+Circle(332) = {141,146,136};
+Circle(333) = {142,147,137};
+Circle(334) = {138,148,143};
+Circle(335) = {144,149,139};
+
+Line Loop(336) = {-333,-328,332,312};
+Ruled Surface(337) = {336};
+Line Loop(338) = {334,-329,333,313};
+Ruled Surface(339) = {338};
+Line Loop(340) = {-335,-330,-334,314};
+Ruled Surface(341) = {340};
+Line Loop(342) = {-332,-331,335,315};
+Ruled Surface(343) = {342};
+
+
+/* #2 */
+
+Point(211) = {18,40.0,0.0,emin} ;
+Point(212) = {0.0,40.0,18,emin};
+Point(213) = {-18,40.0,0.0,emin};
+Point(214) = {0.0,40.0,-18,emin};
+
+Circle(521) = {211,145,212};
+Circle(522) = {212,145,213};
+Circle(523) = {213,145,214};
+Circle(524) = {214,145,211};
+
+Line Loop(525) = {328,329,330,331};
+Line Loop(526) = {521,522,523,524};
+Plane Surface(527) = {525,526};
+
+/* #3 */
+
+Point(221) = {18,15,0.0,emin};
+Point(222) = {0.0,15,18,emin};
+Point(223) = {-18,15,0.0,emin};
+Point(224) = {0.0,15,-18,emin};
+Point(225) = {0.0,15,0.0,emin};
+
+Circle(537) = {221,225,222};
+Circle(538) = {222,225,223};
+Circle(539) = {223,225,224};
+Circle(540) = {224,225,221};
+
+Line(541) = {211,221};
+Line(542) = {212,222};
+Line(543) = {213,223};
+Line(544) = {214,224};
+
+Line Loop(545) = {537,-542,-521,541};
+Ruled Surface(546) = {545};
+Line Loop(547) = {538,-543,-522,542};
+Ruled Surface(548) = {547};
+Line Loop(549) = {539,-544,-523,543};
+Ruled Surface(550) = {549};
+Line Loop(551) = {540,-541,-524,544};
+Ruled Surface(552) = {551};
+
+/* #5 */
+
+Point(236) = {24,15,0.0,dmin};
+Point(237) = {0.0,15,24,dmin};
+Point(238) = {-24,15,0.0,dmin};
+Point(239) = {0.0,15,-24,dmin};
+
+Circle(569) = {236,225,237};
+Circle(570) = {237,225,238};
+Circle(571) = {238,225,239};
+Circle(572) = {239,225,236};
+
+Line Loop(573) = {569,570,571,572};
+Line Loop(574) = {537,538,539,540};
+Plane Surface(575) = {573,574};
+
+/* #6 */
+
+Point(241) = {27,12,0.0,dmin};
+Point(242) = {0.0,12,27,dmin};
+Point(243) = {-27,12,0.0,dmin};
+Point(244) = {0.0,12,-27,dmin};
+Point(245) = {0.0,12,0.0,dmin};
+
+Circle(585) = {241,245,242};
+Circle(586) = {242,245,243};
+Circle(587) = {243,245,244};
+Circle(588) = {244,245,241};
+
+Point(246) = {24,12,0.0,dmin};
+Point(247) = {0.0,12,24,dmin};
+Point(248) = {-24,12,0.0,dmin};
+Point(249) = {0.0,12,-24,dmin};
+
+Circle(589) = {241,246,236};
+Circle(590) = {237,247,242};
+Circle(591) = {238,248,243};
+Circle(592) = {239,249,244};
+
+Line Loop(593) = {590,-585,589,569};
+Ruled Surface(594) = {593};
+Line Loop(595) = {591,-586,-590,570};
+Ruled Surface(596) = {595};
+Line Loop(597) = {592,-587,-591,571};
+Ruled Surface(598) = {597};
+Line Loop(599) = {-589,-588,-592,572};
+Ruled Surface(600) = {599};
+
+/* #11  */
+
+Point(271) = {8,12,0.0,emin};
+Point(272) = {0.0,12,8,emin};
+Point(273) = {-8,12,0.0,emin};
+Point(274) = {0.0,12,-8,emin};
+
+Circle(665) = {271,245,272};
+Circle(666) = {272,245,273};
+Circle(667) = {273,245,274};
+Circle(668) = {274,245,271};
+
+Line Loop(669) = {585,586,587,588};
+Line Loop(670) = {665,666,667,668};
+Plane Surface(671) = {669,670};
+
+/* #12	*/
+
+Point(276) = {8,8,0.0,emin};
+Point(277) = {0.0,8,8,emin};
+Point(278) = {-8,8,0.0,emin};
+Point(279) = {0.0,8,-8,emin};
+Point(280) = {0.0,8,0.0,emin};
+
+Circle(681) = {276,280,277};
+Circle(682) = {277,280,278};
+Circle(683) = {278,280,279};
+Circle(684) = {279,280,276};
+
+Line(686) = {276,271} ;
+Line(687) = {277,272} ;
+Line(688) = {278,273} ;
+Line(689) = {279,274} ;
+
+
+Line Loop(690) = {-686,-684,689,668};
+Ruled Surface(691) = {690};
+Line Loop(692) = {-687,-681,686,665};
+Ruled Surface(693) = {692};
+Line Loop(694) = {-688,-682,687,666};
+Ruled Surface(695) = {694};
+Line Loop(696) = {-689,-683,688,667};
+Ruled Surface(697) = {696};
+
+/////////////////////////////////////////////////////////////////////////////////////
+/////////////////////////////////////////////////////////////////////////////////////
+
+
+
+/************* MAIN CONTACT ***********/
+
+/*c1*/
+
+Point(381) = {14.78,8,0.0,mc};
+Point(382) = {17.20,8,4.69,mc};
+Point(383) = {18.18,8,9.88,mc};
+Point(384) = {17.62,8,15.13,mc};
+Point(385) = {15.57,8,20.0,mc};
+Point(386) = {12.21,8,24.08,mc};
+Point(387) = {7.48,8,25.94,mc};
+Point(388) = {2.48,8,26.89,mc};
+Point(389) = {-2.6,8,26.87,mc};
+Point(390) = {-6.34,8,25.06,mc};
+Point(391) = {-5.17,8,23.00,mc};
+Point(392) = {-0.31,8,21.90,mc};
+
+Rotate{{0.0,1.0,0.0},{0.0,0.0,0.0},3.14159/2} {
+  Duplicata { 
+    Point{381}; Point{382}; Point{383}; Point{384}; Point{385}; 
+    Point{386}; Point{387}; Point{388}; Point{389}; Point{390}; 
+    Point{391}; Point{392}; 
+  }
+}
+Coherence;
+
+Rotate{{0.0,1.0,0.0},{0.0,0.0,0.0},3.14159/2} {
+  Duplicata { 
+    Point{393}; Point{394}; Point{395}; Point{396}; Point{397}; 
+    Point{398}; Point{399}; Point{400}; Point{401}; Point{402}; 
+    Point{403}; Point{404}; 
+  }
+}
+Coherence;
+
+Rotate{{0.0,1.0,0.0},{0.0,0.0,0.0},3.14159/2} {
+  Duplicata { 
+    Point{405}; Point{406}; Point{407}; Point{408}; Point{409}; 
+    Point{410}; Point{411}; Point{412}; Point{413}; Point{414}; 
+    Point{415}; Point{416};  
+  }
+}
+Coherence;
+
+Spline(698) = {381,382,383,384,385,386} ;
+Spline(699) = {386,387,388,389,390} ;
+Spline(700) = {390,391,392} ;
+Line(701) = {392,393} ;
+
+Spline(702) = {393,394,395,396,397,398} ;
+Spline(703) = {398,399,400,401,402} ;
+Spline(704) = {402,403,404} ;
+Line(705) = {404,405} ;
+
+Spline(706) = {405,406,407,408,409,410} ;
+Spline(707) = {410,411,412,413,414} ;
+Spline(708) = {414,415,416} ;
+Line(709) = {416,417} ;
+
+Spline(710) = {417,418,419,420,421,422} ;
+Spline(711) = {422,423,424,425,426} ;
+Spline(712) = {426,427,428} ;
+Line(713) = {428,381} ;
+
+Line Loop(714) = {699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,698};
+Line Loop(715) = {681,682,683,684};
+Plane Surface(716) = {714,715};
+
+
+/* Extrude fixed contact*/
+
+Extrude Surface {716,{0,-8.0,0}} ;
+
+/********** Moving Contact ************/
+
+Translate{0.0,-20.0,0.} {
+  Duplicata { Surface{716}; }
+}
+Extrude Surface { 819,{0,-8.0,0}} ;
+
+/********************************************** FLOATING SHIELD ****************************************/
+
+/*f1*/
+
+Point(1001) = {36.5,-29.8,0.0,fc};
+Point(1002) = {0.0,-29.8,36.5,fc};
+Point(1003) = {-36.5,-29.8,0.0,fc};
+Point(1004) = {0.0,-29.8,-36.5,fc};
+Point(1005) = {0.0,-29.8,0.0,fc};
+
+Circle(1001) = {1001,1005,1002} ;
+Circle(1002) = {1002,1005,1003} ;
+Circle(1003) = {1003,1005,1004} ;
+Circle(1004) = {1004,1005,1001} ;
+
+Point(1006) = {32,-40.8,0.0,fc};
+Point(1007) = {0.0,-40.8,32.0,fc};
+Point(1008) = {-32,-40.8,0.0,fc};
+Point(1009) = {0.0,-40.8,-32.0,fc};
+Point(1010) = {0.0,-40.8,0.0,fc};
+
+Circle(1005) = {1006,1010,1007} ;
+Circle(1006) = {1007,1010,1008} ;
+Circle(1007) = {1008,1010,1009} ;
+Circle(1008) = {1009,1010,1006} ;
+
+Line(1009) = {1001,1006} ;
+Line(1010) = {1002,1007} ;
+Line(1011) = {1003,1008} ;
+Line(1012) = {1004,1009} ;
+
+Line Loop(1013) = {-1005,-1009,1001,1010};
+Ruled Surface(1014) = {1013};
+Line Loop(1015) = {-1006,-1010,1002,1011};
+Ruled Surface(1016) = {1015};
+Line Loop(1017) = {-1007,-1011,1003,1012};
+Ruled Surface(1018) = {1017};
+Line Loop(1019) = {-1008,-1012,1004,1009};
+Ruled Surface(1020) = {1019};
+
+/*f2*/
+
+Point(1011) = {29,-40.8,0.0,fc};
+Point(1012) = {0.0,-40.8,29,fc};
+Point(1013) = {-29,-40.8,0.0,fc};
+Point(1014) = {0.0,-40.8,-29,fc};
+
+Point(1016) = {29,-43.8,0.0,fc};
+Point(1017) = {0.0,-43.8,29.0,fc};
+Point(1018) = {-29,-43.8,0.0,fc};
+Point(1019) = {0.0,-43.8,-29.0,fc};
+Point(1020) = {0.0,-43.8,0.0,fc};
+
+Circle(1021) = {1016,1020,1017} ;
+Circle(1022) = {1017,1020,1018} ;
+Circle(1023) = {1018,1020,1019} ;
+Circle(1024) = {1019,1020,1016} ;
+
+Circle(1025) = {1016,1011,1006} ;
+Circle(1026) = {1007,1012,1017} ;
+Circle(1027) = {1008,1013,1018} ;
+Circle(1028) = {1009,1014,1019} ;
+
+Line Loop(1029) = {-1023,-1027,1007,1028};
+Ruled Surface(1030) = {1029};
+Line Loop(1031) = {-1008,1028,1024,1025};
+Ruled Surface(1032) = {1031};
+Line Loop(1033) = {-1021,1025,1005,1026};
+Ruled Surface(1034) = {1033};
+Line Loop(1035) = {-1022,-1026,1006,1027};
+Ruled Surface(1036) = {1035};
+
+/*f3*/
+
+Point(1021) = {26,-40.8,0.0,fc};
+Point(1022) = {0.0,-40.8,26.0,fc};
+Point(1023) = {-26,-40.8,0.0,fc};
+Point(1024) = {0.0,-40.8,-26.0,fc};
+
+Circle(1037) = {1021,1010,1022} ;
+Circle(1038) = {1022,1010,1023} ;
+Circle(1039) = {1023,1010,1024} ;
+Circle(1040) = {1024,1010,1021} ;
+
+Circle(1041) = {1018,1013,1023};
+Circle(1042) = {1019,1014,1024};
+Circle(1043) = {1021,1011,1016};
+Circle(1044) = {1017,1012,1022};
+
+Line Loop(1045) = {-1038,-1044,1022,1041};
+Ruled Surface(1046) = {1045};
+Line Loop(1047) = {-1039,-1041,1023,1042};
+Ruled Surface(1048) = {1047};
+Line Loop(1049) = {-1024,1042,1040,1043};
+Ruled Surface(1050) = {1049};
+Line Loop(1051) = {-1037,1043,1021,1044};
+Ruled Surface(1052) = {1051};
+
+/*f4*/
+
+Point(1026) = {31,-40.8,0.0,fc};
+Point(1027) = {0.0,-40.8,31.0,fc};
+Point(1028) = {-31,-40.8,0.0,fc};
+Point(1029) = {0.0,-40.8,-31.0,fc};
+
+Circle(1053) = {1026,1010,1027} ;
+Circle(1054) = {1027,1010,1028} ;
+Circle(1055) = {1028,1010,1029} ;
+Circle(1056) = {1029,1010,1026} ;
+
+Line Loop(1057) = {1053,1054,1055,1056};
+Line Loop(1058) = {1037,1038,1039,1040};
+Plane Surface(1059) = {1057,1058};
+
+/*f5*/
+
+Point(1031) = {35.5,-29.8,0.0,fc};
+Point(1032) = {0.0,-29.8,35.5,fc};
+Point(1033) = {-35.5,-29.8,0.0,fc};
+Point(1034) = {0.0,-29.8,-35.5,fc};
+
+Circle(1060) = {1031,1005,1032} ;
+Circle(1061) = {1032,1005,1033} ;
+Circle(1062) = {1033,1005,1034} ;
+Circle(1063) = {1034,1005,1031} ;
+
+Line(1064) = {1026,1031} ;
+Line(1065) = {1027,1032} ;
+Line(1066) = {1028,1033} ;
+Line(1067) = {1029,1034} ;
+
+Line Loop(1068) = {1063,-1064,-1056,1067};
+Ruled Surface(1069) = {1068};
+Line Loop(1070) = {1062,-1067,-1055,1066};
+Ruled Surface(1071) = {1070};
+Line Loop(1072) = {1061,-1066,-1054,1065};
+Ruled Surface(1073) = {1072};
+Line Loop(1074) = {1060,-1065,-1053,1064};
+Ruled Surface(1075) = {1074};
+
+/*f6*/
+
+Point(1036) = {35.5,13.2,0.0,fc};
+Point(1037) = {0.0,13.2,35.5,fc};
+Point(1038) = {-35.5,13.2,0.0,fc};
+Point(1039) = {0.0,13.2,-35.5,fc};
+Point(1040) = {0.0,13.2,0.0,fc};
+
+Circle(1076) = {1036,1040,1037} ;
+Circle(1077) = {1037,1040,1038} ;
+Circle(1078) = {1038,1040,1039} ;
+Circle(1079) = {1039,1040,1036} ;
+
+Line(1080) = {1036,1031}; 
+Line(1081) = {1037,1032};
+Line(1082) = {1038,1033};
+Line(1083) = {1039,1034};
+
+Line Loop(1084) = {1061,-1082,-1077,1081};
+Ruled Surface(1085) = {1084};
+Line Loop(1086) = {1062,-1083,-1078,1082};
+Ruled Surface(1087) = {1086};
+Line Loop(1088) = {1063,-1080,-1079,1083};
+Ruled Surface(1089) = {1088};
+Line Loop(1090) = {1060,-1081,-1076,1080};
+Ruled Surface(1091) = {1090};
+
+/*f7*/
+
+Point(1041) = {30.5,26.2,0.0,fc};
+Point(1042) = {0.0,26.2,30.5,fc};
+Point(1043) = {-30.5,26.2,0.0,fc};
+Point(1044) = {0.0,26.2,-30.5,fc};
+Point(1045) = {0.0,26.2,0.0,fc};
+
+Circle(1092) = {1041,1045,1042} ;
+Circle(1093) = {1042,1045,1043} ;
+Circle(1094) = {1043,1045,1044} ;
+Circle(1095) = {1044,1045,1041} ;
+
+Line(1096) = {1036,1041}; 
+Line(1097) = {1037,1042};
+Line(1098) = {1038,1043};
+Line(1099) = {1039,1044};
+
+Line Loop(1100) = {-1095,-1099,1079,1096};
+Ruled Surface(1101) = {1100};
+Line Loop(1102) = {-1092,-1096,1076,1097};
+Ruled Surface(1103) = {1102};
+Line Loop(1104) = {-1093,-1097,1077,1098};
+Ruled Surface(1105) = {1104};
+Line Loop(1106) = {-1094,-1098,1078,1099};
+Ruled Surface(1107) = {1106};
+
+/*f8*/
+
+Point(1046) = {26,26.2,0.0,fc};
+Point(1047) = {0.0,26.2,26,fc};
+Point(1048) = {-26,26.2,0.0,fc};
+Point(1049) = {0.0,26.2,-26,fc};
+
+Circle(1108) = {1046,1045,1047} ;
+Circle(1109) = {1047,1045,1048} ;
+Circle(1110) = {1048,1045,1049} ;
+Circle(1111) = {1049,1045,1046} ;
+
+Line Loop(1112) = {1095,1092,1093,1094};
+Line Loop(1113) = {1110,1111,1108,1109};
+Plane Surface(1114) = {1112,1113};
+
+/*f9*/
+
+Point(1051) = {29,29.2,0.0,fc};
+Point(1052) = {0.0,29.2,29,fc};
+Point(1053) = {-29,29.2,0.0,fc};
+Point(1054) = {0.0,29.2,-29,fc};
+Point(1055) = {0.0,29.2,0.0,fc};
+
+Circle(1115) = {1051,1055,1052} ;
+Circle(1116) = {1052,1055,1053} ;
+Circle(1117) = {1053,1055,1054} ;
+Circle(1118) = {1054,1055,1051} ;
+
+Point(1056) = {29,26.2,0.0,fc};
+Point(1057) = {0.0,26.2,29,fc};
+Point(1058) = {-29,26.2,0.0,fc};
+Point(1059) = {0.0,26.2,-29,fc};
+
+Circle(1119) = {1051,1056,1046} ;
+Circle(1120) = {1047,1057,1052} ;
+Circle(1121) = {1048,1058,1053} ;
+Circle(1122) = {1049,1059,1054} ;
+
+Line Loop(1123) = {-1117,-1121,1110,1122};
+Ruled Surface(1124) = {1123};
+Line Loop(1125) = {-1111,1122,1118,1119};
+Ruled Surface(1126) = {1125};
+Line Loop(1127) = {-1115,1119,1108,1120};
+Ruled Surface(1128) = {1127};
+Line Loop(1129) = {-1116,-1120,1109,1121};
+Ruled Surface(1130) = {1129};
+
+/* f10 */
+
+Point(1061) = {32,26.2,0.0,fc};
+Point(1062) = {0.0,26.2,32,fc};
+Point(1063) = {-32,26.2,0.0,fc};
+Point(1064) = {0.0,26.2,-32,fc};
+
+Circle(1131) = {1061,1045,1062} ;
+Circle(1132) = {1062,1045,1063} ;
+Circle(1133) = {1063,1045,1064} ;
+Circle(1134) = {1064,1045,1061} ;
+
+Circle(1135) = {1061,1056,1051} ;
+Circle(1136) = {1052,1057,1062} ;
+Circle(1137) = {1053,1058,1063} ;
+Circle(1138) = {1054,1059,1064} ;
+
+Line Loop(1139) = {-1133,-1137,1117,1138};
+Ruled Surface(1140) = {1139};
+Line Loop(1141) = {-1118,1138,1134,1135};
+Ruled Surface(1142) = {1141};
+Line Loop(1143) = {-1131,1135,1115,1136};
+Ruled Surface(1144) = {1143};
+Line Loop(1145) = {-1132,-1136,1116,1137};
+Ruled Surface(1146) = {1145};
+
+
+/* f11 */
+
+Point(1066) = {36.5,13.2,0.0,fc};
+Point(1067) = {0.0,13.2,36.5,fc};
+Point(1068) = {-36.5,13.2,0.0,fc};
+Point(1069) = {0.0,13.2,-36.5,fc};
+
+Circle(1147) = {1066,1040,1067} ;
+Circle(1148) = {1067,1040,1068} ;
+Circle(1149) = {1068,1040,1069} ;
+Circle(1150) = {1069,1040,1066} ;
+
+Line(1151) = {1061,1066} ;
+Line(1152) = {1062,1067} ;
+Line(1153) = {1063,1068} ;
+Line(1154) = {1064,1069} ;
+
+Line Loop(1155) = {-1149,-1153,1133,1154};
+Ruled Surface(1156) = {1155};
+Line Loop(1157) = {-1150,-1154,1134,1151};
+Ruled Surface(1158) = {1157};
+Line Loop(1159) = {-1147,-1151,1131,1152};
+Ruled Surface(1160) = {1159};
+Line Loop(1161) = {-1148,-1152,1132,1153};
+Ruled Surface(1162) = {1161};
+
+/* f12 */
+
+Line(1163) = {1001,1066} ;
+Line(1164) = {1002,1067} ;
+Line(1165) = {1003,1068} ;
+Line(1166) = {1004,1069} ;
+
+Line Loop(1167) = {-1149,-1165,1003,1166};
+Ruled Surface(1168) = {1167};
+Line Loop(1169) = {-1150,-1166,1004,1163};
+Ruled Surface(1170) = {1169};
+Line Loop(1171) = {-1147,-1163,1001,1164};
+Ruled Surface(1172) = {1171};
+Line Loop(1173) = {-1148,-1164,1002,1165};
+Ruled Surface(1174) = {1173};
+
+
+/********************************************** insulator ****************************************/
+
+/* insul #1 */
+
+Point(1101) = {47,50,0.0,dmax};
+Point(1102) = {0.0,50,47.0,dmax};
+Point(1103) = {-47,50,0.0,dmax};
+Point(1104) = {0.0,50,-47.0,dmax};
+
+Circle(1201) = {1101,120,1102};
+Circle(1202) = {1102,120,1103};
+Circle(1203) = {1103,120,1104};
+Circle(1204) = {1104,120,1101};
+
+Line Loop(1205) = {1201,1202,1203,1204};
+Plane Surface(1206) = {1205,286};
+
+/* insul #2 */
+
+Point(1106) = {47,-87.2,0.0,dmax};
+Point(1107) = {0.0,-87.2,47.0,dmax};
+Point(1108) = {-47,-87.2,0.0,dmax};
+Point(1109) = {0.0,-87.2,-47.0,dmax};
+
+Circle(1205) = {1106,110,1107};
+Circle(1206) = {1107,110,1108};
+Circle(1207) = {1108,110,1109};
+Circle(1208) = {1109,110,1106};
+
+Line(1209) = {1101,1106} ;
+Line(1210) = {1102,1107} ;
+Line(1211) = {1103,1108} ;
+Line(1212) = {1104,1109} ;
+
+Line Loop(1213) = {1206,-1211,-1202,1210};
+Ruled Surface(1214) = {1213};
+Line Loop(1215) = {1207,-1212,-1203,1211};
+Ruled Surface(1216) = {1215};
+Line Loop(1217) = {1208,-1209,-1204,1212};
+Ruled Surface(1218) = {1217};
+Line Loop(1219) = {1205,-1210,-1201,1209};
+Ruled Surface(1220) = {1219};
+
+
+/* insul #3 */
+
+Line Loop(1221) = {1205,1206,1207,1208};
+Plane Surface(1222) = {1221,263};
+
+
+/********************************************** air region ****************************************/
+
+
+/* a#1 */
+
+Point(1201) = {60,65,0.0,dmax};
+Point(1202) = {0.0,65,60.0,dmax};
+Point(1203) = {-60,65,0.0,dmax};
+Point(1204) = {0.0,65,-60.0,dmax};
+
+Circle(1301) = {1201,130,1202};
+Circle(1302) = {1202,130,1203};
+Circle(1303) = {1203,130,1204};
+Circle(1304) = {1204,130,1201};
+
+Line Loop(1305) = {1301,1302,1303,1304};
+Plane Surface(1306) = {1305,309};
+
+/* a#2 */
+
+Point(1206) = {60,-102.2,0.0,dmax};
+Point(1207) = {0.0,-102.2,60.0,dmax};
+Point(1208) = {-60,-102.2,0.0,dmax};
+Point(1209) = {0.0,-102.2,-60.0,dmax};
+
+Circle(1305) = {1206,100,1207};
+Circle(1306) = {1207,100,1208};
+Circle(1307) = {1208,100,1209};
+Circle(1308) = {1209,100,1206};
+
+Line(1309) = {1201,1206} ;
+Line(1310) = {1202,1207} ;
+Line(1311) = {1203,1208} ;
+Line(1312) = {1204,1209} ;
+
+Line Loop(1313) = {1306,-1311,-1302,1310};
+Ruled Surface(1314) = {1313};
+Line Loop(1315) = {1307,-1312,-1303,1311};
+Ruled Surface(1316) = {1315};
+Line Loop(1317) = {1308,-1309,-1304,1312};
+Ruled Surface(1318) = {1317};
+Line Loop(1319) = {1305,-1310,-1301,1309};
+Ruled Surface(1320) = {1319};
+
+Line Loop(1321) = {1305,1306,1307,1308};
+Plane Surface(1322) = {1321,240};
+
diff --git a/benchmarks/bugs/xytouv.geo b/benchmarks/bugs/xytouv.geo
new file mode 100644
index 0000000000000000000000000000000000000000..1a5c61cf4bd3aae9e86cc3808e63d7cbf43c8fa4
--- /dev/null
+++ b/benchmarks/bugs/xytouv.geo
@@ -0,0 +1,6 @@
+lc = 0.2;
+Point(1)={0,0,0,lc};
+Point(2)={1,0,0,lc};
+Point(3)={0,1,0,lc};
+Circle(1) = {2,1,3};
+Extrude Line {1, {0,1,0}, {-5,0,0}, -Pi/2};