canonicalize_periodic_emission_position Subroutine

public pure subroutine canonicalize_periodic_emission_position(sim, position)

法線offset後の周期軸をprimary cellのstrict interiorへ戻す。

Arguments

Type IntentOptional Attributes Name
class(photo_raycast_config), intent(in) :: sim
real(kind=dp), intent(inout) :: position(3)

Called by

proc~~canonicalize_periodic_emission_position~~CalledByGraph proc~canonicalize_periodic_emission_position canonicalize_periodic_emission_position proc~cast_photo_ray cast_photo_ray proc~cast_photo_ray->proc~canonicalize_periodic_emission_position proc~sample_photo_ray_slot sample_photo_ray_slot proc~sample_photo_ray_slot->proc~cast_photo_ray

Source Code

  pure subroutine canonicalize_periodic_emission_position(sim, position)
    class(photo_raycast_config), intent(in) :: sim
    real(dp), intent(inout) :: position(3)
    integer(i32) :: axis
    real(dp) :: span, scale, inset

    do axis = 1_i32, 3_i32
      if (sim%bc_low(axis) /= bc_periodic .or. sim%bc_high(axis) /= bc_periodic) cycle
      span = sim%box_max(axis) - sim%box_min(axis)
      scale = max(abs(sim%box_min(axis)), abs(sim%box_max(axis)), span, tiny(1.0_dp))
      inset = max(64.0_dp*epsilon(1.0_dp)*scale, spacing(scale))
      inset = min(0.25_dp*span, inset)
      position(axis) = sim%box_min(axis) + modulo(position(axis) - sim%box_min(axis), span)
      position(axis) = min(max(position(axis), sim%box_min(axis) + inset), sim%box_max(axis) - inset)
    end do
  end subroutine canonicalize_periodic_emission_position