48 use,
intrinsic :: iso_fortran_env
109 integer,
parameter,
public :: &
110 OUT_MULTIPOLES = 1, &
149 character(len=100) :: td_file_name(OUT_MAX) = [character(100) :: &
159 "magnetic_moments", &
174 "total_heat_current", &
175 "total_magnetization", &
177 "maxwell_dipole_field", &
178 "norm_wavefunctions", &
183 integer,
parameter :: &
184 OUT_DFTU_EFFECTIVE_U = 1, &
188 integer,
parameter :: &
189 OUT_MAXWELL_TOTAL_E_FIELD = 1, &
203 integer,
parameter,
public :: &
206 integer,
parameter :: &
211 integer,
parameter :: &
217 type(c_ptr) :: handle
218 type(c_ptr),
allocatable :: mult_handles(:)
220 integer :: hand_start
222 logical ::
write = .false.
223 logical :: resolve_states = .false.
235 real(real64) :: lmm_r
238 integer :: n_excited_states
240 integer :: compute_interval
246 subroutine td_write_kick(outp, namespace, space, mesh, kick, ions, iter)
250 class(
mesh_t),
intent(in) :: mesh
251 type(
kick_t),
intent(in) :: kick
252 type(
ions_t),
intent(in) :: ions
253 integer,
intent(in) :: iter
255 complex(real64),
allocatable :: kick_function(:)
256 character(len=256) :: filename
261 write(filename,
'(a,i7.7)')
"td.", iter
262 if (outp%what(option__output__delta_perturbation))
then
263 safe_allocate(kick_function(1:mesh%np))
265 call zio_function_output(outp%how(option__output__delta_perturbation), filename,
"kick_function", namespace, &
266 space, mesh, kick_function(:),
units_out%energy, err, pos=ions%pos, atoms=ions%atom)
267 safe_deallocate_a(kick_function)
283 subroutine td_write_init(writ, namespace, space, outp, gr, st, hm, ions, ext_partners, ks, ions_move, &
284 with_gauge_field, kick, iter, max_iter, dt, mc, dmp)
288 type(
output_t),
intent(inout) :: outp
289 type(
grid_t),
intent(in) :: gr
292 type(
ions_t),
intent(in) :: ions
294 type(
v_ks_t),
intent(inout) :: ks
295 logical,
intent(in) :: ions_move
296 logical,
intent(in) :: with_gauge_field
297 type(
kick_t),
intent(in) :: kick
298 integer,
intent(in) :: iter
299 integer,
intent(in) :: max_iter
300 real(real64),
intent(in) :: dt
302 type(
dmp_t),
intent(in) :: dmp
305 integer :: ierr, first, ii, ist, jj, flags, iout, default, ifile
310 character(len=MAX_PATH_LEN) :: filename
311 type(restart_t) :: restart_gs
312 logical :: resolve_states
313 logical,
allocatable :: skip(:)
471 output_options = .false.
472 output_options(out_multipoles) = .
true.
490 writ%out(iout)%write = output_options(iout)
506 if (space%is_periodic() .and. writ%out(
out_angular)%write)
then
521 if (gr%np /= gr%np_global)
then
522 message(1) =
"TDOutput option td_kpoint_occup and td_floquet do not work with domain parallelization"
529 'Forces for systems periodic in 1D are not currently implemented and options that output the forces are not allowed.')
533 if (writ%out(
out_kp_proj)%write .and. hm%kpoints%nik_skip == 0)
then
534 message(1) =
"TDOutput option td_kpoint_occup only work with zero-weight k-points at the moment."
538 if (writ%out(
out_dm_proj_basis)%write .and. dmp%calculation_mode == option__tddmpropagation__no_propagation)
then
539 message(1) =
"TDOutput option dm_proj_basis only works with TDDMPROPAGATION calculations"
553 call parse_variable(namespace,
'TDOutputResolveStates', .false., resolve_states)
554 if (.not. writ%out(out_multipoles)%write .and. resolve_states)
then
555 write(
message(1),
'(a)')
"TDOutputResolveStates works only for TDOutput = multipoles."
568 if (writ%lmax < 0)
then
569 write(
message(1),
'(a,i6,a)')
"Input: '", writ%lmax,
"' is not a valid TDMultipoleLmax."
570 message(2) =
'(Must be TDMultipoleLmax >= 0 )'
576 if ((writ%out(
out_acc)%write) .and. ions_move)
then
577 message(1) =
'If harmonic spectrum is to be calculated, atoms should not be allowed to move.'
581 if ((writ%out(
out_q)%write) .and. .not.(ks%has_photons))
then
582 message(1) =
'If q(t) is to be calculated, you need to allow for photon modes.'
587 .or. hm%mxll%add_electric_dip))
then
588 message(1) =
'If the dipolar field has to be written, MaxwellCouplingMode has to be'
589 message(2) =
'"lenght_gauge_dipole" or "velocity_gauge_dipole" and at least one Maxwell system'
590 message(3) =
'must be present.'
594 rmin = ions%min_distance()
604 message(1) =
"Option TDOutput = populations is not implemented for parallel in states."
616 safe_deallocate_a(writ%gs_st%node)
624 writ%gs_st%st_end = writ%gs_st%nst
626 message(1) =
"Unable to read states information."
630 writ%gs_st%st_start = 1
646 call parse_variable(namespace,
'TDProjStateStart', 1, writ%gs_st%st_start)
648 if (st%parallel_in_states .and. writ%out(
out_proj)%write .and. writ%gs_st%st_start > 1)
then
654 writ%gs_st%lnst = writ%gs_st%st_end - writ%gs_st%st_start + 1
658 writ%gs_st%parallel_in_states = .false.
661 safe_allocate(writ%gs_st%occ(1:writ%gs_st%nst, 1:writ%gs_st%nik))
662 safe_allocate(writ%gs_st%eigenval(1:writ%gs_st%nst, 1:writ%gs_st%nik))
666 safe_allocate(writ%gs_st%node(1:writ%gs_st%nst))
667 writ%gs_st%node(:) = 0
669 writ%gs_st%eigenval = huge(writ%gs_st%eigenval)
671 if (writ%gs_st%d%ispin ==
spinors)
then
672 safe_deallocate_a(writ%gs_st%spin)
673 safe_allocate(writ%gs_st%spin(1:3, 1:writ%gs_st%nst, 1:writ%gs_st%nik))
676 safe_allocate(skip(1:writ%gs_st%nst))
678 skip(1:writ%gs_st%st_start-1) = .
true.
682 safe_deallocate_a(skip)
685 call states_elec_load(restart_gs, namespace, space, writ%gs_st, gr, hm%kpoints, ierr, label =
': gs for TDOutput')
687 if (ierr /= 0 .and. ierr /= (writ%gs_st%st_end-writ%gs_st%st_start+1)*writ%gs_st%nik &
688 *writ%gs_st%d%dim*writ%gs_st%mpi_grp%size)
then
689 message(1) =
"Unable to read wavefunctions for TDOutput."
692 call restart_gs%end()
734 if (
parse_block(namespace,
'TDExcitedStatesToProject', blk) == 0)
then
736 safe_allocate(writ%excited_st(1:writ%n_excited_states))
737 do ist = 1, writ%n_excited_states
742 writ%n_excited_states = 0
756 call parse_variable(namespace,
'TDOutputComputeInterval', 50, writ%compute_interval)
757 if (writ%compute_interval < 0)
then
758 message(1) =
"TDOutputComputeInterval must be >= 0."
774 call io_mkdir(
'td.general', namespace)
781 writ%out(:)%mpi_grp = st%system_grp
782 writ%out_dftu(:)%mpi_grp = st%system_grp
784 if (st%system_grp%is_root())
then
786 do ifile = 1, out_max
790 if (writ%out(ifile)%write)
then
794 trim(
io_workpath(
"td.general/"//trim(td_file_name(ifile)), namespace)))
802 if (writ%out(out_multipoles)%write .and. .not. resolve_states)
then
805 trim(
io_workpath(
"td.general/multipoles", namespace)))
809 select case (kick%qkick_mode)
811 write(filename,
'(a)')
'td.general/ftchd.sin'
813 write(filename,
'(a)')
'td.general/ftchd.cos'
815 write(filename,
'(a, SP, I0.3, a, I0.3)')
'td.general/ftchd.l', kick%qbessel_l,
'_m', kick%qbessel_m
817 write(filename,
'(a)')
'td.general/ftchd'
829 call io_rm(
"td.general/laser", namespace=namespace)
847 if (writ%out(out_multipoles)%write .and. resolve_states)
then
849 writ%out(out_multipoles)%hand_start = st%st_start
850 writ%out(out_multipoles)%hand_end = st%st_end
851 writ%out(out_multipoles)%resolve_states = .
true.
852 writ%out(out_multipoles)%mpi_grp = gr%mpi_grp
854 safe_allocate(writ%out(out_multipoles)%mult_handles(st%st_start:st%st_end))
856 if (writ%out(out_multipoles)%mpi_grp%is_root())
then
857 do ist = st%st_start, st%st_end
858 write(filename,
'(a,i4.4)')
'td.general/multipoles-ist', ist
871 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, &
872 calc_eigenval=.false., time = iter*dt, calc_energy = .false.)
876 if (all(outp%how == 0) .and. writ%out(
out_n_ex)%write)
then
878 if (outp%how(option__output__current_kpt) + outp%how(option__output__density_kpt) /= 0)
then
879 call io_mkdir(outp%iter_dir, namespace)
901 if (hm%lda_u_level ==
dft_u_acbn0) default = default + 2**(out_dftu_effective_u - 1)
909 writ%out_dftu(iout)%write = (iand(flags, 2**(iout - 1)) /= 0)
912 if (st%system_grp%is_root())
then
913 if (writ%out_dftu(out_dftu_effective_u)%write)
then
916 trim(
io_workpath(
"td.general/effectiveU", namespace)))
934 if (writ%out(iout)%write)
then
935 if (writ%out(iout)%mpi_grp%is_root())
then
936 if (writ%out(iout)%resolve_states)
then
937 do ist = writ%out(iout)%hand_start, writ%out(iout)%hand_end
940 safe_deallocate_a(writ%out(iout)%mult_handles)
949 if (writ%out_dftu(iout)%write .and. writ%out_dftu(iout)%mpi_grp%is_root())
then
955 do ist = 1, writ%n_excited_states
958 writ%n_excited_states = 0
971 subroutine td_write_iter(writ, namespace, space, outp, gr, st, hm, ions, ext_partners, kick, ks, dt, &
972 iter, mc, recalculate_gs, dmp_st)
975 class(
space_t),
intent(in) :: space
977 type(
grid_t),
intent(in) :: gr
980 type(
ions_t),
intent(inout) :: ions
982 type(
kick_t),
intent(in) :: kick
983 type(
v_ks_t),
intent(in) :: ks
984 real(real64),
intent(in) :: dt
985 integer,
intent(in) :: iter
987 logical,
intent(in) :: recalculate_gs
996 if (writ%out(out_multipoles)%write)
then
997 call td_write_multipole(writ%out(out_multipoles), space, gr, ions, st, writ%lmax, kick, iter)
1020 if (writ%out(
out_proj)%write .and. mod(iter, writ%compute_interval) == 0)
then
1029 if (writ%out(
out_kp_proj)%write .and. mod(iter, writ%compute_interval) == 0)
then
1035 ions%pos, ions%vel, ions%tot_force, iter)
1040 ions%pos, ions%vel, ions%tot_force, iter, 1)
1045 ions%pos, ions%vel, ions%tot_force, iter, 2)
1050 ions%pos, ions%vel, ions%tot_force, iter, 3)
1061 if (writ%out(
out_acc)%write)
then
1062 call td_write_acc(writ%out(
out_acc)%handle, namespace, space, gr, ions, st, hm, ext_partners, dt, iter)
1065 if (writ%out(
out_vel)%write)
then
1078 if(
associated(gfield))
then
1108 if (writ%out(
out_n_ex)%write .and. mod(iter, writ%compute_interval) == 0)
then
1110 if (recalculate_gs)
then
1113 ierr, label =
': Houston states for TDOutput')
1117 call td_write_n_ex(writ%out(
out_n_ex)%handle, outp, namespace, gr, hm%kpoints, st, writ%gs_st, iter)
1129 if (writ%out_dftu(out_dftu_effective_u)%write)
then
1131 writ%out_dftu(out_dftu_effective_u)%mpi_grp, hm%lda_u, iter)
1134 if (writ%out(
out_q)%write .and. ks%has_photons)
then
1138 if (writ%out(
out_mxll_field)%write .and. hm%mxll%calc_field_dip)
then
1140 space, hm, dt, iter)
1143 if (writ%out(
out_dm_proj_basis)%write .and. mod(iter, writ%compute_interval) == 0)
then
1144 if (st%system_grp%is_root())
then
1163 do iout = 1, out_max
1165 if (writ%out(iout)%write)
then
1166 if (writ%out(iout)%mpi_grp%is_root())
then
1167 if (writ%out(iout)%resolve_states)
then
1168 do ii = writ%out(iout)%hand_start, writ%out(iout)%hand_end
1179 if (writ%out_dftu(iout)%write .and. writ%out(
out_proj)%mpi_grp%is_root())
then
1189 subroutine td_write_output(namespace, space, gr, st, hm, ks, outp, ions, ext_partners, iter, dt)
1192 type(
grid_t),
intent(in) :: gr
1195 type(
v_ks_t),
intent(inout) :: ks
1197 type(
ions_t),
intent(in) :: ions
1199 integer,
intent(in) :: iter
1200 real(real64),
optional,
intent(in) :: dt
1202 character(len=256) :: filename
1208 if (st%modelmbparticles%nparticle > 0)
then
1213 write(filename,
'(a,a,i7.7)') trim(outp%iter_dir),
"td.", iter
1215 call output_all(outp, namespace, space, filename, gr, ions, iter, st, hm, ks)
1217 call output_modelmb(outp, namespace, space, filename, gr, ions, iter, st)
1219 if (
present(dt))
then
1220 call output_scalar_pot(outp, namespace, space, filename, gr, ions, ext_partners, iter*dt)
1222 if (iter == 0)
call output_scalar_pot(outp, namespace, space, filename, gr, ions, ext_partners)
1231 type(c_ptr),
intent(inout) ::
out_spin
1233 class(
mesh_t),
intent(in) :: mesh
1235 integer,
intent(in) :: iter
1237 character(len=130) :: aux
1238 real(real64) :: spin(3)
1247 if (mpi_grp%is_root())
then
1254 if (st%d%ispin ==
spinors)
then
1255 write(aux,
'(a2,18x)')
'Sx'
1257 write(aux,
'(a2,18x)')
'Sy'
1260 write(aux,
'(a2,18x)')
'Sz'
1268 select case (st%d%ispin)
1285 type(
grid_t),
intent(in) :: gr
1287 type(
ions_t),
intent(in) :: ions
1288 real(real64),
intent(in) :: lmm_r
1289 integer,
intent(in) :: iter
1292 character(len=50) :: aux
1293 real(real64),
allocatable :: lmm(:,:)
1298 safe_allocate(lmm(1:3, 1:ions%natoms))
1301 if (st%system_grp%is_root())
then
1308 do ia = 1, ions%natoms
1309 if (st%d%ispin ==
spinors)
then
1310 write(aux,
'(a2,i2.2,16x)')
'mx', ia
1312 write(aux,
'(a2,i2.2,16x)')
'my', ia
1315 write(aux,
'(a2,i2.2,16x)')
'mz', ia
1324 do ia = 1, ions%natoms
1325 select case (st%d%ispin)
1335 safe_deallocate_a(lmm)
1342 type(c_ptr),
intent(inout) :: out_magnets
1343 class(
mesh_t),
intent(in) :: mesh
1345 type(
kick_t),
intent(in) :: kick
1346 integer,
intent(in) :: iter
1348 complex(real64),
allocatable :: tm(:,:)
1353 safe_allocate(tm(1:6,1:kick%nqvec))
1355 do iq = 1, kick%nqvec
1359 if (st%system_grp%is_root())
then
1385 do iq = 1, kick%nqvec
1394 safe_deallocate_a(tm)
1408 subroutine td_write_angular(out_angular, namespace, space, gr, ions, hm, st, kick, iter)
1409 type(c_ptr),
intent(inout) :: out_angular
1411 class(
space_t),
intent(in) :: space
1412 type(
grid_t),
intent(in) :: gr
1413 type(
ions_t),
intent(inout) :: ions
1416 type(
kick_t),
intent(in) :: kick
1417 integer,
intent(in) :: iter
1420 character(len=130) :: aux
1421 real(real64) :: angular(3)
1428 call angular_momentum%setup_dir(idir)
1431 m_two*real(angular_momentum%zstates_elec_expectation_value(namespace, space, gr, hm, st), real64)
1433 safe_deallocate_p(angular_momentum)
1435 if (st%system_grp%is_root())
then
1440 write(aux,
'(a15,i2)')
'# nspin ', st%d%nspin
1448 write(aux,
'(a4,18x)')
'<Lx>'
1450 write(aux,
'(a4,18x)')
'<Ly>'
1452 write(aux,
'(a4,18x)')
'<Lz>'
1481 class(
space_t),
intent(in) :: space
1482 type(
grid_t),
intent(in) :: gr
1483 type(
ions_t),
intent(in) :: ions
1485 integer,
intent(in) :: lmax
1486 type(
kick_t),
intent(in) :: kick
1487 integer,
intent(in) :: iter
1490 real(real64),
allocatable :: rho(:,:)
1494 if (out_multip%resolve_states)
then
1495 safe_allocate(rho(1:gr%np_part, 1:st%d%nspin))
1498 do ist = st%st_start, st%st_end
1500 call td_write_multipole_r(out_multip%mult_handles(ist), space, gr, ions, st, lmax, kick, rho, iter, &
1501 mpi_grp = out_multip%mpi_grp)
1504 safe_deallocate_a(rho)
1507 if (
allocated(st%frozen_rho))
then
1508 safe_allocate(rho(1:gr%np, 1:st%d%nspin))
1509 call lalg_copy(gr%np, st%d%nspin, st%rho, rho)
1514 safe_deallocate_a(rho)
1526 subroutine td_write_multipole_r(out_multip, space, mesh, ions, st, lmax, kick, rho, iter, mpi_grp)
1527 type(c_ptr),
intent(inout) :: out_multip
1528 class(
space_t),
intent(in) :: space
1529 class(
mesh_t),
intent(in) :: mesh
1530 type(
ions_t),
intent(in) :: ions
1532 integer,
intent(in) :: lmax
1533 type(
kick_t),
intent(in) :: kick
1534 real(real64),
intent(in) :: rho(:,:)
1535 integer,
intent(in) :: iter
1536 type(
mpi_grp_t),
optional,
intent(in) :: mpi_grp
1539 integer :: is, idir, ll, mm, add_lm
1540 character(len=120) :: aux
1541 real(real64) :: ionic_dipole(ions%space%dim)
1542 real(real64),
allocatable :: multipole(:,:)
1548 assert(.not. (lmax > 1 .and. space%dim > 3))
1550 mpi_grp_ = st%system_grp
1551 if (
present(mpi_grp)) mpi_grp_ = mpi_grp
1553 if (mpi_grp_%is_root().and.iter == 0)
then
1556 write(aux,
'(a15,i2)')
'# nspin ', st%d%nspin
1560 write(aux,
'(a15,i2)')
'# lmax ', lmax
1568 do is = 1, st%d%nspin
1569 write(aux,
'(a18,i1,a1)')
'Electronic charge(', is,
')'
1572 do idir = 1, space%dim
1573 write(aux,
'(4a1,i1,a1)')
'<',
index2axis(idir),
'>',
'(', is,
')'
1579 write(aux,
'(a2,i2,a4,i2,a2,i1,a1)')
'l=', ll,
', m=', mm,
' (', is,
')'
1590 do is = 1, st%d%nspin
1593 do idir = 1, space%dim
1609 if (space%dim > 3 .and. lmax == 1)
then
1611 safe_allocate(multipole(1:space%dim+1, 1:st%d%nspin))
1613 safe_allocate(multipole(1:(lmax + 1)**2, 1:st%d%nspin))
1617 do is = 1, st%d%nspin
1622 ionic_dipole = ions%dipole()
1623 do is = 1, st%d%nspin
1624 multipole(2:space%dim+1, is) = -ionic_dipole(1:space%dim)/st%d%nspin - multipole(2:space%dim+1, is)
1628 if (mpi_grp_%is_root())
then
1630 do is = 1, st%d%nspin
1633 do idir = 1, space%dim
1637 add_lm = space%dim + 2
1648 safe_deallocate_a(multipole)
1653 subroutine td_write_ftchd(out_ftchd, space, mesh, st, kick, iter)
1654 type(c_ptr),
intent(inout) :: out_ftchd
1655 class(
space_t),
intent(in) :: space
1656 class(
mesh_t),
intent(in) :: mesh
1658 type(
kick_t),
intent(in) :: kick
1659 integer,
intent(in) :: iter
1661 integer :: is, ip, idir
1662 character(len=120) :: aux, aux2
1663 real(real64) :: ftchd_bessel
1664 complex(real64) :: ftchd
1666 real(real64),
allocatable :: integrand_bessel(:)
1667 complex(real64),
allocatable :: integrand(:)
1671 if (st%system_grp%is_root().and.iter == 0)
then
1674 write(aux,
'(a15, i2)')
'# qkickmode ', kick%qkick_mode
1679 write(aux,
'(a15, i0.3, 1x, i0.3)')
'# ll, mm ', kick%qbessel_l, kick%qbessel_m
1685 write(aux,
'(a15, f9.6)')
'# qlength ', kick%qlength
1687 write(aux,
'(a15)')
'# qvector '
1688 do idir = 1, space%dim
1689 write(aux2,
'(f9.5)') kick%qvector(idir,1)
1690 aux = trim(aux) // trim(aux2)
1696 write(aux,
'(a15,f18.12)')
'# kick strength', kick%delta_strength
1702 write(aux,
'(a17)')
'int(j_l*Y_lm*rho)'
1704 write(aux,
'(a12)')
'Real, Imag'
1721 safe_allocate(integrand(1:mesh%np))
1723 do is = 1, st%d%nspin
1725 integrand(ip) = integrand(ip) + st%rho(ip, is) *
exp(-
m_zi*sum(mesh%x(1:space%dim, ip)*kick%qvector(1:space%dim, 1)))
1729 safe_deallocate_a(integrand)
1732 safe_allocate(integrand_bessel(1:mesh%np))
1733 integrand_bessel =
m_zero
1734 do is = 1, st%d%nspin
1736 call ylmr_real(mesh%x(1:3, ip), kick%qbessel_l, kick%qbessel_m, ylm)
1737 integrand_bessel(ip) = integrand_bessel(ip) + st%rho(ip, is) * &
1738 loct_sph_bessel(kick%qbessel_l, kick%qlength*norm2(mesh%x(:, ip)))*ylm
1742 safe_deallocate_a(integrand_bessel)
1745 if (st%system_grp%is_root())
then
1761 type(c_ptr),
intent(inout) :: out_temperature
1763 type(
ions_t),
intent(in) :: ions
1764 integer,
intent(in) :: iter
1766 if (.not. mpi_grp%is_root())
return
1799 type(c_ptr),
intent(inout) :: out_populations
1801 class(
space_t),
intent(in) :: space
1802 class(
mesh_t),
intent(in) :: mesh
1805 real(real64),
intent(in) :: dt
1806 integer,
intent(in) :: iter
1809 character(len=6) :: excited_name
1810 complex(real64) :: gsp
1811 complex(real64),
allocatable :: excited_state_p(:)
1812 complex(real64),
allocatable :: dotprodmatrix(:, :, :)
1817 safe_allocate(dotprodmatrix(1:writ%gs_st%nst, 1:st%nst, 1:st%nik))
1822 assert(.not. space%is_periodic())
1827 if (writ%n_excited_states > 0)
then
1828 safe_allocate(excited_state_p(1:writ%n_excited_states))
1829 do ist = 1, writ%n_excited_states
1830 excited_state_p(ist) =
zstates_elec_mpdotp(namespace, mesh, writ%excited_st(ist), st, dotprodmatrix)
1834 if (st%system_grp%is_root())
then
1842 do ist = 1, writ%n_excited_states
1843 write(excited_name,
'(a2,i3,a1)')
'P(', ist,
')'
1862 do ist = 1, writ%n_excited_states
1869 if (writ%n_excited_states > 0)
then
1870 safe_deallocate_a(excited_state_p)
1872 safe_deallocate_a(dotprodmatrix)
1878 subroutine td_write_acc(out_acc, namespace, space, gr, ions, st, hm, ext_partners, dt, iter)
1879 type(c_ptr),
intent(inout) :: out_acc
1881 class(
space_t),
intent(in) :: space
1882 type(
grid_t),
intent(in) :: gr
1883 type(
ions_t),
intent(inout) :: ions
1887 real(real64),
intent(in) :: dt
1888 integer,
intent(in) :: iter
1891 character(len=7) :: aux
1892 real(real64) :: acc(space%dim)
1896 if (iter == 0 .and. st%system_grp%is_root())
then
1901 do idim = 1, space%dim
1902 write(aux,
'(a4,i1,a1)')
'Acc(', idim,
')'
1910 do idim = 1, space%dim
1917 call td_calc_tacc(namespace, space, gr, ions, ext_partners, st, hm, acc, dt*iter)
1919 if (st%system_grp%is_root())
then
1930 subroutine td_write_vel(out_vel, namespace, gr, st, space, hm, ions, iter)
1931 type(c_ptr),
intent(inout) :: out_vel
1933 type(
grid_t),
intent(in) :: gr
1935 type(
space_t),
intent(in) :: space
1937 type(
ions_t),
intent(in) :: ions
1938 integer,
intent(in) :: iter
1941 character(len=7) :: aux
1942 real(real64) :: vel(space%dim)
1946 if (iter == 0 .and. st%system_grp%is_root())
then
1951 do idim = 1, space%dim
1952 write(aux,
'(a4,i1,a1)')
'Vel(', idim,
')'
1960 do idim = 1, space%dim
1967 call td_calc_tvel(namespace, gr, st, space, hm, ions, vel)
1969 if (st%system_grp%is_root())
then
1981 subroutine td_write_laser(out_laser, mpi_grp, space, lasers, dt, iter)
1982 type(c_ptr),
intent(inout) :: out_laser
1984 class(
space_t),
intent(in) :: space
1985 type(
lasers_t),
intent(inout) :: lasers
1986 real(real64),
intent(in) :: dt
1987 integer,
intent(in) :: iter
1990 real(real64) :: field(space%dim)
1991 real(real64) :: ndfield(space%dim)
1992 character(len=80) :: aux
1994 if (.not. mpi_grp%is_root())
return
2008 do il = 1, lasers%no_lasers
2011 do idir = 1, space%dim
2012 write(aux,
'(a,i1,a)')
'E(', idir,
')'
2016 do idir = 1, space%dim
2017 write(aux,
'(a,i1,a)')
'B(', idir,
')'
2021 do idir = 1, space%dim
2022 write(aux,
'(a,i1,a)')
'A(', idir,
')'
2026 write(aux,
'(a,i1,a)')
'e(t)'
2032 do idir = 1, space%dim
2033 write(aux,
'(a,i1,a)')
'A^M(', idir,
')'
2045 do il = 1, lasers%no_lasers
2049 do idir = 1, space%dim
2054 do idir = 1, space%dim
2065 do idir = 1, space%dim
2078 do il = 1, lasers%no_lasers
2080 call laser_field(lasers%lasers(il), field(1:space%dim), iter*dt)
2105 type(c_ptr),
intent(inout) :: out_energy
2108 integer,
intent(in) :: iter
2109 real(real64),
intent(in) :: ke
2113 integer :: n_columns
2115 if (.not. mpi_grp%is_root())
return
2136 if (hm%pcm%run_pcm)
then
2138 n_columns = n_columns + 1
2143 n_columns = n_columns + 1
2153 do ii = 1, n_columns
2176 hm%energy%int_nn_pcm + hm%energy%int_ne_pcm), 1)
2189 type(c_ptr),
intent(inout) :: out_eigs
2191 integer,
intent(in) :: iter
2194 character(len=68) :: buf
2198 if (.not. st%system_grp%is_root())
then
2207 write(buf,
'(a15,i2)')
'# nst ', st%nst
2211 write(buf,
'(a15,i2)')
'# nspin ', st%d%nspin
2217 do is = 1, st%d%kpt%nglobal
2219 write(buf,
'(a,i4)')
'Eigenvalue ',ii
2228 do is = 1, st%d%kpt%nglobal
2238 do is = 1, st%d%kpt%nglobal
2250 type(c_ptr),
intent(inout) :: out_ionch
2251 class(
mesh_t),
intent(in) :: mesh
2253 integer,
intent(in) :: iter
2255 integer :: ii, ist, Nch, ik, idim
2256 character(len=68) :: buf
2257 real(real64),
allocatable :: ch(:), occ(:)
2258 real(real64),
allocatable :: occbuf(:)
2263 nch = st%nst * st%d%kpt%nglobal * st%d%dim
2264 safe_allocate(ch(0: nch))
2265 safe_allocate(occ(0: nch))
2271 do idim = 1, st%d%dim
2272 if (st%st_start <= ist .and. ist <= st%st_end .and. &
2273 st%d%kpt%start <= ik .and. ik <= st%d%kpt%end)
then
2274 occ(ii) = st%occ(ist, ik)
2282 if (st%parallel_in_states)
then
2283 safe_allocate(occbuf(0: nch))
2285 call st%mpi_grp%allreduce(occ(0), occbuf(0), nch+1, mpi_double_precision, mpi_sum)
2287 safe_deallocate_a(occbuf)
2294 if (.not. st%system_grp%is_root())
then
2295 safe_deallocate_a(ch)
2296 safe_deallocate_a(occ)
2309 if (occ(ii)>
m_zero .or. ii == 0)
then
2310 write(buf,
'(a,f4.1,a)')
'Pion(',occ(ii)*ii,
'+, t)'
2320 if (occ(ii)>
m_zero .or. ii == 0)
then
2330 if (occ(ii)>
m_zero .or. ii == 0)
then
2336 safe_deallocate_a(ch)
2337 safe_deallocate_a(occ)
2343 subroutine td_write_proj(out_proj, space, mesh, ions, st, gs_st, kick, iter)
2344 type(c_ptr),
intent(inout) :: out_proj
2345 class(
space_t),
intent(in) :: space
2346 class(
mesh_t),
intent(in) :: mesh
2347 type(
ions_t),
intent(in) :: ions
2350 type(
kick_t),
intent(in) :: kick
2351 integer,
intent(in) :: iter
2353 complex(real64),
allocatable :: projections(:,:,:)
2354 character(len=80) :: aux
2355 integer :: ik, ist, uist, idir
2360 if (st%system_grp%is_root())
then
2363 write(aux,
'(a15,i2)')
'# nspin ', st%d%nspin
2372 write(aux,
'(a,i8)')
"# nik ", st%nik
2376 write(aux,
'(a,2i8)')
"# st ", gs_st%st_start, st%nst
2380 write(aux,
'(a,2i8)')
"# ust ", gs_st%st_start, gs_st%st_end
2386 do ist = gs_st%st_start, st%nst
2394 do ist = gs_st%st_start, st%nst
2395 do uist = gs_st%st_start, gs_st%st_end
2396 write(aux,
'(i4,a,i4)') ist,
' -> ', uist
2407 if (.not. space%is_periodic())
then
2409 safe_allocate(projections(1:st%nst, gs_st%st_start:gs_st%st_end, 1:st%nik))
2410 do idir = 1, space%dim
2415 if (st%system_grp%is_root())
then
2416 write(aux,
'(a,i1,a)')
"<i|x_", idir,
"|a>"
2420 do ist = gs_st%st_start, st%st_end
2421 do uist = gs_st%st_start, gs_st%st_end
2431 safe_deallocate_a(projections)
2435 if (st%system_grp%is_root())
then
2441 safe_allocate(projections(1:st%nst, gs_st%st_start:gs_st%st_end, 1:st%nik))
2442 projections(:,:,:) =
m_z0
2445 if (st%system_grp%is_root())
then
2448 do ist = gs_st%st_start, st%nst
2449 do uist = gs_st%st_start, gs_st%st_end
2458 safe_deallocate_a(projections)
2464 integer,
intent(in) :: dir
2466 integer :: uist, ist, ik, idim
2467 real(real64) :: n_dip(space%dim)
2468 complex(real64),
allocatable :: xpsi(:,:)
2469 complex(real64),
allocatable :: psi(:, :), gspsi(:, :)
2473 safe_allocate(psi(1:mesh%np, 1:st%d%dim))
2474 safe_allocate(gspsi(1:mesh%np, 1:st%d%dim))
2475 safe_allocate(xpsi(1:mesh%np, 1:st%d%dim))
2477 do ik = st%d%kpt%start, st%d%kpt%end
2478 do ist = st%st_start, st%st_end
2480 do uist = gs_st%st_start, gs_st%st_end
2483 do idim = 1, st%d%dim
2484 xpsi(1:mesh%np, idim) = mesh%x_t(1:mesh%np, dir)*gspsi(1:mesh%np, idim)
2486 projections(ist, uist, ik) = -
zmf_dotp(mesh, st%d%dim, psi, xpsi, reduce = .false.)
2492 safe_deallocate_a(xpsi)
2493 safe_deallocate_a(gspsi)
2494 safe_deallocate_a(psi)
2499 n_dip = ions%dipole()
2501 do ist = gs_st%st_start, st%nst
2502 do uist = gs_st%st_start, gs_st%st_end
2503 projections(ist, uist, ik) = projections(ist, uist, ik) - n_dip(dir)
2519 subroutine td_write_n_ex(out_nex, outp, namespace, mesh, kpoints, st, gs_st, iter)
2520 type(c_ptr),
intent(inout) :: out_nex
2523 class(
mesh_t),
intent(in) :: mesh
2527 integer,
intent(in) :: iter
2529 complex(real64),
allocatable :: projections(:,:)
2530 character(len=80) :: aux, dir
2531 integer :: ik, ikpt, ist, uist, err
2532 real(real64) :: Nex, weight
2534 real(real64),
allocatable :: Nex_kpt(:)
2540 if (st%system_grp%is_root())
then
2543 write(aux,
'(a15,i2)')
'# nspin ', st%d%nspin
2550 write(aux,
'(a,i8)')
"# nik ", st%nik
2554 write(aux,
'(a,2i8)')
"# st ", gs_st%st_start, st%nst
2558 write(aux,
'(a,2i8)')
"# ust ", gs_st%st_start, gs_st%st_end
2568 if (st%system_grp%is_root())
then
2577 do ist = 1, gs_st%nst
2578 if (gs_st%occ(ist, ik) >
m_min_occ .and. ist > gs_nst) gs_nst = ist
2582 safe_allocate(projections(1:gs_nst, 1:st%nst))
2584 safe_allocate(nex_kpt(1:st%nik))
2586 do ik = st%d%kpt%start, st%d%kpt%end
2587 ikpt = st%d%get_kpoint_index(ik)
2590 weight = st%kweights(ik) * gs_st%occ(ist, ik)/ st%smear%el_per_state
2591 do uist = st%st_start, st%st_end
2592 nex_kpt(ikpt) = nex_kpt(ikpt) - weight * st%occ(uist, ik) * abs(projections(ist, uist))**2
2595 nex_kpt(ikpt) = nex_kpt(ikpt) + sum(st%occ(st%st_start:st%st_end, ik))*st%kweights(ik)
2598 if (st%parallel_in_states .or. st%d%kpt%parallel)
then
2604 if (st%system_grp%is_root())
then
2610 write(dir,
'(a,a,i7.7)') trim(outp%iter_dir),
"td.", iter
2613 + outp%how(option__output__density_kpt), dir,
"n_excited_el_kpt", namespace, &
2617 safe_deallocate_a(projections)
2618 safe_deallocate_a(nex_kpt)
2630 class(
mesh_t),
intent(in) :: mesh
2633 complex(real64),
intent(inout) :: projections(1:st%nst, gs_st%st_start:gs_st%nst, 1:st%nik)
2635 integer :: uist, ist, ik
2636 complex(real64),
allocatable :: psi(:, :), gspsi(:, :)
2639 safe_allocate(psi(1:mesh%np, 1:st%d%dim))
2640 safe_allocate(gspsi(1:mesh%np, 1:st%d%dim))
2642 projections(:,:,:) =
m_zero
2644 do ik = st%d%kpt%start, st%d%kpt%end
2645 do ist = st%st_start, st%st_end
2647 do uist = gs_st%st_start, gs_st%nst
2649 projections(ist, uist, ik) =
zmf_dotp(mesh, st%d%dim, psi, gspsi, reduce = .false.)
2654 safe_deallocate_a(psi)
2655 safe_deallocate_a(gspsi)
2664 class(
mesh_t),
intent(in) :: mesh
2669 integer,
intent(in) :: iter
2671 complex(real64),
allocatable :: proj(:,:), psi(:,:,:), gs_psi(:,:,:), temp_state(:,:)
2672 character(len=80) :: filename1, filename2
2673 integer :: ik,ist, jst, file, idim, nk_proj
2677 write(filename1,
'(I10)') iter
2678 filename1 =
'td.general/projections_iter_'//trim(adjustl(filename1))
2681 safe_allocate(proj(1:gs_st%nst, 1:gs_st%nst))
2682 safe_allocate(psi(1:gs_st%nst,1:gs_st%d%dim,1:mesh%np))
2683 safe_allocate(gs_psi(1:gs_st%nst,1:gs_st%d%dim,1:mesh%np))
2684 safe_allocate(temp_state(1:mesh%np,1:gs_st%d%dim))
2690 nk_proj = kpoints%nik_skip
2692 do ik = kpoints%reduced%npoints-nk_proj+1, kpoints%reduced%npoints
2694 psi(1:gs_st%nst, 1:gs_st%d%dim, 1:mesh%np)=
m_zero
2695 gs_psi(1:gs_st%nst, 1:gs_st%d%dim, 1:mesh%np)=
m_zero
2697 if (st%system_grp%is_root())
then
2698 write(filename2,
'(I10)') ik
2699 filename2 = trim(adjustl(filename1))//
'_ik_'//trim(adjustl(filename2))
2700 file =
io_open(filename2, namespace, action=
'write')
2703 do ist=gs_st%st_start,gs_st%st_end
2706 do idim = 1,gs_st%d%dim
2707 psi(ist,idim,1:mesh%np) = temp_state(1:mesh%np,idim)
2710 do idim = 1,gs_st%d%dim
2711 gs_psi(ist,idim,1:mesh%np) = temp_state(1:mesh%np,idim)
2720 assert(mesh%np_global*gs_st%d%dim < huge(0_int32))
2721 proj(1:gs_st%nst, 1:gs_st%nst) =
m_zero
2726 i8_to_i4(mesh%np_global*gs_st%d%dim), &
2727 cmplx(mesh%volume_element,
m_zero, real64) , &
2729 ubound(psi, dim = 1), &
2731 ubound(gs_psi, dim = 1), &
2734 ubound(proj, dim = 1))
2737 if (st%system_grp%is_root())
then
2738 do ist = 1, gs_st%nst
2739 do jst = 1, gs_st%nst
2740 write(file,
'(I3,1x,I3,1x,e13.6,1x,e13.6,2x)') ist, jst, proj(ist,jst)
2748 safe_deallocate_a(proj)
2749 safe_deallocate_a(psi)
2750 safe_deallocate_a(gs_psi)
2751 safe_deallocate_a(temp_state)
2757 subroutine td_write_floquet(namespace, space, hm, ext_partners, gr, st, iter)
2758 type(namespace_t),
intent(in) :: namespace
2759 class(space_t),
intent(in) :: space
2760 type(hamiltonian_elec_t),
intent(inout) :: hm
2761 type(partner_list_t),
intent(in) :: ext_partners
2762 type(grid_t),
intent(in) :: gr
2763 type(states_elec_t),
intent(inout) :: st
2764 integer,
intent(in) :: iter
2766 complex(real64),
allocatable :: hmss(:,:), psi(:,:,:), hpsi(:,:,:), temp_state1(:,:)
2767 complex(real64),
allocatable :: HFloquet(:,:,:), HFloq_eff(:,:), temp(:,:)
2768 real(real64),
allocatable :: eigenval(:), bands(:,:)
2769 character(len=80) :: filename
2770 integer :: it, nT, ik, ist, in, im, file, idim, nik, ik_count
2771 integer :: Forder, Fdim, m0, n0, n1, nst, ii, jj, lim_nst
2772 logical :: downfolding
2773 type(states_elec_t) :: hm_st
2775 real(real64) :: dt, Tcycle, omega
2779 downfolding = .false.
2782 if (.not. iter == 0)
then
2790 assert(gr%np == gr%np_global)
2793 call states_elec_copy(hm_st, st)
2804 call parse_variable(namespace,
'TDFloquetFrequency', m_zero, omega, units_inp%energy)
2805 call messages_print_var_value(
'Frequency used for Floquet analysis', omega, namespace=namespace)
2806 if (abs(omega) <= m_epsilon)
then
2807 message(1) =
"Please give a non-zero value for TDFloquetFrequency"
2808 call messages_fatal(1, namespace=namespace)
2812 tcycle = m_two * m_pi / omega
2822 call parse_variable(namespace,
'TDFloquetSample',20 ,nt)
2823 call messages_print_var_value(
'Number of Floquet time-sampling points', nt, namespace=namespace)
2824 dt = tcycle/real(nt, real64)
2833 call parse_variable(namespace,
'TDFloquetDimension',-1,forder)
2834 if (forder .ge. 0)
then
2835 call messages_print_var_value(
'Order of multiphoton Floquet-Hamiltonian', forder, namespace=namespace)
2837 fdim = 2 * forder + 1
2839 message(1) =
'Floquet-Hamiltonian is downfolded'
2840 call messages_info(1, namespace=namespace)
2841 downfolding = .
true.
2846 dt = tcycle/real(nt, real64)
2849 nik = hm%kpoints%nik_skip
2851 safe_allocate(hmss(1:nst,1:nst))
2852 safe_allocate( psi(1:nst,1:st%d%dim,1:gr%np))
2853 safe_allocate(hpsi(1:nst,1:st%d%dim,1:gr%np))
2854 safe_allocate(temp_state1(1:gr%np,1:st%d%dim))
2862 safe_allocate(hfloquet(1:nik,1:nst*fdim, 1:nst*fdim))
2863 hfloquet(1:nik,1:nst*fdim, 1:nst*fdim) = m_zero
2868 call hm%update(gr, namespace, space, ext_partners, time=tcycle+it*dt)
2870 call zhamiltonian_elec_apply_all(hm, namespace, gr, st, hm_st)
2875 do ik = hm%kpoints%reduced%npoints-nik+1, hm%kpoints%reduced%npoints
2876 ik_count = ik_count + 1
2878 psi(1:nst, 1:st%d%dim, 1:gr%np)= m_zero
2879 hpsi(1:nst, 1:st%d%dim, 1:gr%np)= m_zero
2881 do ist = st%st_start, st%st_end
2882 if (state_kpt_is_local(st, ist, ik))
then
2883 call states_elec_get_state(st, gr, ist, ik,temp_state1)
2884 do idim = 1, st%d%dim
2885 psi(ist, idim, 1:gr%np) = temp_state1(1:gr%np, idim)
2887 call states_elec_get_state(hm_st, gr, ist, ik,temp_state1)
2888 do idim = 1, st%d%dim
2889 hpsi(ist, idim, 1:gr%np) = temp_state1(1:gr%np, idim)
2893 call comm_allreduce(st%system_grp, psi)
2894 call comm_allreduce(st%system_grp, hpsi)
2895 assert(gr%np_global*st%d%dim < huge(0_int32))
2896 hmss(1:nst,1:nst) = m_zero
2901 i8_to_i4(gr%np_global*st%d%dim), &
2902 cmplx(gr%volume_element, m_zero, real64) , &
2904 ubound(hpsi, dim = 1), &
2906 ubound(psi, dim = 1), &
2909 ubound(hmss, dim = 1))
2911 hmss(1:nst,1:nst) = conjg(hmss(1:nst,1:nst))
2914 do in = -forder, forder
2915 do im = -forder, forder
2916 ii = (in+forder) * nst
2917 jj = (im+forder) * nst
2918 hfloquet(ik_count, ii+1:ii+nst, jj+1:jj+nst) = &
2919 hfloquet(ik_count, ii+1:ii+nst, jj+1:jj+nst) + hmss(1:nst, 1:nst) *
exp(-(in-im)*m_zi*omega*it*dt)
2923 hfloquet(ik_count, ii+ist, ii+ist) = hfloquet(ik_count, ii+ist, ii+ist) + in*omega
2932 hfloquet(:,:,:) = m_one/nt*hfloquet(:,:,:)
2935 if (downfolding)
then
2937 safe_allocate(hfloq_eff(1:nst,1:nst))
2938 safe_allocate(eigenval(1:nst))
2939 safe_allocate(bands(1:nik,1:nst))
2941 hfloq_eff(1:nst,1:nst) = m_zero
2947 hfloq_eff(1:nst, 1:nst) = hfloquet(ik, n0+1:n0+nst, m0+1:m0+nst) + &
2948 m_one/omega*(matmul(hfloquet(ik, 1:nst, m0+1:m0+nst), hfloquet(ik, n1+1:n1+nst, m0+1:m0+nst))- &
2949 matmul(hfloquet(ik, n1+1:n1+nst, m0+1:m0+nst), hfloquet(ik, 1:nst, m0+1:m0+nst)))
2951 call lalg_eigensolve(nst, hfloq_eff, eigenval)
2952 bands(ik,1:nst) = eigenval(1:nst)
2954 safe_deallocate_a(hfloq_eff)
2957 safe_allocate(eigenval(1:nst*fdim))
2958 safe_allocate(bands(1:nik,1:nst*fdim))
2959 safe_allocate(temp(1:nst*fdim, 1:nst*fdim))
2962 temp(1:nst*fdim, 1:nst*fdim) = hfloquet(ik, 1:nst*fdim, 1:nst*fdim)
2963 call lalg_eigensolve(nst*fdim, temp, eigenval)
2964 bands(ik, 1:nst*fdim) = eigenval(1:nst*fdim)
2969 if (downfolding)
then
2971 filename =
"downfolded_floquet_bands"
2974 filename =
"floquet_bands"
2977 if (st%system_grp%is_root())
then
2979 file = io_open(filename, namespace, action =
'write')
2982 write(file,
'(e13.6, 1x)',advance=
'no') bands(ik,ist)
2989 if (.not. downfolding)
then
2992 bands(1:nik, 1:nst*fdim) = m_zero
2994 temp(1:nst*fdim,1:nst*fdim) = m_zero
2997 temp(ii+1:ii+nst, ii+1:ii+nst) = hfloquet(ik, ii+1:ii+nst, ii+1:ii+nst)
2999 call lalg_eigensolve(nst*fdim, temp, eigenval)
3000 bands(ik, 1:nst*fdim) = eigenval(1:nst*fdim)
3003 if (st%system_grp%is_root())
then
3004 filename =
'trivial_floquet_bands'
3005 file = io_open(filename, namespace, action =
'write')
3008 write(file,
'(e13.6, 1x)', advance=
'no') bands(ik,ist)
3017 call hm%update(gr, namespace, space, ext_partners, time=m_zero)
3019 safe_deallocate_a(hmss)
3020 safe_deallocate_a(psi)
3021 safe_deallocate_a(hpsi)
3022 safe_deallocate_a(temp_state1)
3023 safe_deallocate_a(hfloquet)
3024 safe_deallocate_a(eigenval)
3025 safe_deallocate_a(bands)
3026 safe_deallocate_a(temp)
3027 call states_elec_end(hm_st)
3035 type(c_ptr),
intent(inout) :: out_total_current
3036 class(space_t),
intent(in) :: space
3037 class(mesh_t),
intent(in) :: mesh
3038 type(states_elec_t),
intent(in) :: st
3039 integer,
intent(in) :: iter
3041 integer :: idir, ispin
3042 character(len=50) :: aux
3043 real(real64) :: total_current(space%dim), abs_current(space%dim)
3047 if (st%system_grp%is_root() .and. iter == 0)
then
3048 call td_write_print_header_init(out_total_current)
3051 call write_iter_header_start(out_total_current)
3053 do idir = 1, space%dim
3054 write(aux,
'(a2,a1,a1)')
'I(', index2axis(idir),
')'
3055 call write_iter_header(out_total_current, aux)
3058 do idir = 1, space%dim
3059 write(aux,
'(a10,a1,a1)')
'IntAbs(j)(', index2axis(idir),
')'
3060 call write_iter_header(out_total_current, aux)
3063 do ispin = 1, st%d%nspin
3064 do idir = 1, space%dim
3065 write(aux,
'(a4,i1,a1,a1,a1)')
'I-sp', ispin,
'(', index2axis(idir),
')'
3066 call write_iter_header(out_total_current, aux)
3070 call write_iter_nl(out_total_current)
3072 call td_write_print_header_end(out_total_current)
3075 assert(
allocated(st%current))
3077 if (st%system_grp%is_root())
then
3078 call write_iter_start(out_total_current)
3081 total_current = 0.0_real64
3082 do idir = 1, space%dim
3083 do ispin = 1, st%d%spin_channels
3084 total_current(idir) = total_current(idir) + dmf_integrate(mesh, st%current(:, idir, ispin), reduce = .false.)
3086 total_current(idir) = units_from_atomic(units_out%length/units_out%time, total_current(idir))
3088 call mesh%allreduce(total_current, dim = space%dim)
3090 abs_current = 0.0_real64
3091 do idir = 1, space%dim
3092 do ispin = 1, st%d%spin_channels
3093 abs_current(idir) = abs_current(idir) + dmf_integrate(mesh, abs(st%current(:, idir, ispin)), reduce = .false.)
3095 abs_current(idir) = units_from_atomic(units_out%length/units_out%time, abs_current(idir))
3097 call mesh%allreduce(abs_current, dim = space%dim)
3099 if (st%system_grp%is_root())
then
3100 call write_iter_double(out_total_current, total_current, space%dim)
3101 call write_iter_double(out_total_current, abs_current, space%dim)
3104 do ispin = 1, st%d%nspin
3105 total_current = units_from_atomic(units_out%length/units_out%time, dmf_integrate(mesh, space%dim, st%current(:, :, ispin)))
3107 if (st%system_grp%is_root())
then
3108 call write_iter_double(out_total_current, total_current, space%dim)
3112 if (st%system_grp%is_root())
then
3113 call write_iter_nl(out_total_current)
3121 type(c_ptr),
intent(inout) :: out_ionic_current
3122 class(space_t),
intent(in) :: space
3123 class(ions_t),
intent(in) :: ions
3124 integer,
intent(in) :: iter
3127 character(len=50) :: aux
3128 real(real64) :: ionic_current(space%dim), abs_current(space%dim)
3132 if (ions%grp%is_root() .and. iter == 0)
then
3133 call td_write_print_header_init(out_ionic_current)
3136 call write_iter_header_start(out_ionic_current)
3138 do idir = 1, space%dim
3139 write(aux,
'(a2,a1,a1)')
'I(', index2axis(idir),
')'
3140 call write_iter_header(out_ionic_current, aux)
3143 do idir = 1, space%dim
3144 write(aux,
'(a10,a1,a1)')
'IntAbs(j)(', index2axis(idir),
')'
3145 call write_iter_header(out_ionic_current, aux)
3148 call write_iter_nl(out_ionic_current)
3150 call td_write_print_header_end(out_ionic_current)
3153 ionic_current = ions%current()
3154 abs_current = ions%abs_current()
3156 if (ions%grp%is_root())
then
3157 call write_iter_start(out_ionic_current)
3159 call write_iter_double(out_ionic_current, ionic_current, space%dim)
3160 call write_iter_double(out_ionic_current, abs_current, space%dim)
3162 call write_iter_nl(out_ionic_current)
3172 type(c_ptr),
intent(inout) :: write_obj
3173 class(space_t),
intent(in) :: space
3174 type(hamiltonian_elec_t),
intent(inout) :: hm
3175 type(grid_t),
intent(in) :: gr
3176 type(states_elec_t),
intent(in) :: st
3177 integer,
intent(in) :: iter
3179 integer :: idir, ispin
3180 character(len=50) :: aux
3181 real(real64),
allocatable :: heat_current(:, :, :)
3182 real(real64) :: total_current(space%dim)
3186 if (st%system_grp%is_root() .and. iter == 0)
then
3187 call td_write_print_header_init(write_obj)
3190 call write_iter_header_start(write_obj)
3192 do idir = 1, space%dim
3193 write(aux,
'(a2,i1,a1)')
'Jh(', idir,
')'
3194 call write_iter_header(write_obj, aux)
3197 call write_iter_nl(write_obj)
3199 call td_write_print_header_end(write_obj)
3202 safe_allocate(heat_current(1:gr%np, 1:space%dim, 1:st%d%nspin))
3204 call current_heat_calculate(space, gr%der, hm, st, heat_current)
3206 if (st%system_grp%is_root())
call write_iter_start(write_obj)
3208 total_current = 0.0_real64
3209 do idir = 1, space%dim
3210 do ispin = 1, st%d%spin_channels
3211 total_current(idir) = total_current(idir) + dmf_integrate(gr, heat_current(:, idir, ispin))
3213 total_current(idir) = units_from_atomic(units_out%energy*units_out%length/units_out%time, total_current(idir))
3216 safe_deallocate_a(heat_current)
3218 if (st%system_grp%is_root())
call write_iter_double(write_obj, total_current, space%dim)
3220 if (st%system_grp%is_root())
call write_iter_nl(write_obj)
3228 type(c_ptr),
intent(inout) :: out_partial_charges
3229 class(mesh_t),
intent(in) :: mesh
3230 type(states_elec_t),
intent(in) :: st
3231 type(ions_t),
intent(in) :: ions
3232 integer,
intent(in) :: iter
3235 character(len=50) :: aux
3236 real(real64),
allocatable :: hirshfeld_charges(:)
3240 safe_allocate(hirshfeld_charges(1:ions%natoms))
3242 call partial_charges_calculate(mesh, st, ions, hirshfeld_charges)
3244 if (st%system_grp%is_root())
then
3248 call td_write_print_header_init(out_partial_charges)
3251 call write_iter_header_start(out_partial_charges)
3253 do idir = 1, ions%natoms
3254 write(aux,
'(a13,i3,a1)')
'hirshfeld(atom=', idir,
')'
3255 call write_iter_header(out_partial_charges, aux)
3258 call write_iter_nl(out_partial_charges)
3260 call td_write_print_header_end(out_partial_charges)
3263 call write_iter_start(out_partial_charges)
3265 call write_iter_double(out_partial_charges, hirshfeld_charges, ions%natoms)
3267 call write_iter_nl(out_partial_charges)
3270 safe_deallocate_a(hirshfeld_charges)
3276 subroutine td_write_q(out_q, mpi_grp, space, ks, iter)
3277 type(c_ptr),
intent(inout) :: out_q
3278 type(mpi_grp_t),
intent(in) :: mpi_grp
3279 class(space_t),
intent(in) :: space
3280 type(v_ks_t),
intent(in) :: ks
3281 integer,
intent(in) :: iter
3284 character(len=50) :: aux
3288 if (mpi_grp%is_root())
then
3290 call td_write_print_header_init(out_q)
3291 call write_iter_header_start(out_q)
3292 do ii = 1, ks%pt%nmodes
3293 write(aux,
'(a1,i3,a3)')
'q', ii,
'(t)'
3294 call write_iter_header(out_q, aux)
3296 do ii = 1, ks%pt%nmodes
3297 write(aux,
'(a1,i3,a3)')
'p', ii,
'(t)'
3298 call write_iter_header(out_q, aux)
3300 do ii = 1, space%dim
3301 write(aux,
'(a3,i3,a3)')
'f_pt', ii,
'(t)'
3302 call write_iter_header(out_q, aux)
3304 call write_iter_nl(out_q)
3305 call td_write_print_header_end(out_q)
3308 call write_iter_start(out_q)
3309 call write_iter_double(out_q, ks%pt_mx%pt_q, ks%pt%nmodes)
3310 call write_iter_double(out_q, ks%pt_mx%pt_p, ks%pt%nmodes)
3311 call write_iter_double(out_q, ks%pt_mx%fmf, space%dim)
3312 call write_iter_nl(out_q)
3321 type(c_ptr),
intent(inout) :: out_mxll
3322 type(mpi_grp_t),
intent(in) :: mpi_grp
3323 class(space_t),
intent(in) :: space
3324 type(hamiltonian_elec_t),
intent(in) :: hm
3325 real(real64),
intent(in) :: dt
3326 integer,
intent(in) :: iter
3329 real(real64) :: field(space%dim)
3330 character(len=80) :: aux
3331 character(len=1) :: field_char
3335 if (.not. mpi_grp%is_root())
then
3345 call td_write_print_header_init(out_mxll)
3347 write(aux,
'(a7,e20.12,3a)')
'# dt = ', units_from_atomic(units_out%time, dt), &
3348 " [", trim(units_abbrev(units_out%time)),
"]"
3349 call write_iter_string(out_mxll, aux)
3350 call write_iter_nl(out_mxll)
3352 call write_iter_header_start(out_mxll)
3353 select case (hm%mxll%coupling_mode)
3354 case (length_gauge_dipole, multipolar_expansion)
3355 if (hm%mxll%add_electric_dip) field_char =
'E'
3356 if (hm%mxll%add_magnetic_dip) field_char =
'B'
3357 do idir = 1, space%dim
3358 write(aux,
'(a,i1,a)') field_char //
'(', idir,
')'
3359 call write_iter_header(out_mxll, aux)
3361 case (velocity_gauge_dipole)
3362 do idir = 1, space%dim
3363 write(aux,
'(a,i1,a)')
'A(', idir,
')'
3364 call write_iter_header(out_mxll, aux)
3367 call write_iter_nl(out_mxll)
3369 call write_iter_string(out_mxll,
'#[Iter n.]')
3370 call write_iter_header(out_mxll,
'[' // trim(units_abbrev(units_out%time)) //
']')
3374 select case (hm%mxll%coupling_mode)
3375 case (length_gauge_dipole, multipolar_expansion)
3376 if (hm%mxll%add_electric_dip) aux =
'[' // trim(units_abbrev(units_out%force)) //
']'
3377 if (hm%mxll%add_magnetic_dip) aux =
'[' // trim(units_abbrev(unit_one/units_out%length**2)) //
']'
3378 do idir = 1, space%dim
3379 call write_iter_header(out_mxll, aux)
3381 case (velocity_gauge_dipole)
3382 aux =
'[' // trim(units_abbrev(units_out%energy)) //
']'
3383 do idir = 1, space%dim
3384 call write_iter_header(out_mxll, aux)
3387 call write_iter_nl(out_mxll)
3388 call td_write_print_header_end(out_mxll)
3391 call write_iter_start(out_mxll)
3394 select case (hm%mxll%coupling_mode)
3395 case (length_gauge_dipole, multipolar_expansion)
3396 if (hm%mxll%add_electric_dip) field = units_from_atomic(units_out%force, hm%mxll%e_field_dip)
3397 if (hm%mxll%add_magnetic_dip) field = units_from_atomic(unit_one/units_out%length**2, hm%mxll%b_field_dip)
3398 call write_iter_double(out_mxll, field, space%dim)
3399 case (velocity_gauge_dipole)
3400 field = units_from_atomic(units_out%energy, hm%mxll%vec_pot_dip)
3401 call write_iter_double(out_mxll, field, space%dim)
3403 call write_iter_nl(out_mxll)
3411 type(c_ptr),
intent(inout) :: out_coords
3412 type(mpi_grp_t),
intent(in) :: mpi_grp
3413 type(lda_u_t),
intent(in) :: lda_u
3414 integer,
intent(in) :: iter
3417 character(len=50) :: aux
3419 if (.not. mpi_grp%is_root())
return
3424 call td_write_print_header_init(out_coords)
3427 call write_iter_header_start(out_coords)
3429 do ios = 1, lda_u%norbsets
3430 write(aux,
'(a2,i3,a1)')
'Ueff(', ios,
')'
3431 call write_iter_header(out_coords, aux)
3434 do ios = 1, lda_u%norbsets
3435 write(aux,
'(a2,i3,a1)')
'U(', ios,
')'
3436 call write_iter_header(out_coords, aux)
3439 do ios = 1, lda_u%norbsets
3440 write(aux,
'(a2,i3,a1)')
'J(', ios,
')'
3441 call write_iter_header(out_coords, aux)
3444 if (lda_u%intersite)
then
3445 do ios = 1, lda_u%norbsets
3446 do inn = 1, lda_u%orbsets(ios)%nneighbors
3447 write(aux,
'(a2,i3,a1,i3,a1)')
'V(', ios,
'-', inn,
')'
3448 call write_iter_header(out_coords, aux)
3454 call write_iter_nl(out_coords)
3457 call write_iter_string(out_coords,
'#[Iter n.]')
3458 call write_iter_header(out_coords,
'[' // trim(units_abbrev(units_out%time)) //
']')
3459 call write_iter_string(out_coords, &
3460 'Effective U ' // trim(units_abbrev(units_out%energy)) // &
3461 ', U in '// trim(units_abbrev(units_out%energy)) // &
3462 ', J in ' // trim(units_abbrev(units_out%energy)))
3463 call write_iter_nl(out_coords)
3465 call td_write_print_header_end(out_coords)
3468 call write_iter_start(out_coords)
3470 do ios = 1, lda_u%norbsets
3471 call write_iter_double(out_coords, units_from_atomic(units_out%energy, &
3472 lda_u%orbsets(ios)%Ueff), 1)
3475 do ios = 1, lda_u%norbsets
3476 call write_iter_double(out_coords, units_from_atomic(units_out%energy, &
3477 lda_u%orbsets(ios)%Ubar), 1)
3480 do ios = 1, lda_u%norbsets
3481 call write_iter_double(out_coords, units_from_atomic(units_out%energy, &
3482 lda_u%orbsets(ios)%Jbar), 1)
3485 if (lda_u%intersite)
then
3486 do ios = 1, lda_u%norbsets
3487 do inn = 1, lda_u%orbsets(ios)%nneighbors
3488 call write_iter_double(out_coords, units_from_atomic(units_out%energy, &
3489 lda_u%orbsets(ios)%V_ij(inn,0)), 1)
3494 call write_iter_nl(out_coords)
3501 type(c_ptr),
intent(inout) :: file_handle
3502 type(grid_t),
intent(in) :: grid
3503 type(kpoints_t),
intent(in) :: kpoints
3504 type(states_elec_t),
intent(in) :: st
3505 integer,
intent(in) :: iter
3507 integer :: ik_ispin, ist
3508 character(len=7) :: nkpt_str, nst_str
3509 character(len=7) :: ik_str, ist_str
3510 real(real64),
allocatable :: norm_ks(:, :)
3511 real(real64) :: n_electrons
3515 safe_allocate(norm_ks(1:st%nst, 1:st%nik))
3516 call states_elec_calc_norms(grid, kpoints, st, norm_ks)
3518 if (st%system_grp%is_root())
then
3521 call td_write_print_header_init(file_handle)
3524 write(nkpt_str,
'(I7)') st%nik
3525 write(nst_str,
'(I7)') st%nst
3526 call write_iter_string(file_handle,
'# Dimensions. (nstates, nkpt * nspin):')
3527 call write_iter_string(file_handle, trim(adjustl(nst_str)) //
' ' // trim(adjustl(nkpt_str)))
3528 call write_iter_nl(file_handle)
3531 call write_iter_string(file_handle,
'# Norm ordering: (istate, ikpoint_spin)')
3532 call write_iter_nl(file_handle)
3535 call write_iter_header_start(file_handle)
3536 call write_iter_header(file_handle,
'N_electrons')
3537 do ik_ispin = 1, st%nik
3539 write(ik_str,
'(I7)') ik_ispin
3540 write(ist_str,
'(I7)') ist
3541 call write_iter_header(file_handle, &
3542 'Norm (' // trim(ist_str) //
',' // trim(ik_str) //
')')
3545 call write_iter_nl(file_handle)
3546 call td_write_print_header_end(file_handle)
3549 n_electrons = sum(st%occ * norm_ks**2)
3552 call write_iter_start(file_handle)
3553 call write_iter_double(file_handle, n_electrons, 1)
3554 do ik_ispin = 1, st%nik
3555 call write_iter_double(file_handle, norm_ks(:, ik_ispin),
size(norm_ks, 1))
3557 call write_iter_nl(file_handle)
3561 safe_deallocate_a(norm_ks)
3570 type(c_ptr),
intent(inout) :: file_handle
3571 type(ions_t),
intent(in) :: ions
3572 integer,
intent(in) :: iter
3575 real(real64) :: tmp(3)
3577 if (.not. ions%grp%is_root())
return
3581 assert(ions%space%dim == 3)
3584 call td_write_print_header_init(file_handle)
3587 call write_iter_header_start(file_handle)
3589 call write_iter_string(file_handle,
'# Iter, a, b, c, volume, alpha, beta, gamma, ' &
3590 //
'a_x, a_y, a_z, b_x, b_y, b_z, c_x, c_y, c_z')
3593 call write_iter_string(file_handle,
'#[Iter n.]')
3594 call write_iter_header(file_handle,
'[' // trim(units_abbrev(units_out%time)) //
']')
3595 call write_iter_string(file_handle, &
3596 'Lengths in ' // trim(units_abbrev(units_out%length)) // &
3597 ', Volume in ' // trim(units_abbrev(units_out%length**3)) // &
3598 ', Angles in degree, Lattice vectors in '// trim(units_abbrev(units_out%length)))
3599 call write_iter_nl(file_handle)
3601 call td_write_print_header_end(file_handle)
3604 call write_iter_start(file_handle)
3608 tmp(idir) = units_from_atomic(units_out%length, norm2(ions%latt%rlattice(1:3, idir)))
3610 call write_iter_double(file_handle, tmp, 3)
3613 tmp(1) = units_from_atomic(units_out%length**3, ions%latt%rcell_volume)
3614 call write_iter_double(file_handle, tmp(1), 1)
3617 call write_iter_double(file_handle, ions%latt%alpha, 1)
3618 call write_iter_double(file_handle, ions%latt%beta, 1)
3619 call write_iter_double(file_handle, ions%latt%gamma, 1)
3623 tmp(1:3) = units_from_atomic(units_out%length, ions%latt%rlattice(:, idir))
3624 call write_iter_double(file_handle, tmp, 3)
3626 call write_iter_nl(file_handle)
3635 type(namespace_t),
intent(in) :: namespace
3636 integer,
intent(in) :: iter
3637 real(real64),
intent(in) :: dt
3638 type(mpi_grp_t),
intent(in) :: grp
3640 integer :: default, flags, iout, first
3695 call parse_variable(namespace,
'MaxwellTDOutput', default, flags)
3697 if (.not. varinfo_valid_option(
'MaxwellTDOutput', flags, is_flag = .
true.))
then
3698 call messages_input_error(namespace,
'MaxwellTDOutput')
3702 writ%out(iout)%write = (iand(flags, 2**(iout - 1)) /= 0)
3703 if (writ%out(iout)%write)
then
3704 writ%out(iout + 1)%write = .
true.
3705 writ%out(iout + 2)%write = .
true.
3710 writ%out(iout)%write = (iand(flags, 2**(iout - 1)) /= 0)
3719 writ%out(:)%mpi_grp = grp
3721 call io_mkdir(
'td.general', namespace)
3726 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/total_e_field_x", namespace)))
3728 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/total_e_field_y", namespace)))
3730 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/total_e_field_z", namespace)))
3736 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/total_b_field_x", namespace)))
3738 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/total_b_field_y", namespace)))
3740 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/total_b_field_z", namespace)))
3746 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/longitudinal_e_field_x", namespace)))
3748 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/longitudinal_e_field_y", namespace)))
3750 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/longitudinal_e_field_z", namespace)))
3756 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/longitudinal_b_field_x", namespace)))
3758 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/longitudinal_b_field_y", namespace)))
3760 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/longitudinal_b_field_z", namespace)))
3766 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/transverse_e_field_x", namespace)))
3768 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/transverse_e_field_y", namespace)))
3770 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/transverse_e_field_z", namespace)))
3776 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/transverse_b_field_x", namespace)))
3778 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/transverse_b_field_y", namespace)))
3780 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/transverse_b_field_z", namespace)))
3786 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/maxwell_energy", namespace)))
3791 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/electric_field_surface-x", namespace)))
3796 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/electric_field_surface-y", namespace)))
3801 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/electric_field_surface-z", namespace)))
3806 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/magnetic_field_surface-x", namespace)))
3811 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/magnetic_field_surface-y", namespace)))
3816 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/magnetic_field_surface-z", namespace)))
3832 if (writ%out(iout)%write)
call write_iter_end(writ%out(iout)%handle)
3840 subroutine td_write_mxll_iter(writ, space, gr, st, hm, helmholtz, dt, iter, namespace)
3842 class(space_t),
intent(in) :: space
3843 type(grid_t),
intent(inout) :: gr
3844 type(states_mxll_t),
intent(inout) :: st
3845 type(hamiltonian_mxll_t),
intent(inout) :: hm
3846 type(helmholtz_decomposition_t),
intent(inout) :: helmholtz
3847 real(real64),
intent(in) :: dt
3848 integer,
intent(in) :: iter
3849 type(namespace_t),
intent(in) :: namespace
3854 call profiling_in(
"TD_WRITE_ITER_MAXWELL")
3857 call helmholtz%get_trans_field(namespace, st%rs_state_trans, total_field=st%rs_state)
3858 call get_rs_state_at_point(st%selected_points_rs_state_trans(:,:), st%rs_state_trans, &
3859 st%selected_points_coordinate(:,:), st, gr)
3862 hm%energy%energy_trans = m_zero
3866 call helmholtz%get_long_field(namespace, st%rs_state_long, total_field=st%rs_state)
3867 call get_rs_state_at_point(st%selected_points_rs_state_long(:,:), st%rs_state_long, &
3868 st%selected_points_coordinate(:,:), st, gr)
3871 hm%energy%energy_long = m_zero
3964 call profiling_out(
"TD_WRITE_ITER_MAXWELL")
3973 type(mpi_grp_t),
intent(in) :: mpi_grp
3974 type(hamiltonian_mxll_t),
intent(in) :: hm
3975 integer,
intent(in) :: iter
3979 integer :: n_columns
3981 if (.not. mpi_grp%is_root())
return
4006 call write_iter_header(
out_maxwell_energy,
'[' // trim(units_abbrev(units_out%time)) //
']')
4008 do ii = 1, n_columns
4009 call write_iter_header(
out_maxwell_energy,
'[' // trim(units_abbrev(units_out%energy)) //
']')
4017 call write_iter_double(
out_maxwell_energy, units_from_atomic(units_out%energy, hm%energy%energy), 1)
4018 call write_iter_double(
out_maxwell_energy, units_from_atomic(units_out%energy, hm%energy%e_energy), 1)
4019 call write_iter_double(
out_maxwell_energy, units_from_atomic(units_out%energy, hm%energy%b_energy), 1)
4021 hm%energy%energy+hm%energy%boundaries), 1)
4022 call write_iter_double(
out_maxwell_energy, units_from_atomic(units_out%energy, hm%energy%boundaries), 1)
4023 call write_iter_double(
out_maxwell_energy, units_from_atomic(units_out%energy, hm%energy%energy_trans), 1)
4024 call write_iter_double(
out_maxwell_energy, units_from_atomic(units_out%energy, hm%energy%energy_long), 1)
4025 call write_iter_double(
out_maxwell_energy, units_from_atomic(units_out%energy, hm%energy%energy_plane_waves), 1)
4034 type(c_ptr),
intent(inout) :: out_field_surf
4035 type(states_mxll_t),
intent(in) :: st
4036 integer,
intent(in) :: dim
4037 integer,
intent(in) :: iter
4041 integer :: n_columns
4043 if (.not. st%system_grp%is_root())
return
4050 call td_write_print_header_init(out_field_surf)
4053 call write_iter_header_start(out_field_surf)
4054 call write_iter_header(out_field_surf,
'- x direction')
4055 call write_iter_header(out_field_surf,
'+ x direction')
4056 call write_iter_header(out_field_surf,
'- y direction')
4057 call write_iter_header(out_field_surf,
'+ y direction')
4058 call write_iter_header(out_field_surf,
'- z direction')
4059 call write_iter_header(out_field_surf,
'+ z direction')
4060 call write_iter_header(out_field_surf,
'- x dir. p. w.')
4061 call write_iter_header(out_field_surf,
'+ x dir. p. w.')
4062 call write_iter_header(out_field_surf,
'- y dir. p. w.')
4063 call write_iter_header(out_field_surf,
'+ y dir. p. w.')
4064 call write_iter_header(out_field_surf,
'- z dir. p. w.')
4065 call write_iter_header(out_field_surf,
'+ z dir. p. w.')
4067 call write_iter_nl(out_field_surf)
4070 call write_iter_string(out_field_surf,
'#[Iter n.]')
4071 call write_iter_header(out_field_surf,
'[' // trim(units_abbrev(units_out%time)) //
']')
4073 do ii = 1, n_columns
4074 call write_iter_header(out_field_surf,
'[' // trim(units_abbrev(units_out%energy/units_out%length)) //
']')
4076 call write_iter_nl(out_field_surf)
4078 call td_write_print_header_end(out_field_surf)
4081 call write_iter_start(out_field_surf)
4082 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
4083 st%electric_field_box_surface(1,1,dim)), 1)
4084 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
4085 st%electric_field_box_surface(2,1,dim)), 1)
4086 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
4087 st%electric_field_box_surface(1,2,dim)), 1)
4088 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
4089 st%electric_field_box_surface(2,2,dim)), 1)
4090 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
4091 st%electric_field_box_surface(1,3,dim)), 1)
4092 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
4093 st%electric_field_box_surface(2,3,dim)), 1)
4094 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
4095 st%electric_field_box_surface_plane_waves(1,1,dim)), 1)
4096 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
4097 st%electric_field_box_surface_plane_waves(2,1,dim)), 1)
4098 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
4099 st%electric_field_box_surface_plane_waves(1,2,dim)), 1)
4100 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
4101 st%electric_field_box_surface_plane_waves(2,2,dim)), 1)
4102 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
4103 st%electric_field_box_surface_plane_waves(1,3,dim)), 1)
4104 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
4105 st%electric_field_box_surface_plane_waves(2,3,dim)), 1)
4106 call write_iter_nl(out_field_surf)
4114 type(c_ptr),
intent(inout) :: out_field_surf
4115 type(states_mxll_t),
intent(in) :: st
4116 integer,
intent(in) :: dim
4117 integer,
intent(in) :: iter
4121 integer :: n_columns
4123 if (.not. st%system_grp%is_root())
return
4130 call td_write_print_header_init(out_field_surf)
4133 call write_iter_header_start(out_field_surf)
4134 call write_iter_header(out_field_surf,
'- x direction')
4135 call write_iter_header(out_field_surf,
'+ x direction')
4136 call write_iter_header(out_field_surf,
'- y direction')
4137 call write_iter_header(out_field_surf,
'+ y direction')
4138 call write_iter_header(out_field_surf,
'- z direction')
4139 call write_iter_header(out_field_surf,
'+ z direction')
4140 call write_iter_header(out_field_surf,
'- x dir. p. w.')
4141 call write_iter_header(out_field_surf,
'+ x dir. p. w.')
4142 call write_iter_header(out_field_surf,
'- y dir. p. w.')
4143 call write_iter_header(out_field_surf,
'+ y dir. p. w.')
4144 call write_iter_header(out_field_surf,
'- z dir. p. w.')
4145 call write_iter_header(out_field_surf,
'+ z dir. p. w.')
4147 call write_iter_nl(out_field_surf)
4150 call write_iter_string(out_field_surf,
'#[Iter n.]')
4151 call write_iter_header(out_field_surf,
'[' // trim(units_abbrev(units_out%time)) //
']')
4153 do ii = 1, n_columns
4154 call write_iter_header(out_field_surf,
'[' // trim(units_abbrev(unit_one/units_out%length**2)) //
']')
4156 call write_iter_nl(out_field_surf)
4158 call td_write_print_header_end(out_field_surf)
4161 call write_iter_start(out_field_surf)
4162 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4163 st%magnetic_field_box_surface(1,1,dim)), 1)
4164 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4165 st%magnetic_field_box_surface(2,1,dim)), 1)
4166 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4167 st%magnetic_field_box_surface(1,2,dim)), 1)
4168 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4169 st%magnetic_field_box_surface(2,2,dim)), 1)
4170 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4171 st%magnetic_field_box_surface(1,3,dim)), 1)
4172 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4173 st%magnetic_field_box_surface(2,3,dim)), 1)
4174 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4175 st%magnetic_field_box_surface_plane_waves(1,1,dim)), 1)
4176 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4177 st%magnetic_field_box_surface_plane_waves(2,1,dim)), 1)
4178 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4179 st%magnetic_field_box_surface_plane_waves(1,2,dim)), 1)
4180 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4181 st%magnetic_field_box_surface_plane_waves(2,2,dim)), 1)
4182 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4183 st%magnetic_field_box_surface_plane_waves(1,3,dim)), 1)
4184 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4185 st%magnetic_field_box_surface_plane_waves(2,3,dim)), 1)
4186 call write_iter_nl(out_field_surf)
4192 subroutine td_write_fields(out_fields, space, st, iter, dt, e_or_b_field, field_type, idir)
4193 type(c_ptr),
intent(inout) :: out_fields
4194 class(space_t),
intent(in) :: space
4195 type(states_mxll_t),
intent(in) :: st
4196 integer,
intent(in) :: iter
4197 real(real64),
intent(in) :: dt
4198 integer,
intent(in) :: e_or_b_field
4199 integer,
intent(in) :: field_type
4200 integer,
intent(in) :: idir
4204 real(real64) :: field(space%dim), selected_field
4205 character(len=80) :: aux
4207 if (.not. st%system_grp%is_root())
return
4212 call td_write_print_header_init(out_fields)
4215 write(aux,
'(a7,e20.12,3a)')
'# dt = ', units_from_atomic(units_out%time, dt), &
4216 " [", trim(units_abbrev(units_out%time)),
"]"
4217 call write_iter_string(out_fields, aux)
4218 call write_iter_nl(out_fields)
4220 call write_iter_header_start(out_fields)
4222 do id = 1, st%selected_points_number
4223 select case (e_or_b_field)
4225 write(aux,
'(a,i1,a)')
'E(', id,
')'
4227 write(aux,
'(a,i1,a)')
'B(', id,
')'
4229 call write_iter_header(out_fields, aux)
4232 call write_iter_nl(out_fields)
4233 call write_iter_string(out_fields,
'#[Iter n.]')
4234 call write_iter_header(out_fields,
' [' // trim(units_abbrev(units_out%time)) //
']')
4239 aux =
' [' // trim(units_abbrev(units_out%force)) //
']'
4240 do id = 1, st%selected_points_number
4241 call write_iter_header(out_fields, aux)
4243 call write_iter_nl(out_fields)
4244 call td_write_print_header_end(out_fields)
4247 call write_iter_start(out_fields)
4249 do id = 1, st%selected_points_number
4250 select case (e_or_b_field)
4253 select case (field_type)
4255 call get_electric_field_vector(st%selected_points_rs_state(:,id), field(1:st%dim))
4257 call get_electric_field_vector(st%selected_points_rs_state_long(:,id), field(1:st%dim))
4259 call get_electric_field_vector(st%selected_points_rs_state_trans(:,id), field(1:st%dim))
4261 selected_field = units_from_atomic(units_out%energy/units_out%length, field(idir))
4264 select case (field_type)
4266 call get_magnetic_field_vector(st%selected_points_rs_state(:,id), st%rs_sign, field(1:st%dim))
4268 call get_magnetic_field_vector(st%selected_points_rs_state_long(:,id), st%rs_sign, field(1:st%dim))
4270 call get_magnetic_field_vector(st%selected_points_rs_state_trans(:,id), st%rs_sign, field(1:st%dim))
4272 selected_field = units_from_atomic(unit_one/units_out%length**2, field(idir))
4274 call write_iter_double(out_fields, selected_field, 1)
4277 call write_iter_nl(out_fields)
4285 type(namespace_t),
intent(in) :: namespace
4286 class(space_t),
intent(in) :: space
4287 type(grid_t),
intent(inout) :: gr
4288 type(states_mxll_t),
intent(inout) :: st
4289 type(hamiltonian_mxll_t),
intent(inout) :: hm
4290 type(helmholtz_decomposition_t),
intent(inout) :: helmholtz
4291 type(output_t),
intent(in) :: outp
4292 integer,
intent(in) :: iter
4293 real(real64),
intent(in) :: time
4295 character(len=256) :: filename
4297 push_sub(td_write_mxwll_free_data)
4298 call profiling_in(
"TD_WRITE_MAXWELL_DATA")
4301 write(filename,
'(a,a,i7.7)') trim(outp%iter_dir),
"td.", iter
4303 call output_mxll(outp, namespace, space, gr, st, hm, helmholtz, time, filename)
4305 call profiling_out(
"TD_WRITE_MAXWELL_DATA")
4306 pop_sub(td_write_mxwll_free_data)
4311 type(c_ptr),
intent(inout) :: out_dm_proj_basis
4312 type(states_elec_t),
intent(in) :: dmp_st
4313 integer,
intent(in) :: iter
4315 character(len=80) :: aux
4321 call td_write_print_header_init(out_dm_proj_basis)
4323 write(aux,
'(a15,i8)')
"# nspin ", dmp_st%d%nspin
4324 call write_iter_string(out_dm_proj_basis, aux)
4325 call write_iter_nl(out_dm_proj_basis)
4327 write(aux,
'(a15,i8)')
"# nik ", dmp_st%nik
4328 call write_iter_string(out_dm_proj_basis, aux)
4329 call write_iter_nl(out_dm_proj_basis)
4331 write(aux,
'(a15,2i8)')
"# st ", 1, dmp_st%nst
4332 call write_iter_string(out_dm_proj_basis, aux)
4333 call write_iter_nl(out_dm_proj_basis)
4335 write(aux,
'(a15)')
"# w(ik) "
4336 call write_iter_string(out_dm_proj_basis, aux)
4337 do ik = 1, dmp_st%nik
4338 call write_iter_double(out_dm_proj_basis, dmp_st%kweights(ik), 1)
4340 call write_iter_nl(out_dm_proj_basis)
4342 call td_write_print_header_end(out_dm_proj_basis)
4344 call write_iter_string(out_dm_proj_basis,
"# ------------")
4345 call write_iter_start(out_dm_proj_basis)
4346 call write_iter_double(out_dm_proj_basis, dmp_st%qtot, 1)
4347 call write_iter_nl(out_dm_proj_basis)
4348 do ik = 1, dmp_st%nik
4349 call write_iter_double(out_dm_proj_basis, dmp_st%eigenval(:, ik), dmp_st%nst)
4350 call write_iter_nl(out_dm_proj_basis)
4351 call write_iter_double(out_dm_proj_basis, dmp_st%occ(:, ik), dmp_st%nst)
4352 call write_iter_nl(out_dm_proj_basis)
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
subroutine td_write_dm_proj_basis(out_dm_proj_basis, dmp_st, iter)
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
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, dmp)
Initialize files to write when prograting in time.
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
subroutine, public td_write_iter(writ, namespace, space, outp, gr, st, hm, ions, ext_partners, kick, ks, dt, iter, mc, recalculate_gs, dmp_st)
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.
integer, parameter, public out_dm_proj_basis
subroutine td_write_eigs(out_eigs, st, iter)
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)
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)