]> SALOME platform Git repositories - tools/medcoupling.git/commitdiff
Salome HOME
[EDF20947] : Addition of PENTA18 geo type into GaussInfo class
authorAnthony Geay <anthony.geay@edf.fr>
Thu, 5 Mar 2020 14:35:31 +0000 (15:35 +0100)
committerAnthony Geay <anthony.geay@edf.fr>
Thu, 5 Mar 2020 14:35:31 +0000 (15:35 +0100)
src/INTERP_KERNEL/GaussPoints/InterpKernelGaussCoords.cxx
src/INTERP_KERNEL/GaussPoints/InterpKernelGaussCoords.hxx

index 42adbc54c61b4177edbfad1bb243cfdd888966b1..86cc7b2ca5b2ca15bb6f6966f27698236a277e5f 100644 (file)
@@ -78,6 +78,10 @@ const double GaussInfo::PENTA15A_REF[45]={-1.0, 1.0, 0.0, -1.0, -0.0, 1.0, -1.0,
 
 const double GaussInfo::PENTA15B_REF[45]={-1.0, 1.0, 0.0, -1.0, 0.0, 0.0, -1.0, -0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, -1.0, 0.5, 0.0, -1.0, 0.0, 0.5, -1.0, 0.5, 0.5, 1.0, 0.5, 0.0, 1.0, 0.0, 0.5, 1.0, 0.5, 0.5, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0};
 
+const double GaussInfo::PENTA18A_REF[54]={-1.0, 1.0, 0.0, -1.0, -0.0, 1.0, -1.0, 0.0, 0.0, 1.0, 1.0, 0.0, 1.0, 0.0, 1.0, 1.0, 0.0, 0.0, -1.0, 0.5, 0.5, -1.0, 0.0, 0.5, -1.0, 0.5, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.5, 0.5, 1.0, 0.0, 0.5, 1.0, 0.5, 0.0, 0.0, 0.5, 0.5, 0.0, 0.0, 0.5, 0.0, 0.5, 0.0};
+
+const double GaussInfo::PENTA18B_REF[54]={-1.0, 1.0, 0.0, -1.0, 0.0, 0.0, -1.0, -0.0, 1.0, 1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 1.0, 0.0, 1.0, -1.0, 0.5, 0.0, -1.0, 0.0, 0.5, -1.0, 0.5, 0.5, 1.0, 0.5, 0.0, 1.0, 0.0, 0.5, 1.0, 0.5, 0.5, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.5, 0.0, 0.0, 0.0, 0.5, 0.0, 0.5, 0.5};
+
 const double GaussInfo::HEXA8A_REF[24]={-1.0, -1.0, -1.0, 1.0, -1.0, -1.0, 1.0, 1.0, -1.0, -1.0, 1.0, -1.0, -1.0, -1.0, 1.0, 1.0, -1.0, 1.0, 1.0, 1.0, 1.0, -1.0, 1.0, 1.0};
 
 const double GaussInfo::HEXA8B_REF[24]={-1.0, -1.0, -1.0, -1.0, 1.0, -1.0, 1.0, 1.0, -1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, -1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, -1.0, 1.0};
@@ -328,6 +332,21 @@ GaussInfo GaussInfo::convertToLinear() const
           }
         throw INTERP_KERNEL::Exception("GaussInfo::convertToLinear : not recognized pattern for PENTA15 !");
       }
+    case NORM_PENTA18:
+      {
+        std::vector<double> a(PENTA18A_REF,PENTA18A_REF+54),b(PENTA18B_REF,PENTA18B_REF+54);
+        if(IsSatisfy(a,_my_reference_coord))
+          {
+            std::vector<double> c(PENTA6A_REF,PENTA6A_REF+18);
+            return GaussInfo(NORM_PENTA6,_my_gauss_coord,getNbGauss(),c,6);
+          }
+        if(IsSatisfy(b,_my_reference_coord))
+          {
+            std::vector<double> c(PENTA6B_REF,PENTA6B_REF+18);
+            return GaussInfo(NORM_PENTA6,_my_gauss_coord,getNbGauss(),c,6);
+          }
+        throw INTERP_KERNEL::Exception("GaussInfo::convertToLinear : not recognized pattern for PENTA18 !");
+      }
     case NORM_HEXA20:
       {
         std::vector<double> a(HEXA20A_REF,HEXA20A_REF+60),b(HEXA20B_REF,HEXA20B_REF+60);
@@ -647,6 +666,21 @@ void GaussInfo::initLocalInfo()
         break;
       }
 
+    case NORM_PENTA18:
+      {
+        _my_local_ref_dim = 3;
+        _my_local_nb_ref  = 18;
+        MapToShapeFunction PENTA18PTR[]={Penta18aInit,Penta18bInit};
+        std::size_t NB_OF_PENTA18PTR(sizeof(PENTA18PTR)/sizeof(MapToShapeFunction));
+        for(std::size_t i=0;i<NB_OF_PENTA18PTR && !aSatify;i++)
+          {
+            (PENTA18PTR[i])(*this);
+            aSatify = isSatisfy();
+          }
+        CHECK_MACRO;
+        break;
+      }
+
     case NORM_HEXA8:
       {
         _my_local_ref_dim = 3;
@@ -2153,6 +2187,250 @@ void GaussInfo::penta15bInit()
   SHAPE_FUN_MACRO_END;
 }
 
+void GaussInfo::penta18aInit() 
+{
+  LOCAL_COORD_MACRO_BEGIN;
+  case 0:
+    coords[0] = PENTA18A_REF[0];
+    coords[1] = PENTA18A_REF[1];
+    coords[2] = PENTA18A_REF[2];
+    break;
+  case 1:
+    coords[0] = PENTA18A_REF[3];
+    coords[1] = PENTA18A_REF[4];
+    coords[2] = PENTA18A_REF[5];
+    break;
+  case 2:
+    coords[0] = PENTA18A_REF[6];
+    coords[1] = PENTA18A_REF[7];
+    coords[2] = PENTA18A_REF[8];
+    break;
+  case 3:
+    coords[0] = PENTA18A_REF[9];
+    coords[1] = PENTA18A_REF[10];
+    coords[2] = PENTA18A_REF[11];
+    break;
+  case 4:
+    coords[0] = PENTA18A_REF[12];
+    coords[1] = PENTA18A_REF[13];
+    coords[2] = PENTA18A_REF[14];
+    break;
+  case 5:
+    coords[0] = PENTA18A_REF[15];
+    coords[1] = PENTA18A_REF[16];
+    coords[2] = PENTA18A_REF[17];
+    break;
+  case 6:
+    coords[0] = PENTA18A_REF[18];
+    coords[1] = PENTA18A_REF[19];
+    coords[2] = PENTA18A_REF[20];
+    break;
+  case 7:
+    coords[0] = PENTA18A_REF[21];
+    coords[1] = PENTA18A_REF[22];
+    coords[2] = PENTA18A_REF[23];
+    break;
+  case 8:
+    coords[0] = PENTA18A_REF[24];
+    coords[1] = PENTA18A_REF[25];
+    coords[2] = PENTA18A_REF[26];
+    break;
+  case 9:
+    coords[0] = PENTA18A_REF[27];
+    coords[1] = PENTA18A_REF[28];
+    coords[2] = PENTA18A_REF[29];
+    break;
+  case 10:
+    coords[0] = PENTA18A_REF[30];
+    coords[1] = PENTA18A_REF[31];
+    coords[2] = PENTA18A_REF[32];
+    break;
+  case 11:
+    coords[0] = PENTA18A_REF[33];
+    coords[1] = PENTA18A_REF[34];
+    coords[2] = PENTA18A_REF[35];
+    break;
+  case 12:
+    coords[0] = PENTA18A_REF[36];
+    coords[1] = PENTA18A_REF[37];
+    coords[2] = PENTA18A_REF[38];
+    break;
+  case 13:
+    coords[0] = PENTA18A_REF[39];
+    coords[1] = PENTA18A_REF[40];
+    coords[2] = PENTA18A_REF[41];
+    break;
+  case 14:
+    coords[0] = PENTA18A_REF[42];
+    coords[1] = PENTA18A_REF[43];
+    coords[2] = PENTA18A_REF[44];
+    break;
+  case 15:
+    coords[0] = PENTA18A_REF[45];
+    coords[1] = PENTA18A_REF[46];
+    coords[2] = PENTA18A_REF[47];
+    break;
+  case 16:
+    coords[0] = PENTA18A_REF[48];
+    coords[1] = PENTA18A_REF[49];
+    coords[2] = PENTA18A_REF[50];
+    break;
+  case 17:
+    coords[0] = PENTA18A_REF[51];
+    coords[1] = PENTA18A_REF[52];
+    coords[2] = PENTA18A_REF[53];
+    break;
+  LOCAL_COORD_MACRO_END;
+  
+  SHAPE_FUN_MACRO_BEGIN;
+  funValue[0] = 0.5*gc[1]*(1.0 - gc[0])*(2.0*gc[1] - 2.0 - gc[0]);
+  funValue[1] = 0.5*gc[2]*(1.0 - gc[0])*(2.0*gc[2] - 2.0 - gc[0]);
+  funValue[2] = 0.5*(gc[0] - 1.0)*(1.0 - gc[1] - gc[2])*(gc[0] + 2.0*gc[1] + 2.0*gc[2]);
+  
+  funValue[3] = 0.5*gc[1]*(1.0 + gc[0])*(2.0*gc[1] - 2.0 + gc[0]);
+  funValue[4] = 0.5*gc[2]*(1.0 + gc[0])*(2.0*gc[2] - 2.0 + gc[0]);
+  funValue[5] = 0.5*(-gc[0] - 1.0)*(1.0 - gc[1] - gc[2])*(-gc[0] + 2.0*gc[1] + 2.0*gc[2]);
+  
+  funValue[6] = 2.0*gc[1]*gc[2]*(1.0 - gc[0]);
+  funValue[7] = 2.0*gc[2]*(1.0 - gc[1] - gc[2])*(1.0 - gc[0]);
+  funValue[8] = 2.0*gc[1]*(1.0 - gc[1] - gc[2])*(1.0 - gc[0]);
+  
+  funValue[9] = gc[1]*(1.0 - gc[0]*gc[0]);
+  funValue[10] = gc[2]*(1.0 - gc[0]*gc[0]);
+  funValue[11] = (1.0 - gc[1] - gc[2])*(1.0 - gc[0]*gc[0]);
+  
+  funValue[12] = 2.0*gc[1]*gc[2]*(1.0 + gc[0]);
+  funValue[13] = 2.0*gc[2]*(1.0 - gc[1] - gc[2])*(1.0 + gc[0]);
+  funValue[14] = 2.0*gc[1]*(1.0 - gc[1] - gc[2])*(1.0 + gc[0]);
+  
+  funValue[15] = 4.0*gc[1]*gc[2]*(1.0 - gc[0] * gc[0]);
+  funValue[16] = 4.0*gc[2]*(gc[0] * gc[0] - 1) * ( gc[2] + gc[1] - 1);
+  funValue[17] = 4.0*gc[1]*(gc[0] * gc[0] - 1) * ( gc[2] + gc[1] - 1);
+  SHAPE_FUN_MACRO_END;
+}
+
+void GaussInfo::penta18bInit() 
+{
+  LOCAL_COORD_MACRO_BEGIN;
+  case 0:
+    coords[0] = PENTA18B_REF[0];
+    coords[1] = PENTA18B_REF[1];
+    coords[2] = PENTA18B_REF[2];
+    break;
+  case 1:
+    coords[0] = PENTA18B_REF[3];
+    coords[1] = PENTA18B_REF[4];
+    coords[2] = PENTA18B_REF[5];
+    break;
+  case 2:
+    coords[0] = PENTA18B_REF[6];
+    coords[1] = PENTA18B_REF[7];
+    coords[2] = PENTA18B_REF[8];
+    break;
+  case 3:
+    coords[0] = PENTA18B_REF[9];
+    coords[1] = PENTA18B_REF[10];
+    coords[2] = PENTA18B_REF[11];
+    break;
+  case 4:
+    coords[0] = PENTA18B_REF[12];
+    coords[1] = PENTA18B_REF[13];
+    coords[2] = PENTA18B_REF[14];
+    break;
+  case 5:
+    coords[0] = PENTA18B_REF[15];
+    coords[1] = PENTA18B_REF[16];
+    coords[2] = PENTA18B_REF[17];
+    break;
+  case 6:
+    coords[0] = PENTA18B_REF[18];
+    coords[1] = PENTA18B_REF[19];
+    coords[2] = PENTA18B_REF[20];
+    break;
+  case 7:
+    coords[0] = PENTA18B_REF[21];
+    coords[1] = PENTA18B_REF[22];
+    coords[2] = PENTA18B_REF[23];
+    break;
+  case 8:
+    coords[0] = PENTA18B_REF[24];
+    coords[1] = PENTA18B_REF[25];
+    coords[2] = PENTA18B_REF[26];
+    break;
+  case 9:
+    coords[0] = PENTA18B_REF[27];
+    coords[1] = PENTA18B_REF[28];
+    coords[2] = PENTA18B_REF[29];
+    break;
+  case 10:
+    coords[0] = PENTA18B_REF[30];
+    coords[1] = PENTA18B_REF[31];
+    coords[2] = PENTA18B_REF[32];
+    break;
+  case 11:
+    coords[0] = PENTA18B_REF[33];
+    coords[1] = PENTA18B_REF[34];
+    coords[2] = PENTA18B_REF[35];
+    break;
+  case 12:
+    coords[0] = PENTA18B_REF[36];
+    coords[1] = PENTA18B_REF[37];
+    coords[2] = PENTA18B_REF[38];
+    break;
+  case 13:
+    coords[0] = PENTA18B_REF[39];
+    coords[1] = PENTA18B_REF[40];
+    coords[2] = PENTA18B_REF[41];
+    break;
+  case 14:
+    coords[0] = PENTA18B_REF[42];
+    coords[1] = PENTA18B_REF[43];
+    coords[2] = PENTA18B_REF[44];
+    break;
+  case 15:
+    coords[0] = PENTA18B_REF[45];
+    coords[1] = PENTA18B_REF[46];
+    coords[2] = PENTA18B_REF[47];
+    break;
+  case 16:
+    coords[0] = PENTA18B_REF[48];
+    coords[1] = PENTA18B_REF[49];
+    coords[2] = PENTA18B_REF[50];
+    break;
+  case 17:
+    coords[0] = PENTA18B_REF[51];
+    coords[1] = PENTA18B_REF[52];
+    coords[2] = PENTA18B_REF[53];
+    break;
+  LOCAL_COORD_MACRO_END;
+  
+  SHAPE_FUN_MACRO_BEGIN;
+  funValue[0] = 0.5*gc[1]*(1.0 - gc[0])*(2.0*gc[1] - 2.0 - gc[0]);
+  funValue[2] = 0.5*gc[2]*(1.0 - gc[0])*(2.0*gc[2] - 2.0 - gc[0]);
+  funValue[1] = 0.5*(gc[0] - 1.0)*(1.0 - gc[1] - gc[2])*(gc[0] + 2.0*gc[1] + 2.0*gc[2]);
+  
+  funValue[3] = 0.5*gc[1]*(1.0 + gc[0])*(2.0*gc[1] - 2.0 + gc[0]);
+  funValue[5] = 0.5*gc[2]*(1.0 + gc[0])*(2.0*gc[2] - 2.0 + gc[0]);
+  funValue[4] = 0.5*(-gc[0] - 1.0)*(1.0 - gc[1] - gc[2])*(-gc[0] + 2.0*gc[1] + 2.0*gc[2]);
+  
+  funValue[8] = 2.0*gc[1]*gc[2]*(1.0 - gc[0]);
+  funValue[7] = 2.0*gc[2]*(1.0 - gc[1] - gc[2])*(1.0 - gc[0]);
+  funValue[6] = 2.0*gc[1]*(1.0 - gc[1] - gc[2])*(1.0 - gc[0]);
+  
+  funValue[12] = gc[1]*(1.0 - gc[0]*gc[0]);
+  funValue[14] = gc[2]*(1.0 - gc[0]*gc[0]);
+  funValue[13] = (1.0 - gc[1] - gc[2])*(1.0 - gc[0]*gc[0]);
+  
+  funValue[11] = 2.0*gc[1]*gc[2]*(1.0 + gc[0]);
+  funValue[10] = 2.0*gc[2]*(1.0 - gc[1] - gc[2])*(1.0 + gc[0]);
+  funValue[9]  = 2.0*gc[1]*(1.0 - gc[1] - gc[2])*(1.0 + gc[0]);
+  
+  funValue[17] = 4.0*gc[1]*gc[2]*(1.0 - gc[0] * gc[0]);
+  funValue[16] = 4.0*gc[2]*(gc[0] * gc[0] - 1) * ( gc[2] + gc[1] - 1);
+  funValue[15] = 4.0*gc[1]*(gc[0] * gc[0] - 1) * ( gc[2] + gc[1] - 1);
+  SHAPE_FUN_MACRO_END;
+}
+
 /*!
  * Init Hehahedron Reference coordinates and Shape function.
  * Case A.
index 70195f701b8c2244e1e1e6b516f9c9b3cce4df66..31c9595b3db2eddd96d6a351cb03327845893bf5 100644 (file)
@@ -89,6 +89,8 @@ namespace INTERP_KERNEL
     static const double PENTA6B_REF[18];
     static const double PENTA15A_REF[45];
     static const double PENTA15B_REF[45];
+    static const double PENTA18A_REF[54];
+    static const double PENTA18B_REF[54];
     static const double HEXA8A_REF[24];
     static const double HEXA8B_REF[24];
     static const double HEXA20A_REF[60];
@@ -148,6 +150,10 @@ namespace INTERP_KERNEL
     static void Penta15aInit(GaussInfo& obj) { obj.penta15aInit(); }
     void penta15bInit();
     static void Penta15bInit(GaussInfo& obj) { obj.penta15bInit(); }
+    void penta18aInit();
+    static void Penta18aInit(GaussInfo& obj) { obj.penta18aInit(); }
+    void penta18bInit();
+    static void Penta18bInit(GaussInfo& obj) { obj.penta18bInit(); }
 
     void hexa8aInit();
     static void Hexa8aInit(GaussInfo& obj) { obj.hexa8aInit(); }