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
2520 if (.not. st%parallel_in_states)
then
2521 do ik = st%d%kpt%start, st%d%kpt%end
2522 do ist = 1, gs_st%nst
2523 if (gs_st%occ(ist, ik) >
m_min_occ) gs_nst = ist
2530 safe_allocate(projections(1:gs_nst, 1:st%nst))
2532 safe_allocate(nex_kpt(1:st%nik))
2534 do ik = st%d%kpt%start, st%d%kpt%end
2535 ikpt = st%d%get_kpoint_index(ik)
2538 weight = st%kweights(ik) * gs_st%occ(ist, ik)/ st%smear%el_per_state
2539 do uist = st%st_start, st%st_end
2540 nex_kpt(ikpt) = nex_kpt(ikpt) - weight * st%occ(uist, ik) * abs(projections(ist, uist))**2
2544 nex_kpt(ikpt) = nex_kpt(ikpt) + sum(st%occ(st%st_start:st%st_end, ik))*
m_half*st%kweights(ik)
2546 nex_kpt(ikpt) = nex_kpt(ikpt) + sum(st%occ(st%st_start:st%st_end, ik))*st%kweights(ik)
2550 if (st%parallel_in_states .or. st%d%kpt%parallel)
then
2562 write(dir,
'(a,a,i7.7)') trim(outp%iter_dir),
"td.", iter
2565 + outp%how(option__output__density_kpt), dir,
"n_excited_el_kpt", namespace, &
2569 safe_deallocate_a(projections)
2570 safe_deallocate_a(nex_kpt)
2582 class(
mesh_t),
intent(in) :: mesh
2585 complex(real64),
intent(inout) :: projections(1:st%nst, gs_st%st_start:gs_st%nst, 1:st%nik)
2587 integer :: uist, ist, ik
2588 complex(real64),
allocatable :: psi(:, :), gspsi(:, :)
2591 safe_allocate(psi(1:mesh%np, 1:st%d%dim))
2592 safe_allocate(gspsi(1:mesh%np, 1:st%d%dim))
2594 projections(:,:,:) =
m_zero
2596 do ik = st%d%kpt%start, st%d%kpt%end
2597 do ist = st%st_start, st%st_end
2599 do uist = gs_st%st_start, gs_st%nst
2601 projections(ist, uist, ik) =
zmf_dotp(mesh, st%d%dim, psi, gspsi, reduce = .false.)
2606 safe_deallocate_a(psi)
2607 safe_deallocate_a(gspsi)
2616 class(
mesh_t),
intent(in) :: mesh
2621 integer,
intent(in) :: iter
2623 complex(real64),
allocatable :: proj(:,:), psi(:,:,:), gs_psi(:,:,:), temp_state(:,:)
2624 character(len=80) :: filename1, filename2
2625 integer :: ik,ist, jst, file, idim, nk_proj
2629 write(filename1,
'(I10)') iter
2630 filename1 =
'td.general/projections_iter_'//trim(adjustl(filename1))
2633 safe_allocate(proj(1:gs_st%nst, 1:gs_st%nst))
2634 safe_allocate(psi(1:gs_st%nst,1:gs_st%d%dim,1:mesh%np))
2635 safe_allocate(gs_psi(1:gs_st%nst,1:gs_st%d%dim,1:mesh%np))
2636 safe_allocate(temp_state(1:mesh%np,1:gs_st%d%dim))
2642 nk_proj = kpoints%nik_skip
2644 do ik = kpoints%reduced%npoints-nk_proj+1, kpoints%reduced%npoints
2646 psi(1:gs_st%nst, 1:gs_st%d%dim, 1:mesh%np)=
m_zero
2647 gs_psi(1:gs_st%nst, 1:gs_st%d%dim, 1:mesh%np)=
m_zero
2650 write(filename2,
'(I10)') ik
2651 filename2 = trim(adjustl(filename1))//
'_ik_'//trim(adjustl(filename2))
2652 file =
io_open(filename2, namespace, action=
'write')
2655 do ist=gs_st%st_start,gs_st%st_end
2658 do idim = 1,gs_st%d%dim
2659 psi(ist,idim,1:mesh%np) = temp_state(1:mesh%np,idim)
2662 do idim = 1,gs_st%d%dim
2663 gs_psi(ist,idim,1:mesh%np) = temp_state(1:mesh%np,idim)
2672 assert(mesh%np_global*gs_st%d%dim < huge(0_int32))
2673 proj(1:gs_st%nst, 1:gs_st%nst) =
m_zero
2678 i8_to_i4(mesh%np_global*gs_st%d%dim), &
2679 cmplx(mesh%volume_element,
m_zero, real64) , &
2681 ubound(psi, dim = 1), &
2683 ubound(gs_psi, dim = 1), &
2686 ubound(proj, dim = 1))
2690 do ist = 1, gs_st%nst
2691 do jst = 1, gs_st%nst
2692 write(file,
'(I3,1x,I3,1x,e13.6,1x,e13.6,2x)') ist, jst, proj(ist,jst)
2700 safe_deallocate_a(proj)
2701 safe_deallocate_a(psi)
2702 safe_deallocate_a(gs_psi)
2703 safe_deallocate_a(temp_state)
2709 subroutine td_write_floquet(namespace, space, hm, ext_partners, mesh, st, iter)
2710 type(namespace_t),
intent(in) :: namespace
2711 class(space_t),
intent(in) :: space
2712 type(hamiltonian_elec_t),
intent(inout) :: hm
2713 type(partner_list_t),
intent(in) :: ext_partners
2714 class(mesh_t),
intent(in) :: mesh
2715 type(states_elec_t),
intent(inout) :: st
2716 integer,
intent(in) :: iter
2718 complex(real64),
allocatable :: hmss(:,:), psi(:,:,:), hpsi(:,:,:), temp_state1(:,:)
2719 complex(real64),
allocatable :: HFloquet(:,:,:), HFloq_eff(:,:), temp(:,:)
2720 real(real64),
allocatable :: eigenval(:), bands(:,:)
2721 character(len=80) :: filename
2722 integer :: it, nT, ik, ist, in, im, file, idim, nik, ik_count
2723 integer :: Forder, Fdim, m0, n0, n1, nst, ii, jj, lim_nst
2724 logical :: downfolding
2725 type(states_elec_t) :: hm_st
2727 real(real64) :: dt, Tcycle, omega
2731 downfolding = .false.
2734 if (.not. iter == 0)
then
2742 assert(mesh%np == mesh%np_global)
2745 call states_elec_copy(hm_st, st)
2756 call parse_variable(namespace,
'TDFloquetFrequency', m_zero, omega, units_inp%energy)
2757 call messages_print_var_value(
'Frequency used for Floquet analysis', omega, namespace=namespace)
2758 if (abs(omega) <= m_epsilon)
then
2759 message(1) =
"Please give a non-zero value for TDFloquetFrequency"
2760 call messages_fatal(1, namespace=namespace)
2764 tcycle = m_two * m_pi / omega
2774 call parse_variable(namespace,
'TDFloquetSample',20 ,nt)
2775 call messages_print_var_value(
'Number of Floquet time-sampling points', nt, namespace=namespace)
2776 dt = tcycle/real(nt, real64)
2785 call parse_variable(namespace,
'TDFloquetDimension',-1,forder)
2786 if (forder .ge. 0)
then
2787 call messages_print_var_value(
'Order of multiphoton Floquet-Hamiltonian', forder, namespace=namespace)
2789 fdim = 2 * forder + 1
2791 message(1) =
'Floquet-Hamiltonian is downfolded'
2792 call messages_info(1, namespace=namespace)
2793 downfolding = .
true.
2798 dt = tcycle/real(nt, real64)
2801 nik = hm%kpoints%nik_skip
2803 safe_allocate(hmss(1:nst,1:nst))
2804 safe_allocate( psi(1:nst,1:st%d%dim,1:mesh%np))
2805 safe_allocate(hpsi(1:nst,1:st%d%dim,1:mesh%np))
2806 safe_allocate(temp_state1(1:mesh%np,1:st%d%dim))
2814 safe_allocate(hfloquet(1:nik,1:nst*fdim, 1:nst*fdim))
2815 hfloquet(1:nik,1:nst*fdim, 1:nst*fdim) = m_zero
2820 call hm%update(mesh, namespace, space, ext_partners, time=tcycle+it*dt)
2822 call zhamiltonian_elec_apply_all(hm, namespace, mesh, st, hm_st)
2827 do ik = hm%kpoints%reduced%npoints-nik+1, hm%kpoints%reduced%npoints
2828 ik_count = ik_count + 1
2830 psi(1:nst, 1:st%d%dim, 1:mesh%np)= m_zero
2831 hpsi(1:nst, 1:st%d%dim, 1:mesh%np)= m_zero
2833 do ist = st%st_start, st%st_end
2834 if (state_kpt_is_local(st, ist, ik))
then
2835 call states_elec_get_state(st, mesh, ist, ik,temp_state1)
2836 do idim = 1, st%d%dim
2837 psi(ist, idim, 1:mesh%np) = temp_state1(1:mesh%np,idim)
2839 call states_elec_get_state(hm_st, mesh, ist, ik,temp_state1)
2840 do idim = 1, st%d%dim
2841 hpsi(ist, idim,1:mesh%np) = temp_state1(1:mesh%np,idim)
2845 call comm_allreduce(mpi_world, psi)
2846 call comm_allreduce(mpi_world, hpsi)
2847 assert(mesh%np_global*st%d%dim < huge(0_int32))
2848 hmss(1:nst,1:nst) = m_zero
2853 i8_to_i4(mesh%np_global*st%d%dim), &
2854 cmplx(mesh%volume_element, m_zero, real64) , &
2856 ubound(hpsi, dim = 1), &
2858 ubound(psi, dim = 1), &
2861 ubound(hmss, dim = 1))
2863 hmss(1:nst,1:nst) = conjg(hmss(1:nst,1:nst))
2866 do in = -forder, forder
2867 do im = -forder, forder
2868 ii = (in+forder) * nst
2869 jj = (im+forder) * nst
2870 hfloquet(ik_count, ii+1:ii+nst, jj+1:jj+nst) = &
2871 hfloquet(ik_count, ii+1:ii+nst, jj+1:jj+nst) + hmss(1:nst, 1:nst) *
exp(-(in-im)*m_zi*omega*it*dt)
2875 hfloquet(ik_count, ii+ist, ii+ist) = hfloquet(ik_count, ii+ist, ii+ist) + in*omega
2884 hfloquet(:,:,:) = m_one/nt*hfloquet(:,:,:)
2887 if (downfolding)
then
2889 safe_allocate(hfloq_eff(1:nst,1:nst))
2890 safe_allocate(eigenval(1:nst))
2891 safe_allocate(bands(1:nik,1:nst))
2893 hfloq_eff(1:nst,1:nst) = m_zero
2899 hfloq_eff(1:nst, 1:nst) = hfloquet(ik, n0+1:n0+nst, m0+1:m0+nst) + &
2900 m_one/omega*(matmul(hfloquet(ik, 1:nst, m0+1:m0+nst), hfloquet(ik, n1+1:n1+nst, m0+1:m0+nst))- &
2901 matmul(hfloquet(ik, n1+1:n1+nst, m0+1:m0+nst), hfloquet(ik, 1:nst, m0+1:m0+nst)))
2903 call lalg_eigensolve(nst, hfloq_eff, eigenval)
2904 bands(ik,1:nst) = eigenval(1:nst)
2906 safe_deallocate_a(hfloq_eff)
2909 safe_allocate(eigenval(1:nst*fdim))
2910 safe_allocate(bands(1:nik,1:nst*fdim))
2911 safe_allocate(temp(1:nst*fdim, 1:nst*fdim))
2914 temp(1:nst*fdim, 1:nst*fdim) = hfloquet(ik, 1:nst*fdim, 1:nst*fdim)
2915 call lalg_eigensolve(nst*fdim, temp, eigenval)
2916 bands(ik, 1:nst*fdim) = eigenval(1:nst*fdim)
2921 if (downfolding)
then
2923 filename =
"downfolded_floquet_bands"
2926 filename =
"floquet_bands"
2929 if (mpi_world%rank == 0)
then
2931 file = io_open(filename, namespace, action =
'write')
2934 write(file,
'(e13.6, 1x)',advance=
'no') bands(ik,ist)
2941 if (.not. downfolding)
then
2944 bands(1:nik, 1:nst*fdim) = m_zero
2946 temp(1:nst*fdim,1:nst*fdim) = m_zero
2949 temp(ii+1:ii+nst, ii+1:ii+nst) = hfloquet(ik, ii+1:ii+nst, ii+1:ii+nst)
2951 call lalg_eigensolve(nst*fdim, temp, eigenval)
2952 bands(ik, 1:nst*fdim) = eigenval(1:nst*fdim)
2955 if (mpi_world%rank == 0)
then
2956 filename =
'trivial_floquet_bands'
2957 file = io_open(filename, namespace, action =
'write')
2960 write(file,
'(e13.6, 1x)', advance=
'no') bands(ik,ist)
2969 call hm%update(mesh, namespace, space, ext_partners, time=m_zero)
2971 safe_deallocate_a(hmss)
2972 safe_deallocate_a(psi)
2973 safe_deallocate_a(hpsi)
2974 safe_deallocate_a(temp_state1)
2975 safe_deallocate_a(hfloquet)
2976 safe_deallocate_a(eigenval)
2977 safe_deallocate_a(bands)
2978 safe_deallocate_a(temp)
2986 type(c_ptr),
intent(inout) :: out_total_current
2987 class(space_t),
intent(in) :: space
2988 class(mesh_t),
intent(in) :: mesh
2989 type(states_elec_t),
intent(in) :: st
2990 integer,
intent(in) :: iter
2992 integer :: idir, ispin
2993 character(len=50) :: aux
2994 real(real64) :: total_current(space%dim), abs_current(space%dim)
2998 if (mpi_grp_is_root(mpi_world) .and. iter == 0)
then
2999 call td_write_print_header_init(out_total_current)
3002 call write_iter_header_start(out_total_current)
3004 do idir = 1, space%dim
3005 write(aux,
'(a2,a1,a1)')
'I(', index2axis(idir),
')'
3006 call write_iter_header(out_total_current, aux)
3009 do idir = 1, space%dim
3010 write(aux,
'(a10,a1,a1)')
'IntAbs(j)(', index2axis(idir),
')'
3011 call write_iter_header(out_total_current, aux)
3014 do ispin = 1, st%d%nspin
3015 do idir = 1, space%dim
3016 write(aux,
'(a4,i1,a1,a1,a1)')
'I-sp', ispin,
'(', index2axis(idir),
')'
3017 call write_iter_header(out_total_current, aux)
3021 call write_iter_nl(out_total_current)
3023 call td_write_print_header_end(out_total_current)
3026 assert(
allocated(st%current))
3028 if (mpi_grp_is_root(mpi_world))
then
3029 call write_iter_start(out_total_current)
3032 total_current = 0.0_real64
3033 do idir = 1, space%dim
3034 do ispin = 1, st%d%spin_channels
3035 total_current(idir) = total_current(idir) + dmf_integrate(mesh, st%current(:, idir, ispin), reduce = .false.)
3037 total_current(idir) = units_from_atomic(units_out%length/units_out%time, total_current(idir))
3039 call mesh%allreduce(total_current, dim = space%dim)
3041 abs_current = 0.0_real64
3042 do idir = 1, space%dim
3043 do ispin = 1, st%d%spin_channels
3044 abs_current(idir) = abs_current(idir) + dmf_integrate(mesh, abs(st%current(:, idir, ispin)), reduce = .false.)
3046 abs_current(idir) = units_from_atomic(units_out%length/units_out%time, abs_current(idir))
3048 call mesh%allreduce(abs_current, dim = space%dim)
3050 if (mpi_grp_is_root(mpi_world))
then
3051 call write_iter_double(out_total_current, total_current, space%dim)
3052 call write_iter_double(out_total_current, abs_current, space%dim)
3055 do ispin = 1, st%d%nspin
3056 total_current = units_from_atomic(units_out%length/units_out%time, dmf_integrate(mesh, space%dim, st%current(:, :, ispin)))
3058 if (mpi_grp_is_root(mpi_world))
then
3059 call write_iter_double(out_total_current, total_current, space%dim)
3063 if (mpi_grp_is_root(mpi_world))
then
3064 call write_iter_nl(out_total_current)
3073 type(c_ptr),
intent(inout) :: write_obj
3074 class(space_t),
intent(in) :: space
3075 type(hamiltonian_elec_t),
intent(inout) :: hm
3076 type(grid_t),
intent(in) :: gr
3077 type(states_elec_t),
intent(in) :: st
3078 integer,
intent(in) :: iter
3080 integer :: idir, ispin
3081 character(len=50) :: aux
3082 real(real64),
allocatable :: heat_current(:, :, :)
3083 real(real64) :: total_current(space%dim)
3087 if (mpi_grp_is_root(mpi_world) .and. iter == 0)
then
3088 call td_write_print_header_init(write_obj)
3091 call write_iter_header_start(write_obj)
3093 do idir = 1, space%dim
3094 write(aux,
'(a2,i1,a1)')
'Jh(', idir,
')'
3095 call write_iter_header(write_obj, aux)
3098 call write_iter_nl(write_obj)
3100 call td_write_print_header_end(write_obj)
3103 safe_allocate(heat_current(1:gr%np, 1:space%dim, 1:st%d%nspin))
3105 call current_heat_calculate(space, gr%der, hm, st, heat_current)
3107 if (mpi_grp_is_root(mpi_world))
call write_iter_start(write_obj)
3109 total_current = 0.0_real64
3110 do idir = 1, space%dim
3111 do ispin = 1, st%d%spin_channels
3112 total_current(idir) = total_current(idir) + dmf_integrate(gr, heat_current(:, idir, ispin))
3114 total_current(idir) = units_from_atomic(units_out%energy*units_out%length/units_out%time, total_current(idir))
3117 safe_deallocate_a(heat_current)
3119 if (mpi_grp_is_root(mpi_world))
call write_iter_double(write_obj, total_current, space%dim)
3121 if (mpi_grp_is_root(mpi_world))
call write_iter_nl(write_obj)
3129 type(c_ptr),
intent(inout) :: out_partial_charges
3130 class(mesh_t),
intent(in) :: mesh
3131 type(states_elec_t),
intent(in) :: st
3132 type(ions_t),
intent(in) :: ions
3133 integer,
intent(in) :: iter
3136 character(len=50) :: aux
3137 real(real64),
allocatable :: hirshfeld_charges(:)
3141 safe_allocate(hirshfeld_charges(1:ions%natoms))
3143 call partial_charges_calculate(mesh, st, ions, hirshfeld_charges)
3145 if (mpi_grp_is_root(mpi_world))
then
3149 call td_write_print_header_init(out_partial_charges)
3152 call write_iter_header_start(out_partial_charges)
3154 do idir = 1, ions%natoms
3155 write(aux,
'(a13,i3,a1)')
'hirshfeld(atom=', idir,
')'
3156 call write_iter_header(out_partial_charges, aux)
3159 call write_iter_nl(out_partial_charges)
3161 call td_write_print_header_end(out_partial_charges)
3164 call write_iter_start(out_partial_charges)
3166 call write_iter_double(out_partial_charges, hirshfeld_charges, ions%natoms)
3168 call write_iter_nl(out_partial_charges)
3171 safe_deallocate_a(hirshfeld_charges)
3177 subroutine td_write_q(out_q, space, ks, iter)
3178 type(c_ptr),
intent(inout) :: out_q
3179 class(space_t),
intent(in) :: space
3180 type(v_ks_t),
intent(in) :: ks
3181 integer,
intent(in) :: iter
3184 character(len=50) :: aux
3188 if (mpi_grp_is_root(mpi_world))
then
3190 call td_write_print_header_init(out_q)
3191 call write_iter_header_start(out_q)
3192 do ii = 1, ks%pt%nmodes
3193 write(aux,
'(a1,i3,a3)')
'q', ii,
'(t)'
3194 call write_iter_header(out_q, aux)
3196 do ii = 1, ks%pt%nmodes
3197 write(aux,
'(a1,i3,a3)')
'p', ii,
'(t)'
3198 call write_iter_header(out_q, aux)
3200 do ii = 1, space%dim
3201 write(aux,
'(a3,i3,a3)')
'f_pt', ii,
'(t)'
3202 call write_iter_header(out_q, aux)
3204 call write_iter_nl(out_q)
3205 call td_write_print_header_end(out_q)
3208 call write_iter_start(out_q)
3209 call write_iter_double(out_q, ks%pt_mx%pt_q, ks%pt%nmodes)
3210 call write_iter_double(out_q, ks%pt_mx%pt_p, ks%pt%nmodes)
3211 call write_iter_double(out_q, ks%pt_mx%fmf, space%dim)
3212 call write_iter_nl(out_q)
3221 type(c_ptr),
intent(inout) :: out_mxll
3222 class(space_t),
intent(in) :: space
3223 type(hamiltonian_elec_t),
intent(in) :: hm
3224 real(real64),
intent(in) :: dt
3225 integer,
intent(in) :: iter
3228 real(real64) :: field(space%dim)
3229 character(len=80) :: aux
3230 character(len=1) :: field_char
3234 if (.not. mpi_grp_is_root(mpi_world))
then
3240 call td_write_print_header_init(out_mxll)
3242 write(aux,
'(a7,e20.12,3a)')
'# dt = ', units_from_atomic(units_out%time, dt), &
3243 " [", trim(units_abbrev(units_out%time)),
"]"
3244 call write_iter_string(out_mxll, aux)
3245 call write_iter_nl(out_mxll)
3247 call write_iter_header_start(out_mxll)
3248 select case (hm%mxll%coupling_mode)
3249 case (length_gauge_dipole, multipolar_expansion)
3250 if (hm%mxll%add_electric_dip) field_char =
'E'
3251 if (hm%mxll%add_magnetic_dip) field_char =
'B'
3252 do idir = 1, space%dim
3253 write(aux,
'(a,i1,a)') field_char //
'(', idir,
')'
3254 call write_iter_header(out_mxll, aux)
3256 case (velocity_gauge_dipole)
3257 do idir = 1, space%dim
3258 write(aux,
'(a,i1,a)')
'A(', idir,
')'
3259 call write_iter_header(out_mxll, aux)
3262 call write_iter_nl(out_mxll)
3264 call write_iter_string(out_mxll,
'#[Iter n.]')
3265 call write_iter_header(out_mxll,
'[' // trim(units_abbrev(units_out%time)) //
']')
3269 select case (hm%mxll%coupling_mode)
3270 case (length_gauge_dipole, multipolar_expansion)
3271 if (hm%mxll%add_electric_dip) aux =
'[' // trim(units_abbrev(units_out%force)) //
']'
3272 if (hm%mxll%add_magnetic_dip) aux =
'[' // trim(units_abbrev(unit_one/units_out%length**2)) //
']'
3273 do idir = 1, space%dim
3274 call write_iter_header(out_mxll, aux)
3276 case (velocity_gauge_dipole)
3277 aux =
'[' // trim(units_abbrev(units_out%energy)) //
']'
3278 do idir = 1, space%dim
3279 call write_iter_header(out_mxll, aux)
3282 call write_iter_nl(out_mxll)
3283 call td_write_print_header_end(out_mxll)
3286 call write_iter_start(out_mxll)
3289 select case (hm%mxll%coupling_mode)
3290 case (length_gauge_dipole, multipolar_expansion)
3291 if (hm%mxll%add_electric_dip) field = units_from_atomic(units_out%force, hm%mxll%e_field_dip)
3292 if (hm%mxll%add_magnetic_dip) field = units_from_atomic(unit_one/units_out%length**2, hm%mxll%b_field_dip)
3293 call write_iter_double(out_mxll, field, space%dim)
3294 case (velocity_gauge_dipole)
3295 field = units_from_atomic(units_out%energy, hm%mxll%vec_pot_dip)
3296 call write_iter_double(out_mxll, field, space%dim)
3298 call write_iter_nl(out_mxll)
3306 type(c_ptr),
intent(inout) :: out_coords
3307 type(lda_u_t),
intent(in) :: lda_u
3308 integer,
intent(in) :: iter
3311 character(len=50) :: aux
3313 if (.not. mpi_grp_is_root(mpi_world))
return
3318 call td_write_print_header_init(out_coords)
3321 call write_iter_header_start(out_coords)
3323 do ios = 1, lda_u%norbsets
3324 write(aux,
'(a2,i3,a1)')
'Ueff(', ios,
')'
3325 call write_iter_header(out_coords, aux)
3328 do ios = 1, lda_u%norbsets
3329 write(aux,
'(a2,i3,a1)')
'U(', ios,
')'
3330 call write_iter_header(out_coords, aux)
3333 do ios = 1, lda_u%norbsets
3334 write(aux,
'(a2,i3,a1)')
'J(', ios,
')'
3335 call write_iter_header(out_coords, aux)
3338 if (lda_u%intersite)
then
3339 do ios = 1, lda_u%norbsets
3340 do inn = 1, lda_u%orbsets(ios)%nneighbors
3341 write(aux,
'(a2,i3,a1,i3,a1)')
'V(', ios,
'-', inn,
')'
3342 call write_iter_header(out_coords, aux)
3348 call write_iter_nl(out_coords)
3351 call write_iter_string(out_coords,
'#[Iter n.]')
3352 call write_iter_header(out_coords,
'[' // trim(units_abbrev(units_out%time)) //
']')
3353 call write_iter_string(out_coords, &
3354 'Effective U ' // trim(units_abbrev(units_out%energy)) // &
3355 ', U in '// trim(units_abbrev(units_out%energy)) // &
3356 ', J in ' // trim(units_abbrev(units_out%energy)))
3357 call write_iter_nl(out_coords)
3359 call td_write_print_header_end(out_coords)
3362 call write_iter_start(out_coords)
3364 do ios = 1, lda_u%norbsets
3365 call write_iter_double(out_coords, units_from_atomic(units_out%energy, &
3366 lda_u%orbsets(ios)%Ueff), 1)
3369 do ios = 1, lda_u%norbsets
3370 call write_iter_double(out_coords, units_from_atomic(units_out%energy, &
3371 lda_u%orbsets(ios)%Ubar), 1)
3374 do ios = 1, lda_u%norbsets
3375 call write_iter_double(out_coords, units_from_atomic(units_out%energy, &
3376 lda_u%orbsets(ios)%Jbar), 1)
3379 if (lda_u%intersite)
then
3380 do ios = 1, lda_u%norbsets
3381 do inn = 1, lda_u%orbsets(ios)%nneighbors
3382 call write_iter_double(out_coords, units_from_atomic(units_out%energy, &
3383 lda_u%orbsets(ios)%V_ij(inn,0)), 1)
3388 call write_iter_nl(out_coords)
3395 type(c_ptr),
intent(inout) :: file_handle
3396 type(grid_t),
intent(in) :: grid
3397 type(kpoints_t),
intent(in) :: kpoints
3398 type(states_elec_t),
intent(in) :: st
3399 integer,
intent(in) :: iter
3401 integer :: ik_ispin, ist
3402 character(len=7) :: nkpt_str, nst_str
3403 character(len=7) :: ik_str, ist_str
3404 real(real64),
allocatable :: norm_ks(:, :)
3405 real(real64) :: n_electrons
3409 safe_allocate(norm_ks(1:st%nst, 1:st%nik))
3410 call states_elec_calc_norms(grid, kpoints, st, norm_ks)
3412 if (mpi_grp_is_root(mpi_world))
then
3415 call td_write_print_header_init(file_handle)
3418 write(nkpt_str,
'(I7)') st%nik
3419 write(nst_str,
'(I7)') st%nst
3420 call write_iter_string(file_handle,
'# Dimensions. (nstates, nkpt * nspin):')
3421 call write_iter_string(file_handle, trim(adjustl(nst_str)) //
' ' // trim(adjustl(nkpt_str)))
3422 call write_iter_nl(file_handle)
3425 call write_iter_string(file_handle,
'# Norm ordering: (istate, ikpoint_spin)')
3426 call write_iter_nl(file_handle)
3429 call write_iter_header_start(file_handle)
3430 call write_iter_header(file_handle,
'N_electrons')
3431 do ik_ispin = 1, st%nik
3433 write(ik_str,
'(I7)') ik_ispin
3434 write(ist_str,
'(I7)') ist
3435 call write_iter_header(file_handle, &
3436 'Norm (' // trim(ist_str) //
',' // trim(ik_str) //
')')
3439 call write_iter_nl(file_handle)
3440 call td_write_print_header_end(file_handle)
3443 n_electrons = sum(st%occ * norm_ks**2)
3446 call write_iter_start(file_handle)
3447 call write_iter_double(file_handle, n_electrons, 1)
3448 do ik_ispin = 1, st%nik
3449 call write_iter_double(file_handle, norm_ks(:, ik_ispin),
size(norm_ks, 1))
3451 call write_iter_nl(file_handle)
3455 safe_deallocate_a(norm_ks)
3464 type(c_ptr),
intent(inout) :: file_handle
3465 type(ions_t),
intent(in) :: ions
3466 integer,
intent(in) :: iter
3469 real(real64) :: tmp(3)
3471 if (.not. mpi_grp_is_root(mpi_world))
return
3475 assert(ions%space%dim == 3)
3478 call td_write_print_header_init(file_handle)
3481 call write_iter_header_start(file_handle)
3483 call write_iter_string(file_handle,
'# Iter, a, b, c, volume, alpha, beta, gamma, ' &
3484 //
'a_x, a_y, a_z, b_x, b_y, b_z, c_x, c_y, c_z')
3487 call write_iter_string(file_handle,
'#[Iter n.]')
3488 call write_iter_header(file_handle,
'[' // trim(units_abbrev(units_out%time)) //
']')
3489 call write_iter_string(file_handle, &
3490 'Lengths in ' // trim(units_abbrev(units_out%length)) // &
3491 ', Volume in ' // trim(units_abbrev(units_out%length**3)) // &
3492 ', Angles in degree, Lattice vectors in '// trim(units_abbrev(units_out%length)))
3493 call write_iter_nl(file_handle)
3495 call td_write_print_header_end(file_handle)
3498 call write_iter_start(file_handle)
3502 tmp(idir) = units_from_atomic(units_out%length, norm2(ions%latt%rlattice(1:3, idir)))
3504 call write_iter_double(file_handle, tmp, 3)
3507 tmp(1) = units_from_atomic(units_out%length**3, ions%latt%rcell_volume)
3508 call write_iter_double(file_handle, tmp(1), 1)
3511 call write_iter_double(file_handle, ions%latt%alpha, 1)
3512 call write_iter_double(file_handle, ions%latt%beta, 1)
3513 call write_iter_double(file_handle, ions%latt%gamma, 1)
3517 tmp(1:3) = units_from_atomic(units_out%length, ions%latt%rlattice(:, idir))
3518 call write_iter_double(file_handle, tmp, 3)
3520 call write_iter_nl(file_handle)
3529 type(namespace_t),
intent(in) :: namespace
3530 integer,
intent(in) :: iter
3531 real(real64),
intent(in) :: dt
3533 integer :: default, flags, iout, first
3588 call parse_variable(namespace,
'MaxwellTDOutput', default, flags)
3590 if (.not. varinfo_valid_option(
'MaxwellTDOutput', flags, is_flag = .
true.))
then
3591 call messages_input_error(namespace,
'MaxwellTDOutput')
3595 writ%out(iout)%write = (iand(flags, 2**(iout - 1)) /= 0)
3596 if (writ%out(iout)%write)
then
3597 writ%out(iout + 1)%write = .
true.
3598 writ%out(iout + 2)%write = .
true.
3603 writ%out(iout)%write = (iand(flags, 2**(iout - 1)) /= 0)
3612 call io_mkdir(
'td.general', namespace)
3617 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/total_e_field_x", namespace)))
3619 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/total_e_field_y", namespace)))
3621 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/total_e_field_z", namespace)))
3627 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/total_b_field_x", namespace)))
3629 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/total_b_field_y", namespace)))
3631 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/total_b_field_z", namespace)))
3637 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/longitudinal_e_field_x", namespace)))
3639 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/longitudinal_e_field_y", namespace)))
3641 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/longitudinal_e_field_z", namespace)))
3647 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/longitudinal_b_field_x", namespace)))
3649 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/longitudinal_b_field_y", namespace)))
3651 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/longitudinal_b_field_z", namespace)))
3657 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/transverse_e_field_x", namespace)))
3659 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/transverse_e_field_y", namespace)))
3661 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/transverse_e_field_z", namespace)))
3667 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/transverse_b_field_x", namespace)))
3669 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/transverse_b_field_y", namespace)))
3671 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/transverse_b_field_z", namespace)))
3677 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/maxwell_energy", namespace)))
3682 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/electric_field_surface-x", namespace)))
3687 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/electric_field_surface-y", namespace)))
3692 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/electric_field_surface-z", namespace)))
3697 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/magnetic_field_surface-x", namespace)))
3702 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/magnetic_field_surface-y", namespace)))
3707 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/magnetic_field_surface-z", namespace)))
3723 if (writ%out(iout)%write)
call write_iter_end(writ%out(iout)%handle)
3731 subroutine td_write_mxll_iter(writ, space, gr, st, hm, helmholtz, dt, iter, namespace)
3733 class(space_t),
intent(in) :: space
3734 type(grid_t),
intent(inout) :: gr
3735 type(states_mxll_t),
intent(inout) :: st
3736 type(hamiltonian_mxll_t),
intent(inout) :: hm
3737 type(helmholtz_decomposition_t),
intent(inout) :: helmholtz
3738 real(real64),
intent(in) :: dt
3739 integer,
intent(in) :: iter
3740 type(namespace_t),
intent(in) :: namespace
3745 call profiling_in(
"TD_WRITE_ITER_MAXWELL")
3748 call helmholtz%get_trans_field(namespace, st%rs_state_trans, total_field=st%rs_state)
3749 call get_rs_state_at_point(st%selected_points_rs_state_trans(:,:), st%rs_state_trans, &
3750 st%selected_points_coordinate(:,:), st, gr)
3753 hm%energy%energy_trans = m_zero
3757 call helmholtz%get_long_field(namespace, st%rs_state_long, total_field=st%rs_state)
3758 call get_rs_state_at_point(st%selected_points_rs_state_long(:,:), st%rs_state_long, &
3759 st%selected_points_coordinate(:,:), st, gr)
3762 hm%energy%energy_long = m_zero
3854 call profiling_out(
"TD_WRITE_ITER_MAXWELL")
3863 type(hamiltonian_mxll_t),
intent(in) :: hm
3864 integer,
intent(in) :: iter
3868 integer :: n_columns
3870 if (.not. mpi_grp_is_root(mpi_world))
return
3895 call write_iter_header(
out_maxwell_energy,
'[' // trim(units_abbrev(units_out%time)) //
']')
3897 do ii = 1, n_columns
3898 call write_iter_header(
out_maxwell_energy,
'[' // trim(units_abbrev(units_out%energy)) //
']')
3906 call write_iter_double(
out_maxwell_energy, units_from_atomic(units_out%energy, hm%energy%energy), 1)
3907 call write_iter_double(
out_maxwell_energy, units_from_atomic(units_out%energy, hm%energy%e_energy), 1)
3908 call write_iter_double(
out_maxwell_energy, units_from_atomic(units_out%energy, hm%energy%b_energy), 1)
3910 hm%energy%energy+hm%energy%boundaries), 1)
3911 call write_iter_double(
out_maxwell_energy, units_from_atomic(units_out%energy, hm%energy%boundaries), 1)
3912 call write_iter_double(
out_maxwell_energy, units_from_atomic(units_out%energy, hm%energy%energy_trans), 1)
3913 call write_iter_double(
out_maxwell_energy, units_from_atomic(units_out%energy, hm%energy%energy_long), 1)
3914 call write_iter_double(
out_maxwell_energy, units_from_atomic(units_out%energy, hm%energy%energy_plane_waves), 1)
3923 type(c_ptr),
intent(inout) :: out_field_surf
3924 type(states_mxll_t),
intent(in) :: st
3925 integer,
intent(in) :: dim
3926 integer,
intent(in) :: iter
3930 integer :: n_columns
3932 if (.not. mpi_grp_is_root(mpi_world))
return
3939 call td_write_print_header_init(out_field_surf)
3942 call write_iter_header_start(out_field_surf)
3943 call write_iter_header(out_field_surf,
'- x direction')
3944 call write_iter_header(out_field_surf,
'+ x direction')
3945 call write_iter_header(out_field_surf,
'- y direction')
3946 call write_iter_header(out_field_surf,
'+ y direction')
3947 call write_iter_header(out_field_surf,
'- z direction')
3948 call write_iter_header(out_field_surf,
'+ z direction')
3949 call write_iter_header(out_field_surf,
'- x dir. p. w.')
3950 call write_iter_header(out_field_surf,
'+ x dir. p. w.')
3951 call write_iter_header(out_field_surf,
'- y dir. p. w.')
3952 call write_iter_header(out_field_surf,
'+ y dir. p. w.')
3953 call write_iter_header(out_field_surf,
'- z dir. p. w.')
3954 call write_iter_header(out_field_surf,
'+ z dir. p. w.')
3956 call write_iter_nl(out_field_surf)
3959 call write_iter_string(out_field_surf,
'#[Iter n.]')
3960 call write_iter_header(out_field_surf,
'[' // trim(units_abbrev(units_out%time)) //
']')
3962 do ii = 1, n_columns
3963 call write_iter_header(out_field_surf,
'[' // trim(units_abbrev(units_out%energy/units_out%length)) //
']')
3965 call write_iter_nl(out_field_surf)
3967 call td_write_print_header_end(out_field_surf)
3970 call write_iter_start(out_field_surf)
3971 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
3972 st%electric_field_box_surface(1,1,dim)), 1)
3973 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
3974 st%electric_field_box_surface(2,1,dim)), 1)
3975 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
3976 st%electric_field_box_surface(1,2,dim)), 1)
3977 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
3978 st%electric_field_box_surface(2,2,dim)), 1)
3979 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
3980 st%electric_field_box_surface(1,3,dim)), 1)
3981 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
3982 st%electric_field_box_surface(2,3,dim)), 1)
3983 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
3984 st%electric_field_box_surface_plane_waves(1,1,dim)), 1)
3985 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
3986 st%electric_field_box_surface_plane_waves(2,1,dim)), 1)
3987 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
3988 st%electric_field_box_surface_plane_waves(1,2,dim)), 1)
3989 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
3990 st%electric_field_box_surface_plane_waves(2,2,dim)), 1)
3991 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
3992 st%electric_field_box_surface_plane_waves(1,3,dim)), 1)
3993 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
3994 st%electric_field_box_surface_plane_waves(2,3,dim)), 1)
3995 call write_iter_nl(out_field_surf)
4003 type(c_ptr),
intent(inout) :: out_field_surf
4004 type(states_mxll_t),
intent(in) :: st
4005 integer,
intent(in) :: dim
4006 integer,
intent(in) :: iter
4010 integer :: n_columns
4012 if (.not. mpi_grp_is_root(mpi_world))
return
4019 call td_write_print_header_init(out_field_surf)
4022 call write_iter_header_start(out_field_surf)
4023 call write_iter_header(out_field_surf,
'- x direction')
4024 call write_iter_header(out_field_surf,
'+ x direction')
4025 call write_iter_header(out_field_surf,
'- y direction')
4026 call write_iter_header(out_field_surf,
'+ y direction')
4027 call write_iter_header(out_field_surf,
'- z direction')
4028 call write_iter_header(out_field_surf,
'+ z direction')
4029 call write_iter_header(out_field_surf,
'- x dir. p. w.')
4030 call write_iter_header(out_field_surf,
'+ x dir. p. w.')
4031 call write_iter_header(out_field_surf,
'- y dir. p. w.')
4032 call write_iter_header(out_field_surf,
'+ y dir. p. w.')
4033 call write_iter_header(out_field_surf,
'- z dir. p. w.')
4034 call write_iter_header(out_field_surf,
'+ z dir. p. w.')
4036 call write_iter_nl(out_field_surf)
4039 call write_iter_string(out_field_surf,
'#[Iter n.]')
4040 call write_iter_header(out_field_surf,
'[' // trim(units_abbrev(units_out%time)) //
']')
4042 do ii = 1, n_columns
4043 call write_iter_header(out_field_surf,
'[' // trim(units_abbrev(unit_one/units_out%length**2)) //
']')
4045 call write_iter_nl(out_field_surf)
4047 call td_write_print_header_end(out_field_surf)
4050 call write_iter_start(out_field_surf)
4051 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4052 st%magnetic_field_box_surface(1,1,dim)), 1)
4053 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4054 st%magnetic_field_box_surface(2,1,dim)), 1)
4055 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4056 st%magnetic_field_box_surface(1,2,dim)), 1)
4057 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4058 st%magnetic_field_box_surface(2,2,dim)), 1)
4059 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4060 st%magnetic_field_box_surface(1,3,dim)), 1)
4061 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4062 st%magnetic_field_box_surface(2,3,dim)), 1)
4063 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4064 st%magnetic_field_box_surface_plane_waves(1,1,dim)), 1)
4065 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4066 st%magnetic_field_box_surface_plane_waves(2,1,dim)), 1)
4067 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4068 st%magnetic_field_box_surface_plane_waves(1,2,dim)), 1)
4069 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4070 st%magnetic_field_box_surface_plane_waves(2,2,dim)), 1)
4071 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4072 st%magnetic_field_box_surface_plane_waves(1,3,dim)), 1)
4073 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4074 st%magnetic_field_box_surface_plane_waves(2,3,dim)), 1)
4075 call write_iter_nl(out_field_surf)
4081 subroutine td_write_fields(out_fields, space, st, iter, dt, e_or_b_field, field_type, idir)
4082 type(c_ptr),
intent(inout) :: out_fields
4083 class(space_t),
intent(in) :: space
4084 type(states_mxll_t),
intent(in) :: st
4085 integer,
intent(in) :: iter
4086 real(real64),
intent(in) :: dt
4087 integer,
intent(in) :: e_or_b_field
4088 integer,
intent(in) :: field_type
4089 integer,
intent(in) :: idir
4093 real(real64) :: field(space%dim), selected_field
4094 character(len=80) :: aux
4096 if (.not. mpi_grp_is_root(mpi_world))
return
4101 call td_write_print_header_init(out_fields)
4104 write(aux,
'(a7,e20.12,3a)')
'# dt = ', units_from_atomic(units_out%time, dt), &
4105 " [", trim(units_abbrev(units_out%time)),
"]"
4106 call write_iter_string(out_fields, aux)
4107 call write_iter_nl(out_fields)
4109 call write_iter_header_start(out_fields)
4111 do id = 1, st%selected_points_number
4112 select case (e_or_b_field)
4114 write(aux,
'(a,i1,a)')
'E(', id,
')'
4116 write(aux,
'(a,i1,a)')
'B(', id,
')'
4118 call write_iter_header(out_fields, aux)
4121 call write_iter_nl(out_fields)
4122 call write_iter_string(out_fields,
'#[Iter n.]')
4123 call write_iter_header(out_fields,
' [' // trim(units_abbrev(units_out%time)) //
']')
4128 aux =
' [' // trim(units_abbrev(units_out%force)) //
']'
4129 do id = 1, st%selected_points_number
4130 call write_iter_header(out_fields, aux)
4132 call write_iter_nl(out_fields)
4133 call td_write_print_header_end(out_fields)
4136 call write_iter_start(out_fields)
4138 do id = 1, st%selected_points_number
4139 select case (e_or_b_field)
4142 select case (field_type)
4144 call get_electric_field_vector(st%selected_points_rs_state(:,id), field(1:st%dim))
4146 call get_electric_field_vector(st%selected_points_rs_state_long(:,id), field(1:st%dim))
4148 call get_electric_field_vector(st%selected_points_rs_state_trans(:,id), field(1:st%dim))
4150 selected_field = units_from_atomic(units_out%energy/units_out%length, field(idir))
4153 select case (field_type)
4155 call get_magnetic_field_vector(st%selected_points_rs_state(:,id), st%rs_sign, field(1:st%dim))
4157 call get_magnetic_field_vector(st%selected_points_rs_state_long(:,id), st%rs_sign, field(1:st%dim))
4159 call get_magnetic_field_vector(st%selected_points_rs_state_trans(:,id), st%rs_sign, field(1:st%dim))
4161 selected_field = units_from_atomic(unit_one/units_out%length**2, field(idir))
4163 call write_iter_double(out_fields, selected_field, 1)
4166 call write_iter_nl(out_fields)
4175 type(namespace_t),
intent(in) :: namespace
4176 class(space_t),
intent(in) :: space
4177 type(grid_t),
intent(inout) :: gr
4178 type(states_mxll_t),
intent(inout) :: st
4179 type(hamiltonian_mxll_t),
intent(inout) :: hm
4180 type(helmholtz_decomposition_t),
intent(inout) :: helmholtz
4181 type(output_t),
intent(in) :: outp
4182 integer,
intent(in) :: iter
4183 real(real64),
intent(in) :: time
4185 character(len=256) :: filename
4187 push_sub(td_write_maxwell_free_data)
4188 call profiling_in(
"TD_WRITE_MAXWELL_DATA")
4191 write(filename,
'(a,a,i7.7)') trim(outp%iter_dir),
"td.", iter
4193 call output_mxll(outp, namespace, space, gr, st, hm, helmholtz, time, filename)
4195 call profiling_out(
"TD_WRITE_MAXWELL_DATA")
4196 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)