13 use,
intrinsic :: iso_fortran_env
37 real(real64),
allocatable :: alpha(:)
54 class(phonon_modes_t),
intent(inout) :: this
55 type(namespace_t),
intent(in) :: namespace
56 integer,
intent(in) :: dim_space
57 integer,
intent(in) :: num_atoms
58 logical,
intent(in) :: periodic
60 character(len=256) :: filename, version_string
61 character(len=128) :: dummy
63 integer :: imode, num_modes, file_num_modes, num_zero_modes
65 real(real64),
parameter :: frequency_default_threshold = 1.0e-3_real64
66 real(real64) :: frequency_threshold
68 real(real64) :: eigenvecs(1:dim_space*num_atoms)
69 real(real64) :: alpha, frequency
73 this%dim = dim_space * num_atoms
95 call parse_variable(namespace,
"PhononModesFile",
"NONE", filename)
104 call parse_variable(namespace,
"PhononModesZeroThreshold", frequency_default_threshold, frequency_threshold)
106 if (trim(filename) /=
"NONE")
then
108 iunit =
io_open(filename, action=
"read")
110 read(iunit, *) version_string
113 read(iunit, *) dummy, file_num_modes
114 if (trim(dummy) /=
'Nmodes:')
then
115 message(1) =
"Phonon file ("//trim(filename)//
") is ill formatted."
119 read(iunit, *) dummy, this%num_super
120 if (trim(dummy) /=
'Np:')
then
121 message(1) =
"Phonon file ("//trim(filename)//
") is ill formatted."
125 safe_allocate(this%frequencies(1:file_num_modes))
126 safe_allocate(this%alpha(1:file_num_modes))
127 safe_allocate(this%eigenvectors(1:this%dim, file_num_modes))
131 do imode=1, file_num_modes
133 read(iunit, *) dummy, frequency
134 if(trim(dummy) /=
'frequency:')
then
135 message(1) =
"Phonon file is ill formatted. ("//trim(filename)//
")"
138 read(iunit, *) eigenvecs(:)
140 read(iunit, *) dummy, alpha
141 if(trim(dummy) /=
'alpha:')
then
142 message(1) =
"Phonon file is ill formatted. ("//trim(filename)//
")"
148 if (frequency > frequency_threshold)
then
149 num_modes = num_modes + 1
150 this%frequencies(num_modes) = frequency
151 this%eigenvectors(:, num_modes) = eigenvecs(:)
152 this%alpha(num_modes) = alpha
154 write(
message(1),
'(A,"Skip zero frequency mode. Omega = ",F15.5)') trim(filename), frequency
156 num_zero_modes = num_zero_modes + 1
160 this%num_modes = num_modes
164 if (this%num_modes + num_zero_modes > dim_space*(num_atoms-1))
then
165 message(1) =
"The phonon file ("//trim(filename)//
") contains too many modes."
166 message(2) =
"Most likely the zero frequency modes have not been identified. Try increasing PhononModesZeroThreshold."
167 message(3) =
"Note that for molecules with rotational symmetry, this warning might be triggered wrongly."
190 safe_deallocate_a(this%alpha)
This module provides a general class for classical modes.
subroutine, public io_close(iunit, grp)
integer function, public io_open(file, namespace, action, status, form, position, die, recl, grp)
subroutine, public messages_warning(no_lines, all_nodes, namespace)
character(len=256), dimension(max_lines), public message
to be output by fatal, warning
subroutine, public messages_fatal(no_lines, only_root_writes, namespace)
subroutine, public messages_info(no_lines, iunit, debug_only, stress, all_nodes, namespace)
This module provides a class for (classical) phonon modes.
subroutine phonon_modes_finalize(this)
subroutine phonon_modes_init(this, namespace, dim_space, num_atoms, periodic)
Initialize the phonon modes.
This class describes classical modes, which are specified by their frequencies and eigenvectors.
This class describes phonon modes, which are specified by their frequencies and eigenvectors.