48 use,
intrinsic :: iso_fortran_env
108 integer,
parameter,
public :: &
109 OUT_MULTIPOLES = 1, &
147 character(len=100) :: td_file_name(OUT_MAX) = [character(100) :: &
157 "magnetic_moments", &
172 "total_heat_current", &
173 "total_magnetization", &
175 "maxwell_dipole_field", &
176 "norm_wavefunctions", &
180 integer,
parameter :: &
181 OUT_DFTU_EFFECTIVE_U = 1, &
185 integer,
parameter :: &
186 OUT_MAXWELL_TOTAL_E_FIELD = 1, &
200 integer,
parameter,
public :: &
203 integer,
parameter :: &
208 integer,
parameter :: &
214 type(c_ptr) :: handle
215 type(c_ptr),
allocatable :: mult_handles(:)
217 integer :: hand_start
219 logical ::
write = .false.
220 logical :: resolve_states = .false.
232 real(real64) :: lmm_r
235 integer :: n_excited_states
237 integer :: compute_interval
243 subroutine td_write_kick(outp, namespace, space, mesh, kick, ions, iter)
247 class(
mesh_t),
intent(in) :: mesh
248 type(
kick_t),
intent(in) :: kick
249 type(
ions_t),
intent(in) :: ions
250 integer,
intent(in) :: iter
252 complex(real64),
allocatable :: kick_function(:)
253 character(len=256) :: filename
258 write(filename,
'(a,i7.7)')
"td.", iter
259 if (outp%what(option__output__delta_perturbation))
then
260 safe_allocate(kick_function(1:mesh%np))
262 call zio_function_output(outp%how(option__output__delta_perturbation), filename,
"kick_function", namespace, &
263 space, mesh, kick_function(:),
units_out%energy, err, pos=ions%pos, atoms=ions%atom)
264 safe_deallocate_a(kick_function)
280 subroutine td_write_init(writ, namespace, space, outp, gr, st, hm, ions, ext_partners, ks, ions_move, &
281 with_gauge_field, kick, iter, max_iter, dt, mc)
285 type(
output_t),
intent(inout) :: outp
286 type(
grid_t),
intent(in) :: gr
289 type(
ions_t),
intent(in) :: ions
291 type(
v_ks_t),
intent(inout) :: ks
292 logical,
intent(in) :: ions_move
293 logical,
intent(in) :: with_gauge_field
294 type(
kick_t),
intent(in) :: kick
295 integer,
intent(in) :: iter
296 integer,
intent(in) :: max_iter
297 real(real64),
intent(in) :: dt
301 integer :: ierr, first, ii, ist, jj, flags, iout, default, ifile
306 character(len=MAX_PATH_LEN) :: filename
308 logical :: resolve_states
309 logical,
allocatable :: skip(:)
454 output_options = .false.
455 output_options(out_multipoles) = .
true.
473 writ%out(iout)%write = output_options(iout)
488 if (space%is_periodic() .and. writ%out(
out_angular)%write)
then
503 if (gr%np /= gr%np_global)
then
504 message(1) =
"TDOutput option td_kpoint_occup and td_floquet do not work with domain parallelization"
511 'Forces for systems periodic in 1D are not currently implemented and options that output the forces are not allowed.')
515 if (writ%out(
out_kp_proj)%write .and. hm%kpoints%nik_skip == 0)
then
516 message(1) =
"TDOutput option td_kpoint_occup only work with zero-weight k-points at the moment."
530 call parse_variable(namespace,
'TDOutputResolveStates', .false., resolve_states)
531 if (.not. writ%out(out_multipoles)%write)
then
532 write(
message(1),
'(a)')
"TDOutputResolveStates works only for TDOutput = multipoles."
545 if (writ%lmax < 0)
then
546 write(
message(1),
'(a,i6,a)')
"Input: '", writ%lmax,
"' is not a valid TDMultipoleLmax."
547 message(2) =
'(Must be TDMultipoleLmax >= 0 )'
553 if ((writ%out(
out_acc)%write) .and. ions_move)
then
554 message(1) =
'If harmonic spectrum is to be calculated, atoms should not be allowed to move.'
558 if ((writ%out(
out_q)%write) .and. .not.(ks%has_photons))
then
559 message(1) =
'If q(t) is to be calculated, you need to allow for photon modes.'
564 .or. hm%mxll%add_electric_dip))
then
565 message(1) =
'If the dipolar field has to be written, MaxwellCouplingMode has to be'
566 message(2) =
'"lenght_gauge_dipole" or "velocity_gauge_dipole" and at least one Maxwell system'
567 message(3) =
'must be present.'
571 rmin = ions%min_distance()
581 message(1) =
"Option TDOutput = populations is not implemented for parallel in states."
593 safe_deallocate_a(writ%gs_st%node)
601 writ%gs_st%st_end = writ%gs_st%nst
603 message(1) =
"Unable to read states information."
607 writ%gs_st%st_start = 1
623 call parse_variable(namespace,
'TDProjStateStart', 1, writ%gs_st%st_start)
625 if (st%parallel_in_states .and. writ%out(
out_proj)%write .and. writ%gs_st%st_start > 1)
then
631 writ%gs_st%lnst = writ%gs_st%st_end - writ%gs_st%st_start + 1
635 writ%gs_st%parallel_in_states = .false.
638 safe_allocate(writ%gs_st%occ(1:writ%gs_st%nst, 1:writ%gs_st%nik))
639 safe_allocate(writ%gs_st%eigenval(1:writ%gs_st%nst, 1:writ%gs_st%nik))
643 safe_allocate(writ%gs_st%node(1:writ%gs_st%nst))
644 writ%gs_st%node(:) = 0
646 writ%gs_st%eigenval = huge(writ%gs_st%eigenval)
648 if (writ%gs_st%d%ispin ==
spinors)
then
649 safe_deallocate_a(writ%gs_st%spin)
650 safe_allocate(writ%gs_st%spin(1:3, 1:writ%gs_st%nst, 1:writ%gs_st%nik))
653 safe_allocate(skip(1:writ%gs_st%nst))
655 skip(1:writ%gs_st%st_start-1) = .
true.
659 safe_deallocate_a(skip)
664 if (ierr /= 0 .and. ierr /= (writ%gs_st%st_end-writ%gs_st%st_start+1)*writ%gs_st%nik &
665 *writ%gs_st%d%dim*writ%gs_st%mpi_grp%size)
then
666 message(1) =
"Unable to read wavefunctions for TDOutput."
711 if (
parse_block(namespace,
'TDExcitedStatesToProject', blk) == 0)
then
713 safe_allocate(writ%excited_st(1:writ%n_excited_states))
714 do ist = 1, writ%n_excited_states
719 writ%n_excited_states = 0
733 call parse_variable(namespace,
'TDOutputComputeInterval', 50, writ%compute_interval)
734 if (writ%compute_interval < 0)
then
735 message(1) =
"TDOutputComputeInterval must be >= 0."
751 call io_mkdir(
'td.general', namespace)
758 writ%out(:)%mpi_grp = st%system_grp
759 writ%out_dftu(:)%mpi_grp = st%system_grp
761 if (st%system_grp%is_root())
then
763 do ifile = 1, out_max
767 if (writ%out(ifile)%write)
then
771 trim(
io_workpath(
"td.general/"//trim(td_file_name(ifile)), namespace)))
779 if (writ%out(out_multipoles)%write .and. .not. resolve_states)
then
782 trim(
io_workpath(
"td.general/multipoles", namespace)))
786 select case (kick%qkick_mode)
788 write(filename,
'(a)')
'td.general/ftchd.sin'
790 write(filename,
'(a)')
'td.general/ftchd.cos'
792 write(filename,
'(a, SP, I0.3, a, I0.3)')
'td.general/ftchd.l', kick%qbessel_l,
'_m', kick%qbessel_m
794 write(filename,
'(a)')
'td.general/ftchd'
806 call io_rm(
"td.general/laser", namespace=namespace)
824 if (writ%out(out_multipoles)%write .and. resolve_states)
then
826 writ%out(out_multipoles)%hand_start = st%st_start
827 writ%out(out_multipoles)%hand_end = st%st_end
828 writ%out(out_multipoles)%resolve_states = .
true.
829 writ%out(out_multipoles)%mpi_grp = gr%mpi_grp
831 safe_allocate(writ%out(out_multipoles)%mult_handles(st%st_start:st%st_end))
833 if (writ%out(out_multipoles)%mpi_grp%is_root())
then
834 do ist = st%st_start, st%st_end
835 write(filename,
'(a,i4.4)')
'td.general/multipoles-ist', ist
848 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, &
849 calc_eigenval=.false., time = iter*dt, calc_energy = .false.)
852 if (writ%out(
out_n_ex)%write .and. writ%compute_interval > 0)
then
853 call io_mkdir(outp%iter_dir, namespace)
856 if (all(outp%how == 0) .and. writ%out(
out_n_ex)%write)
then
878 if (hm%lda_u_level ==
dft_u_acbn0) default = default + 2**(out_dftu_effective_u - 1)
886 writ%out_dftu(iout)%write = (iand(flags, 2**(iout - 1)) /= 0)
889 if (st%system_grp%is_root())
then
890 if (writ%out_dftu(out_dftu_effective_u)%write)
then
893 trim(
io_workpath(
"td.general/effectiveU", namespace)))
911 if (writ%out(iout)%write)
then
912 if (writ%out(iout)%mpi_grp%is_root())
then
913 if (writ%out(iout)%resolve_states)
then
914 do ist = writ%out(iout)%hand_start, writ%out(iout)%hand_end
917 safe_deallocate_a(writ%out(iout)%mult_handles)
926 if (writ%out_dftu(iout)%write .and. writ%out_dftu(iout)%mpi_grp%is_root())
then
932 do ist = 1, writ%n_excited_states
935 writ%n_excited_states = 0
948 subroutine td_write_iter(writ, namespace, space, outp, gr, st, hm, ions, ext_partners, kick, ks, dt, iter, mc, recalculate_gs)
951 class(
space_t),
intent(in) :: space
953 type(
grid_t),
intent(in) :: gr
956 type(
ions_t),
intent(inout) :: ions
958 type(
kick_t),
intent(in) :: kick
959 type(
v_ks_t),
intent(in) :: ks
960 real(real64),
intent(in) :: dt
961 integer,
intent(in) :: iter
963 logical,
intent(in) :: recalculate_gs
971 if (writ%out(out_multipoles)%write)
then
972 call td_write_multipole(writ%out(out_multipoles), space, gr, ions, st, writ%lmax, kick, iter)
995 if (writ%out(
out_proj)%write .and. mod(iter, writ%compute_interval) == 0)
then
1004 if (writ%out(
out_kp_proj)%write .and. mod(iter, writ%compute_interval) == 0)
then
1010 ions%pos, ions%vel, ions%tot_force, iter)
1015 ions%pos, ions%vel, ions%tot_force, iter, 1)
1020 ions%pos, ions%vel, ions%tot_force, iter, 2)
1025 ions%pos, ions%vel, ions%tot_force, iter, 3)
1036 if (writ%out(
out_acc)%write)
then
1037 call td_write_acc(writ%out(
out_acc)%handle, namespace, space, gr, ions, st, hm, ext_partners, dt, iter)
1040 if (writ%out(
out_vel)%write)
then
1053 if(
associated(gfield))
then
1083 if (writ%out(
out_n_ex)%write .and. mod(iter, writ%compute_interval) == 0)
then
1085 if (recalculate_gs)
then
1088 ierr, label =
': Houston states for TDOutput')
1092 call td_write_n_ex(writ%out(
out_n_ex)%handle, outp, namespace, gr, hm%kpoints, st, writ%gs_st, iter)
1104 if (writ%out_dftu(out_dftu_effective_u)%write)
then
1106 writ%out_dftu(out_dftu_effective_u)%mpi_grp, hm%lda_u, iter)
1109 if (writ%out(
out_q)%write .and. ks%has_photons)
then
1113 if (writ%out(
out_mxll_field)%write .and. hm%mxll%calc_field_dip)
then
1115 space, hm, dt, iter)
1131 do iout = 1, out_max
1133 if (writ%out(iout)%write)
then
1134 if (writ%out(iout)%mpi_grp%is_root())
then
1135 if (writ%out(iout)%resolve_states)
then
1136 do ii = writ%out(iout)%hand_start, writ%out(iout)%hand_end
1147 if (writ%out_dftu(iout)%write .and. writ%out(
out_proj)%mpi_grp%is_root())
then
1157 subroutine td_write_output(namespace, space, gr, st, hm, ks, outp, ions, ext_partners, iter, dt)
1160 type(
grid_t),
intent(in) :: gr
1163 type(
v_ks_t),
intent(inout) :: ks
1165 type(
ions_t),
intent(in) :: ions
1167 integer,
intent(in) :: iter
1168 real(real64),
optional,
intent(in) :: dt
1170 character(len=256) :: filename
1176 if (st%modelmbparticles%nparticle > 0)
then
1181 write(filename,
'(a,a,i7.7)') trim(outp%iter_dir),
"td.", iter
1183 call output_all(outp, namespace, space, filename, gr, ions, iter, st, hm, ks)
1185 call output_modelmb(outp, namespace, space, filename, gr, ions, iter, st)
1187 if (
present(dt))
then
1188 call output_scalar_pot(outp, namespace, space, filename, gr, ions, ext_partners, iter*dt)
1190 if (iter == 0)
call output_scalar_pot(outp, namespace, space, filename, gr, ions, ext_partners)
1199 type(c_ptr),
intent(inout) ::
out_spin
1201 class(
mesh_t),
intent(in) :: mesh
1203 integer,
intent(in) :: iter
1205 character(len=130) :: aux
1206 real(real64) :: spin(3)
1215 if (mpi_grp%is_root())
then
1222 if (st%d%ispin ==
spinors)
then
1223 write(aux,
'(a2,18x)')
'Sx'
1225 write(aux,
'(a2,18x)')
'Sy'
1228 write(aux,
'(a2,18x)')
'Sz'
1236 select case (st%d%ispin)
1253 type(
grid_t),
intent(in) :: gr
1255 type(
ions_t),
intent(in) :: ions
1256 real(real64),
intent(in) :: lmm_r
1257 integer,
intent(in) :: iter
1260 character(len=50) :: aux
1261 real(real64),
allocatable :: lmm(:,:)
1266 safe_allocate(lmm(1:3, 1:ions%natoms))
1269 if (st%system_grp%is_root())
then
1276 do ia = 1, ions%natoms
1277 if (st%d%ispin ==
spinors)
then
1278 write(aux,
'(a2,i2.2,16x)')
'mx', ia
1280 write(aux,
'(a2,i2.2,16x)')
'my', ia
1283 write(aux,
'(a2,i2.2,16x)')
'mz', ia
1292 do ia = 1, ions%natoms
1293 select case (st%d%ispin)
1301 safe_deallocate_a(lmm)
1309 type(c_ptr),
intent(inout) :: out_magnets
1310 class(
mesh_t),
intent(in) :: mesh
1312 type(
kick_t),
intent(in) :: kick
1313 integer,
intent(in) :: iter
1315 complex(real64),
allocatable :: tm(:,:)
1320 safe_allocate(tm(1:6,1:kick%nqvec))
1322 do iq = 1, kick%nqvec
1326 if (st%system_grp%is_root())
then
1352 do iq = 1, kick%nqvec
1361 safe_deallocate_a(tm)
1375 subroutine td_write_angular(out_angular, namespace, space, gr, ions, hm, st, kick, iter)
1376 type(c_ptr),
intent(inout) :: out_angular
1378 class(
space_t),
intent(in) :: space
1379 type(
grid_t),
intent(in) :: gr
1380 type(
ions_t),
intent(inout) :: ions
1383 type(
kick_t),
intent(in) :: kick
1384 integer,
intent(in) :: iter
1387 character(len=130) :: aux
1388 real(real64) :: angular(3)
1395 call angular_momentum%setup_dir(idir)
1398 m_two*real(angular_momentum%zstates_elec_expectation_value(namespace, space, gr, hm, st), real64)
1400 safe_deallocate_p(angular_momentum)
1402 if (st%system_grp%is_root())
then
1407 write(aux,
'(a15,i2)')
'# nspin ', st%d%nspin
1415 write(aux,
'(a4,18x)')
'<Lx>'
1417 write(aux,
'(a4,18x)')
'<Ly>'
1419 write(aux,
'(a4,18x)')
'<Lz>'
1448 class(
space_t),
intent(in) :: space
1449 type(
grid_t),
intent(in) :: gr
1450 type(
ions_t),
intent(in) :: ions
1452 integer,
intent(in) :: lmax
1453 type(
kick_t),
intent(in) :: kick
1454 integer,
intent(in) :: iter
1457 real(real64),
allocatable :: rho(:,:)
1461 if (out_multip%resolve_states)
then
1462 safe_allocate(rho(1:gr%np_part, 1:st%d%nspin))
1465 do ist = st%st_start, st%st_end
1467 call td_write_multipole_r(out_multip%mult_handles(ist), space, gr, ions, st, lmax, kick, rho, iter, &
1468 mpi_grp = out_multip%mpi_grp)
1471 safe_deallocate_a(rho)
1474 if (
allocated(st%frozen_rho))
then
1475 safe_allocate(rho(1:gr%np, 1:st%d%nspin))
1476 call lalg_copy(gr%np, st%d%nspin, st%rho, rho)
1481 safe_deallocate_a(rho)
1493 subroutine td_write_multipole_r(out_multip, space, mesh, ions, st, lmax, kick, rho, iter, mpi_grp)
1494 type(c_ptr),
intent(inout) :: out_multip
1495 class(
space_t),
intent(in) :: space
1496 class(
mesh_t),
intent(in) :: mesh
1497 type(
ions_t),
intent(in) :: ions
1499 integer,
intent(in) :: lmax
1500 type(
kick_t),
intent(in) :: kick
1501 real(real64),
intent(in) :: rho(:,:)
1502 integer,
intent(in) :: iter
1503 type(
mpi_grp_t),
optional,
intent(in) :: mpi_grp
1506 integer :: is, idir, ll, mm, add_lm
1507 character(len=120) :: aux
1508 real(real64) :: ionic_dipole(ions%space%dim)
1509 real(real64),
allocatable :: multipole(:,:)
1515 assert(.not. (lmax > 1 .and. space%dim > 3))
1517 mpi_grp_ = st%system_grp
1518 if (
present(mpi_grp)) mpi_grp_ = mpi_grp
1520 if (mpi_grp_%is_root().and.iter == 0)
then
1523 write(aux,
'(a15,i2)')
'# nspin ', st%d%nspin
1527 write(aux,
'(a15,i2)')
'# lmax ', lmax
1535 do is = 1, st%d%nspin
1536 write(aux,
'(a18,i1,a1)')
'Electronic charge(', is,
')'
1539 do idir = 1, space%dim
1540 write(aux,
'(4a1,i1,a1)')
'<',
index2axis(idir),
'>',
'(', is,
')'
1546 write(aux,
'(a2,i2,a4,i2,a2,i1,a1)')
'l=', ll,
', m=', mm,
' (', is,
')'
1557 do is = 1, st%d%nspin
1560 do idir = 1, space%dim
1576 if (space%dim > 3 .and. lmax == 1)
then
1578 safe_allocate(multipole(1:space%dim+1, 1:st%d%nspin))
1580 safe_allocate(multipole(1:(lmax + 1)**2, 1:st%d%nspin))
1584 do is = 1, st%d%nspin
1589 ionic_dipole = ions%dipole()
1590 do is = 1, st%d%nspin
1591 multipole(2:space%dim+1, is) = -ionic_dipole(1:space%dim)/st%d%nspin - multipole(2:space%dim+1, is)
1595 if (mpi_grp_%is_root())
then
1597 do is = 1, st%d%nspin
1600 do idir = 1, space%dim
1604 add_lm = space%dim + 2
1615 safe_deallocate_a(multipole)
1620 subroutine td_write_ftchd(out_ftchd, space, mesh, st, kick, iter)
1621 type(c_ptr),
intent(inout) :: out_ftchd
1622 class(
space_t),
intent(in) :: space
1623 class(
mesh_t),
intent(in) :: mesh
1625 type(
kick_t),
intent(in) :: kick
1626 integer,
intent(in) :: iter
1628 integer :: is, ip, idir
1629 character(len=120) :: aux, aux2
1630 real(real64) :: ftchd_bessel
1631 complex(real64) :: ftchd
1633 real(real64),
allocatable :: integrand_bessel(:)
1634 complex(real64),
allocatable :: integrand(:)
1638 if (st%system_grp%is_root().and.iter == 0)
then
1641 write(aux,
'(a15, i2)')
'# qkickmode ', kick%qkick_mode
1646 write(aux,
'(a15, i0.3, 1x, i0.3)')
'# ll, mm ', kick%qbessel_l, kick%qbessel_m
1652 write(aux,
'(a15, f9.6)')
'# qlength ', kick%qlength
1654 write(aux,
'(a15)')
'# qvector '
1655 do idir = 1, space%dim
1656 write(aux2,
'(f9.5)') kick%qvector(idir,1)
1657 aux = trim(aux) // trim(aux2)
1663 write(aux,
'(a15,f18.12)')
'# kick strength', kick%delta_strength
1669 write(aux,
'(a17)')
'int(j_l*Y_lm*rho)'
1671 write(aux,
'(a12)')
'Real, Imag'
1688 safe_allocate(integrand(1:mesh%np))
1690 do is = 1, st%d%nspin
1692 integrand(ip) = integrand(ip) + st%rho(ip, is) *
exp(-
m_zi*sum(mesh%x(1:space%dim, ip)*kick%qvector(1:space%dim, 1)))
1696 safe_deallocate_a(integrand)
1699 safe_allocate(integrand_bessel(1:mesh%np))
1700 integrand_bessel =
m_zero
1701 do is = 1, st%d%nspin
1703 call ylmr_real(mesh%x(1:3, ip), kick%qbessel_l, kick%qbessel_m, ylm)
1704 integrand_bessel(ip) = integrand_bessel(ip) + st%rho(ip, is) * &
1705 loct_sph_bessel(kick%qbessel_l, kick%qlength*norm2(mesh%x(:, ip)))*ylm
1709 safe_deallocate_a(integrand_bessel)
1712 if (st%system_grp%is_root())
then
1728 type(c_ptr),
intent(inout) :: out_temperature
1730 type(
ions_t),
intent(in) :: ions
1731 integer,
intent(in) :: iter
1733 if (.not. mpi_grp%is_root())
return
1766 type(c_ptr),
intent(inout) :: out_populations
1768 class(
space_t),
intent(in) :: space
1769 class(
mesh_t),
intent(in) :: mesh
1772 real(real64),
intent(in) :: dt
1773 integer,
intent(in) :: iter
1776 character(len=6) :: excited_name
1777 complex(real64) :: gsp
1778 complex(real64),
allocatable :: excited_state_p(:)
1779 complex(real64),
allocatable :: dotprodmatrix(:, :, :)
1784 safe_allocate(dotprodmatrix(1:writ%gs_st%nst, 1:st%nst, 1:st%nik))
1789 assert(.not. space%is_periodic())
1794 if (writ%n_excited_states > 0)
then
1795 safe_allocate(excited_state_p(1:writ%n_excited_states))
1796 do ist = 1, writ%n_excited_states
1797 excited_state_p(ist) =
zstates_elec_mpdotp(namespace, mesh, writ%excited_st(ist), st, dotprodmatrix)
1801 if (st%system_grp%is_root())
then
1809 do ist = 1, writ%n_excited_states
1810 write(excited_name,
'(a2,i3,a1)')
'P(', ist,
')'
1829 do ist = 1, writ%n_excited_states
1836 if (writ%n_excited_states > 0)
then
1837 safe_deallocate_a(excited_state_p)
1839 safe_deallocate_a(dotprodmatrix)
1845 subroutine td_write_acc(out_acc, namespace, space, gr, ions, st, hm, ext_partners, dt, iter)
1846 type(c_ptr),
intent(inout) :: out_acc
1848 class(
space_t),
intent(in) :: space
1849 type(
grid_t),
intent(in) :: gr
1850 type(
ions_t),
intent(inout) :: ions
1854 real(real64),
intent(in) :: dt
1855 integer,
intent(in) :: iter
1858 character(len=7) :: aux
1859 real(real64) :: acc(space%dim)
1863 if (iter == 0 .and. st%system_grp%is_root())
then
1868 do idim = 1, space%dim
1869 write(aux,
'(a4,i1,a1)')
'Acc(', idim,
')'
1877 do idim = 1, space%dim
1884 call td_calc_tacc(namespace, space, gr, ions, ext_partners, st, hm, acc, dt*iter)
1886 if (st%system_grp%is_root())
then
1897 subroutine td_write_vel(out_vel, namespace, gr, st, space, hm, ions, iter)
1898 type(c_ptr),
intent(inout) :: out_vel
1900 type(
grid_t),
intent(in) :: gr
1902 type(
space_t),
intent(in) :: space
1904 type(
ions_t),
intent(in) :: ions
1905 integer,
intent(in) :: iter
1908 character(len=7) :: aux
1909 real(real64) :: vel(space%dim)
1913 if (iter == 0 .and. st%system_grp%is_root())
then
1918 do idim = 1, space%dim
1919 write(aux,
'(a4,i1,a1)')
'Vel(', idim,
')'
1927 do idim = 1, space%dim
1934 call td_calc_tvel(namespace, gr, st, space, hm, ions, vel)
1936 if (st%system_grp%is_root())
then
1948 subroutine td_write_laser(out_laser, mpi_grp, space, lasers, dt, iter)
1949 type(c_ptr),
intent(inout) :: out_laser
1951 class(
space_t),
intent(in) :: space
1952 type(
lasers_t),
intent(inout) :: lasers
1953 real(real64),
intent(in) :: dt
1954 integer,
intent(in) :: iter
1957 real(real64) :: field(space%dim)
1958 real(real64) :: ndfield(space%dim)
1959 character(len=80) :: aux
1961 if (.not. mpi_grp%is_root())
return
1975 do il = 1, lasers%no_lasers
1978 do idir = 1, space%dim
1979 write(aux,
'(a,i1,a)')
'E(', idir,
')'
1983 do idir = 1, space%dim
1984 write(aux,
'(a,i1,a)')
'B(', idir,
')'
1988 do idir = 1, space%dim
1989 write(aux,
'(a,i1,a)')
'A(', idir,
')'
1993 write(aux,
'(a,i1,a)')
'e(t)'
1999 do idir = 1, space%dim
2000 write(aux,
'(a,i1,a)')
'A^M(', idir,
')'
2012 do il = 1, lasers%no_lasers
2016 do idir = 1, space%dim
2021 do idir = 1, space%dim
2032 do idir = 1, space%dim
2045 do il = 1, lasers%no_lasers
2047 call laser_field(lasers%lasers(il), field(1:space%dim), iter*dt)
2072 type(c_ptr),
intent(inout) :: out_energy
2075 integer,
intent(in) :: iter
2076 real(real64),
intent(in) :: ke
2080 integer :: n_columns
2082 if (.not. mpi_grp%is_root())
return
2103 if (hm%pcm%run_pcm)
then
2105 n_columns = n_columns + 1
2110 n_columns = n_columns + 1
2120 do ii = 1, n_columns
2143 hm%energy%int_nn_pcm + hm%energy%int_ne_pcm), 1)
2156 type(c_ptr),
intent(inout) :: out_eigs
2158 integer,
intent(in) :: iter
2161 character(len=68) :: buf
2165 if (.not. st%system_grp%is_root())
then
2174 write(buf,
'(a15,i2)')
'# nst ', st%nst
2178 write(buf,
'(a15,i2)')
'# nspin ', st%d%nspin
2184 do is = 1, st%d%kpt%nglobal
2186 write(buf,
'(a,i4)')
'Eigenvalue ',ii
2195 do is = 1, st%d%kpt%nglobal
2205 do is = 1, st%d%kpt%nglobal
2217 type(c_ptr),
intent(inout) :: out_ionch
2218 class(
mesh_t),
intent(in) :: mesh
2220 integer,
intent(in) :: iter
2222 integer :: ii, ist, Nch, ik, idim
2223 character(len=68) :: buf
2224 real(real64),
allocatable :: ch(:), occ(:)
2225 real(real64),
allocatable :: occbuf(:)
2230 nch = st%nst * st%d%kpt%nglobal * st%d%dim
2231 safe_allocate(ch(0: nch))
2232 safe_allocate(occ(0: nch))
2238 do idim = 1, st%d%dim
2239 if (st%st_start <= ist .and. ist <= st%st_end .and. &
2240 st%d%kpt%start <= ik .and. ik <= st%d%kpt%end)
then
2241 occ(ii) = st%occ(ist, ik)
2249 if (st%parallel_in_states)
then
2250 safe_allocate(occbuf(0: nch))
2252 call st%mpi_grp%allreduce(occ(0), occbuf(0), nch+1, mpi_double_precision, mpi_sum)
2254 safe_deallocate_a(occbuf)
2261 if (.not. st%system_grp%is_root())
then
2262 safe_deallocate_a(ch)
2275 if (occ(ii)>
m_zero .or. ii == 0)
then
2276 write(buf,
'(a,f4.1,a)')
'Pion(',occ(ii)*ii,
'+, t)'
2286 if (occ(ii)>
m_zero .or. ii == 0)
then
2296 if (occ(ii)>
m_zero .or. ii == 0)
then
2302 safe_deallocate_a(ch)
2303 safe_deallocate_a(occ)
2309 subroutine td_write_proj(out_proj, space, mesh, ions, st, gs_st, kick, iter)
2310 type(c_ptr),
intent(inout) :: out_proj
2312 class(
mesh_t),
intent(in) :: mesh
2313 type(
ions_t),
intent(in) :: ions
2316 type(
kick_t),
intent(in) :: kick
2317 integer,
intent(in) :: iter
2319 complex(real64),
allocatable :: projections(:,:,:)
2320 character(len=80) :: aux
2321 integer :: ik, ist, uist, idir
2326 if (st%system_grp%is_root())
then
2329 write(aux,
'(a15,i2)')
'# nspin ', st%d%nspin
2338 write(aux,
'(a,i8)')
"# nik ", st%nik
2342 write(aux,
'(a,2i8)')
"# st ", gs_st%st_start, st%nst
2346 write(aux,
'(a,2i8)')
"# ust ", gs_st%st_start, gs_st%st_end
2352 do ist = gs_st%st_start, st%nst
2360 do ist = gs_st%st_start, st%nst
2361 do uist = gs_st%st_start, gs_st%st_end
2362 write(aux,
'(i4,a,i4)') ist,
' -> ', uist
2373 if (.not. space%is_periodic())
then
2375 safe_allocate(projections(1:st%nst, gs_st%st_start:gs_st%st_end, 1:st%nik))
2376 do idir = 1, space%dim
2381 if (st%system_grp%is_root())
then
2382 write(aux,
'(a,i1,a)')
"<i|x_", idir,
"|a>"
2386 do ist = gs_st%st_start, st%st_end
2387 do uist = gs_st%st_start, gs_st%st_end
2397 safe_deallocate_a(projections)
2401 if (st%system_grp%is_root())
then
2407 safe_allocate(projections(1:st%nst, gs_st%st_start:gs_st%st_end, 1:st%nik))
2408 projections(:,:,:) =
m_z0
2411 if (st%system_grp%is_root())
then
2414 do ist = gs_st%st_start, st%nst
2415 do uist = gs_st%st_start, gs_st%st_end
2424 safe_deallocate_a(projections)
2430 integer,
intent(in) :: dir
2432 integer :: uist, ist, ik, idim
2433 real(real64) :: n_dip(space%dim)
2434 complex(real64),
allocatable :: xpsi(:,:)
2435 complex(real64),
allocatable :: psi(:, :), gspsi(:, :)
2439 safe_allocate(psi(1:mesh%np, 1:st%d%dim))
2440 safe_allocate(gspsi(1:mesh%np, 1:st%d%dim))
2441 safe_allocate(xpsi(1:mesh%np, 1:st%d%dim))
2443 do ik = st%d%kpt%start, st%d%kpt%end
2444 do ist = st%st_start, st%st_end
2446 do uist = gs_st%st_start, gs_st%st_end
2449 do idim = 1, st%d%dim
2450 xpsi(1:mesh%np, idim) = mesh%x_t(1:mesh%np, dir)*gspsi(1:mesh%np, idim)
2452 projections(ist, uist, ik) = -
zmf_dotp(mesh, st%d%dim, psi, xpsi, reduce = .false.)
2458 safe_deallocate_a(xpsi)
2459 safe_deallocate_a(gspsi)
2460 safe_deallocate_a(psi)
2465 n_dip = ions%dipole()
2467 do ist = gs_st%st_start, st%nst
2468 do uist = gs_st%st_start, gs_st%st_end
2469 projections(ist, uist, ik) = projections(ist, uist, ik) - n_dip(dir)
2485 subroutine td_write_n_ex(out_nex, outp, namespace, mesh, kpoints, st, gs_st, iter)
2486 type(c_ptr),
intent(inout) :: out_nex
2489 class(
mesh_t),
intent(in) :: mesh
2493 integer,
intent(in) :: iter
2495 complex(real64),
allocatable :: projections(:,:)
2496 character(len=80) :: aux, dir
2497 integer :: ik, ikpt, ist, uist, err
2498 real(real64) :: Nex, weight
2500 real(real64),
allocatable :: Nex_kpt(:)
2506 if (st%system_grp%is_root())
then
2509 write(aux,
'(a15,i2)')
'# nspin ', st%d%nspin
2516 write(aux,
'(a,i8)')
"# nik ", st%nik
2520 write(aux,
'(a,2i8)')
"# st ", gs_st%st_start, st%nst
2524 write(aux,
'(a,2i8)')
"# ust ", gs_st%st_start, gs_st%st_end
2534 if (st%system_grp%is_root())
then
2543 do ist = 1, gs_st%nst
2544 if (gs_st%occ(ist, ik) >
m_min_occ .and. ist > gs_nst) gs_nst = ist
2548 safe_allocate(projections(1:gs_nst, 1:st%nst))
2550 safe_allocate(nex_kpt(1:st%nik))
2552 do ik = st%d%kpt%start, st%d%kpt%end
2553 ikpt = st%d%get_kpoint_index(ik)
2556 weight = st%kweights(ik) * gs_st%occ(ist, ik)/ st%smear%el_per_state
2557 do uist = st%st_start, st%st_end
2558 nex_kpt(ikpt) = nex_kpt(ikpt) - weight * st%occ(uist, ik) * abs(projections(ist, uist))**2
2561 nex_kpt(ikpt) = nex_kpt(ikpt) + sum(st%occ(st%st_start:st%st_end, ik))*st%kweights(ik)
2564 if (st%parallel_in_states .or. st%d%kpt%parallel)
then
2570 if (st%system_grp%is_root())
then
2576 write(dir,
'(a,a,i7.7)') trim(outp%iter_dir),
"td.", iter
2579 + outp%how(option__output__density_kpt), dir,
"n_excited_el_kpt", namespace, &
2583 safe_deallocate_a(projections)
2584 safe_deallocate_a(nex_kpt)
2596 class(
mesh_t),
intent(in) :: mesh
2599 complex(real64),
intent(inout) :: projections(1:st%nst, gs_st%st_start:gs_st%nst, 1:st%nik)
2601 integer :: uist, ist, ik
2602 complex(real64),
allocatable :: psi(:, :), gspsi(:, :)
2605 safe_allocate(psi(1:mesh%np, 1:st%d%dim))
2606 safe_allocate(gspsi(1:mesh%np, 1:st%d%dim))
2608 projections(:,:,:) =
m_zero
2610 do ik = st%d%kpt%start, st%d%kpt%end
2611 do ist = st%st_start, st%st_end
2613 do uist = gs_st%st_start, gs_st%nst
2615 projections(ist, uist, ik) =
zmf_dotp(mesh, st%d%dim, psi, gspsi, reduce = .false.)
2620 safe_deallocate_a(psi)
2621 safe_deallocate_a(gspsi)
2630 class(
mesh_t),
intent(in) :: mesh
2635 integer,
intent(in) :: iter
2637 complex(real64),
allocatable :: proj(:,:), psi(:,:,:), gs_psi(:,:,:), temp_state(:,:)
2638 character(len=80) :: filename1, filename2
2639 integer :: ik,ist, jst, file, idim, nk_proj
2643 write(filename1,
'(I10)') iter
2644 filename1 =
'td.general/projections_iter_'//trim(adjustl(filename1))
2647 safe_allocate(proj(1:gs_st%nst, 1:gs_st%nst))
2648 safe_allocate(psi(1:gs_st%nst,1:gs_st%d%dim,1:mesh%np))
2649 safe_allocate(gs_psi(1:gs_st%nst,1:gs_st%d%dim,1:mesh%np))
2650 safe_allocate(temp_state(1:mesh%np,1:gs_st%d%dim))
2656 nk_proj = kpoints%nik_skip
2658 do ik = kpoints%reduced%npoints-nk_proj+1, kpoints%reduced%npoints
2660 psi(1:gs_st%nst, 1:gs_st%d%dim, 1:mesh%np)=
m_zero
2661 gs_psi(1:gs_st%nst, 1:gs_st%d%dim, 1:mesh%np)=
m_zero
2663 if (st%system_grp%is_root())
then
2664 write(filename2,
'(I10)') ik
2665 filename2 = trim(adjustl(filename1))//
'_ik_'//trim(adjustl(filename2))
2666 file =
io_open(filename2, namespace, action=
'write')
2669 do ist=gs_st%st_start,gs_st%st_end
2672 do idim = 1,gs_st%d%dim
2673 psi(ist,idim,1:mesh%np) = temp_state(1:mesh%np,idim)
2676 do idim = 1,gs_st%d%dim
2677 gs_psi(ist,idim,1:mesh%np) = temp_state(1:mesh%np,idim)
2686 assert(mesh%np_global*gs_st%d%dim < huge(0_int32))
2687 proj(1:gs_st%nst, 1:gs_st%nst) =
m_zero
2692 i8_to_i4(mesh%np_global*gs_st%d%dim), &
2693 cmplx(mesh%volume_element,
m_zero, real64) , &
2695 ubound(psi, dim = 1), &
2697 ubound(gs_psi, dim = 1), &
2700 ubound(proj, dim = 1))
2703 if (st%system_grp%is_root())
then
2704 do ist = 1, gs_st%nst
2705 do jst = 1, gs_st%nst
2706 write(file,
'(I3,1x,I3,1x,e13.6,1x,e13.6,2x)') ist, jst, proj(ist,jst)
2714 safe_deallocate_a(proj)
2715 safe_deallocate_a(psi)
2716 safe_deallocate_a(gs_psi)
2717 safe_deallocate_a(temp_state)
2723 subroutine td_write_floquet(namespace, space, hm, ext_partners, gr, st, iter)
2724 type(namespace_t),
intent(in) :: namespace
2725 class(space_t),
intent(in) :: space
2726 type(hamiltonian_elec_t),
intent(inout) :: hm
2727 type(partner_list_t),
intent(in) :: ext_partners
2728 type(grid_t),
intent(in) :: gr
2729 type(states_elec_t),
intent(inout) :: st
2730 integer,
intent(in) :: iter
2732 complex(real64),
allocatable :: hmss(:,:), psi(:,:,:), hpsi(:,:,:), temp_state1(:,:)
2733 complex(real64),
allocatable :: HFloquet(:,:,:), HFloq_eff(:,:), temp(:,:)
2734 real(real64),
allocatable :: eigenval(:), bands(:,:)
2735 character(len=80) :: filename
2736 integer :: it, nT, ik, ist, in, im, file, idim, nik, ik_count
2737 integer :: Forder, Fdim, m0, n0, n1, nst, ii, jj, lim_nst
2738 logical :: downfolding
2739 type(states_elec_t) :: hm_st
2741 real(real64) :: dt, Tcycle, omega
2745 downfolding = .false.
2748 if (.not. iter == 0)
then
2756 assert(gr%np == gr%np_global)
2759 call states_elec_copy(hm_st, st)
2770 call parse_variable(namespace,
'TDFloquetFrequency', m_zero, omega, units_inp%energy)
2771 call messages_print_var_value(
'Frequency used for Floquet analysis', omega, namespace=namespace)
2772 if (abs(omega) <= m_epsilon)
then
2773 message(1) =
"Please give a non-zero value for TDFloquetFrequency"
2774 call messages_fatal(1, namespace=namespace)
2778 tcycle = m_two * m_pi / omega
2788 call parse_variable(namespace,
'TDFloquetSample',20 ,nt)
2789 call messages_print_var_value(
'Number of Floquet time-sampling points', nt, namespace=namespace)
2790 dt = tcycle/real(nt, real64)
2799 call parse_variable(namespace,
'TDFloquetDimension',-1,forder)
2800 if (forder .ge. 0)
then
2801 call messages_print_var_value(
'Order of multiphoton Floquet-Hamiltonian', forder, namespace=namespace)
2803 fdim = 2 * forder + 1
2805 message(1) =
'Floquet-Hamiltonian is downfolded'
2806 call messages_info(1, namespace=namespace)
2807 downfolding = .
true.
2812 dt = tcycle/real(nt, real64)
2815 nik = hm%kpoints%nik_skip
2817 safe_allocate(hmss(1:nst,1:nst))
2818 safe_allocate( psi(1:nst,1:st%d%dim,1:gr%np))
2819 safe_allocate(hpsi(1:nst,1:st%d%dim,1:gr%np))
2820 safe_allocate(temp_state1(1:gr%np,1:st%d%dim))
2828 safe_allocate(hfloquet(1:nik,1:nst*fdim, 1:nst*fdim))
2829 hfloquet(1:nik,1:nst*fdim, 1:nst*fdim) = m_zero
2834 call hm%update(gr, namespace, space, ext_partners, time=tcycle+it*dt)
2836 call zhamiltonian_elec_apply_all(hm, namespace, gr, st, hm_st)
2841 do ik = hm%kpoints%reduced%npoints-nik+1, hm%kpoints%reduced%npoints
2842 ik_count = ik_count + 1
2844 psi(1:nst, 1:st%d%dim, 1:gr%np)= m_zero
2845 hpsi(1:nst, 1:st%d%dim, 1:gr%np)= m_zero
2847 do ist = st%st_start, st%st_end
2848 if (state_kpt_is_local(st, ist, ik))
then
2849 call states_elec_get_state(st, gr, ist, ik,temp_state1)
2850 do idim = 1, st%d%dim
2851 psi(ist, idim, 1:gr%np) = temp_state1(1:gr%np, idim)
2853 call states_elec_get_state(hm_st, gr, ist, ik,temp_state1)
2854 do idim = 1, st%d%dim
2855 hpsi(ist, idim, 1:gr%np) = temp_state1(1:gr%np, idim)
2859 call comm_allreduce(st%system_grp, psi)
2860 call comm_allreduce(st%system_grp, hpsi)
2861 assert(gr%np_global*st%d%dim < huge(0_int32))
2862 hmss(1:nst,1:nst) = m_zero
2867 i8_to_i4(gr%np_global*st%d%dim), &
2868 cmplx(gr%volume_element, m_zero, real64) , &
2870 ubound(hpsi, dim = 1), &
2872 ubound(psi, dim = 1), &
2875 ubound(hmss, dim = 1))
2877 hmss(1:nst,1:nst) = conjg(hmss(1:nst,1:nst))
2880 do in = -forder, forder
2881 do im = -forder, forder
2882 ii = (in+forder) * nst
2883 jj = (im+forder) * nst
2884 hfloquet(ik_count, ii+1:ii+nst, jj+1:jj+nst) = &
2885 hfloquet(ik_count, ii+1:ii+nst, jj+1:jj+nst) + hmss(1:nst, 1:nst) *
exp(-(in-im)*m_zi*omega*it*dt)
2889 hfloquet(ik_count, ii+ist, ii+ist) = hfloquet(ik_count, ii+ist, ii+ist) + in*omega
2898 hfloquet(:,:,:) = m_one/nt*hfloquet(:,:,:)
2901 if (downfolding)
then
2903 safe_allocate(hfloq_eff(1:nst,1:nst))
2904 safe_allocate(eigenval(1:nst))
2905 safe_allocate(bands(1:nik,1:nst))
2907 hfloq_eff(1:nst,1:nst) = m_zero
2913 hfloq_eff(1:nst, 1:nst) = hfloquet(ik, n0+1:n0+nst, m0+1:m0+nst) + &
2914 m_one/omega*(matmul(hfloquet(ik, 1:nst, m0+1:m0+nst), hfloquet(ik, n1+1:n1+nst, m0+1:m0+nst))- &
2915 matmul(hfloquet(ik, n1+1:n1+nst, m0+1:m0+nst), hfloquet(ik, 1:nst, m0+1:m0+nst)))
2917 call lalg_eigensolve(nst, hfloq_eff, eigenval)
2918 bands(ik,1:nst) = eigenval(1:nst)
2920 safe_deallocate_a(hfloq_eff)
2923 safe_allocate(eigenval(1:nst*fdim))
2924 safe_allocate(bands(1:nik,1:nst*fdim))
2925 safe_allocate(temp(1:nst*fdim, 1:nst*fdim))
2928 temp(1:nst*fdim, 1:nst*fdim) = hfloquet(ik, 1:nst*fdim, 1:nst*fdim)
2929 call lalg_eigensolve(nst*fdim, temp, eigenval)
2930 bands(ik, 1:nst*fdim) = eigenval(1:nst*fdim)
2935 if (downfolding)
then
2937 filename =
"downfolded_floquet_bands"
2940 filename =
"floquet_bands"
2943 if (st%system_grp%is_root())
then
2945 file = io_open(filename, namespace, action =
'write')
2948 write(file,
'(e13.6, 1x)',advance=
'no') bands(ik,ist)
2955 if (.not. downfolding)
then
2958 bands(1:nik, 1:nst*fdim) = m_zero
2960 temp(1:nst*fdim,1:nst*fdim) = m_zero
2963 temp(ii+1:ii+nst, ii+1:ii+nst) = hfloquet(ik, ii+1:ii+nst, ii+1:ii+nst)
2965 call lalg_eigensolve(nst*fdim, temp, eigenval)
2966 bands(ik, 1:nst*fdim) = eigenval(1:nst*fdim)
2969 if (st%system_grp%is_root())
then
2970 filename =
'trivial_floquet_bands'
2971 file = io_open(filename, namespace, action =
'write')
2974 write(file,
'(e13.6, 1x)', advance=
'no') bands(ik,ist)
2983 call hm%update(gr, namespace, space, ext_partners, time=m_zero)
2985 safe_deallocate_a(hmss)
2986 safe_deallocate_a(psi)
2987 safe_deallocate_a(hpsi)
2988 safe_deallocate_a(temp_state1)
2989 safe_deallocate_a(hfloquet)
2990 safe_deallocate_a(eigenval)
2991 safe_deallocate_a(bands)
2992 safe_deallocate_a(temp)
3000 type(c_ptr),
intent(inout) :: out_total_current
3001 class(space_t),
intent(in) :: space
3002 class(mesh_t),
intent(in) :: mesh
3003 type(states_elec_t),
intent(in) :: st
3004 integer,
intent(in) :: iter
3006 integer :: idir, ispin
3007 character(len=50) :: aux
3008 real(real64) :: total_current(space%dim), abs_current(space%dim)
3012 if (st%system_grp%is_root() .and. iter == 0)
then
3013 call td_write_print_header_init(out_total_current)
3016 call write_iter_header_start(out_total_current)
3018 do idir = 1, space%dim
3019 write(aux,
'(a2,a1,a1)')
'I(', index2axis(idir),
')'
3020 call write_iter_header(out_total_current, aux)
3023 do idir = 1, space%dim
3024 write(aux,
'(a10,a1,a1)')
'IntAbs(j)(', index2axis(idir),
')'
3025 call write_iter_header(out_total_current, aux)
3028 do ispin = 1, st%d%nspin
3029 do idir = 1, space%dim
3030 write(aux,
'(a4,i1,a1,a1,a1)')
'I-sp', ispin,
'(', index2axis(idir),
')'
3031 call write_iter_header(out_total_current, aux)
3035 call write_iter_nl(out_total_current)
3037 call td_write_print_header_end(out_total_current)
3040 assert(
allocated(st%current))
3042 if (st%system_grp%is_root())
then
3043 call write_iter_start(out_total_current)
3046 total_current = 0.0_real64
3047 do idir = 1, space%dim
3048 do ispin = 1, st%d%spin_channels
3049 total_current(idir) = total_current(idir) + dmf_integrate(mesh, st%current(:, idir, ispin), reduce = .false.)
3051 total_current(idir) = units_from_atomic(units_out%length/units_out%time, total_current(idir))
3053 call mesh%allreduce(total_current, dim = space%dim)
3055 abs_current = 0.0_real64
3056 do idir = 1, space%dim
3057 do ispin = 1, st%d%spin_channels
3058 abs_current(idir) = abs_current(idir) + dmf_integrate(mesh, abs(st%current(:, idir, ispin)), reduce = .false.)
3060 abs_current(idir) = units_from_atomic(units_out%length/units_out%time, abs_current(idir))
3062 call mesh%allreduce(abs_current, dim = space%dim)
3064 if (st%system_grp%is_root())
then
3065 call write_iter_double(out_total_current, total_current, space%dim)
3066 call write_iter_double(out_total_current, abs_current, space%dim)
3069 do ispin = 1, st%d%nspin
3070 total_current = units_from_atomic(units_out%length/units_out%time, dmf_integrate(mesh, space%dim, st%current(:, :, ispin)))
3072 if (st%system_grp%is_root())
then
3073 call write_iter_double(out_total_current, total_current, space%dim)
3077 if (st%system_grp%is_root())
then
3078 call write_iter_nl(out_total_current)
3086 type(c_ptr),
intent(inout) :: out_ionic_current
3087 class(space_t),
intent(in) :: space
3088 class(ions_t),
intent(in) :: ions
3089 integer,
intent(in) :: iter
3092 character(len=50) :: aux
3093 real(real64) :: ionic_current(space%dim), abs_current(space%dim)
3097 if (ions%grp%is_root() .and. iter == 0)
then
3098 call td_write_print_header_init(out_ionic_current)
3101 call write_iter_header_start(out_ionic_current)
3103 do idir = 1, space%dim
3104 write(aux,
'(a2,a1,a1)')
'I(', index2axis(idir),
')'
3105 call write_iter_header(out_ionic_current, aux)
3108 do idir = 1, space%dim
3109 write(aux,
'(a10,a1,a1)')
'IntAbs(j)(', index2axis(idir),
')'
3110 call write_iter_header(out_ionic_current, aux)
3113 call write_iter_nl(out_ionic_current)
3115 call td_write_print_header_end(out_ionic_current)
3118 ionic_current = ions%current()
3119 abs_current = ions%abs_current()
3121 if (ions%grp%is_root())
then
3122 call write_iter_start(out_ionic_current)
3124 call write_iter_double(out_ionic_current, ionic_current, space%dim)
3125 call write_iter_double(out_ionic_current, abs_current, space%dim)
3127 call write_iter_nl(out_ionic_current)
3137 type(c_ptr),
intent(inout) :: write_obj
3138 class(space_t),
intent(in) :: space
3139 type(hamiltonian_elec_t),
intent(inout) :: hm
3140 type(grid_t),
intent(in) :: gr
3141 type(states_elec_t),
intent(in) :: st
3142 integer,
intent(in) :: iter
3144 integer :: idir, ispin
3145 character(len=50) :: aux
3146 real(real64),
allocatable :: heat_current(:, :, :)
3147 real(real64) :: total_current(space%dim)
3151 if (st%system_grp%is_root() .and. iter == 0)
then
3152 call td_write_print_header_init(write_obj)
3155 call write_iter_header_start(write_obj)
3157 do idir = 1, space%dim
3158 write(aux,
'(a2,i1,a1)')
'Jh(', idir,
')'
3159 call write_iter_header(write_obj, aux)
3162 call write_iter_nl(write_obj)
3164 call td_write_print_header_end(write_obj)
3167 safe_allocate(heat_current(1:gr%np, 1:space%dim, 1:st%d%nspin))
3169 call current_heat_calculate(space, gr%der, hm, st, heat_current)
3171 if (st%system_grp%is_root())
call write_iter_start(write_obj)
3173 total_current = 0.0_real64
3174 do idir = 1, space%dim
3175 do ispin = 1, st%d%spin_channels
3176 total_current(idir) = total_current(idir) + dmf_integrate(gr, heat_current(:, idir, ispin))
3178 total_current(idir) = units_from_atomic(units_out%energy*units_out%length/units_out%time, total_current(idir))
3181 safe_deallocate_a(heat_current)
3183 if (st%system_grp%is_root())
call write_iter_double(write_obj, total_current, space%dim)
3185 if (st%system_grp%is_root())
call write_iter_nl(write_obj)
3193 type(c_ptr),
intent(inout) :: out_partial_charges
3194 class(mesh_t),
intent(in) :: mesh
3195 type(states_elec_t),
intent(in) :: st
3196 type(ions_t),
intent(in) :: ions
3197 integer,
intent(in) :: iter
3200 character(len=50) :: aux
3201 real(real64),
allocatable :: hirshfeld_charges(:)
3205 safe_allocate(hirshfeld_charges(1:ions%natoms))
3207 call partial_charges_calculate(mesh, st, ions, hirshfeld_charges)
3209 if (st%system_grp%is_root())
then
3213 call td_write_print_header_init(out_partial_charges)
3216 call write_iter_header_start(out_partial_charges)
3218 do idir = 1, ions%natoms
3219 write(aux,
'(a13,i3,a1)')
'hirshfeld(atom=', idir,
')'
3220 call write_iter_header(out_partial_charges, aux)
3223 call write_iter_nl(out_partial_charges)
3225 call td_write_print_header_end(out_partial_charges)
3228 call write_iter_start(out_partial_charges)
3230 call write_iter_double(out_partial_charges, hirshfeld_charges, ions%natoms)
3232 call write_iter_nl(out_partial_charges)
3235 safe_deallocate_a(hirshfeld_charges)
3241 subroutine td_write_q(out_q, mpi_grp, space, ks, iter)
3242 type(c_ptr),
intent(inout) :: out_q
3243 type(mpi_grp_t),
intent(in) :: mpi_grp
3244 class(space_t),
intent(in) :: space
3245 type(v_ks_t),
intent(in) :: ks
3246 integer,
intent(in) :: iter
3249 character(len=50) :: aux
3253 if (mpi_grp%is_root())
then
3255 call td_write_print_header_init(out_q)
3256 call write_iter_header_start(out_q)
3257 do ii = 1, ks%pt%nmodes
3258 write(aux,
'(a1,i3,a3)')
'q', ii,
'(t)'
3259 call write_iter_header(out_q, aux)
3261 do ii = 1, ks%pt%nmodes
3262 write(aux,
'(a1,i3,a3)')
'p', ii,
'(t)'
3263 call write_iter_header(out_q, aux)
3265 do ii = 1, space%dim
3266 write(aux,
'(a3,i3,a3)')
'f_pt', ii,
'(t)'
3267 call write_iter_header(out_q, aux)
3269 call write_iter_nl(out_q)
3270 call td_write_print_header_end(out_q)
3273 call write_iter_start(out_q)
3274 call write_iter_double(out_q, ks%pt_mx%pt_q, ks%pt%nmodes)
3275 call write_iter_double(out_q, ks%pt_mx%pt_p, ks%pt%nmodes)
3276 call write_iter_double(out_q, ks%pt_mx%fmf, space%dim)
3277 call write_iter_nl(out_q)
3286 type(c_ptr),
intent(inout) :: out_mxll
3287 type(mpi_grp_t),
intent(in) :: mpi_grp
3288 class(space_t),
intent(in) :: space
3289 type(hamiltonian_elec_t),
intent(in) :: hm
3290 real(real64),
intent(in) :: dt
3291 integer,
intent(in) :: iter
3294 real(real64) :: field(space%dim)
3295 character(len=80) :: aux
3296 character(len=1) :: field_char
3300 if (.not. mpi_grp%is_root())
then
3306 call td_write_print_header_init(out_mxll)
3308 write(aux,
'(a7,e20.12,3a)')
'# dt = ', units_from_atomic(units_out%time, dt), &
3309 " [", trim(units_abbrev(units_out%time)),
"]"
3310 call write_iter_string(out_mxll, aux)
3311 call write_iter_nl(out_mxll)
3313 call write_iter_header_start(out_mxll)
3314 select case (hm%mxll%coupling_mode)
3315 case (length_gauge_dipole, multipolar_expansion)
3316 if (hm%mxll%add_electric_dip) field_char =
'E'
3317 if (hm%mxll%add_magnetic_dip) field_char =
'B'
3318 do idir = 1, space%dim
3319 write(aux,
'(a,i1,a)') field_char //
'(', idir,
')'
3320 call write_iter_header(out_mxll, aux)
3322 case (velocity_gauge_dipole)
3323 do idir = 1, space%dim
3324 write(aux,
'(a,i1,a)')
'A(', idir,
')'
3325 call write_iter_header(out_mxll, aux)
3328 call write_iter_nl(out_mxll)
3330 call write_iter_string(out_mxll,
'#[Iter n.]')
3331 call write_iter_header(out_mxll,
'[' // trim(units_abbrev(units_out%time)) //
']')
3335 select case (hm%mxll%coupling_mode)
3336 case (length_gauge_dipole, multipolar_expansion)
3337 if (hm%mxll%add_electric_dip) aux =
'[' // trim(units_abbrev(units_out%force)) //
']'
3338 if (hm%mxll%add_magnetic_dip) aux =
'[' // trim(units_abbrev(unit_one/units_out%length**2)) //
']'
3339 do idir = 1, space%dim
3340 call write_iter_header(out_mxll, aux)
3342 case (velocity_gauge_dipole)
3343 aux =
'[' // trim(units_abbrev(units_out%energy)) //
']'
3344 do idir = 1, space%dim
3345 call write_iter_header(out_mxll, aux)
3348 call write_iter_nl(out_mxll)
3349 call td_write_print_header_end(out_mxll)
3352 call write_iter_start(out_mxll)
3355 select case (hm%mxll%coupling_mode)
3356 case (length_gauge_dipole, multipolar_expansion)
3357 if (hm%mxll%add_electric_dip) field = units_from_atomic(units_out%force, hm%mxll%e_field_dip)
3358 if (hm%mxll%add_magnetic_dip) field = units_from_atomic(unit_one/units_out%length**2, hm%mxll%b_field_dip)
3359 call write_iter_double(out_mxll, field, space%dim)
3360 case (velocity_gauge_dipole)
3361 field = units_from_atomic(units_out%energy, hm%mxll%vec_pot_dip)
3362 call write_iter_double(out_mxll, field, space%dim)
3364 call write_iter_nl(out_mxll)
3372 type(c_ptr),
intent(inout) :: out_coords
3373 type(mpi_grp_t),
intent(in) :: mpi_grp
3374 type(lda_u_t),
intent(in) :: lda_u
3375 integer,
intent(in) :: iter
3378 character(len=50) :: aux
3380 if (.not. mpi_grp%is_root())
return
3385 call td_write_print_header_init(out_coords)
3388 call write_iter_header_start(out_coords)
3390 do ios = 1, lda_u%norbsets
3391 write(aux,
'(a2,i3,a1)')
'Ueff(', ios,
')'
3392 call write_iter_header(out_coords, aux)
3395 do ios = 1, lda_u%norbsets
3396 write(aux,
'(a2,i3,a1)')
'U(', ios,
')'
3397 call write_iter_header(out_coords, aux)
3400 do ios = 1, lda_u%norbsets
3401 write(aux,
'(a2,i3,a1)')
'J(', ios,
')'
3402 call write_iter_header(out_coords, aux)
3405 if (lda_u%intersite)
then
3406 do ios = 1, lda_u%norbsets
3407 do inn = 1, lda_u%orbsets(ios)%nneighbors
3408 write(aux,
'(a2,i3,a1,i3,a1)')
'V(', ios,
'-', inn,
')'
3409 call write_iter_header(out_coords, aux)
3415 call write_iter_nl(out_coords)
3418 call write_iter_string(out_coords,
'#[Iter n.]')
3419 call write_iter_header(out_coords,
'[' // trim(units_abbrev(units_out%time)) //
']')
3420 call write_iter_string(out_coords, &
3421 'Effective U ' // trim(units_abbrev(units_out%energy)) // &
3422 ', U in '// trim(units_abbrev(units_out%energy)) // &
3423 ', J in ' // trim(units_abbrev(units_out%energy)))
3424 call write_iter_nl(out_coords)
3426 call td_write_print_header_end(out_coords)
3429 call write_iter_start(out_coords)
3431 do ios = 1, lda_u%norbsets
3432 call write_iter_double(out_coords, units_from_atomic(units_out%energy, &
3433 lda_u%orbsets(ios)%Ueff), 1)
3436 do ios = 1, lda_u%norbsets
3437 call write_iter_double(out_coords, units_from_atomic(units_out%energy, &
3438 lda_u%orbsets(ios)%Ubar), 1)
3441 do ios = 1, lda_u%norbsets
3442 call write_iter_double(out_coords, units_from_atomic(units_out%energy, &
3443 lda_u%orbsets(ios)%Jbar), 1)
3446 if (lda_u%intersite)
then
3447 do ios = 1, lda_u%norbsets
3448 do inn = 1, lda_u%orbsets(ios)%nneighbors
3449 call write_iter_double(out_coords, units_from_atomic(units_out%energy, &
3450 lda_u%orbsets(ios)%V_ij(inn,0)), 1)
3455 call write_iter_nl(out_coords)
3462 type(c_ptr),
intent(inout) :: file_handle
3463 type(grid_t),
intent(in) :: grid
3464 type(kpoints_t),
intent(in) :: kpoints
3465 type(states_elec_t),
intent(in) :: st
3466 integer,
intent(in) :: iter
3468 integer :: ik_ispin, ist
3469 character(len=7) :: nkpt_str, nst_str
3470 character(len=7) :: ik_str, ist_str
3471 real(real64),
allocatable :: norm_ks(:, :)
3472 real(real64) :: n_electrons
3476 safe_allocate(norm_ks(1:st%nst, 1:st%nik))
3477 call states_elec_calc_norms(grid, kpoints, st, norm_ks)
3479 if (st%system_grp%is_root())
then
3482 call td_write_print_header_init(file_handle)
3485 write(nkpt_str,
'(I7)') st%nik
3486 write(nst_str,
'(I7)') st%nst
3487 call write_iter_string(file_handle,
'# Dimensions. (nstates, nkpt * nspin):')
3488 call write_iter_string(file_handle, trim(adjustl(nst_str)) //
' ' // trim(adjustl(nkpt_str)))
3489 call write_iter_nl(file_handle)
3492 call write_iter_string(file_handle,
'# Norm ordering: (istate, ikpoint_spin)')
3493 call write_iter_nl(file_handle)
3496 call write_iter_header_start(file_handle)
3497 call write_iter_header(file_handle,
'N_electrons')
3498 do ik_ispin = 1, st%nik
3500 write(ik_str,
'(I7)') ik_ispin
3501 write(ist_str,
'(I7)') ist
3502 call write_iter_header(file_handle, &
3503 'Norm (' // trim(ist_str) //
',' // trim(ik_str) //
')')
3506 call write_iter_nl(file_handle)
3507 call td_write_print_header_end(file_handle)
3510 n_electrons = sum(st%occ * norm_ks**2)
3513 call write_iter_start(file_handle)
3514 call write_iter_double(file_handle, n_electrons, 1)
3515 do ik_ispin = 1, st%nik
3516 call write_iter_double(file_handle, norm_ks(:, ik_ispin),
size(norm_ks, 1))
3518 call write_iter_nl(file_handle)
3522 safe_deallocate_a(norm_ks)
3531 type(c_ptr),
intent(inout) :: file_handle
3532 type(ions_t),
intent(in) :: ions
3533 integer,
intent(in) :: iter
3536 real(real64) :: tmp(3)
3538 if (.not. ions%grp%is_root())
return
3542 assert(ions%space%dim == 3)
3545 call td_write_print_header_init(file_handle)
3548 call write_iter_header_start(file_handle)
3550 call write_iter_string(file_handle,
'# Iter, a, b, c, volume, alpha, beta, gamma, ' &
3551 //
'a_x, a_y, a_z, b_x, b_y, b_z, c_x, c_y, c_z')
3554 call write_iter_string(file_handle,
'#[Iter n.]')
3555 call write_iter_header(file_handle,
'[' // trim(units_abbrev(units_out%time)) //
']')
3556 call write_iter_string(file_handle, &
3557 'Lengths in ' // trim(units_abbrev(units_out%length)) // &
3558 ', Volume in ' // trim(units_abbrev(units_out%length**3)) // &
3559 ', Angles in degree, Lattice vectors in '// trim(units_abbrev(units_out%length)))
3560 call write_iter_nl(file_handle)
3562 call td_write_print_header_end(file_handle)
3565 call write_iter_start(file_handle)
3569 tmp(idir) = units_from_atomic(units_out%length, norm2(ions%latt%rlattice(1:3, idir)))
3571 call write_iter_double(file_handle, tmp, 3)
3574 tmp(1) = units_from_atomic(units_out%length**3, ions%latt%rcell_volume)
3575 call write_iter_double(file_handle, tmp(1), 1)
3578 call write_iter_double(file_handle, ions%latt%alpha, 1)
3579 call write_iter_double(file_handle, ions%latt%beta, 1)
3580 call write_iter_double(file_handle, ions%latt%gamma, 1)
3584 tmp(1:3) = units_from_atomic(units_out%length, ions%latt%rlattice(:, idir))
3585 call write_iter_double(file_handle, tmp, 3)
3587 call write_iter_nl(file_handle)
3596 type(namespace_t),
intent(in) :: namespace
3597 integer,
intent(in) :: iter
3598 real(real64),
intent(in) :: dt
3599 type(mpi_grp_t),
intent(in) :: grp
3601 integer :: default, flags, iout, first
3656 call parse_variable(namespace,
'MaxwellTDOutput', default, flags)
3658 if (.not. varinfo_valid_option(
'MaxwellTDOutput', flags, is_flag = .
true.))
then
3659 call messages_input_error(namespace,
'MaxwellTDOutput')
3663 writ%out(iout)%write = (iand(flags, 2**(iout - 1)) /= 0)
3664 if (writ%out(iout)%write)
then
3665 writ%out(iout + 1)%write = .
true.
3666 writ%out(iout + 2)%write = .
true.
3671 writ%out(iout)%write = (iand(flags, 2**(iout - 1)) /= 0)
3680 writ%out(:)%mpi_grp = grp
3682 call io_mkdir(
'td.general', namespace)
3687 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/total_e_field_x", namespace)))
3689 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/total_e_field_y", namespace)))
3691 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/total_e_field_z", namespace)))
3697 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/total_b_field_x", namespace)))
3699 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/total_b_field_y", namespace)))
3701 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/total_b_field_z", namespace)))
3707 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/longitudinal_e_field_x", namespace)))
3709 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/longitudinal_e_field_y", namespace)))
3711 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/longitudinal_e_field_z", namespace)))
3717 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/longitudinal_b_field_x", namespace)))
3719 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/longitudinal_b_field_y", namespace)))
3721 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/longitudinal_b_field_z", namespace)))
3727 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/transverse_e_field_x", namespace)))
3729 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/transverse_e_field_y", namespace)))
3731 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/transverse_e_field_z", namespace)))
3737 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/transverse_b_field_x", namespace)))
3739 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/transverse_b_field_y", namespace)))
3741 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/transverse_b_field_z", namespace)))
3747 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/maxwell_energy", namespace)))
3752 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/electric_field_surface-x", namespace)))
3757 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/electric_field_surface-y", namespace)))
3762 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/electric_field_surface-z", namespace)))
3767 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/magnetic_field_surface-x", namespace)))
3772 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/magnetic_field_surface-y", namespace)))
3777 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/magnetic_field_surface-z", namespace)))
3793 if (writ%out(iout)%write)
call write_iter_end(writ%out(iout)%handle)
3801 subroutine td_write_mxll_iter(writ, space, gr, st, hm, helmholtz, dt, iter, namespace)
3803 class(space_t),
intent(in) :: space
3804 type(grid_t),
intent(inout) :: gr
3805 type(states_mxll_t),
intent(inout) :: st
3806 type(hamiltonian_mxll_t),
intent(inout) :: hm
3807 type(helmholtz_decomposition_t),
intent(inout) :: helmholtz
3808 real(real64),
intent(in) :: dt
3809 integer,
intent(in) :: iter
3810 type(namespace_t),
intent(in) :: namespace
3815 call profiling_in(
"TD_WRITE_ITER_MAXWELL")
3818 call helmholtz%get_trans_field(namespace, st%rs_state_trans, total_field=st%rs_state)
3819 call get_rs_state_at_point(st%selected_points_rs_state_trans(:,:), st%rs_state_trans, &
3820 st%selected_points_coordinate(:,:), st, gr)
3823 hm%energy%energy_trans = m_zero
3827 call helmholtz%get_long_field(namespace, st%rs_state_long, total_field=st%rs_state)
3828 call get_rs_state_at_point(st%selected_points_rs_state_long(:,:), st%rs_state_long, &
3829 st%selected_points_coordinate(:,:), st, gr)
3832 hm%energy%energy_long = m_zero
3925 call profiling_out(
"TD_WRITE_ITER_MAXWELL")
3934 type(mpi_grp_t),
intent(in) :: mpi_grp
3935 type(hamiltonian_mxll_t),
intent(in) :: hm
3936 integer,
intent(in) :: iter
3940 integer :: n_columns
3942 if (.not. mpi_grp%is_root())
return
3967 call write_iter_header(
out_maxwell_energy,
'[' // trim(units_abbrev(units_out%time)) //
']')
3969 do ii = 1, n_columns
3970 call write_iter_header(
out_maxwell_energy,
'[' // trim(units_abbrev(units_out%energy)) //
']')
3978 call write_iter_double(
out_maxwell_energy, units_from_atomic(units_out%energy, hm%energy%energy), 1)
3979 call write_iter_double(
out_maxwell_energy, units_from_atomic(units_out%energy, hm%energy%e_energy), 1)
3980 call write_iter_double(
out_maxwell_energy, units_from_atomic(units_out%energy, hm%energy%b_energy), 1)
3982 hm%energy%energy+hm%energy%boundaries), 1)
3983 call write_iter_double(
out_maxwell_energy, units_from_atomic(units_out%energy, hm%energy%boundaries), 1)
3984 call write_iter_double(
out_maxwell_energy, units_from_atomic(units_out%energy, hm%energy%energy_trans), 1)
3985 call write_iter_double(
out_maxwell_energy, units_from_atomic(units_out%energy, hm%energy%energy_long), 1)
3986 call write_iter_double(
out_maxwell_energy, units_from_atomic(units_out%energy, hm%energy%energy_plane_waves), 1)
3995 type(c_ptr),
intent(inout) :: out_field_surf
3996 type(states_mxll_t),
intent(in) :: st
3997 integer,
intent(in) :: dim
3998 integer,
intent(in) :: iter
4002 integer :: n_columns
4004 if (.not. st%system_grp%is_root())
return
4011 call td_write_print_header_init(out_field_surf)
4014 call write_iter_header_start(out_field_surf)
4015 call write_iter_header(out_field_surf,
'- x direction')
4016 call write_iter_header(out_field_surf,
'+ x direction')
4017 call write_iter_header(out_field_surf,
'- y direction')
4018 call write_iter_header(out_field_surf,
'+ y direction')
4019 call write_iter_header(out_field_surf,
'- z direction')
4020 call write_iter_header(out_field_surf,
'+ z direction')
4021 call write_iter_header(out_field_surf,
'- x dir. p. w.')
4022 call write_iter_header(out_field_surf,
'+ x dir. p. w.')
4023 call write_iter_header(out_field_surf,
'- y dir. p. w.')
4024 call write_iter_header(out_field_surf,
'+ y dir. p. w.')
4025 call write_iter_header(out_field_surf,
'- z dir. p. w.')
4026 call write_iter_header(out_field_surf,
'+ z dir. p. w.')
4028 call write_iter_nl(out_field_surf)
4031 call write_iter_string(out_field_surf,
'#[Iter n.]')
4032 call write_iter_header(out_field_surf,
'[' // trim(units_abbrev(units_out%time)) //
']')
4034 do ii = 1, n_columns
4035 call write_iter_header(out_field_surf,
'[' // trim(units_abbrev(units_out%energy/units_out%length)) //
']')
4037 call write_iter_nl(out_field_surf)
4039 call td_write_print_header_end(out_field_surf)
4042 call write_iter_start(out_field_surf)
4043 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
4044 st%electric_field_box_surface(1,1,dim)), 1)
4045 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
4046 st%electric_field_box_surface(2,1,dim)), 1)
4047 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
4048 st%electric_field_box_surface(1,2,dim)), 1)
4049 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
4050 st%electric_field_box_surface(2,2,dim)), 1)
4051 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
4052 st%electric_field_box_surface(1,3,dim)), 1)
4053 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
4054 st%electric_field_box_surface(2,3,dim)), 1)
4055 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
4056 st%electric_field_box_surface_plane_waves(1,1,dim)), 1)
4057 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
4058 st%electric_field_box_surface_plane_waves(2,1,dim)), 1)
4059 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
4060 st%electric_field_box_surface_plane_waves(1,2,dim)), 1)
4061 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
4062 st%electric_field_box_surface_plane_waves(2,2,dim)), 1)
4063 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
4064 st%electric_field_box_surface_plane_waves(1,3,dim)), 1)
4065 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
4066 st%electric_field_box_surface_plane_waves(2,3,dim)), 1)
4067 call write_iter_nl(out_field_surf)
4075 type(c_ptr),
intent(inout) :: out_field_surf
4076 type(states_mxll_t),
intent(in) :: st
4077 integer,
intent(in) :: dim
4078 integer,
intent(in) :: iter
4082 integer :: n_columns
4084 if (.not. st%system_grp%is_root())
return
4091 call td_write_print_header_init(out_field_surf)
4094 call write_iter_header_start(out_field_surf)
4095 call write_iter_header(out_field_surf,
'- x direction')
4096 call write_iter_header(out_field_surf,
'+ x direction')
4097 call write_iter_header(out_field_surf,
'- y direction')
4098 call write_iter_header(out_field_surf,
'+ y direction')
4099 call write_iter_header(out_field_surf,
'- z direction')
4100 call write_iter_header(out_field_surf,
'+ z direction')
4101 call write_iter_header(out_field_surf,
'- x dir. p. w.')
4102 call write_iter_header(out_field_surf,
'+ x dir. p. w.')
4103 call write_iter_header(out_field_surf,
'- y dir. p. w.')
4104 call write_iter_header(out_field_surf,
'+ y dir. p. w.')
4105 call write_iter_header(out_field_surf,
'- z dir. p. w.')
4106 call write_iter_header(out_field_surf,
'+ z dir. p. w.')
4108 call write_iter_nl(out_field_surf)
4111 call write_iter_string(out_field_surf,
'#[Iter n.]')
4112 call write_iter_header(out_field_surf,
'[' // trim(units_abbrev(units_out%time)) //
']')
4114 do ii = 1, n_columns
4115 call write_iter_header(out_field_surf,
'[' // trim(units_abbrev(unit_one/units_out%length**2)) //
']')
4117 call write_iter_nl(out_field_surf)
4119 call td_write_print_header_end(out_field_surf)
4122 call write_iter_start(out_field_surf)
4123 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4124 st%magnetic_field_box_surface(1,1,dim)), 1)
4125 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4126 st%magnetic_field_box_surface(2,1,dim)), 1)
4127 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4128 st%magnetic_field_box_surface(1,2,dim)), 1)
4129 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4130 st%magnetic_field_box_surface(2,2,dim)), 1)
4131 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4132 st%magnetic_field_box_surface(1,3,dim)), 1)
4133 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4134 st%magnetic_field_box_surface(2,3,dim)), 1)
4135 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4136 st%magnetic_field_box_surface_plane_waves(1,1,dim)), 1)
4137 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4138 st%magnetic_field_box_surface_plane_waves(2,1,dim)), 1)
4139 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4140 st%magnetic_field_box_surface_plane_waves(1,2,dim)), 1)
4141 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4142 st%magnetic_field_box_surface_plane_waves(2,2,dim)), 1)
4143 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4144 st%magnetic_field_box_surface_plane_waves(1,3,dim)), 1)
4145 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4146 st%magnetic_field_box_surface_plane_waves(2,3,dim)), 1)
4147 call write_iter_nl(out_field_surf)
4153 subroutine td_write_fields(out_fields, space, st, iter, dt, e_or_b_field, field_type, idir)
4154 type(c_ptr),
intent(inout) :: out_fields
4155 class(space_t),
intent(in) :: space
4156 type(states_mxll_t),
intent(in) :: st
4157 integer,
intent(in) :: iter
4158 real(real64),
intent(in) :: dt
4159 integer,
intent(in) :: e_or_b_field
4160 integer,
intent(in) :: field_type
4161 integer,
intent(in) :: idir
4165 real(real64) :: field(space%dim), selected_field
4166 character(len=80) :: aux
4168 if (.not. st%system_grp%is_root())
return
4173 call td_write_print_header_init(out_fields)
4176 write(aux,
'(a7,e20.12,3a)')
'# dt = ', units_from_atomic(units_out%time, dt), &
4177 " [", trim(units_abbrev(units_out%time)),
"]"
4178 call write_iter_string(out_fields, aux)
4179 call write_iter_nl(out_fields)
4181 call write_iter_header_start(out_fields)
4183 do id = 1, st%selected_points_number
4184 select case (e_or_b_field)
4186 write(aux,
'(a,i1,a)')
'E(', id,
')'
4188 write(aux,
'(a,i1,a)')
'B(', id,
')'
4190 call write_iter_header(out_fields, aux)
4193 call write_iter_nl(out_fields)
4194 call write_iter_string(out_fields,
'#[Iter n.]')
4195 call write_iter_header(out_fields,
' [' // trim(units_abbrev(units_out%time)) //
']')
4200 aux =
' [' // trim(units_abbrev(units_out%force)) //
']'
4201 do id = 1, st%selected_points_number
4202 call write_iter_header(out_fields, aux)
4204 call write_iter_nl(out_fields)
4205 call td_write_print_header_end(out_fields)
4208 call write_iter_start(out_fields)
4210 do id = 1, st%selected_points_number
4211 select case (e_or_b_field)
4214 select case (field_type)
4216 call get_electric_field_vector(st%selected_points_rs_state(:,id), field(1:st%dim))
4218 call get_electric_field_vector(st%selected_points_rs_state_long(:,id), field(1:st%dim))
4220 call get_electric_field_vector(st%selected_points_rs_state_trans(:,id), field(1:st%dim))
4222 selected_field = units_from_atomic(units_out%energy/units_out%length, field(idir))
4225 select case (field_type)
4227 call get_magnetic_field_vector(st%selected_points_rs_state(:,id), st%rs_sign, field(1:st%dim))
4229 call get_magnetic_field_vector(st%selected_points_rs_state_long(:,id), st%rs_sign, field(1:st%dim))
4231 call get_magnetic_field_vector(st%selected_points_rs_state_trans(:,id), st%rs_sign, field(1:st%dim))
4233 selected_field = units_from_atomic(unit_one/units_out%length**2, field(idir))
4235 call write_iter_double(out_fields, selected_field, 1)
4238 call write_iter_nl(out_fields)
4246 type(namespace_t),
intent(in) :: namespace
4247 class(space_t),
intent(in) :: space
4248 type(grid_t),
intent(inout) :: gr
4249 type(states_mxll_t),
intent(inout) :: st
4250 type(hamiltonian_mxll_t),
intent(inout) :: hm
4251 type(helmholtz_decomposition_t),
intent(inout) :: helmholtz
4252 type(output_t),
intent(in) :: outp
4253 integer,
intent(in) :: iter
4254 real(real64),
intent(in) :: time
4256 character(len=256) :: filename
4258 push_sub(td_write_maxwell_free_data)
4259 call profiling_in(
"TD_WRITE_MAXWELL_DATA")
4262 write(filename,
'(a,a,i7.7)') trim(outp%iter_dir),
"td.", iter
4264 call output_mxll(outp, namespace, space, gr, st, hm, helmholtz, time, filename)
4266 call profiling_out(
"TD_WRITE_MAXWELL_DATA")
4267 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)
construct path name from given name and 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.
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)
subroutine, public parse_block_string(blk, l, c, res, convert_to_c)
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
integer, parameter, public restart_proj
integer, parameter, public restart_type_load
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_tvel(namespace, gr, st, space, hm, ions, vel)
Electronic velocity (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_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)
integer, parameter maxwell_trans_field
subroutine td_write_energy(out_energy, mpi_grp, hm, iter, ke)
subroutine td_write_acc(out_acc, namespace, space, gr, ions, st, hm, ext_partners, dt, iter)
subroutine, public td_write_mxll_end(writ)
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)
subroutine td_write_floquet(namespace, space, hm, ext_partners, gr, st, 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
subroutine td_write_mxll_field(out_mxll, mpi_grp, space, hm, dt, iter)
integer, parameter out_maxwell_long_b_field
integer, parameter, public out_energy
subroutine, public td_write_mxll_init(writ, namespace, iter, dt, grp)
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_effective_u(out_coords, mpi_grp, lda_u, 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)
integer, parameter, public out_floquet
subroutine td_write_spin(out_spin, mpi_grp, mesh, st, iter)
subroutine, public td_write_mxll_free_data(namespace, space, gr, st, hm, helmholtz, outp, iter, time)
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_temperature(out_temperature, mpi_grp, ions, iter)
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 td_write_total_heat_current(write_obj, space, hm, gr, st, iter)
integer, parameter out_e_field_surface_z
subroutine td_write_laser(out_laser, mpi_grp, space, lasers, dt, iter)
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
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 td_write_q(out_q, mpi_grp, space, ks, iter)
subroutine td_write_maxwell_energy(out_maxwell_energy, mpi_grp, hm, iter)
integer, parameter, public out_ionic_current
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)
integer, parameter, public out_vel
integer, parameter, public out_gauge_field
subroutine td_write_ionic_current(out_ionic_current, space, 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 td_write_vel(out_vel, namespace, gr, st, space, hm, ions, 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
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.
subroutine, public write_iter_header(out, string)
subroutine, public write_iter_string(out, string)
subroutine, public write_iter_init(out, iter, factor, file)
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)