From 2869ee574bd11c63af6961de8ee042c1758dee9f Mon Sep 17 00:00:00 2001
From: Amaury Johnan <amjohnen@gmail.com>
Date: Sun, 16 Jun 2013 09:19:05 +0000
Subject: [PATCH] add dimensionFromTag & SerendipityFromTag

---
 Geo/MElement.cpp | 194 +++++++++++++++++++++++++++++++++++++++++++++++
 Geo/MElement.h   |   3 +-
 2 files changed, 196 insertions(+), 1 deletion(-)

diff --git a/Geo/MElement.cpp b/Geo/MElement.cpp
index 2d7976a55c..b36035c023 100644
--- a/Geo/MElement.cpp
+++ b/Geo/MElement.cpp
@@ -1585,6 +1585,7 @@ int MElement::OrderFromTag(int tag)
   case MSH_HEX_296 : return 7;
   case MSH_HEX_386 : return 8;
   case MSH_HEX_488 : return 9;
+  case MSH_PYR_1   : return 0;
   case MSH_PYR_5   : return 1;
   case MSH_PYR_14  : return 2;
   case MSH_PYR_30  : return 3;
@@ -1609,6 +1610,199 @@ int MElement::OrderFromTag(int tag)
 
 }
 
+// Gives > 0 if element type is in Serendipity Family.
+// Gives < 2 if element type is in Not Serendipity Family.
+int MElement::SerendipityFromTag(int tag)
+{
+  switch (tag) {
+  case MSH_PNT     : case MSH_LIN_1   :
+  case MSH_LIN_2   : case MSH_LIN_3   :
+  case MSH_LIN_4   : case MSH_LIN_5   :
+  case MSH_LIN_6   : case MSH_LIN_7   :
+  case MSH_LIN_8   : case MSH_LIN_9   :
+  case MSH_LIN_10  : case MSH_LIN_11  :
+
+  case MSH_TRI_1   : case MSH_TRI_3   :
+  case MSH_TRI_6   :
+
+  case MSH_QUA_1   : case MSH_QUA_4   :
+
+  case MSH_TET_1   : case MSH_TET_4   :
+  case MSH_TET_10  : case MSH_TET_20  :
+
+  case MSH_PRI_1   : case MSH_PRI_6   :
+
+  case MSH_HEX_1   : case MSH_HEX_8   :
+
+  case MSH_PYR_1   : case MSH_PYR_5   :
+
+    return 1; // Serendipity or not
+
+
+  case MSH_TRI_10  : case MSH_TRI_15  :
+  case MSH_TRI_21  : case MSH_TRI_28  :
+  case MSH_TRI_36  : case MSH_TRI_45  :
+  case MSH_TRI_55  : case MSH_TRI_66  :
+
+  case MSH_QUA_9   : case MSH_QUA_16  :
+  case MSH_QUA_25  : case MSH_QUA_36  :
+  case MSH_QUA_49  : case MSH_QUA_64  :
+  case MSH_QUA_81  : case MSH_QUA_100 :
+  case MSH_QUA_121 :
+
+  case MSH_TET_35  : case MSH_TET_56  :
+  case MSH_TET_84  : case MSH_TET_120 :
+  case MSH_TET_165 : case MSH_TET_220 :
+  case MSH_TET_286 :
+
+  case MSH_PRI_18  : case MSH_PRI_40  :
+  case MSH_PRI_75  : case MSH_PRI_126 :
+  case MSH_PRI_196 : case MSH_PRI_288 :
+  case MSH_PRI_405 : case MSH_PRI_550 :
+
+  case MSH_HEX_27  : case MSH_HEX_64  :
+  case MSH_HEX_125 : case MSH_HEX_216 :
+  case MSH_HEX_343 : case MSH_HEX_512 :
+  case MSH_HEX_729 : case MSH_HEX_1000:
+
+  case MSH_PYR_14  : case MSH_PYR_30  :
+  case MSH_PYR_55  : case MSH_PYR_91  :
+  case MSH_PYR_140 : case MSH_PYR_204 :
+  case MSH_PYR_285 : case MSH_PYR_385 :
+
+    return 0; // Not Serendipity
+
+
+  case MSH_TRI_9   : case MSH_TRI_12  :
+  case MSH_TRI_15I : case MSH_TRI_18  :
+  case MSH_TRI_21I : case MSH_TRI_24  :
+  case MSH_TRI_27  : case MSH_TRI_30  :
+
+  case MSH_QUA_8   : case MSH_QUA_12  :
+  case MSH_QUA_16I : case MSH_QUA_20  :
+  case MSH_QUA_24  : case MSH_QUA_28  :
+  case MSH_QUA_32  : case MSH_QUA_36I :
+  case MSH_QUA_40  :
+
+  case MSH_TET_34  : case MSH_TET_52  :
+  case MSH_TET_74  : case MSH_TET_100 :
+  case MSH_TET_130 : case MSH_TET_164 :
+  case MSH_TET_202 :
+
+  case MSH_PRI_15  : case MSH_PRI_38  :
+  case MSH_PRI_66  : case MSH_PRI_102 :
+  case MSH_PRI_146 : case MSH_PRI_198 :
+  case MSH_PRI_258 : case MSH_PRI_326 :
+
+  case MSH_HEX_20  : case MSH_HEX_56  :
+  case MSH_HEX_98  : case MSH_HEX_152 :
+  case MSH_HEX_218 : case MSH_HEX_296 :
+  case MSH_HEX_386 : case MSH_HEX_488 :
+
+  case MSH_PYR_13  : case MSH_PYR_29  :
+  case MSH_PYR_50  : case MSH_PYR_77  :
+  case MSH_PYR_110 : case MSH_PYR_149 :
+  case MSH_PYR_194 : case MSH_PYR_245 :
+
+    return 2; // Only Serendipity
+
+  default :
+    Msg::Error("Unknown element type %d: assuming not serendipity",tag);
+    return 0;
+  }
+}
+
+// Gives the dimension corresponding to any element type.
+int MElement::DimensionFromTag(int tag)
+{
+  switch(tag) {
+    case(MSH_PNT):      case(MSH_PNT_SUB):
+      return 0;
+
+    case(MSH_LIN_2):    case(MSH_LIN_3):
+    case(MSH_LIN_4):    case(MSH_LIN_5):
+    case(MSH_LIN_6):    case(MSH_LIN_7):
+    case(MSH_LIN_8):    case(MSH_LIN_9):
+    case(MSH_LIN_10):   case(MSH_LIN_11):
+    case(MSH_LIN_B):    case(MSH_LIN_C):
+    case(MSH_LIN_1):    case(MSH_LIN_SUB):
+      return 1;
+
+    case(MSH_TRI_3):    case(MSH_TRI_6):
+    case(MSH_TRI_9):    case(MSH_TRI_10):
+    case(MSH_TRI_12):   case(MSH_TRI_15):
+    case(MSH_TRI_15I):  case(MSH_TRI_21):
+    case(MSH_TRI_28):   case(MSH_TRI_36):
+    case(MSH_TRI_45):   case(MSH_TRI_55):
+    case(MSH_TRI_66):   case(MSH_TRI_18):
+    case(MSH_TRI_21I):  case(MSH_TRI_24):
+    case(MSH_TRI_27):   case(MSH_TRI_30):
+    case(MSH_TRI_B):    case(MSH_TRI_1):
+    case(MSH_TRI_SUB):
+
+    case(MSH_QUA_4):    case(MSH_QUA_9):
+    case(MSH_QUA_8):    case(MSH_QUA_16):
+    case(MSH_QUA_25):   case(MSH_QUA_36):
+    case(MSH_QUA_12):   case(MSH_QUA_16I):
+    case(MSH_QUA_20):   case(MSH_QUA_49):
+    case(MSH_QUA_64):   case(MSH_QUA_81):
+    case(MSH_QUA_100):  case(MSH_QUA_121):
+    case(MSH_QUA_24):   case(MSH_QUA_28):
+    case(MSH_QUA_32):   case(MSH_QUA_36I):
+    case(MSH_QUA_40):   case(MSH_QUA_1):
+
+    case(MSH_POLYG_):   case(MSH_POLYG_B):
+      return 2;
+
+    case(MSH_TET_4):    case(MSH_TET_10):
+    case(MSH_TET_20):   case(MSH_TET_35):
+    case(MSH_TET_56):   case(MSH_TET_34):
+    case(MSH_TET_52):   case(MSH_TET_84):
+    case(MSH_TET_120):  case(MSH_TET_165):
+    case(MSH_TET_220):  case(MSH_TET_286):
+    case(MSH_TET_74):   case(MSH_TET_100):
+    case(MSH_TET_130):  case(MSH_TET_164):
+    case(MSH_TET_202):  case(MSH_TET_1):
+    case(MSH_TET_SUB):
+
+    case(MSH_PYR_5):    case(MSH_PYR_14):
+    case(MSH_PYR_13):   case(MSH_PYR_30):
+    case(MSH_PYR_55):   case(MSH_PYR_91):
+    case(MSH_PYR_140):  case(MSH_PYR_204):
+    case(MSH_PYR_285):  case(MSH_PYR_385):
+    case(MSH_PYR_29):   case(MSH_PYR_50):
+    case(MSH_PYR_77):   case(MSH_PYR_110):
+    case(MSH_PYR_149):  case(MSH_PYR_194):
+    case(MSH_PYR_245):  case(MSH_PYR_1):
+
+    case(MSH_PRI_6):    case(MSH_PRI_18):
+    case(MSH_PRI_15):   case(MSH_PRI_1):
+    case(MSH_PRI_40):   case(MSH_PRI_75):
+    case(MSH_PRI_126):  case(MSH_PRI_196):
+    case(MSH_PRI_288):  case(MSH_PRI_405):
+    case(MSH_PRI_550):  case(MSH_PRI_38):
+    case(MSH_PRI_66):   case(MSH_PRI_102):
+    case(MSH_PRI_146):  case(MSH_PRI_198):
+    case(MSH_PRI_258):  case(MSH_PRI_326):
+
+    case(MSH_HEX_8):    case(MSH_HEX_27):
+    case(MSH_HEX_20):   case(MSH_HEX_1):
+    case(MSH_HEX_64):   case(MSH_HEX_125):
+    case(MSH_HEX_216):  case(MSH_HEX_343):
+    case(MSH_HEX_512):  case(MSH_HEX_729):
+    case(MSH_HEX_1000): case(MSH_HEX_56):
+    case(MSH_HEX_98):   case(MSH_HEX_152):
+    case(MSH_HEX_218):  case(MSH_HEX_296):
+    case(MSH_HEX_386):  case(MSH_HEX_488):
+
+    case(MSH_POLYH_):
+      return 3;
+
+    default:
+      Msg::Error("Unknown type %i, assuming tetrahedron.", tag);
+      return 3;
+  }
+}
 
 MElement *MElementFactory::create(int type, std::vector<MVertex*> &v,
                                   int num, int part, bool owner, MElement *parent,
diff --git a/Geo/MElement.h b/Geo/MElement.h
index 00a48751e0..06ed8d91df 100644
--- a/Geo/MElement.h
+++ b/Geo/MElement.h
@@ -367,7 +367,8 @@ class MElement
 
   static int ParentTypeFromTag(int tag);
   static int OrderFromTag(int tag);
-
+  static int SerendipityFromTag(int tag);
+  static int DimensionFromTag(int tag);
 };
 
 class MElementFactory{
-- 
GitLab