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)
2993 call states_elec_end(hm_st)
3001 type(c_ptr),
intent(inout) :: out_total_current
3002 class(space_t),
intent(in) :: space
3003 class(mesh_t),
intent(in) :: mesh
3004 type(states_elec_t),
intent(in) :: st
3005 integer,
intent(in) :: iter
3007 integer :: idir, ispin
3008 character(len=50) :: aux
3009 real(real64) :: total_current(space%dim), abs_current(space%dim)
3013 if (st%system_grp%is_root() .and. iter == 0)
then
3014 call td_write_print_header_init(out_total_current)
3017 call write_iter_header_start(out_total_current)
3019 do idir = 1, space%dim
3020 write(aux,
'(a2,a1,a1)')
'I(', index2axis(idir),
')'
3021 call write_iter_header(out_total_current, aux)
3024 do idir = 1, space%dim
3025 write(aux,
'(a10,a1,a1)')
'IntAbs(j)(', index2axis(idir),
')'
3026 call write_iter_header(out_total_current, aux)
3029 do ispin = 1, st%d%nspin
3030 do idir = 1, space%dim
3031 write(aux,
'(a4,i1,a1,a1,a1)')
'I-sp', ispin,
'(', index2axis(idir),
')'
3032 call write_iter_header(out_total_current, aux)
3036 call write_iter_nl(out_total_current)
3038 call td_write_print_header_end(out_total_current)
3041 assert(
allocated(st%current))
3043 if (st%system_grp%is_root())
then
3044 call write_iter_start(out_total_current)
3047 total_current = 0.0_real64
3048 do idir = 1, space%dim
3049 do ispin = 1, st%d%spin_channels
3050 total_current(idir) = total_current(idir) + dmf_integrate(mesh, st%current(:, idir, ispin), reduce = .false.)
3052 total_current(idir) = units_from_atomic(units_out%length/units_out%time, total_current(idir))
3054 call mesh%allreduce(total_current, dim = space%dim)
3056 abs_current = 0.0_real64
3057 do idir = 1, space%dim
3058 do ispin = 1, st%d%spin_channels
3059 abs_current(idir) = abs_current(idir) + dmf_integrate(mesh, abs(st%current(:, idir, ispin)), reduce = .false.)
3061 abs_current(idir) = units_from_atomic(units_out%length/units_out%time, abs_current(idir))
3063 call mesh%allreduce(abs_current, dim = space%dim)
3065 if (st%system_grp%is_root())
then
3066 call write_iter_double(out_total_current, total_current, space%dim)
3067 call write_iter_double(out_total_current, abs_current, space%dim)
3070 do ispin = 1, st%d%nspin
3071 total_current = units_from_atomic(units_out%length/units_out%time, dmf_integrate(mesh, space%dim, st%current(:, :, ispin)))
3073 if (st%system_grp%is_root())
then
3074 call write_iter_double(out_total_current, total_current, space%dim)
3078 if (st%system_grp%is_root())
then
3079 call write_iter_nl(out_total_current)
3087 type(c_ptr),
intent(inout) :: out_ionic_current
3088 class(space_t),
intent(in) :: space
3089 class(ions_t),
intent(in) :: ions
3090 integer,
intent(in) :: iter
3093 character(len=50) :: aux
3094 real(real64) :: ionic_current(space%dim), abs_current(space%dim)
3098 if (ions%grp%is_root() .and. iter == 0)
then
3099 call td_write_print_header_init(out_ionic_current)
3102 call write_iter_header_start(out_ionic_current)
3104 do idir = 1, space%dim
3105 write(aux,
'(a2,a1,a1)')
'I(', index2axis(idir),
')'
3106 call write_iter_header(out_ionic_current, aux)
3109 do idir = 1, space%dim
3110 write(aux,
'(a10,a1,a1)')
'IntAbs(j)(', index2axis(idir),
')'
3111 call write_iter_header(out_ionic_current, aux)
3114 call write_iter_nl(out_ionic_current)
3116 call td_write_print_header_end(out_ionic_current)
3119 ionic_current = ions%current()
3120 abs_current = ions%abs_current()
3122 if (ions%grp%is_root())
then
3123 call write_iter_start(out_ionic_current)
3125 call write_iter_double(out_ionic_current, ionic_current, space%dim)
3126 call write_iter_double(out_ionic_current, abs_current, space%dim)
3128 call write_iter_nl(out_ionic_current)
3138 type(c_ptr),
intent(inout) :: write_obj
3139 class(space_t),
intent(in) :: space
3140 type(hamiltonian_elec_t),
intent(inout) :: hm
3141 type(grid_t),
intent(in) :: gr
3142 type(states_elec_t),
intent(in) :: st
3143 integer,
intent(in) :: iter
3145 integer :: idir, ispin
3146 character(len=50) :: aux
3147 real(real64),
allocatable :: heat_current(:, :, :)
3148 real(real64) :: total_current(space%dim)
3152 if (st%system_grp%is_root() .and. iter == 0)
then
3153 call td_write_print_header_init(write_obj)
3156 call write_iter_header_start(write_obj)
3158 do idir = 1, space%dim
3159 write(aux,
'(a2,i1,a1)')
'Jh(', idir,
')'
3160 call write_iter_header(write_obj, aux)
3163 call write_iter_nl(write_obj)
3165 call td_write_print_header_end(write_obj)
3168 safe_allocate(heat_current(1:gr%np, 1:space%dim, 1:st%d%nspin))
3170 call current_heat_calculate(space, gr%der, hm, st, heat_current)
3172 if (st%system_grp%is_root())
call write_iter_start(write_obj)
3174 total_current = 0.0_real64
3175 do idir = 1, space%dim
3176 do ispin = 1, st%d%spin_channels
3177 total_current(idir) = total_current(idir) + dmf_integrate(gr, heat_current(:, idir, ispin))
3179 total_current(idir) = units_from_atomic(units_out%energy*units_out%length/units_out%time, total_current(idir))
3182 safe_deallocate_a(heat_current)
3184 if (st%system_grp%is_root())
call write_iter_double(write_obj, total_current, space%dim)
3186 if (st%system_grp%is_root())
call write_iter_nl(write_obj)
3194 type(c_ptr),
intent(inout) :: out_partial_charges
3195 class(mesh_t),
intent(in) :: mesh
3196 type(states_elec_t),
intent(in) :: st
3197 type(ions_t),
intent(in) :: ions
3198 integer,
intent(in) :: iter
3201 character(len=50) :: aux
3202 real(real64),
allocatable :: hirshfeld_charges(:)
3206 safe_allocate(hirshfeld_charges(1:ions%natoms))
3208 call partial_charges_calculate(mesh, st, ions, hirshfeld_charges)
3210 if (st%system_grp%is_root())
then
3214 call td_write_print_header_init(out_partial_charges)
3217 call write_iter_header_start(out_partial_charges)
3219 do idir = 1, ions%natoms
3220 write(aux,
'(a13,i3,a1)')
'hirshfeld(atom=', idir,
')'
3221 call write_iter_header(out_partial_charges, aux)
3224 call write_iter_nl(out_partial_charges)
3226 call td_write_print_header_end(out_partial_charges)
3229 call write_iter_start(out_partial_charges)
3231 call write_iter_double(out_partial_charges, hirshfeld_charges, ions%natoms)
3233 call write_iter_nl(out_partial_charges)
3236 safe_deallocate_a(hirshfeld_charges)
3242 subroutine td_write_q(out_q, mpi_grp, space, ks, iter)
3243 type(c_ptr),
intent(inout) :: out_q
3244 type(mpi_grp_t),
intent(in) :: mpi_grp
3245 class(space_t),
intent(in) :: space
3246 type(v_ks_t),
intent(in) :: ks
3247 integer,
intent(in) :: iter
3250 character(len=50) :: aux
3254 if (mpi_grp%is_root())
then
3256 call td_write_print_header_init(out_q)
3257 call write_iter_header_start(out_q)
3258 do ii = 1, ks%pt%nmodes
3259 write(aux,
'(a1,i3,a3)')
'q', ii,
'(t)'
3260 call write_iter_header(out_q, aux)
3262 do ii = 1, ks%pt%nmodes
3263 write(aux,
'(a1,i3,a3)')
'p', ii,
'(t)'
3264 call write_iter_header(out_q, aux)
3266 do ii = 1, space%dim
3267 write(aux,
'(a3,i3,a3)')
'f_pt', ii,
'(t)'
3268 call write_iter_header(out_q, aux)
3270 call write_iter_nl(out_q)
3271 call td_write_print_header_end(out_q)
3274 call write_iter_start(out_q)
3275 call write_iter_double(out_q, ks%pt_mx%pt_q, ks%pt%nmodes)
3276 call write_iter_double(out_q, ks%pt_mx%pt_p, ks%pt%nmodes)
3277 call write_iter_double(out_q, ks%pt_mx%fmf, space%dim)
3278 call write_iter_nl(out_q)
3287 type(c_ptr),
intent(inout) :: out_mxll
3288 type(mpi_grp_t),
intent(in) :: mpi_grp
3289 class(space_t),
intent(in) :: space
3290 type(hamiltonian_elec_t),
intent(in) :: hm
3291 real(real64),
intent(in) :: dt
3292 integer,
intent(in) :: iter
3295 real(real64) :: field(space%dim)
3296 character(len=80) :: aux
3297 character(len=1) :: field_char
3301 if (.not. mpi_grp%is_root())
then
3307 call td_write_print_header_init(out_mxll)
3309 write(aux,
'(a7,e20.12,3a)')
'# dt = ', units_from_atomic(units_out%time, dt), &
3310 " [", trim(units_abbrev(units_out%time)),
"]"
3311 call write_iter_string(out_mxll, aux)
3312 call write_iter_nl(out_mxll)
3314 call write_iter_header_start(out_mxll)
3315 select case (hm%mxll%coupling_mode)
3316 case (length_gauge_dipole, multipolar_expansion)
3317 if (hm%mxll%add_electric_dip) field_char =
'E'
3318 if (hm%mxll%add_magnetic_dip) field_char =
'B'
3319 do idir = 1, space%dim
3320 write(aux,
'(a,i1,a)') field_char //
'(', idir,
')'
3321 call write_iter_header(out_mxll, aux)
3323 case (velocity_gauge_dipole)
3324 do idir = 1, space%dim
3325 write(aux,
'(a,i1,a)')
'A(', idir,
')'
3326 call write_iter_header(out_mxll, aux)
3329 call write_iter_nl(out_mxll)
3331 call write_iter_string(out_mxll,
'#[Iter n.]')
3332 call write_iter_header(out_mxll,
'[' // trim(units_abbrev(units_out%time)) //
']')
3336 select case (hm%mxll%coupling_mode)
3337 case (length_gauge_dipole, multipolar_expansion)
3338 if (hm%mxll%add_electric_dip) aux =
'[' // trim(units_abbrev(units_out%force)) //
']'
3339 if (hm%mxll%add_magnetic_dip) aux =
'[' // trim(units_abbrev(unit_one/units_out%length**2)) //
']'
3340 do idir = 1, space%dim
3341 call write_iter_header(out_mxll, aux)
3343 case (velocity_gauge_dipole)
3344 aux =
'[' // trim(units_abbrev(units_out%energy)) //
']'
3345 do idir = 1, space%dim
3346 call write_iter_header(out_mxll, aux)
3349 call write_iter_nl(out_mxll)
3350 call td_write_print_header_end(out_mxll)
3353 call write_iter_start(out_mxll)
3356 select case (hm%mxll%coupling_mode)
3357 case (length_gauge_dipole, multipolar_expansion)
3358 if (hm%mxll%add_electric_dip) field = units_from_atomic(units_out%force, hm%mxll%e_field_dip)
3359 if (hm%mxll%add_magnetic_dip) field = units_from_atomic(unit_one/units_out%length**2, hm%mxll%b_field_dip)
3360 call write_iter_double(out_mxll, field, space%dim)
3361 case (velocity_gauge_dipole)
3362 field = units_from_atomic(units_out%energy, hm%mxll%vec_pot_dip)
3363 call write_iter_double(out_mxll, field, space%dim)
3365 call write_iter_nl(out_mxll)
3373 type(c_ptr),
intent(inout) :: out_coords
3374 type(mpi_grp_t),
intent(in) :: mpi_grp
3375 type(lda_u_t),
intent(in) :: lda_u
3376 integer,
intent(in) :: iter
3379 character(len=50) :: aux
3381 if (.not. mpi_grp%is_root())
return
3386 call td_write_print_header_init(out_coords)
3389 call write_iter_header_start(out_coords)
3391 do ios = 1, lda_u%norbsets
3392 write(aux,
'(a2,i3,a1)')
'Ueff(', ios,
')'
3393 call write_iter_header(out_coords, aux)
3396 do ios = 1, lda_u%norbsets
3397 write(aux,
'(a2,i3,a1)')
'U(', ios,
')'
3398 call write_iter_header(out_coords, aux)
3401 do ios = 1, lda_u%norbsets
3402 write(aux,
'(a2,i3,a1)')
'J(', ios,
')'
3403 call write_iter_header(out_coords, aux)
3406 if (lda_u%intersite)
then
3407 do ios = 1, lda_u%norbsets
3408 do inn = 1, lda_u%orbsets(ios)%nneighbors
3409 write(aux,
'(a2,i3,a1,i3,a1)')
'V(', ios,
'-', inn,
')'
3410 call write_iter_header(out_coords, aux)
3416 call write_iter_nl(out_coords)
3419 call write_iter_string(out_coords,
'#[Iter n.]')
3420 call write_iter_header(out_coords,
'[' // trim(units_abbrev(units_out%time)) //
']')
3421 call write_iter_string(out_coords, &
3422 'Effective U ' // trim(units_abbrev(units_out%energy)) // &
3423 ', U in '// trim(units_abbrev(units_out%energy)) // &
3424 ', J in ' // trim(units_abbrev(units_out%energy)))
3425 call write_iter_nl(out_coords)
3427 call td_write_print_header_end(out_coords)
3430 call write_iter_start(out_coords)
3432 do ios = 1, lda_u%norbsets
3433 call write_iter_double(out_coords, units_from_atomic(units_out%energy, &
3434 lda_u%orbsets(ios)%Ueff), 1)
3437 do ios = 1, lda_u%norbsets
3438 call write_iter_double(out_coords, units_from_atomic(units_out%energy, &
3439 lda_u%orbsets(ios)%Ubar), 1)
3442 do ios = 1, lda_u%norbsets
3443 call write_iter_double(out_coords, units_from_atomic(units_out%energy, &
3444 lda_u%orbsets(ios)%Jbar), 1)
3447 if (lda_u%intersite)
then
3448 do ios = 1, lda_u%norbsets
3449 do inn = 1, lda_u%orbsets(ios)%nneighbors
3450 call write_iter_double(out_coords, units_from_atomic(units_out%energy, &
3451 lda_u%orbsets(ios)%V_ij(inn,0)), 1)
3456 call write_iter_nl(out_coords)
3463 type(c_ptr),
intent(inout) :: file_handle
3464 type(grid_t),
intent(in) :: grid
3465 type(kpoints_t),
intent(in) :: kpoints
3466 type(states_elec_t),
intent(in) :: st
3467 integer,
intent(in) :: iter
3469 integer :: ik_ispin, ist
3470 character(len=7) :: nkpt_str, nst_str
3471 character(len=7) :: ik_str, ist_str
3472 real(real64),
allocatable :: norm_ks(:, :)
3473 real(real64) :: n_electrons
3477 safe_allocate(norm_ks(1:st%nst, 1:st%nik))
3478 call states_elec_calc_norms(grid, kpoints, st, norm_ks)
3480 if (st%system_grp%is_root())
then
3483 call td_write_print_header_init(file_handle)
3486 write(nkpt_str,
'(I7)') st%nik
3487 write(nst_str,
'(I7)') st%nst
3488 call write_iter_string(file_handle,
'# Dimensions. (nstates, nkpt * nspin):')
3489 call write_iter_string(file_handle, trim(adjustl(nst_str)) //
' ' // trim(adjustl(nkpt_str)))
3490 call write_iter_nl(file_handle)
3493 call write_iter_string(file_handle,
'# Norm ordering: (istate, ikpoint_spin)')
3494 call write_iter_nl(file_handle)
3497 call write_iter_header_start(file_handle)
3498 call write_iter_header(file_handle,
'N_electrons')
3499 do ik_ispin = 1, st%nik
3501 write(ik_str,
'(I7)') ik_ispin
3502 write(ist_str,
'(I7)') ist
3503 call write_iter_header(file_handle, &
3504 'Norm (' // trim(ist_str) //
',' // trim(ik_str) //
')')
3507 call write_iter_nl(file_handle)
3508 call td_write_print_header_end(file_handle)
3511 n_electrons = sum(st%occ * norm_ks**2)
3514 call write_iter_start(file_handle)
3515 call write_iter_double(file_handle, n_electrons, 1)
3516 do ik_ispin = 1, st%nik
3517 call write_iter_double(file_handle, norm_ks(:, ik_ispin),
size(norm_ks, 1))
3519 call write_iter_nl(file_handle)
3523 safe_deallocate_a(norm_ks)
3532 type(c_ptr),
intent(inout) :: file_handle
3533 type(ions_t),
intent(in) :: ions
3534 integer,
intent(in) :: iter
3537 real(real64) :: tmp(3)
3539 if (.not. ions%grp%is_root())
return
3543 assert(ions%space%dim == 3)
3546 call td_write_print_header_init(file_handle)
3549 call write_iter_header_start(file_handle)
3551 call write_iter_string(file_handle,
'# Iter, a, b, c, volume, alpha, beta, gamma, ' &
3552 //
'a_x, a_y, a_z, b_x, b_y, b_z, c_x, c_y, c_z')
3555 call write_iter_string(file_handle,
'#[Iter n.]')
3556 call write_iter_header(file_handle,
'[' // trim(units_abbrev(units_out%time)) //
']')
3557 call write_iter_string(file_handle, &
3558 'Lengths in ' // trim(units_abbrev(units_out%length)) // &
3559 ', Volume in ' // trim(units_abbrev(units_out%length**3)) // &
3560 ', Angles in degree, Lattice vectors in '// trim(units_abbrev(units_out%length)))
3561 call write_iter_nl(file_handle)
3563 call td_write_print_header_end(file_handle)
3566 call write_iter_start(file_handle)
3570 tmp(idir) = units_from_atomic(units_out%length, norm2(ions%latt%rlattice(1:3, idir)))
3572 call write_iter_double(file_handle, tmp, 3)
3575 tmp(1) = units_from_atomic(units_out%length**3, ions%latt%rcell_volume)
3576 call write_iter_double(file_handle, tmp(1), 1)
3579 call write_iter_double(file_handle, ions%latt%alpha, 1)
3580 call write_iter_double(file_handle, ions%latt%beta, 1)
3581 call write_iter_double(file_handle, ions%latt%gamma, 1)
3585 tmp(1:3) = units_from_atomic(units_out%length, ions%latt%rlattice(:, idir))
3586 call write_iter_double(file_handle, tmp, 3)
3588 call write_iter_nl(file_handle)
3597 type(namespace_t),
intent(in) :: namespace
3598 integer,
intent(in) :: iter
3599 real(real64),
intent(in) :: dt
3600 type(mpi_grp_t),
intent(in) :: grp
3602 integer :: default, flags, iout, first
3657 call parse_variable(namespace,
'MaxwellTDOutput', default, flags)
3659 if (.not. varinfo_valid_option(
'MaxwellTDOutput', flags, is_flag = .
true.))
then
3660 call messages_input_error(namespace,
'MaxwellTDOutput')
3664 writ%out(iout)%write = (iand(flags, 2**(iout - 1)) /= 0)
3665 if (writ%out(iout)%write)
then
3666 writ%out(iout + 1)%write = .
true.
3667 writ%out(iout + 2)%write = .
true.
3672 writ%out(iout)%write = (iand(flags, 2**(iout - 1)) /= 0)
3681 writ%out(:)%mpi_grp = grp
3683 call io_mkdir(
'td.general', namespace)
3688 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/total_e_field_x", namespace)))
3690 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/total_e_field_y", namespace)))
3692 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/total_e_field_z", namespace)))
3698 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/total_b_field_x", namespace)))
3700 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/total_b_field_y", namespace)))
3702 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/total_b_field_z", namespace)))
3708 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/longitudinal_e_field_x", namespace)))
3710 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/longitudinal_e_field_y", namespace)))
3712 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/longitudinal_e_field_z", namespace)))
3718 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/longitudinal_b_field_x", namespace)))
3720 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/longitudinal_b_field_y", namespace)))
3722 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/longitudinal_b_field_z", namespace)))
3728 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/transverse_e_field_x", namespace)))
3730 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/transverse_e_field_y", namespace)))
3732 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/transverse_e_field_z", namespace)))
3738 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/transverse_b_field_x", namespace)))
3740 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/transverse_b_field_y", namespace)))
3742 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/transverse_b_field_z", namespace)))
3748 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/maxwell_energy", namespace)))
3753 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/electric_field_surface-x", namespace)))
3758 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/electric_field_surface-y", namespace)))
3763 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/electric_field_surface-z", namespace)))
3768 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/magnetic_field_surface-x", namespace)))
3773 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/magnetic_field_surface-y", namespace)))
3778 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/magnetic_field_surface-z", namespace)))
3794 if (writ%out(iout)%write)
call write_iter_end(writ%out(iout)%handle)
3802 subroutine td_write_mxll_iter(writ, space, gr, st, hm, helmholtz, dt, iter, namespace)
3804 class(space_t),
intent(in) :: space
3805 type(grid_t),
intent(inout) :: gr
3806 type(states_mxll_t),
intent(inout) :: st
3807 type(hamiltonian_mxll_t),
intent(inout) :: hm
3808 type(helmholtz_decomposition_t),
intent(inout) :: helmholtz
3809 real(real64),
intent(in) :: dt
3810 integer,
intent(in) :: iter
3811 type(namespace_t),
intent(in) :: namespace
3816 call profiling_in(
"TD_WRITE_ITER_MAXWELL")
3819 call helmholtz%get_trans_field(namespace, st%rs_state_trans, total_field=st%rs_state)
3820 call get_rs_state_at_point(st%selected_points_rs_state_trans(:,:), st%rs_state_trans, &
3821 st%selected_points_coordinate(:,:), st, gr)
3824 hm%energy%energy_trans = m_zero
3828 call helmholtz%get_long_field(namespace, st%rs_state_long, total_field=st%rs_state)
3829 call get_rs_state_at_point(st%selected_points_rs_state_long(:,:), st%rs_state_long, &
3830 st%selected_points_coordinate(:,:), st, gr)
3833 hm%energy%energy_long = m_zero
3926 call profiling_out(
"TD_WRITE_ITER_MAXWELL")
3935 type(mpi_grp_t),
intent(in) :: mpi_grp
3936 type(hamiltonian_mxll_t),
intent(in) :: hm
3937 integer,
intent(in) :: iter
3941 integer :: n_columns
3943 if (.not. mpi_grp%is_root())
return
3968 call write_iter_header(
out_maxwell_energy,
'[' // trim(units_abbrev(units_out%time)) //
']')
3970 do ii = 1, n_columns
3971 call write_iter_header(
out_maxwell_energy,
'[' // trim(units_abbrev(units_out%energy)) //
']')
3979 call write_iter_double(
out_maxwell_energy, units_from_atomic(units_out%energy, hm%energy%energy), 1)
3980 call write_iter_double(
out_maxwell_energy, units_from_atomic(units_out%energy, hm%energy%e_energy), 1)
3981 call write_iter_double(
out_maxwell_energy, units_from_atomic(units_out%energy, hm%energy%b_energy), 1)
3983 hm%energy%energy+hm%energy%boundaries), 1)
3984 call write_iter_double(
out_maxwell_energy, units_from_atomic(units_out%energy, hm%energy%boundaries), 1)
3985 call write_iter_double(
out_maxwell_energy, units_from_atomic(units_out%energy, hm%energy%energy_trans), 1)
3986 call write_iter_double(
out_maxwell_energy, units_from_atomic(units_out%energy, hm%energy%energy_long), 1)
3987 call write_iter_double(
out_maxwell_energy, units_from_atomic(units_out%energy, hm%energy%energy_plane_waves), 1)
3996 type(c_ptr),
intent(inout) :: out_field_surf
3997 type(states_mxll_t),
intent(in) :: st
3998 integer,
intent(in) :: dim
3999 integer,
intent(in) :: iter
4003 integer :: n_columns
4005 if (.not. st%system_grp%is_root())
return
4012 call td_write_print_header_init(out_field_surf)
4015 call write_iter_header_start(out_field_surf)
4016 call write_iter_header(out_field_surf,
'- x direction')
4017 call write_iter_header(out_field_surf,
'+ x direction')
4018 call write_iter_header(out_field_surf,
'- y direction')
4019 call write_iter_header(out_field_surf,
'+ y direction')
4020 call write_iter_header(out_field_surf,
'- z direction')
4021 call write_iter_header(out_field_surf,
'+ z direction')
4022 call write_iter_header(out_field_surf,
'- x dir. p. w.')
4023 call write_iter_header(out_field_surf,
'+ x dir. p. w.')
4024 call write_iter_header(out_field_surf,
'- y dir. p. w.')
4025 call write_iter_header(out_field_surf,
'+ y dir. p. w.')
4026 call write_iter_header(out_field_surf,
'- z dir. p. w.')
4027 call write_iter_header(out_field_surf,
'+ z dir. p. w.')
4029 call write_iter_nl(out_field_surf)
4032 call write_iter_string(out_field_surf,
'#[Iter n.]')
4033 call write_iter_header(out_field_surf,
'[' // trim(units_abbrev(units_out%time)) //
']')
4035 do ii = 1, n_columns
4036 call write_iter_header(out_field_surf,
'[' // trim(units_abbrev(units_out%energy/units_out%length)) //
']')
4038 call write_iter_nl(out_field_surf)
4040 call td_write_print_header_end(out_field_surf)
4043 call write_iter_start(out_field_surf)
4044 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
4045 st%electric_field_box_surface(1,1,dim)), 1)
4046 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
4047 st%electric_field_box_surface(2,1,dim)), 1)
4048 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
4049 st%electric_field_box_surface(1,2,dim)), 1)
4050 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
4051 st%electric_field_box_surface(2,2,dim)), 1)
4052 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
4053 st%electric_field_box_surface(1,3,dim)), 1)
4054 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
4055 st%electric_field_box_surface(2,3,dim)), 1)
4056 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
4057 st%electric_field_box_surface_plane_waves(1,1,dim)), 1)
4058 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
4059 st%electric_field_box_surface_plane_waves(2,1,dim)), 1)
4060 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
4061 st%electric_field_box_surface_plane_waves(1,2,dim)), 1)
4062 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
4063 st%electric_field_box_surface_plane_waves(2,2,dim)), 1)
4064 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
4065 st%electric_field_box_surface_plane_waves(1,3,dim)), 1)
4066 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
4067 st%electric_field_box_surface_plane_waves(2,3,dim)), 1)
4068 call write_iter_nl(out_field_surf)
4076 type(c_ptr),
intent(inout) :: out_field_surf
4077 type(states_mxll_t),
intent(in) :: st
4078 integer,
intent(in) :: dim
4079 integer,
intent(in) :: iter
4083 integer :: n_columns
4085 if (.not. st%system_grp%is_root())
return
4092 call td_write_print_header_init(out_field_surf)
4095 call write_iter_header_start(out_field_surf)
4096 call write_iter_header(out_field_surf,
'- x direction')
4097 call write_iter_header(out_field_surf,
'+ x direction')
4098 call write_iter_header(out_field_surf,
'- y direction')
4099 call write_iter_header(out_field_surf,
'+ y direction')
4100 call write_iter_header(out_field_surf,
'- z direction')
4101 call write_iter_header(out_field_surf,
'+ z direction')
4102 call write_iter_header(out_field_surf,
'- x dir. p. w.')
4103 call write_iter_header(out_field_surf,
'+ x dir. p. w.')
4104 call write_iter_header(out_field_surf,
'- y dir. p. w.')
4105 call write_iter_header(out_field_surf,
'+ y dir. p. w.')
4106 call write_iter_header(out_field_surf,
'- z dir. p. w.')
4107 call write_iter_header(out_field_surf,
'+ z dir. p. w.')
4109 call write_iter_nl(out_field_surf)
4112 call write_iter_string(out_field_surf,
'#[Iter n.]')
4113 call write_iter_header(out_field_surf,
'[' // trim(units_abbrev(units_out%time)) //
']')
4115 do ii = 1, n_columns
4116 call write_iter_header(out_field_surf,
'[' // trim(units_abbrev(unit_one/units_out%length**2)) //
']')
4118 call write_iter_nl(out_field_surf)
4120 call td_write_print_header_end(out_field_surf)
4123 call write_iter_start(out_field_surf)
4124 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4125 st%magnetic_field_box_surface(1,1,dim)), 1)
4126 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4127 st%magnetic_field_box_surface(2,1,dim)), 1)
4128 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4129 st%magnetic_field_box_surface(1,2,dim)), 1)
4130 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4131 st%magnetic_field_box_surface(2,2,dim)), 1)
4132 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4133 st%magnetic_field_box_surface(1,3,dim)), 1)
4134 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4135 st%magnetic_field_box_surface(2,3,dim)), 1)
4136 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4137 st%magnetic_field_box_surface_plane_waves(1,1,dim)), 1)
4138 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4139 st%magnetic_field_box_surface_plane_waves(2,1,dim)), 1)
4140 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4141 st%magnetic_field_box_surface_plane_waves(1,2,dim)), 1)
4142 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4143 st%magnetic_field_box_surface_plane_waves(2,2,dim)), 1)
4144 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4145 st%magnetic_field_box_surface_plane_waves(1,3,dim)), 1)
4146 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4147 st%magnetic_field_box_surface_plane_waves(2,3,dim)), 1)
4148 call write_iter_nl(out_field_surf)
4154 subroutine td_write_fields(out_fields, space, st, iter, dt, e_or_b_field, field_type, idir)
4155 type(c_ptr),
intent(inout) :: out_fields
4156 class(space_t),
intent(in) :: space
4157 type(states_mxll_t),
intent(in) :: st
4158 integer,
intent(in) :: iter
4159 real(real64),
intent(in) :: dt
4160 integer,
intent(in) :: e_or_b_field
4161 integer,
intent(in) :: field_type
4162 integer,
intent(in) :: idir
4166 real(real64) :: field(space%dim), selected_field
4167 character(len=80) :: aux
4169 if (.not. st%system_grp%is_root())
return
4174 call td_write_print_header_init(out_fields)
4177 write(aux,
'(a7,e20.12,3a)')
'# dt = ', units_from_atomic(units_out%time, dt), &
4178 " [", trim(units_abbrev(units_out%time)),
"]"
4179 call write_iter_string(out_fields, aux)
4180 call write_iter_nl(out_fields)
4182 call write_iter_header_start(out_fields)
4184 do id = 1, st%selected_points_number
4185 select case (e_or_b_field)
4187 write(aux,
'(a,i1,a)')
'E(', id,
')'
4189 write(aux,
'(a,i1,a)')
'B(', id,
')'
4191 call write_iter_header(out_fields, aux)
4194 call write_iter_nl(out_fields)
4195 call write_iter_string(out_fields,
'#[Iter n.]')
4196 call write_iter_header(out_fields,
' [' // trim(units_abbrev(units_out%time)) //
']')
4201 aux =
' [' // trim(units_abbrev(units_out%force)) //
']'
4202 do id = 1, st%selected_points_number
4203 call write_iter_header(out_fields, aux)
4205 call write_iter_nl(out_fields)
4206 call td_write_print_header_end(out_fields)
4209 call write_iter_start(out_fields)
4211 do id = 1, st%selected_points_number
4212 select case (e_or_b_field)
4215 select case (field_type)
4217 call get_electric_field_vector(st%selected_points_rs_state(:,id), field(1:st%dim))
4219 call get_electric_field_vector(st%selected_points_rs_state_long(:,id), field(1:st%dim))
4221 call get_electric_field_vector(st%selected_points_rs_state_trans(:,id), field(1:st%dim))
4223 selected_field = units_from_atomic(units_out%energy/units_out%length, field(idir))
4226 select case (field_type)
4228 call get_magnetic_field_vector(st%selected_points_rs_state(:,id), st%rs_sign, field(1:st%dim))
4230 call get_magnetic_field_vector(st%selected_points_rs_state_long(:,id), st%rs_sign, field(1:st%dim))
4232 call get_magnetic_field_vector(st%selected_points_rs_state_trans(:,id), st%rs_sign, field(1:st%dim))
4234 selected_field = units_from_atomic(unit_one/units_out%length**2, field(idir))
4236 call write_iter_double(out_fields, selected_field, 1)
4239 call write_iter_nl(out_fields)
4247 type(namespace_t),
intent(in) :: namespace
4248 class(space_t),
intent(in) :: space
4249 type(grid_t),
intent(inout) :: gr
4250 type(states_mxll_t),
intent(inout) :: st
4251 type(hamiltonian_mxll_t),
intent(inout) :: hm
4252 type(helmholtz_decomposition_t),
intent(inout) :: helmholtz
4253 type(output_t),
intent(in) :: outp
4254 integer,
intent(in) :: iter
4255 real(real64),
intent(in) :: time
4257 character(len=256) :: filename
4259 push_sub(td_write_maxwell_free_data)
4260 call profiling_in(
"TD_WRITE_MAXWELL_DATA")
4263 write(filename,
'(a,a,i7.7)') trim(outp%iter_dir),
"td.", iter
4265 call output_mxll(outp, namespace, space, gr, st, hm, helmholtz, time, filename)
4267 call profiling_out(
"TD_WRITE_MAXWELL_DATA")
4268 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)