From deacf2faa94131f4700e84e239b2c16a91ecf5a2 Mon Sep 17 00:00:00 2001
From: Laurent Van Migroet <l.vanmiegroet@ulg.ac.be>
Date: Fri, 27 Nov 2009 16:36:38 +0000
Subject: [PATCH] Add createGModel

---
 Geo/GModel.h          |   6 +++
 Geo/GModelIO_Mesh.cpp | 105 ++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 111 insertions(+)

diff --git a/Geo/GModel.h b/Geo/GModel.h
index 4e85fb499e..e381c625bf 100644
--- a/Geo/GModel.h
+++ b/Geo/GModel.h
@@ -328,6 +328,12 @@ class GModel
 
   // build a new GModel by cutting the elements crossed by the levelset ls
   GModel *buildCutGModel(gLevelset *ls);
+	
+  // create GModel by importing mesh and vertices, vertexMap has a dim equal to the number 
+	// of vertices and all std::vector have a dim equal to the number of elements
+  static GModel *createGModel(std::map<int,MVertex*>& vertexMap, std::vector<int> &numElement,
+										std::vector<std::vector<int>> &vertexIndices,std::vector<int> &elementType,
+										std::vector<int> &physical,std::vector<int> &elementary,std::vector<int> &partition);
 
   // Gmsh native CAD format (readGEO is static, since it can create
   // multiple models)
diff --git a/Geo/GModelIO_Mesh.cpp b/Geo/GModelIO_Mesh.cpp
index 14e6b0fa56..63bcad2a3d 100644
--- a/Geo/GModelIO_Mesh.cpp
+++ b/Geo/GModelIO_Mesh.cpp
@@ -2911,3 +2911,108 @@ int GModel::writeDIFF(const std::string &name, bool binary, bool saveAll,
   fclose(fp);
   return 1;
 }
+
+GModel *
+GModel::createGModel(std::map<int,MVertex*>& vertexMap,  
+										 std::vector<int> &elementNum,
+										 std::vector<std::vector<int>> &vertexIndices,
+										 std::vector<int> &elementType,
+										 std::vector<int> &physical,
+										 std::vector<int> &elementary,
+										 std::vector<int> &partition)
+{
+
+	GModel *gm=new GModel();
+	std::map<int, std::vector<MElement*> > elements[10];
+	std::map<int, std::map<int, std::string> > physicals[4];
+	std::vector<MVertex*> vertexVector;
+
+	int numVertices=(int)vertexMap.size();
+	int numElement=(int)elementNum.size();
+
+	if(numElement!=(int)vertexIndices.size())
+		Msg::Error("Dimension in vertices numbers");
+	if(numElement!=(int)elementType.size())
+		Msg::Error("Dimension in elementType numbers");
+	if(numElement!=(int)physical.size())
+		Msg::Error("Dimension in physical numbers");
+	if(numElement!=(int)elementary.size())
+		Msg::Error("Dimension in elementary numbers");
+	if(numElement!=(int)partition.size())
+		Msg::Error("Dimension in partition numbers");
+
+	std::map<int,MVertex*>::const_iterator it=vertexMap.begin();
+	std::map<int,MVertex*>::const_iterator end=vertexMap.end();
+	
+	int maxVertex=INT_MIN;
+	int minVertex=INT_MAX;
+	int num;
+	
+	for(it;it!=end;++it){
+		num=it->first;
+		minVertex = std::min(minVertex, num);
+		maxVertex = std::max(maxVertex, num);
+	}
+	if(minVertex==INT_MAX)
+		Msg::Error("Could not determine the min index of vertices");
+	
+	// If the vertex numbering is dense, tranfer the map into a
+	// vector to speed up element creation
+	if((minVertex == 1 && maxVertex == numVertices) ||(minVertex == 0 && maxVertex == numVertices - 1)){
+			Msg::Info("Vertex numbering is dense");
+			vertexVector.resize(vertexMap.size() + 1);
+			if(minVertex == 1) 
+				vertexVector[0] = 0;
+			else
+				vertexVector[numVertices] = 0;
+			std::map<int, MVertex*>::const_iterator it = vertexMap.begin();
+			for(; it != vertexMap.end(); ++it)
+				vertexVector[it->first] = it->second;
+			vertexMap.clear();
+	}
+	
+	int *indices;
+	int nbVertices;
+	for(int i = 0; i < numElement; ++i){
+		num=elementNum[i];
+		std::vector<MVertex*> vertices;
+		nbVertices=(int)vertexIndices[i].size();
+		indices = &vertexIndices[i][0];
+
+		if(vertexVector.size()){
+			Msg::Error("Vertex not found aborting");
+			if(!getVertices(nbVertices, indices, vertexVector, vertices)){
+				delete gm;	return 0;
+			}
+		}
+		else{
+			Msg::Error("Vertex not found aborting");
+			if(!getVertices(nbVertices, indices, vertexMap, vertices)){
+				delete gm;	return 0;
+			}
+		}
+
+		createElementMSH(gm, num, elementType[i], physical[i], elementary[i],
+                     partition[i], vertices, elements, physicals);
+	}
+
+  // store the elements in their associated elementary entity. If the
+  // entity does not exist, create a new (discrete) one.
+  for(int i = 0; i < (int)(sizeof(elements) / sizeof(elements[0])); i++)
+    gm->_storeElementsInEntities(elements[i]);
+
+  // associate the correct geometrical entity with each mesh vertex
+  gm->_associateEntityWithMeshVertices();
+
+  // store the vertices in their associated geometrical entity
+  if(vertexVector.size())
+   gm->_storeVerticesInEntities(vertexVector);
+  else
+    gm->_storeVerticesInEntities(vertexMap);
+
+  // store the physical tags
+  for(int i = 0; i < 4; i++)
+    gm->_storePhysicalTagsInEntities(i, physicals[i]);
+	
+	return gm;
+}
\ No newline at end of file
-- 
GitLab