@@ -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