summaryrefslogtreecommitdiff
path: root/cad/gmsh/files
diff options
context:
space:
mode:
Diffstat (limited to 'cad/gmsh/files')
-rw-r--r--cad/gmsh/files/patch-contrib_HighOrderMeshOptimizer_HighOrderMeshElasticAnalogy.cpp41
-rw-r--r--cad/gmsh/files/patch-contrib_MeshOptimizer_VertexCoord.cpp42
-rw-r--r--cad/gmsh/files/patch-contrib_domhex_BackgroundMesh2D.cpp110
-rw-r--r--cad/gmsh/files/patch-contrib_domhex_BackgroundMesh2D.h23
-rw-r--r--cad/gmsh/files/patch-contrib_domhex_surfaceFiller.cpp48
-rw-r--r--cad/gmsh/files/patch-src_common_gmsh.cpp32
-rw-r--r--cad/gmsh/files/patch-src_geo_GFace.cpp121
-rw-r--r--cad/gmsh/files/patch-src_geo_GFace.h26
-rw-r--r--cad/gmsh/files/patch-src_geo_GeomMeshMatcher.cpp274
-rw-r--r--cad/gmsh/files/patch-src_geo_GeomMeshMatcher.h32
-rw-r--r--cad/gmsh/files/patch-src_geo_OCCFace.cpp19
-rw-r--r--cad/gmsh/files/patch-src_geo_OCCFace.h11
-rw-r--r--cad/gmsh/files/patch-src_geo_Pair.h29
-rw-r--r--cad/gmsh/files/patch-src_geo_discreteFace.cpp33
-rw-r--r--cad/gmsh/files/patch-src_geo_discreteFace.h11
-rw-r--r--cad/gmsh/files/patch-src_geo_gmshFace.cpp27
-rw-r--r--cad/gmsh/files/patch-src_geo_gmshFace.h11
-rw-r--r--cad/gmsh/files/patch-src_geo_gmshSurface.cpp15
-rw-r--r--cad/gmsh/files/patch-src_geo_gmshSurface.h19
-rw-r--r--cad/gmsh/files/patch-src_geo_xyFace.h16
-rw-r--r--cad/gmsh/files/patch-src_mesh_BackgroundMesh.cpp26
-rw-r--r--cad/gmsh/files/patch-src_mesh_meshGFace.cpp22
-rw-r--r--cad/gmsh/files/patch-src_mesh_meshGFaceBamg.cpp24
-rw-r--r--cad/gmsh/files/patch-src_mesh_meshGFaceDelaunayInsertion.cpp18
24 files changed, 1030 insertions, 0 deletions
diff --git a/cad/gmsh/files/patch-contrib_HighOrderMeshOptimizer_HighOrderMeshElasticAnalogy.cpp b/cad/gmsh/files/patch-contrib_HighOrderMeshOptimizer_HighOrderMeshElasticAnalogy.cpp
new file mode 100644
index 000000000000..2ecac4e87b02
--- /dev/null
+++ b/cad/gmsh/files/patch-contrib_HighOrderMeshOptimizer_HighOrderMeshElasticAnalogy.cpp
@@ -0,0 +1,41 @@
+--- contrib/HighOrderMeshOptimizer/HighOrderMeshElasticAnalogy.cpp.orig 2024-03-29 22:06:53 UTC
++++ contrib/HighOrderMeshOptimizer/HighOrderMeshElasticAnalogy.cpp
+@@ -242,25 +242,25 @@ void highOrderTools::_computeMetricInfo(GFace *gf, MEl
+ for(int j = 0; j < nbNodes; j++) {
+ SPoint2 param;
+ reparamMeshVertexOnFace(e->getVertex(j), gf, param);
+- Pair<SVector3, SVector3> der = gf->firstDer(param);
++ std::pair<SVector3, SVector3> der = gf->firstDer(param);
+ int XJ = j;
+ int YJ = j + nbNodes;
+ int ZJ = j + 2 * nbNodes;
+ int UJ = j;
+ int VJ = j + nbNodes;
+- J(XJ, UJ) = der.first().x();
+- J(YJ, UJ) = der.first().y();
+- J(ZJ, UJ) = der.first().z();
+- J(XJ, VJ) = der.second().x();
+- J(YJ, VJ) = der.second().y();
+- J(ZJ, VJ) = der.second().z();
++ J(XJ, UJ) = der.first.x();
++ J(YJ, UJ) = der.first.y();
++ J(ZJ, UJ) = der.first.z();
++ J(XJ, VJ) = der.second.x();
++ J(YJ, VJ) = der.second.y();
++ J(ZJ, VJ) = der.second.z();
+
+- JT(UJ, XJ) = der.first().x();
+- JT(UJ, YJ) = der.first().y();
+- JT(UJ, ZJ) = der.first().z();
+- JT(VJ, XJ) = der.second().x();
+- JT(VJ, YJ) = der.second().y();
+- JT(VJ, ZJ) = der.second().z();
++ JT(UJ, XJ) = der.first.x();
++ JT(UJ, YJ) = der.first.y();
++ JT(UJ, ZJ) = der.first.z();
++ JT(VJ, XJ) = der.second.x();
++ JT(VJ, YJ) = der.second.y();
++ JT(VJ, ZJ) = der.second.z();
+
+ SVector3 ss = getSSL(e->getVertex(j));
+ GPoint gp = gf->point(param);
diff --git a/cad/gmsh/files/patch-contrib_MeshOptimizer_VertexCoord.cpp b/cad/gmsh/files/patch-contrib_MeshOptimizer_VertexCoord.cpp
new file mode 100644
index 000000000000..4cb21e79ce54
--- /dev/null
+++ b/cad/gmsh/files/patch-contrib_MeshOptimizer_VertexCoord.cpp
@@ -0,0 +1,42 @@
+--- contrib/MeshOptimizer/VertexCoord.cpp.orig 2024-03-29 22:06:54 UTC
++++ contrib/MeshOptimizer/VertexCoord.cpp
+@@ -76,12 +76,12 @@ void VertexCoordParent::gXyz2gUvw(const SPoint3 &uvw,
+ gUvw[0] = gXyz.x() * der.x() + gXyz.y() * der.y() + gXyz.z() * der.z();
+ }
+ else {
+- Pair<SVector3, SVector3> der =
++ std::pair<SVector3, SVector3> der =
+ static_cast<GFace *>(ge)->firstDer(SPoint2(uvw[0], uvw[1]));
+- gUvw[0] = gXyz.x() * der.first().x() + gXyz.y() * der.first().y() +
+- gXyz.z() * der.first().z();
+- gUvw[1] = gXyz.x() * der.second().x() + gXyz.y() * der.second().y() +
+- gXyz.z() * der.second().z();
++ gUvw[0] = gXyz.x() * der.first.x() + gXyz.y() * der.first.y() +
++ gXyz.z() * der.first.z();
++ gUvw[1] = gXyz.x() * der.second.x() + gXyz.y() * der.second.y() +
++ gXyz.z() * der.second.z();
+ }
+ }
+
+@@ -101,15 +101,15 @@ void VertexCoordParent::gXyz2gUvw(const SPoint3 &uvw,
+ }
+ }
+ else {
+- Pair<SVector3, SVector3> der =
++ std::pair<SVector3, SVector3> der =
+ static_cast<GFace *>(ge)->firstDer(SPoint2(uvw[0], uvw[1]));
+ auto itUvw = gUvw.begin();
+ for(auto itXyz = gXyz.begin(); itXyz != gXyz.end(); itXyz++) {
+- (*itUvw)[0] = itXyz->x() * der.first().x() +
+- itXyz->y() * der.first().y() + itXyz->z() * der.first().z();
+- (*itUvw)[1] = itXyz->x() * der.second().x() +
+- itXyz->y() * der.second().y() +
+- itXyz->z() * der.second().z();
++ (*itUvw)[0] = itXyz->x() * der.first.x() +
++ itXyz->y() * der.first.y() + itXyz->z() * der.first.z();
++ (*itUvw)[1] = itXyz->x() * der.second.x() +
++ itXyz->y() * der.second.y() +
++ itXyz->z() * der.second.z();
+ itUvw++;
+ }
+ }
diff --git a/cad/gmsh/files/patch-contrib_domhex_BackgroundMesh2D.cpp b/cad/gmsh/files/patch-contrib_domhex_BackgroundMesh2D.cpp
new file mode 100644
index 000000000000..2863634a8f85
--- /dev/null
+++ b/cad/gmsh/files/patch-contrib_domhex_BackgroundMesh2D.cpp
@@ -0,0 +1,110 @@
+--- contrib/domhex/BackgroundMesh2D.cpp.orig 2024-03-29 22:06:54 UTC
++++ contrib/domhex/BackgroundMesh2D.cpp
+@@ -490,9 +490,9 @@ void frameFieldBackgroundMesh2D::computeCrossField(
+ v[1] = (*it)->lines[i]->getVertex(1);
+ SPoint2 p1, p2;
+ reparamMeshEdgeOnFace(v[0], v[1], face, p1, p2);
+- Pair<SVector3, SVector3> der = face->firstDer((p1 + p2) * .5);
+- SVector3 t1 = der.first();
+- SVector3 t2 = der.second();
++ std::pair<SVector3, SVector3> der = face->firstDer((p1 + p2) * .5);
++ SVector3 t1 = der.first;
++ SVector3 t2 = der.second;
+ SVector3 n = crossprod(t1, t2);
+ n.normalize();
+ SVector3 d1(v[1]->x() - v[0]->x(), v[1]->y() - v[0]->y(),
+@@ -534,21 +534,21 @@ void frameFieldBackgroundMesh2D::eval_crossfield(doubl
+ STensor3 &cf)
+ {
+ double quadAngle = angle(u, v);
+- Pair<SVector3, SVector3> dirs =
++ std::pair<SVector3, SVector3> dirs =
+ compute_crossfield_directions(u, v, quadAngle);
+- SVector3 n = crossprod(dirs.first(), dirs.second());
++ SVector3 n = crossprod(dirs.first, dirs.second);
+
+ for(int i = 0; i < 3; i++) {
+- cf(i, 0) = dirs.first()[i];
+- cf(i, 1) = dirs.second()[i];
++ cf(i, 0) = dirs.first[i];
++ cf(i, 1) = dirs.second[i];
+ cf(i, 2) = n[i];
+ }
+
+ // SVector3 t1,t2,n;
+ // GFace *face = dynamic_cast<GFace*>(gf);
+- // Pair<SVector3, SVector3> der = face->firstDer(SPoint2(u,v));
+- // SVector3 s1 = der.first();
+- // SVector3 s2 = der.second();
++ // std::pair<SVector3, SVector3> der = face->firstDer(SPoint2(u,v));
++ // SVector3 s1 = der.first;
++ // SVector3 s2 = der.second;
+ // n = crossprod(s1,s2);
+ // n.normalize();
+ // s1.normalize();
+@@ -642,12 +642,12 @@ void frameFieldBackgroundMesh2D::exportCrossField(cons
+ double angle_current = angle(v);
+ GPoint p = get_GPoint_from_MVertex(v);
+ for(int i = 0; i < 2; i++) {
+- Pair<SVector3, SVector3> dirs = compute_crossfield_directions(
++ std::pair<SVector3, SVector3> dirs = compute_crossfield_directions(
+ v->x(), v->y(), angle_current + deltas[i]);
+ fprintf(f, "VP(%g,%g,%g) {%g,%g,%g};\n", p.x(), p.y(), p.z(),
+- dirs.first()[0], dirs.first()[1], dirs.first()[2]);
++ dirs.first[0], dirs.first[1], dirs.first[2]);
+ fprintf(f, "VP(%g,%g,%g) {%g,%g,%g};\n", p.x(), p.y(), p.z(),
+- dirs.second()[0], dirs.second()[1], dirs.second()[2]);
++ dirs.second[0], dirs.second[1], dirs.second[2]);
+ }
+ }
+ fprintf(f, "};\n");
+@@ -656,7 +656,7 @@ void frameFieldBackgroundMesh2D::exportCrossField(cons
+
+ // returns the cross field as a pair of othogonal vectors (NOT in parametric
+ // coordinates, but real 3D coordinates)
+-Pair<SVector3, SVector3>
++std::pair<SVector3, SVector3>
+ frameFieldBackgroundMesh2D::compute_crossfield_directions(double u, double v,
+ double angle_current)
+ {
+@@ -664,12 +664,12 @@ frameFieldBackgroundMesh2D::compute_crossfield_directi
+ GFace *face = dynamic_cast<GFace *>(gf);
+ if(!face) {
+ Msg::Error("Entity is not a face in background mesh");
+- return Pair<SVector3, SVector3>(SVector3(), SVector3());
++ return std::pair<SVector3, SVector3>(SVector3(), SVector3());
+ }
+
+- Pair<SVector3, SVector3> der = face->firstDer(SPoint2(u, v));
+- SVector3 s1 = der.first();
+- SVector3 s2 = der.second();
++ std::pair<SVector3, SVector3> der = face->firstDer(SPoint2(u, v));
++ SVector3 s1 = der.first;
++ SVector3 s2 = der.second;
+ SVector3 n = crossprod(s1, s2);
+ n.normalize();
+
+@@ -687,8 +687,8 @@ frameFieldBackgroundMesh2D::compute_crossfield_directi
+ SVector3 t2 = crossprod(n, t1);
+ t2.normalize();
+
+- return Pair<SVector3, SVector3>(SVector3(t1[0], t1[1], t1[2]),
+- SVector3(t2[0], t2[1], t2[2]));
++ return std::pair<SVector3, SVector3>(SVector3(t1[0], t1[1], t1[2]),
++ SVector3(t2[0], t2[1], t2[2]));
+ }
+
+ bool frameFieldBackgroundMesh2D::compute_RK_infos(double u, double v, double x,
+@@ -711,9 +711,9 @@ bool frameFieldBackgroundMesh2D::compute_RK_infos(doub
+ return false;
+ }
+
+- Pair<SVector3, SVector3> der = face->firstDer(SPoint2(u, v));
+- SVector3 s1 = der.first();
+- SVector3 s2 = der.second();
++ std::pair<SVector3, SVector3> der = face->firstDer(SPoint2(u, v));
++ SVector3 s1 = der.first;
++ SVector3 s2 = der.second;
+ SVector3 n = crossprod(s1, s2);
+ n.normalize();
+ SVector3 basis_u = s1;
diff --git a/cad/gmsh/files/patch-contrib_domhex_BackgroundMesh2D.h b/cad/gmsh/files/patch-contrib_domhex_BackgroundMesh2D.h
new file mode 100644
index 000000000000..9e6ad3a20153
--- /dev/null
+++ b/cad/gmsh/files/patch-contrib_domhex_BackgroundMesh2D.h
@@ -0,0 +1,23 @@
+--- contrib/domhex/BackgroundMesh2D.h.orig 2024-03-29 22:06:54 UTC
++++ contrib/domhex/BackgroundMesh2D.h
+@@ -9,9 +9,7 @@
+ #include <string>
+ #include <map>
+ #include <vector>
+-#include "Pair.h"
+ #include "STensor3.h"
+-
+ #include "BGMBase.h"
+
+ class MTriangle;
+@@ -133,8 +131,8 @@ class frameFieldBackgroundMesh2D : public backgroundMe
+ void eval_crossfield(MVertex *vert, STensor3 &cf);
+
+ void exportCrossField(const std::string &filename);
+- Pair<SVector3, SVector3> compute_crossfield_directions(double u, double v,
+- double angle_current);
++ std::pair<SVector3, SVector3> compute_crossfield_directions(double u, double v,
++ double angle_current);
+ bool compute_RK_infos(double u, double v, double x, double y, double z,
+ RK_form &infos);
+
diff --git a/cad/gmsh/files/patch-contrib_domhex_surfaceFiller.cpp b/cad/gmsh/files/patch-contrib_domhex_surfaceFiller.cpp
new file mode 100644
index 000000000000..2985db17481f
--- /dev/null
+++ b/cad/gmsh/files/patch-contrib_domhex_surfaceFiller.cpp
@@ -0,0 +1,48 @@
+--- contrib/domhex/surfaceFiller.cpp.orig 2024-03-29 22:06:54 UTC
++++ contrib/domhex/surfaceFiller.cpp
+@@ -85,10 +85,10 @@ bool compute4neighbors(
+ metricField = SMetric3(1. / (L * L));
+
+ // get the unit normal at that point
+- Pair<SVector3, SVector3> der =
++ std::pair<SVector3, SVector3> der =
+ gf->firstDer(SPoint2(midpoint[0], midpoint[1]));
+- SVector3 s1 = der.first();
+- SVector3 s2 = der.second();
++ SVector3 s1 = der.first;
++ SVector3 s2 = der.second;
+ SVector3 n = crossprod(s1, s2);
+ n.normalize();
+ t1 -= n*dot(t1,n);
+@@ -259,10 +259,10 @@ bool compute4neighbors(
+ // // 0
+
+ // // get the unit normal at that point
+-// Pair<SVector3, SVector3> der =
++// std::pair<SVector3, SVector3> der =
+ // gf->firstDer(SPoint2(midpoint[0], midpoint[1]));
+-// SVector3 s1 = der.first();
+-// SVector3 s2 = der.second();
++// SVector3 s1 = der.first;
++// SVector3 s2 = der.second;
+ // SVector3 n = crossprod(s1, s2);
+ // n.normalize();
+
+@@ -490,7 +490,7 @@ void packingOfParallelograms(GFace *gf, std::vector<MV
+ double du[4] = {0,0,0,0}, dv[4]= {0,0,0,0};
+
+ // printf("cop %d\n",(*it)->getNum());
+-
++
+ for (int i=0;i<2;i++){
+ if (gf->periodic(i)){
+ reparamMeshVertexOnFace(*it, gf, midpoint);
+@@ -513,7 +513,7 @@ void packingOfParallelograms(GFace *gf, std::vector<MV
+ }
+
+ if (NP == 0)NP=1;
+-
++
+ for (int i=0;i<NP;i++){
+ bool singular = !compute4neighbors(gf, *it, midpoint, newp, metricField, cross_field, du[i],dv[i],globalMult );
+ // printf("there %d %g %g\n",singular,du[i],dv[i]);
diff --git a/cad/gmsh/files/patch-src_common_gmsh.cpp b/cad/gmsh/files/patch-src_common_gmsh.cpp
new file mode 100644
index 000000000000..df550b32000f
--- /dev/null
+++ b/cad/gmsh/files/patch-src_common_gmsh.cpp
@@ -0,0 +1,32 @@
+--- src/common/gmsh.cpp.orig 2024-05-05 07:36:23 UTC
++++ src/common/gmsh.cpp
+@@ -443,7 +443,7 @@ GMSH_API void gmsh::model::getEntitiesForPhysicalName(
+ GModel::current()->getEntitiesForPhysicalName(name, entities);
+ if(entities.size() != 0) {
+ for(auto ge : entities) {
+- dimTags.push_back(std::pair<int, int >(ge->dim(), ge->tag()));
++ dimTags.push_back(std::make_pair(ge->dim(), ge->tag()));
+ }
+ }
+ else {
+@@ -847,13 +847,13 @@ gmsh::model::getDerivative(const int dim, const int ta
+ GFace *gf = static_cast<GFace *>(entity);
+ for(std::size_t i = 0; i < parametricCoord.size(); i += 2) {
+ SPoint2 param(parametricCoord[i], parametricCoord[i + 1]);
+- Pair<SVector3, SVector3> d = gf->firstDer(param);
+- deriv.push_back(d.left().x());
+- deriv.push_back(d.left().y());
+- deriv.push_back(d.left().z());
+- deriv.push_back(d.right().x());
+- deriv.push_back(d.right().y());
+- deriv.push_back(d.right().z());
++ std::pair<SVector3, SVector3> d = gf->firstDer(param);
++ deriv.push_back(d.first.x());
++ deriv.push_back(d.first.y());
++ deriv.push_back(d.first.z());
++ deriv.push_back(d.second.x());
++ deriv.push_back(d.second.y());
++ deriv.push_back(d.second.z());
+ }
+ }
+ }
diff --git a/cad/gmsh/files/patch-src_geo_GFace.cpp b/cad/gmsh/files/patch-src_geo_GFace.cpp
new file mode 100644
index 000000000000..241d63352f0e
--- /dev/null
+++ b/cad/gmsh/files/patch-src_geo_GFace.cpp
@@ -0,0 +1,121 @@
+--- src/geo/GFace.cpp.orig 2024-03-29 22:07:00 UTC
++++ src/geo/GFace.cpp
+@@ -880,10 +880,10 @@ double GFace::curvatureDiv(const SPoint2 &param) const
+
+ const double eps = 1.e-5;
+
+- Pair<SVector3, SVector3> der = firstDer(param);
++ std::pair<SVector3, SVector3> der = firstDer(param);
+
+- SVector3 du = der.first();
+- SVector3 dv = der.second();
++ SVector3 du = der.first;
++ SVector3 dv = der.second;
+ SVector3 nml = crossprod(du, dv);
+
+ double detJ = norm(nml);
+@@ -937,19 +937,19 @@ double GFace::curvatures(const SPoint2 &param, SVector
+ SVector3 &dirMin, double &curvMax,
+ double &curvMin) const
+ {
+- Pair<SVector3, SVector3> D1 = firstDer(param);
++ std::pair<SVector3, SVector3> D1 = firstDer(param);
+
+ if(geomType() == Plane || geomType() == BoundaryLayerSurface) {
+- dirMax = D1.first();
+- dirMin = D1.second();
++ dirMax = D1.first;
++ dirMin = D1.second;
+ curvMax = 0.;
+ curvMin = 0.;
+ return 0.;
+ }
+
+ if(geomType() == Sphere) {
+- dirMax = D1.first();
+- dirMin = D1.second();
++ dirMax = D1.first;
++ dirMin = D1.second;
+ curvMax = curvatureDiv(param);
+ curvMin = curvMax;
+ return curvMax;
+@@ -961,8 +961,8 @@ double GFace::curvatures(const SPoint2 &param, SVector
+ // curvatures and main directions
+ curvMax = fabs(eigVal[1]);
+ curvMin = fabs(eigVal[0]);
+- dirMax = eigVec[1] * D1.first() + eigVec[3] * D1.second();
+- dirMin = eigVec[0] * D1.first() + eigVec[2] * D1.second();
++ dirMax = eigVec[1] * D1.first + eigVec[3] * D1.second;
++ dirMin = eigVec[0] * D1.first + eigVec[2] * D1.second;
+
+ return curvMax;
+ }
+@@ -979,9 +979,9 @@ void GFace::getMetricEigenVectors(const SPoint2 &param
+ double eigVec[4]) const
+ {
+ // first derivatives
+- Pair<SVector3, SVector3> D1 = firstDer(param);
+- SVector3 du = D1.first();
+- SVector3 dv = D1.second();
++ std::pair<SVector3, SVector3> D1 = firstDer(param);
++ SVector3 du = D1.first;
++ SVector3 dv = D1.second;
+ SVector3 nor = crossprod(du, dv);
+ nor.normalize();
+
+@@ -1088,13 +1088,13 @@ void GFace::XYZtoUV(double X, double Y, double Z, doub
+
+ while(err > tol && iter < MaxIter) {
+ P = point(U, V);
+- Pair<SVector3, SVector3> der = firstDer(SPoint2(U, V));
+- mat[0][0] = der.left().x();
+- mat[0][1] = der.left().y();
+- mat[0][2] = der.left().z();
+- mat[1][0] = der.right().x();
+- mat[1][1] = der.right().y();
+- mat[1][2] = der.right().z();
++ std::pair<SVector3, SVector3> der = firstDer(SPoint2(U, V));
++ mat[0][0] = der.first.x();
++ mat[0][1] = der.first.y();
++ mat[0][2] = der.first.z();
++ mat[1][0] = der.second.x();
++ mat[1][1] = der.second.y();
++ mat[1][2] = der.second.z();
+ mat[2][0] = 0.;
+ mat[2][1] = 0.;
+ mat[2][2] = 0.;
+@@ -1193,15 +1193,15 @@ void bfgs_callback(const alglib::real_1d_array &x, dou
+ // printf("func : %f\n", func);
+
+ // Value of the gradient
+- Pair<SVector3, SVector3> der = gf->firstDer(SPoint2(x[0], x[1]));
+- grad[0] = -(p.x() - pnt.x()) * der.left().x() -
+- (p.y() - pnt.y()) * der.left().y() -
+- (p.z() - pnt.z()) * der.left().z();
+- grad[1] = -(p.x() - pnt.x()) * der.right().x() -
+- (p.y() - pnt.y()) * der.right().y() -
+- (p.z() - pnt.z()) * der.right().z();
++ std::pair<SVector3, SVector3> der = gf->firstDer(SPoint2(x[0], x[1]));
++ grad[0] = -(p.x() - pnt.x()) * der.first.x() -
++ (p.y() - pnt.y()) * der.first.y() -
++ (p.z() - pnt.z()) * der.first.z();
++ grad[1] = -(p.x() - pnt.x()) * der.second.x() -
++ (p.y() - pnt.y()) * der.second.y() -
++ (p.z() - pnt.z()) * der.second.z();
+ // printf("func %22.15E Gradients %22.15E %22.15E der %g %g %g\n", func,
+- // grad[0], grad[1],der.left().x(),der.left().y(),der.left().z());
++ // grad[0], grad[1],der.first.x(),der.first.y(),der.first.z());
+ }
+ #endif
+
+@@ -1296,8 +1296,8 @@ SVector3 GFace::normal(const SPoint2 &param) const
+ {
+ if(geomType() == BoundaryLayerSurface) return SVector3();
+
+- Pair<SVector3, SVector3> der = firstDer(param);
+- SVector3 n = crossprod(der.first(), der.second());
++ std::pair<SVector3, SVector3> der = firstDer(param);
++ SVector3 n = crossprod(der.first, der.second);
+ n.normalize();
+ return n;
+ }
diff --git a/cad/gmsh/files/patch-src_geo_GFace.h b/cad/gmsh/files/patch-src_geo_GFace.h
new file mode 100644
index 000000000000..6155c2ff1b67
--- /dev/null
+++ b/cad/gmsh/files/patch-src_geo_GFace.h
@@ -0,0 +1,26 @@
+--- src/geo/GFace.h.orig 2024-03-29 22:07:00 UTC
++++ src/geo/GFace.h
+@@ -10,13 +10,13 @@
+ #include <string>
+ #include <vector>
+ #include <map>
++#include <utility>
+ #include "GmshDefines.h"
+ #include "GEntity.h"
+ #include "GPoint.h"
+ #include "GEdgeLoop.h"
+ #include "SPoint2.h"
+ #include "SVector3.h"
+-#include "Pair.h"
+ #include "Numeric.h"
+ #include "boundaryLayersData.h"
+
+@@ -201,7 +201,7 @@ class GFace : public GEntity { (public)
+ virtual SVector3 normal(const SPoint2 &param) const;
+
+ // return the first derivate of the face at the parameter location
+- virtual Pair<SVector3, SVector3> firstDer(const SPoint2 &param) const = 0;
++ virtual std::pair<SVector3, SVector3> firstDer(const SPoint2 &param) const = 0;
+
+ // compute the second derivates of the face at the parameter location
+ virtual void secondDer(const SPoint2 &param, SVector3 &dudu, SVector3 &dvdv,
diff --git a/cad/gmsh/files/patch-src_geo_GeomMeshMatcher.cpp b/cad/gmsh/files/patch-src_geo_GeomMeshMatcher.cpp
new file mode 100644
index 000000000000..a78293d1f542
--- /dev/null
+++ b/cad/gmsh/files/patch-src_geo_GeomMeshMatcher.cpp
@@ -0,0 +1,274 @@
+--- src/geo/GeomMeshMatcher.cpp.orig 2024-03-29 22:07:00 UTC
++++ src/geo/GeomMeshMatcher.cpp
+@@ -12,7 +12,6 @@
+ #include <list>
+ #include <vector>
+ #include "GeomMeshMatcher.h"
+-#include "Pair.h"
+ #include "discreteVertex.h"
+ #include "GmshMessage.h"
+ #include "SOrientedBoundingBox.h"
+@@ -61,22 +60,22 @@ void getIntersection(std::vector<T> &res, std::vector<
+ }
+ }
+
+-template <class T> T findMatching(std::vector<Pair<T, T> > &matching, T &entity)
++template <class T> T findMatching(std::vector<std::pair<T, T> > &matching, T &entity)
+ {
+ for(auto pair = matching.begin(); pair != matching.end(); pair++) {
+- if((*pair).left() == entity) return ((*pair).right());
++ if((*pair).first == entity) return ((*pair).second);
+ }
+ return (0);
+ }
+
+ // Matching vertices
+
+-std::vector<Pair<GVertex *, GVertex *> > *
++std::vector<std::pair<GVertex *, GVertex *> > *
+ GeomMeshMatcher::matchVertices(GModel *m1, GModel *m2, bool &ok)
+ {
+ // Vector that will be returned.
+- std::vector<Pair<GVertex *, GVertex *> > *coresp_v =
+- new std::vector<Pair<GVertex *, GVertex *> >;
++ std::vector<std::pair<GVertex *, GVertex *> > *coresp_v =
++ new std::vector<std::pair<GVertex *, GVertex *> >;
+ int num_matched_vertices = 0;
+ int num_total_vertices = m2->getNumVertices();
+
+@@ -107,7 +106,7 @@ GeomMeshMatcher::matchVertices(GModel *m1, GModel *m2,
+
+ if(choice && best_score != DBL_MAX) {
+ choice->physicals = v1->physicals;
+- coresp_v->push_back(Pair<GVertex *, GVertex *>(v1, choice));
++ coresp_v->push_back(std::make_pair(v1, choice));
+ num_matched_vertices++;
+ }
+ }
+@@ -120,17 +119,17 @@ GeomMeshMatcher::matchVertices(GModel *m1, GModel *m2,
+
+ // Matching edges
+
+-std::vector<Pair<GEdge *, GEdge *> > *
++std::vector<std::pair<GEdge *, GEdge *> > *
+ GeomMeshMatcher::matchEdges(GModel *m1, GModel *m2,
+- std::vector<Pair<GVertex *, GVertex *> > *coresp_v,
++ std::vector<std::pair<GVertex *, GVertex *> > *coresp_v,
+ bool &ok)
+ {
+ int num_matched_edges = 0;
+ int num_total_edges = m2->getNumEdges();
+
+ // Vector that will be returned.
+- std::vector<Pair<GEdge *, GEdge *> > *coresp_e =
+- new std::vector<Pair<GEdge *, GEdge *> >;
++ std::vector<std::pair<GEdge *, GEdge *> > *coresp_e =
++ new std::vector<std::pair<GEdge *, GEdge *> >;
+
+ std::vector<GEdge *> closed_curves;
+
+@@ -195,7 +194,7 @@ GeomMeshMatcher::matchEdges(GModel *m1, GModel *m2,
+ }
+ }
+ }
+- coresp_e->push_back(Pair<GEdge *, GEdge *>(e1, choice));
++ coresp_e->push_back(std::make_pair(e1, choice));
+
+ // copy topological information
+ if(choice) {
+@@ -213,16 +212,16 @@ GeomMeshMatcher::matchEdges(GModel *m1, GModel *m2,
+
+ // Matching faces
+
+-std::vector<Pair<GFace *, GFace *> > *
++std::vector<std::pair<GFace *, GFace *> > *
+ GeomMeshMatcher::matchFaces(GModel *m1, GModel *m2,
+- std::vector<Pair<GEdge *, GEdge *> > *coresp_e,
++ std::vector<std::pair<GEdge *, GEdge *> > *coresp_e,
+ bool &ok)
+ {
+ int num_matched_faces = 0;
+ int num_total_faces = m2->getNumFaces();
+
+- std::vector<Pair<GFace *, GFace *> > *coresp_f =
+- new std::vector<Pair<GFace *, GFace *> >;
++ std::vector<std::pair<GFace *, GFace *> > *coresp_f =
++ new std::vector<std::pair<GFace *, GFace *> >;
+
+ for(auto fit = m1->firstFace(); fit != m1->lastFace(); fit++) {
+ GFace *f1 = (GFace *)*fit;
+@@ -276,7 +275,7 @@ GeomMeshMatcher::matchFaces(GModel *m1, GModel *m2,
+
+ if(choice) {
+ Msg::Debug("Surfaces %i and %i match", f1->tag(), choice->tag());
+- coresp_f->push_back(Pair<GFace *, GFace *>(f1, choice));
++ coresp_f->push_back(std::make_pair(f1, choice));
+ // copy topological information
+ choice->setTag(f1->tag());
+ f1->physicals = choice->physicals;
+@@ -292,17 +291,17 @@ GeomMeshMatcher::matchFaces(GModel *m1, GModel *m2,
+
+ // Matching regions
+
+-std::vector<Pair<GRegion *, GRegion *> > *
++std::vector<std::pair<GRegion *, GRegion *> > *
+ GeomMeshMatcher::matchRegions(GModel *m1, GModel *m2,
+- std::vector<Pair<GFace *, GFace *> > *coresp_f,
++ std::vector<std::pair<GFace *, GFace *> > *coresp_f,
+ bool &ok)
+
+ {
+ int num_matched_regions = 0;
+ int num_total_regions = 0;
+
+- std::vector<Pair<GRegion *, GRegion *> > *coresp_r =
+- new std::vector<Pair<GRegion *, GRegion *> >;
++ std::vector<std::pair<GRegion *, GRegion *> > *coresp_r =
++ new std::vector<std::pair<GRegion *, GRegion *> >;
+
+ std::vector<GEntity *> m1_entities;
+ m1->getEntities(m1_entities, 3);
+@@ -344,8 +343,7 @@ GeomMeshMatcher::matchRegions(GModel *m1, GModel *m2,
+ }
+
+ if(common_regions.size() == 1) {
+- coresp_r->push_back(
+- Pair<GRegion *, GRegion *>((GRegion *)*entity1, common_regions[0]));
++ coresp_r->push_back(std::make_pair((GRegion *)*entity1, common_regions[0]));
+ common_regions[0]->setTag(((GRegion *)*entity1)->tag());
+ (*entity1)->physicals = common_regions[0]->physicals;
+ num_matched_regions++;
+@@ -377,8 +375,7 @@ GeomMeshMatcher::matchRegions(GModel *m1, GModel *m2,
+ choice = (*candidate);
+ }
+ }
+- coresp_r->push_back(
+- Pair<GRegion *, GRegion *>((GRegion *)*entity1, choice));
++ coresp_r->push_back(std::make_pair((GRegion *)*entity1, choice));
+ if(choice) {
+ choice->setTag(((GRegion *)*entity1)->tag());
+ (*entity1)->physicals = choice->physicals;
+@@ -594,13 +591,13 @@ template <class GEType>
+ }
+
+ template <class GEType>
+-static void copy_periodicity(std::vector<Pair<GEType *, GEType *> > &eCor,
++static void copy_periodicity(std::vector<std::pair<GEType *, GEType *> > &eCor,
+ std::map<MVertex *, MVertex *> &mesh_to_geom)
+ {
+ typename std::multimap<GEType *, GEType *> eMap; // (eCor.begin(),eCor.end());
+ auto eIter = eCor.begin();
+ for(; eIter != eCor.end(); ++eIter) {
+- eMap.insert(std::make_pair(eIter->second(), eIter->first()));
++ eMap.insert(std::make_pair(eIter->second, eIter->first));
+ }
+
+ auto srcIter = eMap.begin();
+@@ -651,12 +648,12 @@ template <class GEType>
+ }
+
+ template <class GEType>
+-static bool apply_periodicity(std::vector<Pair<GEType *, GEType *> > &eCor)
++static bool apply_periodicity(std::vector<std::pair<GEType *, GEType *> > &eCor)
+ {
+ typename std::multimap<GEType *, GEType *> eMap; // (eCor.begin(),eCor.end());
+ auto eIter = eCor.begin();
+ for(; eIter != eCor.end(); ++eIter) {
+- eMap.insert(std::make_pair(eIter->second(), eIter->first()));
++ eMap.insert(std::make_pair(eIter->second, eIter->first));
+ }
+
+ auto srcIter = eMap.begin();
+@@ -787,57 +784,57 @@ void copy_vertices(GModel *geom, GModel *mesh,
+
+ void copy_vertices(GModel *geom, GModel *mesh,
+ std::map<MVertex *, MVertex *> &_mesh_to_geom,
+- std::vector<Pair<GVertex *, GVertex *> > *coresp_v,
+- std::vector<Pair<GEdge *, GEdge *> > *coresp_e,
+- std::vector<Pair<GFace *, GFace *> > *coresp_f,
+- std::vector<Pair<GRegion *, GRegion *> > *coresp_r)
++ std::vector<std::pair<GVertex *, GVertex *> > *coresp_v,
++ std::vector<std::pair<GEdge *, GEdge *> > *coresp_e,
++ std::vector<std::pair<GFace *, GFace *> > *coresp_f,
++ std::vector<std::pair<GRegion *, GRegion *> > *coresp_r)
+ {
+ // copy all elements
+ for(std::size_t i = 0; i < coresp_v->size(); ++i)
+- copy_vertices((*coresp_v)[i].first(), (*coresp_v)[i].second(),
++ copy_vertices((*coresp_v)[i].first, (*coresp_v)[i].second,
+ _mesh_to_geom);
+ for(std::size_t i = 0; i < coresp_e->size(); ++i)
+- copy_vertices((*coresp_e)[i].first(), (*coresp_e)[i].second(),
++ copy_vertices((*coresp_e)[i].first, (*coresp_e)[i].second,
+ _mesh_to_geom);
+ for(std::size_t i = 0; i < coresp_f->size(); ++i)
+- copy_vertices((*coresp_f)[i].first(), (*coresp_f)[i].second(),
++ copy_vertices((*coresp_f)[i].first, (*coresp_f)[i].second,
+ _mesh_to_geom);
+ for(std::size_t i = 0; i < coresp_r->size(); ++i)
+- copy_vertices((*coresp_r)[i].first(), (*coresp_r)[i].second(),
++ copy_vertices((*coresp_r)[i].first, (*coresp_r)[i].second,
+ _mesh_to_geom);
+ }
+ void copy_elements(GModel *geom, GModel *mesh,
+ std::map<MVertex *, MVertex *> &_mesh_to_geom,
+- std::vector<Pair<GVertex *, GVertex *> > *coresp_v,
+- std::vector<Pair<GEdge *, GEdge *> > *coresp_e,
+- std::vector<Pair<GFace *, GFace *> > *coresp_f,
+- std::vector<Pair<GRegion *, GRegion *> > *coresp_r)
++ std::vector<std::pair<GVertex *, GVertex *> > *coresp_v,
++ std::vector<std::pair<GEdge *, GEdge *> > *coresp_e,
++ std::vector<std::pair<GFace *, GFace *> > *coresp_f,
++ std::vector<std::pair<GRegion *, GRegion *> > *coresp_r)
+ {
+ // copy all elements
+
+ for(std::size_t i = 0; i < coresp_v->size(); ++i) {
+- GVertex *dest = (*coresp_v)[i].first();
+- GVertex *orig = (*coresp_v)[i].second();
++ GVertex *dest = (*coresp_v)[i].first;
++ GVertex *orig = (*coresp_v)[i].second;
+ copy_elements<MPoint>(dest->points, orig->points, _mesh_to_geom);
+ }
+
+ for(std::size_t i = 0; i < coresp_e->size(); ++i) {
+- GEdge *dest = (*coresp_e)[i].first();
+- GEdge *orig = (*coresp_e)[i].second();
++ GEdge *dest = (*coresp_e)[i].first;
++ GEdge *orig = (*coresp_e)[i].second;
+ copy_elements<MLine>(dest->lines, orig->lines, _mesh_to_geom);
+ }
+
+ for(std::size_t i = 0; i < coresp_f->size(); ++i) {
+- GFace *dest = (*coresp_f)[i].first();
+- GFace *orig = (*coresp_f)[i].second();
++ GFace *dest = (*coresp_f)[i].first;
++ GFace *orig = (*coresp_f)[i].second;
+ copy_elements<MTriangle>(dest->triangles, orig->triangles, _mesh_to_geom);
+ copy_elements<MQuadrangle>(dest->quadrangles, orig->quadrangles,
+ _mesh_to_geom);
+ }
+
+ for(std::size_t i = 0; i < coresp_r->size(); ++i) {
+- GRegion *dest = (*coresp_r)[i].first();
+- GRegion *orig = (*coresp_r)[i].second();
++ GRegion *dest = (*coresp_r)[i].first;
++ GRegion *orig = (*coresp_r)[i].second;
+ copy_elements<MTetrahedron>(dest->tetrahedra, orig->tetrahedra,
+ _mesh_to_geom);
+ copy_elements<MHexahedron>(dest->hexahedra, orig->hexahedra, _mesh_to_geom);
+@@ -857,10 +854,10 @@ int GeomMeshMatcher::match(GModel *geom, GModel *mesh)
+
+ bool ok = true;
+
+- std::vector<Pair<GVertex *, GVertex *> > *coresp_v(nullptr);
+- std::vector<Pair<GEdge *, GEdge *> > *coresp_e(nullptr);
+- std::vector<Pair<GFace *, GFace *> > *coresp_f(nullptr);
+- std::vector<Pair<GRegion *, GRegion *> > *coresp_r(nullptr);
++ std::vector<std::pair<GVertex *, GVertex *> > *coresp_v(nullptr);
++ std::vector<std::pair<GEdge *, GEdge *> > *coresp_e(nullptr);
++ std::vector<std::pair<GFace *, GFace *> > *coresp_f(nullptr);
++ std::vector<std::pair<GRegion *, GRegion *> > *coresp_r(nullptr);
+
+ coresp_v = matchVertices(geom, mesh, ok);
+ if(ok) {
diff --git a/cad/gmsh/files/patch-src_geo_GeomMeshMatcher.h b/cad/gmsh/files/patch-src_geo_GeomMeshMatcher.h
new file mode 100644
index 000000000000..a22748865e45
--- /dev/null
+++ b/cad/gmsh/files/patch-src_geo_GeomMeshMatcher.h
@@ -0,0 +1,32 @@
+--- src/geo/GeomMeshMatcher.h.orig 2024-03-29 22:07:00 UTC
++++ src/geo/GeomMeshMatcher.h
+@@ -16,21 +16,20 @@
+ #include "GEdge.h"
+ #include "GFace.h"
+ #include "GRegion.h"
+-#include "Pair.h"
+
+ class GeomMeshMatcher {
+ private:
+- std::vector<Pair<GVertex *, GVertex *> > *matchVertices(GModel *m1,
+- GModel *m2, bool &ok);
+- std::vector<Pair<GEdge *, GEdge *> > *
++ std::vector<std::pair<GVertex *, GVertex *> > *
++ matchVertices(GModel *m1, GModel *m2, bool &ok);
++ std::vector<std::pair<GEdge *, GEdge *> > *
+ matchEdges(GModel *m1, GModel *m2,
+- std::vector<Pair<GVertex *, GVertex *> > *coresp_v, bool &ok);
+- std::vector<Pair<GFace *, GFace *> > *
++ std::vector<std::pair<GVertex *, GVertex *> > *coresp_v, bool &ok);
++ std::vector<std::pair<GFace *, GFace *> > *
+ matchFaces(GModel *m1, GModel *m2,
+- std::vector<Pair<GEdge *, GEdge *> > *coresp_e, bool &ok);
+- std::vector<Pair<GRegion *, GRegion *> > *
++ std::vector<std::pair<GEdge *, GEdge *> > *coresp_e, bool &ok);
++ std::vector<std::pair<GRegion *, GRegion *> > *
+ matchRegions(GModel *m1, GModel *m2,
+- std::vector<Pair<GFace *, GFace *> > *coresp_f, bool &ok);
++ std::vector<std::pair<GFace *, GFace *> > *coresp_f, bool &ok);
+ static GeomMeshMatcher *_gmm_instance;
+ GeomMeshMatcher() {}
+ ~GeomMeshMatcher() {}
diff --git a/cad/gmsh/files/patch-src_geo_OCCFace.cpp b/cad/gmsh/files/patch-src_geo_OCCFace.cpp
new file mode 100644
index 000000000000..4d34954ee598
--- /dev/null
+++ b/cad/gmsh/files/patch-src_geo_OCCFace.cpp
@@ -0,0 +1,19 @@
+--- src/geo/OCCFace.cpp.orig 2024-03-29 22:07:01 UTC
++++ src/geo/OCCFace.cpp
+@@ -249,13 +249,13 @@ SVector3 OCCFace::normal(const SPoint2 &param) const
+ return n;
+ }
+
+-Pair<SVector3, SVector3> OCCFace::firstDer(const SPoint2 &param) const
++std::pair<SVector3, SVector3> OCCFace::firstDer(const SPoint2 &param) const
+ {
+ gp_Pnt pnt;
+ gp_Vec du, dv;
+ _occface->D1(param.x(), param.y(), pnt, du, dv);
+- return Pair<SVector3, SVector3>(SVector3(du.X(), du.Y(), du.Z()),
+- SVector3(dv.X(), dv.Y(), dv.Z()));
++ return std::make_pair(SVector3(du.X(), du.Y(), du.Z()),
++ SVector3(dv.X(), dv.Y(), dv.Z()));
+ }
+
+ void OCCFace::secondDer(const SPoint2 &param, SVector3 &dudu, SVector3 &dvdv,
diff --git a/cad/gmsh/files/patch-src_geo_OCCFace.h b/cad/gmsh/files/patch-src_geo_OCCFace.h
new file mode 100644
index 000000000000..bf34b80f4372
--- /dev/null
+++ b/cad/gmsh/files/patch-src_geo_OCCFace.h
@@ -0,0 +1,11 @@
+--- src/geo/OCCFace.h.orig 2024-03-29 22:07:01 UTC
++++ src/geo/OCCFace.h
+@@ -42,7 +42,7 @@ class OCCFace : public GFace { (public)
+ virtual bool containsPoint(const SPoint3 &pt) const;
+ virtual bool containsParam(const SPoint2 &pt);
+ virtual SVector3 normal(const SPoint2 &param) const;
+- virtual Pair<SVector3, SVector3> firstDer(const SPoint2 &param) const;
++ virtual std::pair<SVector3, SVector3> firstDer(const SPoint2 &param) const;
+ virtual void secondDer(const SPoint2 &, SVector3 &, SVector3 &,
+ SVector3 &) const;
+ virtual GEntity::GeomType geomType() const;
diff --git a/cad/gmsh/files/patch-src_geo_Pair.h b/cad/gmsh/files/patch-src_geo_Pair.h
new file mode 100644
index 000000000000..d99d6a3bcd43
--- /dev/null
+++ b/cad/gmsh/files/patch-src_geo_Pair.h
@@ -0,0 +1,29 @@
+--- src/geo/Pair.h.orig 2024-03-29 22:07:01 UTC
++++ src/geo/Pair.h
+@@ -1,26 +0,0 @@
+-// Gmsh - Copyright (C) 1997-2024 C. Geuzaine, J.-F. Remacle
+-//
+-// See the LICENSE.txt file in the Gmsh root directory for license information.
+-// Please report all issues on https://gitlab.onelab.info/gmsh/gmsh/issues.
+-
+-#ifndef PAIR_H
+-#define PAIR_H
+-
+-// A pair of values, the types of which can be different
+-template <class L, class R> class Pair {
+-private:
+- L Left;
+- R Right;
+-
+-public:
+- Pair() {}
+- Pair(const L &left, const R &right) : Left(left), Right(right) {}
+- L left() const { return Left; }
+- void left(const L &left) { Left = left; }
+- R right() const { return Right; }
+- void right(const R &right) { Right = right; }
+- L first() const { return Left; }
+- R second() const { return Right; }
+-};
+-
+-#endif
diff --git a/cad/gmsh/files/patch-src_geo_discreteFace.cpp b/cad/gmsh/files/patch-src_geo_discreteFace.cpp
new file mode 100644
index 000000000000..52bbff44c5fe
--- /dev/null
+++ b/cad/gmsh/files/patch-src_geo_discreteFace.cpp
@@ -0,0 +1,33 @@
+--- src/geo/discreteFace.cpp.orig 2024-04-18 14:52:42 UTC
++++ src/geo/discreteFace.cpp
+@@ -363,16 +363,16 @@ double discreteFace::curvatures(const SPoint2 &param,
+ return false;
+ }
+
+-Pair<SVector3, SVector3> discreteFace::firstDer(const SPoint2 &param) const
++std::pair<SVector3, SVector3> discreteFace::firstDer(const SPoint2 &param) const
+ {
+- if(_param.empty()) return Pair<SVector3, SVector3>(SVector3(), SVector3());
++ if(_param.empty()) return std::make_pair(SVector3(), SVector3());
+
+ MElement *e = _param.oct->find(param.x(), param.y(), 0.0, -1, true);
+ if(!e) {
+ Msg::Info("Triangle not found for first derivative at uv=(%g,%g) on "
+ "discrete surface %d",
+ param.x(), param.y(), tag());
+- return Pair<SVector3, SVector3>(SVector3(1, 0, 0), SVector3(0, 1, 0));
++ return std::make_pair(SVector3(1, 0, 0), SVector3(0, 1, 0));
+ }
+
+ int position = (int)((MTriangle *)e - &_param.t2d[0]);
+@@ -403,8 +403,8 @@ Pair<SVector3, SVector3> discreteFace::firstDer(const
+ }
+ }
+
+- return Pair<SVector3, SVector3>(SVector3(dxdu[0][0], dxdu[1][0], dxdu[2][0]),
+- SVector3(dxdu[0][1], dxdu[1][1], dxdu[2][1]));
++ return std::make_pair(SVector3(dxdu[0][0], dxdu[1][0], dxdu[2][0]),
++ SVector3(dxdu[0][1], dxdu[1][1], dxdu[2][1]));
+ }
+
+ void discreteFace::secondDer(const SPoint2 &param, SVector3 &dudu,
diff --git a/cad/gmsh/files/patch-src_geo_discreteFace.h b/cad/gmsh/files/patch-src_geo_discreteFace.h
new file mode 100644
index 000000000000..dcbc173e68d0
--- /dev/null
+++ b/cad/gmsh/files/patch-src_geo_discreteFace.h
@@ -0,0 +1,11 @@
+--- src/geo/discreteFace.h.orig 2024-04-18 14:52:42 UTC
++++ src/geo/discreteFace.h
+@@ -60,7 +60,7 @@ class discreteFace : public GFace { (public)
+ double curvatures(const SPoint2 &param, SVector3 &dirMax, SVector3 &dirMin,
+ double &curvMax, double &curvMin) const;
+ GEntity::GeomType geomType() const { return DiscreteSurface; }
+- virtual Pair<SVector3, SVector3> firstDer(const SPoint2 &param) const;
++ virtual std::pair<SVector3, SVector3> firstDer(const SPoint2 &param) const;
+ virtual void secondDer(const SPoint2 &param, SVector3 &dudu, SVector3 &dvdv,
+ SVector3 &dudv) const;
+ int createGeometry();
diff --git a/cad/gmsh/files/patch-src_geo_gmshFace.cpp b/cad/gmsh/files/patch-src_geo_gmshFace.cpp
new file mode 100644
index 000000000000..ecdfdd1ec5b4
--- /dev/null
+++ b/cad/gmsh/files/patch-src_geo_gmshFace.cpp
@@ -0,0 +1,27 @@
+--- src/geo/gmshFace.cpp.orig 2024-03-29 22:07:01 UTC
++++ src/geo/gmshFace.cpp
+@@ -215,19 +215,19 @@ SVector3 gmshFace::normal(const SPoint2 &param) const
+ }
+ }
+
+-Pair<SVector3, SVector3> gmshFace::firstDer(const SPoint2 &param) const
++std::pair<SVector3, SVector3> gmshFace::firstDer(const SPoint2 &param) const
+ {
+ if(_s->Typ == MSH_SURF_PLAN && !_s->geometry) {
+ double x, y, z, VX[3], VY[3];
+ getMeanPlaneData(VX, VY, x, y, z);
+- return Pair<SVector3, SVector3>(SVector3(VX[0], VX[1], VX[2]),
+- SVector3(VY[0], VY[1], VY[2]));
++ return std::make_pair(SVector3(VX[0], VX[1], VX[2]),
++ SVector3(VY[0], VY[1], VY[2]));
+ }
+ else {
+ Vertex vu = InterpolateSurface(_s, param[0], param[1], 1, 1);
+ Vertex vv = InterpolateSurface(_s, param[0], param[1], 1, 2);
+- return Pair<SVector3, SVector3>(SVector3(vu.Pos.X, vu.Pos.Y, vu.Pos.Z),
+- SVector3(vv.Pos.X, vv.Pos.Y, vv.Pos.Z));
++ return std::make_pair(SVector3(vu.Pos.X, vu.Pos.Y, vu.Pos.Z),
++ SVector3(vv.Pos.X, vv.Pos.Y, vv.Pos.Z));
+ }
+ }
+
diff --git a/cad/gmsh/files/patch-src_geo_gmshFace.h b/cad/gmsh/files/patch-src_geo_gmshFace.h
new file mode 100644
index 000000000000..edb65b025f83
--- /dev/null
+++ b/cad/gmsh/files/patch-src_geo_gmshFace.h
@@ -0,0 +1,11 @@
+--- src/geo/gmshFace.h.orig 2024-03-29 22:07:01 UTC
++++ src/geo/gmshFace.h
+@@ -26,7 +26,7 @@ class gmshFace : public GFace { (public)
+ virtual bool containsPoint(const SPoint3 &pt) const;
+ virtual double getMetricEigenvalue(const SPoint2 &);
+ virtual SVector3 normal(const SPoint2 &param) const;
+- virtual Pair<SVector3, SVector3> firstDer(const SPoint2 &param) const;
++ virtual std::pair<SVector3, SVector3> firstDer(const SPoint2 &param) const;
+ virtual void secondDer(const SPoint2 &, SVector3 &, SVector3 &,
+ SVector3 &) const;
+ virtual GEntity::GeomType geomType() const;
diff --git a/cad/gmsh/files/patch-src_geo_gmshSurface.cpp b/cad/gmsh/files/patch-src_geo_gmshSurface.cpp
new file mode 100644
index 000000000000..7f744d3ebfda
--- /dev/null
+++ b/cad/gmsh/files/patch-src_geo_gmshSurface.cpp
@@ -0,0 +1,15 @@
+--- src/geo/gmshSurface.cpp.orig 2024-03-29 22:07:01 UTC
++++ src/geo/gmshSurface.cpp
+@@ -23,10 +23,10 @@ SVector3 gmshSurface::normal(const SPoint2 &param) con
+ return SVector3();
+ }
+
+-Pair<SVector3, SVector3> gmshSurface::firstDer(const SPoint2 &param)
++std::pair<SVector3, SVector3> gmshSurface::firstDer(const SPoint2 &param)
+ {
+ Msg::Error("First derivative not implemented for this type of surface");
+- return Pair<SVector3, SVector3>();
++ return std::pair<SVector3, SVector3>();
+ }
+
+ double gmshSurface::getMetricEigenvalue(const SPoint2 &)
diff --git a/cad/gmsh/files/patch-src_geo_gmshSurface.h b/cad/gmsh/files/patch-src_geo_gmshSurface.h
new file mode 100644
index 000000000000..42b306deb3aa
--- /dev/null
+++ b/cad/gmsh/files/patch-src_geo_gmshSurface.h
@@ -0,0 +1,19 @@
+--- src/geo/gmshSurface.h.orig 2024-03-29 22:07:01 UTC
++++ src/geo/gmshSurface.h
+@@ -9,7 +9,6 @@
+ #include <cmath>
+ #include <cstdio>
+ #include <map>
+-#include "Pair.h"
+ #include "Range.h"
+ #include "SPoint2.h"
+ #include "SPoint3.h"
+@@ -61,7 +60,7 @@ class gmshSurface { (public)
+ // Return the normal to the face at the given parameter location.
+ virtual SVector3 normal(const SPoint2 &param) const;
+ // Return the first derivate of the face at the parameter location.
+- virtual Pair<SVector3, SVector3> firstDer(const SPoint2 &param);
++ virtual std::pair<SVector3, SVector3> firstDer(const SPoint2 &param);
+ virtual double getMetricEigenvalue(const SPoint2 &);
+ };
+
diff --git a/cad/gmsh/files/patch-src_geo_xyFace.h b/cad/gmsh/files/patch-src_geo_xyFace.h
new file mode 100644
index 000000000000..f3e92019390e
--- /dev/null
+++ b/cad/gmsh/files/patch-src_geo_xyFace.h
@@ -0,0 +1,16 @@
+--- src/geo/xyFace.h.orig 2024-03-29 22:07:01 UTC
++++ src/geo/xyFace.h
+@@ -33,11 +33,11 @@ class xyFace : public GFace { (public)
+ SVector3 n(0, 0, 1);
+ return n;
+ }
+- virtual Pair<SVector3, SVector3> firstDer(const SPoint2 &param) const
++ virtual std::pair<SVector3, SVector3> firstDer(const SPoint2 &param) const
+ {
+ SVector3 t1(1, 0, 0);
+ SVector3 t2(0, 1, 0);
+- return Pair<SVector3, SVector3>(t1, t2);
++ return std::make_pair(t1, t2);
+ }
+ virtual void secondDer(const SPoint2 &, SVector3 &a, SVector3 &b,
+ SVector3 &c) const
diff --git a/cad/gmsh/files/patch-src_mesh_BackgroundMesh.cpp b/cad/gmsh/files/patch-src_mesh_BackgroundMesh.cpp
new file mode 100644
index 000000000000..91240206fb74
--- /dev/null
+++ b/cad/gmsh/files/patch-src_mesh_BackgroundMesh.cpp
@@ -0,0 +1,26 @@
+--- src/mesh/BackgroundMesh.cpp.orig 2024-03-29 22:07:01 UTC
++++ src/mesh/BackgroundMesh.cpp
+@@ -304,8 +304,8 @@ void backgroundMesh::propagateCrossFieldByDistance(GFa
+ SPoint2 p1, p2;
+ reparamMeshEdgeOnFace(v[0], v[1], _gf, p1, p2);
+ /* a correct way of computing angles */
+- Pair<SVector3, SVector3> der = _gf->firstDer((p1 + p2) * .5);
+- SVector3 t1 = der.first();
++ std::pair<SVector3, SVector3> der = _gf->firstDer((p1 + p2) * .5);
++ SVector3 t1 = der.first;
+ SVector3 t2(v[1]->x() - v[0]->x(), v[1]->y() - v[0]->y(),
+ v[1]->z() - v[0]->z());
+ t1.normalize();
+@@ -459,9 +459,9 @@ void backgroundMesh::propagateCrossField(GFace *_gf,
+ v[1] = (*it)->lines[i]->getVertex(1);
+ SPoint2 p1, p2;
+ reparamMeshEdgeOnFace(v[0], v[1], _gf, p1, p2);
+- Pair<SVector3, SVector3> der = _gf->firstDer((p1 + p2) * .5);
+- SVector3 t1 = der.first();
+- SVector3 t2 = der.second();
++ std::pair<SVector3, SVector3> der = _gf->firstDer((p1 + p2) * .5);
++ SVector3 t1 = der.first;
++ SVector3 t2 = der.second;
+ SVector3 n = crossprod(t1, t2);
+ n.normalize();
+ SVector3 d1(v[1]->x() - v[0]->x(), v[1]->y() - v[0]->y(),
diff --git a/cad/gmsh/files/patch-src_mesh_meshGFace.cpp b/cad/gmsh/files/patch-src_mesh_meshGFace.cpp
new file mode 100644
index 000000000000..fa08a01b01d7
--- /dev/null
+++ b/cad/gmsh/files/patch-src_mesh_meshGFace.cpp
@@ -0,0 +1,22 @@
+--- src/mesh/meshGFace.cpp.orig 2024-03-29 22:07:01 UTC
++++ src/mesh/meshGFace.cpp
+@@ -1269,7 +1269,7 @@ static bool improved_translate(GFace *gf, MVertex *ver
+ SVector3 s1, s2;
+ SVector3 normal;
+ SVector3 basis_u, basis_v;
+- Pair<SVector3, SVector3> derivatives;
++ std::pair<SVector3, SVector3> derivatives;
+
+ reparamMeshVertexOnFace(vertex, gf, point);
+ x = point.x();
+@@ -1278,8 +1278,8 @@ static bool improved_translate(GFace *gf, MVertex *ver
+ angle = backgroundMesh::current()->getAngle(x, y, 0.0);
+ derivatives = gf->firstDer(point);
+
+- s1 = derivatives.first();
+- s2 = derivatives.second();
++ s1 = derivatives.first;
++ s2 = derivatives.second;
+ normal = crossprod(s1, s2);
+
+ basis_u = s1;
diff --git a/cad/gmsh/files/patch-src_mesh_meshGFaceBamg.cpp b/cad/gmsh/files/patch-src_mesh_meshGFaceBamg.cpp
new file mode 100644
index 000000000000..ed95da9fb724
--- /dev/null
+++ b/cad/gmsh/files/patch-src_mesh_meshGFaceBamg.cpp
@@ -0,0 +1,24 @@
+--- src/mesh/meshGFaceBamg.cpp.orig 2024-03-29 22:07:01 UTC
++++ src/mesh/meshGFaceBamg.cpp
+@@ -49,14 +49,14 @@ static void computeMeshMetricsForBamg(GFace *gf, int n
+ SMetric3 m = BGM_MeshMetric(gf, u, v, gp.x(), gp.y(), gp.z());
+
+ // compute the derivatives of the parametrization
+- Pair<SVector3, SVector3> der = gf->firstDer(SPoint2(u, v));
++ std::pair<SVector3, SVector3> der = gf->firstDer(SPoint2(u, v));
+
+- J(0, 0) = JT(0, 0) = der.first().x();
+- J(0, 1) = JT(1, 0) = der.first().y();
+- J(0, 2) = JT(2, 0) = der.first().z();
+- J(1, 0) = JT(0, 1) = der.second().x();
+- J(1, 1) = JT(1, 1) = der.second().y();
+- J(1, 2) = JT(2, 1) = der.second().z();
++ J(0, 0) = JT(0, 0) = der.first.x();
++ J(0, 1) = JT(1, 0) = der.first.y();
++ J(0, 2) = JT(2, 0) = der.first.z();
++ J(1, 0) = JT(0, 1) = der.second.x();
++ J(1, 1) = JT(1, 1) = der.second.y();
++ J(1, 2) = JT(2, 1) = der.second.z();
+
+ m.getMat(M);
+ J.mult(M, W);
diff --git a/cad/gmsh/files/patch-src_mesh_meshGFaceDelaunayInsertion.cpp b/cad/gmsh/files/patch-src_mesh_meshGFaceDelaunayInsertion.cpp
new file mode 100644
index 000000000000..2b1e1644b5cd
--- /dev/null
+++ b/cad/gmsh/files/patch-src_mesh_meshGFaceDelaunayInsertion.cpp
@@ -0,0 +1,18 @@
+--- src/mesh/meshGFaceDelaunayInsertion.cpp.orig 2024-03-29 22:07:01 UTC
++++ src/mesh/meshGFaceDelaunayInsertion.cpp
+@@ -331,11 +331,11 @@ void buildMetric(GFace *gf, double *uv, double *metric
+
+ void buildMetric(GFace *gf, double *uv, double *metric)
+ {
+- Pair<SVector3, SVector3> der = gf->firstDer(SPoint2(uv[0], uv[1]));
++ std::pair<SVector3, SVector3> der = gf->firstDer(SPoint2(uv[0], uv[1]));
+
+- metric[0] = dot(der.first(), der.first());
+- metric[1] = dot(der.second(), der.first());
+- metric[2] = dot(der.second(), der.second());
++ metric[0] = dot(der.first, der.first);
++ metric[1] = dot(der.second, der.first);
++ metric[2] = dot(der.second, der.second);
+ }
+
+ static double computeTolerance(const double radius)