evaluate_monotonic_stationary_phi Subroutine

public subroutine evaluate_monotonic_stationary_phi(p, branch, phi_v, residual_v, density_m3, success)

Arguments

Type IntentOptional Attributes Name
type(zhao_params_type), intent(in) :: p
character(len=1), intent(in) :: branch
real(kind=dp), intent(in) :: phi_v
real(kind=dp), intent(out) :: residual_v
real(kind=dp), intent(out) :: density_m3
logical, intent(out) :: success

Calls

proc~~evaluate_monotonic_stationary_phi~~CallsGraph proc~evaluate_monotonic_stationary_phi evaluate_monotonic_stationary_phi proc~swe_free_current_term swe_free_current_term proc~evaluate_monotonic_stationary_phi->proc~swe_free_current_term proc~zhao_residuals_type_b zhao_residuals_type_b proc~evaluate_monotonic_stationary_phi->proc~zhao_residuals_type_b proc~zhao_residuals_type_c zhao_residuals_type_c proc~evaluate_monotonic_stationary_phi->proc~zhao_residuals_type_c proc~zhao_residuals_type_b->proc~swe_free_current_term proc~zhao_residuals_type_c->proc~swe_free_current_term

Called by

proc~~evaluate_monotonic_stationary_phi~~CalledByGraph proc~evaluate_monotonic_stationary_phi evaluate_monotonic_stationary_phi proc~try_solve_zhao_monotonic_scalar try_solve_zhao_monotonic_scalar proc~try_solve_zhao_monotonic_scalar->proc~evaluate_monotonic_stationary_phi proc~try_solve_zhao_branch_b try_solve_zhao_branch_b proc~try_solve_zhao_branch_b->proc~try_solve_zhao_monotonic_scalar proc~try_solve_zhao_branch_c try_solve_zhao_branch_c proc~try_solve_zhao_branch_c->proc~try_solve_zhao_monotonic_scalar proc~solve_zhao_branch_b solve_zhao_branch_b proc~solve_zhao_branch_b->proc~try_solve_zhao_branch_b proc~solve_zhao_branch_c solve_zhao_branch_c proc~solve_zhao_branch_c->proc~try_solve_zhao_branch_c proc~try_solve_zhao_unknowns try_solve_zhao_unknowns proc~try_solve_zhao_unknowns->proc~try_solve_zhao_branch_b proc~try_solve_zhao_unknowns->proc~try_solve_zhao_branch_c proc~evaluate_surface_current_model evaluate_surface_current_model proc~evaluate_surface_current_model->proc~try_solve_zhao_unknowns proc~solve_zhao_unknowns solve_zhao_unknowns proc~solve_zhao_unknowns->proc~try_solve_zhao_unknowns proc~evaluate_surface_closure evaluate_surface_closure proc~evaluate_surface_closure->proc~evaluate_surface_current_model

Source Code

  subroutine evaluate_monotonic_stationary_phi(p, branch, phi_v, residual_v, density_m3, success)
    type(zhao_params_type), intent(in) :: p
    character(len=1), intent(in) :: branch
    real(dp), intent(in) :: phi_v
    real(dp), intent(out) :: residual_v, density_m3
    logical, intent(out) :: success

    real(dp) :: cutoff, ion_term, source_current_term, coefficient, residual(2)

    residual_v = huge(1.0_dp)
    density_m3 = 0.0_dp
    success = .false.
    select case (branch)
    case ('B')
      if (phi_v <= 0.0_dp) return
      cutoff = -p%u
      source_current_term = p%n_phe0_m3*exp(-phi_v/p%t_phe_ev)
    case ('C')
      if (phi_v >= 0.0_dp) return
      cutoff = sqrt(max(0.0_dp, -phi_v/p%t_swe_ev)) - p%u
      source_current_term = p%n_phe0_m3
    case default
      return
    end select
    ion_term = p%n_swi_inf_m3*sqrt( &
               2.0_dp*pi*p%t_swe_ev/p%t_phe_ev*p%m_e_kg/p%m_i_kg &
               )*p%mach
    coefficient = swe_free_current_term(p, 1.0_dp, cutoff)
    if (.not. all(ieee_is_finite([source_current_term, ion_term, coefficient])) .or. &
        coefficient <= 0.0_dp) return
    density_m3 = (source_current_term + ion_term)/coefficient
    if (.not. ieee_is_finite(density_m3) .or. density_m3 <= 0.0_dp) return
    if (branch == 'B') then
      call zhao_residuals_type_b(p, [phi_v, density_m3], residual)
    else
      call zhao_residuals_type_c(p, [phi_v, density_m3], residual)
    end if
    if (.not. all(ieee_is_finite(residual))) return
    residual_v = residual(1)
    success = .true.
  end subroutine evaluate_monotonic_stationary_phi