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