Skip to content

Commit bfe4475

Browse files
GRIDEDIT-2189: Fixed transfinite curvilinear grid generation with reversed splines
1 parent 0430103 commit bfe4475

File tree

2 files changed

+160
-0
lines changed

2 files changed

+160
-0
lines changed

libs/MeshKernel/src/CurvilinearGrid/CurvilinearGridFromSplinesTransfinite.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -381,6 +381,7 @@ void CurvilinearGridFromSplinesTransfinite::ComputeInteractions()
381381
{
382382
// switch j
383383
std::ranges::reverse(m_splines->m_splineNodes[j]);
384+
std::ranges::reverse(m_splines->m_splineDerivatives[j]);
384385
secondSplineRatio = static_cast<double>(numNodesJSpline) - 1.0 - secondSplineRatio;
385386
}
386387
}
@@ -391,6 +392,7 @@ void CurvilinearGridFromSplinesTransfinite::ComputeInteractions()
391392
{
392393
// switch i
393394
std::ranges::reverse(m_splines->m_splineNodes[i]);
395+
std::ranges::reverse(m_splines->m_splineDerivatives[i]);
394396
firstSplineRatio = static_cast<double>(numNodesISpline) - 1.0 - firstSplineRatio;
395397
}
396398
}

libs/MeshKernel/tests/src/CurvilinearGridFromSplinesTransfiniteTests.cpp

Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,164 @@ TEST(CurvilinearGridFromSplinesTransfinite, FourSplinesOneNSwapped)
229229
ASSERT_NEAR(85.932983124208747, curvilinearGrid->GetNode(10, 1).y, tolerance);
230230
}
231231

232+
TEST(CurvilinearGridFromSplinesTransfinite, FourSplinesOneNReversed)
233+
{
234+
std::vector<Point> firstSpline{{2.172341E+02, -2.415445E+01},
235+
{4.314185E+02, 1.947381E+02},
236+
{8.064374E+02, 3.987241E+02}};
237+
238+
auto splines = std::make_shared<Splines>(Projection::cartesian);
239+
splines->AddSpline(firstSpline);
240+
241+
std::vector<Point> secondSpline{{2.894012E+01, 2.010146E+02},
242+
{2.344944E+02, 3.720490E+02},
243+
{6.424647E+02, 5.917262E+02}};
244+
splines->AddSpline(secondSpline);
245+
246+
std::vector<Point> thirdSpline{{2.799988E+02, -2.807726E+01},
247+
{2.265137E+00, 2.802553E+02}};
248+
splines->AddSpline(thirdSpline);
249+
250+
std::vector<Point> fourthSpline{{5.067361E+02, 6.034946E+02},
251+
{7.475956E+02, 3.336055E+02}};
252+
splines->AddSpline(fourthSpline);
253+
254+
CurvilinearParameters curvilinearParameters;
255+
curvilinearParameters.n_refinement = 40;
256+
curvilinearParameters.m_refinement = 20;
257+
CurvilinearGridFromSplinesTransfinite curvilinearGridFromSplinesTransfinite(splines, curvilinearParameters);
258+
259+
const auto curvilinearGrid = curvilinearGridFromSplinesTransfinite.Compute();
260+
261+
constexpr double tolerance = 1e-6;
262+
ASSERT_NEAR(244.84733455150598, curvilinearGrid->GetNode(0, 0).x, tolerance);
263+
ASSERT_NEAR(240.03223719861575, curvilinearGrid->GetNode(1, 0).x, tolerance);
264+
ASSERT_NEAR(235.21721587684686, curvilinearGrid->GetNode(2, 0).x, tolerance);
265+
ASSERT_NEAR(230.40187707543339, curvilinearGrid->GetNode(3, 0).x, tolerance);
266+
ASSERT_NEAR(225.58666038317327, curvilinearGrid->GetNode(4, 0).x, tolerance);
267+
ASSERT_NEAR(220.77175891290770, curvilinearGrid->GetNode(5, 0).x, tolerance);
268+
ASSERT_NEAR(215.95654192442103, curvilinearGrid->GetNode(6, 0).x, tolerance);
269+
ASSERT_NEAR(211.14151904110099, curvilinearGrid->GetNode(7, 0).x, tolerance);
270+
ASSERT_NEAR(206.32630377949152, curvilinearGrid->GetNode(8, 0).x, tolerance);
271+
ASSERT_NEAR(201.51108480926104, curvilinearGrid->GetNode(9, 0).x, tolerance);
272+
ASSERT_NEAR(196.69606411139034, curvilinearGrid->GetNode(10, 0).x, tolerance);
273+
274+
ASSERT_NEAR(10.946966348412502, curvilinearGrid->GetNode(0, 0).y, tolerance);
275+
ASSERT_NEAR(16.292559955716278, curvilinearGrid->GetNode(1, 0).y, tolerance);
276+
ASSERT_NEAR(21.638069155281958, curvilinearGrid->GetNode(2, 0).y, tolerance);
277+
ASSERT_NEAR(26.983930812344244, curvilinearGrid->GetNode(3, 0).y, tolerance);
278+
ASSERT_NEAR(32.329656907057121, curvilinearGrid->GetNode(4, 0).y, tolerance);
279+
ASSERT_NEAR(37.675033050656793, curvilinearGrid->GetNode(5, 0).y, tolerance);
280+
ASSERT_NEAR(43.020759474232527, curvilinearGrid->GetNode(6, 0).y, tolerance);
281+
ASSERT_NEAR(48.366270407390992, curvilinearGrid->GetNode(7, 0).y, tolerance);
282+
ASSERT_NEAR(53.711994913833436, curvilinearGrid->GetNode(8, 0).y, tolerance);
283+
ASSERT_NEAR(59.057723537488684, curvilinearGrid->GetNode(9, 0).y, tolerance);
284+
ASSERT_NEAR(64.403232044419184, curvilinearGrid->GetNode(10, 0).y, tolerance);
285+
286+
ASSERT_NEAR(263.67028430842242, curvilinearGrid->GetNode(0, 1).x, tolerance);
287+
ASSERT_NEAR(259.11363739326902, curvilinearGrid->GetNode(1, 1).x, tolerance);
288+
ASSERT_NEAR(254.53691267796933, curvilinearGrid->GetNode(2, 1).x, tolerance);
289+
ASSERT_NEAR(249.93698634609487, curvilinearGrid->GetNode(3, 1).x, tolerance);
290+
ASSERT_NEAR(245.31456069699095, curvilinearGrid->GetNode(4, 1).x, tolerance);
291+
ASSERT_NEAR(240.66785332275725, curvilinearGrid->GetNode(5, 1).x, tolerance);
292+
ASSERT_NEAR(235.99933187522288, curvilinearGrid->GetNode(6, 1).x, tolerance);
293+
ASSERT_NEAR(231.30940727936030, curvilinearGrid->GetNode(7, 1).x, tolerance);
294+
ASSERT_NEAR(226.60252865287427, curvilinearGrid->GetNode(8, 1).x, tolerance);
295+
ASSERT_NEAR(221.88022520931327, curvilinearGrid->GetNode(9, 1).x, tolerance);
296+
ASSERT_NEAR(217.14743651601677, curvilinearGrid->GetNode(10, 1).x, tolerance);
297+
298+
ASSERT_NEAR(34.264668045745267, curvilinearGrid->GetNode(0, 1).y, tolerance);
299+
ASSERT_NEAR(39.307546170495868, curvilinearGrid->GetNode(1, 1).y, tolerance);
300+
ASSERT_NEAR(44.379080332661857, curvilinearGrid->GetNode(2, 1).y, tolerance);
301+
ASSERT_NEAR(49.481517460105827, curvilinearGrid->GetNode(3, 1).y, tolerance);
302+
ASSERT_NEAR(54.613111211730796, curvilinearGrid->GetNode(4, 1).y, tolerance);
303+
ASSERT_NEAR(59.775023214376127, curvilinearGrid->GetNode(5, 1).y, tolerance);
304+
ASSERT_NEAR(64.963841851929189, curvilinearGrid->GetNode(6, 1).y, tolerance);
305+
ASSERT_NEAR(70.178519042215470, curvilinearGrid->GetNode(7, 1).y, tolerance);
306+
ASSERT_NEAR(75.413628528250186, curvilinearGrid->GetNode(8, 1).y, tolerance);
307+
ASSERT_NEAR(80.667056521594716, curvilinearGrid->GetNode(9, 1).y, tolerance);
308+
ASSERT_NEAR(85.932983124208747, curvilinearGrid->GetNode(10, 1).y, tolerance);
309+
}
310+
311+
TEST(CurvilinearGridFromSplinesTransfinite, FourSplinesOneMReversed)
312+
{
313+
std::vector<Point> firstSpline{{2.172341E+02, -2.415445E+01},
314+
{4.314185E+02, 1.947381E+02},
315+
{8.064374E+02, 3.987241E+02}};
316+
317+
auto splines = std::make_shared<Splines>(Projection::cartesian);
318+
splines->AddSpline(firstSpline);
319+
320+
std::vector<Point> secondSpline{{6.424647E+02, 5.917262E+02},
321+
{2.344944E+02, 3.720490E+02},
322+
{2.894012E+01, 2.010146E+02}};
323+
splines->AddSpline(secondSpline);
324+
325+
std::vector<Point> thirdSpline{{2.265137E+00, 2.802553E+02},
326+
{2.799988E+02, -2.807726E+01}};
327+
splines->AddSpline(thirdSpline);
328+
329+
std::vector<Point> fourthSpline{{5.067361E+02, 6.034946E+02},
330+
{7.475956E+02, 3.336055E+02}};
331+
splines->AddSpline(fourthSpline);
332+
333+
CurvilinearParameters curvilinearParameters;
334+
curvilinearParameters.n_refinement = 40;
335+
curvilinearParameters.m_refinement = 20;
336+
CurvilinearGridFromSplinesTransfinite curvilinearGridFromSplinesTransfinite(splines, curvilinearParameters);
337+
338+
const auto curvilinearGrid = curvilinearGridFromSplinesTransfinite.Compute();
339+
340+
constexpr double tolerance = 1e-6;
341+
ASSERT_NEAR(244.84733455150598, curvilinearGrid->GetNode(0, 0).x, tolerance);
342+
ASSERT_NEAR(240.03223719861575, curvilinearGrid->GetNode(1, 0).x, tolerance);
343+
ASSERT_NEAR(235.21721587684686, curvilinearGrid->GetNode(2, 0).x, tolerance);
344+
ASSERT_NEAR(230.40187707543339, curvilinearGrid->GetNode(3, 0).x, tolerance);
345+
ASSERT_NEAR(225.58666038317327, curvilinearGrid->GetNode(4, 0).x, tolerance);
346+
ASSERT_NEAR(220.77175891290770, curvilinearGrid->GetNode(5, 0).x, tolerance);
347+
ASSERT_NEAR(215.95654192442103, curvilinearGrid->GetNode(6, 0).x, tolerance);
348+
ASSERT_NEAR(211.14151904110099, curvilinearGrid->GetNode(7, 0).x, tolerance);
349+
ASSERT_NEAR(206.32630377949152, curvilinearGrid->GetNode(8, 0).x, tolerance);
350+
ASSERT_NEAR(201.51108480926104, curvilinearGrid->GetNode(9, 0).x, tolerance);
351+
ASSERT_NEAR(196.69606411139034, curvilinearGrid->GetNode(10, 0).x, tolerance);
352+
353+
ASSERT_NEAR(10.946966348412502, curvilinearGrid->GetNode(0, 0).y, tolerance);
354+
ASSERT_NEAR(16.292559955716278, curvilinearGrid->GetNode(1, 0).y, tolerance);
355+
ASSERT_NEAR(21.638069155281958, curvilinearGrid->GetNode(2, 0).y, tolerance);
356+
ASSERT_NEAR(26.983930812344244, curvilinearGrid->GetNode(3, 0).y, tolerance);
357+
ASSERT_NEAR(32.329656907057121, curvilinearGrid->GetNode(4, 0).y, tolerance);
358+
ASSERT_NEAR(37.675033050656793, curvilinearGrid->GetNode(5, 0).y, tolerance);
359+
ASSERT_NEAR(43.020759474232527, curvilinearGrid->GetNode(6, 0).y, tolerance);
360+
ASSERT_NEAR(48.366270407390992, curvilinearGrid->GetNode(7, 0).y, tolerance);
361+
ASSERT_NEAR(53.711994913833436, curvilinearGrid->GetNode(8, 0).y, tolerance);
362+
ASSERT_NEAR(59.057723537488684, curvilinearGrid->GetNode(9, 0).y, tolerance);
363+
ASSERT_NEAR(64.403232044419184, curvilinearGrid->GetNode(10, 0).y, tolerance);
364+
365+
ASSERT_NEAR(263.67028430842242, curvilinearGrid->GetNode(0, 1).x, tolerance);
366+
ASSERT_NEAR(259.11363739326902, curvilinearGrid->GetNode(1, 1).x, tolerance);
367+
ASSERT_NEAR(254.53691267796933, curvilinearGrid->GetNode(2, 1).x, tolerance);
368+
ASSERT_NEAR(249.93698634609487, curvilinearGrid->GetNode(3, 1).x, tolerance);
369+
ASSERT_NEAR(245.31456069699095, curvilinearGrid->GetNode(4, 1).x, tolerance);
370+
ASSERT_NEAR(240.66785332275725, curvilinearGrid->GetNode(5, 1).x, tolerance);
371+
ASSERT_NEAR(235.99933187522288, curvilinearGrid->GetNode(6, 1).x, tolerance);
372+
ASSERT_NEAR(231.30940727936030, curvilinearGrid->GetNode(7, 1).x, tolerance);
373+
ASSERT_NEAR(226.60252865287427, curvilinearGrid->GetNode(8, 1).x, tolerance);
374+
ASSERT_NEAR(221.88022520931327, curvilinearGrid->GetNode(9, 1).x, tolerance);
375+
ASSERT_NEAR(217.14743651601677, curvilinearGrid->GetNode(10, 1).x, tolerance);
376+
377+
ASSERT_NEAR(34.264668045745267, curvilinearGrid->GetNode(0, 1).y, tolerance);
378+
ASSERT_NEAR(39.307546170495868, curvilinearGrid->GetNode(1, 1).y, tolerance);
379+
ASSERT_NEAR(44.379080332661857, curvilinearGrid->GetNode(2, 1).y, tolerance);
380+
ASSERT_NEAR(49.481517460105827, curvilinearGrid->GetNode(3, 1).y, tolerance);
381+
ASSERT_NEAR(54.613111211730796, curvilinearGrid->GetNode(4, 1).y, tolerance);
382+
ASSERT_NEAR(59.775023214376127, curvilinearGrid->GetNode(5, 1).y, tolerance);
383+
ASSERT_NEAR(64.963841851929189, curvilinearGrid->GetNode(6, 1).y, tolerance);
384+
ASSERT_NEAR(70.178519042215470, curvilinearGrid->GetNode(7, 1).y, tolerance);
385+
ASSERT_NEAR(75.413628528250186, curvilinearGrid->GetNode(8, 1).y, tolerance);
386+
ASSERT_NEAR(80.667056521594716, curvilinearGrid->GetNode(9, 1).y, tolerance);
387+
ASSERT_NEAR(85.932983124208747, curvilinearGrid->GetNode(10, 1).y, tolerance);
388+
}
389+
232390
TEST(CurvilinearGridFromSplinesTransfinite, FiveSplines)
233391
{
234392
std::vector<Point> firstSpline{{2.172341E+02, -2.415445E+01},

0 commit comments

Comments
 (0)