構築済みcandidateとその場評価値からbox eventを解決する。
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(mesh_type), | intent(in) | :: | mesh | |||
| class(particle_domain_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) | ||
| type(irradiation_cell_contract_type), | intent(in) | :: | cell |
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, & cell & ) type(irradiation_cell_contract_type), intent(in) :: cell type(mesh_type), intent(in) :: mesh class(particle_domain_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) real(dp) :: active_electric_field(3), x_mid(3) logical :: field_available result = particle_step_result() result%x = x0 result%v = v0 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) 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, & make_step_context(bfield, q, m, cell, .false., boundary_contract, boundary_rng_counter), & x0, v0, dt, x_candidate, v_candidate, active_electric_field, hit, result, field_available & ) end subroutine resolve_particle_boundary_candidate