compute_vibrational_analysis Subroutine

public subroutine compute_vibrational_analysis(hessian, element_numbers, frequencies, reduced_masses, force_constants, cartesian_displacements, eigenvalues_out, eigenvectors_out, coordinates, project_trans_rot, force_constants_mdyne, dipole_derivatives, ir_intensities)

Perform complete vibrational analysis from Hessian matrix.

This is a convenience wrapper that computes: - Vibrational frequencies in cm⁻¹ - Reduced masses in amu - Force constants in Hartree/Bohr² (and optionally mdyne/Å) - Cartesian displacement vectors (normalized) - IR intensities in km/mol (if dipole_derivatives provided)

Optionally projects out translation/rotation modes.

Arguments

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

Hessian matrix in Hartree/Bohr² (3N x 3N)

integer, intent(in) :: element_numbers(:)

Atomic numbers for each atom (N atoms)

real(kind=dp), intent(out), allocatable :: frequencies(:)

Vibrational frequencies in cm⁻¹

real(kind=dp), intent(out), allocatable :: reduced_masses(:)

Reduced masses in amu

real(kind=dp), intent(out), allocatable :: force_constants(:)

Force constants in Hartree/Bohr²

real(kind=dp), intent(out), allocatable :: cartesian_displacements(:,:)

Cartesian displacement vectors (3N x 3N)

real(kind=dp), intent(out), optional, allocatable :: eigenvalues_out(:)

Raw eigenvalues from diagonalization

real(kind=dp), intent(out), optional, allocatable :: eigenvectors_out(:,:)

Mass-weighted eigenvectors

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

Atomic coordinates in Bohr (3, N) - required for projection

logical, intent(in), optional :: project_trans_rot

If true, project out translation/rotation modes

real(kind=dp), intent(out), optional, allocatable :: force_constants_mdyne(:)

Force constants in mdyne/Å

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

Cartesian dipole derivatives (3, 3*N) in a.u. for IR intensities

real(kind=dp), intent(out), optional, allocatable :: ir_intensities(:)

IR intensities in km/mol


Calls

proc~~compute_vibrational_analysis~~CallsGraph proc~compute_vibrational_analysis compute_vibrational_analysis proc~compute_cartesian_displacements compute_cartesian_displacements proc~compute_vibrational_analysis->proc~compute_cartesian_displacements proc~compute_force_constants compute_force_constants proc~compute_vibrational_analysis->proc~compute_force_constants proc~compute_ir_intensities compute_ir_intensities proc~compute_vibrational_analysis->proc~compute_ir_intensities proc~compute_reduced_masses compute_reduced_masses proc~compute_vibrational_analysis->proc~compute_reduced_masses proc~compute_vibrational_frequencies compute_vibrational_frequencies proc~compute_vibrational_analysis->proc~compute_vibrational_frequencies proc~element_mass element_mass proc~compute_cartesian_displacements->proc~element_mass proc~compute_ir_intensities->proc~element_mass proc~compute_reduced_masses->proc~element_mass error error proc~compute_vibrational_frequencies->error pic_syev pic_syev proc~compute_vibrational_frequencies->pic_syev proc~mass_weight_hessian mass_weight_hessian proc~compute_vibrational_frequencies->proc~mass_weight_hessian proc~project_translation_rotation project_translation_rotation proc~compute_vibrational_frequencies->proc~project_translation_rotation warning warning proc~compute_vibrational_frequencies->warning proc~mass_weight_hessian->proc~element_mass proc~project_translation_rotation->proc~element_mass pic_gesvd pic_gesvd proc~project_translation_rotation->pic_gesvd

Called by

proc~~compute_vibrational_analysis~~CalledByGraph proc~compute_vibrational_analysis compute_vibrational_analysis proc~compute_gmbe compute_gmbe proc~compute_gmbe->proc~compute_vibrational_analysis proc~compute_mbe compute_mbe proc~compute_mbe->proc~compute_vibrational_analysis proc~gmbe_pie_coordinator gmbe_pie_coordinator proc~gmbe_pie_coordinator->proc~compute_vibrational_analysis proc~hessian_coordinator hessian_coordinator proc~hessian_coordinator->proc~compute_vibrational_analysis proc~serial_gmbe_pie_processor serial_gmbe_pie_processor proc~serial_gmbe_pie_processor->proc~compute_vibrational_analysis proc~unfragmented_calculation unfragmented_calculation proc~unfragmented_calculation->proc~compute_vibrational_analysis interface~hessian_coordinator hessian_coordinator interface~hessian_coordinator->proc~hessian_coordinator interface~unfragmented_calculation unfragmented_calculation interface~unfragmented_calculation->proc~unfragmented_calculation proc~global_coordinator global_coordinator proc~global_coordinator->proc~compute_mbe proc~gmbe_run_distributed gmbe_context_t%gmbe_run_distributed proc~gmbe_run_distributed->proc~gmbe_pie_coordinator proc~gmbe_run_serial gmbe_context_t%gmbe_run_serial proc~gmbe_run_serial->proc~serial_gmbe_pie_processor proc~serial_fragment_processor serial_fragment_processor proc~serial_fragment_processor->proc~compute_mbe interface~global_coordinator global_coordinator interface~global_coordinator->proc~global_coordinator interface~serial_fragment_processor serial_fragment_processor interface~serial_fragment_processor->proc~serial_fragment_processor proc~distributed_unfragmented_hessian distributed_unfragmented_hessian proc~distributed_unfragmented_hessian->interface~hessian_coordinator proc~run_unfragmented_calculation run_unfragmented_calculation proc~run_unfragmented_calculation->interface~unfragmented_calculation interface~distributed_unfragmented_hessian distributed_unfragmented_hessian proc~run_unfragmented_calculation->interface~distributed_unfragmented_hessian interface~distributed_unfragmented_hessian->proc~distributed_unfragmented_hessian proc~mbe_run_distributed mbe_context_t%mbe_run_distributed proc~mbe_run_distributed->interface~global_coordinator proc~mbe_run_serial mbe_context_t%mbe_run_serial proc~mbe_run_serial->interface~serial_fragment_processor proc~run_calculation run_calculation proc~run_calculation->proc~run_unfragmented_calculation proc~compute_energy_and_forces compute_energy_and_forces proc~compute_energy_and_forces->proc~run_calculation proc~run_multi_molecule_calculations run_multi_molecule_calculations proc~run_multi_molecule_calculations->proc~run_calculation program~main main program~main->proc~run_calculation

Variables

Type Visibility Attributes Name Initial
real(kind=dp), private, allocatable :: eigenvalues(:)
real(kind=dp), private, allocatable :: eigenvectors(:,:)

Source Code

   subroutine compute_vibrational_analysis(hessian, element_numbers, frequencies, &
                                           reduced_masses, force_constants, &
                                           cartesian_displacements, &
                                           eigenvalues_out, eigenvectors_out, &
                                           coordinates, project_trans_rot, &
                                           force_constants_mdyne, &
                                           dipole_derivatives, ir_intensities)
      !! Perform complete vibrational analysis from Hessian matrix.
      !!
      !! This is a convenience wrapper that computes:
      !! - Vibrational frequencies in cm⁻¹
      !! - Reduced masses in amu
      !! - Force constants in Hartree/Bohr² (and optionally mdyne/Å)
      !! - Cartesian displacement vectors (normalized)
      !! - IR intensities in km/mol (if dipole_derivatives provided)
      !!
      !! Optionally projects out translation/rotation modes.
      real(dp), intent(in) :: hessian(:, :)
         !! Hessian matrix in Hartree/Bohr² (3*N x 3*N)
      integer, intent(in) :: element_numbers(:)
         !! Atomic numbers for each atom (N atoms)
      real(dp), allocatable, intent(out) :: frequencies(:)
         !! Vibrational frequencies in cm⁻¹
      real(dp), allocatable, intent(out) :: reduced_masses(:)
         !! Reduced masses in amu
      real(dp), allocatable, intent(out) :: force_constants(:)
         !! Force constants in Hartree/Bohr²
      real(dp), allocatable, intent(out) :: cartesian_displacements(:, :)
         !! Cartesian displacement vectors (3*N x 3*N)
      real(dp), allocatable, intent(out), optional :: eigenvalues_out(:)
         !! Raw eigenvalues from diagonalization
      real(dp), allocatable, intent(out), optional :: eigenvectors_out(:, :)
         !! Mass-weighted eigenvectors
      real(dp), intent(in), optional :: coordinates(:, :)
         !! Atomic coordinates in Bohr (3, N) - required for projection
      logical, intent(in), optional :: project_trans_rot
         !! If true, project out translation/rotation modes
      real(dp), allocatable, intent(out), optional :: force_constants_mdyne(:)
         !! Force constants in mdyne/Å
      real(dp), intent(in), optional :: dipole_derivatives(:, :)
         !! Cartesian dipole derivatives (3, 3*N) in a.u. for IR intensities
      real(dp), allocatable, intent(out), optional :: ir_intensities(:)
         !! IR intensities in km/mol

      real(dp), allocatable :: eigenvalues(:)
      real(dp), allocatable :: eigenvectors(:, :)

      ! First compute frequencies and eigenvectors
      call compute_vibrational_frequencies(hessian, element_numbers, frequencies, &
                                           eigenvalues_out=eigenvalues, &
                                           eigenvectors=eigenvectors, &
                                           coordinates=coordinates, &
                                           project_trans_rot=project_trans_rot)

      ! Compute reduced masses from eigenvectors
      call compute_reduced_masses(eigenvectors, element_numbers, reduced_masses)

      ! Compute force constants from eigenvalues and reduced masses
      call compute_force_constants(eigenvalues, reduced_masses, force_constants, &
                                   force_constants_mdyne)

      ! Compute Cartesian displacements from eigenvectors
      call compute_cartesian_displacements(eigenvectors, element_numbers, &
                                           cartesian_displacements)

      ! Compute IR intensities if dipole derivatives are provided
      if (present(dipole_derivatives) .and. present(ir_intensities)) then
         call compute_ir_intensities(dipole_derivatives, eigenvectors, element_numbers, &
                                     ir_intensities)
      end if

      ! Optionally return eigenvalues and eigenvectors
      if (present(eigenvalues_out)) then
         allocate (eigenvalues_out(size(eigenvalues)))
         eigenvalues_out = eigenvalues
      end if
      if (present(eigenvectors_out)) then
         allocate (eigenvectors_out(size(eigenvectors, 1), size(eigenvectors, 2)))
         eigenvectors_out = eigenvectors
      end if

      deallocate (eigenvalues, eigenvectors)

   end subroutine compute_vibrational_analysis