予測中点の電場と一様磁場を使い、次時刻の位置・速度候補を返す。
| Type | Intent | Optional | 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 |
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