numerov Subroutine

public subroutine numerov(number_of_channels_, channel_indices_, channels_omega_values_, nonzero_terms_per_element_, nonzero_legendre_indices_, nonzero_algebraic_coefficients_, number_of_steps_, total_angular_momentum_, log_der_matrix_)

Renormalized Numerov propagator

Arguments

Type IntentOptional Attributes Name
integer(kind=int32), intent(in) :: number_of_channels_

size of the basis

integer(kind=int32), intent(in) :: channel_indices_(number_of_channels_)

holds the indices pointing to the basis arrays

integer(kind=int32), intent(in) :: channels_omega_values_(number_of_channels_)

holds all values of \bar{\Omega}

integer(kind=int32), intent(in) :: nonzero_terms_per_element_(:)

keeps the number of non-zero terms in the sum (Eq. (6.21)) for each non-zero element of W/V

integer(kind=int32), intent(in) :: nonzero_legendre_indices_(:)

holds the proper indices pointing to l1/l2/lltabs, which correspond to the non-vanishing elements of the sum (Eq. (6.21)) for each non-zero element of W/V

real(kind=dp), intent(in) :: nonzero_algebraic_coefficients_(:)

holds the values of the non-zero algebraic coefficients

integer(kind=int32), intent(in) :: number_of_steps_

number of steps from r_min to r_max

integer(kind=int32), intent(in) :: total_angular_momentum_

total angular momentum

real(kind=dp), intent(inout) :: log_der_matrix_(number_of_channels_,number_of_channels_)

resulting log-derivative matrix at r_max


Calls

proc~~numerov~~CallsGraph proc~numerov numerov proc~initial_setup initial_setup proc~numerov->proc~initial_setup proc~handle_final_propagation_steps handle_final_propagation_steps proc~numerov->proc~handle_final_propagation_steps proc~propagator_summary propagator_summary proc~numerov->proc~propagator_summary proc~time_count_summary time_count_summary proc~numerov->proc~time_count_summary proc~calculate_log_der_matrix calculate_log_der_matrix proc~numerov->proc~calculate_log_der_matrix proc~general_propagation_step general_propagation_step proc~numerov->proc~general_propagation_step proc~calculate_pes_matrix calculate_pes_matrix proc~initial_setup->proc~calculate_pes_matrix proc~calculate_u_matrix calculate_u_matrix proc~initial_setup->proc~calculate_u_matrix proc~calculate_centrifugal_matrix calculate_centrifugal_matrix proc~initial_setup->proc~calculate_centrifugal_matrix proc~calculate_coupling_matrix calculate_coupling_matrix proc~initial_setup->proc~calculate_coupling_matrix proc~calculate_t_matrix calculate_t_matrix proc~initial_setup->proc~calculate_t_matrix proc~handle_final_propagation_steps->proc~general_propagation_step proc~float_to_character float_to_character proc~propagator_summary->proc~float_to_character proc~integer_to_character integer_to_character proc~propagator_summary->proc~integer_to_character proc~write_message write_message proc~propagator_summary->proc~write_message proc~time_count_summary->proc~write_message interface~invert_symmetric_matrix invert_symmetric_matrix proc~calculate_log_der_matrix->interface~invert_symmetric_matrix interface~fill_symmetric_matrix fill_symmetric_matrix proc~calculate_log_der_matrix->interface~fill_symmetric_matrix dgemm dgemm proc~calculate_log_der_matrix->dgemm interface~add_scalar_to_diagonal add_scalar_to_diagonal proc~calculate_log_der_matrix->interface~add_scalar_to_diagonal proc~general_propagation_step->proc~calculate_pes_matrix proc~general_propagation_step->interface~invert_symmetric_matrix proc~general_propagation_step->interface~fill_symmetric_matrix proc~general_propagation_step->proc~calculate_u_matrix proc~general_propagation_step->proc~calculate_coupling_matrix proc~general_propagation_step->proc~calculate_t_matrix proc~calculate_pes_matrix->interface~fill_symmetric_matrix proc~calculate_single_pes_matrix_element calculate_single_pes_matrix_element proc~calculate_pes_matrix->proc~calculate_single_pes_matrix_element proc~calculate_u_matrix->interface~invert_symmetric_matrix proc~calculate_u_matrix->interface~fill_symmetric_matrix proc~calculate_u_matrix->interface~add_scalar_to_diagonal proc~calculate_centrifugal_matrix->interface~fill_symmetric_matrix proc~calculate_diagonal_centrifugal_element calculate_diagonal_centrifugal_element proc~calculate_centrifugal_matrix->proc~calculate_diagonal_centrifugal_element proc~delta_for_zero_omega delta_for_zero_omega proc~calculate_centrifugal_matrix->proc~delta_for_zero_omega proc~calculate_offdiagonal_centrifugal_element calculate_offdiagonal_centrifugal_element proc~calculate_centrifugal_matrix->proc~calculate_offdiagonal_centrifugal_element proc~get_radial_coupling_term_value get_radial_coupling_term_value proc~calculate_single_pes_matrix_element->proc~get_radial_coupling_term_value proc~wavevector_squared_from_energy wavevector_squared_from_energy proc~calculate_single_pes_matrix_element->proc~wavevector_squared_from_energy proc~find_lambda_index find_lambda_index proc~get_radial_coupling_term_value->proc~find_lambda_index proc~find_coupling_index find_coupling_index proc~get_radial_coupling_term_value->proc~find_coupling_index proc~ispline ispline proc~get_radial_coupling_term_value->proc~ispline proc~handle_lambda_index_error handle_lambda_index_error proc~get_radial_coupling_term_value->proc~handle_lambda_index_error proc~handle_coupling_index_error handle_coupling_index_error proc~get_radial_coupling_term_value->proc~handle_coupling_index_error proc~total_energy total_energy proc~wavevector_squared_from_energy->proc~total_energy proc~write_error write_error proc~wavevector_squared_from_energy->proc~write_error

Called by

proc~~numerov~~CalledByGraph proc~numerov numerov program~scattering SCATTERING program~scattering->proc~numerov

Contents

Source Code


Variables

Type Visibility Attributes Name Initial
real(kind=dp), private :: calculation_time_
real(kind=dp), private, dimension(number_of_channels_,number_of_channels_) :: centrifugal_matrix_
integer(kind=int32), private :: channel_index_1_
integer(kind=int32), private :: channel_index_2_
real(kind=dp), private :: finish
integer(kind=int32), private :: i
real(kind=dp), private :: intermolecular_distance_
real(kind=dp), private, dimension(number_of_channels_,number_of_channels_) :: r_matrix_
real(kind=dp), private, dimension(number_of_channels_,number_of_channels_) :: r_matrix_plus_
real(kind=dp), private, dimension(number_of_channels_,number_of_channels_) :: r_matrix_r_max_
real(kind=dp), private :: start
real(kind=dp), private :: step_numerov_
real(kind=dp), private, dimension(number_of_channels_,number_of_channels_) :: t_matrix_
real(kind=dp), private, dimension(number_of_channels_,number_of_channels_) :: t_matrix_minus_
real(kind=dp), private, dimension(number_of_channels_,number_of_channels_) :: t_matrix_plus_

Source Code

      subroutine numerov(number_of_channels_, channel_indices_,                &
         channels_omega_values_, nonzero_terms_per_element_,                   &
         nonzero_legendre_indices_, nonzero_algebraic_coefficients_,           &
         number_of_steps_, total_angular_momentum_, log_der_matrix_)
         !! Renormalized Numerov propagator
         !---------------------------------------------------------------------!
         integer(int32), intent(in) :: number_of_channels_
            !! size of the basis
         integer(int32), intent(in) :: channel_indices_(number_of_channels_)
            !! holds the indices pointing to the basis arrays
         integer(int32), intent(in) :: channels_omega_values_(number_of_channels_)
            !! holds all values of \bar{\Omega}
         integer(int32), intent(in) :: nonzero_terms_per_element_(:)
            !! keeps the number of non-zero terms in the sum (Eq. (6.21)) for
            !! each non-zero element of W/V
         integer(int32), intent(in) :: nonzero_legendre_indices_(:)
            !! holds the proper indices pointing to l1/l2/lltabs, which
            !! correspond to the non-vanishing elements of the sum  (Eq. (6.21))
            !! for each non-zero element of W/V
         real(dp), intent(in) :: nonzero_algebraic_coefficients_(:)
            !! holds the values of the non-zero algebraic coefficients
         integer(int32), intent(in) :: number_of_steps_
            !! number of steps from r_min to r_max
         integer(int32), intent(in) :: total_angular_momentum_
            !! total angular momentum
         real(dp), intent(inout) :: log_der_matrix_(number_of_channels_,number_of_channels_)
            !! resulting log-derivative matrix at r_max  
         !---------------------------------------------------------------------!
         integer(int32) :: i, channel_index_1_, channel_index_2_
         real(dp) :: start, finish, intermolecular_distance_, step_numerov_,   &
            calculation_time_
         real(dp), dimension(number_of_channels_,number_of_channels_) ::       &
            centrifugal_matrix_,  &
            t_matrix_minus_, t_matrix_, t_matrix_plus_, r_matrix_,             &
            r_matrix_r_max_, r_matrix_plus_
         !---------------------------------------------------------------------!
         CALL CPU_TIME(start)
         step_numerov_ = (r_max - r_min)/dble(number_of_steps_ - 1)
         intermolecular_distance_ = r_min
         !---------------------------------------------------------------------!
         ! Initial setup: calculate centrifugal matrix and R_matrix at r_min + 1
         !---------------------------------------------------------------------!
         call initial_setup(number_of_channels_, step_numerov_,                &
            total_angular_momentum_, intermolecular_distance_,                 &
            channel_indices_, channels_omega_values_,                          &
            nonzero_terms_per_element_, nonzero_legendre_indices_,             &
            nonzero_algebraic_coefficients_, centrifugal_matrix_, r_matrix_)
         !---------------------------------------------------------------------!
         ! Propagation loop
         !---------------------------------------------------------------------!
         do i=2, number_of_steps_ - 2
            !------------------------------------------------------------------!
            intermolecular_distance_ = r_min + (i-1)*step_numerov_
            !------------------------------------------------------------------!
            call general_propagation_step(number_of_channels_, step_numerov_,  &
               total_angular_momentum_, intermolecular_distance_,              &
               channel_indices_, channels_omega_values_,                       &
               nonzero_terms_per_element_, nonzero_legendre_indices_,          &
               nonzero_algebraic_coefficients_, centrifugal_matrix_, r_matrix_)
            !------------------------------------------------------------------!
         end do
         !---------------------------------------------------------------------!
         call handle_final_propagation_steps(number_of_channels_,              &
            step_numerov_, total_angular_momentum_, channel_indices_,          &
            channels_omega_values_, nonzero_terms_per_element_,                &
            nonzero_legendre_indices_, nonzero_algebraic_coefficients_,        &
            centrifugal_matrix_, r_matrix_, t_matrix_minus_, t_matrix_,        &
            t_matrix_plus_, r_matrix_r_max_, r_matrix_plus_)
         !---------------------------------------------------------------------!
         CALL CPU_TIME(finish)
         !---------------------------------------------------------------------!
         ! Eq. (6.29)
         !---------------------------------------------------------------------!
         call calculate_log_der_matrix(step_numerov_,number_of_channels_,      &
            t_matrix_minus_,t_matrix_,t_matrix_plus_,r_matrix_r_max_,          &
            r_matrix_plus_,log_der_matrix_)
         !---------------------------------------------------------------------!
         call propagator_summary(r_min, r_max, number_of_steps_)
         !---------------------------------------------------------------------!
         if (print_level.ge.2) then
            call time_count_summary(start, finish, calculation_time_,          &
               "Propagation completed in ")
         endif
         !---------------------------------------------------------------------!
      end subroutine numerov