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%v_ks_photons%active()))
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%v_ks_photons%active())
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, st%st_kpt_mpi_grp, iter*dt)
1223 if (iter == 0)
call output_scalar_pot(outp, namespace, space, filename, gr, ions, ext_partners, st%st_kpt_mpi_grp)
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),
contiguous,
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 multipole(2:space%dim+1, :) = -multipole(2:space%dim+1, :)
1626 do is = 1, st%d%spin_channels
1627 multipole(2:space%dim+1, is) = multipole(2:space%dim+1, is) - ionic_dipole(1:space%dim)/st%d%spin_channels
1631 if (mpi_grp_%is_root())
then
1633 do is = 1, st%d%nspin
1636 do idir = 1, space%dim
1640 add_lm = space%dim + 2
1651 safe_deallocate_a(multipole)
1656 subroutine td_write_ftchd(out_ftchd, space, mesh, st, kick, iter)
1657 type(c_ptr),
intent(inout) :: out_ftchd
1658 class(
space_t),
intent(in) :: space
1659 class(
mesh_t),
intent(in) :: mesh
1661 type(
kick_t),
intent(in) :: kick
1662 integer,
intent(in) :: iter
1664 integer :: is, ip, idir
1665 character(len=120) :: aux, aux2
1666 real(real64) :: ftchd_bessel
1667 complex(real64) :: ftchd
1669 real(real64),
allocatable :: integrand_bessel(:)
1670 complex(real64),
allocatable :: integrand(:)
1674 if (st%system_grp%is_root().and.iter == 0)
then
1677 write(aux,
'(a15, i2)')
'# qkickmode ', kick%qkick_mode
1682 write(aux,
'(a15, i0.3, 1x, i0.3)')
'# ll, mm ', kick%qbessel_l, kick%qbessel_m
1688 write(aux,
'(a15, f9.6)')
'# qlength ', kick%qlength
1690 write(aux,
'(a15)')
'# qvector '
1691 do idir = 1, space%dim
1692 write(aux2,
'(f9.5)') kick%qvector(idir,1)
1693 aux = trim(aux) // trim(aux2)
1699 write(aux,
'(a15,f18.12)')
'# kick strength', kick%delta_strength
1705 write(aux,
'(a17)')
'int(j_l*Y_lm*rho)'
1707 write(aux,
'(a12)')
'Real, Imag'
1724 safe_allocate(integrand(1:mesh%np))
1726 do is = 1, st%d%spin_channels
1728 integrand(ip) = integrand(ip) + st%rho(ip, is) *
exp(-
m_zi*sum(mesh%x(1:space%dim, ip)*kick%qvector(1:space%dim, 1)))
1732 safe_deallocate_a(integrand)
1735 safe_allocate(integrand_bessel(1:mesh%np))
1736 integrand_bessel =
m_zero
1737 do is = 1, st%d%spin_channels
1739 call ylmr_real(mesh%x(1:3, ip), kick%qbessel_l, kick%qbessel_m, ylm)
1740 integrand_bessel(ip) = integrand_bessel(ip) + st%rho(ip, is) * &
1741 loct_sph_bessel(kick%qbessel_l, kick%qlength*norm2(mesh%x(:, ip)))*ylm
1745 safe_deallocate_a(integrand_bessel)
1748 if (st%system_grp%is_root())
then
1764 type(c_ptr),
intent(inout) :: out_temperature
1766 type(
ions_t),
intent(in) :: ions
1767 integer,
intent(in) :: iter
1769 if (.not. mpi_grp%is_root())
return
1802 type(c_ptr),
intent(inout) :: out_populations
1804 class(
space_t),
intent(in) :: space
1805 class(
mesh_t),
intent(in) :: mesh
1808 real(real64),
intent(in) :: dt
1809 integer,
intent(in) :: iter
1812 character(len=6) :: excited_name
1813 complex(real64) :: gsp
1814 complex(real64),
allocatable :: excited_state_p(:)
1815 complex(real64),
allocatable :: dotprodmatrix(:, :, :)
1820 safe_allocate(dotprodmatrix(1:writ%gs_st%nst, 1:st%nst, 1:st%nik))
1825 assert(.not. space%is_periodic())
1830 if (writ%n_excited_states > 0)
then
1831 safe_allocate(excited_state_p(1:writ%n_excited_states))
1832 do ist = 1, writ%n_excited_states
1833 excited_state_p(ist) =
zstates_elec_mpdotp(namespace, mesh, writ%excited_st(ist), st, dotprodmatrix)
1837 if (st%system_grp%is_root())
then
1845 do ist = 1, writ%n_excited_states
1846 write(excited_name,
'(a2,i3,a1)')
'P(', ist,
')'
1865 do ist = 1, writ%n_excited_states
1872 if (writ%n_excited_states > 0)
then
1873 safe_deallocate_a(excited_state_p)
1875 safe_deallocate_a(dotprodmatrix)
1881 subroutine td_write_acc(out_acc, namespace, space, gr, ions, st, hm, ext_partners, dt, iter)
1882 type(c_ptr),
intent(inout) :: out_acc
1884 class(
space_t),
intent(in) :: space
1885 type(
grid_t),
intent(in) :: gr
1886 type(
ions_t),
intent(inout) :: ions
1890 real(real64),
intent(in) :: dt
1891 integer,
intent(in) :: iter
1894 character(len=7) :: aux
1895 real(real64) :: acc(space%dim)
1899 if (iter == 0 .and. st%system_grp%is_root())
then
1904 do idim = 1, space%dim
1905 write(aux,
'(a4,i1,a1)')
'Acc(', idim,
')'
1913 do idim = 1, space%dim
1920 call td_calc_tacc(namespace, space, gr, ions, ext_partners, st, hm, acc, dt*iter)
1922 if (st%system_grp%is_root())
then
1933 subroutine td_write_vel(out_vel, namespace, gr, st, space, hm, ions, iter)
1934 type(c_ptr),
intent(inout) :: out_vel
1936 type(
grid_t),
intent(in) :: gr
1938 type(
space_t),
intent(in) :: space
1940 type(
ions_t),
intent(in) :: ions
1941 integer,
intent(in) :: iter
1944 character(len=7) :: aux
1945 real(real64) :: vel(space%dim)
1949 if (iter == 0 .and. st%system_grp%is_root())
then
1954 do idim = 1, space%dim
1955 write(aux,
'(a4,i1,a1)')
'Vel(', idim,
')'
1963 do idim = 1, space%dim
1970 call td_calc_tvel(namespace, gr, st, space, hm, ions, vel)
1972 if (st%system_grp%is_root())
then
1984 subroutine td_write_laser(out_laser, mpi_grp, space, lasers, dt, iter)
1985 type(c_ptr),
intent(inout) :: out_laser
1987 class(
space_t),
intent(in) :: space
1988 type(
lasers_t),
intent(inout) :: lasers
1989 real(real64),
intent(in) :: dt
1990 integer,
intent(in) :: iter
1993 real(real64) :: field(space%dim)
1994 real(real64) :: ndfield(space%dim)
1995 character(len=80) :: aux
1997 if (.not. mpi_grp%is_root())
return
2011 do il = 1, lasers%no_lasers
2014 do idir = 1, space%dim
2015 write(aux,
'(a,i1,a)')
'E(', idir,
')'
2019 do idir = 1, space%dim
2020 write(aux,
'(a,i1,a)')
'B(', idir,
')'
2024 do idir = 1, space%dim
2025 write(aux,
'(a,i1,a)')
'A(', idir,
')'
2029 write(aux,
'(a,i1,a)')
'e(t)'
2035 do idir = 1, space%dim
2036 write(aux,
'(a,i1,a)')
'A^M(', idir,
')'
2048 do il = 1, lasers%no_lasers
2052 do idir = 1, space%dim
2057 do idir = 1, space%dim
2068 do idir = 1, space%dim
2081 do il = 1, lasers%no_lasers
2083 call laser_field(lasers%lasers(il), field(1:space%dim), iter*dt)
2108 type(c_ptr),
intent(inout) :: out_energy
2111 integer,
intent(in) :: iter
2112 real(real64),
intent(in) :: ke
2116 integer :: n_columns
2118 if (.not. mpi_grp%is_root())
return
2139 if (hm%pcm%run_pcm)
then
2141 n_columns = n_columns + 1
2146 n_columns = n_columns + 1
2156 do ii = 1, n_columns
2179 hm%energy%int_nn_pcm + hm%energy%int_ne_pcm), 1)
2192 type(c_ptr),
intent(inout) :: out_eigs
2194 integer,
intent(in) :: iter
2197 character(len=68) :: buf
2201 if (.not. st%system_grp%is_root())
then
2210 write(buf,
'(a15,i2)')
'# nst ', st%nst
2214 write(buf,
'(a15,i2)')
'# nspin ', st%d%nspin
2220 do is = 1, st%d%kpt%nglobal()
2222 write(buf,
'(a,i4)')
'Eigenvalue ',ii
2231 do is = 1, st%d%kpt%nglobal()
2241 do is = 1, st%d%kpt%nglobal()
2253 type(c_ptr),
intent(inout) :: out_ionch
2254 class(
mesh_t),
intent(in) :: mesh
2256 integer,
intent(in) :: iter
2258 integer :: ii, ist, Nch, ik, idim
2259 character(len=68) :: buf
2260 real(real64),
allocatable :: ch(:), occ(:)
2261 real(real64),
allocatable :: occbuf(:)
2266 nch = st%nst * st%d%kpt%nglobal() * st%d%dim
2267 safe_allocate(ch(0: nch))
2268 safe_allocate(occ(0: nch))
2274 do idim = 1, st%d%dim
2275 if (st%st_start <= ist .and. ist <= st%st_end .and. &
2276 st%d%kpt%start <= ik .and. ik <= st%d%kpt%end)
then
2277 occ(ii) = st%occ(ist, ik)
2285 if (st%parallel_in_states)
then
2286 safe_allocate(occbuf(0: nch))
2288 call st%mpi_grp%allreduce(occ(0), occbuf(0), nch+1, mpi_double_precision, mpi_sum)
2290 safe_deallocate_a(occbuf)
2297 if (.not. st%system_grp%is_root())
then
2298 safe_deallocate_a(ch)
2299 safe_deallocate_a(occ)
2312 if (occ(ii)>
m_zero .or. ii == 0)
then
2313 write(buf,
'(a,f4.1,a)')
'Pion(',occ(ii)*ii,
'+, t)'
2323 if (occ(ii)>
m_zero .or. ii == 0)
then
2333 if (occ(ii)>
m_zero .or. ii == 0)
then
2339 safe_deallocate_a(ch)
2340 safe_deallocate_a(occ)
2346 subroutine td_write_proj(out_proj, space, mesh, ions, st, gs_st, kick, iter)
2347 type(c_ptr),
intent(inout) :: out_proj
2348 class(
space_t),
intent(in) :: space
2349 class(
mesh_t),
intent(in) :: mesh
2350 type(
ions_t),
intent(in) :: ions
2353 type(
kick_t),
intent(in) :: kick
2354 integer,
intent(in) :: iter
2356 complex(real64),
allocatable :: projections(:,:,:)
2357 character(len=80) :: aux
2358 integer :: ik, ist, uist, idir
2363 if (st%system_grp%is_root())
then
2366 write(aux,
'(a15,i2)')
'# nspin ', st%d%nspin
2375 write(aux,
'(a,i8)')
"# nik ", st%nik
2379 write(aux,
'(a,2i8)')
"# st ", gs_st%st_start, st%nst
2383 write(aux,
'(a,2i8)')
"# ust ", gs_st%st_start, gs_st%st_end
2389 do ist = gs_st%st_start, st%nst
2397 do ist = gs_st%st_start, st%nst
2398 do uist = gs_st%st_start, gs_st%st_end
2399 write(aux,
'(i4,a,i4)') ist,
' -> ', uist
2410 if (.not. space%is_periodic())
then
2412 safe_allocate(projections(1:st%nst, gs_st%st_start:gs_st%st_end, 1:st%nik))
2413 do idir = 1, space%dim
2418 if (st%system_grp%is_root())
then
2419 write(aux,
'(a,i1,a)')
"<i|x_", idir,
"|a>"
2423 do ist = gs_st%st_start, st%st_end
2424 do uist = gs_st%st_start, gs_st%st_end
2434 safe_deallocate_a(projections)
2438 if (st%system_grp%is_root())
then
2444 safe_allocate(projections(1:st%nst, gs_st%st_start:gs_st%st_end, 1:st%nik))
2445 projections(:,:,:) =
m_z0
2448 if (st%system_grp%is_root())
then
2451 do ist = gs_st%st_start, st%nst
2452 do uist = gs_st%st_start, gs_st%st_end
2461 safe_deallocate_a(projections)
2467 integer,
intent(in) :: dir
2469 integer :: uist, ist, ik, idim, ip
2470 real(real64) :: n_dip(space%dim)
2471 complex(real64),
allocatable :: xpsi(:,:)
2472 complex(real64),
allocatable :: psi(:, :), gspsi(:, :)
2476 safe_allocate(psi(1:mesh%np, 1:st%d%dim))
2477 safe_allocate(gspsi(1:mesh%np, 1:st%d%dim))
2478 safe_allocate(xpsi(1:mesh%np, 1:st%d%dim))
2480 do ik = st%d%kpt%start, st%d%kpt%end
2481 do ist = st%st_start, st%st_end
2483 do uist = gs_st%st_start, gs_st%st_end
2487 do idim = 1, st%d%dim
2490 xpsi(ip, idim) = mesh%x_t(ip, dir)*gspsi(ip, idim)
2494 projections(ist, uist, ik) = -
zmf_dotp(mesh, st%d%dim, psi, xpsi, reduce = .false.)
2500 safe_deallocate_a(xpsi)
2501 safe_deallocate_a(gspsi)
2502 safe_deallocate_a(psi)
2507 n_dip = ions%dipole()
2509 do ist = gs_st%st_start, st%nst
2510 do uist = gs_st%st_start, gs_st%st_end
2511 projections(ist, uist, ik) = projections(ist, uist, ik) - n_dip(dir)
2527 subroutine td_write_n_ex(out_nex, outp, namespace, mesh, kpoints, st, gs_st, iter)
2528 type(c_ptr),
intent(inout) :: out_nex
2531 class(
mesh_t),
intent(in) :: mesh
2535 integer,
intent(in) :: iter
2537 complex(real64),
allocatable :: projections(:,:)
2538 character(len=80) :: aux, dir
2539 integer :: ik, ikpt, ist, uist, err
2540 real(real64) :: Nex, weight
2542 real(real64),
allocatable :: Nex_kpt(:)
2548 if (st%system_grp%is_root())
then
2551 write(aux,
'(a15,i2)')
'# nspin ', st%d%nspin
2558 write(aux,
'(a,i8)')
"# nik ", st%nik
2562 write(aux,
'(a,2i8)')
"# st ", gs_st%st_start, st%nst
2566 write(aux,
'(a,2i8)')
"# ust ", gs_st%st_start, gs_st%st_end
2576 if (st%system_grp%is_root())
then
2585 do ist = 1, gs_st%nst
2586 if (gs_st%occ(ist, ik) >
m_min_occ .and. ist > gs_nst) gs_nst = ist
2590 safe_allocate(projections(1:gs_nst, 1:st%nst))
2592 safe_allocate(nex_kpt(1:st%nik))
2594 do ik = st%d%kpt%start, st%d%kpt%end
2595 ikpt = st%d%get_kpoint_index(ik)
2598 weight = st%kweights(ik) * gs_st%occ(ist, ik)/ st%smear%el_per_state
2599 do uist = st%st_start, st%st_end
2600 nex_kpt(ikpt) = nex_kpt(ikpt) - weight * st%occ(uist, ik) * abs(projections(ist, uist))**2
2603 nex_kpt(ikpt) = nex_kpt(ikpt) + sum(st%occ(st%st_start:st%st_end, ik))*st%kweights(ik)
2606 if (st%parallel_in_states .or. st%d%kpt%parallel)
then
2612 if (st%system_grp%is_root())
then
2618 write(dir,
'(a,a,i7.7)') trim(outp%iter_dir),
"td.", iter
2621 + outp%how(option__output__density_kpt), dir,
"n_excited_el_kpt", namespace, &
2625 safe_deallocate_a(projections)
2626 safe_deallocate_a(nex_kpt)
2638 class(
mesh_t),
intent(in) :: mesh
2641 complex(real64),
intent(inout) :: projections(1:st%nst, gs_st%st_start:gs_st%nst, 1:st%nik)
2643 integer :: uist, ist, ik
2644 complex(real64),
allocatable :: psi(:, :), gspsi(:, :)
2647 safe_allocate(psi(1:mesh%np, 1:st%d%dim))
2648 safe_allocate(gspsi(1:mesh%np, 1:st%d%dim))
2650 projections(:,:,:) =
m_zero
2652 do ik = st%d%kpt%start, st%d%kpt%end
2653 do ist = st%st_start, st%st_end
2655 do uist = gs_st%st_start, gs_st%nst
2657 projections(ist, uist, ik) =
zmf_dotp(mesh, st%d%dim, psi, gspsi, reduce = .false.)
2662 safe_deallocate_a(psi)
2663 safe_deallocate_a(gspsi)
2672 class(
mesh_t),
intent(in) :: mesh
2677 integer,
intent(in) :: iter
2679 complex(real64),
allocatable :: proj(:,:), psi(:,:,:), gs_psi(:,:,:), temp_state(:,:)
2680 character(len=80) :: filename1, filename2
2681 integer :: ik,ist, jst, file, idim, nk_proj
2685 write(filename1,
'(I10)') iter
2686 filename1 =
'td.general/projections_iter_'//trim(adjustl(filename1))
2689 safe_allocate(proj(1:gs_st%nst, 1:gs_st%nst))
2690 safe_allocate(psi(1:gs_st%nst,1:gs_st%d%dim,1:mesh%np))
2691 safe_allocate(gs_psi(1:gs_st%nst,1:gs_st%d%dim,1:mesh%np))
2692 safe_allocate(temp_state(1:mesh%np,1:gs_st%d%dim))
2698 nk_proj = kpoints%nik_skip
2700 do ik = kpoints%reduced%npoints-nk_proj+1, kpoints%reduced%npoints
2702 psi(1:gs_st%nst, 1:gs_st%d%dim, 1:mesh%np)=
m_zero
2703 gs_psi(1:gs_st%nst, 1:gs_st%d%dim, 1:mesh%np)=
m_zero
2705 if (st%system_grp%is_root())
then
2706 write(filename2,
'(I10)') ik
2707 filename2 = trim(adjustl(filename1))//
'_ik_'//trim(adjustl(filename2))
2708 file =
io_open(filename2, namespace, action=
'write')
2711 do ist=gs_st%st_start,gs_st%st_end
2714 do idim = 1,gs_st%d%dim
2715 psi(ist,idim,1:mesh%np) = temp_state(1:mesh%np,idim)
2718 do idim = 1,gs_st%d%dim
2719 gs_psi(ist,idim,1:mesh%np) = temp_state(1:mesh%np,idim)
2728 assert(mesh%np_global*gs_st%d%dim < huge(0_int32))
2729 proj(1:gs_st%nst, 1:gs_st%nst) =
m_zero
2734 i8_to_i4(mesh%np_global*gs_st%d%dim), &
2735 cmplx(mesh%volume_element,
m_zero, real64) , &
2737 ubound(psi, dim = 1), &
2739 ubound(gs_psi, dim = 1), &
2742 ubound(proj, dim = 1))
2745 if (st%system_grp%is_root())
then
2746 do ist = 1, gs_st%nst
2747 do jst = 1, gs_st%nst
2748 write(file,
'(I3,1x,I3,1x,e13.6,1x,e13.6,2x)') ist, jst, proj(ist,jst)
2756 safe_deallocate_a(proj)
2757 safe_deallocate_a(psi)
2758 safe_deallocate_a(gs_psi)
2759 safe_deallocate_a(temp_state)
2765 subroutine td_write_floquet(namespace, space, hm, ext_partners, gr, st, iter)
2766 type(namespace_t),
intent(in) :: namespace
2767 class(space_t),
intent(in) :: space
2768 type(hamiltonian_elec_t),
intent(inout) :: hm
2769 type(partner_list_t),
intent(in) :: ext_partners
2770 type(grid_t),
intent(in) :: gr
2771 type(states_elec_t),
intent(inout) :: st
2772 integer,
intent(in) :: iter
2774 complex(real64),
allocatable :: hmss(:,:), psi(:,:,:), hpsi(:,:,:), temp_state1(:,:)
2775 complex(real64),
allocatable :: HFloquet(:,:,:), HFloq_eff(:,:), temp(:,:)
2776 real(real64),
allocatable :: eigenval(:), bands(:,:)
2777 character(len=80) :: filename
2778 integer :: it, nT, ik, ist, in, im, file, idim, nik, ik_count
2779 integer :: Forder, Fdim, m0, n0, n1, nst, ii, jj, lim_nst
2780 logical :: downfolding
2781 type(states_elec_t) :: hm_st
2783 real(real64) :: dt, Tcycle, omega
2787 downfolding = .false.
2790 if (.not. iter == 0)
then
2798 assert(gr%np == gr%np_global)
2801 call states_elec_copy(hm_st, st)
2812 call parse_variable(namespace,
'TDFloquetFrequency', m_zero, omega, units_inp%energy)
2813 call messages_print_var_value(
'Frequency used for Floquet analysis', omega, namespace=namespace)
2814 if (abs(omega) <= m_epsilon)
then
2815 message(1) =
"Please give a non-zero value for TDFloquetFrequency"
2816 call messages_fatal(1, namespace=namespace)
2820 tcycle = m_two * m_pi / omega
2830 call parse_variable(namespace,
'TDFloquetSample',20 ,nt)
2831 call messages_print_var_value(
'Number of Floquet time-sampling points', nt, namespace=namespace)
2832 dt = tcycle/real(nt, real64)
2841 call parse_variable(namespace,
'TDFloquetDimension',-1,forder)
2842 if (forder .ge. 0)
then
2843 call messages_print_var_value(
'Order of multiphoton Floquet-Hamiltonian', forder, namespace=namespace)
2845 fdim = 2 * forder + 1
2847 message(1) =
'Floquet-Hamiltonian is downfolded'
2848 call messages_info(1, namespace=namespace)
2849 downfolding = .
true.
2854 dt = tcycle/real(nt, real64)
2857 nik = hm%kpoints%nik_skip
2859 safe_allocate(hmss(1:nst,1:nst))
2860 safe_allocate( psi(1:nst,1:st%d%dim,1:gr%np))
2861 safe_allocate(hpsi(1:nst,1:st%d%dim,1:gr%np))
2862 safe_allocate(temp_state1(1:gr%np,1:st%d%dim))
2870 safe_allocate(hfloquet(1:nik,1:nst*fdim, 1:nst*fdim))
2871 hfloquet(1:nik,1:nst*fdim, 1:nst*fdim) = m_zero
2876 call hm%update(gr, namespace, space, ext_partners, time=tcycle+it*dt)
2878 call zhamiltonian_elec_apply_all(hm, namespace, gr, st, hm_st)
2883 do ik = hm%kpoints%reduced%npoints-nik+1, hm%kpoints%reduced%npoints
2884 ik_count = ik_count + 1
2886 psi(1:nst, 1:st%d%dim, 1:gr%np)= m_zero
2887 hpsi(1:nst, 1:st%d%dim, 1:gr%np)= m_zero
2889 do ist = st%st_start, st%st_end
2890 if (state_kpt_is_local(st, ist, ik))
then
2891 call states_elec_get_state(st, gr, ist, ik,temp_state1)
2892 do idim = 1, st%d%dim
2893 psi(ist, idim, 1:gr%np) = temp_state1(1:gr%np, idim)
2895 call states_elec_get_state(hm_st, gr, ist, ik,temp_state1)
2896 do idim = 1, st%d%dim
2897 hpsi(ist, idim, 1:gr%np) = temp_state1(1:gr%np, idim)
2901 call comm_allreduce(st%system_grp, psi)
2902 call comm_allreduce(st%system_grp, hpsi)
2903 assert(gr%np_global*st%d%dim < huge(0_int32))
2904 hmss(1:nst,1:nst) = m_zero
2909 i8_to_i4(gr%np_global*st%d%dim), &
2910 cmplx(gr%volume_element, m_zero, real64) , &
2912 ubound(hpsi, dim = 1), &
2914 ubound(psi, dim = 1), &
2917 ubound(hmss, dim = 1))
2919 hmss(1:nst,1:nst) = conjg(hmss(1:nst,1:nst))
2922 do in = -forder, forder
2923 do im = -forder, forder
2924 ii = (in+forder) * nst
2925 jj = (im+forder) * nst
2926 hfloquet(ik_count, ii+1:ii+nst, jj+1:jj+nst) = &
2927 hfloquet(ik_count, ii+1:ii+nst, jj+1:jj+nst) + hmss(1:nst, 1:nst) *
exp(-(in-im)*m_zi*omega*it*dt)
2931 hfloquet(ik_count, ii+ist, ii+ist) = hfloquet(ik_count, ii+ist, ii+ist) + in*omega
2940 hfloquet(:,:,:) = m_one/nt*hfloquet(:,:,:)
2943 if (downfolding)
then
2945 safe_allocate(hfloq_eff(1:nst,1:nst))
2946 safe_allocate(eigenval(1:nst))
2947 safe_allocate(bands(1:nik,1:nst))
2949 hfloq_eff(1:nst,1:nst) = m_zero
2955 hfloq_eff(1:nst, 1:nst) = hfloquet(ik, n0+1:n0+nst, m0+1:m0+nst) + &
2956 m_one/omega*(matmul(hfloquet(ik, 1:nst, m0+1:m0+nst), hfloquet(ik, n1+1:n1+nst, m0+1:m0+nst))- &
2957 matmul(hfloquet(ik, n1+1:n1+nst, m0+1:m0+nst), hfloquet(ik, 1:nst, m0+1:m0+nst)))
2959 call lalg_eigensolve(nst, hfloq_eff, eigenval)
2960 bands(ik,1:nst) = eigenval(1:nst)
2962 safe_deallocate_a(hfloq_eff)
2965 safe_allocate(eigenval(1:nst*fdim))
2966 safe_allocate(bands(1:nik,1:nst*fdim))
2967 safe_allocate(temp(1:nst*fdim, 1:nst*fdim))
2970 temp(1:nst*fdim, 1:nst*fdim) = hfloquet(ik, 1:nst*fdim, 1:nst*fdim)
2971 call lalg_eigensolve(nst*fdim, temp, eigenval)
2972 bands(ik, 1:nst*fdim) = eigenval(1:nst*fdim)
2977 if (downfolding)
then
2979 filename =
"downfolded_floquet_bands"
2982 filename =
"floquet_bands"
2985 if (st%system_grp%is_root())
then
2987 file = io_open(filename, namespace, action =
'write')
2990 write(file,
'(e13.6, 1x)',advance=
'no') bands(ik,ist)
2997 if (.not. downfolding)
then
3000 bands(1:nik, 1:nst*fdim) = m_zero
3002 temp(1:nst*fdim,1:nst*fdim) = m_zero
3005 temp(ii+1:ii+nst, ii+1:ii+nst) = hfloquet(ik, ii+1:ii+nst, ii+1:ii+nst)
3007 call lalg_eigensolve(nst*fdim, temp, eigenval)
3008 bands(ik, 1:nst*fdim) = eigenval(1:nst*fdim)
3011 if (st%system_grp%is_root())
then
3012 filename =
'trivial_floquet_bands'
3013 file = io_open(filename, namespace, action =
'write')
3016 write(file,
'(e13.6, 1x)', advance=
'no') bands(ik,ist)
3025 call hm%update(gr, namespace, space, ext_partners, time=m_zero)
3027 safe_deallocate_a(hmss)
3028 safe_deallocate_a(psi)
3029 safe_deallocate_a(hpsi)
3030 safe_deallocate_a(temp_state1)
3031 safe_deallocate_a(hfloquet)
3032 safe_deallocate_a(eigenval)
3033 safe_deallocate_a(bands)
3034 safe_deallocate_a(temp)
3035 call states_elec_end(hm_st)
3043 type(c_ptr),
intent(inout) :: out_total_current
3044 class(space_t),
intent(in) :: space
3045 class(mesh_t),
intent(in) :: mesh
3046 type(states_elec_t),
intent(in) :: st
3047 integer,
intent(in) :: iter
3049 integer :: idir, ispin
3050 character(len=50) :: aux
3051 real(real64) :: total_current(space%dim), abs_current(space%dim)
3055 if (st%system_grp%is_root() .and. iter == 0)
then
3056 call td_write_print_header_init(out_total_current)
3059 call write_iter_header_start(out_total_current)
3061 do idir = 1, space%dim
3062 write(aux,
'(a2,a1,a1)')
'I(', index2axis(idir),
')'
3063 call write_iter_header(out_total_current, aux)
3066 do idir = 1, space%dim
3067 write(aux,
'(a10,a1,a1)')
'IntAbs(j)(', index2axis(idir),
')'
3068 call write_iter_header(out_total_current, aux)
3071 do ispin = 1, st%d%nspin
3072 do idir = 1, space%dim
3073 write(aux,
'(a4,i1,a1,a1,a1)')
'I-sp', ispin,
'(', index2axis(idir),
')'
3074 call write_iter_header(out_total_current, aux)
3078 call write_iter_nl(out_total_current)
3080 call td_write_print_header_end(out_total_current)
3083 assert(
allocated(st%current))
3085 if (st%system_grp%is_root())
then
3086 call write_iter_start(out_total_current)
3089 total_current = 0.0_real64
3090 do idir = 1, space%dim
3091 do ispin = 1, st%d%spin_channels
3092 total_current(idir) = total_current(idir) + dmf_integrate(mesh, st%current(:, idir, ispin), reduce = .false.)
3094 total_current(idir) = units_from_atomic(units_out%length/units_out%time, total_current(idir))
3096 call mesh%allreduce(total_current, dim = space%dim)
3098 abs_current = 0.0_real64
3099 do idir = 1, space%dim
3100 do ispin = 1, st%d%spin_channels
3101 abs_current(idir) = abs_current(idir) + dmf_integrate(mesh, abs(st%current(:, idir, ispin)), reduce = .false.)
3103 abs_current(idir) = units_from_atomic(units_out%length/units_out%time, abs_current(idir))
3105 call mesh%allreduce(abs_current, dim = space%dim)
3107 if (st%system_grp%is_root())
then
3108 call write_iter_double(out_total_current, total_current, space%dim)
3109 call write_iter_double(out_total_current, abs_current, space%dim)
3112 do ispin = 1, st%d%nspin
3113 total_current = units_from_atomic(units_out%length/units_out%time, dmf_integrate(mesh, space%dim, st%current(:, :, ispin)))
3115 if (st%system_grp%is_root())
then
3116 call write_iter_double(out_total_current, total_current, space%dim)
3120 if (st%system_grp%is_root())
then
3121 call write_iter_nl(out_total_current)
3129 type(c_ptr),
intent(inout) :: out_ionic_current
3130 class(space_t),
intent(in) :: space
3131 class(ions_t),
intent(in) :: ions
3132 integer,
intent(in) :: iter
3135 character(len=50) :: aux
3136 real(real64) :: ionic_current(space%dim), abs_current(space%dim)
3140 if (ions%grp%is_root() .and. iter == 0)
then
3141 call td_write_print_header_init(out_ionic_current)
3144 call write_iter_header_start(out_ionic_current)
3146 do idir = 1, space%dim
3147 write(aux,
'(a2,a1,a1)')
'I(', index2axis(idir),
')'
3148 call write_iter_header(out_ionic_current, aux)
3151 do idir = 1, space%dim
3152 write(aux,
'(a10,a1,a1)')
'IntAbs(j)(', index2axis(idir),
')'
3153 call write_iter_header(out_ionic_current, aux)
3156 call write_iter_nl(out_ionic_current)
3158 call td_write_print_header_end(out_ionic_current)
3161 ionic_current = ions%current()
3162 abs_current = ions%abs_current()
3164 if (ions%grp%is_root())
then
3165 call write_iter_start(out_ionic_current)
3167 call write_iter_double(out_ionic_current, ionic_current, space%dim)
3168 call write_iter_double(out_ionic_current, abs_current, space%dim)
3170 call write_iter_nl(out_ionic_current)
3180 type(c_ptr),
intent(inout) :: write_obj
3181 class(space_t),
intent(in) :: space
3182 type(hamiltonian_elec_t),
intent(inout) :: hm
3183 type(grid_t),
intent(in) :: gr
3184 type(states_elec_t),
intent(in) :: st
3185 integer,
intent(in) :: iter
3187 integer :: idir, ispin
3188 character(len=50) :: aux
3189 real(real64),
allocatable :: heat_current(:, :, :)
3190 real(real64) :: total_current(space%dim)
3194 if (st%system_grp%is_root() .and. iter == 0)
then
3195 call td_write_print_header_init(write_obj)
3198 call write_iter_header_start(write_obj)
3200 do idir = 1, space%dim
3201 write(aux,
'(a2,i1,a1)')
'Jh(', idir,
')'
3202 call write_iter_header(write_obj, aux)
3205 call write_iter_nl(write_obj)
3207 call td_write_print_header_end(write_obj)
3210 safe_allocate(heat_current(1:gr%np, 1:space%dim, 1:st%d%nspin))
3212 call current_heat_calculate(space, gr%der, hm, st, heat_current)
3214 if (st%system_grp%is_root())
call write_iter_start(write_obj)
3216 total_current = 0.0_real64
3217 do idir = 1, space%dim
3218 do ispin = 1, st%d%spin_channels
3219 total_current(idir) = total_current(idir) + dmf_integrate(gr, heat_current(:, idir, ispin))
3221 total_current(idir) = units_from_atomic(units_out%energy*units_out%length/units_out%time, total_current(idir))
3224 safe_deallocate_a(heat_current)
3226 if (st%system_grp%is_root())
call write_iter_double(write_obj, total_current, space%dim)
3228 if (st%system_grp%is_root())
call write_iter_nl(write_obj)
3236 type(c_ptr),
intent(inout) :: out_partial_charges
3237 class(mesh_t),
intent(in) :: mesh
3238 type(states_elec_t),
intent(in) :: st
3239 type(ions_t),
intent(in) :: ions
3240 integer,
intent(in) :: iter
3243 character(len=50) :: aux
3244 real(real64),
allocatable :: hirshfeld_charges(:)
3248 safe_allocate(hirshfeld_charges(1:ions%natoms))
3250 call partial_charges_calculate(mesh, st, ions, hirshfeld_charges)
3252 if (st%system_grp%is_root())
then
3256 call td_write_print_header_init(out_partial_charges)
3259 call write_iter_header_start(out_partial_charges)
3261 do idir = 1, ions%natoms
3262 write(aux,
'(a13,i3,a1)')
'hirshfeld(atom=', idir,
')'
3263 call write_iter_header(out_partial_charges, aux)
3266 call write_iter_nl(out_partial_charges)
3268 call td_write_print_header_end(out_partial_charges)
3271 call write_iter_start(out_partial_charges)
3273 call write_iter_double(out_partial_charges, hirshfeld_charges, ions%natoms)
3275 call write_iter_nl(out_partial_charges)
3278 safe_deallocate_a(hirshfeld_charges)
3284 subroutine td_write_q(out_q, mpi_grp, space, ks, iter)
3285 type(c_ptr),
intent(inout) :: out_q
3286 type(mpi_grp_t),
intent(in) :: mpi_grp
3287 class(space_t),
intent(in) :: space
3288 type(v_ks_t),
intent(in) :: ks
3289 integer,
intent(in) :: iter
3291 integer :: ii, nmodes
3292 character(len=50) :: aux
3293 type(mf_t),
pointer :: pt_mx
3297 nmodes = ks%v_ks_photons%nmodes()
3298 pt_mx => ks%v_ks_photons%get_pt_mx()
3300 if (mpi_grp%is_root())
then
3302 call td_write_print_header_init(out_q)
3303 call write_iter_header_start(out_q)
3305 write(aux,
'(a1,i3,a3)')
'q', ii,
'(t)'
3306 call write_iter_header(out_q, aux)
3309 write(aux,
'(a1,i3,a3)')
'p', ii,
'(t)'
3310 call write_iter_header(out_q, aux)
3312 do ii = 1, space%dim
3313 write(aux,
'(a3,i3,a3)')
'f_pt', ii,
'(t)'
3314 call write_iter_header(out_q, aux)
3316 call write_iter_nl(out_q)
3317 call td_write_print_header_end(out_q)
3320 call write_iter_start(out_q)
3321 call write_iter_double(out_q, pt_mx%pt_q, nmodes)
3322 call write_iter_double(out_q, pt_mx%pt_p, nmodes)
3323 call write_iter_double(out_q, pt_mx%fmf, space%dim)
3324 call write_iter_nl(out_q)
3333 type(c_ptr),
intent(inout) :: out_mxll
3334 type(mpi_grp_t),
intent(in) :: mpi_grp
3335 class(space_t),
intent(in) :: space
3336 type(hamiltonian_elec_t),
intent(in) :: hm
3337 real(real64),
intent(in) :: dt
3338 integer,
intent(in) :: iter
3341 real(real64) :: field(space%dim)
3342 character(len=80) :: aux
3343 character(len=1) :: field_char
3347 if (.not. mpi_grp%is_root())
then
3357 call td_write_print_header_init(out_mxll)
3359 write(aux,
'(a7,e20.12,3a)')
'# dt = ', units_from_atomic(units_out%time, dt), &
3360 " [", trim(units_abbrev(units_out%time)),
"]"
3361 call write_iter_string(out_mxll, aux)
3362 call write_iter_nl(out_mxll)
3364 call write_iter_header_start(out_mxll)
3365 select case (hm%mxll%coupling_mode)
3366 case (length_gauge_dipole, multipolar_expansion)
3367 if (hm%mxll%add_electric_dip) field_char =
'E'
3368 if (hm%mxll%add_magnetic_dip) field_char =
'B'
3369 do idir = 1, space%dim
3370 write(aux,
'(a,i1,a)') field_char //
'(', idir,
')'
3371 call write_iter_header(out_mxll, aux)
3373 case (velocity_gauge_dipole)
3374 do idir = 1, space%dim
3375 write(aux,
'(a,i1,a)')
'A(', idir,
')'
3376 call write_iter_header(out_mxll, aux)
3379 call write_iter_nl(out_mxll)
3381 call write_iter_string(out_mxll,
'#[Iter n.]')
3382 call write_iter_header(out_mxll,
'[' // trim(units_abbrev(units_out%time)) //
']')
3386 select case (hm%mxll%coupling_mode)
3387 case (length_gauge_dipole, multipolar_expansion)
3388 if (hm%mxll%add_electric_dip) aux =
'[' // trim(units_abbrev(units_out%force)) //
']'
3389 if (hm%mxll%add_magnetic_dip) aux =
'[' // trim(units_abbrev(unit_one/units_out%length**2)) //
']'
3390 do idir = 1, space%dim
3391 call write_iter_header(out_mxll, aux)
3393 case (velocity_gauge_dipole)
3394 aux =
'[' // trim(units_abbrev(units_out%energy)) //
']'
3395 do idir = 1, space%dim
3396 call write_iter_header(out_mxll, aux)
3399 call write_iter_nl(out_mxll)
3400 call td_write_print_header_end(out_mxll)
3403 call write_iter_start(out_mxll)
3406 select case (hm%mxll%coupling_mode)
3407 case (length_gauge_dipole, multipolar_expansion)
3408 if (hm%mxll%add_electric_dip) field = units_from_atomic(units_out%force, hm%mxll%e_field_dip)
3409 if (hm%mxll%add_magnetic_dip) field = units_from_atomic(unit_one/units_out%length**2, hm%mxll%b_field_dip)
3410 call write_iter_double(out_mxll, field, space%dim)
3411 case (velocity_gauge_dipole)
3412 field = units_from_atomic(units_out%energy, hm%mxll%vec_pot_dip)
3413 call write_iter_double(out_mxll, field, space%dim)
3415 call write_iter_nl(out_mxll)
3423 type(c_ptr),
intent(inout) :: out_coords
3424 type(mpi_grp_t),
intent(in) :: mpi_grp
3425 type(lda_u_t),
intent(in) :: lda_u
3426 integer,
intent(in) :: iter
3429 character(len=50) :: aux
3431 if (.not. mpi_grp%is_root())
return
3436 call td_write_print_header_init(out_coords)
3439 call write_iter_header_start(out_coords)
3441 do ios = 1, lda_u%norbsets
3442 write(aux,
'(a2,i3,a1)')
'Ueff(', ios,
')'
3443 call write_iter_header(out_coords, aux)
3446 do ios = 1, lda_u%norbsets
3447 write(aux,
'(a2,i3,a1)')
'U(', ios,
')'
3448 call write_iter_header(out_coords, aux)
3451 do ios = 1, lda_u%norbsets
3452 write(aux,
'(a2,i3,a1)')
'J(', ios,
')'
3453 call write_iter_header(out_coords, aux)
3456 if (lda_u%intersite)
then
3457 do ios = 1, lda_u%norbsets
3458 do inn = 1, lda_u%orbsets(ios)%nneighbors
3459 write(aux,
'(a2,i3,a1,i3,a1)')
'V(', ios,
'-', inn,
')'
3460 call write_iter_header(out_coords, aux)
3466 call write_iter_nl(out_coords)
3469 call write_iter_string(out_coords,
'#[Iter n.]')
3470 call write_iter_header(out_coords,
'[' // trim(units_abbrev(units_out%time)) //
']')
3471 call write_iter_string(out_coords, &
3472 'Effective U ' // trim(units_abbrev(units_out%energy)) // &
3473 ', U in '// trim(units_abbrev(units_out%energy)) // &
3474 ', J in ' // trim(units_abbrev(units_out%energy)))
3475 call write_iter_nl(out_coords)
3477 call td_write_print_header_end(out_coords)
3480 call write_iter_start(out_coords)
3482 do ios = 1, lda_u%norbsets
3483 call write_iter_double(out_coords, units_from_atomic(units_out%energy, &
3484 lda_u%orbsets(ios)%Ueff), 1)
3487 do ios = 1, lda_u%norbsets
3488 call write_iter_double(out_coords, units_from_atomic(units_out%energy, &
3489 lda_u%orbsets(ios)%Ubar), 1)
3492 do ios = 1, lda_u%norbsets
3493 call write_iter_double(out_coords, units_from_atomic(units_out%energy, &
3494 lda_u%orbsets(ios)%Jbar), 1)
3497 if (lda_u%intersite)
then
3498 do ios = 1, lda_u%norbsets
3499 do inn = 1, lda_u%orbsets(ios)%nneighbors
3500 call write_iter_double(out_coords, units_from_atomic(units_out%energy, &
3501 lda_u%orbsets(ios)%V_ij(inn,0)), 1)
3506 call write_iter_nl(out_coords)
3513 type(c_ptr),
intent(inout) :: file_handle
3514 type(grid_t),
intent(in) :: grid
3515 type(kpoints_t),
intent(in) :: kpoints
3516 type(states_elec_t),
intent(in) :: st
3517 integer,
intent(in) :: iter
3519 integer :: ik_ispin, ist
3520 character(len=7) :: nkpt_str, nst_str
3521 character(len=7) :: ik_str, ist_str
3522 real(real64),
allocatable :: norm_ks(:, :)
3523 real(real64) :: n_electrons
3527 safe_allocate(norm_ks(1:st%nst, 1:st%nik))
3528 call states_elec_calc_norms(grid, kpoints, st, norm_ks)
3530 if (st%system_grp%is_root())
then
3533 call td_write_print_header_init(file_handle)
3536 write(nkpt_str,
'(I7)') st%nik
3537 write(nst_str,
'(I7)') st%nst
3538 call write_iter_string(file_handle,
'# Dimensions. (nstates, nkpt * nspin):')
3539 call write_iter_string(file_handle, trim(adjustl(nst_str)) //
' ' // trim(adjustl(nkpt_str)))
3540 call write_iter_nl(file_handle)
3543 call write_iter_string(file_handle,
'# Norm ordering: (istate, ikpoint_spin)')
3544 call write_iter_nl(file_handle)
3547 call write_iter_header_start(file_handle)
3548 call write_iter_header(file_handle,
'N_electrons')
3549 do ik_ispin = 1, st%nik
3551 write(ik_str,
'(I7)') ik_ispin
3552 write(ist_str,
'(I7)') ist
3553 call write_iter_header(file_handle, &
3554 'Norm (' // trim(ist_str) //
',' // trim(ik_str) //
')')
3557 call write_iter_nl(file_handle)
3558 call td_write_print_header_end(file_handle)
3561 n_electrons = sum(st%occ * norm_ks**2)
3564 call write_iter_start(file_handle)
3565 call write_iter_double(file_handle, n_electrons, 1)
3566 do ik_ispin = 1, st%nik
3567 call write_iter_double(file_handle, norm_ks(:, ik_ispin),
size(norm_ks, 1))
3569 call write_iter_nl(file_handle)
3573 safe_deallocate_a(norm_ks)
3582 type(c_ptr),
intent(inout) :: file_handle
3583 type(ions_t),
intent(in) :: ions
3584 integer,
intent(in) :: iter
3587 real(real64) :: tmp(3)
3589 if (.not. ions%grp%is_root())
return
3593 assert(ions%space%dim == 3)
3596 call td_write_print_header_init(file_handle)
3599 call write_iter_header_start(file_handle)
3601 call write_iter_string(file_handle,
'# Iter, a, b, c, volume, alpha, beta, gamma, ' &
3602 //
'a_x, a_y, a_z, b_x, b_y, b_z, c_x, c_y, c_z')
3605 call write_iter_string(file_handle,
'#[Iter n.]')
3606 call write_iter_header(file_handle,
'[' // trim(units_abbrev(units_out%time)) //
']')
3607 call write_iter_string(file_handle, &
3608 'Lengths in ' // trim(units_abbrev(units_out%length)) // &
3609 ', Volume in ' // trim(units_abbrev(units_out%length**3)) // &
3610 ', Angles in degree, Lattice vectors in '// trim(units_abbrev(units_out%length)))
3611 call write_iter_nl(file_handle)
3613 call td_write_print_header_end(file_handle)
3616 call write_iter_start(file_handle)
3620 tmp(idir) = units_from_atomic(units_out%length, norm2(ions%latt%rlattice(1:3, idir)))
3622 call write_iter_double(file_handle, tmp, 3)
3625 tmp(1) = units_from_atomic(units_out%length**3, ions%latt%rcell_volume)
3626 call write_iter_double(file_handle, tmp(1), 1)
3629 call write_iter_double(file_handle, ions%latt%alpha, 1)
3630 call write_iter_double(file_handle, ions%latt%beta, 1)
3631 call write_iter_double(file_handle, ions%latt%gamma, 1)
3635 tmp(1:3) = units_from_atomic(units_out%length, ions%latt%rlattice(:, idir))
3636 call write_iter_double(file_handle, tmp, 3)
3638 call write_iter_nl(file_handle)
3647 type(namespace_t),
intent(in) :: namespace
3648 integer,
intent(in) :: iter
3649 real(real64),
intent(in) :: dt
3650 type(mpi_grp_t),
intent(in) :: grp
3652 integer :: default, flags, iout, first
3707 call parse_variable(namespace,
'MaxwellTDOutput', default, flags)
3709 if (.not. varinfo_valid_option(
'MaxwellTDOutput', flags, is_flag = .
true.))
then
3710 call messages_input_error(namespace,
'MaxwellTDOutput')
3714 writ%out(iout)%write = (iand(flags, 2**(iout - 1)) /= 0)
3715 if (writ%out(iout)%write)
then
3716 writ%out(iout + 1)%write = .
true.
3717 writ%out(iout + 2)%write = .
true.
3722 writ%out(iout)%write = (iand(flags, 2**(iout - 1)) /= 0)
3731 writ%out(:)%mpi_grp = grp
3733 call io_mkdir(
'td.general', namespace)
3738 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/total_e_field_x", namespace)))
3740 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/total_e_field_y", namespace)))
3742 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/total_e_field_z", namespace)))
3748 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/total_b_field_x", namespace)))
3750 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/total_b_field_y", namespace)))
3752 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/total_b_field_z", namespace)))
3758 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/longitudinal_e_field_x", namespace)))
3760 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/longitudinal_e_field_y", namespace)))
3762 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/longitudinal_e_field_z", namespace)))
3768 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/longitudinal_b_field_x", namespace)))
3770 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/longitudinal_b_field_y", namespace)))
3772 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/longitudinal_b_field_z", namespace)))
3778 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/transverse_e_field_x", namespace)))
3780 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/transverse_e_field_y", namespace)))
3782 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/transverse_e_field_z", namespace)))
3788 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/transverse_b_field_x", namespace)))
3790 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/transverse_b_field_y", namespace)))
3792 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/transverse_b_field_z", namespace)))
3798 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/maxwell_energy", namespace)))
3803 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/electric_field_surface-x", namespace)))
3808 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/electric_field_surface-y", namespace)))
3813 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/electric_field_surface-z", namespace)))
3818 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/magnetic_field_surface-x", namespace)))
3823 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/magnetic_field_surface-y", namespace)))
3828 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/magnetic_field_surface-z", namespace)))
3844 if (writ%out(iout)%write)
call write_iter_end(writ%out(iout)%handle)
3852 subroutine td_write_mxll_iter(writ, space, gr, st, hm, helmholtz, dt, iter, namespace)
3854 class(space_t),
intent(in) :: space
3855 type(grid_t),
intent(inout) :: gr
3856 type(states_mxll_t),
intent(inout) :: st
3857 type(hamiltonian_mxll_t),
intent(inout) :: hm
3858 type(helmholtz_decomposition_t),
intent(inout) :: helmholtz
3859 real(real64),
intent(in) :: dt
3860 integer,
intent(in) :: iter
3861 type(namespace_t),
intent(in) :: namespace
3866 call profiling_in(
"TD_WRITE_ITER_MAXWELL")
3869 call helmholtz%get_trans_field(namespace, st%rs_state_trans, total_field=st%rs_state)
3870 call get_rs_state_at_point(st%selected_points_rs_state_trans(:,:), st%rs_state_trans, &
3871 st%selected_points_coordinate(:,:), st, gr)
3874 hm%energy%energy_trans = m_zero
3878 call helmholtz%get_long_field(namespace, st%rs_state_long, total_field=st%rs_state)
3879 call get_rs_state_at_point(st%selected_points_rs_state_long(:,:), st%rs_state_long, &
3880 st%selected_points_coordinate(:,:), st, gr)
3883 hm%energy%energy_long = m_zero
3976 call profiling_out(
"TD_WRITE_ITER_MAXWELL")
3985 type(mpi_grp_t),
intent(in) :: mpi_grp
3986 type(hamiltonian_mxll_t),
intent(in) :: hm
3987 integer,
intent(in) :: iter
3991 integer :: n_columns
3993 if (.not. mpi_grp%is_root())
return
4018 call write_iter_header(
out_maxwell_energy,
'[' // trim(units_abbrev(units_out%time)) //
']')
4020 do ii = 1, n_columns
4021 call write_iter_header(
out_maxwell_energy,
'[' // trim(units_abbrev(units_out%energy)) //
']')
4029 call write_iter_double(
out_maxwell_energy, units_from_atomic(units_out%energy, hm%energy%energy), 1)
4030 call write_iter_double(
out_maxwell_energy, units_from_atomic(units_out%energy, hm%energy%e_energy), 1)
4031 call write_iter_double(
out_maxwell_energy, units_from_atomic(units_out%energy, hm%energy%b_energy), 1)
4033 hm%energy%energy+hm%energy%boundaries), 1)
4034 call write_iter_double(
out_maxwell_energy, units_from_atomic(units_out%energy, hm%energy%boundaries), 1)
4035 call write_iter_double(
out_maxwell_energy, units_from_atomic(units_out%energy, hm%energy%energy_trans), 1)
4036 call write_iter_double(
out_maxwell_energy, units_from_atomic(units_out%energy, hm%energy%energy_long), 1)
4037 call write_iter_double(
out_maxwell_energy, units_from_atomic(units_out%energy, hm%energy%energy_plane_waves), 1)
4046 type(c_ptr),
intent(inout) :: out_field_surf
4047 type(states_mxll_t),
intent(in) :: st
4048 integer,
intent(in) :: dim
4049 integer,
intent(in) :: iter
4053 integer :: n_columns
4055 if (.not. st%system_grp%is_root())
return
4062 call td_write_print_header_init(out_field_surf)
4065 call write_iter_header_start(out_field_surf)
4066 call write_iter_header(out_field_surf,
'- x direction')
4067 call write_iter_header(out_field_surf,
'+ x direction')
4068 call write_iter_header(out_field_surf,
'- y direction')
4069 call write_iter_header(out_field_surf,
'+ y direction')
4070 call write_iter_header(out_field_surf,
'- z direction')
4071 call write_iter_header(out_field_surf,
'+ z direction')
4072 call write_iter_header(out_field_surf,
'- x dir. p. w.')
4073 call write_iter_header(out_field_surf,
'+ x dir. p. w.')
4074 call write_iter_header(out_field_surf,
'- y dir. p. w.')
4075 call write_iter_header(out_field_surf,
'+ y dir. p. w.')
4076 call write_iter_header(out_field_surf,
'- z dir. p. w.')
4077 call write_iter_header(out_field_surf,
'+ z dir. p. w.')
4079 call write_iter_nl(out_field_surf)
4082 call write_iter_string(out_field_surf,
'#[Iter n.]')
4083 call write_iter_header(out_field_surf,
'[' // trim(units_abbrev(units_out%time)) //
']')
4085 do ii = 1, n_columns
4086 call write_iter_header(out_field_surf,
'[' // trim(units_abbrev(units_out%energy/units_out%length)) //
']')
4088 call write_iter_nl(out_field_surf)
4090 call td_write_print_header_end(out_field_surf)
4093 call write_iter_start(out_field_surf)
4094 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
4095 st%electric_field_box_surface(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(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(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(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(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(2,3,dim)), 1)
4106 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
4107 st%electric_field_box_surface_plane_waves(1,1,dim)), 1)
4108 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
4109 st%electric_field_box_surface_plane_waves(2,1,dim)), 1)
4110 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
4111 st%electric_field_box_surface_plane_waves(1,2,dim)), 1)
4112 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
4113 st%electric_field_box_surface_plane_waves(2,2,dim)), 1)
4114 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
4115 st%electric_field_box_surface_plane_waves(1,3,dim)), 1)
4116 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
4117 st%electric_field_box_surface_plane_waves(2,3,dim)), 1)
4118 call write_iter_nl(out_field_surf)
4126 type(c_ptr),
intent(inout) :: out_field_surf
4127 type(states_mxll_t),
intent(in) :: st
4128 integer,
intent(in) :: dim
4129 integer,
intent(in) :: iter
4133 integer :: n_columns
4135 if (.not. st%system_grp%is_root())
return
4142 call td_write_print_header_init(out_field_surf)
4145 call write_iter_header_start(out_field_surf)
4146 call write_iter_header(out_field_surf,
'- x direction')
4147 call write_iter_header(out_field_surf,
'+ x direction')
4148 call write_iter_header(out_field_surf,
'- y direction')
4149 call write_iter_header(out_field_surf,
'+ y direction')
4150 call write_iter_header(out_field_surf,
'- z direction')
4151 call write_iter_header(out_field_surf,
'+ z direction')
4152 call write_iter_header(out_field_surf,
'- x dir. p. w.')
4153 call write_iter_header(out_field_surf,
'+ x dir. p. w.')
4154 call write_iter_header(out_field_surf,
'- y dir. p. w.')
4155 call write_iter_header(out_field_surf,
'+ y dir. p. w.')
4156 call write_iter_header(out_field_surf,
'- z dir. p. w.')
4157 call write_iter_header(out_field_surf,
'+ z dir. p. w.')
4159 call write_iter_nl(out_field_surf)
4162 call write_iter_string(out_field_surf,
'#[Iter n.]')
4163 call write_iter_header(out_field_surf,
'[' // trim(units_abbrev(units_out%time)) //
']')
4165 do ii = 1, n_columns
4166 call write_iter_header(out_field_surf,
'[' // trim(units_abbrev(unit_one/units_out%length**2)) //
']')
4168 call write_iter_nl(out_field_surf)
4170 call td_write_print_header_end(out_field_surf)
4173 call write_iter_start(out_field_surf)
4174 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4175 st%magnetic_field_box_surface(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(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(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(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(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(2,3,dim)), 1)
4186 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4187 st%magnetic_field_box_surface_plane_waves(1,1,dim)), 1)
4188 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4189 st%magnetic_field_box_surface_plane_waves(2,1,dim)), 1)
4190 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4191 st%magnetic_field_box_surface_plane_waves(1,2,dim)), 1)
4192 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4193 st%magnetic_field_box_surface_plane_waves(2,2,dim)), 1)
4194 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4195 st%magnetic_field_box_surface_plane_waves(1,3,dim)), 1)
4196 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4197 st%magnetic_field_box_surface_plane_waves(2,3,dim)), 1)
4198 call write_iter_nl(out_field_surf)
4204 subroutine td_write_fields(out_fields, space, st, iter, dt, e_or_b_field, field_type, idir)
4205 type(c_ptr),
intent(inout) :: out_fields
4206 class(space_t),
intent(in) :: space
4207 type(states_mxll_t),
intent(in) :: st
4208 integer,
intent(in) :: iter
4209 real(real64),
intent(in) :: dt
4210 integer,
intent(in) :: e_or_b_field
4211 integer,
intent(in) :: field_type
4212 integer,
intent(in) :: idir
4216 real(real64) :: field(space%dim), selected_field
4217 character(len=80) :: aux
4219 if (.not. st%system_grp%is_root())
return
4224 call td_write_print_header_init(out_fields)
4227 write(aux,
'(a7,e20.12,3a)')
'# dt = ', units_from_atomic(units_out%time, dt), &
4228 " [", trim(units_abbrev(units_out%time)),
"]"
4229 call write_iter_string(out_fields, aux)
4230 call write_iter_nl(out_fields)
4232 call write_iter_header_start(out_fields)
4234 do id = 1, st%selected_points_number
4235 select case (e_or_b_field)
4237 write(aux,
'(a,i1,a)')
'E(', id,
')'
4239 write(aux,
'(a,i1,a)')
'B(', id,
')'
4241 call write_iter_header(out_fields, aux)
4244 call write_iter_nl(out_fields)
4245 call write_iter_string(out_fields,
'#[Iter n.]')
4246 call write_iter_header(out_fields,
' [' // trim(units_abbrev(units_out%time)) //
']')
4251 aux =
' [' // trim(units_abbrev(units_out%force)) //
']'
4252 do id = 1, st%selected_points_number
4253 call write_iter_header(out_fields, aux)
4255 call write_iter_nl(out_fields)
4256 call td_write_print_header_end(out_fields)
4259 call write_iter_start(out_fields)
4261 do id = 1, st%selected_points_number
4262 select case (e_or_b_field)
4265 select case (field_type)
4267 call get_electric_field_vector(st%selected_points_rs_state(:,id), field(1:st%dim))
4269 call get_electric_field_vector(st%selected_points_rs_state_long(:,id), field(1:st%dim))
4271 call get_electric_field_vector(st%selected_points_rs_state_trans(:,id), field(1:st%dim))
4273 selected_field = units_from_atomic(units_out%energy/units_out%length, field(idir))
4276 select case (field_type)
4278 call get_magnetic_field_vector(st%selected_points_rs_state(:,id), st%rs_sign, field(1:st%dim))
4280 call get_magnetic_field_vector(st%selected_points_rs_state_long(:,id), st%rs_sign, field(1:st%dim))
4282 call get_magnetic_field_vector(st%selected_points_rs_state_trans(:,id), st%rs_sign, field(1:st%dim))
4284 selected_field = units_from_atomic(unit_one/units_out%length**2, field(idir))
4286 call write_iter_double(out_fields, selected_field, 1)
4289 call write_iter_nl(out_fields)
4297 type(namespace_t),
intent(in) :: namespace
4298 class(space_t),
intent(in) :: space
4299 type(grid_t),
intent(inout) :: gr
4300 type(states_mxll_t),
intent(inout) :: st
4301 type(hamiltonian_mxll_t),
intent(inout) :: hm
4302 type(helmholtz_decomposition_t),
intent(inout) :: helmholtz
4303 type(output_t),
intent(in) :: outp
4304 integer,
intent(in) :: iter
4305 real(real64),
intent(in) :: time
4307 character(len=256) :: filename
4309 push_sub(td_write_mxwll_free_data)
4310 call profiling_in(
"TD_WRITE_MAXWELL_DATA")
4313 write(filename,
'(a,a,i7.7)') trim(outp%iter_dir),
"td.", iter
4315 call output_mxll(outp, namespace, space, gr, st, hm, helmholtz, time, filename)
4317 call profiling_out(
"TD_WRITE_MAXWELL_DATA")
4318 pop_sub(td_write_mxwll_free_data)
4323 type(c_ptr),
intent(inout) :: out_dm_proj_basis
4324 type(states_elec_t),
intent(in) :: dmp_st
4325 integer,
intent(in) :: iter
4327 character(len=80) :: aux
4333 call td_write_print_header_init(out_dm_proj_basis)
4335 write(aux,
'(a15,i8)')
"# nspin ", dmp_st%d%nspin
4336 call write_iter_string(out_dm_proj_basis, aux)
4337 call write_iter_nl(out_dm_proj_basis)
4339 write(aux,
'(a15,i8)')
"# nik ", dmp_st%nik
4340 call write_iter_string(out_dm_proj_basis, aux)
4341 call write_iter_nl(out_dm_proj_basis)
4343 write(aux,
'(a15,2i8)')
"# st ", 1, dmp_st%nst
4344 call write_iter_string(out_dm_proj_basis, aux)
4345 call write_iter_nl(out_dm_proj_basis)
4347 write(aux,
'(a15)')
"# w(ik) "
4348 call write_iter_string(out_dm_proj_basis, aux)
4349 do ik = 1, dmp_st%nik
4350 call write_iter_double(out_dm_proj_basis, dmp_st%kweights(ik), 1)
4352 call write_iter_nl(out_dm_proj_basis)
4354 call td_write_print_header_end(out_dm_proj_basis)
4356 call write_iter_string(out_dm_proj_basis,
"# ------------")
4357 call write_iter_start(out_dm_proj_basis)
4358 call write_iter_double(out_dm_proj_basis, dmp_st%qtot, 1)
4359 call write_iter_nl(out_dm_proj_basis)
4360 do ik = 1, dmp_st%nik
4361 call write_iter_double(out_dm_proj_basis, dmp_st%eigenval(:, ik), dmp_st%nst)
4362 call write_iter_nl(out_dm_proj_basis)
4363 call write_iter_double(out_dm_proj_basis, dmp_st%occ(:, ik), dmp_st%nst)
4364 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 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_scalar_pot(outp, namespace, space, dir, mesh, ions, ext_partners, grp, time)
subroutine, public output_all(outp, namespace, space, dir, gr, ions, iter, st, hm, ks)
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, dest_type, copy_data)
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), parameter, 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)