warn_face_average_potential_variation Subroutine

public subroutine warn_face_average_potential_variation(sim, spec, phi_mean, phi_std, phi_min, phi_max)

注入面の局所電位差が面平均 reservoir 近似の特徴エネルギーに対して大きい場合に警告する。

Arguments

Type IntentOptional Attributes Name
type(sim_config), intent(in) :: sim
type(particle_species_spec), intent(in) :: spec
real(kind=dp), intent(in) :: phi_mean
real(kind=dp), intent(in) :: phi_std
real(kind=dp), intent(in) :: phi_min
real(kind=dp), intent(in) :: phi_max

Calls

proc~~warn_face_average_potential_variation~~CallsGraph proc~warn_face_average_potential_variation warn_face_average_potential_variation proc~lower_ascii lower_ascii proc~warn_face_average_potential_variation->proc~lower_ascii proc~resolve_inward_normal resolve_inward_normal proc~warn_face_average_potential_variation->proc~resolve_inward_normal proc~resolve_inward_normal->proc~lower_ascii

Source Code

  subroutine warn_face_average_potential_variation(sim, spec, phi_mean, phi_std, phi_min, phi_max)
    real(dp), parameter :: variation_warn_ratio = 0.1_dp
    type(sim_config), intent(in) :: sim
    type(particle_species_spec), intent(in) :: spec
    real(dp), intent(in) :: phi_mean, phi_std, phi_min, phi_max

    real(dp) :: inward_normal(3), normal_drift, characteristic_energy, variation_energy, ratio, phi_scale

    if (trim(lower_ascii(spec%velocity_distribution)) /= 'maxwellian') return
    phi_scale = max(1.0_dp, abs(phi_mean), abs(phi_min), abs(phi_max))
    if (phi_std <= 256.0_dp*epsilon(1.0_dp)*phi_scale) return

    call resolve_inward_normal(spec%inject_face, inward_normal)
    normal_drift = dot_product(spec%drift_velocity, inward_normal)
    characteristic_energy = k_boltzmann*species_temperature_k_local(spec) + &
      0.5_dp*spec%m_particle*normal_drift*normal_drift
    variation_energy = abs(spec%q_particle)*phi_std
    if (characteristic_energy > 0.0_dp) then
      ratio = variation_energy/characteristic_energy
      if (ratio <= variation_warn_ratio) return
    else
      ratio = huge(1.0_dp)
    end if

    write (error_unit, '(a,a,a,a,a,i0,a,es12.4,a,es12.4,a,es12.4,a,es12.4,a,es12.4)') &
      'WARNING: reservoir face-average potential may be inaccurate: species=', trim(spec%species_key), &
      ' face=', trim(spec%inject_face), ' samples=', sim%injection_face_phi_grid_n**2, &
      ' mean_V=', phi_mean, ' std_V=', phi_std, ' min_V=', phi_min, ' max_V=', phi_max, &
      ' energy_ratio=', ratio
    flush (error_unit)
  end subroutine warn_face_average_potential_variation