123 real(real64),
parameter :: ELECTRON_CHARGE = -
m_one
132 type(electron_space_t) :: space
133 class(ions_t),
pointer :: ions => null()
134 type(photons_t),
pointer :: photons => null()
136 type(states_elec_t) :: st
137 class(v_ks_t),
allocatable :: ks
138 type(output_t) :: outp
139 type(multicomm_t) :: mc
140 class(hamiltonian_elec_t),
allocatable :: hm
141 class(td_t),
allocatable :: td
142 type(current_t) :: current_calculator
143 type(dipole_t) :: dipole
144 class(scf_t),
allocatable :: scf
147 type(kpoints_t) :: kpoints
149 logical :: generate_epot
151 type(states_elec_t) :: st_copy
154 class(lasers_t),
pointer :: lasers => null()
155 class(gauge_field_t),
pointer :: gfield => null()
159 type(partner_list_t) :: ext_partners
162 type(xc_interaction_t),
pointer :: xc_interaction => null()
166 logical :: ions_propagated = .false.
169 type(wannier_t) :: wannier
193 procedure electrons_constructor
203 class(electrons_t),
pointer :: sys
206 integer,
optional,
intent(in) :: calc_mode_id
209 integer(int64) :: go_type
211 logical :: has_photons, variable_cell, cell_dynamics
216 safe_allocate(sys%ks)
217 safe_allocate(sys%hm)
218 safe_allocate(sys%td)
219 safe_allocate(sys%scf)
220 safe_allocate(sys%ks%oep)
221 safe_allocate(sys%ks%ks_inversion)
222 safe_allocate(sys%ks%sic)
224 sys%namespace = namespace
226 call sys%init_parallelization(grp)
231 call sys%space%write_info(sys%namespace)
232 if (sys%space%has_mixed_periodicity())
then
236 sys%ions =>
ions_t(sys%namespace, grp=sys%grp, latt_inp=latt_inp, shared_namespace=.
true.)
240 variable_cell = .false.
241 if (
present(calc_mode_id))
then
242 if (calc_mode_id == option__calculationmode__go)
then
243 call parse_variable(sys%namespace,
'GOType', option__gotype__ion_positions, go_type)
244 variable_cell =
bitand(go_type, option__gotype__cell_shape) /= 0 &
245 .or.
bitand(go_type, option__gotype__cell_volume) /= 0
249 variable_cell = variable_cell .or. cell_dynamics
252 sys%ions%symm, latt_inp, sys%ions%natoms, sys%ions%pos, variable_cell)
254 if (sys%space%is_periodic())
then
255 call sys%ions%latt%write_info(sys%namespace)
259 do iatom = 1, sys%ions%natoms
262 if (.not. sys%gr%box%contains_point(sys%ions%pos(:, iatom), tol=1.0e-6_real64))
then
263 if (sys%space%periodic_dim /= sys%space%dim)
then
264 write(
message(1),
'(a,i5,a)')
"Atom ", iatom,
" is outside the box."
271 if (sys%space%dim == 3)
then
276 call kpoints_init(sys%kpoints, sys%namespace, sys%gr%symm, sys%space%dim, sys%space%periodic_dim, sys%ions%latt, &
279 call states_elec_init(sys%st, sys%namespace, sys%space, sys%ions%val_charge(), sys%kpoints, calc_mode_id)
280 call sys%st%write_info(sys%namespace)
284 call sys%st%modelmbparticles%copy_masses(sys%gr%der%masses)
288 if (
present(calc_mode_id))
then
289 sys%generate_epot = calc_mode_id /= option__calculationmode__dummy
291 sys%generate_epot = .
true.
294 call sys%dipole%init(sys%space)
298 call sys%quantities%add(
quantity_t(
"wavefunctions", updated_on_demand = .false.))
299 call sys%quantities%add(
quantity_t(
"current", updated_on_demand = .
true., parents=[
"wavefunctions"]))
300 call sys%quantities%add(
quantity_t(
"dipole", updated_on_demand = .
true., parents=[
"wavefunctions"]))
301 call current_init(sys%current_calculator, sys%namespace)
316 call parse_variable(namespace,
'EnablePhotons', .false., has_photons)
317 if (has_photons)
then
319 sys%photons =>
photons_t(sys%namespace, sys%grp)
324 call sys%wannier%init_from_input(sys%namespace, sys%kpoints, sys%ions, sys%space, sys%st, sys%gr)
337 integer :: rankmin, depth
338 logical :: mxll_interaction_present
339 logical :: calc_dipole
341 push_sub(electrons_init_interactions)
343 mxll_interaction_present = .false.
344 select type (interaction)
346 call interaction%init(this%gr, 3)
347 mxll_interaction_present = .
true.
350 call interaction%init(this%gr, 3)
351 mxll_interaction_present = .
true.
353 call interaction%init(this%gr, 3)
354 mxll_interaction_present = .
true.
356 message(1) =
"Trying to initialize an unsupported interaction by the electrons."
360 if (mxll_interaction_present)
then
361 calc_dipole = any(this%hm%mxll%coupling_mode == &
364 if (calc_dipole)
then
365 assert(this%space%periodic_dim == 0)
366 this%hm%mxll%calc_field_dip = .
true.
367 this%hm%mxll%center_of_mass(1:3) = this%ions%center_of_mass()
368 this%hm%mxll%center_of_mass_ip =
mesh_nearest_point(this%gr, this%hm%mxll%center_of_mass, dmin, rankmin)
369 this%hm%mxll%center_of_mass_rankmin = rankmin
374 select type (interaction)
377 select type (algo => this%algo)
385 message(1) =
"The chosen algorithm does not yet support interaction interpolation"
389 call interaction%init_interpolation(depth, interaction%label)
392 pop_sub(electrons_init_interactions)
399 integer(int64) :: index_range(4)
400 real(real64) :: mesh_global, mesh_local, wfns
402 real(real64) :: spiral_q(3), spiral_q_red(3)
409 index_range(1) = this%gr%np_global
410 index_range(2) = this%st%nst
411 index_range(3) = this%st%nik
412 index_range(4) = 100000
416 this%grp%size, index_range, (/ 5000, 1, 1, 1 /))
418 call this%ions%partition(this%mc)
426 if (
parse_block(this%namespace,
'TDMomentumTransfer', blk) == 0)
then
427 do idir = 1, this%space%dim
430 else if(
parse_block(this%namespace,
'TDReducedMomentumTransfer', blk) == 0)
then
431 do idir = 1, this%space%dim
434 call kpoints_to_absolute(this%kpoints%latt, spiral_q_red(1:this%space%dim), spiral_q(1:this%space%dim))
442 if (this%st%symmetrize_density)
then
446 call output_init(this%outp, this%namespace, this%space, this%st, this%gr, this%st%nst, this%ks)
450 if (
associated(this%photons))
then
451 call this%ks%v_ks_photons%set_active(.
true.)
454 call v_ks_init(this%ks, this%namespace, this%gr, this%st, this%ions, this%mc, this%space, &
461 if (this%ks%v_ks_photons%active())
then
462 call this%ks%v_ks_photons%setup(this%namespace, this%photons%modes, this%gr, this%st, this%ions, &
463 this%mc, this%space, this%ks%xc, this%ks%xc_family, this%ks%oep%level)
471 if(this%lasers%no_lasers > 0)
then
472 call this%ext_partners%add(this%lasers)
475 deallocate(this%lasers)
479 this%gfield =>
gauge_field_t(this%namespace, this%ions%latt%rcell_volume)
481 call this%ext_partners%add(this%gfield)
484 deallocate(this%gfield)
487 call hamiltonian_elec_init(this%hm, this%namespace, this%space, this%gr, this%ions, this%ext_partners, &
488 this%st, this%ks%theory_level, this%ks%xc, this%mc, this%kpoints, &
490 xc_photons = this%ks%v_ks_photons%get_xc_photons() )
539 if (this%generate_epot)
then
540 message(1) =
"Info: Generating external potential"
543 this%ext_partners, this%st)
557 allocate(this%supported_interactions(0))
558 select case (this%hm%mxll%coupling_mode)
563 if (this%hm%mxll%add_zeeman)
then
567 if (this%hm%mxll%add_electric_dip .or. this%hm%mxll%add_electric_quad)
then
570 if (this%hm%mxll%add_magnetic_dip)
then
576 message(1) =
"Unknown maxwell-matter coupling"
580 call this%wannier%init_parallelization(this%namespace, this%st, this%ions, this%kpoints)
594 select type (algo => this%algo)
597 call td_init(this%td, this%namespace, this%space, this%gr, this%ions, this%st, this%ks, &
598 this%hm, this%ext_partners, this%outp, this%dmp)
603 call td_init_gaugefield(this%td, this%namespace, this%gr, this%st, this%ks, this%hm, &
604 this%ext_partners, this%space)
624 if (
associated(this%ions))
call this%ions%initialize()
626 select type (algo => this%algo)
630 this%ext_partners, this%st, this%ks, this%hm)
631 call this%wannier%init_data_from_file(this%kpoints)
636 this%hm, this%ions, this%ks, this%space, this%ext_partners, fromscratch=.
true.)
652 select type (algo => this%algo)
657 this%ext_partners, this%st, this%ks, this%hm, this%outp, this%dmp,
td_get_from_scratch(this%td))
668 character(len=:),
allocatable,
intent(out) :: updated_quantities(:)
670 logical :: update_energy_
676 call profiling_in(trim(this%namespace%get())//
":"//trim(operation%id))
678 update_energy_ = .
true.
683 select type (algo => this%algo)
685 time = algo%iteration%value()
686 select case (operation%id)
691 this%hm, this%ext_partners, time)
697 call this%hm%ks_pot%interpolation_new(this%td%tr%vks_old, time+algo%dt, algo%dt)
707 this%st, this%namespace, this%space, this%td%ions_dyn, this%ions, this%ext_partners, &
708 this%mc, time+algo%dt, algo%dt)
712 if(
associated(gfield))
then
714 algo%dt, time+algo%dt)
720 this%hm, this%ext_partners, time+algo%dt)
725 this%gr, this%hm,
m_half*algo%dt)
727 updated_quantities = [
"wavefunctions"]
732 if(
associated(gfield))
then
738 call this%hm%ks_pot%interpolation_new(this%td%tr%vks_old, time+algo%dt, algo%dt)
741 call this%hm%ks_pot%interpolate_potentials(this%td%tr%vks_old, 3, time+algo%dt, algo%dt, time + algo%dt/
m_two)
747 this%namespace, this%space, this%td%ions_dyn, this%ions, this%ext_partners, &
752 this%hm, this%ext_partners, time +
m_half*algo%dt)
757 this%gr, this%hm, algo%dt)
762 updated_quantities = [
"wavefunctions"]
765 call scf_init(this%scf, this%namespace, this%gr, this%ions, this%st, this%mc, this%hm, this%space)
767 this%ions_propagated = .
true.
772 this%td%ions_dyn, this%ions, this%mc, time+algo%dt, algo%dt)
776 this%ext_partners, this%st, time = time+algo%dt)
778 call scf_run(this%scf, this%namespace, this%space, this%mc, this%gr, this%ions, &
779 this%ext_partners, this%st, this%ks, this%hm, verbosity =
verb_compact)
782 this%ext_partners, this%st, time = time+algo%dt)
785 call v_ks_calc(this%ks, this%namespace, this%space, this%hm, this%st, this%ions, this%ext_partners, &
786 calc_eigenval = .
true., time = time+algo%dt, calc_energy = .
true.)
789 call energy_calc_total(this%namespace, this%space, this%hm, this%gr, this%st, this%ext_partners, iunit = -1)
791 updated_quantities = [
"wavefunctions"]
795 if (this%td%ions_dyn%cell_relax())
then
796 assert(this%scf%calc_stress)
797 call this%td%ions_dyn%update_stress(this%ions%space, this%st%stress_tensors%total, &
798 this%ions%latt%rlattice, this%ions%latt%rcell_volume)
805 this%ext_partners, this%st, time = time+algo%dt)
806 call this%ions%update_kinetic_energy()
809 this%ions_propagated = .false.
813 this%ions_propagated = .
true.
830 iter = nint(this%iteration%value()) + 1
832 select case(operation%id)
834 call scf_start(this%scf, this%namespace, this%gr, this%ions, this%st, this%ks, this%hm, this%outp)
838 call scf_iter(this%scf, this%namespace, this%space, this%mc, this%gr, this%ions, &
839 this%ext_partners, this%st, this%ks, this%hm, iter, outp = this%outp, &
840 restart_dump=this%scf%restart_dump)
842 algo%converged =
scf_iter_finish(this%scf, this%namespace, this%space, this%gr, this%ions,&
843 this%st, this%ks, this%hm, iter, outp = this%outp)
845 updated_quantities = [
"wavefunctions"]
850 call scf_finish(this%scf, this%namespace, this%space, this%gr, this%ions, &
851 this%ext_partners, this%st, this%ks, this%hm, iter-1, outp = this%outp)
860 call profiling_out(trim(this%namespace%get())//
":"//trim(operation%id))
867 real(real64),
intent(in) :: tol
879 character(len=*),
intent(in) :: label
884 call profiling_in(trim(this%namespace%get())//
":"//
"UPDATE_QUANTITY")
886 quantity => this%quantities%get(label)
887 if(
associated(quantity))
then
888 assert(quantity%updated_on_demand)
895 this%hm, this%space, this%st)
897 call this%dipole%calculate(this%gr, this%ions, this%st)
899 message(1) =
"Incompatible quantity: "//trim(label)//
"."
903 call profiling_out(trim(this%namespace%get())//
":"//
"UPDATE_QUANTITY")
914 select type (interaction)
916 call interaction%init_from_partner(partner%gr, partner%space, partner%namespace)
918 message(1) =
"Unsupported interaction."
931 call profiling_in(trim(partner%namespace%get())//
":"//
"COPY_QUANTITY_INTER")
933 select type (interaction)
935 assert(
allocated(partner%st%current))
937 interaction%partner_field(:,:) = electron_charge* &
938 sum(partner%st%current(1:partner%gr%np, :, 1:partner%st%d%spin_channels), dim=3)
939 call interaction%do_mapping()
941 message(1) =
"Unsupported interaction."
945 call profiling_out(trim(partner%namespace%get())//
":"//
"COPY_QUANTITY_INTER")
965 call profiling_in(trim(this%namespace%get())//
":"//
"OUTPUT_WRITE")
967 select type (algo => this%algo)
969 iter = this%iteration%counter()
971 call td_write_iter(this%td%write_handler, this%namespace, this%space, this%outp, this%gr, &
972 this%st, this%hm, this%ions, this%ext_partners, this%hm%kick, this%ks, algo%dt, iter, this%mc, &
973 this%td%recalculate_gs, this%dmp)
975 if (this%outp%anything_now(iter))
then
976 call td_write_output(this%namespace, this%space, this%gr, this%st, this%hm, this%ks, &
977 this%outp, this%ions, this%ext_partners, iter, algo%dt)
981 call this%wannier%write_iter(this%namespace, this%outp, this%ions, this%kpoints)
984 call profiling_out(trim(this%namespace%get())//
":"//
"OUTPUT_WRITE")
1015 logical :: update_energy_
1017 real(real64) :: time
1021 call profiling_in(trim(this%namespace%get())//
":"//
"END_OF_TIMESTEP")
1028 update_energy_ = .
true.
1034 if (this%td%pesv%calc_spm .or. this%td%pesv%calc_mask .or. this%td%pesv%calc_flux)
then
1035 call pes_calc(this%td%pesv, this%namespace, this%space, this%gr, this%st, &
1036 prop%dt, nt, this%gr%der, this%hm%kpoints, this%ext_partners, stopping)
1042 call profiling_out(trim(this%namespace%get())//
":"//
"END_OF_TIMESTEP")
1050 if (this%td%ions_dyn%is_active())
then
1051 if (.not. this%ions_propagated)
then
1053 this%td%ions_dyn, this%ions, this%mc, abs(nt*prop%dt), this%td%ions_dyn%ionic_scale*prop%dt)
1059 if(
associated(gfield))
then
1065 if (generate .or. this%ions%has_time_dependent_species())
then
1067 this%ext_partners, this%st, time = abs(nt*prop%dt))
1070 call v_ks_calc(this%ks, this%namespace, this%space, this%hm, this%st, this%ions, this%ext_partners, &
1071 calc_eigenval = update_energy_, time = abs(nt*prop%dt), calc_energy = update_energy_)
1073 if (update_energy_)
then
1074 call energy_calc_total(this%namespace, this%space, this%hm, this%gr, this%st, this%ext_partners, iunit = -1)
1078 if (this%td%ions_dyn%ions_move() .or. this%outp%what(option__output__forces) &
1080 call forces_calculate(this%gr, this%namespace, this%ions, this%hm, this%ext_partners, &
1081 this%st, this%ks, t = abs(nt*prop%dt), dt = prop%dt)
1084 if (this%td%ions_dyn%cell_relax() .or. this%outp%what(option__output__stress))
then
1085 call stress_calculate(this%namespace, this%gr, this%hm, this%st, this%ions, this%ks, this%ext_partners)
1088 if(this%td%ions_dyn%is_active())
then
1090 call this%ions%update_kinetic_energy()
1093 if(
associated(gfield))
then
1095 call gauge_field_get_force(gfield, this%gr, this%st%d%spin_channels, this%st%current, this%ks%xc%lrc)
1102 this%hm%aug_overlap)
1105 call this%wannier%update_matrices(nt, this%namespace, this%gr, this%space, this%st, this%kpoints, &
1109 this%td%iter = this%td%iter + 1
1111 call profiling_out(trim(this%namespace%get())//
":"//
"END_OF_TIMESTEP")
1122 call profiling_in(trim(this%namespace%get())//
":"//
"RESTART_WRITE")
1124 select type (algo => this%algo)
1127 call td_dump(this%td, this%namespace, this%space, this%gr, this%st, this%hm, &
1128 this%ks, this%ext_partners, this%iteration%counter(), ierr)
1130 message(1) =
"Unable to write time-dependent restart information."
1135 call pes_output(this%td%pesv, this%namespace, this%space, this%gr, this%st, this%iteration%counter(), &
1136 this%outp, algo%dt, this%ions)
1139 call this%wannier%restart_write_data(this%namespace, this%mc, this%gr)
1143 call profiling_out(trim(this%namespace%get())//
":"//
"RESTART_WRITE")
1152 logical :: from_scratch
1155 call profiling_in(trim(this%namespace%get())//
":"//
"RESTART_READ")
1157 select type (algo => this%algo)
1159 from_scratch = .false.
1161 this%ext_partners, this%st, this%ks, this%hm, from_scratch)
1164 call this%wannier%restart_read_data(this%namespace, this%mc, this%gr)
1170 from_scratch = .false.
1172 this%ks, this%space, this%ions, this%ext_partners,from_scratch)
1178 if (from_scratch)
then
1186 call profiling_out(trim(this%namespace%get())//
":"//
"RESTART_READ")
1209 real(real64),
intent(in) :: time
1212 real(real64),
allocatable :: field_tmp(:, :)
1221 assert(this%gr%box%dim == 3)
1223 safe_allocate(field_tmp(1:this%gr%np, 1:this%gr%box%dim))
1224 this%hm%mxll%e_field =
m_zero
1225 this%hm%mxll%b_field =
m_zero
1226 this%hm%mxll%vec_pot =
m_zero
1229 call iter%start(this%interactions)
1230 do while (iter%has_next())
1231 select type (interaction => iter%get_next())
1233 call interaction%interpolate(time, field_tmp)
1234 call lalg_axpy(this%gr%np, 3,
m_one, field_tmp, this%hm%mxll%e_field)
1236 call interaction%interpolate(time, field_tmp)
1237 call lalg_axpy(this%gr%np, 3,
m_one, field_tmp, this%hm%mxll%vec_pot)
1239 call interaction%interpolate(time, field_tmp)
1240 call lalg_axpy(this%gr%np, 3,
m_one, field_tmp, this%hm%mxll%b_field)
1244 safe_deallocate_a(field_tmp)
1253 logical,
intent(inout) :: from_scratch
1258 sys%ext_partners, sys%st, sys%ks, sys%hm, sys%outp, sys%space, from_scratch)
1273 if (
associated(sys%algo))
then
1274 select type (algo => sys%algo)
1276 call td_end_run(sys%td, sys%st, sys%hm, sys%dmp)
1287 call iter%start(sys%ext_partners)
1288 do while (iter%has_next())
1289 partner => iter%get_next()
1290 safe_deallocate_p(partner)
1292 call sys%ext_partners%empty()
1294 safe_deallocate_p(sys%xc_interaction)
1303 call sys%dipole%end()
1309 deallocate(sys%ions)
1310 safe_deallocate_p(sys%photons)
1318 safe_deallocate_a(sys%ks%oep)
1319 safe_deallocate_a(sys%ks%ks_inversion)
1320 safe_deallocate_a(sys%ks%sic)
1321 safe_deallocate_a(sys%ks)
1322 safe_deallocate_a(sys%hm)
1323 safe_deallocate_a(sys%td)
1324 safe_deallocate_a(sys%scf)
constant times a vector plus a vector
integer, parameter, public mask_absorbing
This module defines the abstract interfact for algorithm factories.
This module implements the basic elements defining algorithms.
character(len=algo_label_len), parameter, public iteration_done
This module handles the calculation mode.
type(calc_mode_par_t), public calc_mode_par
Singleton instance of parallel calculation mode.
integer, parameter, public p_strategy_serial
single domain, all states, k-points on a single processor
integer, parameter, public p_strategy_states
parallelization in states
subroutine, public current_calculate(this, namespace, gr, hm, space, st)
Compute total electronic current density.
subroutine, public current_init(this, namespace)
This module implements a calculator for the density and defines related functions.
This modules implements the dipole moment of the matter system.
A set of subroutines for performing the parts of a ground state calculation with an electrons system....
subroutine, public electrons_ground_state_run(namespace, mc, gr, ions, ext_partners, st, ks, hm, outp, space, fromScratch)
Run a ground state calculation for a system of electrons.
subroutine, public electrons_gs_allocate_wavefunctions(namespace, gr, st, hm, scf, ks, ions)
subroutine, public electrons_gs_initialize(namespace, scf, rdm, gr, mc, st, hm, ions, ks, space, ext_partners, fromScratch)
subroutine, public electrons_gs_load_from_restart(namespace, scf, gr, mc, st, hm, ks, space, ions, ext_partners, fromScratch)
subroutine, public electrons_gs_cleanup(ks, scf, rdm, st, hm)
subroutine electrons_initialize(this)
logical function electrons_restart_read_data(this)
logical function electrons_process_is_slave(this)
subroutine electrons_init_interaction(this, interaction)
subroutine electrons_finalize(sys)
subroutine electrons_exec_end_of_timestep_tasks(this, prop)
logical function electrons_do_algorithmic_operation(this, operation, updated_quantities)
subroutine electrons_new_algorithm(this, factory)
subroutine electrons_output_write(this)
subroutine get_fields_from_interaction(this, time)
subroutine electrons_algorithm_start(this)
subroutine electrons_output_finish(this)
subroutine electrons_output_start(this)
subroutine electrons_init_parallelization(this)
subroutine electrons_init_interaction_as_partner(partner, interaction)
subroutine electrons_ground_state_run_system(sys, from_scratch)
Run a ground state calculation for a system of electrons.
subroutine electrons_update_kinetic_energy(this)
logical function electrons_is_tolerance_reached(this, tol)
class(electrons_t) function, pointer electrons_constructor(namespace, grp, calc_mode_id)
@ brief Instantiate an instance of an electrons system
subroutine electrons_copy_quantities_to_interaction(partner, interaction)
subroutine electrons_restart_write_data(this)
subroutine electrons_update_quantity(this, label)
subroutine, public elf_init(namespace)
subroutine, public energy_calc_total(namespace, space, hm, gr, st, ext_partners, iunit, full)
This subroutine calculates the total energy of the system. Basically, it adds up the KS eigenvalues,...
real(real64) function, public zenergy_calc_electronic(namespace, hm, der, st, terms)
real(real64) function, public denergy_calc_electronic(namespace, hm, der, st, terms)
type(gauge_field_t) function, pointer, public list_get_gauge_field(partners)
This module implements the field transfer.
subroutine, public forces_calculate(gr, namespace, ions, hm, ext_partners, st, ks, vhxc_old, t, dt)
subroutine, public gauge_field_get_force(this, gr, spin_channels, current, lrc)
subroutine, public gauge_field_do_algorithmic_operation(this, operation, dt, time)
subroutine, public gauge_field_check_symmetries(this, kpoints)
logical pure function, public gauge_field_is_propagated(this)
logical pure function, public gauge_field_is_used(this)
real(real64), parameter, public m_two
real(real64), parameter, public m_zero
integer, parameter, public independent_particles
Theory level.
integer, parameter, public generalized_kohn_sham_dft
integer, parameter, public kohn_sham_dft
real(real64), parameter, public m_half
real(real64), parameter, public m_one
This module implements the underlying real-space grid.
subroutine, public grid_init_stage_1(gr, namespace, space, grp, symm, latt, n_sites, site_position, variable_cell)
First stage of the grid initialization.
subroutine, public grid_init_stage_2(gr, namespace, space, mc, qvector)
Second stage of the grid initialization.
subroutine, public grid_end(gr)
finalize a grid object
integer, parameter, public term_kinetic
subroutine, public zvmask(mesh, hm, st)
subroutine, public hamiltonian_elec_end(hm)
subroutine, public hamiltonian_elec_epot_generate(this, namespace, space, gr, ions, ext_partners, st, time)
subroutine, public hamiltonian_elec_init(hm, namespace, space, gr, ions, ext_partners, st, theory_level, xc, mc, kpoints, need_exchange, xc_photons)
integer, parameter, public mxll_vec_pot_to_matter
integer, parameter, public mxll_b_field_to_matter
integer, parameter, public mxll_e_field_to_matter
integer, parameter, public current_to_mxll_field
This module defines the abstract interaction_t class, and some auxiliary classes for interactions.
This module defines classes and functions for interaction partners.
subroutine, public ion_dynamics_propagate_vel(this, ions, atoms_moved)
subroutine, public kpoints_end(this)
subroutine, public kpoints_init(this, namespace, symm, dim, periodic_dim, latt, grp)
subroutine, public kpoints_to_absolute(latt, kin, kout)
A module to handle KS potential, without the external potential.
subroutine, public lasers_check_symmetries(this, kpoints)
subroutine, public lasers_parse_external_fields(this)
subroutine, public lasers_generate_potentials(this, mesh, space, latt)
subroutine, public lda_u_update_occ_matrices(this, namespace, mesh, st, phase, energy, aug_overlap)
System information (time, memory, sysname)
This module defines the meshes, which are used in Octopus.
subroutine, public mesh_check_symmetries(mesh, symm, periodic_dim)
integer function, public mesh_nearest_point(mesh, pos, dmin, rankmin)
Returns the index of the point which is nearest to a given vector position pos.
real(real64) pure function, public mesh_global_memory(mesh)
real(real64) pure function, public mesh_local_memory(mesh)
subroutine, public messages_print_with_emphasis(msg, iunit, namespace)
character(len=512), private msg
subroutine, public messages_warning(no_lines, all_nodes, namespace)
subroutine, public messages_obsolete_variable(namespace, name, rep)
subroutine, public messages_new_line()
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_experimental(name, namespace)
subroutine, public messages_info(no_lines, iunit, debug_only, stress, all_nodes, namespace)
This module implements the basic minimizer framework.
character(len=algo_label_len), parameter, public gs_scf_start
character(len=algo_label_len), parameter, public gs_scf_finish
character(len=algo_label_len), parameter, public gs_scf_iteration
general module for modelmb particles
This module handles the communicators for the various parallelization strategies.
subroutine, public multicomm_end(mc)
subroutine, public multicomm_init(mc, namespace, base_grp, mode_para, n_processes, index_range, min_range)
create index and domain communicators
logical pure function, public multicomm_is_slave(this)
integer, parameter, public length_gauge_dipole
integer, parameter, public no_maxwell_coupling
integer, parameter, public velocity_gauge_dipole
integer, parameter, public multipolar_expansion
integer, parameter, public full_minimal_coupling
Maxwell-field-to-matter interactions.
integer, parameter, public mxll_field_trans
this module contains the low-level part of the output system
this module contains the output system
logical function, public output_need_exchange(outp)
subroutine, public output_init(outp, namespace, space, st, gr, nst, ks)
subroutine, public output_check_generalized_overlap(outp, st, namespace)
Fence the requested outputs that are not yet correct with a generalized overlap.
logical function, public parse_is_defined(namespace, name)
integer function, public parse_block(namespace, name, blk, check_varinfo_)
subroutine, public pes_calc(pes, namespace, space, mesh, st, dt, iter, der, kpoints, ext_partners, stopping)
subroutine, public pes_output(pes, namespace, space, gr, st, iter, outp, dt, ions)
subroutine, public poisson_async_init(this, mc)
subroutine, public poisson_slave_work(this, namespace)
subroutine, public poisson_async_end(this, mc)
/* To use the profiling module, call profiling_in and profiling_out with the label of the region as a...
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.
subroutine, public propagation_ops_elec_restore_ions(wo, ions_dyn, ions)
subroutine, public propagation_ops_elec_propagate_gauge_field(wo, gfield, dt, time, save_gf)
subroutine, public propagation_ops_elec_propagate_ions_and_cell(gr, hm, st, namespace, space, ions_dyn, ions, mc, time, dt_ions)
subroutine, public propagation_ops_elec_update_hamiltonian(namespace, space, st, mesh, hm, ext_partners, time)
subroutine, public propagation_ops_elec_fuse_density_exp_apply(te, namespace, st, gr, hm, dt, dt2, op, st_td)
Apply to all states, and accumulate the density in the same pass.
subroutine, public propagation_ops_elec_interpolate_get(hm, vks_old)
subroutine, public propagation_ops_elec_move_ions(wo, gr, hm, st, namespace, space, ions_dyn, ions, ext_partners, mc, time, dt, save_pos)
subroutine, public propagation_ops_elec_exp_apply(te, namespace, st, mesh, hm, dt, op)
character(len=algo_label_len), parameter, public aetrs_start
character(len=algo_label_len), parameter, public aetrs_finish
character(len=algo_label_len), parameter, public aetrs_extrapolate
character(len=algo_label_len), parameter, public aetrs_first_half
character(len=algo_label_len), parameter, public aetrs_second_half
character(len=algo_label_len), parameter, public bomd_start
character(len=algo_label_len), parameter, public bomd_elec_scf
character(len=algo_label_len), parameter, public bomd_finish
character(len=algo_label_len), parameter, public expmid_extrapolate
character(len=algo_label_len), parameter, public expmid_finish
character(len=algo_label_len), parameter, public expmid_start
character(len=algo_label_len), parameter, public expmid_propagate
This module implements the basic propagator framework.
character(len=30), parameter, public verlet_compute_acc
type(algorithmic_operation_t), parameter, public op_verlet_compute_acc
character(len=30), parameter, public verlet_update_pos
type(algorithmic_operation_t), parameter, public op_verlet_compute_vel
character(len=30), parameter, public verlet_compute_vel
This module defines the quantity_t class and the IDs for quantities, which can be exposed by a system...
Implementation details for regridding.
subroutine, public scf_finish(scf, namespace, space, gr, ions, ext_partners, st, ks, hm, iter, outp)
subroutine, public scf_start(scf, namespace, gr, ions, st, ks, hm, outp, verbosity)
Preparation of the SCF cycle.
integer, parameter, public verb_compact
subroutine, public scf_init(scf, namespace, gr, ions, st, mc, hm, space)
subroutine, public scf_end(scf)
subroutine, public scf_run(scf, namespace, space, mc, gr, ions, ext_partners, st, ks, hm, outp, verbosity, iters_done, restart_dump)
Legacy version of the SCF code.
subroutine, public scf_iter(scf, namespace, space, mc, gr, ions, ext_partners, st, ks, hm, iter, outp, restart_dump)
logical function, public scf_iter_finish(scf, namespace, space, gr, ions, st, ks, hm, iter, outp, iters_done)
This module is intended to contain "only mathematical" functions and procedures.
pure logical function, public states_are_real(st)
This module handles spin dimensions of the states and the k-point distribution.
real(real64) function, public states_elec_wfns_memory(st, mesh)
return the memory usage of a states_elec_t object
subroutine, public states_elec_distribute_nodes(st, namespace, mc)
Distribute states over the processes for states parallelization.
subroutine, public states_elec_densities_init(st, gr)
subroutine, public states_elec_end(st)
finalize the states_elec_t object
subroutine, public kpoints_distribute(this, mc)
distribute k-points over the nodes in the corresponding communicator
subroutine, public states_elec_exec_init(st, namespace, mc)
Further initializations.
subroutine, public states_elec_init(st, namespace, space, valence_charge, kpoints, calc_mode_id)
Initialize a new states_elec_t object.
subroutine, public states_elec_allocate_current(st, space, mesh)
This module implements the calculation of the stress tensor.
subroutine, public stress_calculate(namespace, gr, hm, st, ions, ks, ext_partners)
This computes the total stress on the lattice.
subroutine, public symmetries_use_compatible_nonsymmorphic(this, ll, namespace)
Detect if some non-symmorphic operations are compatible with the real-space grid If yes,...
This module implements the abstract system type.
subroutine, public system_algorithm_start(this)
subroutine, public system_end(this)
subroutine, public system_new_algorithm(this, factory)
subroutine, public td_init_with_wavefunctions(td, namespace, space, mc, gr, ions, ext_partners, st, ks, hm, outp, dmp, from_scratch)
subroutine, public td_end(td)
subroutine, public td_load_restart_from_gs(td, namespace, space, mc, gr, ext_partners, st, ks, hm)
subroutine, public td_allocate_wavefunctions(td, namespace, mc, gr, ions, st, hm, space)
subroutine, public td_init(td, namespace, space, gr, ions, st, ks, hm, ext_partners, outp, dmp)
logical function, public td_get_from_scratch(td)
subroutine, public td_set_from_scratch(td, from_scratch)
subroutine, public td_dump(td, namespace, space, gr, st, hm, ks, ext_partners, iter, ierr)
subroutine, public td_init_gaugefield(td, namespace, gr, st, ks, hm, ext_partners, space)
subroutine, public td_load_restart_from_td(td, namespace, space, mc, gr, ext_partners, st, ks, hm, from_scratch)
subroutine, public td_end_run(td, st, hm, dmp)
subroutine, public td_write_iter(writ, namespace, space, outp, gr, st, hm, ions, ext_partners, kick, ks, dt, iter, mc, recalculate_gs, dmp)
subroutine, public td_write_output(namespace, space, gr, st, hm, ks, outp, ions, ext_partners, iter, dt)
subroutine, public td_write_data(writ)
integer, parameter, public out_separate_forces
This module defines the unit system, used for input and output.
type(unit_t), public unit_megabytes
For large amounts of data (natural code units are bytes)
subroutine, public v_ks_end(ks)
subroutine, public v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, calc_eigenval, time, calc_energy, calc_current, force_semilocal)
subroutine, public v_ks_check_generalized_overlap(ks, st, hm, namespace)
Fence the spin treatments and theory levels / functionals that are not yet correct for ultrasoft/PAW.
subroutine, public v_ks_init(ks, namespace, gr, st, ions, mc, space, kpoints)
integer, parameter, public td_wannier_method_none
integer, parameter, public oep_level_none
the OEP levels
Abstract class for the algorithm factories.
Descriptor of one algorithmic operation.
Class to transfer a current to a Maxwell field.
Extension of space that contains the knowledge of the spin dimension.
Class describing the electron system.
class defining the field_transfer interaction
These class extend the list and list iterator to make an interaction list.
abstract interaction class
abstract class for general interaction partners
iterator for the list of partners
surrogate interaction class to avoid circular dependencies between modules.
Abstract class implementing minimizers.
This is defined even when running serial.
class to transfer a Maxwell B field to a matter system
class to transfer a Maxwell electric field to a medium
class to transfer a Maxwell vector potential to a medium
Implements a propagator for Approximate ETRS.
Implements a propagator for Born-Oppenheimer molecular dynamics.
Implements the explicit exponential midpoint propagator (without predictor-corrector)
Abstract class implementing propagators.
Systems (system_t) can expose quantities that can be used to calculate interactions with other system...
Abstract class for systems.
Main object containing all Wannier-related data and methods.