diff --git a/CHANGELOG.txt b/CHANGELOG.txt
index 645eaacd117a16231c92a5044b665a42126dc9ef..446c93144b1347c97b55d5c87fa0872c88d5628b 100644
--- a/CHANGELOG.txt
+++ b/CHANGELOG.txt
@@ -1,3 +1,5 @@
+3.0.5: bug fixes.
+
 3.0.4 (July 28, 2017): moved vorometal code to plugin; openmp improvements; bug
 fixes.
 
diff --git a/Geo/Geo.cpp b/Geo/Geo.cpp
index fb5a41f512d6713446351bb1fa49fe8658d68442..861f1e02db063d5ef596151d5dbdeadeed8d81f5 100644
--- a/Geo/Geo.cpp
+++ b/Geo/Geo.cpp
@@ -1381,8 +1381,7 @@ static void vecmat4x4(double mat[4][4], double vec[4], double res[4])
   }
 }
 
-static void ApplyTransformationToPoint(double matrix[4][4], Vertex *v,
-                                       bool end_curve_surface=false)
+static void ApplyTransformationToPoint(double matrix[4][4], Vertex *v)
 {
   double pos[4], vec[4];
 
@@ -1404,28 +1403,6 @@ static void ApplyTransformationToPoint(double matrix[4][4], Vertex *v,
   v->Pos.Y = pos[1];
   v->Pos.Z = pos[2];
   v->w = pos[3];
-
-  // Warning: in theory we should always redo these checks if
-  // end_curve_surface is true; but in practice this is so slow for
-  // big models that we need to provide a way to bypass it (which is
-  // OK if the guy who builds the geometry knowns what he's
-  // doing). Instead of adding one more option, let's just bypass all
-  // the checks if auto_coherence==0...
-  if(CTX::instance()->geom.autoCoherence && end_curve_surface){
-    List_T *All = Tree2List(GModel::current()->getGEOInternals()->Curves);
-    for(int i = 0; i < List_Nbr(All); i++) {
-      Curve *c;
-      List_Read(All, i, &c);
-      for(int j = 0; j < List_Nbr(c->Control_Points); j++) {
-        Vertex *pv = *(Vertex **)List_Pointer(c->Control_Points, j);
-        if(pv->Num == v->Num){
-          EndCurve(c);
-          break;
-        }
-      }
-    }
-    List_Delete(All);
-  }
 }
 
 static void ApplyTransformationToCurve(double matrix[4][4], Curve *c)
@@ -1482,7 +1459,7 @@ static void ApplicationOnShapes(double matrix[4][4], List_T *shapes)
     case MSH_POINT:
       v = FindPoint(O.Num);
       if(v)
-        ApplyTransformationToPoint(matrix, v, true);
+        ApplyTransformationToPoint(matrix, v);
       else
         Msg::Error("Unknown GEO vertex with tag %d", O.Num);
       break;
@@ -1524,6 +1501,28 @@ static void ApplicationOnShapes(double matrix[4][4], List_T *shapes)
     }
   }
 
+  // recompute curve parameters if control points have been transformed.
+  // Warning: in theory we should always redo these checks; but in practice this
+  // is so slow for big models that we need to provide a way to bypass it (which
+  // is OK if the guy who builds the geometry knowns what he's doing). Instead
+  // of adding one more option, let's just bypass all the checks if
+  // auto_coherence==0.
+  if(CTX::instance()->geom.autoCoherence){
+    List_T *All = Tree2List(GModel::current()->getGEOInternals()->Curves);
+    for(int i = 0; i < List_Nbr(All); i++) {
+      Curve *c;
+      List_Read(All, i, &c);
+      for(int j = 0; j < List_Nbr(c->Control_Points); j++) {
+        Vertex *pv = *(Vertex **)List_Pointer(c->Control_Points, j);
+        if(List_Search(ListOfTransformedPoints, &pv->Num, fcmp_absint)) {
+          EndCurve(c);
+          break;
+        }
+      }
+    }
+    List_Delete(All);
+  }
+
   List_Reset(ListOfTransformedPoints);
 }
 
diff --git a/benchmarks/3d/transform_control_points.geo b/benchmarks/3d/transform_control_points.geo
new file mode 100644
index 0000000000000000000000000000000000000000..664691a4319d7d8b30de9fce9ae710de88c2f2db
--- /dev/null
+++ b/benchmarks/3d/transform_control_points.geo
@@ -0,0 +1,983 @@
+
+
+//**** Definition of points
+
+p1 = newp;
+Point(p1+1) ={   0.0000,  -2.0940,   1.4490,   0.500};
+Point(p1+2) ={   1.1080,  -2.0940,   1.4490,   0.500};
+Point(p1+3) ={   0.5540,  -2.0940,   2.4086,   0.500};
+Point(p1+4) ={  -0.5540,  -2.0940,   2.4086,   0.500};
+Point(p1+5) ={  -1.1080,  -2.0940,   1.4490,   0.500};
+Point(p1+6) ={  -0.5540,  -2.0940,   0.4894,   0.500};
+Point(p1+7) ={   0.5540,  -2.0940,   0.4894,   0.500};
+Point(p1+8) ={   0.0000, -10.4040,   1.4490,   0.500};
+Point(p1+9) ={   1.1080, -10.4040,   1.4490,   0.500};
+Point(p1+10) ={   0.5540, -10.4040,   2.4086,   0.500};
+Point(p1+11) ={  -0.5540, -10.4040,   2.4086,   0.500};
+Point(p1+12) ={  -1.1080, -10.4040,   1.4490,   0.500};
+Point(p1+13) ={  -0.5540, -10.4040,   0.4894,   0.500};
+Point(p1+14) ={   0.5540, -10.4040,   0.4894,   0.500};
+
+lref =  0.2015;
+
+//**** Definition of lines
+
+line1 = 100;
+
+Line(line1+14) ={p1+  2,p1+  9};
+Line(line1+17) ={p1+  5,p1+ 12};
+
+p1 = newp;
+
+Point (p1+  1)={  2.8559,  0.9391,  0.6751, 0.10};
+Point (p1+  2)={  1.6943,  0.4638,  0.4542, 0.10};
+Point (p1+  3)={  2.1772, -0.7156,  0.4523, 0.10};
+Point (p1+  4)={  3.3386, -0.2404,  0.6750, 0.10};
+Point (p1+  5)={  2.5166,  0.1118,  0.5637, 0.10};
+Point (p1+  6)={  2.8578,  0.9398,  0.6636, 0.10};
+Point (p1+  7)={  1.6962,  0.4645,  0.4426, 0.10};
+Point (p1+  8)={  2.1791, -0.7148,  0.4408, 0.10};
+Point (p1+  9)={  3.3404, -0.2396,  0.6635, 0.10};
+Point (p1+ 10)={  2.5185,  0.1125,  0.5522, 0.10};
+//+
+
+p1 = newp;
+
+Point (p1+  1)={ -4.0600,  0.0040,  0.8471, 0.10};
+Point (p1+  2)={ -2.8859, -1.1884,  0.6386, 0.10};
+Point (p1+  3)={ -1.7126,  0.0040,  0.4260, 0.10};
+Point (p1+  4)={ -2.8859,  1.1964,  0.6386, 0.10};
+Point (p1+  5)={ -2.8863,  0.0040,  0.6366, 0.10};
+Point (p1+  6)={ -4.0650,  0.0040,  0.8186, 0.10};
+Point (p1+  7)={ -2.8910, -1.1884,  0.6101, 0.10};
+Point (p1+  8)={ -1.7177,  0.0040,  0.3976, 0.10};
+Point (p1+  9)={ -2.8910,  1.1964,  0.6101, 0.10};
+Point (p1+ 10)={ -2.8914,  0.0040,  0.6081, 0.10};
+
+p1 = newp;
+
+Point (p1+  1)={ 1, 0.928,2.775, 0.50};
+Point (p1+  2)={ 1,-0.928,2.775, 0.50};
+Point (p1+  3)={-1,-0.928,2.775, 0.50};
+Point (p1+  4)={-1, 0.928,2.775, 0.50};
+Point (p1+  5)={ 1, 0.928,0.317, 0.50};
+Point (p1+  6)={ 1,-0.928,0.317, 0.50};
+Point (p1+  7)={-1,-0.928,0.317, 0.50};
+Point (p1+  8)={-1, 0.928,0.317, 0.50};
+
+p1 = newp;
+
+
+
+//// FAR FIELD
+Point (p1+  1)={ 4.5,  2.44,  4, 0.50};
+Point (p1+  2)={ 4.5,-11.80,  4, 0.50};
+Point (p1+  3)={-4.86,-11.8,  4, 0.50};
+Point (p1+  4)={-4.86, 2.44,  4, 0.50};
+
+Point (p1+  5)={ 4.5,  2.44,-0.91, 0.50};
+Point (p1+  6)={ 4.5,-11.80,-0.91, 0.50};
+Point (p1+  7)={-4.86,-11.8,-0.91, 0.50};
+Point (p1+  8)={-4.86, 2.44,-0.91, 0.50};//+
+Coherence;
+
+//Merge "punti_motore.geo";
+
+
+/////////////////////////////////////////////////////
+p1 = newp;
+
+Point (p1+  1)={  1.1904, -0.9327,  1.4885, 0.10};
+Point (p1+  2)={  1.1484, -0.9720,  1.5460, 0.10};
+Point (p1+  3)={  1.1063, -1.0111,  1.4885, 0.10};
+Point (p1+  4)={  1.1484, -0.9720,  1.4310, 0.10};
+Point (p1+  5)={  1.1484, -0.9719,  1.4885, 0.10};
+
+Point (p1+  6)={  1.1221, -0.8596,  1.4885, 0.10};
+Point (p1+  7)={  1.0801, -0.8989,  1.5460, 0.10};
+Point (p1+  8)={  1.0380, -0.9380,  1.4885, 0.10};
+Point (p1+  9)={  1.0801, -0.8989,  1.4310, 0.10};
+Point (p1+ 10)={  1.0801, -0.8988,  1.4885, 0.10};
+
+Point (p1+ 11)={  1.1688, -0.9528,  1.4885, 0.10};
+Point (p1+ 12)={  1.1484, -0.9719,  1.5165, 0.10};
+Point (p1+ 13)={  1.1279, -0.9910,  1.4885, 0.10};
+Point (p1+ 14)={  1.1484, -0.9719,  1.4605, 0.10};
+
+Point (p1+ 15)={  1.1849, -0.9378,  1.4885, 0.10};
+Point (p1+ 16)={  1.1484, -0.9720,  1.5385, 0.10};
+Point (p1+ 17)={  1.1118, -1.0060,  1.4885, 0.10};
+Point (p1+ 18)={  1.1484, -0.9720,  1.4385, 0.10};
+
+/////////////////////////////////////////////////////
+
+
+Coherence;
+
+//+
+Circle(118) = {18, 21, 17};
+//+
+Circle(119) = {17, 21, 20};
+//+
+Circle(120) = {20, 21, 19};
+//+
+Circle(121) = {19, 21, 18};
+//+
+Circle(122) = {23, 26, 22};
+//+
+Circle(123) = {22, 26, 25};
+//+
+Circle(124) = {25, 26, 24};
+//+
+Circle(125) = {24, 26, 23};
+//+
+Circle(126) = {58, 61, 57};
+//+
+Circle(127) = {57, 61, 60};
+//+
+Circle(128) = {60, 61, 59};
+//+
+Circle(129) = {59, 61, 58};
+//+
+Circle(130) = {72, 61, 71};
+//+
+Circle(131) = {71, 61, 74};
+//+
+Circle(132) = {74, 61, 73};
+//+
+Circle(133) = {73, 61, 72};
+//+
+Circle(134) = {68, 61, 67};
+//+
+Circle(135) = {67, 61, 70};
+//+
+Circle(136) = {70, 61, 69};
+//+
+Circle(137) = {69, 61, 68};
+//+
+Circle(138) = {63, 66, 62};
+//+
+Circle(139) = {62, 66, 65};
+//+
+Circle(140) = {65, 66, 64};
+//+
+Circle(141) = {64, 66, 63};
+//+
+Line(142) = {63, 58};
+//+
+Line(143) = {62, 57};
+//+
+Line(144) = {65, 60};
+//+
+Line(145) = {64, 59};
+//+
+Line(146) = {49, 50};
+//+
+Line(147) = {50, 51};
+//+
+Line(148) = {51, 48};
+//+
+Line(149) = {48, 49};
+//+
+Line(150) = {55, 54};
+//+
+Line(151) = {54, 53};
+//+
+Line(152) = {53, 52};
+//+
+Line(153) = {52, 55};
+//+
+Line(154) = {51, 55};
+//+
+Line(155) = {50, 54};
+//+
+Line(156) = {49, 53};
+//+
+Line(157) = {48, 52};
+//+
+Line(158) = {13, 10};
+//+
+Line(159) = {6, 3};
+//+
+Delete {
+  Point{4, 2, 5, 7, 8, 12, 11, 9, 14, 15};
+}
+//+
+Circle(161) = {31, 32, 30};
+//+
+Circle(162) = {30, 32, 29};
+//+
+Circle(163) = {29, 32, 28};
+//+
+Circle(164) = {28, 32, 31};
+//+
+Circle(165) = {36, 37, 35};
+//+
+Circle(166) = {35, 37, 34};
+//+
+Circle(167) = {34, 37, 33};
+//+
+Circle(168) = {33, 37, 36};
+//+
+Line(169) = {36, 31};
+//+
+Line(170) = {35, 30};
+//+
+Line(171) = {34, 29};
+//+
+Line(172) = {33, 28};
+//+
+Line(173) = {17, 22};
+//+
+Line(174) = {20, 25};
+//+
+Line(175) = {19, 24};
+//+
+Line(176) = {18, 23};
+//+
+
+//+
+
+Coherence;
+
+
+
+
+//+
+Delete {
+  Line{148, 153, 157, 149, 152, 156, 146, 151, 155, 147, 150, 154};
+}
+//+
+Delete {
+  Point{48, 51, 55, 54, 50, 53, 49, 52};
+}
+//+
+Line(177) = {39, 40};
+//+
+Line(178) = {40, 41};
+//+
+Line(179) = {41, 42};
+//+
+Line(180) = {42, 39};
+//+
+Line(181) = {39, 43};
+//+
+Line(182) = {43, 44};
+//+
+Line(183) = {44, 45};
+//+
+Line(184) = {45, 46};
+//+
+Line(185) = {46, 43};
+//+
+Line(186) = {41, 45};
+//+
+Line(187) = {40, 44};
+//+
+Line(188) = {42, 46};
+//+
+Translate {0, 0, -0.015} {
+  Duplicata { Line{159, 114, 117, 158}; }
+}
+//+
+Line(193) = {76, 3};
+//+
+Line(194) = {10, 80};
+//+
+Line(195) = {84, 13};
+//+
+Line(196) = {6, 75};
+//+
+Line Loop(197) = {187, 183, -186, -178};
+//+
+Plane Surface(198) = {197};
+//+
+Line Loop(199) = {186, 184, -188, -179};
+//+
+Plane Surface(200) = {199};
+//+
+Line Loop(201) = {180, 181, -185, -188};
+//+
+Plane Surface(202) = {201};
+//+
+Line Loop(203) = {181, 182, -187, -177};
+//+
+Plane Surface(204) = {203};
+//+
+Line Loop(205) = {182, 183, 184, 185};
+//+
+Plane Surface(206) = {205};
+//+
+Line Loop(207) = {179, 180, 177, 178};
+//+
+Plane Surface(208) = {207};
+//+
+Line Loop(209) = {134, 135, 136, 137};
+//+
+Plane Surface(210) = {209};
+//+
+Line Loop(211) = {130, 131, 132, 133};
+//+
+Line(212) = {68, 72};
+//+
+Line(213) = {71, 67};
+//+
+Line(214) = {69, 73};
+//+
+Line(215) = {70, 74};
+//+
+Line Loop(216) = {130, 213, -134, 212};
+//+
+Plane Surface(217) = {216};
+//+
+Line Loop(218) = {213, 135, 215, -131};
+//+
+Plane Surface(219) = {218};
+//+
+Line Loop(220) = {215, 132, -214, -136};
+//+
+Plane Surface(221) = {220};
+//+
+Line Loop(222) = {214, 133, -212, -137};
+//+
+Plane Surface(223) = {222};
+//+
+Line Loop(224) = {129, 126, 127, 128};
+//+
+Plane Surface(225) = {211, 224};
+//+
+Line Loop(226) = {138, 139, 140, 141};
+//+
+Plane Surface(227) = {226};
+//+
+Line Loop(228) = {142, 126, -143, -138};
+//+
+Ruled Surface(229) = {228};
+//+
+Line Loop(230) = {143, 127, -144, -139};
+//+
+Ruled Surface(231) = {230};
+//+
+Line Loop(232) = {144, 128, -145, -140};
+//+
+Ruled Surface(233) = {232};
+//+
+Line Loop(234) = {141, 142, -129, -145};
+//+
+Ruled Surface(235) = {234};
+//+
+Line Loop(236) = {118, 119, 120, 121};
+//+
+Plane Surface(237) = {236};
+//+
+Line Loop(238) = {125, 122, 123, 124};
+//+
+Plane Surface(239) = {238};
+//+
+Line Loop(240) = {119, 174, -123, -173};
+//+
+Ruled Surface(241) = {240};
+//+
+Line Loop(242) = {120, 175, -124, -174};
+//+
+Ruled Surface(243) = {242};
+//+
+Line Loop(244) = {121, 176, -125, -175};
+//+
+Ruled Surface(245) = {244};
+//+
+Line Loop(246) = {118, 173, -122, -176};
+//+
+Ruled Surface(247) = {246};
+//+
+Line Loop(248) = {171, 163, -172, -167};
+//+
+Ruled Surface(249) = {248};
+//+
+Line Loop(250) = {164, -169, -168, 172};
+//+
+Ruled Surface(251) = {250};
+//+
+Line Loop(252) = {161, -170, -165, 169};
+//+
+Ruled Surface(253) = {252};
+//+
+Line Loop(254) = {162, -171, -166, 170};
+//+
+Ruled Surface(255) = {254};
+//+
+Line Loop(256) = {163, 164, 161, 162};
+//+
+Plane Surface(257) = {256};
+//+
+Line Loop(258) = {166, 167, 168, 165};
+//+
+Plane Surface(259) = {258};
+//+
+Line Loop(260) = {159, 114, -158, -117};
+//+
+Plane Surface(261) = {260};
+//+
+Line Loop(262) = {189, 190, -192, -191};
+//+
+Plane Surface(263) = {262};
+//+
+Line Loop(264) = {117, -195, -191, -196};
+//+
+Plane Surface(265) = {264};
+//+
+Line Loop(266) = {159, -193, -189, -196};
+//+
+Plane Surface(267) = {266};
+//+
+Line Loop(268) = {114, 194, -190, 193};
+//+
+Plane Surface(269) = {268};
+//+
+Line Loop(270) = {158, 194, -192, 195};
+//+
+Plane Surface(271) = {270};
+//+
+Physical Surface(300) = {257, 259, 253, 251, 249, 255};
+//+
+Physical Surface(301) = {204, 208, 202, 200, 206, 198};
+//+
+Physical Surface(302) = {261};
+//+
+Physical Surface(303) = {263, 269, 267, 265, 271};
+//+
+Physical Surface(304) = {225, 210, 229, 235, 233, 231, 227};
+//+
+Physical Surface("Source", 305) = {217, 223, 221, 219};
+//+
+Transfinite Line {213, 212, 214, 215} = 3 Using Progression 1;
+//+
+Transfinite Line {134, 135, 137, 136} = 5 Using Progression 1;
+//+
+Transfinite Line {130, 131, 127, 126, 129, 133, 132, 128} = 7 Using Progression 1;
+//+
+Transfinite Line {142, 143, 144, 145} = 4 Using Progression 1;
+//+
+Transfinite Line {140, 141, 139, 138} = 5 Using Progression 1;
+//+
+Transfinite Line {178, 177, 180, 179, 181, 182, 185, 186, 187, 183, 184, 188} = 13 Using Progression 1;
+Transfinite Line {180, 179, 185, 184, 188} = 10 Using Progression 1;
+
+//+
+Transfinite Line {162, 166, 167, 163, 161, 165, 164, 168} = 11 Using Progression 1;
+//+
+Transfinite Line {159, 189} = 15 Using Progression 1;
+//+
+Transfinite Line {114, 190, 117, 191} = 31 Using Progression 1.04;
+
+
+////////////////////////////////////////////////////////////
+
+p1 = newp;
+
+Point (p1+  1)={  0.0000,  0.0000,  0.0000, 0.10};
+Point (p1+  2)={ -5.0000,  0.0000,  0.0000, 0.10};
+Point (p1+  3)={ -1.7101,  0.0000,  0.0000, 0.10};
+Point (p1+  4)={ -1.7101,  0.0000,  4.6985, 0.10};
+Point (p1+  5)={ -1.7101, -4.6985, -0.0000, 0.10};
+Point (p1+  6)={ -1.7101,  0.0000, -4.6985, 0.10};
+Point (p1+  7)={ -1.7101,  4.6985, -0.0000, 0.10};
+
+Point (p1+  8)={  5.8530,  0.0000,  0.0000, 0.10};
+Point (p1+  9)={ 12.8548,  0.0000,  0.0000, 0.10};
+Point (p1+ 10)={  3.4582,  0.0000,  0.0000, 0.10};
+Point (p1+ 11)={  3.4582,  0.0000,  6.5796, 0.10};
+Point (p1+ 12)={  3.4582, -6.5796, -0.0000, 0.10};
+Point (p1+ 13)={  3.4582,  0.0000, -6.5796, 0.10};
+Point (p1+ 14)={  3.4582,  6.5796, -0.0000, 0.10};
+
+ //////////////////////////
+
+  //////////////////////////
+
+ Rotate {{    0.0000,    0.0000,    1.0000},
+         {    0.0000,    0.0000,    0.0000},   -1.0472 } {
+ Point{p1+2, p1+3, p1+1, p1+7,p1+ 4,
+ p1+5, p1+6, p1+11,p1+ 14,p1+13,
+ p1+ 12,p1+ 10, p1+8, p1+9};}
+
+  //////////////////////////
+
+ Translate {    0.1484,    0.0281,    1.4885} {
+ Point{p1+1, p1+3, p1+2, p1+4, p1+5,
+ p1+6, p1+7, p1+10, p1+8, p1+9,
+p1+11, p1+12, p1+14, p1+13};}
+
+
+l1 = newreg;
+Circle(l1+1) = {p1+2, p1+1, p1+4};
+Circle(l1+2) = {p1+2, p1+1, p1+6};
+Circle(l1+3) = {p1+11, p1+8, p1+9};
+Circle(l1+4) = {p1+9, p1+8, p1+13};
+Line(l1+5) = {p1+4, p1+11};
+Line(l1+6) = {p1+6, p1+13};
+Line(l1+7) = {p1+5, p1+12};
+Line(l1+8) = {p1+7, p1+14};
+Circle(l1+9) = {p1+2, p1+1, p1+7};
+Circle(l1+10) = {p1+2, p1+1, p1+5};
+Circle(l1+11) = {p1+14, p1+8, p1+9};
+Circle(l1+12) = {p1+9, p1+8, p1+12};
+Circle(l1+13) = {p1+4, p1+3, p1+7};
+Circle(l1+14) = {p1+7, p1+3, p1+6};
+Circle(l1+15) = {p1+6, p1+3, p1+5};
+Circle(l1+16) = {p1+5, p1+3,p1+ 4};
+Circle(l1+17) = {p1+11,p1+10,p1+ 14};
+Circle(l1+18) = {p1+14,p1+ 10, p1+13};
+Circle(l1+19) = {p1+13,p1+ 10,p1+ 12};
+Circle(l1+20) = {p1+12, p1+10,p1+ 11};
+//+
+Line Loop(327) = {322, -307, 316};
+//+
+Ruled Surface(328) = {327};
+//+
+Line Loop(329) = {319, -315, 307};
+//+
+Ruled Surface(330) = {329};
+//+
+Line Loop(331) = {320, -308, 315};
+//+
+Ruled Surface(332) = {331};
+//+
+Line Loop(333) = {321, -316, 308};
+//+
+Ruled Surface(334) = {333};
+//+
+Line Loop(335) = {309, -317, -323};
+//+
+Ruled Surface(336) = {335};
+//+
+Line Loop(337) = {317, 310, -324};
+//+
+Ruled Surface(338) = {337};
+//+
+Line Loop(339) = {325, -318, 310};
+//+
+Ruled Surface(340) = {339};
+//+
+Line Loop(341) = {326, 309, 318};
+//+
+Ruled Surface(342) = {341};
+//+
+Line Loop(343) = {314, -323, -311, 319};
+//+
+Ruled Surface(344) = {343};
+//+
+Line Loop(345) = {320, 312, -324, -314};
+//+
+Ruled Surface(346) = {345};
+//+
+Line Loop(347) = {321, 313, -325, -312};
+//+
+Ruled Surface(348) = {347};
+//+
+Line Loop(349) = {326, -311, -322, 313};
+//+
+Ruled Surface(350) = {349};
+//+
+Transfinite Line {311, 314, 308, 313, 312} = 21 Using Progression 1.0;
+Transfinite Line {310, 318} = 19 Using Progression 0.90;
+Transfinite Line {317, 309} = 19 Using Progression 1.111;
+//+
+Transfinite Line {322, 319, 320, 321} = 21 Using Progression 1.0;
+Transfinite Line {325, 326, 323, 324} = 25 Using Progression 1.0;
+//+
+Transfinite Line {316, 308, 307, 315} = 13 Using Progression 0.90;
+//+
+Surface Loop(351) = {336, 342, 350, 344, 346, 332, 334, 348, 340, 338, 328, 330};
+//+
+Surface Loop(352) = {261, 267, 269, 271, 263, 265};
+//+
+Surface Loop(353) = {257, 249, 255, 259, 251, 253};
+//+
+Surface Loop(354) = {208, 200, 198, 204, 202, 206};
+//+
+Surface Loop(355) = {239, 245, 237, 247, 241, 243};
+//+
+Surface Loop(356) = {235, 227, 229, 225, 217, 219, 210, 221, 223, 233, 231};
+//+
+
+
+
+
+
+//+
+Delete {
+  Surface{225, 223, 221, 219, 217, 210};
+}
+//+
+Delete {
+  Line{133, 130, 212, 134, 137, 214, 136, 215, 135, 131, 132, 213};
+}
+//+
+Delete {
+  Point{74, 70, 61, 68, 72, 71, 67, 69, 73};
+}
+//+
+Delete {
+  Surface{235, 229, 231, 233};
+}
+//+
+Delete {
+  Line{129, 126, 127, 128};
+}
+//+
+Delete {
+  Line{142, 143, 144, 145};
+}
+//+
+Delete {
+  Point{58, 57, 60, 59};
+}
+//+
+Delete {
+  Point{61};
+}
+
+SyncModel;
+
+//Merge "thruster.geo";
+
+
+///////////////////////////////////////////////////////////////////////////////////////////
+//**** Definition of points
+
+p1 = newp;
+
+lref= 0.070;
+Point(p1+1) ={   1.1484,  -0.9719,   1.4885, lref};
+Point(p1+2) ={   1.1689,  -0.9528,   1.4885, lref};
+Point(p1+3) ={   1.1484,  -0.9719,   1.5165, lref};
+Point(p1+4) ={   1.1279,  -0.9910,   1.4885, lref};
+Point(p1+5) ={   1.1484,  -0.9719,   1.4605, lref};
+Point(p1+6) ={   1.1850,  -0.9378,   1.4885, lref};
+Point(p1+7) ={   1.1484,  -0.9719,   1.5385, lref};
+Point(p1+8) ={   1.1118,  -1.0060,   1.4885, lref};
+Point(p1+9) ={   1.1484,  -0.9719,   1.4385, lref};
+Point(p1+10) ={   1.1996,  -0.9242,   1.4885, lref};
+Point(p1+11) ={   1.1484,  -0.9719,   1.5585, lref};
+Point(p1+12) ={   1.0972,  -1.0196,   1.4885, lref};
+Point(p1+13) ={   1.1484,  -0.9719,   1.4185, lref};
+
+lref= 0.022;
+Point(p1+14) ={   1.6429,  -1.5022,   1.4885, lref};
+Point(p1+17) ={   1.8901,  -1.2716,   1.4885, lref};
+Point(p1+18) ={   1.6429,  -1.5022,   1.8266, lref};
+Point(p1+19) ={   1.3956,  -1.7328,   1.4885, lref};
+Point(p1+20) ={   1.6429,  -1.5022,   1.1504, lref};
+Point(p1+29) ={   1.6940,  -1.5570,   1.4885, lref};
+
+Point(p1+15) ={   1.5342,  -1.3856,   1.4885, lref};
+Point(p1+21) ={   1.9479,  -0.9998,   1.4885, lref};
+Point(p1+22) ={   1.5342,  -1.3856,   2.0542, lref};
+Point(p1+23) ={   1.1205,  -1.7714,   1.4885, lref};
+Point(p1+24) ={   1.5342,  -1.3856,   0.9228, lref};
+Point(p1+16) ={   1.4212,  -1.2644,   1.4885, lref};
+Point(p1+25) ={   1.9279,  -0.7920,   1.4885, lref};
+Point(p1+26) ={   1.4212,  -1.2644,   2.1813, lref};
+Point(p1+27) ={   0.9145,  -1.7369,   1.4885, lref};
+Point(p1+28) ={   1.4212,  -1.2644,   0.7957, lref};
+//**** Definition of lines
+
+line1 = newl;
+SyncModel;
+
+// archi thruster box
+
+Circle(line1+1) ={p1+  2,p1+  1,p1+  3};
+Circle(line1+5) ={p1+  6,p1+  1,p1+  7};
+Circle(line1+9) ={p1+ 10,p1+  1,p1+ 11};
+Circle(line1+2) ={p1+  3,p1+  1,p1+  4};
+Circle(line1+6) ={p1+  7,p1+  1,p1+  8};
+Circle(line1+10) ={p1+ 11,p1+  1,p1+ 12};
+Circle(line1+3) ={p1+  4,p1+  1,p1+  5};
+Circle(line1+7) ={p1+  8,p1+  1,p1+  9};
+Circle(line1+11) ={p1+ 12,p1+  1,p1+ 13};
+Circle(line1+4) ={p1+  5,p1+  1,p1+  2};
+Circle(line1+8) ={p1+  9,p1+  1,p1+  6};
+Circle(line1+12) ={p1+ 13,p1+  1,p1+ 10};
+
+Circle(line1+13) ={p1+ 17,p1+ 14,p1+ 18};
+Circle(line1+14) ={p1+ 18,p1+ 14,p1+ 19};
+Circle(line1+15) ={p1+ 19,p1+ 14,p1+ 20};
+Circle(line1+16) ={p1+ 20,p1+ 14,p1+ 17};
+
+// radial lines thruster exit plane
+
+Line(line1+25) ={p1+  2,p1+  6};
+Line(line1+26) ={p1+  6,p1+ 10};
+Line(line1+27) ={p1+  3,p1+  7};
+Line(line1+28) ={p1+  7,p1+ 11};
+Line(line1+29) ={p1+  4,p1+  8};
+Line(line1+30) ={p1+  8,p1+ 12};
+Line(line1+31) ={p1+  5,p1+  9};
+Line(line1+32) ={p1+  9,p1+ 13};
+
+//arcs  auxiliary
+
+Circle(line1+35) ={p1+ 20,p1+  1,p1+ 29};
+Circle(line1+36) ={p1+ 29,p1+  1,p1+ 18};
+Circle(line1+41) ={p1+ 19,p1+  1,p1+ 29};
+Circle(line1+42) ={p1+ 29,p1+  1,p1+ 17};
+
+// longitudinal lines
+
+Line(line1+48) ={p1+  1,p1+ 29};
+Line(line1+55) ={p1+  2,p1+ 17};
+Line(line1+49) ={p1+  3,p1+ 18};
+Line(line1+54) ={p1+  4,p1+ 19};
+Line(line1+47) ={p1+  5,p1+ 20};
+
+// radial lines thruster
+
+Line(line1+58) ={p1+  1,p1+  2};
+Line(line1+59) ={p1+  1,p1+  3};
+Line(line1+60) ={p1+  1,p1+  4};
+Line(line1+61) ={p1+  1,p1+  5};
+
+// Surfaces
+
+s1 = news;
+
+// thruster inner and outer faces
+
+Line Loop(s1+1) = {line1+1, -line1-59, line1+58};
+Plane Surface(s1+2) = {s1+1};
+Line Loop(s1+3) = {line1+2, -line1-60, line1+59};
+Plane Surface(s1+4) = {s1+3};
+Line Loop(s1+5) = {line1+3, -line1-61, line1+60};
+Plane Surface(s1+6) = {s1+5};
+Line Loop(s1+7) = {line1+4, -line1-58, line1+61};
+Plane Surface(s1+8) = {s1+7};
+Line Loop(s1+9) = {line1+10, -line1-30,-line1-6,line1+28};
+Plane Surface(s1+10) = {s1+9};
+Line Loop(s1+11) = {line1+11, -line1-32,-line1-7,line1+30};
+Plane Surface(s1+12) = {s1+11};
+Line Loop(s1+13) = {line1+12, -line1-26,-line1-8,line1+32};
+Plane Surface(s1+14) = {s1+13};
+Line Loop(s1+15) = {line1+9, -line1-28,-line1-5,line1+26};
+Plane Surface(s1+16) = {s1+15};
+
+// thruster exit plane
+
+Line Loop(s1+17) = {line1+6, -line1-29,-line1-2, line1+27};
+Plane Surface(s1+18) = {s1+17};
+Line Loop(s1+19) = {line1+29, line1+7,-line1-31, -line1-3};
+Plane Surface(s1+20) = {s1+19};
+Line Loop(s1+21) = {line1+8, -line1-25,-line1-4, line1+31};
+Plane Surface(s1+22) = {s1+21};
+Line Loop(s1+23) = {line1+5, -line1-27,-line1-1, line1+25};
+Plane Surface(s1+24) = {s1+23};
+
+Transfinite Line {line1+2, line1+1, line1+4, line1+3}     = 9
+          Using Progression 1; // thruster inner circle
+Transfinite Line {line1+6, line1+5, line1+8, line1+7}     = 11
+          Using Progression 1; // thruster outer circle
+Transfinite Line {line1+10, line1+9, line1+12, line1+11}  = 11
+          Using Progression 1; // thruster box out circle
+Transfinite Line {line1+26, line1+28, line1+30,line1+32} = 3
+         Using Progression 1; // radial thruster exit plane
+Transfinite Line {line1+25, line1+27, line1+29, line1+31} = 4
+          Using Progression 1; // radial outer
+Transfinite Line {line1+58, line1+59, line1+60, line1+61} = 4
+          Using Progression 1; // radial inner
+
+// auxiliary inner layer
+
+Line Loop(s1+25) = {line1+48, line1+36, -line1-49, -line1-59};
+Plane Surface(s1+26) = {s1+25};
+Line Loop(s1+27) = {line1+48, -line1-41, -line1-54, -line1-60};
+Plane Surface(s1+28) = {s1+27};
+Line Loop(s1+29) = {line1+48, -line1-35, -line1-47, -line1-61};
+Plane Surface(s1+30) = {s1+29};
+Line Loop(s1+31) = {line1+48, line1+42, -line1-55, -line1-58};
+Plane Surface(s1+32) = {s1+31};
+Line Loop(s1+33) = {line1+14, -line1-54, -line1-2, line1+49};
+Ruled Surface(s1+34) = {s1+33};
+Line Loop(s1+35) = {line1+15, -line1-47, -line1-3, line1+54};
+Ruled Surface(s1+36) = {s1+35};
+Line Loop(s1+37) = {line1+16, -line1-55, -line1-4, line1+47};
+Ruled Surface(s1+38) = {s1+37};
+Line Loop(s1+39) = {line1+13, -line1-49, -line1-1, line1+55};
+Ruled Surface(s1+40) = {s1+39};
+
+Transfinite Line {line1+48,line1+49,line1+47,line1+54,line1+55} = 25
+            Using Progression 1.1;
+Transfinite Line {line1+36, line1+41, line1+42, line1+35} = 8
+            Using Progression 1.0;
+Transfinite Line {line1+14, line1+13, line1+15, line1+16} = 12
+            Using Progression 1.0;
+
+// EMBED SURFACES //
+//Surface {s1+26,s1+28,s1+30,s1+32,s1+34,s1+36,s1+38,s1+40} In Volume {};
+
+
+// auxiliary intermediate layer
+
+Circle(line1+17) ={p1+ 21,p1+ 15,p1+ 22};
+Circle(line1+18) ={p1+ 22,p1+ 15,p1+ 23};
+Circle(line1+19) ={p1+ 23,p1+ 15,p1+ 24};
+Circle(line1+20) ={p1+ 24,p1+ 15,p1+ 21};
+
+Circle(line1+34) ={p1+ 24,p1+  1,p1+ 20};
+Circle(line1+37) ={p1+ 18,p1+  1,p1+ 22};
+Circle(line1+40) ={p1+ 23,p1+  1,p1+ 19};
+Circle(line1+43) ={p1+ 17,p1+  1,p1+ 21};
+
+Line(line1+56) ={p1+  6,p1+ 21};
+Line(line1+50) ={p1+  7,p1+ 22};
+Line(line1+53) ={p1+  8,p1+ 23};
+Line(line1+46) ={p1+  9,p1+ 24};
+
+Line Loop(s1+41) = {line1+37, -line1-50, -line1-27, line1+49};
+Plane Surface(s1+42) = {s1+41};
+Line Loop(s1+43) = {line1+40, -line1-54, line1+29, line1+53};
+Plane Surface(s1+44) = {s1+43};
+Line Loop(s1+45) = {line1+34, -line1-47, line1+31, line1+46};
+Plane Surface(s1+46) = {s1+45};
+Line Loop(s1+47) = {line1+43, -line1-56, -line1-25, line1+55};
+Plane Surface(s1+48) = {s1+47};
+Line Loop(s1+49) = {line1+18, -line1-53, -line1-6, line1+50};
+Ruled Surface(s1+50) = {s1+49};
+Line Loop(s1+51) = {line1+19, -line1-46, -line1-7, line1+53};
+Ruled Surface(s1+52) = {s1+51};
+Line Loop(s1+53) = {line1+20, -line1-56, -line1-8, line1+46};
+Ruled Surface(s1+54) = {s1+53};
+Line Loop(s1+55) = {line1+17, -line1-50, -line1-5, line1+56};
+Ruled Surface(s1+56) = {s1+55};
+
+Transfinite Line {line1+53, line1+50, line1+56, line1+46} = 25
+            Using Progression 1.1;
+Transfinite Line {line1+37, line1+40, line1+34, line1+43} = 6
+            Using Progression 1.0;
+Transfinite Line {line1+18, line1+19, line1+20, line1+17} = 19
+            Using Progression 1.1;
+
+// EMBED SURFACES //
+//Surface {s1+42,s1+44,s1+46,s1+48,s1+50,s1+52,s1+54,s1+56} In Volume {};
+
+// auxiliary external layer
+
+Circle(line1+21) ={p1+ 25,p1+ 16,p1+ 26};
+Circle(line1+22) ={p1+ 26,p1+ 16,p1+ 27};
+Circle(line1+23) ={p1+ 27,p1+ 16,p1+ 28};
+Circle(line1+24) ={p1+ 28,p1+ 16,p1+ 25};
+
+Circle(line1+33) ={p1+ 28,p1+  1,p1+ 24};
+Circle(line1+38) ={p1+ 22,p1+  1,p1+ 26};
+Circle(line1+39) ={p1+ 27,p1+  1,p1+ 23};
+Circle(line1+44) ={p1+ 21,p1+  1,p1+ 25};
+
+Line(line1+57) ={p1+ 10,p1+ 25};
+Line(line1+51) ={p1+ 11,p1+ 26};
+Line(line1+52) ={p1+ 12,p1+ 27};
+Line(line1+45) ={p1+ 13,p1+ 28};
+
+Line Loop(s1+57) = {line1+38, -line1-51, -line1-28, line1+50};
+Plane Surface(s1+58) = {s1+57};
+Line Loop(s1+59) = {line1+39, -line1-53, line1+30, line1+52};
+Plane Surface(s1+60) = {s1+59};
+Line Loop(s1+61) = {line1+33, -line1-46, line1+32, line1+45};
+Plane Surface(s1+62) = {s1+61};
+Line Loop(s1+63) = {line1+44, -line1-57, -line1-26, line1+56};
+Plane Surface(s1+64) = {s1+63};
+Line Loop(s1+65) = {line1+22, -line1-52, -line1-10, line1+51};
+Ruled Surface(s1+66) = {s1+65};
+Line Loop(s1+67) = {line1+23, -line1-45, -line1-11, line1+52};
+Ruled Surface(s1+68) = {s1+67};
+Line Loop(s1+69) = {line1+24, -line1-57, -line1-12, line1+45};
+Ruled Surface(s1+70) = {s1+69};
+Line Loop(s1+71) = {line1+21, -line1-51, -line1-9, line1+57};
+Ruled Surface(s1+72) = {s1+71};
+
+Transfinite Line {line1+51, line1+52, line1+45, line1+57} = 25
+            Using Progression 1.1;
+Transfinite Line {line1+22, line1+21, line1+24, line1+23} = 23
+            Using Progression 1.0;
+Transfinite Line {line1+44, line1+38, line1+39, line1+33} = 5
+            Using Progression 1.0;
+
+////////////////////////////////////////////////////////////////////////////////////////////
+
+//+
+Line(492) = {111, 63};
+//+
+Line(493) = {112, 64};
+//+
+Line(494) = {113, 65};
+//+
+Line(495) = {110, 62};
+//+
+Line Loop(496) = {367, 493, 141, -492};
+//+
+Ruled Surface(497) = {496};
+//+
+Line Loop(498) = {368, 494, 140, -493};
+//+
+Ruled Surface(499) = {498};
+//+
+Line Loop(500) = {369, 495, 139, -494};
+//+
+Ruled Surface(501) = {500};
+//+
+Line Loop(502) = {366, 492, 138, -495};
+//+
+Ruled Surface(503) = {502};
+//+
+Transfinite Line {492, 493, 494, 495} = 5 Using Progression 1.0;
+//+
+Surface Loop(504) = {497, 499, 501, 503, 227, 435, 429, 431, 433, 441, 443, 437, 439, 425, 427, 421, 423};
+//+
+Volume(505) = {351, 352, 353, 354, 355, 504};
+
+SyncModel;
+
+// EMBED SURFACES //
+Surface {s1+26,s1+28,s1+30,s1+32,s1+34,s1+36,s1+38,s1+40} In Volume {505};
+Surface {s1+42,s1+44,s1+46,s1+48,s1+50,s1+52,s1+54,s1+56} In Volume {505};
+Surface {s1+58,s1+60,s1+62,s1+64,s1+66,s1+68,s1+70,s1+72} In Volume {505};
+
+//Printf ("%f",s1);
+
+//+
+Physical Surface(310) = {437, 443, 439, 441};
+Physical Surface(304) += {421,423,425,427};
+Physical Surface(304) += {429,431,433,435};
+Physical Surface(304) += {497,499,501,503};
+//+
+Physical Volume("310") = {505};
+//+
+Physical Surface("320") = {328, 332, 334, 330, 344, 350, 348, 346, 338, 340, 342, 336};
+//+
+
+If(1)
+Rotate {{0, 0, 1}, {1.8775, -3, 1.4885}, -0.5235987} {
+  Point{87, 89, 92, 90, 91, 96, 99, 98, 97, 94, 93, 95, 88, 86};
+}
+Translate {-1.0, 0.0, 0.0} {
+  Point{87, 89, 92, 90, 91, 96, 99, 98, 97, 94, 93, 95, 88, 86};
+}
+EndIf
+
+Surface {477} In Volume {505};
+
+//+
+Physical Surface(340) = {237, 239, 247, 245, 241, 243};
+//+
+
+//+
+Transfinite Line {118, 121, 120, 119} = 12 Using Progression 1;
+//+
+Transfinite Line {122, 125, 124, 123} = 10 Using Progression 1;
+//+
+Transfinite Line {375, 374, 377, 376} = 17 Using Progression 1;
+//+
+Transfinite Line {379, 378, 381, 380} = 20 Using Progression 1;
+
+//+
+Show "*";
+//+