48 use,
intrinsic :: iso_fortran_env
108 integer,
parameter,
public :: &
109 OUT_MULTIPOLES = 1, &
146 character(len=100) :: td_file_name(OUT_MAX) = [character(100) :: &
156 "magnetic_moments", &
171 "total_heat_current", &
172 "total_magnetization", &
174 "maxwell_dipole_field", &
175 "norm_wavefunctions", &
178 integer,
parameter :: &
179 OUT_DFTU_EFFECTIVE_U = 1, &
183 integer,
parameter :: &
184 OUT_MAXWELL_TOTAL_E_FIELD = 1, &
198 integer,
parameter,
public :: &
201 integer,
parameter :: &
206 integer,
parameter :: &
212 type(c_ptr) :: handle
213 type(c_ptr),
allocatable :: mult_handles(:)
215 integer :: hand_start
217 logical ::
write = .false.
218 logical :: resolve_states = .false.
230 real(real64) :: lmm_r
233 integer :: n_excited_states
235 integer :: compute_interval
241 subroutine td_write_kick(outp, namespace, space, mesh, kick, ions, iter)
245 class(
mesh_t),
intent(in) :: mesh
246 type(
kick_t),
intent(in) :: kick
247 type(
ions_t),
intent(in) :: ions
248 integer,
intent(in) :: iter
250 complex(real64),
allocatable :: kick_function(:)
251 character(len=256) :: filename
256 write(filename,
'(a,i7.7)')
"td.", iter
257 if (outp%what(option__output__delta_perturbation))
then
258 safe_allocate(kick_function(1:mesh%np))
260 call zio_function_output(outp%how(option__output__delta_perturbation), filename,
"kick_function", namespace, &
261 space, mesh, kick_function(:),
units_out%energy, err, pos=ions%pos, atoms=ions%atom)
262 safe_deallocate_a(kick_function)
278 subroutine td_write_init(writ, namespace, space, outp, gr, st, hm, ions, ext_partners, ks, ions_move, &
279 with_gauge_field, kick, iter, max_iter, dt, mc)
283 type(
output_t),
intent(inout) :: outp
284 type(
grid_t),
intent(in) :: gr
287 type(
ions_t),
intent(in) :: ions
289 type(
v_ks_t),
intent(inout) :: ks
290 logical,
intent(in) :: ions_move
291 logical,
intent(in) :: with_gauge_field
292 type(
kick_t),
intent(in) :: kick
293 integer,
intent(in) :: iter
294 integer,
intent(in) :: max_iter
295 real(real64),
intent(in) :: dt
299 integer :: ierr, first, ii, ist, jj, flags, iout, default, ifile
304 character(len=MAX_PATH_LEN) :: filename
306 logical :: resolve_states
307 logical,
allocatable :: skip(:)
449 output_options = .false.
450 output_options(out_multipoles) = .
true.
465 writ%out(iout)%write = output_options(iout)
480 if (space%is_periodic() .and. writ%out(
out_angular)%write)
then
495 if (gr%np /= gr%np_global)
then
496 message(1) =
"TDOutput option td_kpoint_occup and td_floquet do not work with domain parallelization"
503 'Forces for systems periodic in 1D are not currently implemented and options that output the forces are not allowed.')
507 if (writ%out(
out_kp_proj)%write .and. hm%kpoints%nik_skip == 0)
then
508 message(1) =
"TDOutput option td_kpoint_occup only work with zero-weight k-points at the moment."
522 call parse_variable(namespace,
'TDOutputResolveStates', .false., resolve_states)
523 if (.not. writ%out(out_multipoles)%write)
then
524 write(
message(1),
'(a)')
"TDOutputResolveStates works only for TDOutput = multipoles."
537 if (writ%lmax < 0)
then
538 write(
message(1),
'(a,i6,a)')
"Input: '", writ%lmax,
"' is not a valid TDMultipoleLmax."
539 message(2) =
'(Must be TDMultipoleLmax >= 0 )'
545 if ((writ%out(
out_acc)%write) .and. ions_move)
then
546 message(1) =
'If harmonic spectrum is to be calculated, atoms should not be allowed to move.'
550 if ((writ%out(
out_q)%write) .and. .not.(ks%has_photons))
then
551 message(1) =
'If q(t) is to be calculated, you need to allow for photon modes.'
556 .or. hm%mxll%add_electric_dip))
then
557 message(1) =
'If the dipolar field has to be written, MaxwellCouplingMode has to be'
558 message(2) =
'"lenght_gauge_dipole" or "velocity_gauge_dipole" and at least one Maxwell system'
559 message(3) =
'must be present.'
563 rmin = ions%min_distance()
573 message(1) =
"Option TDOutput = populations is not implemented for parallel in states."
585 safe_deallocate_a(writ%gs_st%node)
593 writ%gs_st%st_end = writ%gs_st%nst
595 message(1) =
"Unable to read states information."
599 writ%gs_st%st_start = 1
615 call parse_variable(namespace,
'TDProjStateStart', 1, writ%gs_st%st_start)
617 if (st%parallel_in_states .and. writ%out(
out_proj)%write .and. writ%gs_st%st_start > 1)
then
623 writ%gs_st%lnst = writ%gs_st%st_end - writ%gs_st%st_start + 1
627 writ%gs_st%parallel_in_states = .false.
630 safe_allocate(writ%gs_st%occ(1:writ%gs_st%nst, 1:writ%gs_st%nik))
631 safe_allocate(writ%gs_st%eigenval(1:writ%gs_st%nst, 1:writ%gs_st%nik))
635 safe_allocate(writ%gs_st%node(1:writ%gs_st%nst))
636 writ%gs_st%node(:) = 0
638 writ%gs_st%eigenval = huge(writ%gs_st%eigenval)
640 if (writ%gs_st%d%ispin ==
spinors)
then
641 safe_deallocate_a(writ%gs_st%spin)
642 safe_allocate(writ%gs_st%spin(1:3, 1:writ%gs_st%nst, 1:writ%gs_st%nik))
645 safe_allocate(skip(1:writ%gs_st%nst))
647 skip(1:writ%gs_st%st_start-1) = .
true.
651 safe_deallocate_a(skip)
656 if (ierr /= 0 .and. ierr /= (writ%gs_st%st_end-writ%gs_st%st_start+1)*writ%gs_st%nik &
657 *writ%gs_st%d%dim*writ%gs_st%mpi_grp%size)
then
658 message(1) =
"Unable to read wavefunctions for TDOutput."
703 if (
parse_block(namespace,
'TDExcitedStatesToProject', blk) == 0)
then
705 safe_allocate(writ%excited_st(1:writ%n_excited_states))
706 do ist = 1, writ%n_excited_states
711 writ%n_excited_states = 0
725 call parse_variable(namespace,
'TDOutputComputeInterval', 50, writ%compute_interval)
726 if (writ%compute_interval < 0)
then
727 message(1) =
"TDOutputComputeInterval must be >= 0."
743 call io_mkdir(
'td.general', namespace)
754 do ifile = 1, out_max
758 if (writ%out(ifile)%write)
then
762 trim(
io_workpath(
"td.general/"//trim(td_file_name(ifile)), namespace)))
770 if (writ%out(out_multipoles)%write .and. .not. resolve_states)
then
773 trim(
io_workpath(
"td.general/multipoles", namespace)))
777 select case (kick%qkick_mode)
779 write(filename,
'(a)')
'td.general/ftchd.sin'
781 write(filename,
'(a)')
'td.general/ftchd.cos'
783 write(filename,
'(a, SP, I0.3, a, I0.3)')
'td.general/ftchd.l', kick%qbessel_l,
'_m', kick%qbessel_m
785 write(filename,
'(a)')
'td.general/ftchd'
797 call io_rm(
"td.general/laser", namespace=namespace)
814 if (writ%out(out_multipoles)%write .and. resolve_states)
then
816 writ%out(out_multipoles)%hand_start = st%st_start
817 writ%out(out_multipoles)%hand_end = st%st_end
818 writ%out(out_multipoles)%resolve_states = .
true.
819 writ%out(out_multipoles)%mpi_grp = gr%mpi_grp
821 safe_allocate(writ%out(out_multipoles)%mult_handles(st%st_start:st%st_end))
824 do ist = st%st_start, st%st_end
825 write(filename,
'(a,i4.4)')
'td.general/multipoles-ist', ist
838 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, &
839 calc_eigenval=.false., time = iter*dt, calc_energy = .false.)
842 if (writ%out(
out_n_ex)%write .and. writ%compute_interval > 0)
then
843 call io_mkdir(outp%iter_dir, namespace)
846 if (all(outp%how == 0) .and. writ%out(
out_n_ex)%write)
then
868 if (hm%lda_u_level ==
dft_u_acbn0) default = default + 2**(out_dftu_effective_u - 1)
876 writ%out_dftu(iout)%write = (iand(flags, 2**(iout - 1)) /= 0)
880 if (writ%out_dftu(out_dftu_effective_u)%write)
then
883 trim(
io_workpath(
"td.general/effectiveU", namespace)))
901 if (writ%out(iout)%write)
then
903 if (writ%out(iout)%resolve_states)
then
904 do ist = writ%out(iout)%hand_start, writ%out(iout)%hand_end
907 safe_deallocate_a(writ%out(iout)%mult_handles)
917 if (writ%out_dftu(iout)%write)
call write_iter_end(writ%out_dftu(iout)%handle)
923 do ist = 1, writ%n_excited_states
926 writ%n_excited_states = 0
939 subroutine td_write_iter(writ, namespace, space, outp, gr, st, hm, ions, ext_partners, kick, ks, dt, iter, mc, recalculate_gs)
942 class(
space_t),
intent(in) :: space
944 type(
grid_t),
intent(in) :: gr
947 type(
ions_t),
intent(inout) :: ions
949 type(
kick_t),
intent(in) :: kick
950 type(
v_ks_t),
intent(in) :: ks
951 real(real64),
intent(in) :: dt
952 integer,
intent(in) :: iter
954 logical,
intent(in) :: recalculate_gs
962 if (writ%out(out_multipoles)%write)
then
963 call td_write_multipole(writ%out(out_multipoles), space, gr, ions, st, writ%lmax, kick, iter)
986 if (writ%out(
out_proj)%write .and. mod(iter, writ%compute_interval) == 0)
then
995 if (writ%out(
out_kp_proj)%write .and. mod(iter, writ%compute_interval) == 0)
then
1001 ions%pos, ions%vel, ions%tot_force, iter)
1006 ions%pos, ions%vel, ions%tot_force, iter, 1)
1011 ions%pos, ions%vel, ions%tot_force, iter, 2)
1016 ions%pos, ions%vel, ions%tot_force, iter, 3)
1027 if (writ%out(
out_acc)%write)
then
1028 call td_write_acc(writ%out(
out_acc)%handle, namespace, space, gr, ions, st, hm, ext_partners, dt, iter)
1031 if (writ%out(
out_vel)%write)
then
1044 if(
associated(gfield))
then
1070 if (writ%out(
out_n_ex)%write .and. mod(iter, writ%compute_interval) == 0)
then
1072 if (recalculate_gs)
then
1075 ierr, label =
': Houston states for TDOutput')
1079 call td_write_n_ex(writ%out(
out_n_ex)%handle, outp, namespace, gr, hm%kpoints, st, writ%gs_st, iter)
1091 if (writ%out_dftu(out_dftu_effective_u)%write)
then
1095 if (writ%out(
out_q)%write .and. ks%has_photons)
then
1099 if (writ%out(
out_mxll_field)%write .and. hm%mxll%calc_field_dip)
then
1116 do iout = 1, out_max
1118 if (writ%out(iout)%write)
then
1120 if (writ%out(iout)%resolve_states)
then
1121 do ii = writ%out(iout)%hand_start, writ%out(iout)%hand_end
1133 if (writ%out_dftu(iout)%write)
call write_iter_flush(writ%out_dftu(iout)%handle)
1142 subroutine td_write_output(namespace, space, gr, st, hm, ks, outp, ions, ext_partners, iter, dt)
1145 type(
grid_t),
intent(in) :: gr
1148 type(
v_ks_t),
intent(inout) :: ks
1150 type(
ions_t),
intent(in) :: ions
1152 integer,
intent(in) :: iter
1153 real(real64),
optional,
intent(in) :: dt
1155 character(len=256) :: filename
1161 if (st%modelmbparticles%nparticle > 0)
then
1166 write(filename,
'(a,a,i7.7)') trim(outp%iter_dir),
"td.", iter
1168 call output_all(outp, namespace, space, filename, gr, ions, iter, st, hm, ks)
1170 call output_modelmb(outp, namespace, space, filename, gr, ions, iter, st)
1172 if (
present(dt))
then
1173 call output_scalar_pot(outp, namespace, space, filename, gr, ions, ext_partners, iter*dt)
1175 if (iter == 0)
call output_scalar_pot(outp, namespace, space, filename, gr, ions, ext_partners)
1184 type(c_ptr),
intent(inout) ::
out_spin
1185 class(
mesh_t),
intent(in) :: mesh
1187 integer,
intent(in) :: iter
1189 character(len=130) :: aux
1190 real(real64) :: spin(3)
1206 if (st%d%ispin ==
spinors)
then
1207 write(aux,
'(a2,18x)')
'Sx'
1209 write(aux,
'(a2,18x)')
'Sy'
1212 write(aux,
'(a2,18x)')
'Sz'
1220 select case (st%d%ispin)
1237 type(
grid_t),
intent(in) :: gr
1239 type(
ions_t),
intent(in) :: ions
1240 real(real64),
intent(in) :: lmm_r
1241 integer,
intent(in) :: iter
1244 character(len=50) :: aux
1245 real(real64),
allocatable :: lmm(:,:)
1250 safe_allocate(lmm(1:3, 1:ions%natoms))
1260 do ia = 1, ions%natoms
1261 if (st%d%ispin ==
spinors)
then
1262 write(aux,
'(a2,i2.2,16x)')
'mx', ia
1264 write(aux,
'(a2,i2.2,16x)')
'my', ia
1267 write(aux,
'(a2,i2.2,16x)')
'mz', ia
1276 do ia = 1, ions%natoms
1277 select case (st%d%ispin)
1285 safe_deallocate_a(lmm)
1293 type(c_ptr),
intent(inout) :: out_magnets
1294 class(
mesh_t),
intent(in) :: mesh
1296 type(
kick_t),
intent(in) :: kick
1297 integer,
intent(in) :: iter
1299 complex(real64),
allocatable :: tm(:,:)
1304 safe_allocate(tm(1:6,1:kick%nqvec))
1306 do iq = 1, kick%nqvec
1336 do iq = 1, kick%nqvec
1345 safe_deallocate_a(tm)
1359 subroutine td_write_angular(out_angular, namespace, space, gr, ions, hm, st, kick, iter)
1360 type(c_ptr),
intent(inout) :: out_angular
1362 class(
space_t),
intent(in) :: space
1363 type(
grid_t),
intent(in) :: gr
1364 type(
ions_t),
intent(inout) :: ions
1367 type(
kick_t),
intent(in) :: kick
1368 integer,
intent(in) :: iter
1371 character(len=130) :: aux
1372 real(real64) :: angular(3)
1379 call angular_momentum%setup_dir(idir)
1382 m_two*real(angular_momentum%zstates_elec_expectation_value(namespace, space, gr, hm, st), real64)
1384 safe_deallocate_p(angular_momentum)
1391 write(aux,
'(a15,i2)')
'# nspin ', st%d%nspin
1399 write(aux,
'(a4,18x)')
'<Lx>'
1401 write(aux,
'(a4,18x)')
'<Ly>'
1403 write(aux,
'(a4,18x)')
'<Lz>'
1432 class(
space_t),
intent(in) :: space
1433 type(
grid_t),
intent(in) :: gr
1434 type(
ions_t),
intent(in) :: ions
1436 integer,
intent(in) :: lmax
1437 type(
kick_t),
intent(in) :: kick
1438 integer,
intent(in) :: iter
1441 real(real64),
allocatable :: rho(:,:)
1445 if (out_multip%resolve_states)
then
1446 safe_allocate(rho(1:gr%np_part, 1:st%d%nspin))
1449 do ist = st%st_start, st%st_end
1451 call td_write_multipole_r(out_multip%mult_handles(ist), space, gr, ions, st, lmax, kick, rho, iter, &
1452 mpi_grp = out_multip%mpi_grp)
1455 safe_deallocate_a(rho)
1458 if (
allocated(st%frozen_rho))
then
1459 safe_allocate(rho(1:gr%np, 1:st%d%nspin))
1460 call lalg_copy(gr%np, st%d%nspin, st%rho, rho)
1465 safe_deallocate_a(rho)
1477 subroutine td_write_multipole_r(out_multip, space, mesh, ions, st, lmax, kick, rho, iter, mpi_grp)
1478 type(c_ptr),
intent(inout) :: out_multip
1479 class(
space_t),
intent(in) :: space
1480 class(
mesh_t),
intent(in) :: mesh
1481 type(
ions_t),
intent(in) :: ions
1483 integer,
intent(in) :: lmax
1484 type(
kick_t),
intent(in) :: kick
1485 real(real64),
intent(in) :: rho(:,:)
1486 integer,
intent(in) :: iter
1487 type(
mpi_grp_t),
optional,
intent(in) :: mpi_grp
1490 integer :: is, idir, ll, mm, add_lm
1491 character(len=120) :: aux
1492 real(real64) :: ionic_dipole(ions%space%dim)
1493 real(real64),
allocatable :: multipole(:,:)
1499 assert(.not. (lmax > 1 .and. space%dim > 3))
1502 if (
present(mpi_grp)) mpi_grp_ = mpi_grp
1507 write(aux,
'(a15,i2)')
'# nspin ', st%d%nspin
1511 write(aux,
'(a15,i2)')
'# lmax ', lmax
1519 do is = 1, st%d%nspin
1520 write(aux,
'(a18,i1,a1)')
'Electronic charge(', is,
')'
1523 do idir = 1, space%dim
1524 write(aux,
'(4a1,i1,a1)')
'<',
index2axis(idir),
'>',
'(', is,
')'
1530 write(aux,
'(a2,i2,a4,i2,a2,i1,a1)')
'l=', ll,
', m=', mm,
' (', is,
')'
1541 do is = 1, st%d%nspin
1544 do idir = 1, space%dim
1560 if (space%dim > 3 .and. lmax == 1)
then
1562 safe_allocate(multipole(1:space%dim+1, 1:st%d%nspin))
1564 safe_allocate(multipole(1:(lmax + 1)**2, 1:st%d%nspin))
1568 do is = 1, st%d%nspin
1573 ionic_dipole = ions%dipole()
1574 do is = 1, st%d%nspin
1575 multipole(2:space%dim+1, is) = -ionic_dipole(1:space%dim)/st%d%nspin - multipole(2:space%dim+1, is)
1581 do is = 1, st%d%nspin
1584 do idir = 1, space%dim
1588 add_lm = space%dim + 2
1599 safe_deallocate_a(multipole)
1604 subroutine td_write_ftchd(out_ftchd, space, mesh, st, kick, iter)
1605 type(c_ptr),
intent(inout) :: out_ftchd
1606 class(
space_t),
intent(in) :: space
1607 class(
mesh_t),
intent(in) :: mesh
1609 type(
kick_t),
intent(in) :: kick
1610 integer,
intent(in) :: iter
1612 integer :: is, ip, idir
1613 character(len=120) :: aux, aux2
1614 real(real64) :: ftchd_bessel
1615 complex(real64) :: ftchd
1617 real(real64),
allocatable :: integrand_bessel(:)
1618 complex(real64),
allocatable :: integrand(:)
1625 write(aux,
'(a15, i2)')
'# qkickmode ', kick%qkick_mode
1630 write(aux,
'(a15, i0.3, 1x, i0.3)')
'# ll, mm ', kick%qbessel_l, kick%qbessel_m
1636 write(aux,
'(a15, f9.6)')
'# qlength ', kick%qlength
1638 write(aux,
'(a15)')
'# qvector '
1639 do idir = 1, space%dim
1640 write(aux2,
'(f9.5)') kick%qvector(idir,1)
1641 aux = trim(aux) // trim(aux2)
1647 write(aux,
'(a15,f18.12)')
'# kick strength', kick%delta_strength
1653 write(aux,
'(a17)')
'int(j_l*Y_lm*rho)'
1655 write(aux,
'(a12)')
'Real, Imag'
1672 safe_allocate(integrand(1:mesh%np))
1674 do is = 1, st%d%nspin
1676 integrand(ip) = integrand(ip) + st%rho(ip, is) *
exp(-
m_zi*sum(mesh%x(ip, 1:space%dim)*kick%qvector(1:space%dim, 1)))
1680 safe_deallocate_a(integrand)
1683 safe_allocate(integrand_bessel(1:mesh%np))
1684 integrand_bessel =
m_zero
1685 do is = 1, st%d%nspin
1687 call ylmr_real(mesh%x(ip, 1:3), kick%qbessel_l, kick%qbessel_m, ylm)
1688 integrand_bessel(ip) = integrand_bessel(ip) + st%rho(ip, is) * &
1689 loct_sph_bessel(kick%qbessel_l, kick%qlength*norm2(mesh%x(ip, :)))*ylm
1693 safe_deallocate_a(integrand_bessel)
1712 type(c_ptr),
intent(inout) :: out_temperature
1713 type(
ions_t),
intent(in) :: ions
1714 integer,
intent(in) :: iter
1749 type(c_ptr),
intent(inout) :: out_populations
1751 class(
space_t),
intent(in) :: space
1752 class(
mesh_t),
intent(in) :: mesh
1755 real(real64),
intent(in) :: dt
1756 integer,
intent(in) :: iter
1759 character(len=6) :: excited_name
1760 complex(real64) :: gsp
1761 complex(real64),
allocatable :: excited_state_p(:)
1762 complex(real64),
allocatable :: dotprodmatrix(:, :, :)
1767 safe_allocate(dotprodmatrix(1:writ%gs_st%nst, 1:st%nst, 1:st%nik))
1772 assert(.not. space%is_periodic())
1777 if (writ%n_excited_states > 0)
then
1778 safe_allocate(excited_state_p(1:writ%n_excited_states))
1779 do ist = 1, writ%n_excited_states
1780 excited_state_p(ist) =
zstates_elec_mpdotp(namespace, mesh, writ%excited_st(ist), st, dotprodmatrix)
1792 do ist = 1, writ%n_excited_states
1793 write(excited_name,
'(a2,i3,a1)')
'P(', ist,
')'
1812 do ist = 1, writ%n_excited_states
1819 if (writ%n_excited_states > 0)
then
1820 safe_deallocate_a(excited_state_p)
1822 safe_deallocate_a(dotprodmatrix)
1828 subroutine td_write_acc(out_acc, namespace, space, gr, ions, st, hm, ext_partners, dt, iter)
1829 type(c_ptr),
intent(inout) :: out_acc
1831 class(
space_t),
intent(in) :: space
1832 type(
grid_t),
intent(in) :: gr
1833 type(
ions_t),
intent(inout) :: ions
1837 real(real64),
intent(in) :: dt
1838 integer,
intent(in) :: iter
1841 character(len=7) :: aux
1842 real(real64) :: acc(space%dim)
1851 do idim = 1, space%dim
1852 write(aux,
'(a4,i1,a1)')
'Acc(', idim,
')'
1860 do idim = 1, space%dim
1867 call td_calc_tacc(namespace, space, gr, ions, ext_partners, st, hm, acc, dt*iter)
1880 subroutine td_write_vel(out_vel, gr, st, space, kpoints, iter)
1881 type(c_ptr),
intent(inout) :: out_vel
1882 type(
grid_t),
intent(in) :: gr
1884 type(
space_t),
intent(in) :: space
1886 integer,
intent(in) :: iter
1889 character(len=7) :: aux
1890 real(real64) :: vel(space%dim)
1899 do idim = 1, space%dim
1900 write(aux,
'(a4,i1,a1)')
'Vel(', idim,
')'
1908 do idim = 1, space%dim
1930 type(c_ptr),
intent(inout) :: out_laser
1931 class(
space_t),
intent(in) :: space
1932 type(
lasers_t),
intent(inout) :: lasers
1933 real(real64),
intent(in) :: dt
1934 integer,
intent(in) :: iter
1937 real(real64) :: field(space%dim)
1938 real(real64) :: ndfield(space%dim)
1939 character(len=80) :: aux
1955 do il = 1, lasers%no_lasers
1958 do idir = 1, space%dim
1959 write(aux,
'(a,i1,a)')
'E(', idir,
')'
1963 do idir = 1, space%dim
1964 write(aux,
'(a,i1,a)')
'B(', idir,
')'
1968 do idir = 1, space%dim
1969 write(aux,
'(a,i1,a)')
'A(', idir,
')'
1973 write(aux,
'(a,i1,a)')
'e(t)'
1979 do idir = 1, space%dim
1980 write(aux,
'(a,i1,a)')
'A^M(', idir,
')'
1992 do il = 1, lasers%no_lasers
1996 do idir = 1, space%dim
2001 do idir = 1, space%dim
2012 do idir = 1, space%dim
2025 do il = 1, lasers%no_lasers
2027 call laser_field(lasers%lasers(il), field(1:space%dim), iter*dt)
2052 type(c_ptr),
intent(inout) :: out_energy
2054 integer,
intent(in) :: iter
2055 real(real64),
intent(in) :: ke
2059 integer :: n_columns
2082 if (hm%pcm%run_pcm)
then
2084 n_columns = n_columns + 1
2089 n_columns = n_columns + 1
2099 do ii = 1, n_columns
2122 hm%energy%int_nn_pcm + hm%energy%int_ne_pcm), 1)
2135 type(c_ptr),
intent(inout) :: out_eigs
2137 integer,
intent(in) :: iter
2140 character(len=68) :: buf
2153 write(buf,
'(a15,i2)')
'# nst ', st%nst
2157 write(buf,
'(a15,i2)')
'# nspin ', st%d%nspin
2163 do is = 1, st%d%kpt%nglobal
2165 write(buf,
'(a,i4)')
'Eigenvalue ',ii
2174 do is = 1, st%d%kpt%nglobal
2184 do is = 1, st%d%kpt%nglobal
2196 type(c_ptr),
intent(inout) :: out_ionch
2197 class(
mesh_t),
intent(in) :: mesh
2199 integer,
intent(in) :: iter
2201 integer :: ii, ist, Nch, ik, idim
2202 character(len=68) :: buf
2203 real(real64),
allocatable :: ch(:), occ(:)
2204 real(real64),
allocatable :: occbuf(:)
2209 nch = st%nst * st%d%kpt%nglobal * st%d%dim
2210 safe_allocate(ch(0: nch))
2211 safe_allocate(occ(0: nch))
2217 do idim = 1, st%d%dim
2218 if (st%st_start <= ist .and. ist <= st%st_end .and. &
2219 st%d%kpt%start <= ik .and. ik <= st%d%kpt%end)
then
2220 occ(ii) = st%occ(ist, ik)
2228 if (st%parallel_in_states)
then
2229 safe_allocate(occbuf(0: nch))
2231 call st%mpi_grp%allreduce(occ(0), occbuf(0), nch+1, mpi_double_precision, mpi_sum)
2233 safe_deallocate_a(occbuf)
2241 safe_deallocate_a(ch)
2254 if (occ(ii)>
m_zero .or. ii == 0)
then
2255 write(buf,
'(a,f4.1,a)')
'Pion(',occ(ii)*ii,
'+, t)'
2265 if (occ(ii)>
m_zero .or. ii == 0)
then
2275 if (occ(ii)>
m_zero .or. ii == 0)
then
2281 safe_deallocate_a(ch)
2282 safe_deallocate_a(occ)
2289 type(c_ptr),
intent(inout) :: out_proj
2290 class(
space_t),
intent(in) :: space
2291 class(
mesh_t),
intent(in) :: mesh
2292 type(
ions_t),
intent(in) :: ions
2295 type(
kick_t),
intent(in) :: kick
2296 integer,
intent(in) :: iter
2298 complex(real64),
allocatable :: projections(:,:,:)
2299 character(len=80) :: aux
2300 integer :: ik, ist, uist, idir
2308 write(aux,
'(a15,i2)')
'# nspin ', st%d%nspin
2317 write(aux,
'(a,i8)')
"# nik ", st%nik
2321 write(aux,
'(a,2i8)')
"# st ", gs_st%st_start, st%nst
2325 write(aux,
'(a,2i8)')
"# ust ", gs_st%st_start, gs_st%st_end
2331 do ist = gs_st%st_start, st%nst
2339 do ist = gs_st%st_start, st%nst
2340 do uist = gs_st%st_start, gs_st%st_end
2341 write(aux,
'(i4,a,i4)') ist,
' -> ', uist
2352 if (.not. space%is_periodic())
then
2354 safe_allocate(projections(1:st%nst, gs_st%st_start:gs_st%st_end, 1:st%nik))
2355 do idir = 1, space%dim
2361 write(aux,
'(a,i1,a)')
"<i|x_", idir,
"|a>"
2365 do ist = gs_st%st_start, st%st_end
2366 do uist = gs_st%st_start, gs_st%st_end
2376 safe_deallocate_a(projections)
2386 safe_allocate(projections(1:st%nst, gs_st%st_start:gs_st%st_end, 1:st%nik))
2387 projections(:,:,:) =
m_z0
2393 do ist = gs_st%st_start, st%nst
2394 do uist = gs_st%st_start, gs_st%st_end
2403 safe_deallocate_a(projections)
2409 integer,
intent(in) :: dir
2411 integer :: uist, ist, ik, idim
2412 real(real64) :: n_dip(space%dim)
2413 complex(real64),
allocatable :: xpsi(:,:)
2414 complex(real64),
allocatable :: psi(:, :), gspsi(:, :)
2418 safe_allocate(psi(1:mesh%np, 1:st%d%dim))
2419 safe_allocate(gspsi(1:mesh%np, 1:st%d%dim))
2420 safe_allocate(xpsi(1:mesh%np, 1:st%d%dim))
2422 do ik = st%d%kpt%start, st%d%kpt%end
2423 do ist = st%st_start, st%st_end
2425 do uist = gs_st%st_start, gs_st%st_end
2428 do idim = 1, st%d%dim
2429 xpsi(1:mesh%np, idim) = mesh%x(1:mesh%np, dir)*gspsi(1:mesh%np, idim)
2431 projections(ist, uist, ik) = -
zmf_dotp(mesh, st%d%dim, psi, xpsi, reduce = .false.)
2437 safe_deallocate_a(xpsi)
2438 safe_deallocate_a(gspsi)
2439 safe_deallocate_a(psi)
2444 n_dip = ions%dipole()
2446 do ist = gs_st%st_start, st%nst
2447 do uist = gs_st%st_start, gs_st%st_end
2448 projections(ist, uist, ik) = projections(ist, uist, ik) - n_dip(dir)
2464 subroutine td_write_n_ex(out_nex, outp, namespace, mesh, kpoints, st, gs_st, iter)
2465 type(c_ptr),
intent(inout) :: out_nex
2468 class(
mesh_t),
intent(in) :: mesh
2472 integer,
intent(in) :: iter
2474 complex(real64),
allocatable :: projections(:,:)
2475 character(len=80) :: aux, dir
2476 integer :: ik, ikpt, ist, uist, err
2477 real(real64) :: Nex, weight
2479 real(real64),
allocatable :: Nex_kpt(:)
2488 write(aux,
'(a15,i2)')
'# nspin ', st%d%nspin
2495 write(aux,
'(a,i8)')
"# nik ", st%nik
2499 write(aux,
'(a,2i8)')
"# st ", gs_st%st_start, st%nst
2503 write(aux,
'(a,2i8)')
"# ust ", gs_st%st_start, gs_st%st_end
2522 do ist = 1, gs_st%nst
2523 if (gs_st%occ(ist, ik) >
m_min_occ .and. ist > gs_nst) gs_nst = ist
2527 safe_allocate(projections(1:gs_nst, 1:st%nst))
2529 safe_allocate(nex_kpt(1:st%nik))
2531 do ik = st%d%kpt%start, st%d%kpt%end
2532 ikpt = st%d%get_kpoint_index(ik)
2535 weight = st%kweights(ik) * gs_st%occ(ist, ik)/ st%smear%el_per_state
2536 do uist = st%st_start, st%st_end
2537 nex_kpt(ikpt) = nex_kpt(ikpt) - weight * st%occ(uist, ik) * abs(projections(ist, uist))**2
2540 nex_kpt(ikpt) = nex_kpt(ikpt) + sum(st%occ(st%st_start:st%st_end, ik))*st%kweights(ik)
2543 if (st%parallel_in_states .or. st%d%kpt%parallel)
then
2555 write(dir,
'(a,a,i7.7)') trim(outp%iter_dir),
"td.", iter
2558 + outp%how(option__output__density_kpt), dir,
"n_excited_el_kpt", namespace, &
2562 safe_deallocate_a(projections)
2563 safe_deallocate_a(nex_kpt)
2575 class(
mesh_t),
intent(in) :: mesh
2578 complex(real64),
intent(inout) :: projections(1:st%nst, gs_st%st_start:gs_st%nst, 1:st%nik)
2580 integer :: uist, ist, ik
2581 complex(real64),
allocatable :: psi(:, :), gspsi(:, :)
2584 safe_allocate(psi(1:mesh%np, 1:st%d%dim))
2585 safe_allocate(gspsi(1:mesh%np, 1:st%d%dim))
2587 projections(:,:,:) =
m_zero
2589 do ik = st%d%kpt%start, st%d%kpt%end
2590 do ist = st%st_start, st%st_end
2592 do uist = gs_st%st_start, gs_st%nst
2594 projections(ist, uist, ik) =
zmf_dotp(mesh, st%d%dim, psi, gspsi, reduce = .false.)
2599 safe_deallocate_a(psi)
2600 safe_deallocate_a(gspsi)
2609 class(
mesh_t),
intent(in) :: mesh
2614 integer,
intent(in) :: iter
2616 complex(real64),
allocatable :: proj(:,:), psi(:,:,:), gs_psi(:,:,:), temp_state(:,:)
2617 character(len=80) :: filename1, filename2
2618 integer :: ik,ist, jst, file, idim, nk_proj
2622 write(filename1,
'(I10)') iter
2623 filename1 =
'td.general/projections_iter_'//trim(adjustl(filename1))
2626 safe_allocate(proj(1:gs_st%nst, 1:gs_st%nst))
2627 safe_allocate(psi(1:gs_st%nst,1:gs_st%d%dim,1:mesh%np))
2628 safe_allocate(gs_psi(1:gs_st%nst,1:gs_st%d%dim,1:mesh%np))
2629 safe_allocate(temp_state(1:mesh%np,1:gs_st%d%dim))
2635 nk_proj = kpoints%nik_skip
2637 do ik = kpoints%reduced%npoints-nk_proj+1, kpoints%reduced%npoints
2639 psi(1:gs_st%nst, 1:gs_st%d%dim, 1:mesh%np)=
m_zero
2640 gs_psi(1:gs_st%nst, 1:gs_st%d%dim, 1:mesh%np)=
m_zero
2643 write(filename2,
'(I10)') ik
2644 filename2 = trim(adjustl(filename1))//
'_ik_'//trim(adjustl(filename2))
2645 file =
io_open(filename2, namespace, action=
'write')
2648 do ist=gs_st%st_start,gs_st%st_end
2651 do idim = 1,gs_st%d%dim
2652 psi(ist,idim,1:mesh%np) = temp_state(1:mesh%np,idim)
2655 do idim = 1,gs_st%d%dim
2656 gs_psi(ist,idim,1:mesh%np) = temp_state(1:mesh%np,idim)
2665 assert(mesh%np_global*gs_st%d%dim < huge(0_int32))
2666 proj(1:gs_st%nst, 1:gs_st%nst) =
m_zero
2671 i8_to_i4(mesh%np_global*gs_st%d%dim), &
2672 cmplx(mesh%volume_element,
m_zero, real64) , &
2674 ubound(psi, dim = 1), &
2676 ubound(gs_psi, dim = 1), &
2679 ubound(proj, dim = 1))
2683 do ist = 1, gs_st%nst
2684 do jst = 1, gs_st%nst
2685 write(file,
'(I3,1x,I3,1x,e13.6,1x,e13.6,2x)') ist, jst, proj(ist,jst)
2693 safe_deallocate_a(proj)
2694 safe_deallocate_a(psi)
2695 safe_deallocate_a(gs_psi)
2696 safe_deallocate_a(temp_state)
2702 subroutine td_write_floquet(namespace, space, hm, ext_partners, mesh, st, iter)
2703 type(namespace_t),
intent(in) :: namespace
2704 class(space_t),
intent(in) :: space
2705 type(hamiltonian_elec_t),
intent(inout) :: hm
2706 type(partner_list_t),
intent(in) :: ext_partners
2707 class(mesh_t),
intent(in) :: mesh
2708 type(states_elec_t),
intent(inout) :: st
2709 integer,
intent(in) :: iter
2711 complex(real64),
allocatable :: hmss(:,:), psi(:,:,:), hpsi(:,:,:), temp_state1(:,:)
2712 complex(real64),
allocatable :: HFloquet(:,:,:), HFloq_eff(:,:), temp(:,:)
2713 real(real64),
allocatable :: eigenval(:), bands(:,:)
2714 character(len=80) :: filename
2715 integer :: it, nT, ik, ist, in, im, file, idim, nik, ik_count
2716 integer :: Forder, Fdim, m0, n0, n1, nst, ii, jj, lim_nst
2717 logical :: downfolding
2718 type(states_elec_t) :: hm_st
2720 real(real64) :: dt, Tcycle, omega
2724 downfolding = .false.
2727 if (.not. iter == 0)
then
2735 assert(mesh%np == mesh%np_global)
2738 call states_elec_copy(hm_st, st)
2749 call parse_variable(namespace,
'TDFloquetFrequency', m_zero, omega, units_inp%energy)
2750 call messages_print_var_value(
'Frequency used for Floquet analysis', omega, namespace=namespace)
2751 if (abs(omega) <= m_epsilon)
then
2752 message(1) =
"Please give a non-zero value for TDFloquetFrequency"
2753 call messages_fatal(1, namespace=namespace)
2757 tcycle = m_two * m_pi / omega
2767 call parse_variable(namespace,
'TDFloquetSample',20 ,nt)
2768 call messages_print_var_value(
'Number of Floquet time-sampling points', nt, namespace=namespace)
2769 dt = tcycle/real(nt, real64)
2778 call parse_variable(namespace,
'TDFloquetDimension',-1,forder)
2779 if (forder .ge. 0)
then
2780 call messages_print_var_value(
'Order of multiphoton Floquet-Hamiltonian', forder, namespace=namespace)
2782 fdim = 2 * forder + 1
2784 message(1) =
'Floquet-Hamiltonian is downfolded'
2785 call messages_info(1, namespace=namespace)
2786 downfolding = .
true.
2791 dt = tcycle/real(nt, real64)
2794 nik = hm%kpoints%nik_skip
2796 safe_allocate(hmss(1:nst,1:nst))
2797 safe_allocate( psi(1:nst,1:st%d%dim,1:mesh%np))
2798 safe_allocate(hpsi(1:nst,1:st%d%dim,1:mesh%np))
2799 safe_allocate(temp_state1(1:mesh%np,1:st%d%dim))
2807 safe_allocate(hfloquet(1:nik,1:nst*fdim, 1:nst*fdim))
2808 hfloquet(1:nik,1:nst*fdim, 1:nst*fdim) = m_zero
2813 call hm%update(mesh, namespace, space, ext_partners, time=tcycle+it*dt)
2815 call zhamiltonian_elec_apply_all(hm, namespace, mesh, st, hm_st)
2820 do ik = hm%kpoints%reduced%npoints-nik+1, hm%kpoints%reduced%npoints
2821 ik_count = ik_count + 1
2823 psi(1:nst, 1:st%d%dim, 1:mesh%np)= m_zero
2824 hpsi(1:nst, 1:st%d%dim, 1:mesh%np)= m_zero
2826 do ist = st%st_start, st%st_end
2827 if (state_kpt_is_local(st, ist, ik))
then
2828 call states_elec_get_state(st, mesh, ist, ik,temp_state1)
2829 do idim = 1, st%d%dim
2830 psi(ist, idim, 1:mesh%np) = temp_state1(1:mesh%np,idim)
2832 call states_elec_get_state(hm_st, mesh, ist, ik,temp_state1)
2833 do idim = 1, st%d%dim
2834 hpsi(ist, idim,1:mesh%np) = temp_state1(1:mesh%np,idim)
2838 call comm_allreduce(mpi_world, psi)
2839 call comm_allreduce(mpi_world, hpsi)
2840 assert(mesh%np_global*st%d%dim < huge(0_int32))
2841 hmss(1:nst,1:nst) = m_zero
2846 i8_to_i4(mesh%np_global*st%d%dim), &
2847 cmplx(mesh%volume_element, m_zero, real64) , &
2849 ubound(hpsi, dim = 1), &
2851 ubound(psi, dim = 1), &
2854 ubound(hmss, dim = 1))
2856 hmss(1:nst,1:nst) = conjg(hmss(1:nst,1:nst))
2859 do in = -forder, forder
2860 do im = -forder, forder
2861 ii = (in+forder) * nst
2862 jj = (im+forder) * nst
2863 hfloquet(ik_count, ii+1:ii+nst, jj+1:jj+nst) = &
2864 hfloquet(ik_count, ii+1:ii+nst, jj+1:jj+nst) + hmss(1:nst, 1:nst) *
exp(-(in-im)*m_zi*omega*it*dt)
2868 hfloquet(ik_count, ii+ist, ii+ist) = hfloquet(ik_count, ii+ist, ii+ist) + in*omega
2877 hfloquet(:,:,:) = m_one/nt*hfloquet(:,:,:)
2880 if (downfolding)
then
2882 safe_allocate(hfloq_eff(1:nst,1:nst))
2883 safe_allocate(eigenval(1:nst))
2884 safe_allocate(bands(1:nik,1:nst))
2886 hfloq_eff(1:nst,1:nst) = m_zero
2892 hfloq_eff(1:nst, 1:nst) = hfloquet(ik, n0+1:n0+nst, m0+1:m0+nst) + &
2893 m_one/omega*(matmul(hfloquet(ik, 1:nst, m0+1:m0+nst), hfloquet(ik, n1+1:n1+nst, m0+1:m0+nst))- &
2894 matmul(hfloquet(ik, n1+1:n1+nst, m0+1:m0+nst), hfloquet(ik, 1:nst, m0+1:m0+nst)))
2896 call lalg_eigensolve(nst, hfloq_eff, eigenval)
2897 bands(ik,1:nst) = eigenval(1:nst)
2899 safe_deallocate_a(hfloq_eff)
2902 safe_allocate(eigenval(1:nst*fdim))
2903 safe_allocate(bands(1:nik,1:nst*fdim))
2904 safe_allocate(temp(1:nst*fdim, 1:nst*fdim))
2907 temp(1:nst*fdim, 1:nst*fdim) = hfloquet(ik, 1:nst*fdim, 1:nst*fdim)
2908 call lalg_eigensolve(nst*fdim, temp, eigenval)
2909 bands(ik, 1:nst*fdim) = eigenval(1:nst*fdim)
2914 if (downfolding)
then
2916 filename =
"downfolded_floquet_bands"
2919 filename =
"floquet_bands"
2922 if (mpi_world%rank == 0)
then
2924 file = io_open(filename, namespace, action =
'write')
2927 write(file,
'(e13.6, 1x)',advance=
'no') bands(ik,ist)
2934 if (.not. downfolding)
then
2937 bands(1:nik, 1:nst*fdim) = m_zero
2939 temp(1:nst*fdim,1:nst*fdim) = m_zero
2942 temp(ii+1:ii+nst, ii+1:ii+nst) = hfloquet(ik, ii+1:ii+nst, ii+1:ii+nst)
2944 call lalg_eigensolve(nst*fdim, temp, eigenval)
2945 bands(ik, 1:nst*fdim) = eigenval(1:nst*fdim)
2948 if (mpi_world%rank == 0)
then
2949 filename =
'trivial_floquet_bands'
2950 file = io_open(filename, namespace, action =
'write')
2953 write(file,
'(e13.6, 1x)', advance=
'no') bands(ik,ist)
2962 call hm%update(mesh, namespace, space, ext_partners, time=m_zero)
2964 safe_deallocate_a(hmss)
2965 safe_deallocate_a(psi)
2966 safe_deallocate_a(hpsi)
2967 safe_deallocate_a(temp_state1)
2968 safe_deallocate_a(hfloquet)
2969 safe_deallocate_a(eigenval)
2970 safe_deallocate_a(bands)
2971 safe_deallocate_a(temp)
2979 type(c_ptr),
intent(inout) :: out_total_current
2980 class(space_t),
intent(in) :: space
2981 class(mesh_t),
intent(in) :: mesh
2982 type(states_elec_t),
intent(in) :: st
2983 integer,
intent(in) :: iter
2985 integer :: idir, ispin
2986 character(len=50) :: aux
2987 real(real64) :: total_current(space%dim), abs_current(space%dim)
2991 if (mpi_grp_is_root(mpi_world) .and. iter == 0)
then
2992 call td_write_print_header_init(out_total_current)
2995 call write_iter_header_start(out_total_current)
2997 do idir = 1, space%dim
2998 write(aux,
'(a2,a1,a1)')
'I(', index2axis(idir),
')'
2999 call write_iter_header(out_total_current, aux)
3002 do idir = 1, space%dim
3003 write(aux,
'(a10,a1,a1)')
'IntAbs(j)(', index2axis(idir),
')'
3004 call write_iter_header(out_total_current, aux)
3007 do ispin = 1, st%d%nspin
3008 do idir = 1, space%dim
3009 write(aux,
'(a4,i1,a1,a1,a1)')
'I-sp', ispin,
'(', index2axis(idir),
')'
3010 call write_iter_header(out_total_current, aux)
3014 call write_iter_nl(out_total_current)
3016 call td_write_print_header_end(out_total_current)
3019 assert(
allocated(st%current))
3021 if (mpi_grp_is_root(mpi_world))
then
3022 call write_iter_start(out_total_current)
3025 total_current = 0.0_real64
3026 do idir = 1, space%dim
3027 do ispin = 1, st%d%spin_channels
3028 total_current(idir) = total_current(idir) + dmf_integrate(mesh, st%current(:, idir, ispin), reduce = .false.)
3030 total_current(idir) = units_from_atomic(units_out%length/units_out%time, total_current(idir))
3032 call mesh%allreduce(total_current, dim = space%dim)
3034 abs_current = 0.0_real64
3035 do idir = 1, space%dim
3036 do ispin = 1, st%d%spin_channels
3037 abs_current(idir) = abs_current(idir) + dmf_integrate(mesh, abs(st%current(:, idir, ispin)), reduce = .false.)
3039 abs_current(idir) = units_from_atomic(units_out%length/units_out%time, abs_current(idir))
3041 call mesh%allreduce(abs_current, dim = space%dim)
3043 if (mpi_grp_is_root(mpi_world))
then
3044 call write_iter_double(out_total_current, total_current, space%dim)
3045 call write_iter_double(out_total_current, abs_current, space%dim)
3048 do ispin = 1, st%d%nspin
3049 total_current = units_from_atomic(units_out%length/units_out%time, dmf_integrate(mesh, space%dim, st%current(:, :, ispin)))
3051 if (mpi_grp_is_root(mpi_world))
then
3052 call write_iter_double(out_total_current, total_current, space%dim)
3056 if (mpi_grp_is_root(mpi_world))
then
3057 call write_iter_nl(out_total_current)
3066 type(c_ptr),
intent(inout) :: write_obj
3067 class(space_t),
intent(in) :: space
3068 type(hamiltonian_elec_t),
intent(inout) :: hm
3069 type(grid_t),
intent(in) :: gr
3070 type(states_elec_t),
intent(in) :: st
3071 integer,
intent(in) :: iter
3073 integer :: idir, ispin
3074 character(len=50) :: aux
3075 real(real64),
allocatable :: heat_current(:, :, :)
3076 real(real64) :: total_current(space%dim)
3080 if (mpi_grp_is_root(mpi_world) .and. iter == 0)
then
3081 call td_write_print_header_init(write_obj)
3084 call write_iter_header_start(write_obj)
3086 do idir = 1, space%dim
3087 write(aux,
'(a2,i1,a1)')
'Jh(', idir,
')'
3088 call write_iter_header(write_obj, aux)
3091 call write_iter_nl(write_obj)
3093 call td_write_print_header_end(write_obj)
3096 safe_allocate(heat_current(1:gr%np, 1:space%dim, 1:st%d%nspin))
3098 call current_heat_calculate(space, gr%der, hm, st, heat_current)
3100 if (mpi_grp_is_root(mpi_world))
call write_iter_start(write_obj)
3102 total_current = 0.0_real64
3103 do idir = 1, space%dim
3104 do ispin = 1, st%d%spin_channels
3105 total_current(idir) = total_current(idir) + dmf_integrate(gr, heat_current(:, idir, ispin))
3107 total_current(idir) = units_from_atomic(units_out%energy*units_out%length/units_out%time, total_current(idir))
3110 safe_deallocate_a(heat_current)
3112 if (mpi_grp_is_root(mpi_world))
call write_iter_double(write_obj, total_current, space%dim)
3114 if (mpi_grp_is_root(mpi_world))
call write_iter_nl(write_obj)
3122 type(c_ptr),
intent(inout) :: out_partial_charges
3123 class(mesh_t),
intent(in) :: mesh
3124 type(states_elec_t),
intent(in) :: st
3125 type(ions_t),
intent(in) :: ions
3126 integer,
intent(in) :: iter
3129 character(len=50) :: aux
3130 real(real64),
allocatable :: hirshfeld_charges(:)
3134 safe_allocate(hirshfeld_charges(1:ions%natoms))
3136 call partial_charges_calculate(mesh, st, ions, hirshfeld_charges)
3138 if (mpi_grp_is_root(mpi_world))
then
3142 call td_write_print_header_init(out_partial_charges)
3145 call write_iter_header_start(out_partial_charges)
3147 do idir = 1, ions%natoms
3148 write(aux,
'(a13,i3,a1)')
'hirshfeld(atom=', idir,
')'
3149 call write_iter_header(out_partial_charges, aux)
3152 call write_iter_nl(out_partial_charges)
3154 call td_write_print_header_end(out_partial_charges)
3157 call write_iter_start(out_partial_charges)
3159 call write_iter_double(out_partial_charges, hirshfeld_charges, ions%natoms)
3161 call write_iter_nl(out_partial_charges)
3164 safe_deallocate_a(hirshfeld_charges)
3170 subroutine td_write_q(out_q, space, ks, iter)
3171 type(c_ptr),
intent(inout) :: out_q
3172 class(space_t),
intent(in) :: space
3173 type(v_ks_t),
intent(in) :: ks
3174 integer,
intent(in) :: iter
3177 character(len=50) :: aux
3181 if (mpi_grp_is_root(mpi_world))
then
3183 call td_write_print_header_init(out_q)
3184 call write_iter_header_start(out_q)
3185 do ii = 1, ks%pt%nmodes
3186 write(aux,
'(a1,i3,a3)')
'q', ii,
'(t)'
3187 call write_iter_header(out_q, aux)
3189 do ii = 1, ks%pt%nmodes
3190 write(aux,
'(a1,i3,a3)')
'p', ii,
'(t)'
3191 call write_iter_header(out_q, aux)
3193 do ii = 1, space%dim
3194 write(aux,
'(a3,i3,a3)')
'f_pt', ii,
'(t)'
3195 call write_iter_header(out_q, aux)
3197 call write_iter_nl(out_q)
3198 call td_write_print_header_end(out_q)
3201 call write_iter_start(out_q)
3202 call write_iter_double(out_q, ks%pt_mx%pt_q, ks%pt%nmodes)
3203 call write_iter_double(out_q, ks%pt_mx%pt_p, ks%pt%nmodes)
3204 call write_iter_double(out_q, ks%pt_mx%fmf, space%dim)
3205 call write_iter_nl(out_q)
3214 type(c_ptr),
intent(inout) :: out_mxll
3215 class(space_t),
intent(in) :: space
3216 type(hamiltonian_elec_t),
intent(in) :: hm
3217 real(real64),
intent(in) :: dt
3218 integer,
intent(in) :: iter
3221 real(real64) :: field(space%dim)
3222 character(len=80) :: aux
3223 character(len=1) :: field_char
3227 if (.not. mpi_grp_is_root(mpi_world))
then
3233 call td_write_print_header_init(out_mxll)
3235 write(aux,
'(a7,e20.12,3a)')
'# dt = ', units_from_atomic(units_out%time, dt), &
3236 " [", trim(units_abbrev(units_out%time)),
"]"
3237 call write_iter_string(out_mxll, aux)
3238 call write_iter_nl(out_mxll)
3240 call write_iter_header_start(out_mxll)
3241 select case (hm%mxll%coupling_mode)
3242 case (length_gauge_dipole, multipolar_expansion)
3243 if (hm%mxll%add_electric_dip) field_char =
'E'
3244 if (hm%mxll%add_magnetic_dip) field_char =
'B'
3245 do idir = 1, space%dim
3246 write(aux,
'(a,i1,a)') field_char //
'(', idir,
')'
3247 call write_iter_header(out_mxll, aux)
3249 case (velocity_gauge_dipole)
3250 do idir = 1, space%dim
3251 write(aux,
'(a,i1,a)')
'A(', idir,
')'
3252 call write_iter_header(out_mxll, aux)
3255 call write_iter_nl(out_mxll)
3257 call write_iter_string(out_mxll,
'#[Iter n.]')
3258 call write_iter_header(out_mxll,
'[' // trim(units_abbrev(units_out%time)) //
']')
3262 select case (hm%mxll%coupling_mode)
3263 case (length_gauge_dipole, multipolar_expansion)
3264 if (hm%mxll%add_electric_dip) aux =
'[' // trim(units_abbrev(units_out%force)) //
']'
3265 if (hm%mxll%add_magnetic_dip) aux =
'[' // trim(units_abbrev(unit_one/units_out%length**2)) //
']'
3266 do idir = 1, space%dim
3267 call write_iter_header(out_mxll, aux)
3269 case (velocity_gauge_dipole)
3270 aux =
'[' // trim(units_abbrev(units_out%energy)) //
']'
3271 do idir = 1, space%dim
3272 call write_iter_header(out_mxll, aux)
3275 call write_iter_nl(out_mxll)
3276 call td_write_print_header_end(out_mxll)
3279 call write_iter_start(out_mxll)
3282 select case (hm%mxll%coupling_mode)
3283 case (length_gauge_dipole, multipolar_expansion)
3284 if (hm%mxll%add_electric_dip) field = units_from_atomic(units_out%force, hm%mxll%e_field_dip)
3285 if (hm%mxll%add_magnetic_dip) field = units_from_atomic(unit_one/units_out%length**2, hm%mxll%b_field_dip)
3286 call write_iter_double(out_mxll, field, space%dim)
3287 case (velocity_gauge_dipole)
3288 field = units_from_atomic(units_out%energy, hm%mxll%vec_pot_dip)
3289 call write_iter_double(out_mxll, field, space%dim)
3291 call write_iter_nl(out_mxll)
3299 type(c_ptr),
intent(inout) :: out_coords
3300 type(lda_u_t),
intent(in) :: lda_u
3301 integer,
intent(in) :: iter
3304 character(len=50) :: aux
3306 if (.not. mpi_grp_is_root(mpi_world))
return
3311 call td_write_print_header_init(out_coords)
3314 call write_iter_header_start(out_coords)
3316 do ios = 1, lda_u%norbsets
3317 write(aux,
'(a2,i3,a1)')
'Ueff(', ios,
')'
3318 call write_iter_header(out_coords, aux)
3321 do ios = 1, lda_u%norbsets
3322 write(aux,
'(a2,i3,a1)')
'U(', ios,
')'
3323 call write_iter_header(out_coords, aux)
3326 do ios = 1, lda_u%norbsets
3327 write(aux,
'(a2,i3,a1)')
'J(', ios,
')'
3328 call write_iter_header(out_coords, aux)
3331 if (lda_u%intersite)
then
3332 do ios = 1, lda_u%norbsets
3333 do inn = 1, lda_u%orbsets(ios)%nneighbors
3334 write(aux,
'(a2,i3,a1,i3,a1)')
'V(', ios,
'-', inn,
')'
3335 call write_iter_header(out_coords, aux)
3341 call write_iter_nl(out_coords)
3344 call write_iter_string(out_coords,
'#[Iter n.]')
3345 call write_iter_header(out_coords,
'[' // trim(units_abbrev(units_out%time)) //
']')
3346 call write_iter_string(out_coords, &
3347 'Effective U ' // trim(units_abbrev(units_out%energy)) // &
3348 ', U in '// trim(units_abbrev(units_out%energy)) // &
3349 ', J in ' // trim(units_abbrev(units_out%energy)))
3350 call write_iter_nl(out_coords)
3352 call td_write_print_header_end(out_coords)
3355 call write_iter_start(out_coords)
3357 do ios = 1, lda_u%norbsets
3358 call write_iter_double(out_coords, units_from_atomic(units_out%energy, &
3359 lda_u%orbsets(ios)%Ueff), 1)
3362 do ios = 1, lda_u%norbsets
3363 call write_iter_double(out_coords, units_from_atomic(units_out%energy, &
3364 lda_u%orbsets(ios)%Ubar), 1)
3367 do ios = 1, lda_u%norbsets
3368 call write_iter_double(out_coords, units_from_atomic(units_out%energy, &
3369 lda_u%orbsets(ios)%Jbar), 1)
3372 if (lda_u%intersite)
then
3373 do ios = 1, lda_u%norbsets
3374 do inn = 1, lda_u%orbsets(ios)%nneighbors
3375 call write_iter_double(out_coords, units_from_atomic(units_out%energy, &
3376 lda_u%orbsets(ios)%V_ij(inn,0)), 1)
3381 call write_iter_nl(out_coords)
3388 type(c_ptr),
intent(inout) :: file_handle
3389 type(grid_t),
intent(in) :: grid
3390 type(kpoints_t),
intent(in) :: kpoints
3391 type(states_elec_t),
intent(in) :: st
3392 integer,
intent(in) :: iter
3394 integer :: ik_ispin, ist
3395 character(len=7) :: nkpt_str, nst_str
3396 character(len=7) :: ik_str, ist_str
3397 real(real64),
allocatable :: norm_ks(:, :)
3398 real(real64) :: n_electrons
3402 safe_allocate(norm_ks(1:st%nst, 1:st%nik))
3403 call states_elec_calc_norms(grid, kpoints, st, norm_ks)
3405 if (mpi_grp_is_root(mpi_world))
then
3408 call td_write_print_header_init(file_handle)
3411 write(nkpt_str,
'(I7)') st%nik
3412 write(nst_str,
'(I7)') st%nst
3413 call write_iter_string(file_handle,
'# Dimensions. (nstates, nkpt * nspin):')
3414 call write_iter_string(file_handle, trim(adjustl(nst_str)) //
' ' // trim(adjustl(nkpt_str)))
3415 call write_iter_nl(file_handle)
3418 call write_iter_string(file_handle,
'# Norm ordering: (istate, ikpoint_spin)')
3419 call write_iter_nl(file_handle)
3422 call write_iter_header_start(file_handle)
3423 call write_iter_header(file_handle,
'N_electrons')
3424 do ik_ispin = 1, st%nik
3426 write(ik_str,
'(I7)') ik_ispin
3427 write(ist_str,
'(I7)') ist
3428 call write_iter_header(file_handle, &
3429 'Norm (' // trim(ist_str) //
',' // trim(ik_str) //
')')
3432 call write_iter_nl(file_handle)
3433 call td_write_print_header_end(file_handle)
3436 n_electrons = sum(st%occ * norm_ks**2)
3439 call write_iter_start(file_handle)
3440 call write_iter_double(file_handle, n_electrons, 1)
3441 do ik_ispin = 1, st%nik
3442 call write_iter_double(file_handle, norm_ks(:, ik_ispin),
size(norm_ks, 1))
3444 call write_iter_nl(file_handle)
3448 safe_deallocate_a(norm_ks)
3457 type(c_ptr),
intent(inout) :: file_handle
3458 type(ions_t),
intent(in) :: ions
3459 integer,
intent(in) :: iter
3462 real(real64) :: tmp(3)
3464 if (.not. mpi_grp_is_root(mpi_world))
return
3468 assert(ions%space%dim == 3)
3471 call td_write_print_header_init(file_handle)
3474 call write_iter_header_start(file_handle)
3476 call write_iter_string(file_handle,
'# Iter, a, b, c, volume, alpha, beta, gamma, ' &
3477 //
'a_x, a_y, a_z, b_x, b_y, b_z, c_x, c_y, c_z')
3480 call write_iter_string(file_handle,
'#[Iter n.]')
3481 call write_iter_header(file_handle,
'[' // trim(units_abbrev(units_out%time)) //
']')
3482 call write_iter_string(file_handle, &
3483 'Lengths in ' // trim(units_abbrev(units_out%length)) // &
3484 ', Volume in ' // trim(units_abbrev(units_out%length**3)) // &
3485 ', Angles in degree, Lattice vectors in '// trim(units_abbrev(units_out%length)))
3486 call write_iter_nl(file_handle)
3488 call td_write_print_header_end(file_handle)
3491 call write_iter_start(file_handle)
3495 tmp(idir) = units_from_atomic(units_out%length, norm2(ions%latt%rlattice(1:3, idir)))
3497 call write_iter_double(file_handle, tmp, 3)
3500 tmp(1) = units_from_atomic(units_out%length**3, ions%latt%rcell_volume)
3501 call write_iter_double(file_handle, tmp(1), 1)
3504 call write_iter_double(file_handle, ions%latt%alpha, 1)
3505 call write_iter_double(file_handle, ions%latt%beta, 1)
3506 call write_iter_double(file_handle, ions%latt%gamma, 1)
3510 tmp(1:3) = units_from_atomic(units_out%length, ions%latt%rlattice(:, idir))
3511 call write_iter_double(file_handle, tmp, 3)
3513 call write_iter_nl(file_handle)
3522 type(namespace_t),
intent(in) :: namespace
3523 integer,
intent(in) :: iter
3524 real(real64),
intent(in) :: dt
3526 integer :: default, flags, iout, first
3581 call parse_variable(namespace,
'MaxwellTDOutput', default, flags)
3583 if (.not. varinfo_valid_option(
'MaxwellTDOutput', flags, is_flag = .
true.))
then
3584 call messages_input_error(namespace,
'MaxwellTDOutput')
3588 writ%out(iout)%write = (iand(flags, 2**(iout - 1)) /= 0)
3589 if (writ%out(iout)%write)
then
3590 writ%out(iout + 1)%write = .
true.
3591 writ%out(iout + 2)%write = .
true.
3596 writ%out(iout)%write = (iand(flags, 2**(iout - 1)) /= 0)
3605 call io_mkdir(
'td.general', namespace)
3610 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/total_e_field_x", namespace)))
3612 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/total_e_field_y", namespace)))
3614 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/total_e_field_z", namespace)))
3620 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/total_b_field_x", namespace)))
3622 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/total_b_field_y", namespace)))
3624 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/total_b_field_z", namespace)))
3630 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/longitudinal_e_field_x", namespace)))
3632 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/longitudinal_e_field_y", namespace)))
3634 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/longitudinal_e_field_z", namespace)))
3640 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/longitudinal_b_field_x", namespace)))
3642 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/longitudinal_b_field_y", namespace)))
3644 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/longitudinal_b_field_z", namespace)))
3650 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/transverse_e_field_x", namespace)))
3652 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/transverse_e_field_y", namespace)))
3654 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/transverse_e_field_z", namespace)))
3660 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/transverse_b_field_x", namespace)))
3662 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/transverse_b_field_y", namespace)))
3664 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/transverse_b_field_z", namespace)))
3670 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/maxwell_energy", namespace)))
3675 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/electric_field_surface-x", namespace)))
3680 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/electric_field_surface-y", namespace)))
3685 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/electric_field_surface-z", namespace)))
3690 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/magnetic_field_surface-x", namespace)))
3695 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/magnetic_field_surface-y", namespace)))
3700 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/magnetic_field_surface-z", namespace)))
3716 if (writ%out(iout)%write)
call write_iter_end(writ%out(iout)%handle)
3724 subroutine td_write_mxll_iter(writ, space, gr, st, hm, helmholtz, dt, iter, namespace)
3726 class(space_t),
intent(in) :: space
3727 type(grid_t),
intent(inout) :: gr
3728 type(states_mxll_t),
intent(inout) :: st
3729 type(hamiltonian_mxll_t),
intent(inout) :: hm
3730 type(helmholtz_decomposition_t),
intent(inout) :: helmholtz
3731 real(real64),
intent(in) :: dt
3732 integer,
intent(in) :: iter
3733 type(namespace_t),
intent(in) :: namespace
3738 call profiling_in(
"TD_WRITE_ITER_MAXWELL")
3741 call helmholtz%get_trans_field(namespace, st%rs_state_trans, total_field=st%rs_state)
3742 call get_rs_state_at_point(st%selected_points_rs_state_trans(:,:), st%rs_state_trans, &
3743 st%selected_points_coordinate(:,:), st, gr)
3746 hm%energy%energy_trans = m_zero
3750 call helmholtz%get_long_field(namespace, st%rs_state_long, total_field=st%rs_state)
3751 call get_rs_state_at_point(st%selected_points_rs_state_long(:,:), st%rs_state_long, &
3752 st%selected_points_coordinate(:,:), st, gr)
3755 hm%energy%energy_long = m_zero
3847 call profiling_out(
"TD_WRITE_ITER_MAXWELL")
3856 type(hamiltonian_mxll_t),
intent(in) :: hm
3857 integer,
intent(in) :: iter
3861 integer :: n_columns
3863 if (.not. mpi_grp_is_root(mpi_world))
return
3888 call write_iter_header(
out_maxwell_energy,
'[' // trim(units_abbrev(units_out%time)) //
']')
3890 do ii = 1, n_columns
3891 call write_iter_header(
out_maxwell_energy,
'[' // trim(units_abbrev(units_out%energy)) //
']')
3899 call write_iter_double(
out_maxwell_energy, units_from_atomic(units_out%energy, hm%energy%energy), 1)
3900 call write_iter_double(
out_maxwell_energy, units_from_atomic(units_out%energy, hm%energy%e_energy), 1)
3901 call write_iter_double(
out_maxwell_energy, units_from_atomic(units_out%energy, hm%energy%b_energy), 1)
3903 hm%energy%energy+hm%energy%boundaries), 1)
3904 call write_iter_double(
out_maxwell_energy, units_from_atomic(units_out%energy, hm%energy%boundaries), 1)
3905 call write_iter_double(
out_maxwell_energy, units_from_atomic(units_out%energy, hm%energy%energy_trans), 1)
3906 call write_iter_double(
out_maxwell_energy, units_from_atomic(units_out%energy, hm%energy%energy_long), 1)
3907 call write_iter_double(
out_maxwell_energy, units_from_atomic(units_out%energy, hm%energy%energy_plane_waves), 1)
3916 type(c_ptr),
intent(inout) :: out_field_surf
3917 type(states_mxll_t),
intent(in) :: st
3918 integer,
intent(in) :: dim
3919 integer,
intent(in) :: iter
3923 integer :: n_columns
3925 if (.not. mpi_grp_is_root(mpi_world))
return
3932 call td_write_print_header_init(out_field_surf)
3935 call write_iter_header_start(out_field_surf)
3936 call write_iter_header(out_field_surf,
'- x direction')
3937 call write_iter_header(out_field_surf,
'+ x direction')
3938 call write_iter_header(out_field_surf,
'- y direction')
3939 call write_iter_header(out_field_surf,
'+ y direction')
3940 call write_iter_header(out_field_surf,
'- z direction')
3941 call write_iter_header(out_field_surf,
'+ z direction')
3942 call write_iter_header(out_field_surf,
'- x dir. p. w.')
3943 call write_iter_header(out_field_surf,
'+ x dir. p. w.')
3944 call write_iter_header(out_field_surf,
'- y dir. p. w.')
3945 call write_iter_header(out_field_surf,
'+ y dir. p. w.')
3946 call write_iter_header(out_field_surf,
'- z dir. p. w.')
3947 call write_iter_header(out_field_surf,
'+ z dir. p. w.')
3949 call write_iter_nl(out_field_surf)
3952 call write_iter_string(out_field_surf,
'#[Iter n.]')
3953 call write_iter_header(out_field_surf,
'[' // trim(units_abbrev(units_out%time)) //
']')
3955 do ii = 1, n_columns
3956 call write_iter_header(out_field_surf,
'[' // trim(units_abbrev(units_out%energy/units_out%length)) //
']')
3958 call write_iter_nl(out_field_surf)
3960 call td_write_print_header_end(out_field_surf)
3963 call write_iter_start(out_field_surf)
3964 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
3965 st%electric_field_box_surface(1,1,dim)), 1)
3966 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
3967 st%electric_field_box_surface(2,1,dim)), 1)
3968 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
3969 st%electric_field_box_surface(1,2,dim)), 1)
3970 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
3971 st%electric_field_box_surface(2,2,dim)), 1)
3972 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
3973 st%electric_field_box_surface(1,3,dim)), 1)
3974 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
3975 st%electric_field_box_surface(2,3,dim)), 1)
3976 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
3977 st%electric_field_box_surface_plane_waves(1,1,dim)), 1)
3978 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
3979 st%electric_field_box_surface_plane_waves(2,1,dim)), 1)
3980 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
3981 st%electric_field_box_surface_plane_waves(1,2,dim)), 1)
3982 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
3983 st%electric_field_box_surface_plane_waves(2,2,dim)), 1)
3984 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
3985 st%electric_field_box_surface_plane_waves(1,3,dim)), 1)
3986 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
3987 st%electric_field_box_surface_plane_waves(2,3,dim)), 1)
3988 call write_iter_nl(out_field_surf)
3996 type(c_ptr),
intent(inout) :: out_field_surf
3997 type(states_mxll_t),
intent(in) :: st
3998 integer,
intent(in) :: dim
3999 integer,
intent(in) :: iter
4003 integer :: n_columns
4005 if (.not. mpi_grp_is_root(mpi_world))
return
4012 call td_write_print_header_init(out_field_surf)
4015 call write_iter_header_start(out_field_surf)
4016 call write_iter_header(out_field_surf,
'- x direction')
4017 call write_iter_header(out_field_surf,
'+ x direction')
4018 call write_iter_header(out_field_surf,
'- y direction')
4019 call write_iter_header(out_field_surf,
'+ y direction')
4020 call write_iter_header(out_field_surf,
'- z direction')
4021 call write_iter_header(out_field_surf,
'+ z direction')
4022 call write_iter_header(out_field_surf,
'- x dir. p. w.')
4023 call write_iter_header(out_field_surf,
'+ x dir. p. w.')
4024 call write_iter_header(out_field_surf,
'- y dir. p. w.')
4025 call write_iter_header(out_field_surf,
'+ y dir. p. w.')
4026 call write_iter_header(out_field_surf,
'- z dir. p. w.')
4027 call write_iter_header(out_field_surf,
'+ z dir. p. w.')
4029 call write_iter_nl(out_field_surf)
4032 call write_iter_string(out_field_surf,
'#[Iter n.]')
4033 call write_iter_header(out_field_surf,
'[' // trim(units_abbrev(units_out%time)) //
']')
4035 do ii = 1, n_columns
4036 call write_iter_header(out_field_surf,
'[' // trim(units_abbrev(unit_one/units_out%length**2)) //
']')
4038 call write_iter_nl(out_field_surf)
4040 call td_write_print_header_end(out_field_surf)
4043 call write_iter_start(out_field_surf)
4044 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4045 st%magnetic_field_box_surface(1,1,dim)), 1)
4046 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4047 st%magnetic_field_box_surface(2,1,dim)), 1)
4048 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4049 st%magnetic_field_box_surface(1,2,dim)), 1)
4050 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4051 st%magnetic_field_box_surface(2,2,dim)), 1)
4052 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4053 st%magnetic_field_box_surface(1,3,dim)), 1)
4054 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4055 st%magnetic_field_box_surface(2,3,dim)), 1)
4056 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4057 st%magnetic_field_box_surface_plane_waves(1,1,dim)), 1)
4058 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4059 st%magnetic_field_box_surface_plane_waves(2,1,dim)), 1)
4060 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4061 st%magnetic_field_box_surface_plane_waves(1,2,dim)), 1)
4062 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4063 st%magnetic_field_box_surface_plane_waves(2,2,dim)), 1)
4064 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4065 st%magnetic_field_box_surface_plane_waves(1,3,dim)), 1)
4066 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4067 st%magnetic_field_box_surface_plane_waves(2,3,dim)), 1)
4068 call write_iter_nl(out_field_surf)
4074 subroutine td_write_fields(out_fields, space, st, iter, dt, e_or_b_field, field_type, idir)
4075 type(c_ptr),
intent(inout) :: out_fields
4076 class(space_t),
intent(in) :: space
4077 type(states_mxll_t),
intent(in) :: st
4078 integer,
intent(in) :: iter
4079 real(real64),
intent(in) :: dt
4080 integer,
intent(in) :: e_or_b_field
4081 integer,
intent(in) :: field_type
4082 integer,
intent(in) :: idir
4086 real(real64) :: field(space%dim), selected_field
4087 character(len=80) :: aux
4089 if (.not. mpi_grp_is_root(mpi_world))
return
4094 call td_write_print_header_init(out_fields)
4097 write(aux,
'(a7,e20.12,3a)')
'# dt = ', units_from_atomic(units_out%time, dt), &
4098 " [", trim(units_abbrev(units_out%time)),
"]"
4099 call write_iter_string(out_fields, aux)
4100 call write_iter_nl(out_fields)
4102 call write_iter_header_start(out_fields)
4104 do id = 1, st%selected_points_number
4105 select case (e_or_b_field)
4107 write(aux,
'(a,i1,a)')
'E(', id,
')'
4109 write(aux,
'(a,i1,a)')
'B(', id,
')'
4111 call write_iter_header(out_fields, aux)
4114 call write_iter_nl(out_fields)
4115 call write_iter_string(out_fields,
'#[Iter n.]')
4116 call write_iter_header(out_fields,
' [' // trim(units_abbrev(units_out%time)) //
']')
4121 aux =
' [' // trim(units_abbrev(units_out%force)) //
']'
4122 do id = 1, st%selected_points_number
4123 call write_iter_header(out_fields, aux)
4125 call write_iter_nl(out_fields)
4126 call td_write_print_header_end(out_fields)
4129 call write_iter_start(out_fields)
4131 do id = 1, st%selected_points_number
4132 select case (e_or_b_field)
4135 select case (field_type)
4137 call get_electric_field_vector(st%selected_points_rs_state(:,id), field(1:st%dim))
4139 call get_electric_field_vector(st%selected_points_rs_state_long(:,id), field(1:st%dim))
4141 call get_electric_field_vector(st%selected_points_rs_state_trans(:,id), field(1:st%dim))
4143 selected_field = units_from_atomic(units_out%energy/units_out%length, field(idir))
4146 select case (field_type)
4148 call get_magnetic_field_vector(st%selected_points_rs_state(:,id), st%rs_sign, field(1:st%dim))
4150 call get_magnetic_field_vector(st%selected_points_rs_state_long(:,id), st%rs_sign, field(1:st%dim))
4152 call get_magnetic_field_vector(st%selected_points_rs_state_trans(:,id), st%rs_sign, field(1:st%dim))
4154 selected_field = units_from_atomic(unit_one/units_out%length**2, field(idir))
4156 call write_iter_double(out_fields, selected_field, 1)
4159 call write_iter_nl(out_fields)
4168 type(namespace_t),
intent(in) :: namespace
4169 class(space_t),
intent(in) :: space
4170 type(grid_t),
intent(inout) :: gr
4171 type(states_mxll_t),
intent(inout) :: st
4172 type(hamiltonian_mxll_t),
intent(inout) :: hm
4173 type(helmholtz_decomposition_t),
intent(inout) :: helmholtz
4174 type(output_t),
intent(in) :: outp
4175 integer,
intent(in) :: iter
4176 real(real64),
intent(in) :: time
4178 character(len=256) :: filename
4180 push_sub(td_write_maxwell_free_data)
4181 call profiling_in(
"TD_WRITE_MAXWELL_DATA")
4184 write(filename,
'(a,a,i7.7)') trim(outp%iter_dir),
"td.", iter
4186 call output_mxll(outp, namespace, space, gr, st, hm, helmholtz, time, filename)
4188 call profiling_out(
"TD_WRITE_MAXWELL_DATA")
4189 pop_sub(td_write_maxwell_free_data)
ssize_t ssize_t write(int __fd, const void *__buf, size_t __n) __attribute__((__access__(__read_only__
constant times a vector plus a vector
Copies a vector x, to a vector y.
Sets the iteration number to the C object.
Writes to the corresponding file and adds one to the iteration. Must be called after write_iter_init(...
double exp(double __x) __attribute__((__nothrow__
This module contains interfaces for BLAS routines You should not use these routines directly....
This module implements a calculator for the density and defines related functions.
subroutine, public density_calc(st, gr, density, istin)
Computes the density from the orbitals in st.
This module calculates the derivatives (gradients, Laplacians, etc.) of a function.
integer, parameter, public spinors
integer, parameter, public spin_polarized
subroutine, public excited_states_kill(excited_state)
Kills an excited_state structure.
subroutine, public excited_states_init(excited_state, ground_state, filename, namespace)
Fills in an excited_state structure, by reading a file called "filename". This file describes the "pr...
type(gauge_field_t) function, pointer, public list_get_gauge_field(partners)
logical function, public list_has_lasers(partners)
type(lasers_t) function, pointer, public list_get_lasers(partners)
subroutine, public gauge_field_output_write(this, out_gauge, iter)
real(real64), parameter, public m_two
real(real64), parameter, public m_zero
complex(real64), parameter, public m_z0
real(real64), parameter, public lmm_r_single_atom
Default local magnetic moments sphere radius for an isolated system.
complex(real64), parameter, public m_zi
integer, parameter, public max_output_types
real(real64), parameter, public m_half
real(real64), parameter, public m_one
real(real64), parameter, public m_min_occ
Minimal occupation that is considered to be non-zero.
This module implements the underlying real-space grid.
The Helmholtz decomposition is intended to contain "only mathematical" functions and procedures to co...
This module defines classes and functions for interaction partners.
subroutine, public zio_function_output(how, dir, fname, namespace, space, mesh, ff, unit, ierr, pos, atoms, grp, root)
Top-level IO routine for functions defined on the mesh.
subroutine, public io_function_read_what_how_when(namespace, space, what, how, output_interval, what_tag_in, how_tag_in, output_interval_tag_in, ignore_error)
subroutine, public io_close(iunit, grp)
character(len=max_path_len) function, public io_workpath(path, namespace)
subroutine, public io_rm(fname, namespace)
subroutine, public io_mkdir(fname, namespace, parents)
integer function, public io_open(file, namespace, action, status, form, position, die, recl, grp)
real(real64) function, public ion_dynamics_temperature(ions)
This function returns the ionic temperature in energy units.
integer, parameter, public qkickmode_cos
integer, parameter, public qkickmode_none
integer, parameter, public qkickmode_sin
subroutine, public kick_function_get(space, mesh, kick, kick_function, iq, to_interpolate)
subroutine, public kick_write(kick, iunit, out)
integer, parameter, public qkickmode_bessel
subroutine, public lasers_nondipole_laser_field_step(this, field, time)
Retrieves the NDSFA vector_potential correction. The nondipole field is obtained for consecutive time...
subroutine, public lasers_set_nondipole_parameters(this, ndfield, nd_integration_time)
Set parameters for nondipole SFA calculation.
logical function, public lasers_with_nondipole_field(lasers)
Check if a nondipole SFA correction should be computed for the given laser.
integer, parameter, public e_field_electric
integer, parameter, public e_field_vector_potential
integer, parameter, public e_field_scalar_potential
integer pure elemental function, public laser_kind(laser)
subroutine, public laser_field(laser, field, time)
Retrieves the value of either the electric or the magnetic field. If the laser is given by a scalar p...
integer, parameter, public e_field_magnetic
integer, parameter, public dft_u_none
integer, parameter, public dft_u_acbn0
subroutine, public magnetic_local_moments(mesh, st, ions, boundaries, rho, rr, lmm)
subroutine, public magnetic_moment(mesh, st, rho, mm)
subroutine, public magnetic_total_magnetization(mesh, st, qq, trans_mag)
This module is intended to contain "only mathematical" functions and procedures.
subroutine, public ylmr_real(xx, li, mi, ylm)
This is a Numerical Recipes-based subroutine computes real spherical harmonics ylm at position (x,...
This module defines functions over batches of mesh functions.
This module defines various routines, operating on mesh functions.
subroutine, public dmf_multipoles(mesh, ff, lmax, multipole, mask)
This routine calculates the multipoles of a function ff.
This module defines the meshes, which are used in Octopus.
subroutine, public messages_not_implemented(feature, namespace)
subroutine, public messages_warning(no_lines, all_nodes, namespace)
subroutine, public messages_obsolete_variable(namespace, name, rep)
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_input_error(namespace, var, details, row, column)
subroutine, public messages_experimental(name, namespace)
subroutine, public modelmb_sym_all_states(space, mesh, st)
This module contains some common usage patterns of MPI routines.
logical function mpi_grp_is_root(grp)
Is the current MPI process of grpcomm, root.
type(mpi_grp_t), public mpi_world
This module handles the communicators for the various parallelization strategies.
integer, parameter, public velocity_gauge_dipole
this module contains the low-level part of the output system
subroutine, public output_modelmb(outp, namespace, space, dir, gr, ions, iter, st)
this module contains the output system
subroutine, public output_all(outp, namespace, space, dir, gr, ions, iter, st, hm, ks)
subroutine, public output_scalar_pot(outp, namespace, space, dir, mesh, ions, ext_partners, time)
integer function, public parse_block(namespace, name, blk, check_varinfo_)
subroutine, public profiling_out(label)
Increment out counter and sum up difference between entry and exit time.
subroutine, public profiling_in(label, exclude)
Increment in counter and save entry time.
integer, parameter, public restart_gs
subroutine, public restart_init(restart, namespace, data_type, type, mc, ierr, mesh, dir, exact)
Initializes a restart object.
integer, parameter, public restart_proj
integer, parameter, public restart_type_load
subroutine, public restart_end(restart)
subroutine, public zstates_elec_matrix(st1, st2, mesh, aa)
subroutine, public zstates_elec_calc_projections(st, gs_st, namespace, mesh, ik, proj, gs_nst)
This routine computes the projection between two set of states.
This module handles spin dimensions of the states and the k-point distribution.
logical function, public state_kpt_is_local(st, ist, ik)
check whether a given state (ist, ik) is on the local node
subroutine, public states_elec_end(st)
finalize the states_elec_t object
subroutine, public states_elec_deallocate_wfns(st)
Deallocates the KS wavefunctions defined within a states_elec_t structure.
subroutine, public states_elec_allocate_wfns(st, mesh, wfs_type, skip, packed)
Allocates the KS wavefunctions defined within a states_elec_t structure.
subroutine, public states_elec_copy(stout, stin, exclude_wfns, exclude_eigenval, special)
make a (selective) copy of a states_elec_t object
subroutine, public states_elec_look(restart, nik, dim, nst, ierr)
Reads the 'states' file in the restart directory, and finds out the nik, dim, and nst contained in it...
This module handles reading and writing restart information for the states_elec_t.
subroutine, public states_elec_load(restart, namespace, space, st, mesh, kpoints, ierr, iter, lr, lowest_missing, label, verbose, skip)
returns in ierr: <0 => Fatal error, or nothing read =0 => read all wavefunctions >0 => could only rea...
subroutine, public td_calc_tacc(namespace, space, gr, ions, ext_partners, st, hm, acc, time)
Electronic acceleration (to calculate harmonic spectrum...) It is calculated as:
subroutine, public td_calc_ionch(mesh, st, ch, Nch)
Multiple ionization probabilities calculated form the KS orbital densities C. Ullrich,...
subroutine, public td_calc_tvel(gr, st, space, kpoints, vel)
Electronic velocity (to calculate harmonic spectrum...) It is calculated as:
subroutine, public td_write_coordinates(out_coords, natoms, space, pos, vel, tot_forces, iter)
subroutine, public td_write_sep_coordinates(out_coords, natoms, space, pos, vel, tot_forces, iter, which)
subroutine, public td_write_print_header_init(out)
subroutine, public td_write_print_header_end(out)
subroutine td_write_magnetic_field_box_surface(out_field_surf, st, dim, iter)
integer, parameter, public out_total_current
integer, parameter maxwell_b_field
integer, parameter, public out_maxwell_max
subroutine td_write_proj(out_proj, space, mesh, ions, st, gs_st, kick, iter)
integer, parameter, public out_q
integer, parameter, public out_mxll_field
subroutine calc_projections(mesh, st, gs_st, projections)
This subroutine calculates:
integer, parameter out_b_field_surface_y
subroutine td_write_ionch(out_ionch, mesh, st, iter)
integer, parameter, public out_tot_m
integer, parameter, public out_norm_ks
integer, parameter out_maxwell_trans_b_field
integer, parameter, public out_cell_parameters
subroutine td_write_multipole_r(out_multip, space, mesh, ions, st, lmax, kick, rho, iter, mpi_grp)
Write multipoles to the corresponding file.
integer, parameter, public out_proj
integer, parameter, public out_partial_charges
integer, parameter, public out_separate_coords
subroutine td_write_total_current(out_total_current, space, mesh, st, iter)
subroutine, public td_write_output(namespace, space, gr, st, hm, ks, outp, ions, ext_partners, iter, dt)
subroutine td_write_effective_u(out_coords, lda_u, iter)
integer, parameter maxwell_trans_field
subroutine td_write_acc(out_acc, namespace, space, gr, ions, st, hm, ext_partners, dt, iter)
subroutine, public td_write_mxll_init(writ, namespace, iter, dt)
subroutine, public td_write_mxll_end(writ)
subroutine td_write_mxll_field(out_mxll, space, hm, dt, iter)
integer, parameter out_b_field_surface_x
integer, parameter out_maxwell_long_e_field
integer, parameter, public out_kp_proj
integer, parameter, public out_magnets
subroutine td_write_multipole(out_multip, space, gr, ions, st, lmax, kick, iter)
Top-level routine that write multipoles to file, or files depending on whether a state-resolved outpu...
subroutine td_write_electric_field_box_surface(out_field_surf, st, dim, iter)
integer, parameter out_e_field_surface_y
integer, parameter, public out_angular
subroutine td_write_populations(out_populations, namespace, space, mesh, st, writ, dt, iter)
integer, parameter, public out_max
integer, parameter out_maxwell_long_b_field
integer, parameter, public out_energy
integer, parameter, public out_spin
subroutine td_write_ftchd(out_ftchd, space, mesh, st, kick, iter)
subroutine td_write_partial_charges(out_partial_charges, mesh, st, ions, iter)
integer, parameter out_dftu_max
For the Maxwell fields we increment in steps of 3 to leave room for x, y, and z output.
subroutine td_write_laser(out_laser, space, lasers, dt, iter)
integer, parameter out_maxwell_total_b_field
integer, parameter, public out_ftchd
integer, parameter, public out_separate_velocity
subroutine td_write_tot_mag(out_magnets, mesh, st, kick, iter)
subroutine td_write_q(out_q, space, ks, iter)
integer, parameter, public out_floquet
integer, parameter, public out_acc
integer, parameter, public out_ion_ch
integer, parameter maxwell_long_field
integer, parameter, public out_n_ex
integer, parameter out_b_field_surface_z
subroutine td_write_proj_kp(mesh, kpoints, st, gs_st, namespace, iter)
integer, parameter, public out_temperature
subroutine td_write_norm_ks_orbitals(file_handle, grid, kpoints, st, iter)
Write the norm of the KS orbitals to file as a function of time step.
subroutine, public td_write_data(writ)
subroutine, public td_write_mxll_free_data(writ, namespace, space, gr, st, hm, helmholtz, outp, iter, time)
subroutine td_write_total_heat_current(write_obj, space, hm, gr, st, iter)
integer, parameter out_e_field_surface_z
integer, parameter maxwell_total_field
integer, parameter, public out_coords
integer, parameter out_maxwell_total_e_field
integer, parameter, public out_laser
integer, parameter, public out_eigs
subroutine td_write_vel(out_vel, gr, st, space, kpoints, iter)
subroutine td_write_floquet(namespace, space, hm, ext_partners, mesh, st, iter)
integer, parameter, public out_total_heat_current
integer, parameter out_e_field_surface_x
subroutine, public td_write_kick(outp, namespace, space, mesh, kick, ions, iter)
subroutine, public td_write_end(writ)
subroutine td_write_angular(out_angular, namespace, space, gr, ions, hm, st, kick, iter)
Computes and outputs the orbital angular momentum defined by.
subroutine td_write_eigs(out_eigs, st, iter)
subroutine, public td_write_iter(writ, namespace, space, outp, gr, st, hm, ions, ext_partners, kick, ks, dt, iter, mc, recalculate_gs)
subroutine td_write_n_ex(out_nex, outp, namespace, mesh, kpoints, st, gs_st, iter)
This routine computes the total number of excited electrons based on projections on the GS orbitals T...
subroutine td_write_fields(out_fields, space, st, iter, dt, e_or_b_field, field_type, idir)
subroutine td_write_spin(out_spin, mesh, st, iter)
integer, parameter, public out_vel
integer, parameter, public out_gauge_field
subroutine td_write_temperature(out_temperature, ions, iter)
integer, parameter maxwell_e_field
integer, parameter, public out_populations
subroutine, public td_write_mxll_iter(writ, space, gr, st, hm, helmholtz, dt, iter, namespace)
subroutine td_write_cell_parameters(file_handle, ions, iter)
Write the cell parameters as a function of time.
subroutine td_write_local_magnetic_moments(out_magnets, gr, st, ions, lmm_r, iter)
subroutine, public td_write_init(writ, namespace, space, outp, gr, st, hm, ions, ext_partners, ks, ions_move, with_gauge_field, kick, iter, max_iter, dt, mc)
Initialize files to write when prograting in time.
integer, parameter out_maxwell_energy
subroutine td_write_energy(out_energy, hm, iter, ke)
subroutine td_write_maxwell_energy(out_maxwell_energy, hm, iter)
integer, parameter, public out_separate_forces
integer, parameter out_maxwell_trans_e_field
type(type_t), public type_cmplx
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
type(unit_t), public unit_kelvin
For converting energies into temperatures.
type(unit_system_t), public units_inp
the units systems for reading and writing
type(unit_t), public unit_one
some special units required for particular quantities
This module is intended to contain simple general-purpose utility functions and procedures.
character pure function, public index2axis(idir)
subroutine, public v_ks_calculate_current(this, calc_cur)
subroutine, public v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, calc_eigenval, time, calc_energy, calc_current, force_semilocal)
Explicit interfaces to C functions, defined in write_iter_low.cc.
Extension of space that contains the knowledge of the spin dimension.
Description of the grid, containing information on derivatives, stencil, and symmetries.
Describes mesh distribution to nodes.
This is defined even when running serial.
Stores all communicators and groups.
The states_elec_t class contains all electronic wave functions.
Time-dependent Write Properties.
subroutine dipole_matrix_elements(dir)