From e8c50c356fd37eb9213c065efb7b02e6a63ca87b Mon Sep 17 00:00:00 2001
From: Christophe Geuzaine <cgeuzaine@uliege.be>
Date: Tue, 28 Jun 2022 11:43:07 +0200
Subject: [PATCH] don't allocate embedded edges container if not necessary (cf.
 #1987)

---
 src/mesh/meshGRegionDelaunayInsertion.cpp | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)

diff --git a/src/mesh/meshGRegionDelaunayInsertion.cpp b/src/mesh/meshGRegionDelaunayInsertion.cpp
index f0ea5672c1..eb6b31db77 100644
--- a/src/mesh/meshGRegionDelaunayInsertion.cpp
+++ b/src/mesh/meshGRegionDelaunayInsertion.cpp
@@ -80,7 +80,7 @@ struct edgeContainerB {
   std::size_t _size, _size_obj;
 
   edgeContainerB(std::size_t N = 1000000)
-    : _hash(N), _size(0), _size_obj(sizeof(MEdge))
+    : _hash(N > 0 ? N : 1), _size(0), _size_obj(sizeof(MEdge))
   {
   }
 
@@ -1350,9 +1350,15 @@ void insertVerticesInRegion(GRegion *gr, int maxIter,
     (*it)->setNeigh(2, nullptr);
     (*it)->setNeigh(3, nullptr);
   }
-  // store all embedded faces
+  // store all embedded edges and faces
   std::set<MFace, MFaceLessThan> allEmbeddedFaces;
-  edgeContainerB allEmbeddedEdges;
+  std::size_t N = 0;
+  for(auto it = gr->model()->firstRegion(); it != gr->model()->lastRegion();
+      ++it) {
+    for(auto e : (*it)->embeddedEdges())
+      N += e->getNumMeshElements();
+  }
+  edgeContainerB allEmbeddedEdges(N);
   for(auto it = gr->model()->firstRegion(); it != gr->model()->lastRegion();
       ++it) {
     createAllEmbeddedFaces((*it), allEmbeddedFaces);
-- 
GitLab