構築済みcandidateとその場評価値からbox eventを解決する。
| 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(in) | :: | x_candidate(3) | |||
| real(kind=dp), | intent(in) | :: | v_candidate(3) | |||
| type(hit_info), | intent(in), | optional | :: | hit | ||
| type(particle_step_result), | intent(out) | :: | result | |||
| type(external_boundary_contract_type), | intent(in), | optional | :: | boundary_contract | ||
| integer(kind=i64), | intent(in), | optional | :: | boundary_rng_counter(4) | ||
| real(kind=dp), | intent(in), | optional | :: | sampled_electric_field(3) |
subroutine resolve_particle_boundary_candidate( & mesh, sim, snapshot, bfield, x0, v0, q, m, dt, x_candidate, v_candidate, hit, result, boundary_contract, & boundary_rng_counter, sampled_electric_field & ) 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, x_candidate(3), v_candidate(3) type(hit_info), intent(in), optional :: hit type(particle_step_result), intent(out) :: result type(external_boundary_contract_type), intent(in), optional :: boundary_contract integer(i64), intent(in), optional :: boundary_rng_counter(4) real(dp), intent(in), optional :: sampled_electric_field(3) integer(i64) :: active_boundary_rng_counter(4) real(dp) :: active_electric_field(3), x_mid(3) logical :: has_boundary_rng_counter logical :: field_available result = particle_step_result() result%x = x0 result%v = v0 active_boundary_rng_counter = 0_i64 has_boundary_rng_counter = present(boundary_rng_counter) if (has_boundary_rng_counter) active_boundary_rng_counter = boundary_rng_counter result%field_eval_count = 1_i32 result%collision_query_count = merge(1_i32, 0_i32, present(hit)) if (.not. valid_particle_step_input(x0, v0, bfield, q, m, dt) .or. & .not. all(ieee_is_finite(x_candidate)) .or. .not. all(ieee_is_finite(v_candidate))) then result%status = particle_step_invalid_boundary return end if if (present(sampled_electric_field)) then active_electric_field = sampled_electric_field else x_mid = x0 + 0.5_dp*v0*dt call project_field_sample_to_box(sim, x_mid) call snapshot%eval_local_e(mesh, x_mid, active_electric_field) result%field_eval_count = result%field_eval_count + 1_i32 end if if (.not. all(ieee_is_finite(active_electric_field))) then result%status = particle_step_invalid_boundary return end if field_available = .true. call advance_particle_boundary_crossing( & mesh, sim, snapshot, bfield, x0, v0, q, m, dt, x_candidate, v_candidate, active_electric_field, hit, result, & boundary_contract, active_boundary_rng_counter, has_boundary_rng_counter, 0_i32, .false., field_available & ) end subroutine resolve_particle_boundary_candidate