From 322caf24349907f68f28aedf4ce492b5e3318e88 Mon Sep 17 00:00:00 2001
From: Christophe Geuzaine <cgeuzaine@ulg.ac.be>
Date: Thu, 9 Oct 2008 06:18:32 +0000
Subject: [PATCH] *** empty log message ***

---
 Geo/GModelIO_Mesh.cpp | 186 +++++++++++++++++++++++-------------------
 Geo/MElement.h        |   3 +-
 Makefile              |   2 +-
 3 files changed, 104 insertions(+), 87 deletions(-)

diff --git a/Geo/GModelIO_Mesh.cpp b/Geo/GModelIO_Mesh.cpp
index 89f153d954..3360314969 100644
--- a/Geo/GModelIO_Mesh.cpp
+++ b/Geo/GModelIO_Mesh.cpp
@@ -174,7 +174,7 @@ int GModel::readMSH(const std::string &name)
         double xyz[3];
         if(!binary){
           if(fscanf(fp, "%d %lf %lf %lf", &num, &xyz[0], &xyz[1], &xyz[2]) != 4)
-	    return 0;
+            return 0;
         }
         else{
           if(fread(&num, sizeof(int), 1, fp) != 1) return 0;
@@ -188,8 +188,8 @@ int GModel::readMSH(const std::string &name)
           Msg::Warning("Skipping duplicate vertex %d", num);
         else
           vertexMap[num] = new MVertex(xyz[0], xyz[1], xyz[2], 0, num);
-	if(numVertices > 100000) 
-	  Msg::ProgressMeter(i + 1, numVertices, "Reading nodes");
+        if(numVertices > 100000) 
+          Msg::ProgressMeter(i + 1, numVertices, "Reading nodes");
       }
       // If the vertex numbering is dense, tranfer the map into a
       // vector to speed up element creation
@@ -247,8 +247,8 @@ int GModel::readMSH(const std::string &name)
           }
           createElementMSH(this, num, type, physical, elementary, partition, 
                            vertices, elements, physicals);
-	  if(numElements > 100000) 
-	    Msg::ProgressMeter(i + 1, numElements, "Reading elements");
+          if(numElements > 100000) 
+            Msg::ProgressMeter(i + 1, numElements, "Reading elements");
         }
       }
       else{
@@ -280,9 +280,9 @@ int GModel::readMSH(const std::string &name)
             }
             createElementMSH(this, num, type, physical, elementary, partition, 
                              vertices, elements, physicals);
-	    if(numElements > 100000) 
-	      Msg::ProgressMeter(numElementsPartial + i + 1, numElements, 
-				 "Reading elements");
+            if(numElements > 100000) 
+              Msg::ProgressMeter(numElementsPartial + i + 1, numElements, 
+                                 "Reading elements");
           }
           delete [] data;
           numElementsPartial += numElms;
@@ -303,7 +303,7 @@ int GModel::readMSH(const std::string &name)
 
     }
     else if(!strncmp(&str[1], "ElementData", 11) ||
-	    !strncmp(&str[1], "ElementNodeData", 15)) {
+            !strncmp(&str[1], "ElementNodeData", 15)) {
 
       // there's some element post-processing data to read later on
       postpro = true;
@@ -514,7 +514,7 @@ int GModel::writeMSH(const std::string &name, double version, bool binary,
     writeElementsMSH(fp, (*it)->quadrangles, saveAll, version, binary, num,
                      (*it)->tag(), (*it)->physicals);
   writeElementHeaderMSH(binary, fp, elements, MSH_TET_4, MSH_TET_10, MSH_TET_20, 
-			MSH_TET_35, MSH_TET_56, MSH_TET_52);
+                        MSH_TET_35, MSH_TET_56, MSH_TET_52);
   for(riter it = firstRegion(); it != lastRegion(); ++it)
     writeElementsMSH(fp, (*it)->tetrahedra, saveAll, version, binary, num,
                      (*it)->tag(), (*it)->physicals);
@@ -595,9 +595,9 @@ int GModel::writePOS(const std::string &name, bool printElementary,
   for(unsigned int i = 0; i < entities.size(); i++)
     if(saveAll || entities[i]->physicals.size())
       for(unsigned int j = 0; j < entities[i]->getNumMeshElements(); j++)
-	entities[i]->getMeshElement(j)->writePOS(fp, f[0], f[1], f[2], f[3],
-						 f[4], f[5], scalingFactor, 
-						 entities[i]->tag());
+        entities[i]->getMeshElement(j)->writePOS(fp, f[0], f[1], f[2], f[3],
+                                                 f[4], f[5], scalingFactor, 
+                                                 entities[i]->tag());
   fprintf(fp, "};\n");
 
   fclose(fp);
@@ -1170,10 +1170,10 @@ int GModel::writeUNV(const std::string &name, bool saveAll, bool saveGroupsOfNod
     for(unsigned int j = 0; j < entities[i]->getNumMeshElements(); j++){
       MElement *e = entities[i]->getMeshElement(j);
       if(saveAll)
-	e->writeUNV(fp, ++num, entities[i]->tag(), 0);
+        e->writeUNV(fp, ++num, entities[i]->tag(), 0);
       else
-	for(unsigned int k = 0; k < entities[i]->physicals.size(); k++)
-	  e->writeUNV(fp, ++num, entities[i]->tag(), entities[i]->physicals[k]);
+        for(unsigned int k = 0; k < entities[i]->physicals.size(); k++)
+          e->writeUNV(fp, ++num, entities[i]->tag(), entities[i]->physicals[k]);
     }
   }
   fprintf(fp, "%6d\n", -1);
@@ -1189,14 +1189,14 @@ int GModel::writeUNV(const std::string &name, bool saveAll, bool saveGroupsOfNod
       for(std::map<int, std::vector<GEntity*> >::iterator it = groups[dim].begin();
           it != groups[dim].end(); it++){
         std::set<MVertex*> nodes;
-	std::vector<GEntity *> &entities = it->second;
+        std::vector<GEntity *> &entities = it->second;
         for(unsigned int i = 0; i < entities.size(); i++){
-	  for(unsigned int j = 0; j < entities[i]->getNumMeshElements(); j++){
-	    MElement *e = entities[i]->getMeshElement(j);
-	    for (int k = 0; k < e->getNumVertices(); k++)
-	      nodes.insert(e->getVertex(k));
-	  }
-	}
+          for(unsigned int j = 0; j < entities[i]->getNumMeshElements(); j++){
+            MElement *e = entities[i]->getMeshElement(j);
+            for (int k = 0; k < e->getNumVertices(); k++)
+              nodes.insert(e->getVertex(k));
+          }
+        }
         fprintf(fp, "%10d%10d%10d%10d%10d%10d%10d%10d\n", 
                 gr, 0, 0, 0, 0, 0, 0, (int)nodes.size());
         fprintf(fp, "PERMANENT GROUP%d\n", gr++);
@@ -1304,9 +1304,9 @@ int GModel::readMESH(const std::string &name)
           int  n[1];
           sscanf(buffer, "%d", &n[0]);
           for(int j = 0; j < 1; j++) n[j]--;
-	  // std::vector<MVertex*> vertices;
-	  // if(!getVertices(1, n, vertexVector, vertices)) return 0;
-	  // corners.push_back(vertices[0]);
+          // std::vector<MVertex*> vertices;
+          // if(!getVertices(1, n, vertexVector, vertices)) return 0;
+          // corners.push_back(vertices[0]);
         }
       }
       else if(!strcmp(str, "Ridges")){
@@ -1319,9 +1319,9 @@ int GModel::readMESH(const std::string &name)
           int  n[1];
           sscanf(buffer, "%d", &n[0]);
           for(int j = 0; j < 1; j++) n[j]--;
-	  // std::vector<MVertex*> vertices;
-	  // if(!getVertices(1, n, vertexVector, vertices)) return 0;
-	  // ridges.push_back(vertices[0]);
+          // std::vector<MVertex*> vertices;
+          // if(!getVertices(1, n, vertexVector, vertices)) return 0;
+          // ridges.push_back(vertices[0]);
         }
       }
       else if(!strcmp(str, "Quadrilaterals")) {
@@ -1667,9 +1667,9 @@ int GModel::readBDF(const std::string &name)
         if(readElementBDF(fp, buffer, 6, -4, num, region, vertices, vertexMap)){
           if(vertices.size() == 10)
             elements[3][region].push_back
-	      (new MTetrahedron10(vertices[0], vertices[1], vertices[2], vertices[3], 
-				  vertices[4], vertices[5], vertices[6], vertices[7], 
-				  vertices[9], vertices[8], num));
+              (new MTetrahedron10(vertices[0], vertices[1], vertices[2], vertices[3], 
+                                  vertices[4], vertices[5], vertices[6], vertices[7], 
+                                  vertices[9], vertices[8], num));
           else
             elements[3][region].push_back(new MTetrahedron(vertices, num));
         }
@@ -1678,12 +1678,12 @@ int GModel::readBDF(const std::string &name)
         if(readElementBDF(fp, buffer, 5, -8, num, region, vertices, vertexMap)){
           if(vertices.size() == 20)
             elements[4][region].push_back
-	      (new MHexahedron20(vertices[0], vertices[1], vertices[2], vertices[3], 
-				 vertices[4], vertices[5], vertices[6], vertices[7], 
-				 vertices[8], vertices[11], vertices[12], vertices[9], 
-				 vertices[13], vertices[10], vertices[14], vertices[15], 
-				 vertices[16], vertices[19], vertices[17], vertices[18], 
-				 num));
+              (new MHexahedron20(vertices[0], vertices[1], vertices[2], vertices[3], 
+                                 vertices[4], vertices[5], vertices[6], vertices[7], 
+                                 vertices[8], vertices[11], vertices[12], vertices[9], 
+                                 vertices[13], vertices[10], vertices[14], vertices[15], 
+                                 vertices[16], vertices[19], vertices[17], vertices[18], 
+                                 num));
           else
             elements[4][region].push_back(new MHexahedron(vertices, num));
         }
@@ -1692,10 +1692,10 @@ int GModel::readBDF(const std::string &name)
         if(readElementBDF(fp, buffer, 6, -6, num, region, vertices, vertexMap)){
           if(vertices.size() == 15)
             elements[5][region].push_back
-	      (new MPrism15(vertices[0], vertices[1], vertices[2], vertices[3],
-			    vertices[4], vertices[5], vertices[6], vertices[8],
-			    vertices[9], vertices[7], vertices[10], vertices[11],
-			    vertices[12], vertices[14], vertices[13], num));
+              (new MPrism15(vertices[0], vertices[1], vertices[2], vertices[3],
+                            vertices[4], vertices[5], vertices[6], vertices[8],
+                            vertices[9], vertices[7], vertices[10], vertices[11],
+                            vertices[12], vertices[14], vertices[13], num));
           else
             elements[5][region].push_back(new MPrism(vertices, num));
         }
@@ -1743,7 +1743,7 @@ int GModel::writeBDF(const std::string &name, int format, bool saveAll,
   for(unsigned int i = 0; i < entities.size(); i++)
     for(unsigned int j = 0; j < entities[i]->getNumMeshElements(); j++)
       if(saveAll || entities[i]->physicals.size())
-	entities[i]->getMeshElement(j)->writeBDF(fp, format, entities[i]->tag());
+        entities[i]->getMeshElement(j)->writeBDF(fp, format, entities[i]->tag());
 
   fprintf(fp, "ENDDATA\n");
    
@@ -1965,10 +1965,10 @@ int GModel::writeVTK(const std::string &name, bool binary, bool saveAll,
   for(unsigned int i = 0; i < entities.size(); i++){
     if(entities[i]->physicals.size() || saveAll){
       for(unsigned int j = 0; j < entities[i]->getNumMeshElements(); j++){
-	if(entities[i]->getMeshElement(j)->getTypeForVTK()){
-	  numElements++;
-	  totalNumInt += entities[i]->getMeshElement(j)->getNumVertices() + 1;
-	}
+        if(entities[i]->getMeshElement(j)->getTypeForVTK()){
+          numElements++;
+          totalNumInt += entities[i]->getMeshElement(j)->getNumVertices() + 1;
+        }
       }
     }
   }
@@ -1978,8 +1978,8 @@ int GModel::writeVTK(const std::string &name, bool binary, bool saveAll,
   for(unsigned int i = 0; i < entities.size(); i++){
     if(entities[i]->physicals.size() || saveAll){
       for(unsigned int j = 0; j < entities[i]->getNumMeshElements(); j++){
-	if(entities[i]->getMeshElement(j)->getTypeForVTK())
-	  entities[i]->getMeshElement(j)->writeVTK(fp, binary, bigEndian);
+        if(entities[i]->getMeshElement(j)->getTypeForVTK())
+          entities[i]->getMeshElement(j)->writeVTK(fp, binary, bigEndian);
       }
     }
   }
@@ -1990,16 +1990,16 @@ int GModel::writeVTK(const std::string &name, bool binary, bool saveAll,
   for(unsigned int i = 0; i < entities.size(); i++){
     if(entities[i]->physicals.size() || saveAll){
       for(unsigned int j = 0; j < entities[i]->getNumMeshElements(); j++){
-	int type = entities[i]->getMeshElement(j)->getTypeForVTK();
-	if(type){
-	  if(binary){
-	    // VTK always expects big endian binary data
-	    if(!bigEndian) SwapBytes((char*)&type, sizeof(int), 1);
-	    fwrite(&type, sizeof(int), 1, fp);
-	  }
-	  else
-	    fprintf(fp, "%d\n", type);
-	}
+        int type = entities[i]->getMeshElement(j)->getTypeForVTK();
+        if(type){
+          if(binary){
+            // VTK always expects big endian binary data
+            if(!bigEndian) SwapBytes((char*)&type, sizeof(int), 1);
+            fwrite(&type, sizeof(int), 1, fp);
+          }
+          else
+            fprintf(fp, "%d\n", type);
+        }
       }
     }
   }
@@ -2015,47 +2015,61 @@ int GModel::readVTK(const std::string &name, bool bigEndian)
     Msg::Error("Unable to open file '%s'", name.c_str());
     return 0;
   }
-
+  
   char buffer[256], buffer2[256];
-
+  
   fgets(buffer, sizeof(buffer), fp); // version line
   fgets(buffer, sizeof(buffer), fp); // title
-
+  
   fscanf(fp, "%s", buffer); // ASCII or BINARY
   bool binary = false;
   if(!strcmp(buffer, "BINARY")) binary = true;
-
+  
   if(fscanf(fp, "%s %s", &buffer, &buffer2) != 2) return 0;
   if(strcmp(buffer, "DATASET") || strcmp(buffer2, "UNSTRUCTURED_GRID")){
     Msg::Error("VTK reader can only read unstructured datasets");
-    return 0; 
+    return 0;
   }
   
   // read mesh vertices
   int numVertices;
   if(fscanf(fp, "%s %d %s\n", &buffer, &numVertices, buffer2) != 3) return 0;
-  if(strcmp(buffer, "POINTS") || strcmp(buffer2, "double")){
-    Msg::Error("VTK reader only accepts point data in double precision");
+  if(strcmp(buffer, "POINTS") || !numVertices){
+    Msg::Warning("No points in dataset");
     return 0;
   }
-  if(!numVertices){
-    Msg::Warning("No points in dataset");
+  int datasize;
+  if(!strcmp(buffer2, "double"))
+    datasize = sizeof(double);
+  else if(!strcmp(buffer2, "float"))
+    datasize = sizeof(float);
+  else{
+    Msg::Warning("VTK reader only accepts float or double datasets");
     return 0;
   }
+
   Msg::Info("Reading %d points", numVertices);
   std::vector<MVertex*> vertices(numVertices);
   for(int i = 0 ; i < numVertices; i++){
     double xyz[3];
     if(binary){
-      if(fread(xyz, sizeof(double), 3, fp) != 3) return 0;
-      if(!bigEndian) SwapBytes((char*)xyz, sizeof(double), 3);
+      if(datasize == sizeof(float)){
+        float f[3];
+        if(fread(f, sizeof(float), 3, fp) != 3) return 0;
+        if(!bigEndian) SwapBytes((char*)f, sizeof(float), 3);
+        for(int j = 0; j < 3; j++) xyz[j] = f[j];
+      }
+      else{
+        if(fread(xyz, sizeof(double), 3, fp) != 3) return 0;
+        if(!bigEndian) SwapBytes((char*)xyz, sizeof(double), 3);
+      }
     }
     else{
       if(fscanf(fp, "%lf %lf %lf", &xyz[0], &xyz[1], &xyz[2]) != 3) return 0;
     }
     vertices[i] = new MVertex(xyz[0], xyz[1], xyz[2]);
   }
-  
+
   // read mesh elements
   int numElements, totalNumInt;
   if(fscanf(fp, "%s %d %d\n", &buffer, &numElements, &totalNumInt) != 3) return 0;
@@ -2076,14 +2090,14 @@ int GModel::readVTK(const std::string &name, bool bigEndian)
     else{
       if(fscanf(fp, "%d", &numVerts) != 1) return 0;
       for(int j = 0; j < numVerts; j++){
-	if(fscanf(fp, "%d", &n[j]) != 1) return 0;
+        if(fscanf(fp, "%d", &n[j]) != 1) return 0;
       }
     }
     for(int j = 0; j < numVerts; j++){
       if(n[j] >= 0 && n[j] < vertices.size())
-	cells[i].push_back(vertices[n[j]]);
+        cells[i].push_back(vertices[n[j]]);
       else
-	Msg::Error("Bad vertex index");
+        Msg::Error("Bad vertex index");
     }
   }
   if(fscanf(fp, "%s %d\n", &buffer, &numElements) != 2) return 0;
@@ -2091,7 +2105,7 @@ int GModel::readVTK(const std::string &name, bool bigEndian)
     Msg::Error("No or invalid number of cells types");
     return 0;
   }
-  std::map<int, std::vector<MElement*> > elements[7];
+  std::map<int, std::vector<MElement*> > elements[8];
   for(unsigned int i = 0; i < cells.size(); i++){
     int type;
     if(binary){
@@ -2102,23 +2116,25 @@ int GModel::readVTK(const std::string &name, bool bigEndian)
       if(fscanf(fp, "%d", &type) != 1) return 0;
     }
     switch(type){
-    case 3: elements[0][1].push_back(new MLine(cells[i])); break;
-    case 5: elements[1][1].push_back(new MTriangle(cells[i])); break;
-    case 8: elements[2][1].push_back(new MQuadrangle(cells[i])); break;
-    case 10: elements[3][1].push_back(new MTetrahedron(cells[i])); break;
-    case 12: elements[4][1].push_back(new MHexahedron(cells[i])); break;
-    case 13: elements[5][1].push_back(new MPrism(cells[i])); break;
-    case 14: elements[6][1].push_back(new MPyramid(cells[i])); break;
+    case 1: elements[0][1].push_back(new MPoint(cells[i])); break;
+    case 3: elements[1][1].push_back(new MLine(cells[i])); break;
+    case 5: elements[2][1].push_back(new MTriangle(cells[i])); break;
+    case 9: elements[3][1].push_back(new MQuadrangle(cells[i])); break;
+    case 10: elements[4][1].push_back(new MTetrahedron(cells[i])); break;
+    case 12: elements[5][1].push_back(new MHexahedron(cells[i])); break;
+    case 13: elements[6][1].push_back(new MPrism(cells[i])); break;
+    case 14: elements[7][1].push_back(new MPyramid(cells[i])); break;
     default: 
       Msg::Error("Unknown type of cell %d", type);
       break;
     }
   }  
-
+  
   for(int i = 0; i < (int)(sizeof(elements)/sizeof(elements[0])); i++) 
     _storeElementsInEntities(elements[i]);
   _associateEntityWithMeshVertices();
   _storeVerticesInEntities(vertices);
-
-  return 0;
+  
+  fclose(fp);
+  return 1;
 }
diff --git a/Geo/MElement.h b/Geo/MElement.h
index 76fcc86c5b..4a7be4599d 100644
--- a/Geo/MElement.h
+++ b/Geo/MElement.h
@@ -282,6 +282,7 @@ class MPoint : public MElement {
   virtual int getNumFacesRep(){ return 0; }
   virtual void getFaceRep(int num, double *x, double *y, double *z, SVector3 *n){}
   virtual int getTypeForMSH() const { return MSH_PNT; }
+  virtual int getTypeForVTK() const { return 1; }
   virtual const char *getStringForPOS() const { return "SP"; }
   virtual void getShapeFunction(int num, double u, double v, double w, double &s) 
   {
@@ -852,7 +853,7 @@ class MQuadrangle : public MElement {
   }
   virtual int getTypeForMSH() const { return MSH_QUA_4; }
   virtual int getTypeForUNV() const { return 94; } // thin shell linear quadrilateral
-  virtual int getTypeForVTK() const { return 8; }
+  virtual int getTypeForVTK() const { return 9; }
   virtual const char *getStringForPOS() const { return "SQ"; }
   virtual const char *getStringForBDF() const { return "CQUAD4"; }
   virtual void revert() 
diff --git a/Makefile b/Makefile
index 904e6b80b1..af9da7bfce 100644
--- a/Makefile
+++ b/Makefile
@@ -7,7 +7,7 @@ include variables
 
 GMSH_MAJOR_VERSION = 2
 GMSH_MINOR_VERSION = 2
-GMSH_PATCH_VERSION = 4
+GMSH_PATCH_VERSION = 5
 GMSH_EXTRA_VERSION =
 
 GMSH_VERSION = ${GMSH_MAJOR_VERSION}.${GMSH_MINOR_VERSION}.${GMSH_PATCH_VERSION}${GMSH_EXTRA_VERSION}
-- 
GitLab