channels_mod Module

This module provides subroutines that set the number of channels in the block, save quantum numbers for each channel (both in body- and space-fixed cases) and print quantum numbers on screen.


Uses

  • module~~channels_mod~~UsesGraph module~channels_mod channels_mod iso_fortran_env iso_fortran_env module~channels_mod->iso_fortran_env module~physics_utilities_mod physics_utilities_mod module~channels_mod->module~physics_utilities_mod module~utility_functions_mod utility_functions_mod module~channels_mod->module~utility_functions_mod module~global_variables_mod global_variables_mod module~channels_mod->module~global_variables_mod module~physics_utilities_mod->iso_fortran_env module~physics_utilities_mod->module~utility_functions_mod module~physics_utilities_mod->module~global_variables_mod module~array_operations_mod array_operations_mod module~physics_utilities_mod->module~array_operations_mod module~utility_functions_mod->iso_fortran_env module~global_variables_mod->iso_fortran_env module~array_operations_mod->iso_fortran_env

Used by

  • module~~channels_mod~~UsedByGraph module~channels_mod channels_mod program~scattering SCATTERING program~scattering->module~channels_mod

Contents


Functions

public function calculate_largest_wavevector(channel_indices) result(largest_wavevector_)

Calculates the largest wavevector in the block; called only if there are any open channels

Arguments

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

holds the indices pointing to the basis arrays

Return Value real(kind=dp)

(output) the largest wavevector in the block

public function calculate_number_of_steps(largest_wavevector_, k_potential_depth_) result(number_of_steps_)

Calculates the number of steps on the intermolecular (R) grid in current block. This is done either directly (if r_step > 0) or through the number of steps per half de Broglie wavelength

Arguments

Type IntentOptional Attributes Name
real(kind=dp), intent(in) :: largest_wavevector_

the largest wavevector in the block

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

correction from the depth of the potential well converted to wavevector units

Return Value integer(kind=int32)

number of steps on the \(R\) grid

public function count_open_channels_in_block(channel_indices) result(number_of_open_channels_)

counts the energetically accessible channels in the given block

Arguments

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

holds the indices pointing to the basis arrays

Return Value integer(kind=int32)

(output) number of open channels


Subroutines

public subroutine prepare_wavevector_array(channel_indices_, wavevectors_)

Prepare an array of wavevectors in a given block (in A^2) which are saved in the S-matrix file

Arguments

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

holds the indices pointing to the basis arrays

real(kind=dp), intent(inout) :: wavevectors_(:)

array of wavevectors (in A^2)

public subroutine print_channels(parity_exponent_, channel_indices, channels_omega_values)

prints information about body-fixed channels on screen

Arguments

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

parity exponent of the block (0 if p = +1, 1 if p = -1)

integer(kind=int32), intent(inout) :: channel_indices(:)

holds the indices pointing to the basis arrays

integer(kind=int32), intent(inout) :: channels_omega_values(:)

holds all values of \bar{\Omega}

public subroutine print_short_block_summary(jtot_, parity_exponent_, count_blocks_, number_of_channels_)

Arguments

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

total angular momentum

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

parity exponent of the block (0 if p = +1, 1 if p = -1)

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

number of channels in the block

public subroutine set_body_fixed_channels(total_angular_momentum_, parity_exponent_, channel_indices, channels_omega_values)

Prepares the channel_indices array which holds indices that refer to the basis arrays: v1level/j1level/internal_energies, and channels_omega_values which holds values of \bar{\Omega}

Arguments

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

total angular momentum

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

parity exponent of the block (0 if p = +1, 1 if p = -1)

integer(kind=int32), intent(inout) :: channel_indices(:)

holds the indices pointing to the basis arrays

integer(kind=int32), intent(inout) :: channels_omega_values(:)

holds all values of \bar{\Omega}

public subroutine set_number_of_channels(total_angular_momentum_, number_of_channels_even_parity_block, number_of_channels_odd_parity_block)

determine the number of scattering channels in each parity block for given total angular momentum in both body-fixed and space-fixed frames

Arguments

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

total angular momentum

integer(kind=int32), intent(out) :: number_of_channels_even_parity_block

number of channels in the p = 1 (even parity) block

integer(kind=int32), intent(out) :: number_of_channels_odd_parity_block

number of channels in the p = -1 (odd parity) block

public subroutine set_space_fixed_channels(total_angular_momentum_, parity_exponent_, channel_l_values)

Prepares the channel_l_values array which holds values of orbital angular momentum, \(l\), a space-fixed-frame quantum number.

Arguments

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

total angular momentum

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

parity exponent of the block (0 if p = +1, 1 if p = -1)

integer(kind=int32), intent(inout) :: channel_l_values(:)

holds all values of l

private subroutine calculate_number_of_channels_body_fixed(total_angular_momentum_, number_of_channels_even_parity_block, number_of_channels_odd_parity_block)

calculate number of channels in even and odd parity blocks in the body-fixed frame; in principle, \(\bar{\Omega}\in \langle 0, \mathrm{min}(j, J))), but number of channels additionally depends on the sign of \( p (-1)^{J} \): channels with \(\bar{\Omega}=0\) values enter blocks with \( p (-1)^{J} = + 1 \) only;

Arguments

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

total angular momentum

integer(kind=int32), intent(inout) :: number_of_channels_even_parity_block

number of channels in the p = 1 (even parity) block

integer(kind=int32), intent(inout) :: number_of_channels_odd_parity_block

number of channels in the p = -1 (odd parity) block

private subroutine calculate_number_of_channels_space_fixed(total_angular_momentum_, number_of_channels_even_parity_block, number_of_channels_odd_parity_block)

calculate number of channels in even and odd parity blocks in the space-fixed frame based on available values of orbital angular momentum: \( l \in \langle |j-J|, j+J \rangle \); parity is defined as \(p= (-1)^{j+l}\)

Arguments

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

total angular momentum

integer(kind=int32), intent(inout) :: number_of_channels_even_parity_block

number of channels in the p = 1 (even parity) block

integer(kind=int32), intent(inout) :: number_of_channels_odd_parity_block

number of channels in the p = -1 (odd parity) block

private subroutine check_number_of_channels(number_of_channels_bf, number_of_channels_sf, parity_block)

check if the number of channels is the same in body-fixed and space-fixed frames

Arguments

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

number of channels in the body-fixed frame

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

number of channels in the space-fixed frame

character(len=*), intent(in) :: parity_block

"even" or "odd", for printing purposes

private subroutine update_body_fixed_channels_info(omega_max_, parity_term_exponent_, level_index_, channel_index_, channel_indices, channels_omega_values)

update channel_indices array which holds indices within the loop over level_index_ in set_body_fixed_channels

Arguments

Type IntentOptional Attributes Name
integer(kind=int32) :: omega_max_

largest value of \(\bar{\Omega}\), for given rotational and total angular momenta

integer(kind=int32) :: parity_term_exponent_

exponent of the \(p (-1)^{J}\) term

integer(kind=int32) :: level_index_

indices pointing to the basis arrays

integer(kind=int32), intent(inout) :: channel_index_

index pointing to the current value in channel_indices and channels_omega_values; incremented in this subroutine

integer(kind=int32), intent(inout) :: channel_indices(:)

holds the indices pointing to the basis arrays

integer(kind=int32), intent(inout) :: channels_omega_values(:)

holds all values of \bar{\Omega}

private subroutine update_channel_counts_body_fixed(omega_max_, total_angular_momentum_, number_of_channels_even_parity_block, number_of_channels_odd_parity_block)

updates number_of_channels_even and number_of_channels_odd in the body-fixed frame for given \(J\) and \(\bar{Omega}_{max}\)

Arguments

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

largest value of \(\bar{\Omega}\), for given rotational and total angular momenta

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

total angular momentum

integer(kind=int32), intent(inout) :: number_of_channels_even_parity_block

number of channels for the p = 1 block

integer(kind=int32), intent(inout) :: number_of_channels_odd_parity_block

number of channels for the p = -1 block

private subroutine update_channel_counts_space_fixed(l_min_, l_max_, level_index_, number_of_channels_even_parity_block, number_of_channels_odd_parity_block)

updates number_of_channels_even and number_of_channels_odd in the space-fixed frame for given range of orbital angular momentum

Arguments

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

smallest value of \( l = |j-J|\)

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

largest value of \( l = j+J\)

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

index pointing to speceific \(j\) value in rot_levels

integer(kind=int32), intent(inout) :: number_of_channels_even_parity_block

number of channels for the p = 1 block

integer(kind=int32), intent(inout) :: number_of_channels_odd_parity_block

number of channels for the p = -1 block

private subroutine write_channel_line(v_, j_, omega_, parity_, internal_energy_, wavevector_)

Arguments

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

vibrational quantum number

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

rotational quantum number

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

\(\bar{\Omega}\)

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

parity of the block

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

\(E_{vj}\)

real(kind=dp), intent(in), optional :: wavevector_

(optional) if the channel is open, print information about the wavevector