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, &
686 fixed_occ=.
true., ierr=ierr, label =
': gs for TDOutput')
688 if (ierr /= 0 .and. ierr /= (writ%gs_st%st_end-writ%gs_st%st_start+1)*writ%gs_st%nik &
689 *writ%gs_st%d%dim*writ%gs_st%mpi_grp%size)
then
690 message(1) =
"Unable to read wavefunctions for TDOutput."
693 call restart_gs%end()
735 if (
parse_block(namespace,
'TDExcitedStatesToProject', blk) == 0)
then
737 safe_allocate(writ%excited_st(1:writ%n_excited_states))
738 do ist = 1, writ%n_excited_states
743 writ%n_excited_states = 0
757 call parse_variable(namespace,
'TDOutputComputeInterval', 50, writ%compute_interval)
758 if (writ%compute_interval < 0)
then
759 message(1) =
"TDOutputComputeInterval must be >= 0."
775 call io_mkdir(
'td.general', namespace)
782 writ%out(:)%mpi_grp = st%system_grp
783 writ%out_dftu(:)%mpi_grp = st%system_grp
785 if (st%system_grp%is_root())
then
787 do ifile = 1, out_max
791 if (writ%out(ifile)%write)
then
795 trim(
io_workpath(
"td.general/"//trim(td_file_name(ifile)), namespace)))
803 if (writ%out(out_multipoles)%write .and. .not. resolve_states)
then
806 trim(
io_workpath(
"td.general/multipoles", namespace)))
810 select case (kick%qkick_mode)
812 write(filename,
'(a)')
'td.general/ftchd.sin'
814 write(filename,
'(a)')
'td.general/ftchd.cos'
816 write(filename,
'(a, SP, I0.3, a, I0.3)')
'td.general/ftchd.l', kick%qbessel_l,
'_m', kick%qbessel_m
818 write(filename,
'(a)')
'td.general/ftchd'
830 call io_rm(
"td.general/laser", namespace=namespace)
848 if (writ%out(out_multipoles)%write .and. resolve_states)
then
850 writ%out(out_multipoles)%hand_start = st%st_start
851 writ%out(out_multipoles)%hand_end = st%st_end
852 writ%out(out_multipoles)%resolve_states = .
true.
853 writ%out(out_multipoles)%mpi_grp = gr%mpi_grp
855 safe_allocate(writ%out(out_multipoles)%mult_handles(st%st_start:st%st_end))
857 if (writ%out(out_multipoles)%mpi_grp%is_root())
then
858 do ist = st%st_start, st%st_end
859 write(filename,
'(a,i4.4)')
'td.general/multipoles-ist', ist
872 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, &
873 calc_eigenval=.false., time = iter*dt, calc_energy = .false.)
877 if (all(outp%how == 0) .and. writ%out(
out_n_ex)%write)
then
879 if (outp%how(option__output__current_kpt) + outp%how(option__output__density_kpt) /= 0)
then
880 call io_mkdir(outp%iter_dir, namespace)
902 if (hm%lda_u_level ==
dft_u_acbn0) default = default + 2**(out_dftu_effective_u - 1)
910 writ%out_dftu(iout)%write = (iand(flags, 2**(iout - 1)) /= 0)
913 if (st%system_grp%is_root())
then
914 if (writ%out_dftu(out_dftu_effective_u)%write)
then
917 trim(
io_workpath(
"td.general/effectiveU", namespace)))
935 if (writ%out(iout)%write)
then
936 if (writ%out(iout)%mpi_grp%is_root())
then
937 if (writ%out(iout)%resolve_states)
then
938 do ist = writ%out(iout)%hand_start, writ%out(iout)%hand_end
941 safe_deallocate_a(writ%out(iout)%mult_handles)
950 if (writ%out_dftu(iout)%write .and. writ%out_dftu(iout)%mpi_grp%is_root())
then
956 do ist = 1, writ%n_excited_states
959 writ%n_excited_states = 0
972 subroutine td_write_iter(writ, namespace, space, outp, gr, st, hm, ions, ext_partners, kick, ks, dt, &
973 iter, mc, recalculate_gs, dmp_st)
976 class(
space_t),
intent(in) :: space
978 type(
grid_t),
intent(in) :: gr
981 type(
ions_t),
intent(inout) :: ions
983 type(
kick_t),
intent(in) :: kick
984 type(
v_ks_t),
intent(in) :: ks
985 real(real64),
intent(in) :: dt
986 integer,
intent(in) :: iter
988 logical,
intent(in) :: recalculate_gs
997 if (writ%out(out_multipoles)%write)
then
998 call td_write_multipole(writ%out(out_multipoles), space, gr, ions, st, writ%lmax, kick, iter)
1021 if (writ%out(
out_proj)%write .and. mod(iter, writ%compute_interval) == 0)
then
1030 if (writ%out(
out_kp_proj)%write .and. mod(iter, writ%compute_interval) == 0)
then
1036 ions%pos, ions%vel, ions%tot_force, iter)
1041 ions%pos, ions%vel, ions%tot_force, iter, 1)
1046 ions%pos, ions%vel, ions%tot_force, iter, 2)
1051 ions%pos, ions%vel, ions%tot_force, iter, 3)
1062 if (writ%out(
out_acc)%write)
then
1063 call td_write_acc(writ%out(
out_acc)%handle, namespace, space, gr, ions, st, hm, ext_partners, dt, iter)
1066 if (writ%out(
out_vel)%write)
then
1079 if(
associated(gfield))
then
1109 if (writ%out(
out_n_ex)%write .and. mod(iter, writ%compute_interval) == 0)
then
1111 if (recalculate_gs)
then
1114 ierr=ierr, label =
': Houston states for TDOutput')
1118 call td_write_n_ex(writ%out(
out_n_ex)%handle, outp, namespace, gr, hm%kpoints, st, writ%gs_st, iter)
1130 if (writ%out_dftu(out_dftu_effective_u)%write)
then
1132 writ%out_dftu(out_dftu_effective_u)%mpi_grp, hm%lda_u, iter)
1135 if (writ%out(
out_q)%write .and. ks%has_photons)
then
1139 if (writ%out(
out_mxll_field)%write .and. hm%mxll%calc_field_dip)
then
1141 space, hm, dt, iter)
1144 if (writ%out(
out_dm_proj_basis)%write .and. mod(iter, writ%compute_interval) == 0)
then
1145 if (st%system_grp%is_root())
then
1164 do iout = 1, out_max
1166 if (writ%out(iout)%write)
then
1167 if (writ%out(iout)%mpi_grp%is_root())
then
1168 if (writ%out(iout)%resolve_states)
then
1169 do ii = writ%out(iout)%hand_start, writ%out(iout)%hand_end
1180 if (writ%out_dftu(iout)%write .and. writ%out(
out_proj)%mpi_grp%is_root())
then
1190 subroutine td_write_output(namespace, space, gr, st, hm, ks, outp, ions, ext_partners, iter, dt)
1193 type(
grid_t),
intent(in) :: gr
1196 type(
v_ks_t),
intent(inout) :: ks
1198 type(
ions_t),
intent(in) :: ions
1200 integer,
intent(in) :: iter
1201 real(real64),
optional,
intent(in) :: dt
1203 character(len=256) :: filename
1209 if (st%modelmbparticles%nparticle > 0)
then
1214 write(filename,
'(a,a,i7.7)') trim(outp%iter_dir),
"td.", iter
1216 call output_all(outp, namespace, space, filename, gr, ions, iter, st, hm, ks)
1218 call output_modelmb(outp, namespace, space, filename, gr, ions, iter, st)
1220 if (
present(dt))
then
1221 call output_scalar_pot(outp, namespace, space, filename, gr, ions, ext_partners, iter*dt)
1223 if (iter == 0)
call output_scalar_pot(outp, namespace, space, filename, gr, ions, ext_partners)
1232 type(c_ptr),
intent(inout) ::
out_spin
1234 class(
mesh_t),
intent(in) :: mesh
1236 integer,
intent(in) :: iter
1238 character(len=130) :: aux
1239 real(real64) :: spin(3)
1248 if (mpi_grp%is_root())
then
1255 if (st%d%ispin ==
spinors)
then
1256 write(aux,
'(a2,18x)')
'Sx'
1258 write(aux,
'(a2,18x)')
'Sy'
1261 write(aux,
'(a2,18x)')
'Sz'
1269 select case (st%d%ispin)
1286 type(
grid_t),
intent(in) :: gr
1288 type(
ions_t),
intent(in) :: ions
1289 real(real64),
intent(in) :: lmm_r
1290 integer,
intent(in) :: iter
1293 character(len=50) :: aux
1294 real(real64),
allocatable :: lmm(:,:)
1299 safe_allocate(lmm(1:3, 1:ions%natoms))
1302 if (st%system_grp%is_root())
then
1309 do ia = 1, ions%natoms
1310 if (st%d%ispin ==
spinors)
then
1311 write(aux,
'(a2,i2.2,16x)')
'mx', ia
1313 write(aux,
'(a2,i2.2,16x)')
'my', ia
1316 write(aux,
'(a2,i2.2,16x)')
'mz', ia
1325 do ia = 1, ions%natoms
1326 select case (st%d%ispin)
1336 safe_deallocate_a(lmm)
1343 type(c_ptr),
intent(inout) :: out_magnets
1344 class(
mesh_t),
intent(in) :: mesh
1346 type(
kick_t),
intent(in) :: kick
1347 integer,
intent(in) :: iter
1349 complex(real64),
allocatable :: tm(:,:)
1354 safe_allocate(tm(1:6,1:kick%nqvec))
1356 do iq = 1, kick%nqvec
1360 if (st%system_grp%is_root())
then
1386 do iq = 1, kick%nqvec
1395 safe_deallocate_a(tm)
1409 subroutine td_write_angular(out_angular, namespace, space, gr, ions, hm, st, kick, iter)
1410 type(c_ptr),
intent(inout) :: out_angular
1412 class(
space_t),
intent(in) :: space
1413 type(
grid_t),
intent(in) :: gr
1414 type(
ions_t),
intent(inout) :: ions
1417 type(
kick_t),
intent(in) :: kick
1418 integer,
intent(in) :: iter
1421 character(len=130) :: aux
1422 real(real64) :: angular(3)
1429 call angular_momentum%setup_dir(idir)
1432 m_two*real(angular_momentum%zstates_elec_expectation_value(namespace, space, gr, hm, st), real64)
1434 safe_deallocate_p(angular_momentum)
1436 if (st%system_grp%is_root())
then
1441 write(aux,
'(a15,i2)')
'# nspin ', st%d%nspin
1449 write(aux,
'(a4,18x)')
'<Lx>'
1451 write(aux,
'(a4,18x)')
'<Ly>'
1453 write(aux,
'(a4,18x)')
'<Lz>'
1482 class(
space_t),
intent(in) :: space
1483 type(
grid_t),
intent(in) :: gr
1484 type(
ions_t),
intent(in) :: ions
1486 integer,
intent(in) :: lmax
1487 type(
kick_t),
intent(in) :: kick
1488 integer,
intent(in) :: iter
1491 real(real64),
allocatable :: rho(:,:)
1495 if (out_multip%resolve_states)
then
1496 safe_allocate(rho(1:gr%np_part, 1:st%d%nspin))
1499 do ist = st%st_start, st%st_end
1501 call td_write_multipole_r(out_multip%mult_handles(ist), space, gr, ions, st, lmax, kick, rho, iter, &
1502 mpi_grp = out_multip%mpi_grp)
1505 safe_deallocate_a(rho)
1508 if (
allocated(st%frozen_rho))
then
1509 safe_allocate(rho(1:gr%np, 1:st%d%nspin))
1510 call lalg_copy(gr%np, st%d%nspin, st%rho, rho)
1515 safe_deallocate_a(rho)
1527 subroutine td_write_multipole_r(out_multip, space, mesh, ions, st, lmax, kick, rho, iter, mpi_grp)
1528 type(c_ptr),
intent(inout) :: out_multip
1529 class(
space_t),
intent(in) :: space
1530 class(
mesh_t),
intent(in) :: mesh
1531 type(
ions_t),
intent(in) :: ions
1533 integer,
intent(in) :: lmax
1534 type(
kick_t),
intent(in) :: kick
1535 real(real64),
intent(in) :: rho(:,:)
1536 integer,
intent(in) :: iter
1537 type(
mpi_grp_t),
optional,
intent(in) :: mpi_grp
1540 integer :: is, idir, ll, mm, add_lm
1541 character(len=120) :: aux
1542 real(real64) :: ionic_dipole(ions%space%dim)
1543 real(real64),
allocatable :: multipole(:,:)
1549 assert(.not. (lmax > 1 .and. space%dim > 3))
1551 mpi_grp_ = st%system_grp
1552 if (
present(mpi_grp)) mpi_grp_ = mpi_grp
1554 if (mpi_grp_%is_root().and.iter == 0)
then
1557 write(aux,
'(a15,i2)')
'# nspin ', st%d%nspin
1561 write(aux,
'(a15,i2)')
'# lmax ', lmax
1569 do is = 1, st%d%nspin
1570 write(aux,
'(a18,i1,a1)')
'Electronic charge(', is,
')'
1573 do idir = 1, space%dim
1574 write(aux,
'(4a1,i1,a1)')
'<',
index2axis(idir),
'>',
'(', is,
')'
1580 write(aux,
'(a2,i2,a4,i2,a2,i1,a1)')
'l=', ll,
', m=', mm,
' (', is,
')'
1591 do is = 1, st%d%nspin
1594 do idir = 1, space%dim
1610 if (space%dim > 3 .and. lmax == 1)
then
1612 safe_allocate(multipole(1:space%dim+1, 1:st%d%nspin))
1614 safe_allocate(multipole(1:(lmax + 1)**2, 1:st%d%nspin))
1618 do is = 1, st%d%nspin
1623 ionic_dipole = ions%dipole()
1624 do is = 1, st%d%nspin
1625 multipole(2:space%dim+1, is) = -ionic_dipole(1:space%dim)/st%d%nspin - multipole(2:space%dim+1, is)
1629 if (mpi_grp_%is_root())
then
1631 do is = 1, st%d%nspin
1634 do idir = 1, space%dim
1638 add_lm = space%dim + 2
1649 safe_deallocate_a(multipole)
1654 subroutine td_write_ftchd(out_ftchd, space, mesh, st, kick, iter)
1655 type(c_ptr),
intent(inout) :: out_ftchd
1656 class(
space_t),
intent(in) :: space
1657 class(
mesh_t),
intent(in) :: mesh
1659 type(
kick_t),
intent(in) :: kick
1660 integer,
intent(in) :: iter
1662 integer :: is, ip, idir
1663 character(len=120) :: aux, aux2
1664 real(real64) :: ftchd_bessel
1665 complex(real64) :: ftchd
1667 real(real64),
allocatable :: integrand_bessel(:)
1668 complex(real64),
allocatable :: integrand(:)
1672 if (st%system_grp%is_root().and.iter == 0)
then
1675 write(aux,
'(a15, i2)')
'# qkickmode ', kick%qkick_mode
1680 write(aux,
'(a15, i0.3, 1x, i0.3)')
'# ll, mm ', kick%qbessel_l, kick%qbessel_m
1686 write(aux,
'(a15, f9.6)')
'# qlength ', kick%qlength
1688 write(aux,
'(a15)')
'# qvector '
1689 do idir = 1, space%dim
1690 write(aux2,
'(f9.5)') kick%qvector(idir,1)
1691 aux = trim(aux) // trim(aux2)
1697 write(aux,
'(a15,f18.12)')
'# kick strength', kick%delta_strength
1703 write(aux,
'(a17)')
'int(j_l*Y_lm*rho)'
1705 write(aux,
'(a12)')
'Real, Imag'
1722 safe_allocate(integrand(1:mesh%np))
1724 do is = 1, st%d%nspin
1726 integrand(ip) = integrand(ip) + st%rho(ip, is) *
exp(-
m_zi*sum(mesh%x(1:space%dim, ip)*kick%qvector(1:space%dim, 1)))
1730 safe_deallocate_a(integrand)
1733 safe_allocate(integrand_bessel(1:mesh%np))
1734 integrand_bessel =
m_zero
1735 do is = 1, st%d%nspin
1737 call ylmr_real(mesh%x(1:3, ip), kick%qbessel_l, kick%qbessel_m, ylm)
1738 integrand_bessel(ip) = integrand_bessel(ip) + st%rho(ip, is) * &
1739 loct_sph_bessel(kick%qbessel_l, kick%qlength*norm2(mesh%x(:, ip)))*ylm
1743 safe_deallocate_a(integrand_bessel)
1746 if (st%system_grp%is_root())
then
1762 type(c_ptr),
intent(inout) :: out_temperature
1764 type(
ions_t),
intent(in) :: ions
1765 integer,
intent(in) :: iter
1767 if (.not. mpi_grp%is_root())
return
1800 type(c_ptr),
intent(inout) :: out_populations
1802 class(
space_t),
intent(in) :: space
1803 class(
mesh_t),
intent(in) :: mesh
1806 real(real64),
intent(in) :: dt
1807 integer,
intent(in) :: iter
1810 character(len=6) :: excited_name
1811 complex(real64) :: gsp
1812 complex(real64),
allocatable :: excited_state_p(:)
1813 complex(real64),
allocatable :: dotprodmatrix(:, :, :)
1818 safe_allocate(dotprodmatrix(1:writ%gs_st%nst, 1:st%nst, 1:st%nik))
1823 assert(.not. space%is_periodic())
1828 if (writ%n_excited_states > 0)
then
1829 safe_allocate(excited_state_p(1:writ%n_excited_states))
1830 do ist = 1, writ%n_excited_states
1831 excited_state_p(ist) =
zstates_elec_mpdotp(namespace, mesh, writ%excited_st(ist), st, dotprodmatrix)
1835 if (st%system_grp%is_root())
then
1843 do ist = 1, writ%n_excited_states
1844 write(excited_name,
'(a2,i3,a1)')
'P(', ist,
')'
1863 do ist = 1, writ%n_excited_states
1870 if (writ%n_excited_states > 0)
then
1871 safe_deallocate_a(excited_state_p)
1873 safe_deallocate_a(dotprodmatrix)
1879 subroutine td_write_acc(out_acc, namespace, space, gr, ions, st, hm, ext_partners, dt, iter)
1880 type(c_ptr),
intent(inout) :: out_acc
1882 class(
space_t),
intent(in) :: space
1883 type(
grid_t),
intent(in) :: gr
1884 type(
ions_t),
intent(inout) :: ions
1888 real(real64),
intent(in) :: dt
1889 integer,
intent(in) :: iter
1892 character(len=7) :: aux
1893 real(real64) :: acc(space%dim)
1897 if (iter == 0 .and. st%system_grp%is_root())
then
1902 do idim = 1, space%dim
1903 write(aux,
'(a4,i1,a1)')
'Acc(', idim,
')'
1911 do idim = 1, space%dim
1918 call td_calc_tacc(namespace, space, gr, ions, ext_partners, st, hm, acc, dt*iter)
1920 if (st%system_grp%is_root())
then
1931 subroutine td_write_vel(out_vel, namespace, gr, st, space, hm, ions, iter)
1932 type(c_ptr),
intent(inout) :: out_vel
1934 type(
grid_t),
intent(in) :: gr
1936 type(
space_t),
intent(in) :: space
1938 type(
ions_t),
intent(in) :: ions
1939 integer,
intent(in) :: iter
1942 character(len=7) :: aux
1943 real(real64) :: vel(space%dim)
1947 if (iter == 0 .and. st%system_grp%is_root())
then
1952 do idim = 1, space%dim
1953 write(aux,
'(a4,i1,a1)')
'Vel(', idim,
')'
1961 do idim = 1, space%dim
1968 call td_calc_tvel(namespace, gr, st, space, hm, ions, vel)
1970 if (st%system_grp%is_root())
then
1982 subroutine td_write_laser(out_laser, mpi_grp, space, lasers, dt, iter)
1983 type(c_ptr),
intent(inout) :: out_laser
1985 class(
space_t),
intent(in) :: space
1986 type(
lasers_t),
intent(inout) :: lasers
1987 real(real64),
intent(in) :: dt
1988 integer,
intent(in) :: iter
1991 real(real64) :: field(space%dim)
1992 real(real64) :: ndfield(space%dim)
1993 character(len=80) :: aux
1995 if (.not. mpi_grp%is_root())
return
2009 do il = 1, lasers%no_lasers
2012 do idir = 1, space%dim
2013 write(aux,
'(a,i1,a)')
'E(', idir,
')'
2017 do idir = 1, space%dim
2018 write(aux,
'(a,i1,a)')
'B(', idir,
')'
2022 do idir = 1, space%dim
2023 write(aux,
'(a,i1,a)')
'A(', idir,
')'
2027 write(aux,
'(a,i1,a)')
'e(t)'
2033 do idir = 1, space%dim
2034 write(aux,
'(a,i1,a)')
'A^M(', idir,
')'
2046 do il = 1, lasers%no_lasers
2050 do idir = 1, space%dim
2055 do idir = 1, space%dim
2066 do idir = 1, space%dim
2079 do il = 1, lasers%no_lasers
2081 call laser_field(lasers%lasers(il), field(1:space%dim), iter*dt)
2106 type(c_ptr),
intent(inout) :: out_energy
2109 integer,
intent(in) :: iter
2110 real(real64),
intent(in) :: ke
2114 integer :: n_columns
2116 if (.not. mpi_grp%is_root())
return
2137 if (hm%pcm%run_pcm)
then
2139 n_columns = n_columns + 1
2144 n_columns = n_columns + 1
2154 do ii = 1, n_columns
2177 hm%energy%int_nn_pcm + hm%energy%int_ne_pcm), 1)
2190 type(c_ptr),
intent(inout) :: out_eigs
2192 integer,
intent(in) :: iter
2195 character(len=68) :: buf
2199 if (.not. st%system_grp%is_root())
then
2208 write(buf,
'(a15,i2)')
'# nst ', st%nst
2212 write(buf,
'(a15,i2)')
'# nspin ', st%d%nspin
2218 do is = 1, st%d%kpt%nglobal
2220 write(buf,
'(a,i4)')
'Eigenvalue ',ii
2229 do is = 1, st%d%kpt%nglobal
2239 do is = 1, st%d%kpt%nglobal
2251 type(c_ptr),
intent(inout) :: out_ionch
2252 class(
mesh_t),
intent(in) :: mesh
2254 integer,
intent(in) :: iter
2256 integer :: ii, ist, Nch, ik, idim
2257 character(len=68) :: buf
2258 real(real64),
allocatable :: ch(:), occ(:)
2259 real(real64),
allocatable :: occbuf(:)
2264 nch = st%nst * st%d%kpt%nglobal * st%d%dim
2265 safe_allocate(ch(0: nch))
2266 safe_allocate(occ(0: nch))
2272 do idim = 1, st%d%dim
2273 if (st%st_start <= ist .and. ist <= st%st_end .and. &
2274 st%d%kpt%start <= ik .and. ik <= st%d%kpt%end)
then
2275 occ(ii) = st%occ(ist, ik)
2283 if (st%parallel_in_states)
then
2284 safe_allocate(occbuf(0: nch))
2286 call st%mpi_grp%allreduce(occ(0), occbuf(0), nch+1, mpi_double_precision, mpi_sum)
2288 safe_deallocate_a(occbuf)
2295 if (.not. st%system_grp%is_root())
then
2296 safe_deallocate_a(ch)
2297 safe_deallocate_a(occ)
2310 if (occ(ii)>
m_zero .or. ii == 0)
then
2311 write(buf,
'(a,f4.1,a)')
'Pion(',occ(ii)*ii,
'+, t)'
2321 if (occ(ii)>
m_zero .or. ii == 0)
then
2331 if (occ(ii)>
m_zero .or. ii == 0)
then
2337 safe_deallocate_a(ch)
2338 safe_deallocate_a(occ)
2344 subroutine td_write_proj(out_proj, space, mesh, ions, st, gs_st, kick, iter)
2345 type(c_ptr),
intent(inout) :: out_proj
2346 class(
space_t),
intent(in) :: space
2347 class(
mesh_t),
intent(in) :: mesh
2348 type(
ions_t),
intent(in) :: ions
2351 type(
kick_t),
intent(in) :: kick
2352 integer,
intent(in) :: iter
2354 complex(real64),
allocatable :: projections(:,:,:)
2355 character(len=80) :: aux
2356 integer :: ik, ist, uist, idir
2361 if (st%system_grp%is_root())
then
2364 write(aux,
'(a15,i2)')
'# nspin ', st%d%nspin
2373 write(aux,
'(a,i8)')
"# nik ", st%nik
2377 write(aux,
'(a,2i8)')
"# st ", gs_st%st_start, st%nst
2381 write(aux,
'(a,2i8)')
"# ust ", gs_st%st_start, gs_st%st_end
2387 do ist = gs_st%st_start, st%nst
2395 do ist = gs_st%st_start, st%nst
2396 do uist = gs_st%st_start, gs_st%st_end
2397 write(aux,
'(i4,a,i4)') ist,
' -> ', uist
2408 if (.not. space%is_periodic())
then
2410 safe_allocate(projections(1:st%nst, gs_st%st_start:gs_st%st_end, 1:st%nik))
2411 do idir = 1, space%dim
2416 if (st%system_grp%is_root())
then
2417 write(aux,
'(a,i1,a)')
"<i|x_", idir,
"|a>"
2421 do ist = gs_st%st_start, st%st_end
2422 do uist = gs_st%st_start, gs_st%st_end
2432 safe_deallocate_a(projections)
2436 if (st%system_grp%is_root())
then
2442 safe_allocate(projections(1:st%nst, gs_st%st_start:gs_st%st_end, 1:st%nik))
2443 projections(:,:,:) =
m_z0
2446 if (st%system_grp%is_root())
then
2449 do ist = gs_st%st_start, st%nst
2450 do uist = gs_st%st_start, gs_st%st_end
2459 safe_deallocate_a(projections)
2465 integer,
intent(in) :: dir
2467 integer :: uist, ist, ik, idim
2468 real(real64) :: n_dip(space%dim)
2469 complex(real64),
allocatable :: xpsi(:,:)
2470 complex(real64),
allocatable :: psi(:, :), gspsi(:, :)
2474 safe_allocate(psi(1:mesh%np, 1:st%d%dim))
2475 safe_allocate(gspsi(1:mesh%np, 1:st%d%dim))
2476 safe_allocate(xpsi(1:mesh%np, 1:st%d%dim))
2478 do ik = st%d%kpt%start, st%d%kpt%end
2479 do ist = st%st_start, st%st_end
2481 do uist = gs_st%st_start, gs_st%st_end
2484 do idim = 1, st%d%dim
2485 xpsi(1:mesh%np, idim) = mesh%x_t(1:mesh%np, dir)*gspsi(1:mesh%np, idim)
2487 projections(ist, uist, ik) = -
zmf_dotp(mesh, st%d%dim, psi, xpsi, reduce = .false.)
2493 safe_deallocate_a(xpsi)
2494 safe_deallocate_a(gspsi)
2495 safe_deallocate_a(psi)
2500 n_dip = ions%dipole()
2502 do ist = gs_st%st_start, st%nst
2503 do uist = gs_st%st_start, gs_st%st_end
2504 projections(ist, uist, ik) = projections(ist, uist, ik) - n_dip(dir)
2520 subroutine td_write_n_ex(out_nex, outp, namespace, mesh, kpoints, st, gs_st, iter)
2521 type(c_ptr),
intent(inout) :: out_nex
2524 class(
mesh_t),
intent(in) :: mesh
2528 integer,
intent(in) :: iter
2530 complex(real64),
allocatable :: projections(:,:)
2531 character(len=80) :: aux, dir
2532 integer :: ik, ikpt, ist, uist, err
2533 real(real64) :: Nex, weight
2535 real(real64),
allocatable :: Nex_kpt(:)
2541 if (st%system_grp%is_root())
then
2544 write(aux,
'(a15,i2)')
'# nspin ', st%d%nspin
2551 write(aux,
'(a,i8)')
"# nik ", st%nik
2555 write(aux,
'(a,2i8)')
"# st ", gs_st%st_start, st%nst
2559 write(aux,
'(a,2i8)')
"# ust ", gs_st%st_start, gs_st%st_end
2569 if (st%system_grp%is_root())
then
2578 do ist = 1, gs_st%nst
2579 if (gs_st%occ(ist, ik) >
m_min_occ .and. ist > gs_nst) gs_nst = ist
2583 safe_allocate(projections(1:gs_nst, 1:st%nst))
2585 safe_allocate(nex_kpt(1:st%nik))
2587 do ik = st%d%kpt%start, st%d%kpt%end
2588 ikpt = st%d%get_kpoint_index(ik)
2591 weight = st%kweights(ik) * gs_st%occ(ist, ik)/ st%smear%el_per_state
2592 do uist = st%st_start, st%st_end
2593 nex_kpt(ikpt) = nex_kpt(ikpt) - weight * st%occ(uist, ik) * abs(projections(ist, uist))**2
2596 nex_kpt(ikpt) = nex_kpt(ikpt) + sum(st%occ(st%st_start:st%st_end, ik))*st%kweights(ik)
2599 if (st%parallel_in_states .or. st%d%kpt%parallel)
then
2605 if (st%system_grp%is_root())
then
2611 write(dir,
'(a,a,i7.7)') trim(outp%iter_dir),
"td.", iter
2614 + outp%how(option__output__density_kpt), dir,
"n_excited_el_kpt", namespace, &
2618 safe_deallocate_a(projections)
2619 safe_deallocate_a(nex_kpt)
2631 class(
mesh_t),
intent(in) :: mesh
2634 complex(real64),
intent(inout) :: projections(1:st%nst, gs_st%st_start:gs_st%nst, 1:st%nik)
2636 integer :: uist, ist, ik
2637 complex(real64),
allocatable :: psi(:, :), gspsi(:, :)
2640 safe_allocate(psi(1:mesh%np, 1:st%d%dim))
2641 safe_allocate(gspsi(1:mesh%np, 1:st%d%dim))
2643 projections(:,:,:) =
m_zero
2645 do ik = st%d%kpt%start, st%d%kpt%end
2646 do ist = st%st_start, st%st_end
2648 do uist = gs_st%st_start, gs_st%nst
2650 projections(ist, uist, ik) =
zmf_dotp(mesh, st%d%dim, psi, gspsi, reduce = .false.)
2655 safe_deallocate_a(psi)
2656 safe_deallocate_a(gspsi)
2665 class(
mesh_t),
intent(in) :: mesh
2670 integer,
intent(in) :: iter
2672 complex(real64),
allocatable :: proj(:,:), psi(:,:,:), gs_psi(:,:,:), temp_state(:,:)
2673 character(len=80) :: filename1, filename2
2674 integer :: ik,ist, jst, file, idim, nk_proj
2678 write(filename1,
'(I10)') iter
2679 filename1 =
'td.general/projections_iter_'//trim(adjustl(filename1))
2682 safe_allocate(proj(1:gs_st%nst, 1:gs_st%nst))
2683 safe_allocate(psi(1:gs_st%nst,1:gs_st%d%dim,1:mesh%np))
2684 safe_allocate(gs_psi(1:gs_st%nst,1:gs_st%d%dim,1:mesh%np))
2685 safe_allocate(temp_state(1:mesh%np,1:gs_st%d%dim))
2691 nk_proj = kpoints%nik_skip
2693 do ik = kpoints%reduced%npoints-nk_proj+1, kpoints%reduced%npoints
2695 psi(1:gs_st%nst, 1:gs_st%d%dim, 1:mesh%np)=
m_zero
2696 gs_psi(1:gs_st%nst, 1:gs_st%d%dim, 1:mesh%np)=
m_zero
2698 if (st%system_grp%is_root())
then
2699 write(filename2,
'(I10)') ik
2700 filename2 = trim(adjustl(filename1))//
'_ik_'//trim(adjustl(filename2))
2701 file =
io_open(filename2, namespace, action=
'write')
2704 do ist=gs_st%st_start,gs_st%st_end
2707 do idim = 1,gs_st%d%dim
2708 psi(ist,idim,1:mesh%np) = temp_state(1:mesh%np,idim)
2711 do idim = 1,gs_st%d%dim
2712 gs_psi(ist,idim,1:mesh%np) = temp_state(1:mesh%np,idim)
2721 assert(mesh%np_global*gs_st%d%dim < huge(0_int32))
2722 proj(1:gs_st%nst, 1:gs_st%nst) =
m_zero
2727 i8_to_i4(mesh%np_global*gs_st%d%dim), &
2728 cmplx(mesh%volume_element,
m_zero, real64) , &
2730 ubound(psi, dim = 1), &
2732 ubound(gs_psi, dim = 1), &
2735 ubound(proj, dim = 1))
2738 if (st%system_grp%is_root())
then
2739 do ist = 1, gs_st%nst
2740 do jst = 1, gs_st%nst
2741 write(file,
'(I3,1x,I3,1x,e13.6,1x,e13.6,2x)') ist, jst, proj(ist,jst)
2749 safe_deallocate_a(proj)
2750 safe_deallocate_a(psi)
2751 safe_deallocate_a(gs_psi)
2752 safe_deallocate_a(temp_state)
2758 subroutine td_write_floquet(namespace, space, hm, ext_partners, gr, st, iter)
2759 type(namespace_t),
intent(in) :: namespace
2760 class(space_t),
intent(in) :: space
2761 type(hamiltonian_elec_t),
intent(inout) :: hm
2762 type(partner_list_t),
intent(in) :: ext_partners
2763 type(grid_t),
intent(in) :: gr
2764 type(states_elec_t),
intent(inout) :: st
2765 integer,
intent(in) :: iter
2767 complex(real64),
allocatable :: hmss(:,:), psi(:,:,:), hpsi(:,:,:), temp_state1(:,:)
2768 complex(real64),
allocatable :: HFloquet(:,:,:), HFloq_eff(:,:), temp(:,:)
2769 real(real64),
allocatable :: eigenval(:), bands(:,:)
2770 character(len=80) :: filename
2771 integer :: it, nT, ik, ist, in, im, file, idim, nik, ik_count
2772 integer :: Forder, Fdim, m0, n0, n1, nst, ii, jj, lim_nst
2773 logical :: downfolding
2774 type(states_elec_t) :: hm_st
2776 real(real64) :: dt, Tcycle, omega
2780 downfolding = .false.
2783 if (.not. iter == 0)
then
2791 assert(gr%np == gr%np_global)
2794 call states_elec_copy(hm_st, st)
2805 call parse_variable(namespace,
'TDFloquetFrequency', m_zero, omega, units_inp%energy)
2806 call messages_print_var_value(
'Frequency used for Floquet analysis', omega, namespace=namespace)
2807 if (abs(omega) <= m_epsilon)
then
2808 message(1) =
"Please give a non-zero value for TDFloquetFrequency"
2809 call messages_fatal(1, namespace=namespace)
2813 tcycle = m_two * m_pi / omega
2823 call parse_variable(namespace,
'TDFloquetSample',20 ,nt)
2824 call messages_print_var_value(
'Number of Floquet time-sampling points', nt, namespace=namespace)
2825 dt = tcycle/real(nt, real64)
2834 call parse_variable(namespace,
'TDFloquetDimension',-1,forder)
2835 if (forder .ge. 0)
then
2836 call messages_print_var_value(
'Order of multiphoton Floquet-Hamiltonian', forder, namespace=namespace)
2838 fdim = 2 * forder + 1
2840 message(1) =
'Floquet-Hamiltonian is downfolded'
2841 call messages_info(1, namespace=namespace)
2842 downfolding = .
true.
2847 dt = tcycle/real(nt, real64)
2850 nik = hm%kpoints%nik_skip
2852 safe_allocate(hmss(1:nst,1:nst))
2853 safe_allocate( psi(1:nst,1:st%d%dim,1:gr%np))
2854 safe_allocate(hpsi(1:nst,1:st%d%dim,1:gr%np))
2855 safe_allocate(temp_state1(1:gr%np,1:st%d%dim))
2863 safe_allocate(hfloquet(1:nik,1:nst*fdim, 1:nst*fdim))
2864 hfloquet(1:nik,1:nst*fdim, 1:nst*fdim) = m_zero
2869 call hm%update(gr, namespace, space, ext_partners, time=tcycle+it*dt)
2871 call zhamiltonian_elec_apply_all(hm, namespace, gr, st, hm_st)
2876 do ik = hm%kpoints%reduced%npoints-nik+1, hm%kpoints%reduced%npoints
2877 ik_count = ik_count + 1
2879 psi(1:nst, 1:st%d%dim, 1:gr%np)= m_zero
2880 hpsi(1:nst, 1:st%d%dim, 1:gr%np)= m_zero
2882 do ist = st%st_start, st%st_end
2883 if (state_kpt_is_local(st, ist, ik))
then
2884 call states_elec_get_state(st, gr, ist, ik,temp_state1)
2885 do idim = 1, st%d%dim
2886 psi(ist, idim, 1:gr%np) = temp_state1(1:gr%np, idim)
2888 call states_elec_get_state(hm_st, gr, ist, ik,temp_state1)
2889 do idim = 1, st%d%dim
2890 hpsi(ist, idim, 1:gr%np) = temp_state1(1:gr%np, idim)
2894 call comm_allreduce(st%system_grp, psi)
2895 call comm_allreduce(st%system_grp, hpsi)
2896 assert(gr%np_global*st%d%dim < huge(0_int32))
2897 hmss(1:nst,1:nst) = m_zero
2902 i8_to_i4(gr%np_global*st%d%dim), &
2903 cmplx(gr%volume_element, m_zero, real64) , &
2905 ubound(hpsi, dim = 1), &
2907 ubound(psi, dim = 1), &
2910 ubound(hmss, dim = 1))
2912 hmss(1:nst,1:nst) = conjg(hmss(1:nst,1:nst))
2915 do in = -forder, forder
2916 do im = -forder, forder
2917 ii = (in+forder) * nst
2918 jj = (im+forder) * nst
2919 hfloquet(ik_count, ii+1:ii+nst, jj+1:jj+nst) = &
2920 hfloquet(ik_count, ii+1:ii+nst, jj+1:jj+nst) + hmss(1:nst, 1:nst) *
exp(-(in-im)*m_zi*omega*it*dt)
2924 hfloquet(ik_count, ii+ist, ii+ist) = hfloquet(ik_count, ii+ist, ii+ist) + in*omega
2933 hfloquet(:,:,:) = m_one/nt*hfloquet(:,:,:)
2936 if (downfolding)
then
2938 safe_allocate(hfloq_eff(1:nst,1:nst))
2939 safe_allocate(eigenval(1:nst))
2940 safe_allocate(bands(1:nik,1:nst))
2942 hfloq_eff(1:nst,1:nst) = m_zero
2948 hfloq_eff(1:nst, 1:nst) = hfloquet(ik, n0+1:n0+nst, m0+1:m0+nst) + &
2949 m_one/omega*(matmul(hfloquet(ik, 1:nst, m0+1:m0+nst), hfloquet(ik, n1+1:n1+nst, m0+1:m0+nst))- &
2950 matmul(hfloquet(ik, n1+1:n1+nst, m0+1:m0+nst), hfloquet(ik, 1:nst, m0+1:m0+nst)))
2952 call lalg_eigensolve(nst, hfloq_eff, eigenval)
2953 bands(ik,1:nst) = eigenval(1:nst)
2955 safe_deallocate_a(hfloq_eff)
2958 safe_allocate(eigenval(1:nst*fdim))
2959 safe_allocate(bands(1:nik,1:nst*fdim))
2960 safe_allocate(temp(1:nst*fdim, 1:nst*fdim))
2963 temp(1:nst*fdim, 1:nst*fdim) = hfloquet(ik, 1:nst*fdim, 1:nst*fdim)
2964 call lalg_eigensolve(nst*fdim, temp, eigenval)
2965 bands(ik, 1:nst*fdim) = eigenval(1:nst*fdim)
2970 if (downfolding)
then
2972 filename =
"downfolded_floquet_bands"
2975 filename =
"floquet_bands"
2978 if (st%system_grp%is_root())
then
2980 file = io_open(filename, namespace, action =
'write')
2983 write(file,
'(e13.6, 1x)',advance=
'no') bands(ik,ist)
2990 if (.not. downfolding)
then
2993 bands(1:nik, 1:nst*fdim) = m_zero
2995 temp(1:nst*fdim,1:nst*fdim) = m_zero
2998 temp(ii+1:ii+nst, ii+1:ii+nst) = hfloquet(ik, ii+1:ii+nst, ii+1:ii+nst)
3000 call lalg_eigensolve(nst*fdim, temp, eigenval)
3001 bands(ik, 1:nst*fdim) = eigenval(1:nst*fdim)
3004 if (st%system_grp%is_root())
then
3005 filename =
'trivial_floquet_bands'
3006 file = io_open(filename, namespace, action =
'write')
3009 write(file,
'(e13.6, 1x)', advance=
'no') bands(ik,ist)
3018 call hm%update(gr, namespace, space, ext_partners, time=m_zero)
3020 safe_deallocate_a(hmss)
3021 safe_deallocate_a(psi)
3022 safe_deallocate_a(hpsi)
3023 safe_deallocate_a(temp_state1)
3024 safe_deallocate_a(hfloquet)
3025 safe_deallocate_a(eigenval)
3026 safe_deallocate_a(bands)
3027 safe_deallocate_a(temp)
3028 call states_elec_end(hm_st)
3036 type(c_ptr),
intent(inout) :: out_total_current
3037 class(space_t),
intent(in) :: space
3038 class(mesh_t),
intent(in) :: mesh
3039 type(states_elec_t),
intent(in) :: st
3040 integer,
intent(in) :: iter
3042 integer :: idir, ispin
3043 character(len=50) :: aux
3044 real(real64) :: total_current(space%dim), abs_current(space%dim)
3048 if (st%system_grp%is_root() .and. iter == 0)
then
3049 call td_write_print_header_init(out_total_current)
3052 call write_iter_header_start(out_total_current)
3054 do idir = 1, space%dim
3055 write(aux,
'(a2,a1,a1)')
'I(', index2axis(idir),
')'
3056 call write_iter_header(out_total_current, aux)
3059 do idir = 1, space%dim
3060 write(aux,
'(a10,a1,a1)')
'IntAbs(j)(', index2axis(idir),
')'
3061 call write_iter_header(out_total_current, aux)
3064 do ispin = 1, st%d%nspin
3065 do idir = 1, space%dim
3066 write(aux,
'(a4,i1,a1,a1,a1)')
'I-sp', ispin,
'(', index2axis(idir),
')'
3067 call write_iter_header(out_total_current, aux)
3071 call write_iter_nl(out_total_current)
3073 call td_write_print_header_end(out_total_current)
3076 assert(
allocated(st%current))
3078 if (st%system_grp%is_root())
then
3079 call write_iter_start(out_total_current)
3082 total_current = 0.0_real64
3083 do idir = 1, space%dim
3084 do ispin = 1, st%d%spin_channels
3085 total_current(idir) = total_current(idir) + dmf_integrate(mesh, st%current(:, idir, ispin), reduce = .false.)
3087 total_current(idir) = units_from_atomic(units_out%length/units_out%time, total_current(idir))
3089 call mesh%allreduce(total_current, dim = space%dim)
3091 abs_current = 0.0_real64
3092 do idir = 1, space%dim
3093 do ispin = 1, st%d%spin_channels
3094 abs_current(idir) = abs_current(idir) + dmf_integrate(mesh, abs(st%current(:, idir, ispin)), reduce = .false.)
3096 abs_current(idir) = units_from_atomic(units_out%length/units_out%time, abs_current(idir))
3098 call mesh%allreduce(abs_current, dim = space%dim)
3100 if (st%system_grp%is_root())
then
3101 call write_iter_double(out_total_current, total_current, space%dim)
3102 call write_iter_double(out_total_current, abs_current, space%dim)
3105 do ispin = 1, st%d%nspin
3106 total_current = units_from_atomic(units_out%length/units_out%time, dmf_integrate(mesh, space%dim, st%current(:, :, ispin)))
3108 if (st%system_grp%is_root())
then
3109 call write_iter_double(out_total_current, total_current, space%dim)
3113 if (st%system_grp%is_root())
then
3114 call write_iter_nl(out_total_current)
3122 type(c_ptr),
intent(inout) :: out_ionic_current
3123 class(space_t),
intent(in) :: space
3124 class(ions_t),
intent(in) :: ions
3125 integer,
intent(in) :: iter
3128 character(len=50) :: aux
3129 real(real64) :: ionic_current(space%dim), abs_current(space%dim)
3133 if (ions%grp%is_root() .and. iter == 0)
then
3134 call td_write_print_header_init(out_ionic_current)
3137 call write_iter_header_start(out_ionic_current)
3139 do idir = 1, space%dim
3140 write(aux,
'(a2,a1,a1)')
'I(', index2axis(idir),
')'
3141 call write_iter_header(out_ionic_current, aux)
3144 do idir = 1, space%dim
3145 write(aux,
'(a10,a1,a1)')
'IntAbs(j)(', index2axis(idir),
')'
3146 call write_iter_header(out_ionic_current, aux)
3149 call write_iter_nl(out_ionic_current)
3151 call td_write_print_header_end(out_ionic_current)
3154 ionic_current = ions%current()
3155 abs_current = ions%abs_current()
3157 if (ions%grp%is_root())
then
3158 call write_iter_start(out_ionic_current)
3160 call write_iter_double(out_ionic_current, ionic_current, space%dim)
3161 call write_iter_double(out_ionic_current, abs_current, space%dim)
3163 call write_iter_nl(out_ionic_current)
3173 type(c_ptr),
intent(inout) :: write_obj
3174 class(space_t),
intent(in) :: space
3175 type(hamiltonian_elec_t),
intent(inout) :: hm
3176 type(grid_t),
intent(in) :: gr
3177 type(states_elec_t),
intent(in) :: st
3178 integer,
intent(in) :: iter
3180 integer :: idir, ispin
3181 character(len=50) :: aux
3182 real(real64),
allocatable :: heat_current(:, :, :)
3183 real(real64) :: total_current(space%dim)
3187 if (st%system_grp%is_root() .and. iter == 0)
then
3188 call td_write_print_header_init(write_obj)
3191 call write_iter_header_start(write_obj)
3193 do idir = 1, space%dim
3194 write(aux,
'(a2,i1,a1)')
'Jh(', idir,
')'
3195 call write_iter_header(write_obj, aux)
3198 call write_iter_nl(write_obj)
3200 call td_write_print_header_end(write_obj)
3203 safe_allocate(heat_current(1:gr%np, 1:space%dim, 1:st%d%nspin))
3205 call current_heat_calculate(space, gr%der, hm, st, heat_current)
3207 if (st%system_grp%is_root())
call write_iter_start(write_obj)
3209 total_current = 0.0_real64
3210 do idir = 1, space%dim
3211 do ispin = 1, st%d%spin_channels
3212 total_current(idir) = total_current(idir) + dmf_integrate(gr, heat_current(:, idir, ispin))
3214 total_current(idir) = units_from_atomic(units_out%energy*units_out%length/units_out%time, total_current(idir))
3217 safe_deallocate_a(heat_current)
3219 if (st%system_grp%is_root())
call write_iter_double(write_obj, total_current, space%dim)
3221 if (st%system_grp%is_root())
call write_iter_nl(write_obj)
3229 type(c_ptr),
intent(inout) :: out_partial_charges
3230 class(mesh_t),
intent(in) :: mesh
3231 type(states_elec_t),
intent(in) :: st
3232 type(ions_t),
intent(in) :: ions
3233 integer,
intent(in) :: iter
3236 character(len=50) :: aux
3237 real(real64),
allocatable :: hirshfeld_charges(:)
3241 safe_allocate(hirshfeld_charges(1:ions%natoms))
3243 call partial_charges_calculate(mesh, st, ions, hirshfeld_charges)
3245 if (st%system_grp%is_root())
then
3249 call td_write_print_header_init(out_partial_charges)
3252 call write_iter_header_start(out_partial_charges)
3254 do idir = 1, ions%natoms
3255 write(aux,
'(a13,i3,a1)')
'hirshfeld(atom=', idir,
')'
3256 call write_iter_header(out_partial_charges, aux)
3259 call write_iter_nl(out_partial_charges)
3261 call td_write_print_header_end(out_partial_charges)
3264 call write_iter_start(out_partial_charges)
3266 call write_iter_double(out_partial_charges, hirshfeld_charges, ions%natoms)
3268 call write_iter_nl(out_partial_charges)
3271 safe_deallocate_a(hirshfeld_charges)
3277 subroutine td_write_q(out_q, mpi_grp, space, ks, iter)
3278 type(c_ptr),
intent(inout) :: out_q
3279 type(mpi_grp_t),
intent(in) :: mpi_grp
3280 class(space_t),
intent(in) :: space
3281 type(v_ks_t),
intent(in) :: ks
3282 integer,
intent(in) :: iter
3285 character(len=50) :: aux
3289 if (mpi_grp%is_root())
then
3291 call td_write_print_header_init(out_q)
3292 call write_iter_header_start(out_q)
3293 do ii = 1, ks%pt%nmodes
3294 write(aux,
'(a1,i3,a3)')
'q', ii,
'(t)'
3295 call write_iter_header(out_q, aux)
3297 do ii = 1, ks%pt%nmodes
3298 write(aux,
'(a1,i3,a3)')
'p', ii,
'(t)'
3299 call write_iter_header(out_q, aux)
3301 do ii = 1, space%dim
3302 write(aux,
'(a3,i3,a3)')
'f_pt', ii,
'(t)'
3303 call write_iter_header(out_q, aux)
3305 call write_iter_nl(out_q)
3306 call td_write_print_header_end(out_q)
3309 call write_iter_start(out_q)
3310 call write_iter_double(out_q, ks%pt_mx%pt_q, ks%pt%nmodes)
3311 call write_iter_double(out_q, ks%pt_mx%pt_p, ks%pt%nmodes)
3312 call write_iter_double(out_q, ks%pt_mx%fmf, space%dim)
3313 call write_iter_nl(out_q)
3322 type(c_ptr),
intent(inout) :: out_mxll
3323 type(mpi_grp_t),
intent(in) :: mpi_grp
3324 class(space_t),
intent(in) :: space
3325 type(hamiltonian_elec_t),
intent(in) :: hm
3326 real(real64),
intent(in) :: dt
3327 integer,
intent(in) :: iter
3330 real(real64) :: field(space%dim)
3331 character(len=80) :: aux
3332 character(len=1) :: field_char
3336 if (.not. mpi_grp%is_root())
then
3346 call td_write_print_header_init(out_mxll)
3348 write(aux,
'(a7,e20.12,3a)')
'# dt = ', units_from_atomic(units_out%time, dt), &
3349 " [", trim(units_abbrev(units_out%time)),
"]"
3350 call write_iter_string(out_mxll, aux)
3351 call write_iter_nl(out_mxll)
3353 call write_iter_header_start(out_mxll)
3354 select case (hm%mxll%coupling_mode)
3355 case (length_gauge_dipole, multipolar_expansion)
3356 if (hm%mxll%add_electric_dip) field_char =
'E'
3357 if (hm%mxll%add_magnetic_dip) field_char =
'B'
3358 do idir = 1, space%dim
3359 write(aux,
'(a,i1,a)') field_char //
'(', idir,
')'
3360 call write_iter_header(out_mxll, aux)
3362 case (velocity_gauge_dipole)
3363 do idir = 1, space%dim
3364 write(aux,
'(a,i1,a)')
'A(', idir,
')'
3365 call write_iter_header(out_mxll, aux)
3368 call write_iter_nl(out_mxll)
3370 call write_iter_string(out_mxll,
'#[Iter n.]')
3371 call write_iter_header(out_mxll,
'[' // trim(units_abbrev(units_out%time)) //
']')
3375 select case (hm%mxll%coupling_mode)
3376 case (length_gauge_dipole, multipolar_expansion)
3377 if (hm%mxll%add_electric_dip) aux =
'[' // trim(units_abbrev(units_out%force)) //
']'
3378 if (hm%mxll%add_magnetic_dip) aux =
'[' // trim(units_abbrev(unit_one/units_out%length**2)) //
']'
3379 do idir = 1, space%dim
3380 call write_iter_header(out_mxll, aux)
3382 case (velocity_gauge_dipole)
3383 aux =
'[' // trim(units_abbrev(units_out%energy)) //
']'
3384 do idir = 1, space%dim
3385 call write_iter_header(out_mxll, aux)
3388 call write_iter_nl(out_mxll)
3389 call td_write_print_header_end(out_mxll)
3392 call write_iter_start(out_mxll)
3395 select case (hm%mxll%coupling_mode)
3396 case (length_gauge_dipole, multipolar_expansion)
3397 if (hm%mxll%add_electric_dip) field = units_from_atomic(units_out%force, hm%mxll%e_field_dip)
3398 if (hm%mxll%add_magnetic_dip) field = units_from_atomic(unit_one/units_out%length**2, hm%mxll%b_field_dip)
3399 call write_iter_double(out_mxll, field, space%dim)
3400 case (velocity_gauge_dipole)
3401 field = units_from_atomic(units_out%energy, hm%mxll%vec_pot_dip)
3402 call write_iter_double(out_mxll, field, space%dim)
3404 call write_iter_nl(out_mxll)
3412 type(c_ptr),
intent(inout) :: out_coords
3413 type(mpi_grp_t),
intent(in) :: mpi_grp
3414 type(lda_u_t),
intent(in) :: lda_u
3415 integer,
intent(in) :: iter
3418 character(len=50) :: aux
3420 if (.not. mpi_grp%is_root())
return
3425 call td_write_print_header_init(out_coords)
3428 call write_iter_header_start(out_coords)
3430 do ios = 1, lda_u%norbsets
3431 write(aux,
'(a2,i3,a1)')
'Ueff(', ios,
')'
3432 call write_iter_header(out_coords, aux)
3435 do ios = 1, lda_u%norbsets
3436 write(aux,
'(a2,i3,a1)')
'U(', ios,
')'
3437 call write_iter_header(out_coords, aux)
3440 do ios = 1, lda_u%norbsets
3441 write(aux,
'(a2,i3,a1)')
'J(', ios,
')'
3442 call write_iter_header(out_coords, aux)
3445 if (lda_u%intersite)
then
3446 do ios = 1, lda_u%norbsets
3447 do inn = 1, lda_u%orbsets(ios)%nneighbors
3448 write(aux,
'(a2,i3,a1,i3,a1)')
'V(', ios,
'-', inn,
')'
3449 call write_iter_header(out_coords, aux)
3455 call write_iter_nl(out_coords)
3458 call write_iter_string(out_coords,
'#[Iter n.]')
3459 call write_iter_header(out_coords,
'[' // trim(units_abbrev(units_out%time)) //
']')
3460 call write_iter_string(out_coords, &
3461 'Effective U ' // trim(units_abbrev(units_out%energy)) // &
3462 ', U in '// trim(units_abbrev(units_out%energy)) // &
3463 ', J in ' // trim(units_abbrev(units_out%energy)))
3464 call write_iter_nl(out_coords)
3466 call td_write_print_header_end(out_coords)
3469 call write_iter_start(out_coords)
3471 do ios = 1, lda_u%norbsets
3472 call write_iter_double(out_coords, units_from_atomic(units_out%energy, &
3473 lda_u%orbsets(ios)%Ueff), 1)
3476 do ios = 1, lda_u%norbsets
3477 call write_iter_double(out_coords, units_from_atomic(units_out%energy, &
3478 lda_u%orbsets(ios)%Ubar), 1)
3481 do ios = 1, lda_u%norbsets
3482 call write_iter_double(out_coords, units_from_atomic(units_out%energy, &
3483 lda_u%orbsets(ios)%Jbar), 1)
3486 if (lda_u%intersite)
then
3487 do ios = 1, lda_u%norbsets
3488 do inn = 1, lda_u%orbsets(ios)%nneighbors
3489 call write_iter_double(out_coords, units_from_atomic(units_out%energy, &
3490 lda_u%orbsets(ios)%V_ij(inn,0)), 1)
3495 call write_iter_nl(out_coords)
3502 type(c_ptr),
intent(inout) :: file_handle
3503 type(grid_t),
intent(in) :: grid
3504 type(kpoints_t),
intent(in) :: kpoints
3505 type(states_elec_t),
intent(in) :: st
3506 integer,
intent(in) :: iter
3508 integer :: ik_ispin, ist
3509 character(len=7) :: nkpt_str, nst_str
3510 character(len=7) :: ik_str, ist_str
3511 real(real64),
allocatable :: norm_ks(:, :)
3512 real(real64) :: n_electrons
3516 safe_allocate(norm_ks(1:st%nst, 1:st%nik))
3517 call states_elec_calc_norms(grid, kpoints, st, norm_ks)
3519 if (st%system_grp%is_root())
then
3522 call td_write_print_header_init(file_handle)
3525 write(nkpt_str,
'(I7)') st%nik
3526 write(nst_str,
'(I7)') st%nst
3527 call write_iter_string(file_handle,
'# Dimensions. (nstates, nkpt * nspin):')
3528 call write_iter_string(file_handle, trim(adjustl(nst_str)) //
' ' // trim(adjustl(nkpt_str)))
3529 call write_iter_nl(file_handle)
3532 call write_iter_string(file_handle,
'# Norm ordering: (istate, ikpoint_spin)')
3533 call write_iter_nl(file_handle)
3536 call write_iter_header_start(file_handle)
3537 call write_iter_header(file_handle,
'N_electrons')
3538 do ik_ispin = 1, st%nik
3540 write(ik_str,
'(I7)') ik_ispin
3541 write(ist_str,
'(I7)') ist
3542 call write_iter_header(file_handle, &
3543 'Norm (' // trim(ist_str) //
',' // trim(ik_str) //
')')
3546 call write_iter_nl(file_handle)
3547 call td_write_print_header_end(file_handle)
3550 n_electrons = sum(st%occ * norm_ks**2)
3553 call write_iter_start(file_handle)
3554 call write_iter_double(file_handle, n_electrons, 1)
3555 do ik_ispin = 1, st%nik
3556 call write_iter_double(file_handle, norm_ks(:, ik_ispin),
size(norm_ks, 1))
3558 call write_iter_nl(file_handle)
3562 safe_deallocate_a(norm_ks)
3571 type(c_ptr),
intent(inout) :: file_handle
3572 type(ions_t),
intent(in) :: ions
3573 integer,
intent(in) :: iter
3576 real(real64) :: tmp(3)
3578 if (.not. ions%grp%is_root())
return
3582 assert(ions%space%dim == 3)
3585 call td_write_print_header_init(file_handle)
3588 call write_iter_header_start(file_handle)
3590 call write_iter_string(file_handle,
'# Iter, a, b, c, volume, alpha, beta, gamma, ' &
3591 //
'a_x, a_y, a_z, b_x, b_y, b_z, c_x, c_y, c_z')
3594 call write_iter_string(file_handle,
'#[Iter n.]')
3595 call write_iter_header(file_handle,
'[' // trim(units_abbrev(units_out%time)) //
']')
3596 call write_iter_string(file_handle, &
3597 'Lengths in ' // trim(units_abbrev(units_out%length)) // &
3598 ', Volume in ' // trim(units_abbrev(units_out%length**3)) // &
3599 ', Angles in degree, Lattice vectors in '// trim(units_abbrev(units_out%length)))
3600 call write_iter_nl(file_handle)
3602 call td_write_print_header_end(file_handle)
3605 call write_iter_start(file_handle)
3609 tmp(idir) = units_from_atomic(units_out%length, norm2(ions%latt%rlattice(1:3, idir)))
3611 call write_iter_double(file_handle, tmp, 3)
3614 tmp(1) = units_from_atomic(units_out%length**3, ions%latt%rcell_volume)
3615 call write_iter_double(file_handle, tmp(1), 1)
3618 call write_iter_double(file_handle, ions%latt%alpha, 1)
3619 call write_iter_double(file_handle, ions%latt%beta, 1)
3620 call write_iter_double(file_handle, ions%latt%gamma, 1)
3624 tmp(1:3) = units_from_atomic(units_out%length, ions%latt%rlattice(:, idir))
3625 call write_iter_double(file_handle, tmp, 3)
3627 call write_iter_nl(file_handle)
3636 type(namespace_t),
intent(in) :: namespace
3637 integer,
intent(in) :: iter
3638 real(real64),
intent(in) :: dt
3639 type(mpi_grp_t),
intent(in) :: grp
3641 integer :: default, flags, iout, first
3696 call parse_variable(namespace,
'MaxwellTDOutput', default, flags)
3698 if (.not. varinfo_valid_option(
'MaxwellTDOutput', flags, is_flag = .
true.))
then
3699 call messages_input_error(namespace,
'MaxwellTDOutput')
3703 writ%out(iout)%write = (iand(flags, 2**(iout - 1)) /= 0)
3704 if (writ%out(iout)%write)
then
3705 writ%out(iout + 1)%write = .
true.
3706 writ%out(iout + 2)%write = .
true.
3711 writ%out(iout)%write = (iand(flags, 2**(iout - 1)) /= 0)
3720 writ%out(:)%mpi_grp = grp
3722 call io_mkdir(
'td.general', namespace)
3727 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/total_e_field_x", namespace)))
3729 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/total_e_field_y", namespace)))
3731 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/total_e_field_z", namespace)))
3737 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/total_b_field_x", namespace)))
3739 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/total_b_field_y", namespace)))
3741 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/total_b_field_z", namespace)))
3747 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/longitudinal_e_field_x", namespace)))
3749 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/longitudinal_e_field_y", namespace)))
3751 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/longitudinal_e_field_z", namespace)))
3757 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/longitudinal_b_field_x", namespace)))
3759 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/longitudinal_b_field_y", namespace)))
3761 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/longitudinal_b_field_z", namespace)))
3767 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/transverse_e_field_x", namespace)))
3769 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/transverse_e_field_y", namespace)))
3771 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/transverse_e_field_z", namespace)))
3777 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/transverse_b_field_x", namespace)))
3779 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/transverse_b_field_y", namespace)))
3781 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/transverse_b_field_z", namespace)))
3787 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/maxwell_energy", namespace)))
3792 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/electric_field_surface-x", namespace)))
3797 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/electric_field_surface-y", namespace)))
3802 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/electric_field_surface-z", namespace)))
3807 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/magnetic_field_surface-x", namespace)))
3812 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/magnetic_field_surface-y", namespace)))
3817 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/magnetic_field_surface-z", namespace)))
3833 if (writ%out(iout)%write)
call write_iter_end(writ%out(iout)%handle)
3841 subroutine td_write_mxll_iter(writ, space, gr, st, hm, helmholtz, dt, iter, namespace)
3843 class(space_t),
intent(in) :: space
3844 type(grid_t),
intent(inout) :: gr
3845 type(states_mxll_t),
intent(inout) :: st
3846 type(hamiltonian_mxll_t),
intent(inout) :: hm
3847 type(helmholtz_decomposition_t),
intent(inout) :: helmholtz
3848 real(real64),
intent(in) :: dt
3849 integer,
intent(in) :: iter
3850 type(namespace_t),
intent(in) :: namespace
3855 call profiling_in(
"TD_WRITE_ITER_MAXWELL")
3858 call helmholtz%get_trans_field(namespace, st%rs_state_trans, total_field=st%rs_state)
3859 call get_rs_state_at_point(st%selected_points_rs_state_trans(:,:), st%rs_state_trans, &
3860 st%selected_points_coordinate(:,:), st, gr)
3863 hm%energy%energy_trans = m_zero
3867 call helmholtz%get_long_field(namespace, st%rs_state_long, total_field=st%rs_state)
3868 call get_rs_state_at_point(st%selected_points_rs_state_long(:,:), st%rs_state_long, &
3869 st%selected_points_coordinate(:,:), st, gr)
3872 hm%energy%energy_long = m_zero
3965 call profiling_out(
"TD_WRITE_ITER_MAXWELL")
3974 type(mpi_grp_t),
intent(in) :: mpi_grp
3975 type(hamiltonian_mxll_t),
intent(in) :: hm
3976 integer,
intent(in) :: iter
3980 integer :: n_columns
3982 if (.not. mpi_grp%is_root())
return
4007 call write_iter_header(
out_maxwell_energy,
'[' // trim(units_abbrev(units_out%time)) //
']')
4009 do ii = 1, n_columns
4010 call write_iter_header(
out_maxwell_energy,
'[' // trim(units_abbrev(units_out%energy)) //
']')
4018 call write_iter_double(
out_maxwell_energy, units_from_atomic(units_out%energy, hm%energy%energy), 1)
4019 call write_iter_double(
out_maxwell_energy, units_from_atomic(units_out%energy, hm%energy%e_energy), 1)
4020 call write_iter_double(
out_maxwell_energy, units_from_atomic(units_out%energy, hm%energy%b_energy), 1)
4022 hm%energy%energy+hm%energy%boundaries), 1)
4023 call write_iter_double(
out_maxwell_energy, units_from_atomic(units_out%energy, hm%energy%boundaries), 1)
4024 call write_iter_double(
out_maxwell_energy, units_from_atomic(units_out%energy, hm%energy%energy_trans), 1)
4025 call write_iter_double(
out_maxwell_energy, units_from_atomic(units_out%energy, hm%energy%energy_long), 1)
4026 call write_iter_double(
out_maxwell_energy, units_from_atomic(units_out%energy, hm%energy%energy_plane_waves), 1)
4035 type(c_ptr),
intent(inout) :: out_field_surf
4036 type(states_mxll_t),
intent(in) :: st
4037 integer,
intent(in) :: dim
4038 integer,
intent(in) :: iter
4042 integer :: n_columns
4044 if (.not. st%system_grp%is_root())
return
4051 call td_write_print_header_init(out_field_surf)
4054 call write_iter_header_start(out_field_surf)
4055 call write_iter_header(out_field_surf,
'- x direction')
4056 call write_iter_header(out_field_surf,
'+ x direction')
4057 call write_iter_header(out_field_surf,
'- y direction')
4058 call write_iter_header(out_field_surf,
'+ y direction')
4059 call write_iter_header(out_field_surf,
'- z direction')
4060 call write_iter_header(out_field_surf,
'+ z direction')
4061 call write_iter_header(out_field_surf,
'- x dir. p. w.')
4062 call write_iter_header(out_field_surf,
'+ x dir. p. w.')
4063 call write_iter_header(out_field_surf,
'- y dir. p. w.')
4064 call write_iter_header(out_field_surf,
'+ y dir. p. w.')
4065 call write_iter_header(out_field_surf,
'- z dir. p. w.')
4066 call write_iter_header(out_field_surf,
'+ z dir. p. w.')
4068 call write_iter_nl(out_field_surf)
4071 call write_iter_string(out_field_surf,
'#[Iter n.]')
4072 call write_iter_header(out_field_surf,
'[' // trim(units_abbrev(units_out%time)) //
']')
4074 do ii = 1, n_columns
4075 call write_iter_header(out_field_surf,
'[' // trim(units_abbrev(units_out%energy/units_out%length)) //
']')
4077 call write_iter_nl(out_field_surf)
4079 call td_write_print_header_end(out_field_surf)
4082 call write_iter_start(out_field_surf)
4083 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
4084 st%electric_field_box_surface(1,1,dim)), 1)
4085 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
4086 st%electric_field_box_surface(2,1,dim)), 1)
4087 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
4088 st%electric_field_box_surface(1,2,dim)), 1)
4089 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
4090 st%electric_field_box_surface(2,2,dim)), 1)
4091 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
4092 st%electric_field_box_surface(1,3,dim)), 1)
4093 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
4094 st%electric_field_box_surface(2,3,dim)), 1)
4095 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
4096 st%electric_field_box_surface_plane_waves(1,1,dim)), 1)
4097 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
4098 st%electric_field_box_surface_plane_waves(2,1,dim)), 1)
4099 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
4100 st%electric_field_box_surface_plane_waves(1,2,dim)), 1)
4101 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
4102 st%electric_field_box_surface_plane_waves(2,2,dim)), 1)
4103 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
4104 st%electric_field_box_surface_plane_waves(1,3,dim)), 1)
4105 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
4106 st%electric_field_box_surface_plane_waves(2,3,dim)), 1)
4107 call write_iter_nl(out_field_surf)
4115 type(c_ptr),
intent(inout) :: out_field_surf
4116 type(states_mxll_t),
intent(in) :: st
4117 integer,
intent(in) :: dim
4118 integer,
intent(in) :: iter
4122 integer :: n_columns
4124 if (.not. st%system_grp%is_root())
return
4131 call td_write_print_header_init(out_field_surf)
4134 call write_iter_header_start(out_field_surf)
4135 call write_iter_header(out_field_surf,
'- x direction')
4136 call write_iter_header(out_field_surf,
'+ x direction')
4137 call write_iter_header(out_field_surf,
'- y direction')
4138 call write_iter_header(out_field_surf,
'+ y direction')
4139 call write_iter_header(out_field_surf,
'- z direction')
4140 call write_iter_header(out_field_surf,
'+ z direction')
4141 call write_iter_header(out_field_surf,
'- x dir. p. w.')
4142 call write_iter_header(out_field_surf,
'+ x dir. p. w.')
4143 call write_iter_header(out_field_surf,
'- y dir. p. w.')
4144 call write_iter_header(out_field_surf,
'+ y dir. p. w.')
4145 call write_iter_header(out_field_surf,
'- z dir. p. w.')
4146 call write_iter_header(out_field_surf,
'+ z dir. p. w.')
4148 call write_iter_nl(out_field_surf)
4151 call write_iter_string(out_field_surf,
'#[Iter n.]')
4152 call write_iter_header(out_field_surf,
'[' // trim(units_abbrev(units_out%time)) //
']')
4154 do ii = 1, n_columns
4155 call write_iter_header(out_field_surf,
'[' // trim(units_abbrev(unit_one/units_out%length**2)) //
']')
4157 call write_iter_nl(out_field_surf)
4159 call td_write_print_header_end(out_field_surf)
4162 call write_iter_start(out_field_surf)
4163 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4164 st%magnetic_field_box_surface(1,1,dim)), 1)
4165 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4166 st%magnetic_field_box_surface(2,1,dim)), 1)
4167 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4168 st%magnetic_field_box_surface(1,2,dim)), 1)
4169 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4170 st%magnetic_field_box_surface(2,2,dim)), 1)
4171 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4172 st%magnetic_field_box_surface(1,3,dim)), 1)
4173 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4174 st%magnetic_field_box_surface(2,3,dim)), 1)
4175 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4176 st%magnetic_field_box_surface_plane_waves(1,1,dim)), 1)
4177 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4178 st%magnetic_field_box_surface_plane_waves(2,1,dim)), 1)
4179 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4180 st%magnetic_field_box_surface_plane_waves(1,2,dim)), 1)
4181 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4182 st%magnetic_field_box_surface_plane_waves(2,2,dim)), 1)
4183 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4184 st%magnetic_field_box_surface_plane_waves(1,3,dim)), 1)
4185 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4186 st%magnetic_field_box_surface_plane_waves(2,3,dim)), 1)
4187 call write_iter_nl(out_field_surf)
4193 subroutine td_write_fields(out_fields, space, st, iter, dt, e_or_b_field, field_type, idir)
4194 type(c_ptr),
intent(inout) :: out_fields
4195 class(space_t),
intent(in) :: space
4196 type(states_mxll_t),
intent(in) :: st
4197 integer,
intent(in) :: iter
4198 real(real64),
intent(in) :: dt
4199 integer,
intent(in) :: e_or_b_field
4200 integer,
intent(in) :: field_type
4201 integer,
intent(in) :: idir
4205 real(real64) :: field(space%dim), selected_field
4206 character(len=80) :: aux
4208 if (.not. st%system_grp%is_root())
return
4213 call td_write_print_header_init(out_fields)
4216 write(aux,
'(a7,e20.12,3a)')
'# dt = ', units_from_atomic(units_out%time, dt), &
4217 " [", trim(units_abbrev(units_out%time)),
"]"
4218 call write_iter_string(out_fields, aux)
4219 call write_iter_nl(out_fields)
4221 call write_iter_header_start(out_fields)
4223 do id = 1, st%selected_points_number
4224 select case (e_or_b_field)
4226 write(aux,
'(a,i1,a)')
'E(', id,
')'
4228 write(aux,
'(a,i1,a)')
'B(', id,
')'
4230 call write_iter_header(out_fields, aux)
4233 call write_iter_nl(out_fields)
4234 call write_iter_string(out_fields,
'#[Iter n.]')
4235 call write_iter_header(out_fields,
' [' // trim(units_abbrev(units_out%time)) //
']')
4240 aux =
' [' // trim(units_abbrev(units_out%force)) //
']'
4241 do id = 1, st%selected_points_number
4242 call write_iter_header(out_fields, aux)
4244 call write_iter_nl(out_fields)
4245 call td_write_print_header_end(out_fields)
4248 call write_iter_start(out_fields)
4250 do id = 1, st%selected_points_number
4251 select case (e_or_b_field)
4254 select case (field_type)
4256 call get_electric_field_vector(st%selected_points_rs_state(:,id), field(1:st%dim))
4258 call get_electric_field_vector(st%selected_points_rs_state_long(:,id), field(1:st%dim))
4260 call get_electric_field_vector(st%selected_points_rs_state_trans(:,id), field(1:st%dim))
4262 selected_field = units_from_atomic(units_out%energy/units_out%length, field(idir))
4265 select case (field_type)
4267 call get_magnetic_field_vector(st%selected_points_rs_state(:,id), st%rs_sign, field(1:st%dim))
4269 call get_magnetic_field_vector(st%selected_points_rs_state_long(:,id), st%rs_sign, field(1:st%dim))
4271 call get_magnetic_field_vector(st%selected_points_rs_state_trans(:,id), st%rs_sign, field(1:st%dim))
4273 selected_field = units_from_atomic(unit_one/units_out%length**2, field(idir))
4275 call write_iter_double(out_fields, selected_field, 1)
4278 call write_iter_nl(out_fields)
4286 type(namespace_t),
intent(in) :: namespace
4287 class(space_t),
intent(in) :: space
4288 type(grid_t),
intent(inout) :: gr
4289 type(states_mxll_t),
intent(inout) :: st
4290 type(hamiltonian_mxll_t),
intent(inout) :: hm
4291 type(helmholtz_decomposition_t),
intent(inout) :: helmholtz
4292 type(output_t),
intent(in) :: outp
4293 integer,
intent(in) :: iter
4294 real(real64),
intent(in) :: time
4296 character(len=256) :: filename
4298 push_sub(td_write_mxwll_free_data)
4299 call profiling_in(
"TD_WRITE_MAXWELL_DATA")
4302 write(filename,
'(a,a,i7.7)') trim(outp%iter_dir),
"td.", iter
4304 call output_mxll(outp, namespace, space, gr, st, hm, helmholtz, time, filename)
4306 call profiling_out(
"TD_WRITE_MAXWELL_DATA")
4307 pop_sub(td_write_mxwll_free_data)
4312 type(c_ptr),
intent(inout) :: out_dm_proj_basis
4313 type(states_elec_t),
intent(in) :: dmp_st
4314 integer,
intent(in) :: iter
4316 character(len=80) :: aux
4322 call td_write_print_header_init(out_dm_proj_basis)
4324 write(aux,
'(a15,i8)')
"# nspin ", dmp_st%d%nspin
4325 call write_iter_string(out_dm_proj_basis, aux)
4326 call write_iter_nl(out_dm_proj_basis)
4328 write(aux,
'(a15,i8)')
"# nik ", dmp_st%nik
4329 call write_iter_string(out_dm_proj_basis, aux)
4330 call write_iter_nl(out_dm_proj_basis)
4332 write(aux,
'(a15,2i8)')
"# st ", 1, dmp_st%nst
4333 call write_iter_string(out_dm_proj_basis, aux)
4334 call write_iter_nl(out_dm_proj_basis)
4336 write(aux,
'(a15)')
"# w(ik) "
4337 call write_iter_string(out_dm_proj_basis, aux)
4338 do ik = 1, dmp_st%nik
4339 call write_iter_double(out_dm_proj_basis, dmp_st%kweights(ik), 1)
4341 call write_iter_nl(out_dm_proj_basis)
4343 call td_write_print_header_end(out_dm_proj_basis)
4345 call write_iter_string(out_dm_proj_basis,
"# ------------")
4346 call write_iter_start(out_dm_proj_basis)
4347 call write_iter_double(out_dm_proj_basis, dmp_st%qtot, 1)
4348 call write_iter_nl(out_dm_proj_basis)
4349 do ik = 1, dmp_st%nik
4350 call write_iter_double(out_dm_proj_basis, dmp_st%eigenval(:, ik), dmp_st%nst)
4351 call write_iter_nl(out_dm_proj_basis)
4352 call write_iter_double(out_dm_proj_basis, dmp_st%occ(:, ik), dmp_st%nst)
4353 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, fixed_occ, 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)