Skip to content

Commit 91e0f50

Browse files
Temporary fix for issue involving cuboid normal vector selection. Comment has been left.
1 parent d13de48 commit 91e0f50

File tree

1 file changed

+63
-27
lines changed

1 file changed

+63
-27
lines changed

src/common/m_compute_levelset.fpp

Lines changed: 63 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -372,40 +372,76 @@ contains
372372
(xyz_local(3) > Back .and. xyz_local(3) < Front)) then
373373
374374
side_dists(1) = Left - xyz_local(1)
375-
side_dists(2) = Right - xyz_local(1)
375+
side_dists(2) = xyz_local(1) - Right
376376
side_dists(3) = Bottom - xyz_local(2)
377-
side_dists(4) = Top - xyz_local(2)
377+
side_dists(4) = xyz_local(2) - Top
378378
side_dists(5) = Back - xyz_local(3)
379-
side_dists(6) = Front - xyz_local(3)
380-
381-
! get the minimal_distance
382-
min_dist = side_dists(1)
383-
idx = 1
384-
do l = 2, 6
385-
if (abs(side_dists(l)) < abs(min_dist)) then
386-
idx = l
387-
min_dist = side_dists(idx)
379+
side_dists(6) = xyz_local(3) - Front
380+
min_dist = minval(abs(side_dists))
381+
382+
! TODO :: The way that this is written, it looks like we will
383+
! trigger at the first size that is close to the minimum distance,
384+
! meaning corners where side_dists are the same will
385+
! trigger on what may not actually be the minimum,
386+
! leading to undesired behavior. This should be resolved
387+
! and this code should be cleaned up. I verified this behavior
388+
! with tests.
389+
if (f_approx_equal(min_dist, abs(side_dists(1)))) then
390+
levelset%sf(i, j, k, ib_patch_id) = side_dists(1)
391+
if (f_approx_equal(side_dists(1), 0._wp)) then
392+
levelset_norm%sf(i, j, k, ib_patch_id, 1) = 0._wp
393+
else
394+
levelset_norm%sf(i, j, k, ib_patch_id, 1) = side_dists(1)/ &
395+
abs(side_dists(1))
396+
end if
397+
398+
else if (f_approx_equal(min_dist, abs(side_dists(2)))) then
399+
levelset%sf(i, j, k, ib_patch_id) = side_dists(2)
400+
if (f_approx_equal(side_dists(2), 0._wp)) then
401+
levelset_norm%sf(i, j, k, ib_patch_id, 1) = 0._wp
402+
else
403+
levelset_norm%sf(i, j, k, ib_patch_id, 1) = -side_dists(2)/ &
404+
abs(side_dists(2))
388405
end if
389-
end do
390406
391-
levelset%sf(i, j, k, ib_patch_id) = min_dist
392-
if (f_approx_equal(min_dist, 0._wp)) then
393-
levelset_norm%sf(i, j, k, ib_patch_id, :) = 0._wp
394-
else
395-
if (idx == 1 .or. idx == 2) then
396-
levelset_norm%sf(i, j, k, ib_patch_id, 1) = side_dists(idx)/ &
397-
abs(side_dists(idx))
398-
else if (idx == 3 .or. idx == 4) then
399-
levelset_norm%sf(i, j, k, ib_patch_id, 2) = side_dists(idx)/ &
400-
abs(side_dists(idx))
407+
else if (f_approx_equal(min_dist, abs(side_dists(3)))) then
408+
levelset%sf(i, j, k, ib_patch_id) = side_dists(3)
409+
if (f_approx_equal(side_dists(3), 0._wp)) then
410+
levelset_norm%sf(i, j, k, ib_patch_id, 2) = 0._wp
411+
else
412+
levelset_norm%sf(i, j, k, ib_patch_id, 2) = side_dists(3)/ &
413+
abs(side_dists(3))
414+
end if
415+
416+
else if (f_approx_equal(min_dist, abs(side_dists(4)))) then
417+
levelset%sf(i, j, k, ib_patch_id) = side_dists(4)
418+
if (f_approx_equal(side_dists(4), 0._wp)) then
419+
levelset_norm%sf(i, j, k, ib_patch_id, 2) = 0._wp
401420
else
402-
levelset_norm%sf(i, j, k, ib_patch_id, 2) = side_dists(idx)/ &
403-
abs(side_dists(idx))
421+
levelset_norm%sf(i, j, k, ib_patch_id, 2) = -side_dists(4)/ &
422+
abs(side_dists(4))
423+
end if
424+
425+
else if (f_approx_equal(min_dist, abs(side_dists(5)))) then
426+
levelset%sf(i, j, k, ib_patch_id) = side_dists(5)
427+
if (f_approx_equal(side_dists(5), 0._wp)) then
428+
levelset_norm%sf(i, j, k, ib_patch_id, 3) = 0._wp
429+
else
430+
levelset_norm%sf(i, j, k, ib_patch_id, 3) = side_dists(5)/ &
431+
abs(side_dists(5))
432+
end if
433+
434+
else if (f_approx_equal(min_dist, abs(side_dists(6)))) then
435+
levelset%sf(i, j, k, ib_patch_id) = side_dists(6)
436+
if (f_approx_equal(side_dists(6), 0._wp)) then
437+
levelset_norm%sf(i, j, k, ib_patch_id, 3) = 0._wp
438+
else
439+
levelset_norm%sf(i, j, k, ib_patch_id, 3) = -side_dists(6)/ &
440+
abs(side_dists(6))
404441
end if
405-
! convert the normal vector back into the global coordinate system
406-
levelset_norm%sf(i, j, k, ib_patch_id, :) = &
407-
matmul(rotation, levelset_norm%sf(i, j, k, ib_patch_id, :))
408442
end if
443+
levelset_norm%sf(i, j, 0, ib_patch_id, :) = &
444+
matmul(rotation, levelset_norm%sf(i, j, 0, ib_patch_id, :))
409445
end if
410446
end do
411447
end do

0 commit comments

Comments
 (0)