From 20cce3910b9829f84dfd6e454abc0b8dc3606d55 Mon Sep 17 00:00:00 2001
From: Koen Hillewaert <koen.hillewaert@cenaero.be>
Date: Tue, 26 Apr 2016 13:07:47 +0000
Subject: [PATCH] copying mesh periodicity when reclassifying/matching a mesh
 onto a CAD

---
 Geo/GeomMeshMatcher.cpp | 48 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 48 insertions(+)

diff --git a/Geo/GeomMeshMatcher.cpp b/Geo/GeomMeshMatcher.cpp
index 4c47805362..b29fd5d364 100644
--- a/Geo/GeomMeshMatcher.cpp
+++ b/Geo/GeomMeshMatcher.cpp
@@ -581,6 +581,49 @@ int GeomMeshMatcher::forceTomatch(GModel *geom, GModel *mesh, const double TOL)
   return 0;
 }
 
+template <class GEType>
+static void copy_periodicity (std::vector<Pair<GEType*, GEType*> >& eCor)
+{
+
+  typename std::multimap<GEType*,GEType*> eMap; // (eCor.begin(),eCor.end());
+  typename std::vector<Pair<GEType*,GEType*> >::iterator eIter = eCor.begin();
+  for (;eIter!=eCor.end();++eIter) {
+    eMap.insert(std::make_pair(eIter->second(),eIter->first()));
+  }
+  
+  typename std::multimap<GEType*,GEType*>::iterator srcIter = eMap.begin();
+
+  for (;srcIter!=eMap.end();++srcIter) {
+    GEType* oldTgt = srcIter->first;
+    GEType* oldSrc = dynamic_cast<GEType*> (oldTgt->meshMaster());
+
+    if (oldSrc != NULL && oldSrc != oldTgt) {
+      
+      std::cout << "Copying connection from " << oldTgt->tag() << " - " << oldSrc->tag() << std::endl;
+
+      GEType* newTgt = srcIter->second;
+      typename std::map<GEType*,GEType*>::iterator tgtIter = eMap.find(oldSrc);
+      if (tgtIter == eMap.end()) {
+        std::cout << "Checking corresponding edge for " << newTgt << std::endl;
+        std::cout << "Tag " << newTgt->tag() << std::endl;
+        throw;
+      }
+      GEType* newSrc = tgtIter->second;
+
+      std::cout << "replacing by " << newTgt->tag() << " - " << newSrc->tag() << std::endl;
+
+      std::cout << "Transformation has " << oldTgt->affineTransform.size() << " components " << std::endl;
+
+      std::vector<double>::iterator tIter = oldTgt->affineTransform.begin();
+      for (;tIter!=oldTgt->affineTransform.end();++tIter) std::cout << " " << *tIter;
+      std::cout << std::endl;
+
+      newTgt->setMeshMaster(newSrc,oldTgt->affineTransform);
+    }
+  }
+}
+
+
 static void copy_vertices (GVertex *to, GVertex *from, std::map<MVertex*,MVertex*> &_mesh_to_geom){
   to->deleteMesh();
   if (from) {
@@ -740,6 +783,11 @@ int GeomMeshMatcher::match(GModel *geom, GModel *mesh)
   std::vector<Pair<GRegion*, GRegion*> > *coresp_r = matchRegions (geom, mesh, coresp_f, ok);
 
   std::map<MVertex*,MVertex*> _mesh_to_geom;
+
+  copy_periodicity(*coresp_v);
+  copy_periodicity(*coresp_e);
+  copy_periodicity(*coresp_f);
+  
   copy_vertices(geom, mesh, _mesh_to_geom,coresp_v,coresp_e,coresp_f,coresp_r);
   copy_elements(geom, mesh, _mesh_to_geom,coresp_v,coresp_e,coresp_f,coresp_r);
 
-- 
GitLab