From 6812e27c2b8b38ff383e202b7dd7cba1cc19ff51 Mon Sep 17 00:00:00 2001
From: Jean-Francois Remacle <jean-francois.remacle@uclouvain.be>
Date: Wed, 23 Jan 2013 10:12:01 +0000
Subject: [PATCH] added support for P2 meshes

---
 Geo/GModelIO_MESH.cpp | 42 ++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 40 insertions(+), 2 deletions(-)

diff --git a/Geo/GModelIO_MESH.cpp b/Geo/GModelIO_MESH.cpp
index 6e1a70bb00..deca5660c5 100644
--- a/Geo/GModelIO_MESH.cpp
+++ b/Geo/GModelIO_MESH.cpp
@@ -11,6 +11,7 @@
 #include "MQuadrangle.h"
 #include "MTetrahedron.h"
 #include "MHexahedron.h"
+#include "Context.h"
 
 static bool getVertices(int num, int *indices, std::vector<MVertex*> &vec,
                         std::vector<MVertex*> &vertices)
@@ -100,6 +101,21 @@ int GModel::readMESH(const std::string &name)
           elements[1][cl].push_back(new MTriangle(vertices));
         }
       }
+      else if(!strcmp(str, "TrianglesP2")){
+        if(!fgets(buffer, sizeof(buffer), fp)) break;
+        int nbe;
+        sscanf(buffer, "%d", &nbe);
+        Msg::Info("%d triangles", nbe);
+        for(int i = 0; i < nbe; i++) {
+          if(!fgets(buffer, sizeof(buffer), fp)) break;
+          int n[6], cl;
+          sscanf(buffer, "%d %d %d %d", &n[0], &n[1], &n[2], &n[3], &n[4], &n[5],&cl);
+          for(int j = 0; j < 6; j++) n[j]--;
+          std::vector<MVertex*> vertices;
+          if(!getVertices(6, n, vertexVector, vertices)) return 0;
+          elements[1][cl].push_back(new MTriangle6(vertices));
+        }
+      }
       else if(!strcmp(str, "Quadrilaterals")) {
         if(!fgets(buffer, sizeof(buffer), fp)) break;
         int nbe;
@@ -130,6 +146,21 @@ int GModel::readMESH(const std::string &name)
           elements[3][cl].push_back(new MTetrahedron(vertices));
         }
       }
+      else if(!strcmp(str, "TetrahedraP2")) {
+        if(!fgets(buffer, sizeof(buffer), fp)) break;
+        int nbe;
+        sscanf(buffer, "%d", &nbe);
+        Msg::Info("%d tetrahedra", nbe);
+        for(int i = 0; i < nbe; i++) {
+          if(!fgets(buffer, sizeof(buffer), fp)) break;
+          int n[10], cl;
+          sscanf(buffer, "%d %d %d %d %d %d %d %d %d %d", &n[0], &n[1], &n[2], &n[3],&n[4], &n[5], &n[6], &n[7], &n[9], &n[8], &cl);
+          for(int j = 0; j < 10; j++) n[j]--;
+          std::vector<MVertex*> vertices;
+          if(!getVertices(10, n, vertexVector, vertices)) return 0;
+          elements[3][cl].push_back(new MTetrahedron10(vertices));
+        }
+      }
       else if(!strcmp(str, "Hexahedra")) {
         if(!fgets(buffer, sizeof(buffer), fp)) break;
         int nbe;
@@ -216,7 +247,11 @@ int GModel::writeMESH(const std::string &name, int elementTagType,
     }
   }
   if(numTriangles){
-    fprintf(fp, " Triangles\n");
+    if(CTX::instance()->mesh.order == 2)
+      fprintf(fp, " TrianglesP2\n");
+    else
+      fprintf(fp, " Triangles\n");
+
     fprintf(fp, " %d\n", numTriangles);
     for(fiter it = firstFace(); it != lastFace(); ++it){
       int numPhys = (*it)->physicals.size();
@@ -240,7 +275,10 @@ int GModel::writeMESH(const std::string &name, int elementTagType,
     }
   }
   if(numTetrahedra){
-    fprintf(fp, " Tetrahedra\n");
+    if(CTX::instance()->mesh.order == 2)
+      fprintf(fp, " TetrahedraP2\n");
+    else
+      fprintf(fp, " Tetrahedra\n");
     fprintf(fp, " %d\n", numTetrahedra);
     for(riter it = firstRegion(); it != lastRegion(); ++it){
       int numPhys = (*it)->physicals.size();
-- 
GitLab