build_type_a_branch_from_minimum Subroutine

public subroutine build_type_a_branch_from_minimum(p, phi_nodes_asc, phi0_hat, n_swe_inf_hat, phi_m_hat, side, s_nodes)

Arguments

Type IntentOptional Attributes Name
type(zhao_params_type), intent(in) :: p
real(kind=dp), intent(in) :: phi_nodes_asc(:)
real(kind=dp), intent(in) :: phi0_hat
real(kind=dp), intent(in) :: n_swe_inf_hat
real(kind=dp), intent(in) :: phi_m_hat
character(len=*), intent(in) :: side
real(kind=dp), intent(out) :: s_nodes(:)

Calls

proc~~build_type_a_branch_from_minimum~~CallsGraph proc~build_type_a_branch_from_minimum build_type_a_branch_from_minimum proc~evaluate_zhao_rho_hat evaluate_zhao_rho_hat proc~build_type_a_branch_from_minimum->proc~evaluate_zhao_rho_hat proc~evaluate_zhao_density_hat evaluate_zhao_density_hat proc~evaluate_zhao_rho_hat->proc~evaluate_zhao_density_hat

Called by

proc~~build_type_a_branch_from_minimum~~CalledByGraph proc~build_type_a_branch_from_minimum build_type_a_branch_from_minimum proc~sample_type_a_phi_hat_at_z sample_type_a_phi_hat_at_z proc~sample_type_a_phi_hat_at_z->proc~build_type_a_branch_from_minimum proc~sample_zhao_state_at_z sample_zhao_state_at_z proc~sample_zhao_state_at_z->proc~sample_type_a_phi_hat_at_z proc~sample_zhao_reservoir_state sample_zhao_reservoir_state proc~sample_zhao_reservoir_state->proc~sample_zhao_state_at_z proc~resolve_sheath_injection_context resolve_sheath_injection_context proc~resolve_sheath_injection_context->proc~sample_zhao_reservoir_state proc~init_particle_batch_from_config init_particle_batch_from_config proc~init_particle_batch_from_config->proc~resolve_sheath_injection_context

Source Code

  subroutine build_type_a_branch_from_minimum(p, phi_nodes_asc, phi0_hat, n_swe_inf_hat, phi_m_hat, side, s_nodes)
    type(zhao_params_type), intent(in) :: p
    real(dp), intent(in) :: phi_nodes_asc(:), phi0_hat, n_swe_inf_hat, phi_m_hat
    character(len=*), intent(in) :: side
    real(dp), intent(out) :: s_nodes(:)

    integer :: i
    real(dp) :: rho_m_hat, dphi0, integral_node, e2_mid, rho_m_neg, dphi
    real(dp), allocatable :: rho_nodes(:)

    if (size(phi_nodes_asc) /= size(s_nodes)) error stop 'Type-A profile work array size mismatch.'
    allocate (rho_nodes(size(phi_nodes_asc)))
    do i = 1, size(phi_nodes_asc)
      call evaluate_zhao_rho_hat(p, 'A', side, phi_nodes_asc(i), phi0_hat, phi_m_hat, n_swe_inf_hat, rho_nodes(i))
    end do
    call evaluate_zhao_rho_hat(p, 'A', side, phi_m_hat, phi0_hat, phi_m_hat, n_swe_inf_hat, rho_m_hat)

    rho_m_neg = max(-rho_m_hat, 1.0d-14)
    dphi0 = phi_nodes_asc(1) - phi_m_hat
    integral_node = 0.5d0*(rho_m_hat + rho_nodes(1))*dphi0
    s_nodes(1) = sqrt(max(0.0d0, 2.0d0*dphi0/rho_m_neg))

    do i = 2, size(phi_nodes_asc)
      dphi = phi_nodes_asc(i) - phi_nodes_asc(i - 1)
      integral_node = integral_node + 0.5d0*(rho_nodes(i - 1) + rho_nodes(i))*dphi
      e2_mid = max(-2.0d0*(integral_node - 0.25d0*(rho_nodes(i - 1) + rho_nodes(i))*dphi), 1.0d-14)
      s_nodes(i) = s_nodes(i - 1) + dphi/sqrt(e2_mid)
    end do
  end subroutine build_type_a_branch_from_minimum