@@ -212,7 +212,7 @@ contains
212212
213213 type(scalar_field), dimension (:), intent (in ) :: v_vf
214214 integer :: j, k, l
215- real (wp) :: nr_x, nr_y, nr_z, nmag, ac
215+ real (wp) :: nr_x, nr_y, nr_z, nmag, nmax, ac
216216 type(int_bounds_info), dimension (3 ) :: id_norm
217217
218218 $:GPU_PARALLEL_LOOP(collapse= 3 , private= ' [j, k, l]' )
@@ -239,7 +239,7 @@ contains
239239 end if
240240
241241 ! Compute unit normal and solve for d at interior
242- $:GPU_PARALLEL_LOOP(collapse= 3 , private= ' [j, k, l, nr_x, nr_y, nr_z, nmag, ac]' , copyin= ' [id_norm]' )
242+ $:GPU_PARALLEL_LOOP(collapse= 3 , private= ' [j, k, l, nr_x, nr_y, nr_z, nmag, nmax, ac]' , copyin= ' [id_norm]' )
243243 do l = id_norm(3 )%beg, id_norm(3 )%end
244244 do k = id_norm(2 )%beg, id_norm(2 )%end
245245 do j = id_norm(1 )%beg, id_norm(1 )%end
@@ -265,6 +265,16 @@ contains
265265 nr_y = nr_y/ nmag
266266 nr_z = nr_z/ nmag
267267
268+ ! Snap near- grid- aligned normals to exact alignment
269+ nmax = max (abs (nr_x), abs (nr_y), abs (nr_z))
270+ if (abs (nr_x) < mthinc_align_tol* nmax) nr_x = 0._wp
271+ if (abs (nr_y) < mthinc_align_tol* nmax) nr_y = 0._wp
272+ if (abs (nr_z) < mthinc_align_tol* nmax) nr_z = 0._wp
273+ nmag = sqrt (nr_x* nr_x + nr_y* nr_y + nr_z* nr_z)
274+ nr_x = nr_x/ nmag
275+ nr_y = nr_y/ nmag
276+ nr_z = nr_z/ nmag
277+
268278 mthinc_nhat(1 , j, k, l) = nr_x
269279 mthinc_nhat(2 , j, k, l) = nr_y
270280 mthinc_nhat(3 , j, k, l) = nr_z
0 commit comments