build_particle_step_candidate Subroutine

public subroutine build_particle_step_candidate(mesh, sim, snapshot, bfield, x0, v0, q, m, dt, x1, v1, sampled_electric_field, use_upper_panel_fourier, field_available)

予測中点の電場と一様磁場を使い、次時刻の位置・速度候補を返す。

Arguments

Type IntentOptional Attributes Name
type(mesh_type), intent(in) :: mesh
type(sim_config), intent(in) :: sim
type(electrostatic_snapshot_type), intent(inout) :: snapshot
real(kind=dp), intent(in) :: bfield(3)
real(kind=dp), intent(in) :: x0(3)
real(kind=dp), intent(in) :: v0(3)
real(kind=dp), intent(in) :: q
real(kind=dp), intent(in) :: m
real(kind=dp), intent(in) :: dt
real(kind=dp), intent(out) :: x1(3)
real(kind=dp), intent(out) :: v1(3)
real(kind=dp), intent(out), optional :: sampled_electric_field(3)
logical, intent(in), optional :: use_upper_panel_fourier
logical, intent(out), optional :: field_available

Calls

proc~~build_particle_step_candidate~~CallsGraph proc~build_particle_step_candidate build_particle_step_candidate none~eval_local_e electrostatic_snapshot_type%eval_local_e proc~build_particle_step_candidate->none~eval_local_e none~eval_upper_panel_fourier_e electrostatic_snapshot_type%eval_upper_panel_fourier_e proc~build_particle_step_candidate->none~eval_upper_panel_fourier_e proc~boris_push boris_push proc~build_particle_step_candidate->proc~boris_push proc~boris_update_velocity boris_update_velocity proc~boris_push->proc~boris_update_velocity proc~cross~2 cross proc~boris_update_velocity->proc~cross~2

Called by

proc~~build_particle_step_candidate~~CalledByGraph proc~build_particle_step_candidate build_particle_step_candidate proc~advance_particle_step advance_particle_step proc~advance_particle_step->proc~build_particle_step_candidate proc~advance_particle_step_upper_panel_fourier advance_particle_step_upper_panel_fourier proc~advance_particle_step_upper_panel_fourier->proc~build_particle_step_candidate proc~resolve_particle_boundary_candidate resolve_particle_boundary_candidate proc~resolve_particle_boundary_candidate->proc~build_particle_step_candidate

Source Code

  subroutine build_particle_step_candidate( &
    mesh, sim, snapshot, bfield, x0, v0, q, m, dt, x1, v1, sampled_electric_field, &
    use_upper_panel_fourier, field_available &
    )
    type(mesh_type), intent(in) :: mesh
    type(sim_config), intent(in) :: sim
    type(electrostatic_snapshot_type), intent(inout) :: snapshot
    real(dp), intent(in) :: bfield(3), x0(3), v0(3), q, m, dt
    real(dp), intent(out) :: x1(3), v1(3)
    real(dp), intent(out), optional :: sampled_electric_field(3)
    logical, intent(in), optional :: use_upper_panel_fourier
    logical, intent(out), optional :: field_available
    real(dp) :: x_mid(3), e_mid(3)
    logical :: available, use_upper

    x_mid = x0 + 0.5d0*v0*dt
    call project_field_sample_to_box(sim, x_mid)
    use_upper = .false.
    if (present(use_upper_panel_fourier)) use_upper = use_upper_panel_fourier
    available = .true.
    if (use_upper) then
      call snapshot%eval_upper_panel_fourier_e(mesh, x_mid, e_mid, available)
    else
      call snapshot%eval_local_e(mesh, x_mid, e_mid)
    end if
    if (present(field_available)) field_available = available
    if (.not. available) then
      x1 = x0
      v1 = v0
      if (present(sampled_electric_field)) sampled_electric_field = 0.0_dp
      return
    end if
    call boris_push(x0, v0, q, m, dt, e_mid, bfield, x1, v1)
    if (present(sampled_electric_field)) sampled_electric_field = e_mid
  end subroutine build_particle_step_candidate