26 use,
intrinsic :: iso_fortran_env
40 integer,
parameter :: &
45 integer :: n_multipoles
46 integer,
allocatable :: l(:), m(:)
47 real(real64),
allocatable :: weight(:)
50 integer :: observable(2)
51 type(unit_system_t) :: units
52 real(real64),
allocatable :: ot(:)
55 real(real64) :: total_time
62 subroutine ft(omega, power)
63 real(real64),
intent(in) :: omega
64 real(real64),
intent(out) :: power
78 power = power + x*ot(j)
80 power = power*dt / (dt*time_steps)
86 power = power + x*ot(j)
88 power = power*dt / (dt*time_steps)
97 subroutine ft2(omega, power)
98 real(real64),
intent(in) :: omega
99 real(real64),
intent(out) :: power
109 case (sine_transform)
113 power = power + x*ot(j)
117 power = - (power*dt / (dt*time_steps))**2
123 power = power + x*ot(j)
125 power = - (power*dt / (dt*time_steps))**2
142 o%n_multipoles = i%n_multipoles
143 safe_allocate( o%l(1:o%n_multipoles))
144 safe_allocate( o%m(1:o%n_multipoles))
145 safe_allocate(o%weight(1:o%n_multipoles))
147 do j = 1, o%n_multipoles
150 o%weight(j) = i%weight(j)
157 subroutine read_resonances_file(order, ffile, namespace, search_interval, final_time, nfrequencies)
158 integer,
intent(inout) :: order
159 character(len=*),
intent(in) :: ffile
161 real(real64),
intent(inout) :: search_interval
162 real(real64),
intent(in) :: final_time
163 integer,
intent(in) :: nfrequencies
165 real(real64) :: dummy, leftbound, rightbound, w, power
166 integer :: iunit, nresonances, ios, i, j, k, npairs, nspin, order_in_file, nw_subtracted, ierr
167 logical :: file_exists
168 real(real64),
allocatable :: wij(:), omega(:), c0i(:)
173 write(
message(1),
'(a)')
'The run mode #3 is only compatible with the analysis of the'
174 write(
message(2),
'(a)')
'second-order response.'
179 inquire(file=
"ot", exist = file_exists)
180 if (.not. file_exists)
then
181 write(
message(1),
'(a)')
"Could not find 'ot' file."
188 write(
message(1),
'(a)')
"Could not retrieve units in the 'ot' file."
194 iunit =
io_open(trim(ffile), namespace, action=
'read', status=
'old')
200 read(iunit, *, iostat = ios) dummy, dummy
202 nresonances = nresonances + 1
205 npairs = (nresonances*(nresonances-1))/2
207 safe_allocate(omega(1:nresonances))
208 safe_allocate( c0i(1:nresonances))
209 safe_allocate(wij(1:npairs))
212 do i = 1, nresonances
213 read(iunit, *) omega(i), c0i(i)
217 do i = 1, nresonances
218 do j = i + 1, nresonances
219 wij(k) = omega(j) - omega(i)
224 if (search_interval >
m_zero)
then
230 call read_ot(namespace, nspin, order_in_file, nw_subtracted)
232 if (order_in_file /= order)
then
233 write(
message(1),
'(a)')
'The ot file should contain the second-order response in this run mode.'
237 if (final_time >
m_zero)
then
239 if (total_time > dt*time_steps)
then
240 total_time = dt*time_steps
241 write(
message(1),
'(a)')
'The requested total time to process is larger than the time available in the input file.'
242 write(
message(2),
'(a,f8.4,a)')
'The time has been adjusted to ', &
246 time_steps = int(total_time / dt)
247 total_time = time_steps * dt
249 total_time = dt*time_steps
255 call modify_ot(time_steps, dt, order, ot, w, power)
256 nw_subtracted = nw_subtracted + 1
260 do i = 1, nresonances
261 do j = i + 1, nresonances
262 leftbound = wij(k) - search_interval
263 rightbound = wij(k) + search_interval
266 call modify_ot(time_steps, dt, order, ot, wij(k), power)
267 nw_subtracted = nw_subtracted + 1
272 safe_deallocate_a(wij)
273 safe_deallocate_a(c0i)
274 safe_deallocate_a(omega)
283 subroutine analyze_signal(order, omega, search_interval, final_time, nresonances, nfrequencies, &
285 integer,
intent(inout) :: order
286 real(real64),
intent(inout) :: omega
287 real(real64),
intent(inout) :: search_interval
288 real(real64),
intent(inout) :: final_time
289 integer,
intent(inout) :: nresonances
290 integer,
intent(inout) :: nfrequencies
291 real(real64),
intent(in) :: damping
294 real(real64) :: leftbound, rightbound, dw, power
295 real(real64),
allocatable :: w(:), c0I2(:)
296 integer :: nspin, i, ierr, order_in_file, nw_subtracted
297 logical :: file_exists
302 inquire(file=
"ot", exist = file_exists)
303 if (.not. file_exists)
then
304 write(
message(1),
'(a)')
"Could not find 'ot' file."
311 write(
message(1),
'(a)')
"Could not retrieve units in the 'ot' file."
321 if (search_interval >
m_zero)
then
327 leftbound = omega - search_interval
328 rightbound = omega + search_interval
330 call read_ot(namespace, nspin, order_in_file, nw_subtracted)
332 if (order_in_file /= order)
then
333 write(
message(1),
'(a)')
'Internal error in analyze_signal'
337 if (mod(order, 2) == 1)
then
338 mode = sine_transform
343 if (final_time >
m_zero)
then
345 if (total_time > dt*time_steps)
then
346 total_time = dt*time_steps
347 write(
message(1),
'(a)')
'The requested total time to process is larger than the time available in the input file.'
348 write(
message(2),
'(a,f8.4,a)')
'The time has been adjusted to ', &
352 time_steps = int(total_time / dt)
353 total_time = time_steps * dt
355 total_time = dt*time_steps
358 dw = (rightbound-leftbound) / (nfrequencies - 1)
360 safe_allocate( w(1:nresonances))
361 safe_allocate(c0i2(1:nresonances))
367 if (nw_subtracted >= nresonances)
exit
385 call modify_ot(time_steps, dt, order, ot, omega, power)
387 nw_subtracted = nw_subtracted + 1
396 safe_deallocate_a(ot)
398 safe_deallocate_a(c0i2)
411 integer,
intent(in) :: nfrequencies, nresonances
412 real(real64),
intent(in) :: dw
413 real(real64),
intent(in) :: w(nresonances), c0I2(nresonances)
414 real(real64),
intent(in) :: gamma
416 integer :: iunit, i, j
418 complex(real64) :: pol
422 iunit =
io_open(
'polarizability', namespace, action =
'write', status=
'replace', die=.false.)
423 write(iunit,
'(a)')
'# Polarizability file. Generated using the SOS formula with the following data:'
424 write(iunit,
'(a)')
'#'
426 do i = 1, nresonances
427 write(iunit,
'(a1,3e20.12)')
'#', w(i),
sqrt(abs(c0i2(i))), c0i2(i)
430 write(iunit,
'(a10,f12.6)')
'# Gamma = ', gamma
431 write(iunit,
'(a)')
'#'
433 do i = 1, nfrequencies
436 do j = 1, nresonances
437 pol = pol + c0i2(j) * (
m_one / (w(j) - e -
m_zi * gamma) +
m_one/(w(j) + e +
m_zi * gamma))
439 write(iunit,
'(3e20.12)') e, pol
451 subroutine find_resonance(omega, leftbound, rightbound, nfrequencies)
452 real(real64),
intent(inout) :: omega
453 real(real64),
intent(in) :: leftbound, rightbound
454 integer,
intent(in) :: nfrequencies
457 real(real64) :: dw, w, aw, min_aw, min_w, omega_orig, min_w1, min_w2
458 real(real64),
allocatable :: warray(:), tarray(:)
462 safe_allocate(warray(1:nfrequencies))
463 safe_allocate(tarray(1:nfrequencies))
467 dw = (rightbound-leftbound) / (nfrequencies - 1)
468 do i = 1, nfrequencies
469 w = leftbound + (i-1)*dw
477 do i = 1, nfrequencies
478 w = leftbound + (i-1)*dw
479 if (tarray(i) < min_aw)
then
487 min_w1 = min_w - 2*dw
488 min_w2 = min_w + 2*dw
492 write(
message(1),
'(a)')
'Could not find a maximum.'
494 write(
message(3),
'(a,f12.8,a,f12.8,a)')
' Search interval = [', &
496 write(
message(4),
'(a,f12.4,a)')
' Search discretization = ', &
501 safe_deallocate_a(warray)
502 safe_deallocate_a(tarray)
511 real(real64),
intent(in) :: omega
512 real(real64),
intent(out) :: power
513 integer,
intent(in) :: nw_subtracted
514 real(real64),
intent(in) :: dw, leftbound, rightbound
518 call ft(omega, power)
521 case (sine_transform)
527 write(
message(1),
'(a)')
'******************************************************************'
528 write(
message(2),
'(a,i3)')
'Resonance #', nw_subtracted + 1
535 write(
message(6),
'(a,f12.8)')
'f[O->I] = ',
m_two*omega*power
537 write(
message(8),
'(a,f12.8,a,f12.8,a)')
' Search interval = [',
units_from_atomic(
units_out%energy, leftbound),
',', &
541 write(
message(10),
'(a)')
'******************************************************************'
553 real(real64),
intent(in) :: omega
554 real(real64),
intent(out) :: power
555 integer,
intent(in) :: nw_subtracted
556 real(real64),
intent(in) :: leftbound, rightbound
557 real(real64),
intent(in) :: c01, c02
561 call ft(omega, power)
563 case (sine_transform)
570 power = power /
m_two
574 write(
message(1),
'(a)')
'******************************************************************'
575 write(
message(2),
'(a,i3)')
'Resonance #', nw_subtracted + 1
583 write(
message(1),
'(a,f12.8)')
' C(omega)/(C0i*C0j) = ', power / (c01 * c02)
588 write(
message(2),
'(a,f12.8,a,f12.8,a)')
' Search interval = [',
units_from_atomic(
units_out%energy, leftbound),
',', &
590 write(
message(3),
'(a)')
'******************************************************************'
602 integer,
intent(in) :: order
603 integer,
intent(in) :: observable(2)
605 logical :: file_exists
606 integer :: i, j, nspin, time_steps, lmax, nfiles, k, add_lm, l, m, max_add_lm
607 integer,
allocatable :: iunit(:)
608 real(real64) :: dt, lambda, dump, o0
610 real(real64),
allocatable :: q(:), mu(:), qq(:, :), c(:)
611 character(len=20) :: filename
614 real(real64),
allocatable :: multipole(:, :, :), ot(:), dipole(:, :)
623 write(filename,
'(a11,i1)')
'multipoles.', nfiles+1
624 inquire(file=trim(filename), exist = file_exists)
625 if (.not. file_exists)
exit
630 if (nfiles == 0)
then
631 write(
message(1),
'(a)')
'No multipoles.x file was found'
634 if (order > nfiles)
then
635 write(
message(1),
'(a)')
'The order that you ask for is higher than the number'
636 write(
message(2),
'(a)')
'of multipoles.x file that you supply.'
641 safe_allocate(iunit(1:nfiles))
643 write(filename,
'(a11,i1)')
'multipoles.', j
644 iunit(j) =
io_open(trim(filename), namespace, action=
'read', status=
'old')
647 safe_allocate( q(1:nfiles))
648 safe_allocate(mu(1:nfiles))
649 safe_allocate(qq(1:nfiles, 1:nfiles))
650 safe_allocate( c(1:nfiles))
656 call spectrum_mult_info(namespace, iunit(1), nspin, kick, time_steps, dt, units, lmax=lmax)
659 if (kick%n_multipoles > 0)
then
660 kick_operator%n_multipoles = kick%n_multipoles
661 safe_allocate( kick_operator%l(1:kick_operator%n_multipoles))
662 safe_allocate( kick_operator%m(1:kick_operator%n_multipoles))
663 safe_allocate(kick_operator%weight(1:kick_operator%n_multipoles))
664 do i = 1, kick_operator%n_multipoles
665 kick_operator%l(i) = kick%l(i)
666 kick_operator%m(i) = kick%m(i)
667 kick_operator%weight(i) = kick%weight(i)
670 kick_operator%n_multipoles = 3
671 safe_allocate( kick_operator%l(1:kick_operator%n_multipoles))
672 safe_allocate( kick_operator%m(1:kick_operator%n_multipoles))
673 safe_allocate(kick_operator%weight(1:kick_operator%n_multipoles))
674 kick_operator%l(1:3) = 1
675 kick_operator%m(1) = -1
676 kick_operator%m(2) = 0
677 kick_operator%m(3) = 1
685 select case (observable(1))
694 safe_allocate(obs%l(1:1))
695 safe_allocate(obs%m(1:1))
696 safe_allocate(obs%weight(1:1))
698 select case (observable(2))
712 safe_allocate(obs%l(1:1))
713 safe_allocate(obs%m(1:1))
714 safe_allocate(obs%weight(1:1))
715 obs%weight(1) =
m_one
716 obs%l(1) = observable(1)
717 obs%m(1) = observable(2)
720 lambda = abs(kick%delta_strength)
721 q(1) = kick%delta_strength / lambda
724 call spectrum_mult_info(namespace, iunit(j), nspin, kick, time_steps, dt, units, lmax=lmax)
725 q(j) = kick%delta_strength / lambda
738 if (kick%n_multipoles > 0)
then
739 lmax = maxval(kick%l(1:obs%n_multipoles))
740 max_add_lm = (lmax+1)**2-1
741 safe_allocate(multipole(1:max_add_lm, 0:time_steps, 1:nspin))
743 mp_unit = units%length**kick%l(1)
746 safe_allocate(multipole(1:3, 0:time_steps, 1:nspin))
747 mp_unit = units%length
749 safe_allocate(ot(0:time_steps))
754 safe_allocate(dipole(1:3, 1:nspin))
762 read(iunit(j), *) k, dump, dump, (multipole(add_lm, i, 1), add_lm = 1, max_add_lm)
764 read(iunit(j), *) k, dump, dump, (multipole(add_lm, i, 1), add_lm = 1, max_add_lm), &
765 dump, (multipole(add_lm, i, 2), add_lm = 1, max_add_lm)
767 read(iunit(j), *) k, dump, dump, (multipole(add_lm, i, 1), add_lm = 1, max_add_lm), &
768 dump, (multipole(add_lm, i, 2), add_lm = 1, max_add_lm), &
769 dump, (multipole(add_lm, i, 3), add_lm = 1, max_add_lm), &
770 dump, (multipole(add_lm, i, 4), add_lm = 1, max_add_lm)
772 multipole(1:max_add_lm, i, :) =
units_to_atomic(mp_unit, multipole(1:max_add_lm, i, :))
776 dipole(1:3, 1:nspin) = - multipole(1:3, i, 1:nspin)
783 do k = 1, obs%n_multipoles
788 if (l == obs%l(k) .and. m == obs%m(k))
exit lcycle
794 dump = dump + obs%weight(k) * sum(multipole(add_lm, i, 1:nspin))
797 if (i == 0) o0 = dump
798 ot(i) = ot(i) + mu(j)*(dump - o0)
803 ot = ot / lambda**order
805 call write_ot(namespace, nspin, time_steps, dt, kick, order, ot(0:time_steps), observable)
811 safe_deallocate_a(iunit)
813 safe_deallocate_a(mu)
814 safe_deallocate_a(qq)
816 safe_deallocate_a(ot)
817 safe_deallocate_a(multipole)
818 safe_deallocate_a(dipole)
826 subroutine modify_ot(time_steps, dt, order, ot, omega, power)
827 integer,
intent(in) :: time_steps
828 real(real64),
intent(in) :: dt
829 integer,
intent(in) :: order
830 real(real64),
intent(inout) :: ot(0:time_steps)
831 real(real64),
intent(in) :: omega
832 real(real64),
intent(in) :: power
838 select case (mod(order, 2))
841 ot(i) = ot(i) -
m_two * power *
sin(omega*i*dt)
846 ot(i) = ot(i) - power *
cos(omega*i*dt)
850 ot(i) = ot(i) -
m_two * power *
cos(omega*i*dt)
861 subroutine write_ot(namespace, nspin, time_steps, dt, kick, order, ot, observable)
863 integer,
intent(in) :: nspin, time_steps
864 real(real64),
intent(in) :: dt
865 type(
kick_t),
intent(in) :: kick
866 integer,
intent(in) :: order
867 real(real64),
intent(in) :: ot(0:time_steps)
868 integer,
intent(in) :: observable(2)
871 character(len=20) :: header_string
876 iunit =
io_open(
'ot', namespace, action=
'write', status=
'replace')
878 write(iunit,
'(a15,i2)')
'# nspin ', nspin
879 write(iunit,
'(a15,i2)')
'# Order ', order
880 write(iunit,
'(a28,i2)')
'# Frequencies subtracted = ', 0
881 select case (observable(1))
883 write(iunit,
'(a)')
'# Observable operator = kick operator'
884 if (kick%n_multipoles > 0)
then
890 select case (observable(2))
892 write(iunit,
'(a)')
'# O = x'
894 write(iunit,
'(a)')
'# O = y'
896 write(iunit,
'(a)')
'# O = z'
900 ot_unit =
units_out%length**observable(1)
901 write(iunit,
'(a12,i1,a1,i2,a1)')
'# (l, m) = (', observable(1),
',',observable(2),
')'
906 write(iunit,
'(a1)', advance =
'no')
'#'
907 write(iunit,
'(a20)', advance =
'no')
str_center(
't', 19)
908 write(iunit,
'(a20)', advance =
'yes')
str_center(
'<O>(t)', 20)
909 write(iunit,
'(a1)', advance =
'no')
'#'
911 write(iunit,
'(a20)', advance =
'no')
str_center(trim(header_string), 19)
913 write(iunit,
'(a20)', advance =
'yes')
str_center(trim(header_string), 20)
925 subroutine read_ot(namespace, nspin, order, nw_subtracted)
927 integer,
intent(out) :: nspin
928 integer,
intent(out) :: order
929 integer,
intent(out) :: nw_subtracted
931 integer :: iunit, i, ierr
932 character(len=100) :: line
933 character(len=12) :: dummychar
934 real(real64) :: dummy, t1, t2
939 iunit =
io_open(
'ot', namespace, action=
'read', status=
'old')
941 read(iunit,
'(15x,i2)') nspin
942 read(iunit,
'(15x,i2)') order
943 read(iunit,
'(28x,i2)') nw_subtracted
944 read(iunit,
'(a)') line
946 i = index(line,
'Observable')
947 if (index(line,
'Observable') /= 0)
then
949 elseif (index(line,
'# O =') /= 0)
then
951 if (index(line,
'x') /= 0)
then
953 elseif (index(line,
'y') /= 0)
then
955 elseif (index(line,
'z') /= 0)
then
958 elseif (index(line,
'# (l, m) = ') /= 0)
then
959 read(line,
'(a12,i1,a1,i2,a1)') dummychar(1:12), observable(1), dummychar(1:1), observable(2), dummychar(1:1)
961 write(
message(1),
'(a)')
'Problem reading "ot" file: could not figure out the shape'
962 write(
message(2),
'(a)')
'of the observation operator.'
967 read(iunit,
'(a)') line
968 read(iunit,
'(a)') line
974 write(
message(1),
'(a)')
'Could not figure out the units in file "ot".'
978 select case (observable(1))
980 if (kick%n_multipoles > 0)
then
988 ot_unit =
units_out%length**observable(1)
994 read(iunit, *,
end=100) dummy
995 time_steps = time_steps + 1
996 if (time_steps == 1) t1 = dummy
997 if (time_steps == 2) t2 = dummy
1004 safe_allocate(ot(0:time_steps))
1006 do i = 0, time_steps
1007 read(iunit, *) dummy, ot(i)
1016 subroutine print_omega_file(namespace, omega, search_interval, final_time, nfrequencies)
1017 type(namespace_t),
intent(in) :: namespace
1018 real(real64),
intent(inout) :: omega
1019 real(real64),
intent(inout) :: search_interval
1020 real(real64),
intent(inout) :: final_time
1021 integer,
intent(inout) :: nfrequencies
1023 integer :: iunit, i, ierr, nspin, order, nw_subtracted
1024 logical :: file_exists
1025 character(len=20) :: header_string
1026 real(real64),
allocatable :: warray(:), tarray(:)
1027 real(real64) :: leftbound, rightbound, dw, w, aw
1032 inquire(file=
"ot", exist = file_exists)
1033 if (.not. file_exists)
then
1034 write(message(1),
'(a)')
"Could not find 'ot' file."
1035 call messages_fatal(1, namespace=namespace)
1039 call unit_system_from_file(
units,
"ot", namespace, ierr)
1041 write(message(1),
'(a)')
"Could not retrieve units in the 'ot' file."
1042 call messages_fatal(1, namespace=namespace)
1045 if (omega > m_zero)
then
1046 omega = units_to_atomic(
units%energy, omega)
1051 if (search_interval > m_zero)
then
1052 search_interval = units_to_atomic(
units%energy, search_interval)
1054 search_interval = m_half
1057 leftbound = omega - search_interval
1058 rightbound = omega + search_interval
1060 safe_allocate(warray(1:nfrequencies))
1061 safe_allocate(tarray(1:nfrequencies))
1063 call read_ot(namespace, nspin, order, nw_subtracted)
1065 if (mod(order, 2) == 1)
then
1071 if (final_time > m_zero)
then
1075 write(message(1),
'(a)')
'The requested total time to process is larger than the time available in the input file.'
1076 write(message(2),
'(a,f8.4,a)')
'The time has been adjusted to ', &
1077 units_from_atomic(units_out%time,
total_time), trim(units_abbrev(units_out%time))
1078 call messages_warning(2, namespace=namespace)
1088 dw = (rightbound-leftbound) / (nfrequencies - 1)
1089 do i = 1, nfrequencies
1090 w = leftbound + (i-1)*dw
1096 iunit = io_open(
'omega', namespace, action=
'write', status=
'replace')
1097 write(iunit,
'(a15,i2)')
'# nspin ', nspin
1098 call kick_write(
kick, iunit)
1099 write(iunit,
'(a)')
'#%'
1100 write(iunit,
'(a1,a20)', advance =
'no')
'#', str_center(
"omega", 20)
1101 write(header_string,
'(a)')
'F(omega)'
1102 write(iunit,
'(a20)', advance =
'yes') str_center(trim(header_string), 20)
1103 write(iunit,
'(a1,a20)', advance =
'no')
'#', str_center(
'['//trim(units_abbrev(units_out%energy)) //
']', 20)
1105 write(iunit,
'(a)', advance =
'yes')
1107 do i = 1, nfrequencies
1108 write(iunit,
'(2e20.8)') units_from_atomic(units_out%energy, warray(i)), &
1112 safe_deallocate_a(warray)
1113 safe_deallocate_a(tarray)
1133 integer :: run_mode, order, nfrequencies, ierr, nresonances
1134 real(real64) :: omega, search_interval, final_time, damping
1135 integer,
parameter :: &
1136 ANALYZE_NTHORDER_SIGNAL = 1, &
1137 generate_nthorder_signal = 2, &
1138 read_resonances_from_file = 3, &
1139 generate_omega_file = 4
1140 character(len=100) :: ffile
1145 message(1) =
"Your Fortran compiler doesn't support command-line arguments;"
1146 message(2) =
"the oct-oscillator-strength command is not available."
1151 run_mode = analyze_nthorder_signal
1153 search_interval = -
m_one
1156 final_time = -
m_one
1161 damping = 0.1_real64/27.2114_real64
1165 order, nresonances, nfrequencies, final_time, &
1174 select case (run_mode)
1175 case (generate_nthorder_signal)
1177 case (analyze_nthorder_signal)
1178 call analyze_signal(order, omega, search_interval, final_time, nresonances, nfrequencies, damping, &
1180 case (read_resonances_from_file)
1181 call read_resonances_file(order, ffile, global_namespace, search_interval, final_time, nfrequencies)
1182 case (generate_omega_file)
1183 call print_omega_file(global_namespace, omega, search_interval, final_time, nfrequencies)
double sin(double __x) __attribute__((__nothrow__
double cos(double __x) __attribute__((__nothrow__
subroutine, public getopt_init(ierr)
Initializes the getopt machinery. Must be called before attempting to parse the options....
subroutine, public getopt_end
real(real64), parameter, public m_two
subroutine, public global_end()
Finalise parser varinfo file, and MPI.
real(real64), parameter, public m_zero
real(real64), parameter, public m_four
real(real64), parameter, public m_pi
some mathematical constants
type(mpi_comm), parameter, public serial_dummy_comm
Alias MPI_COMM_UNDEFINED for the specific use case of initialising Octopus utilities with no MPI supp...
subroutine, public init_octopus_globals(comm)
Initialise Octopus-specific global constants and files. This routine performs no initialisation calls...
complex(real64), parameter, public m_z0
complex(real64), parameter, public m_zi
real(real64), parameter, public m_epsilon
real(real64), parameter, public m_half
real(real64), parameter, public m_one
real(real64), parameter, public m_three
subroutine, public io_init(defaults)
If the argument defaults is present and set to true, then the routine will not try to read anything f...
subroutine, public io_close(iunit, grp)
subroutine, public io_skip_header(iunit)
subroutine, public io_end()
integer function, public io_open(file, namespace, action, status, form, position, die, recl, grp)
subroutine, public kick_read(kick, iunit, namespace)
subroutine, public kick_write(kick, iunit, out)
subroutine, public messages_not_implemented(feature, namespace)
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)
subroutine ft(omega, power)
integer, dimension(2) observable
subroutine write_ot(namespace, nspin, time_steps, dt, kick, order, ot, observable)
subroutine generate_signal(namespace, order, observable)
subroutine ft2(omega, power)
subroutine read_ot(namespace, nspin, order, nw_subtracted)
subroutine resonance_first_order(omega, power, nw_subtracted, dw, leftbound, rightbound)
type(unit_system_t) units
integer, parameter sine_transform
integer, parameter cosine_transform
subroutine resonance_second_order(omega, power, nw_subtracted, leftbound, rightbound, c01, c02)
subroutine analyze_signal(order, omega, search_interval, final_time, nresonances, nfrequencies, damping, namespace)
subroutine modify_ot(time_steps, dt, order, ot, omega, power)
subroutine print_omega_file(namespace, omega, search_interval, final_time, nfrequencies)
subroutine find_resonance(omega, leftbound, rightbound, nfrequencies)
subroutine local_operator_copy(o, i)
subroutine read_resonances_file(order, ffile, namespace, search_interval, final_time, nfrequencies)
subroutine write_polarizability(namespace, nfrequencies, nresonances, dw, w, c0I2, gamma)
Implements the SOS formula of the polarizability, and writes down to the "polarizability" file the re...
subroutine, public spectrum_mult_info(namespace, iunit, nspin, kick, time_steps, dt, file_units, lmax)
character(len=80) function, public str_center(s_in, l_in)
puts space around string, so that it is centered
brief This module defines the class unit_t which is used by the unit_systems_oct_m module.
character(len=20) pure function, public units_abbrev(this)
This module defines the unit system, used for input and output.
type(unit_system_t), public units_out
subroutine, public unit_system_from_file(uu, fname, namespace, ierr)
This is a very primitive procedure that attempts to find out which units were used to write an octopu...
program oscillator_strength