resolve_periodic2_collision_config Subroutine

public subroutine resolve_periodic2_collision_config(sim, use_periodic2, periodic_axes, periodic_len)

periodic2 collision で使う 2 軸周期設定を検証付きで解決する。

Arguments

Type IntentOptional Attributes Name
type(sim_config), intent(in) :: sim
logical, intent(out) :: use_periodic2
integer(kind=i32), intent(out) :: periodic_axes(2)
real(kind=dp), intent(out) :: periodic_len(2)

Calls

proc~~resolve_periodic2_collision_config~2~~CallsGraph proc~resolve_periodic2_collision_config~2 resolve_periodic2_collision_config proc~lower_ascii lower_ascii proc~resolve_periodic2_collision_config~2->proc~lower_ascii

Called by

proc~~resolve_periodic2_collision_config~2~~CalledByGraph proc~resolve_periodic2_collision_config~2 resolve_periodic2_collision_config proc~prepare_periodic2_collision_mesh prepare_periodic2_collision_mesh proc~prepare_periodic2_collision_mesh->proc~resolve_periodic2_collision_config~2 proc~load_or_init_run_state load_or_init_run_state proc~load_or_init_run_state->proc~prepare_periodic2_collision_mesh program~main main program~main->proc~load_or_init_run_state

Source Code

  subroutine resolve_periodic2_collision_config(sim, use_periodic2, periodic_axes, periodic_len)
    type(sim_config), intent(in) :: sim
    logical, intent(out) :: use_periodic2
    integer(i32), intent(out) :: periodic_axes(2)
    real(dp), intent(out) :: periodic_len(2)

    character(len=16) :: field_bc_mode
    integer(i32) :: axis, n_periodic
    real(dp) :: span

    use_periodic2 = .false.
    periodic_axes = 0_i32
    periodic_len = 0.0d0
    field_bc_mode = lower_ascii(trim(sim%field_bc_mode))
    if (trim(field_bc_mode) /= 'periodic2') return

    if (.not. sim%use_box) then
      error stop 'sim.field_bc_mode="periodic2" requires sim.use_box=true.'
    end if

    n_periodic = 0_i32
    do axis = 1_i32, 3_i32
      if ((sim%bc_low(axis) == bc_periodic) .neqv. (sim%bc_high(axis) == bc_periodic)) then
        error stop 'periodic2 requires bc_low(axis)=bc_high(axis)=periodic for periodic axes.'
      end if
      if (sim%bc_low(axis) == bc_periodic) then
        n_periodic = n_periodic + 1_i32
        if (n_periodic <= 2_i32) periodic_axes(n_periodic) = axis
      end if
    end do
    if (n_periodic /= 2_i32) then
      error stop 'sim.field_bc_mode="periodic2" requires exactly two periodic axes.'
    end if

    do axis = 1_i32, 2_i32
      span = sim%box_max(periodic_axes(axis)) - sim%box_min(periodic_axes(axis))
      if (span <= 0.0d0) error stop 'periodic2 requires positive box length on periodic axes.'
      periodic_len(axis) = span
    end do

    use_periodic2 = .true.
  end subroutine resolve_periodic2_collision_config