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, 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, ip
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
2485 do idim = 1, st%d%dim
2488 xpsi(ip, idim) = mesh%x_t(ip, dir)*gspsi(ip, idim)
2492 projections(ist, uist, ik) = -
zmf_dotp(mesh, st%d%dim, psi, xpsi, reduce = .false.)
2498 safe_deallocate_a(xpsi)
2499 safe_deallocate_a(gspsi)
2500 safe_deallocate_a(psi)
2505 n_dip = ions%dipole()
2507 do ist = gs_st%st_start, st%nst
2508 do uist = gs_st%st_start, gs_st%st_end
2509 projections(ist, uist, ik) = projections(ist, uist, ik) - n_dip(dir)
2525 subroutine td_write_n_ex(out_nex, outp, namespace, mesh, kpoints, st, gs_st, iter)
2526 type(c_ptr),
intent(inout) :: out_nex
2529 class(
mesh_t),
intent(in) :: mesh
2533 integer,
intent(in) :: iter
2535 complex(real64),
allocatable :: projections(:,:)
2536 character(len=80) :: aux, dir
2537 integer :: ik, ikpt, ist, uist, err
2538 real(real64) :: Nex, weight
2540 real(real64),
allocatable :: Nex_kpt(:)
2546 if (st%system_grp%is_root())
then
2549 write(aux,
'(a15,i2)')
'# nspin ', st%d%nspin
2556 write(aux,
'(a,i8)')
"# nik ", st%nik
2560 write(aux,
'(a,2i8)')
"# st ", gs_st%st_start, st%nst
2564 write(aux,
'(a,2i8)')
"# ust ", gs_st%st_start, gs_st%st_end
2574 if (st%system_grp%is_root())
then
2583 do ist = 1, gs_st%nst
2584 if (gs_st%occ(ist, ik) >
m_min_occ .and. ist > gs_nst) gs_nst = ist
2588 safe_allocate(projections(1:gs_nst, 1:st%nst))
2590 safe_allocate(nex_kpt(1:st%nik))
2592 do ik = st%d%kpt%start, st%d%kpt%end
2593 ikpt = st%d%get_kpoint_index(ik)
2596 weight = st%kweights(ik) * gs_st%occ(ist, ik)/ st%smear%el_per_state
2597 do uist = st%st_start, st%st_end
2598 nex_kpt(ikpt) = nex_kpt(ikpt) - weight * st%occ(uist, ik) * abs(projections(ist, uist))**2
2601 nex_kpt(ikpt) = nex_kpt(ikpt) + sum(st%occ(st%st_start:st%st_end, ik))*st%kweights(ik)
2604 if (st%parallel_in_states .or. st%d%kpt%parallel)
then
2610 if (st%system_grp%is_root())
then
2616 write(dir,
'(a,a,i7.7)') trim(outp%iter_dir),
"td.", iter
2619 + outp%how(option__output__density_kpt), dir,
"n_excited_el_kpt", namespace, &
2623 safe_deallocate_a(projections)
2624 safe_deallocate_a(nex_kpt)
2636 class(
mesh_t),
intent(in) :: mesh
2639 complex(real64),
intent(inout) :: projections(1:st%nst, gs_st%st_start:gs_st%nst, 1:st%nik)
2641 integer :: uist, ist, ik
2642 complex(real64),
allocatable :: psi(:, :), gspsi(:, :)
2645 safe_allocate(psi(1:mesh%np, 1:st%d%dim))
2646 safe_allocate(gspsi(1:mesh%np, 1:st%d%dim))
2648 projections(:,:,:) =
m_zero
2650 do ik = st%d%kpt%start, st%d%kpt%end
2651 do ist = st%st_start, st%st_end
2653 do uist = gs_st%st_start, gs_st%nst
2655 projections(ist, uist, ik) =
zmf_dotp(mesh, st%d%dim, psi, gspsi, reduce = .false.)
2660 safe_deallocate_a(psi)
2661 safe_deallocate_a(gspsi)
2670 class(
mesh_t),
intent(in) :: mesh
2675 integer,
intent(in) :: iter
2677 complex(real64),
allocatable :: proj(:,:), psi(:,:,:), gs_psi(:,:,:), temp_state(:,:)
2678 character(len=80) :: filename1, filename2
2679 integer :: ik,ist, jst, file, idim, nk_proj
2683 write(filename1,
'(I10)') iter
2684 filename1 =
'td.general/projections_iter_'//trim(adjustl(filename1))
2687 safe_allocate(proj(1:gs_st%nst, 1:gs_st%nst))
2688 safe_allocate(psi(1:gs_st%nst,1:gs_st%d%dim,1:mesh%np))
2689 safe_allocate(gs_psi(1:gs_st%nst,1:gs_st%d%dim,1:mesh%np))
2690 safe_allocate(temp_state(1:mesh%np,1:gs_st%d%dim))
2696 nk_proj = kpoints%nik_skip
2698 do ik = kpoints%reduced%npoints-nk_proj+1, kpoints%reduced%npoints
2700 psi(1:gs_st%nst, 1:gs_st%d%dim, 1:mesh%np)=
m_zero
2701 gs_psi(1:gs_st%nst, 1:gs_st%d%dim, 1:mesh%np)=
m_zero
2703 if (st%system_grp%is_root())
then
2704 write(filename2,
'(I10)') ik
2705 filename2 = trim(adjustl(filename1))//
'_ik_'//trim(adjustl(filename2))
2706 file =
io_open(filename2, namespace, action=
'write')
2709 do ist=gs_st%st_start,gs_st%st_end
2712 do idim = 1,gs_st%d%dim
2713 psi(ist,idim,1:mesh%np) = temp_state(1:mesh%np,idim)
2716 do idim = 1,gs_st%d%dim
2717 gs_psi(ist,idim,1:mesh%np) = temp_state(1:mesh%np,idim)
2726 assert(mesh%np_global*gs_st%d%dim < huge(0_int32))
2727 proj(1:gs_st%nst, 1:gs_st%nst) =
m_zero
2732 i8_to_i4(mesh%np_global*gs_st%d%dim), &
2733 cmplx(mesh%volume_element,
m_zero, real64) , &
2735 ubound(psi, dim = 1), &
2737 ubound(gs_psi, dim = 1), &
2740 ubound(proj, dim = 1))
2743 if (st%system_grp%is_root())
then
2744 do ist = 1, gs_st%nst
2745 do jst = 1, gs_st%nst
2746 write(file,
'(I3,1x,I3,1x,e13.6,1x,e13.6,2x)') ist, jst, proj(ist,jst)
2754 safe_deallocate_a(proj)
2755 safe_deallocate_a(psi)
2756 safe_deallocate_a(gs_psi)
2757 safe_deallocate_a(temp_state)
2763 subroutine td_write_floquet(namespace, space, hm, ext_partners, gr, st, iter)
2764 type(namespace_t),
intent(in) :: namespace
2765 class(space_t),
intent(in) :: space
2766 type(hamiltonian_elec_t),
intent(inout) :: hm
2767 type(partner_list_t),
intent(in) :: ext_partners
2768 type(grid_t),
intent(in) :: gr
2769 type(states_elec_t),
intent(inout) :: st
2770 integer,
intent(in) :: iter
2772 complex(real64),
allocatable :: hmss(:,:), psi(:,:,:), hpsi(:,:,:), temp_state1(:,:)
2773 complex(real64),
allocatable :: HFloquet(:,:,:), HFloq_eff(:,:), temp(:,:)
2774 real(real64),
allocatable :: eigenval(:), bands(:,:)
2775 character(len=80) :: filename
2776 integer :: it, nT, ik, ist, in, im, file, idim, nik, ik_count
2777 integer :: Forder, Fdim, m0, n0, n1, nst, ii, jj, lim_nst
2778 logical :: downfolding
2779 type(states_elec_t) :: hm_st
2781 real(real64) :: dt, Tcycle, omega
2785 downfolding = .false.
2788 if (.not. iter == 0)
then
2796 assert(gr%np == gr%np_global)
2799 call states_elec_copy(hm_st, st)
2810 call parse_variable(namespace,
'TDFloquetFrequency', m_zero, omega, units_inp%energy)
2811 call messages_print_var_value(
'Frequency used for Floquet analysis', omega, namespace=namespace)
2812 if (abs(omega) <= m_epsilon)
then
2813 message(1) =
"Please give a non-zero value for TDFloquetFrequency"
2814 call messages_fatal(1, namespace=namespace)
2818 tcycle = m_two * m_pi / omega
2828 call parse_variable(namespace,
'TDFloquetSample',20 ,nt)
2829 call messages_print_var_value(
'Number of Floquet time-sampling points', nt, namespace=namespace)
2830 dt = tcycle/real(nt, real64)
2839 call parse_variable(namespace,
'TDFloquetDimension',-1,forder)
2840 if (forder .ge. 0)
then
2841 call messages_print_var_value(
'Order of multiphoton Floquet-Hamiltonian', forder, namespace=namespace)
2843 fdim = 2 * forder + 1
2845 message(1) =
'Floquet-Hamiltonian is downfolded'
2846 call messages_info(1, namespace=namespace)
2847 downfolding = .
true.
2852 dt = tcycle/real(nt, real64)
2855 nik = hm%kpoints%nik_skip
2857 safe_allocate(hmss(1:nst,1:nst))
2858 safe_allocate( psi(1:nst,1:st%d%dim,1:gr%np))
2859 safe_allocate(hpsi(1:nst,1:st%d%dim,1:gr%np))
2860 safe_allocate(temp_state1(1:gr%np,1:st%d%dim))
2868 safe_allocate(hfloquet(1:nik,1:nst*fdim, 1:nst*fdim))
2869 hfloquet(1:nik,1:nst*fdim, 1:nst*fdim) = m_zero
2874 call hm%update(gr, namespace, space, ext_partners, time=tcycle+it*dt)
2876 call zhamiltonian_elec_apply_all(hm, namespace, gr, st, hm_st)
2881 do ik = hm%kpoints%reduced%npoints-nik+1, hm%kpoints%reduced%npoints
2882 ik_count = ik_count + 1
2884 psi(1:nst, 1:st%d%dim, 1:gr%np)= m_zero
2885 hpsi(1:nst, 1:st%d%dim, 1:gr%np)= m_zero
2887 do ist = st%st_start, st%st_end
2888 if (state_kpt_is_local(st, ist, ik))
then
2889 call states_elec_get_state(st, gr, ist, ik,temp_state1)
2890 do idim = 1, st%d%dim
2891 psi(ist, idim, 1:gr%np) = temp_state1(1:gr%np, idim)
2893 call states_elec_get_state(hm_st, gr, ist, ik,temp_state1)
2894 do idim = 1, st%d%dim
2895 hpsi(ist, idim, 1:gr%np) = temp_state1(1:gr%np, idim)
2899 call comm_allreduce(st%system_grp, psi)
2900 call comm_allreduce(st%system_grp, hpsi)
2901 assert(gr%np_global*st%d%dim < huge(0_int32))
2902 hmss(1:nst,1:nst) = m_zero
2907 i8_to_i4(gr%np_global*st%d%dim), &
2908 cmplx(gr%volume_element, m_zero, real64) , &
2910 ubound(hpsi, dim = 1), &
2912 ubound(psi, dim = 1), &
2915 ubound(hmss, dim = 1))
2917 hmss(1:nst,1:nst) = conjg(hmss(1:nst,1:nst))
2920 do in = -forder, forder
2921 do im = -forder, forder
2922 ii = (in+forder) * nst
2923 jj = (im+forder) * nst
2924 hfloquet(ik_count, ii+1:ii+nst, jj+1:jj+nst) = &
2925 hfloquet(ik_count, ii+1:ii+nst, jj+1:jj+nst) + hmss(1:nst, 1:nst) *
exp(-(in-im)*m_zi*omega*it*dt)
2929 hfloquet(ik_count, ii+ist, ii+ist) = hfloquet(ik_count, ii+ist, ii+ist) + in*omega
2938 hfloquet(:,:,:) = m_one/nt*hfloquet(:,:,:)
2941 if (downfolding)
then
2943 safe_allocate(hfloq_eff(1:nst,1:nst))
2944 safe_allocate(eigenval(1:nst))
2945 safe_allocate(bands(1:nik,1:nst))
2947 hfloq_eff(1:nst,1:nst) = m_zero
2953 hfloq_eff(1:nst, 1:nst) = hfloquet(ik, n0+1:n0+nst, m0+1:m0+nst) + &
2954 m_one/omega*(matmul(hfloquet(ik, 1:nst, m0+1:m0+nst), hfloquet(ik, n1+1:n1+nst, m0+1:m0+nst))- &
2955 matmul(hfloquet(ik, n1+1:n1+nst, m0+1:m0+nst), hfloquet(ik, 1:nst, m0+1:m0+nst)))
2957 call lalg_eigensolve(nst, hfloq_eff, eigenval)
2958 bands(ik,1:nst) = eigenval(1:nst)
2960 safe_deallocate_a(hfloq_eff)
2963 safe_allocate(eigenval(1:nst*fdim))
2964 safe_allocate(bands(1:nik,1:nst*fdim))
2965 safe_allocate(temp(1:nst*fdim, 1:nst*fdim))
2968 temp(1:nst*fdim, 1:nst*fdim) = hfloquet(ik, 1:nst*fdim, 1:nst*fdim)
2969 call lalg_eigensolve(nst*fdim, temp, eigenval)
2970 bands(ik, 1:nst*fdim) = eigenval(1:nst*fdim)
2975 if (downfolding)
then
2977 filename =
"downfolded_floquet_bands"
2980 filename =
"floquet_bands"
2983 if (st%system_grp%is_root())
then
2985 file = io_open(filename, namespace, action =
'write')
2988 write(file,
'(e13.6, 1x)',advance=
'no') bands(ik,ist)
2995 if (.not. downfolding)
then
2998 bands(1:nik, 1:nst*fdim) = m_zero
3000 temp(1:nst*fdim,1:nst*fdim) = m_zero
3003 temp(ii+1:ii+nst, ii+1:ii+nst) = hfloquet(ik, ii+1:ii+nst, ii+1:ii+nst)
3005 call lalg_eigensolve(nst*fdim, temp, eigenval)
3006 bands(ik, 1:nst*fdim) = eigenval(1:nst*fdim)
3009 if (st%system_grp%is_root())
then
3010 filename =
'trivial_floquet_bands'
3011 file = io_open(filename, namespace, action =
'write')
3014 write(file,
'(e13.6, 1x)', advance=
'no') bands(ik,ist)
3023 call hm%update(gr, namespace, space, ext_partners, time=m_zero)
3025 safe_deallocate_a(hmss)
3026 safe_deallocate_a(psi)
3027 safe_deallocate_a(hpsi)
3028 safe_deallocate_a(temp_state1)
3029 safe_deallocate_a(hfloquet)
3030 safe_deallocate_a(eigenval)
3031 safe_deallocate_a(bands)
3032 safe_deallocate_a(temp)
3033 call states_elec_end(hm_st)
3041 type(c_ptr),
intent(inout) :: out_total_current
3042 class(space_t),
intent(in) :: space
3043 class(mesh_t),
intent(in) :: mesh
3044 type(states_elec_t),
intent(in) :: st
3045 integer,
intent(in) :: iter
3047 integer :: idir, ispin
3048 character(len=50) :: aux
3049 real(real64) :: total_current(space%dim), abs_current(space%dim)
3053 if (st%system_grp%is_root() .and. iter == 0)
then
3054 call td_write_print_header_init(out_total_current)
3057 call write_iter_header_start(out_total_current)
3059 do idir = 1, space%dim
3060 write(aux,
'(a2,a1,a1)')
'I(', index2axis(idir),
')'
3061 call write_iter_header(out_total_current, aux)
3064 do idir = 1, space%dim
3065 write(aux,
'(a10,a1,a1)')
'IntAbs(j)(', index2axis(idir),
')'
3066 call write_iter_header(out_total_current, aux)
3069 do ispin = 1, st%d%nspin
3070 do idir = 1, space%dim
3071 write(aux,
'(a4,i1,a1,a1,a1)')
'I-sp', ispin,
'(', index2axis(idir),
')'
3072 call write_iter_header(out_total_current, aux)
3076 call write_iter_nl(out_total_current)
3078 call td_write_print_header_end(out_total_current)
3081 assert(
allocated(st%current))
3083 if (st%system_grp%is_root())
then
3084 call write_iter_start(out_total_current)
3087 total_current = 0.0_real64
3088 do idir = 1, space%dim
3089 do ispin = 1, st%d%spin_channels
3090 total_current(idir) = total_current(idir) + dmf_integrate(mesh, st%current(:, idir, ispin), reduce = .false.)
3092 total_current(idir) = units_from_atomic(units_out%length/units_out%time, total_current(idir))
3094 call mesh%allreduce(total_current, dim = space%dim)
3096 abs_current = 0.0_real64
3097 do idir = 1, space%dim
3098 do ispin = 1, st%d%spin_channels
3099 abs_current(idir) = abs_current(idir) + dmf_integrate(mesh, abs(st%current(:, idir, ispin)), reduce = .false.)
3101 abs_current(idir) = units_from_atomic(units_out%length/units_out%time, abs_current(idir))
3103 call mesh%allreduce(abs_current, dim = space%dim)
3105 if (st%system_grp%is_root())
then
3106 call write_iter_double(out_total_current, total_current, space%dim)
3107 call write_iter_double(out_total_current, abs_current, space%dim)
3110 do ispin = 1, st%d%nspin
3111 total_current = units_from_atomic(units_out%length/units_out%time, dmf_integrate(mesh, space%dim, st%current(:, :, ispin)))
3113 if (st%system_grp%is_root())
then
3114 call write_iter_double(out_total_current, total_current, space%dim)
3118 if (st%system_grp%is_root())
then
3119 call write_iter_nl(out_total_current)
3127 type(c_ptr),
intent(inout) :: out_ionic_current
3128 class(space_t),
intent(in) :: space
3129 class(ions_t),
intent(in) :: ions
3130 integer,
intent(in) :: iter
3133 character(len=50) :: aux
3134 real(real64) :: ionic_current(space%dim), abs_current(space%dim)
3138 if (ions%grp%is_root() .and. iter == 0)
then
3139 call td_write_print_header_init(out_ionic_current)
3142 call write_iter_header_start(out_ionic_current)
3144 do idir = 1, space%dim
3145 write(aux,
'(a2,a1,a1)')
'I(', index2axis(idir),
')'
3146 call write_iter_header(out_ionic_current, aux)
3149 do idir = 1, space%dim
3150 write(aux,
'(a10,a1,a1)')
'IntAbs(j)(', index2axis(idir),
')'
3151 call write_iter_header(out_ionic_current, aux)
3154 call write_iter_nl(out_ionic_current)
3156 call td_write_print_header_end(out_ionic_current)
3159 ionic_current = ions%current()
3160 abs_current = ions%abs_current()
3162 if (ions%grp%is_root())
then
3163 call write_iter_start(out_ionic_current)
3165 call write_iter_double(out_ionic_current, ionic_current, space%dim)
3166 call write_iter_double(out_ionic_current, abs_current, space%dim)
3168 call write_iter_nl(out_ionic_current)
3178 type(c_ptr),
intent(inout) :: write_obj
3179 class(space_t),
intent(in) :: space
3180 type(hamiltonian_elec_t),
intent(inout) :: hm
3181 type(grid_t),
intent(in) :: gr
3182 type(states_elec_t),
intent(in) :: st
3183 integer,
intent(in) :: iter
3185 integer :: idir, ispin
3186 character(len=50) :: aux
3187 real(real64),
allocatable :: heat_current(:, :, :)
3188 real(real64) :: total_current(space%dim)
3192 if (st%system_grp%is_root() .and. iter == 0)
then
3193 call td_write_print_header_init(write_obj)
3196 call write_iter_header_start(write_obj)
3198 do idir = 1, space%dim
3199 write(aux,
'(a2,i1,a1)')
'Jh(', idir,
')'
3200 call write_iter_header(write_obj, aux)
3203 call write_iter_nl(write_obj)
3205 call td_write_print_header_end(write_obj)
3208 safe_allocate(heat_current(1:gr%np, 1:space%dim, 1:st%d%nspin))
3210 call current_heat_calculate(space, gr%der, hm, st, heat_current)
3212 if (st%system_grp%is_root())
call write_iter_start(write_obj)
3214 total_current = 0.0_real64
3215 do idir = 1, space%dim
3216 do ispin = 1, st%d%spin_channels
3217 total_current(idir) = total_current(idir) + dmf_integrate(gr, heat_current(:, idir, ispin))
3219 total_current(idir) = units_from_atomic(units_out%energy*units_out%length/units_out%time, total_current(idir))
3222 safe_deallocate_a(heat_current)
3224 if (st%system_grp%is_root())
call write_iter_double(write_obj, total_current, space%dim)
3226 if (st%system_grp%is_root())
call write_iter_nl(write_obj)
3234 type(c_ptr),
intent(inout) :: out_partial_charges
3235 class(mesh_t),
intent(in) :: mesh
3236 type(states_elec_t),
intent(in) :: st
3237 type(ions_t),
intent(in) :: ions
3238 integer,
intent(in) :: iter
3241 character(len=50) :: aux
3242 real(real64),
allocatable :: hirshfeld_charges(:)
3246 safe_allocate(hirshfeld_charges(1:ions%natoms))
3248 call partial_charges_calculate(mesh, st, ions, hirshfeld_charges)
3250 if (st%system_grp%is_root())
then
3254 call td_write_print_header_init(out_partial_charges)
3257 call write_iter_header_start(out_partial_charges)
3259 do idir = 1, ions%natoms
3260 write(aux,
'(a13,i3,a1)')
'hirshfeld(atom=', idir,
')'
3261 call write_iter_header(out_partial_charges, aux)
3264 call write_iter_nl(out_partial_charges)
3266 call td_write_print_header_end(out_partial_charges)
3269 call write_iter_start(out_partial_charges)
3271 call write_iter_double(out_partial_charges, hirshfeld_charges, ions%natoms)
3273 call write_iter_nl(out_partial_charges)
3276 safe_deallocate_a(hirshfeld_charges)
3282 subroutine td_write_q(out_q, mpi_grp, space, ks, iter)
3283 type(c_ptr),
intent(inout) :: out_q
3284 type(mpi_grp_t),
intent(in) :: mpi_grp
3285 class(space_t),
intent(in) :: space
3286 type(v_ks_t),
intent(in) :: ks
3287 integer,
intent(in) :: iter
3289 integer :: ii, nmodes
3290 character(len=50) :: aux
3291 type(mf_t),
pointer :: pt_mx
3295 nmodes = ks%v_ks_photons%nmodes()
3296 pt_mx => ks%v_ks_photons%get_pt_mx()
3298 if (mpi_grp%is_root())
then
3300 call td_write_print_header_init(out_q)
3301 call write_iter_header_start(out_q)
3303 write(aux,
'(a1,i3,a3)')
'q', ii,
'(t)'
3304 call write_iter_header(out_q, aux)
3307 write(aux,
'(a1,i3,a3)')
'p', ii,
'(t)'
3308 call write_iter_header(out_q, aux)
3310 do ii = 1, space%dim
3311 write(aux,
'(a3,i3,a3)')
'f_pt', ii,
'(t)'
3312 call write_iter_header(out_q, aux)
3314 call write_iter_nl(out_q)
3315 call td_write_print_header_end(out_q)
3318 call write_iter_start(out_q)
3319 call write_iter_double(out_q, pt_mx%pt_q, nmodes)
3320 call write_iter_double(out_q, pt_mx%pt_p, nmodes)
3321 call write_iter_double(out_q, pt_mx%fmf, space%dim)
3322 call write_iter_nl(out_q)
3331 type(c_ptr),
intent(inout) :: out_mxll
3332 type(mpi_grp_t),
intent(in) :: mpi_grp
3333 class(space_t),
intent(in) :: space
3334 type(hamiltonian_elec_t),
intent(in) :: hm
3335 real(real64),
intent(in) :: dt
3336 integer,
intent(in) :: iter
3339 real(real64) :: field(space%dim)
3340 character(len=80) :: aux
3341 character(len=1) :: field_char
3345 if (.not. mpi_grp%is_root())
then
3355 call td_write_print_header_init(out_mxll)
3357 write(aux,
'(a7,e20.12,3a)')
'# dt = ', units_from_atomic(units_out%time, dt), &
3358 " [", trim(units_abbrev(units_out%time)),
"]"
3359 call write_iter_string(out_mxll, aux)
3360 call write_iter_nl(out_mxll)
3362 call write_iter_header_start(out_mxll)
3363 select case (hm%mxll%coupling_mode)
3364 case (length_gauge_dipole, multipolar_expansion)
3365 if (hm%mxll%add_electric_dip) field_char =
'E'
3366 if (hm%mxll%add_magnetic_dip) field_char =
'B'
3367 do idir = 1, space%dim
3368 write(aux,
'(a,i1,a)') field_char //
'(', idir,
')'
3369 call write_iter_header(out_mxll, aux)
3371 case (velocity_gauge_dipole)
3372 do idir = 1, space%dim
3373 write(aux,
'(a,i1,a)')
'A(', idir,
')'
3374 call write_iter_header(out_mxll, aux)
3377 call write_iter_nl(out_mxll)
3379 call write_iter_string(out_mxll,
'#[Iter n.]')
3380 call write_iter_header(out_mxll,
'[' // trim(units_abbrev(units_out%time)) //
']')
3384 select case (hm%mxll%coupling_mode)
3385 case (length_gauge_dipole, multipolar_expansion)
3386 if (hm%mxll%add_electric_dip) aux =
'[' // trim(units_abbrev(units_out%force)) //
']'
3387 if (hm%mxll%add_magnetic_dip) aux =
'[' // trim(units_abbrev(unit_one/units_out%length**2)) //
']'
3388 do idir = 1, space%dim
3389 call write_iter_header(out_mxll, aux)
3391 case (velocity_gauge_dipole)
3392 aux =
'[' // trim(units_abbrev(units_out%energy)) //
']'
3393 do idir = 1, space%dim
3394 call write_iter_header(out_mxll, aux)
3397 call write_iter_nl(out_mxll)
3398 call td_write_print_header_end(out_mxll)
3401 call write_iter_start(out_mxll)
3404 select case (hm%mxll%coupling_mode)
3405 case (length_gauge_dipole, multipolar_expansion)
3406 if (hm%mxll%add_electric_dip) field = units_from_atomic(units_out%force, hm%mxll%e_field_dip)
3407 if (hm%mxll%add_magnetic_dip) field = units_from_atomic(unit_one/units_out%length**2, hm%mxll%b_field_dip)
3408 call write_iter_double(out_mxll, field, space%dim)
3409 case (velocity_gauge_dipole)
3410 field = units_from_atomic(units_out%energy, hm%mxll%vec_pot_dip)
3411 call write_iter_double(out_mxll, field, space%dim)
3413 call write_iter_nl(out_mxll)
3421 type(c_ptr),
intent(inout) :: out_coords
3422 type(mpi_grp_t),
intent(in) :: mpi_grp
3423 type(lda_u_t),
intent(in) :: lda_u
3424 integer,
intent(in) :: iter
3427 character(len=50) :: aux
3429 if (.not. mpi_grp%is_root())
return
3434 call td_write_print_header_init(out_coords)
3437 call write_iter_header_start(out_coords)
3439 do ios = 1, lda_u%norbsets
3440 write(aux,
'(a2,i3,a1)')
'Ueff(', ios,
')'
3441 call write_iter_header(out_coords, aux)
3444 do ios = 1, lda_u%norbsets
3445 write(aux,
'(a2,i3,a1)')
'U(', ios,
')'
3446 call write_iter_header(out_coords, aux)
3449 do ios = 1, lda_u%norbsets
3450 write(aux,
'(a2,i3,a1)')
'J(', ios,
')'
3451 call write_iter_header(out_coords, aux)
3454 if (lda_u%intersite)
then
3455 do ios = 1, lda_u%norbsets
3456 do inn = 1, lda_u%orbsets(ios)%nneighbors
3457 write(aux,
'(a2,i3,a1,i3,a1)')
'V(', ios,
'-', inn,
')'
3458 call write_iter_header(out_coords, aux)
3464 call write_iter_nl(out_coords)
3467 call write_iter_string(out_coords,
'#[Iter n.]')
3468 call write_iter_header(out_coords,
'[' // trim(units_abbrev(units_out%time)) //
']')
3469 call write_iter_string(out_coords, &
3470 'Effective U ' // trim(units_abbrev(units_out%energy)) // &
3471 ', U in '// trim(units_abbrev(units_out%energy)) // &
3472 ', J in ' // trim(units_abbrev(units_out%energy)))
3473 call write_iter_nl(out_coords)
3475 call td_write_print_header_end(out_coords)
3478 call write_iter_start(out_coords)
3480 do ios = 1, lda_u%norbsets
3481 call write_iter_double(out_coords, units_from_atomic(units_out%energy, &
3482 lda_u%orbsets(ios)%Ueff), 1)
3485 do ios = 1, lda_u%norbsets
3486 call write_iter_double(out_coords, units_from_atomic(units_out%energy, &
3487 lda_u%orbsets(ios)%Ubar), 1)
3490 do ios = 1, lda_u%norbsets
3491 call write_iter_double(out_coords, units_from_atomic(units_out%energy, &
3492 lda_u%orbsets(ios)%Jbar), 1)
3495 if (lda_u%intersite)
then
3496 do ios = 1, lda_u%norbsets
3497 do inn = 1, lda_u%orbsets(ios)%nneighbors
3498 call write_iter_double(out_coords, units_from_atomic(units_out%energy, &
3499 lda_u%orbsets(ios)%V_ij(inn,0)), 1)
3504 call write_iter_nl(out_coords)
3511 type(c_ptr),
intent(inout) :: file_handle
3512 type(grid_t),
intent(in) :: grid
3513 type(kpoints_t),
intent(in) :: kpoints
3514 type(states_elec_t),
intent(in) :: st
3515 integer,
intent(in) :: iter
3517 integer :: ik_ispin, ist
3518 character(len=7) :: nkpt_str, nst_str
3519 character(len=7) :: ik_str, ist_str
3520 real(real64),
allocatable :: norm_ks(:, :)
3521 real(real64) :: n_electrons
3525 safe_allocate(norm_ks(1:st%nst, 1:st%nik))
3526 call states_elec_calc_norms(grid, kpoints, st, norm_ks)
3528 if (st%system_grp%is_root())
then
3531 call td_write_print_header_init(file_handle)
3534 write(nkpt_str,
'(I7)') st%nik
3535 write(nst_str,
'(I7)') st%nst
3536 call write_iter_string(file_handle,
'# Dimensions. (nstates, nkpt * nspin):')
3537 call write_iter_string(file_handle, trim(adjustl(nst_str)) //
' ' // trim(adjustl(nkpt_str)))
3538 call write_iter_nl(file_handle)
3541 call write_iter_string(file_handle,
'# Norm ordering: (istate, ikpoint_spin)')
3542 call write_iter_nl(file_handle)
3545 call write_iter_header_start(file_handle)
3546 call write_iter_header(file_handle,
'N_electrons')
3547 do ik_ispin = 1, st%nik
3549 write(ik_str,
'(I7)') ik_ispin
3550 write(ist_str,
'(I7)') ist
3551 call write_iter_header(file_handle, &
3552 'Norm (' // trim(ist_str) //
',' // trim(ik_str) //
')')
3555 call write_iter_nl(file_handle)
3556 call td_write_print_header_end(file_handle)
3559 n_electrons = sum(st%occ * norm_ks**2)
3562 call write_iter_start(file_handle)
3563 call write_iter_double(file_handle, n_electrons, 1)
3564 do ik_ispin = 1, st%nik
3565 call write_iter_double(file_handle, norm_ks(:, ik_ispin),
size(norm_ks, 1))
3567 call write_iter_nl(file_handle)
3571 safe_deallocate_a(norm_ks)
3580 type(c_ptr),
intent(inout) :: file_handle
3581 type(ions_t),
intent(in) :: ions
3582 integer,
intent(in) :: iter
3585 real(real64) :: tmp(3)
3587 if (.not. ions%grp%is_root())
return
3591 assert(ions%space%dim == 3)
3594 call td_write_print_header_init(file_handle)
3597 call write_iter_header_start(file_handle)
3599 call write_iter_string(file_handle,
'# Iter, a, b, c, volume, alpha, beta, gamma, ' &
3600 //
'a_x, a_y, a_z, b_x, b_y, b_z, c_x, c_y, c_z')
3603 call write_iter_string(file_handle,
'#[Iter n.]')
3604 call write_iter_header(file_handle,
'[' // trim(units_abbrev(units_out%time)) //
']')
3605 call write_iter_string(file_handle, &
3606 'Lengths in ' // trim(units_abbrev(units_out%length)) // &
3607 ', Volume in ' // trim(units_abbrev(units_out%length**3)) // &
3608 ', Angles in degree, Lattice vectors in '// trim(units_abbrev(units_out%length)))
3609 call write_iter_nl(file_handle)
3611 call td_write_print_header_end(file_handle)
3614 call write_iter_start(file_handle)
3618 tmp(idir) = units_from_atomic(units_out%length, norm2(ions%latt%rlattice(1:3, idir)))
3620 call write_iter_double(file_handle, tmp, 3)
3623 tmp(1) = units_from_atomic(units_out%length**3, ions%latt%rcell_volume)
3624 call write_iter_double(file_handle, tmp(1), 1)
3627 call write_iter_double(file_handle, ions%latt%alpha, 1)
3628 call write_iter_double(file_handle, ions%latt%beta, 1)
3629 call write_iter_double(file_handle, ions%latt%gamma, 1)
3633 tmp(1:3) = units_from_atomic(units_out%length, ions%latt%rlattice(:, idir))
3634 call write_iter_double(file_handle, tmp, 3)
3636 call write_iter_nl(file_handle)
3645 type(namespace_t),
intent(in) :: namespace
3646 integer,
intent(in) :: iter
3647 real(real64),
intent(in) :: dt
3648 type(mpi_grp_t),
intent(in) :: grp
3650 integer :: default, flags, iout, first
3705 call parse_variable(namespace,
'MaxwellTDOutput', default, flags)
3707 if (.not. varinfo_valid_option(
'MaxwellTDOutput', flags, is_flag = .
true.))
then
3708 call messages_input_error(namespace,
'MaxwellTDOutput')
3712 writ%out(iout)%write = (iand(flags, 2**(iout - 1)) /= 0)
3713 if (writ%out(iout)%write)
then
3714 writ%out(iout + 1)%write = .
true.
3715 writ%out(iout + 2)%write = .
true.
3720 writ%out(iout)%write = (iand(flags, 2**(iout - 1)) /= 0)
3729 writ%out(:)%mpi_grp = grp
3731 call io_mkdir(
'td.general', namespace)
3736 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/total_e_field_x", namespace)))
3738 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/total_e_field_y", namespace)))
3740 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/total_e_field_z", namespace)))
3746 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/total_b_field_x", namespace)))
3748 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/total_b_field_y", namespace)))
3750 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/total_b_field_z", namespace)))
3756 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/longitudinal_e_field_x", namespace)))
3758 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/longitudinal_e_field_y", namespace)))
3760 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/longitudinal_e_field_z", namespace)))
3766 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/longitudinal_b_field_x", namespace)))
3768 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/longitudinal_b_field_y", namespace)))
3770 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/longitudinal_b_field_z", namespace)))
3776 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/transverse_e_field_x", namespace)))
3778 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/transverse_e_field_y", namespace)))
3780 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/transverse_e_field_z", namespace)))
3786 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/transverse_b_field_x", namespace)))
3788 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/transverse_b_field_y", namespace)))
3790 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/transverse_b_field_z", namespace)))
3796 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/maxwell_energy", namespace)))
3801 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/electric_field_surface-x", namespace)))
3806 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/electric_field_surface-y", namespace)))
3811 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/electric_field_surface-z", namespace)))
3816 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/magnetic_field_surface-x", namespace)))
3821 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/magnetic_field_surface-y", namespace)))
3826 units_from_atomic(units_out%time, dt), trim(io_workpath(
"td.general/magnetic_field_surface-z", namespace)))
3842 if (writ%out(iout)%write)
call write_iter_end(writ%out(iout)%handle)
3850 subroutine td_write_mxll_iter(writ, space, gr, st, hm, helmholtz, dt, iter, namespace)
3852 class(space_t),
intent(in) :: space
3853 type(grid_t),
intent(inout) :: gr
3854 type(states_mxll_t),
intent(inout) :: st
3855 type(hamiltonian_mxll_t),
intent(inout) :: hm
3856 type(helmholtz_decomposition_t),
intent(inout) :: helmholtz
3857 real(real64),
intent(in) :: dt
3858 integer,
intent(in) :: iter
3859 type(namespace_t),
intent(in) :: namespace
3864 call profiling_in(
"TD_WRITE_ITER_MAXWELL")
3867 call helmholtz%get_trans_field(namespace, st%rs_state_trans, total_field=st%rs_state)
3868 call get_rs_state_at_point(st%selected_points_rs_state_trans(:,:), st%rs_state_trans, &
3869 st%selected_points_coordinate(:,:), st, gr)
3872 hm%energy%energy_trans = m_zero
3876 call helmholtz%get_long_field(namespace, st%rs_state_long, total_field=st%rs_state)
3877 call get_rs_state_at_point(st%selected_points_rs_state_long(:,:), st%rs_state_long, &
3878 st%selected_points_coordinate(:,:), st, gr)
3881 hm%energy%energy_long = m_zero
3974 call profiling_out(
"TD_WRITE_ITER_MAXWELL")
3983 type(mpi_grp_t),
intent(in) :: mpi_grp
3984 type(hamiltonian_mxll_t),
intent(in) :: hm
3985 integer,
intent(in) :: iter
3989 integer :: n_columns
3991 if (.not. mpi_grp%is_root())
return
4016 call write_iter_header(
out_maxwell_energy,
'[' // trim(units_abbrev(units_out%time)) //
']')
4018 do ii = 1, n_columns
4019 call write_iter_header(
out_maxwell_energy,
'[' // trim(units_abbrev(units_out%energy)) //
']')
4027 call write_iter_double(
out_maxwell_energy, units_from_atomic(units_out%energy, hm%energy%energy), 1)
4028 call write_iter_double(
out_maxwell_energy, units_from_atomic(units_out%energy, hm%energy%e_energy), 1)
4029 call write_iter_double(
out_maxwell_energy, units_from_atomic(units_out%energy, hm%energy%b_energy), 1)
4031 hm%energy%energy+hm%energy%boundaries), 1)
4032 call write_iter_double(
out_maxwell_energy, units_from_atomic(units_out%energy, hm%energy%boundaries), 1)
4033 call write_iter_double(
out_maxwell_energy, units_from_atomic(units_out%energy, hm%energy%energy_trans), 1)
4034 call write_iter_double(
out_maxwell_energy, units_from_atomic(units_out%energy, hm%energy%energy_long), 1)
4035 call write_iter_double(
out_maxwell_energy, units_from_atomic(units_out%energy, hm%energy%energy_plane_waves), 1)
4044 type(c_ptr),
intent(inout) :: out_field_surf
4045 type(states_mxll_t),
intent(in) :: st
4046 integer,
intent(in) :: dim
4047 integer,
intent(in) :: iter
4051 integer :: n_columns
4053 if (.not. st%system_grp%is_root())
return
4060 call td_write_print_header_init(out_field_surf)
4063 call write_iter_header_start(out_field_surf)
4064 call write_iter_header(out_field_surf,
'- x direction')
4065 call write_iter_header(out_field_surf,
'+ x direction')
4066 call write_iter_header(out_field_surf,
'- y direction')
4067 call write_iter_header(out_field_surf,
'+ y direction')
4068 call write_iter_header(out_field_surf,
'- z direction')
4069 call write_iter_header(out_field_surf,
'+ z direction')
4070 call write_iter_header(out_field_surf,
'- x dir. p. w.')
4071 call write_iter_header(out_field_surf,
'+ x dir. p. w.')
4072 call write_iter_header(out_field_surf,
'- y dir. p. w.')
4073 call write_iter_header(out_field_surf,
'+ y dir. p. w.')
4074 call write_iter_header(out_field_surf,
'- z dir. p. w.')
4075 call write_iter_header(out_field_surf,
'+ z dir. p. w.')
4077 call write_iter_nl(out_field_surf)
4080 call write_iter_string(out_field_surf,
'#[Iter n.]')
4081 call write_iter_header(out_field_surf,
'[' // trim(units_abbrev(units_out%time)) //
']')
4083 do ii = 1, n_columns
4084 call write_iter_header(out_field_surf,
'[' // trim(units_abbrev(units_out%energy/units_out%length)) //
']')
4086 call write_iter_nl(out_field_surf)
4088 call td_write_print_header_end(out_field_surf)
4091 call write_iter_start(out_field_surf)
4092 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
4093 st%electric_field_box_surface(1,1,dim)), 1)
4094 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
4095 st%electric_field_box_surface(2,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(1,2,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(2,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(1,3,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(2,3,dim)), 1)
4104 call write_iter_double(out_field_surf, units_from_atomic(units_out%energy/units_out%length, &
4105 st%electric_field_box_surface_plane_waves(1,1,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(2,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(1,2,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(2,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(1,3,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(2,3,dim)), 1)
4116 call write_iter_nl(out_field_surf)
4124 type(c_ptr),
intent(inout) :: out_field_surf
4125 type(states_mxll_t),
intent(in) :: st
4126 integer,
intent(in) :: dim
4127 integer,
intent(in) :: iter
4131 integer :: n_columns
4133 if (.not. st%system_grp%is_root())
return
4140 call td_write_print_header_init(out_field_surf)
4143 call write_iter_header_start(out_field_surf)
4144 call write_iter_header(out_field_surf,
'- x direction')
4145 call write_iter_header(out_field_surf,
'+ x direction')
4146 call write_iter_header(out_field_surf,
'- y direction')
4147 call write_iter_header(out_field_surf,
'+ y direction')
4148 call write_iter_header(out_field_surf,
'- z direction')
4149 call write_iter_header(out_field_surf,
'+ z direction')
4150 call write_iter_header(out_field_surf,
'- x dir. p. w.')
4151 call write_iter_header(out_field_surf,
'+ x dir. p. w.')
4152 call write_iter_header(out_field_surf,
'- y dir. p. w.')
4153 call write_iter_header(out_field_surf,
'+ y dir. p. w.')
4154 call write_iter_header(out_field_surf,
'- z dir. p. w.')
4155 call write_iter_header(out_field_surf,
'+ z dir. p. w.')
4157 call write_iter_nl(out_field_surf)
4160 call write_iter_string(out_field_surf,
'#[Iter n.]')
4161 call write_iter_header(out_field_surf,
'[' // trim(units_abbrev(units_out%time)) //
']')
4163 do ii = 1, n_columns
4164 call write_iter_header(out_field_surf,
'[' // trim(units_abbrev(unit_one/units_out%length**2)) //
']')
4166 call write_iter_nl(out_field_surf)
4168 call td_write_print_header_end(out_field_surf)
4171 call write_iter_start(out_field_surf)
4172 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4173 st%magnetic_field_box_surface(1,1,dim)), 1)
4174 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4175 st%magnetic_field_box_surface(2,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(1,2,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(2,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(1,3,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(2,3,dim)), 1)
4184 call write_iter_double(out_field_surf, units_from_atomic(unit_one/units_out%length**2, &
4185 st%magnetic_field_box_surface_plane_waves(1,1,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(2,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(1,2,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(2,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(1,3,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(2,3,dim)), 1)
4196 call write_iter_nl(out_field_surf)
4202 subroutine td_write_fields(out_fields, space, st, iter, dt, e_or_b_field, field_type, idir)
4203 type(c_ptr),
intent(inout) :: out_fields
4204 class(space_t),
intent(in) :: space
4205 type(states_mxll_t),
intent(in) :: st
4206 integer,
intent(in) :: iter
4207 real(real64),
intent(in) :: dt
4208 integer,
intent(in) :: e_or_b_field
4209 integer,
intent(in) :: field_type
4210 integer,
intent(in) :: idir
4214 real(real64) :: field(space%dim), selected_field
4215 character(len=80) :: aux
4217 if (.not. st%system_grp%is_root())
return
4222 call td_write_print_header_init(out_fields)
4225 write(aux,
'(a7,e20.12,3a)')
'# dt = ', units_from_atomic(units_out%time, dt), &
4226 " [", trim(units_abbrev(units_out%time)),
"]"
4227 call write_iter_string(out_fields, aux)
4228 call write_iter_nl(out_fields)
4230 call write_iter_header_start(out_fields)
4232 do id = 1, st%selected_points_number
4233 select case (e_or_b_field)
4235 write(aux,
'(a,i1,a)')
'E(', id,
')'
4237 write(aux,
'(a,i1,a)')
'B(', id,
')'
4239 call write_iter_header(out_fields, aux)
4242 call write_iter_nl(out_fields)
4243 call write_iter_string(out_fields,
'#[Iter n.]')
4244 call write_iter_header(out_fields,
' [' // trim(units_abbrev(units_out%time)) //
']')
4249 aux =
' [' // trim(units_abbrev(units_out%force)) //
']'
4250 do id = 1, st%selected_points_number
4251 call write_iter_header(out_fields, aux)
4253 call write_iter_nl(out_fields)
4254 call td_write_print_header_end(out_fields)
4257 call write_iter_start(out_fields)
4259 do id = 1, st%selected_points_number
4260 select case (e_or_b_field)
4263 select case (field_type)
4265 call get_electric_field_vector(st%selected_points_rs_state(:,id), field(1:st%dim))
4267 call get_electric_field_vector(st%selected_points_rs_state_long(:,id), field(1:st%dim))
4269 call get_electric_field_vector(st%selected_points_rs_state_trans(:,id), field(1:st%dim))
4271 selected_field = units_from_atomic(units_out%energy/units_out%length, field(idir))
4274 select case (field_type)
4276 call get_magnetic_field_vector(st%selected_points_rs_state(:,id), st%rs_sign, field(1:st%dim))
4278 call get_magnetic_field_vector(st%selected_points_rs_state_long(:,id), st%rs_sign, field(1:st%dim))
4280 call get_magnetic_field_vector(st%selected_points_rs_state_trans(:,id), st%rs_sign, field(1:st%dim))
4282 selected_field = units_from_atomic(unit_one/units_out%length**2, field(idir))
4284 call write_iter_double(out_fields, selected_field, 1)
4287 call write_iter_nl(out_fields)
4295 type(namespace_t),
intent(in) :: namespace
4296 class(space_t),
intent(in) :: space
4297 type(grid_t),
intent(inout) :: gr
4298 type(states_mxll_t),
intent(inout) :: st
4299 type(hamiltonian_mxll_t),
intent(inout) :: hm
4300 type(helmholtz_decomposition_t),
intent(inout) :: helmholtz
4301 type(output_t),
intent(in) :: outp
4302 integer,
intent(in) :: iter
4303 real(real64),
intent(in) :: time
4305 character(len=256) :: filename
4307 push_sub(td_write_mxwll_free_data)
4308 call profiling_in(
"TD_WRITE_MAXWELL_DATA")
4311 write(filename,
'(a,a,i7.7)') trim(outp%iter_dir),
"td.", iter
4313 call output_mxll(outp, namespace, space, gr, st, hm, helmholtz, time, filename)
4315 call profiling_out(
"TD_WRITE_MAXWELL_DATA")
4316 pop_sub(td_write_mxwll_free_data)
4321 type(c_ptr),
intent(inout) :: out_dm_proj_basis
4322 type(states_elec_t),
intent(in) :: dmp_st
4323 integer,
intent(in) :: iter
4325 character(len=80) :: aux
4331 call td_write_print_header_init(out_dm_proj_basis)
4333 write(aux,
'(a15,i8)')
"# nspin ", dmp_st%d%nspin
4334 call write_iter_string(out_dm_proj_basis, aux)
4335 call write_iter_nl(out_dm_proj_basis)
4337 write(aux,
'(a15,i8)')
"# nik ", dmp_st%nik
4338 call write_iter_string(out_dm_proj_basis, aux)
4339 call write_iter_nl(out_dm_proj_basis)
4341 write(aux,
'(a15,2i8)')
"# st ", 1, dmp_st%nst
4342 call write_iter_string(out_dm_proj_basis, aux)
4343 call write_iter_nl(out_dm_proj_basis)
4345 write(aux,
'(a15)')
"# w(ik) "
4346 call write_iter_string(out_dm_proj_basis, aux)
4347 do ik = 1, dmp_st%nik
4348 call write_iter_double(out_dm_proj_basis, dmp_st%kweights(ik), 1)
4350 call write_iter_nl(out_dm_proj_basis)
4352 call td_write_print_header_end(out_dm_proj_basis)
4354 call write_iter_string(out_dm_proj_basis,
"# ------------")
4355 call write_iter_start(out_dm_proj_basis)
4356 call write_iter_double(out_dm_proj_basis, dmp_st%qtot, 1)
4357 call write_iter_nl(out_dm_proj_basis)
4358 do ik = 1, dmp_st%nik
4359 call write_iter_double(out_dm_proj_basis, dmp_st%eigenval(:, ik), dmp_st%nst)
4360 call write_iter_nl(out_dm_proj_basis)
4361 call write_iter_double(out_dm_proj_basis, dmp_st%occ(:, ik), dmp_st%nst)
4362 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_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), 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)