Octopus
electrons.F90
Go to the documentation of this file.
1!! Copyright (C) 2002-2006 M. Marques, A. Castro, A. Rubio, G. Bertsch
2!! Copyright (C) 2009 X. Andrade
3!! Copyright (C) 2020 M. Oliveira
4!!
5!! This program is free software; you can redistribute it and/or modify
6!! it under the terms of the GNU General Public License as published by
7!! the Free Software Foundation; either version 2, or (at your option)
8!! any later version.
9!!
10!! This program is distributed in the hope that it will be useful,
11!! but WITHOUT ANY WARRANTY; without even the implied warranty of
12!! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13!! GNU General Public License for more details.
14!!
15!! You should have received a copy of the GNU General Public License
16!! along with this program; if not, write to the Free Software
17!! Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
18!! 02110-1301, USA.
19!!
20
21#include "global.h"
22
23
24module electrons_oct_m
25 use accel_oct_m
33 use debug_oct_m
35 use dipole_oct_m
39 use elf_oct_m
43 use forces_oct_m
45 use global_oct_m
46 use grid_oct_m
56 use ions_oct_m
57 use kick_oct_m
62 use lasers_oct_m
63 use lda_u_oct_m
64 use loct_oct_m
65 use mesh_oct_m
68 use mpi_oct_m
73 use output_oct_m
75 use parser_oct_m
76 use pes_oct_m
91 use rdmft_oct_m
93 use scf_oct_m
94 use space_oct_m
98 use stress_oct_m
99 use sort_oct_m
101 use system_oct_m
102 use td_oct_m
105 use v_ks_oct_m
106 use wannier_oct_m, only: wannier_t
108 use xc_oct_m
109 use xc_f03_lib_m
110 use xc_oep_oct_m
114
115 implicit none
116
117 private
118 public :: &
120
121
127 type, extends(system_t) :: electrons_t
128 ! Components are public by default
129 type(electron_space_t) :: space
130 class(ions_t), pointer :: ions => null()
131 type(photons_t), pointer :: photons => null()
132 type(grid_t) :: gr
133 type(states_elec_t) :: st
134 type(v_ks_t) :: ks
135 type(output_t) :: outp
136 type(multicomm_t) :: mc
137 type(hamiltonian_elec_t) :: hm
138 type(td_t) :: td
139 type(current_t) :: current_calculator
140 type(dipole_t) :: dipole
141 type(scf_t) :: scf
142 type(rdm_t) :: rdm
143
144 type(kpoints_t) :: kpoints
145
146 logical :: generate_epot
147
148 type(states_elec_t) :: st_copy
149
150 ! At the moment this is not treated as an external potential
151 class(lasers_t), pointer :: lasers => null()
152 class(gauge_field_t), pointer :: gfield => null()
153
154 ! List with all the external partners
155 ! This will become a list of interactions in the future
156 type(partner_list_t) :: ext_partners
157
158 !TODO: have a list of self interactions
159 type(xc_interaction_t), pointer :: xc_interaction => null()
160
161 type(dmp_t) :: dmp
162
163 logical :: ions_propagated = .false.
164
165 ! everything related to wannier functions
166 type(wannier_t) :: wannier
167
168 contains
169 procedure :: init_interaction => electrons_init_interaction
170 procedure :: new_algorithm => electrons_new_algorithm
171 procedure :: initialize => electrons_initialize
172 procedure :: do_algorithmic_operation => electrons_do_algorithmic_operation
173 procedure :: is_tolerance_reached => electrons_is_tolerance_reached
174 procedure :: update_quantity => electrons_update_quantity
175 procedure :: init_interaction_as_partner => electrons_init_interaction_as_partner
176 procedure :: copy_quantities_to_interaction => electrons_copy_quantities_to_interaction
177 procedure :: output_start => electrons_output_start
178 procedure :: output_write => electrons_output_write
179 procedure :: output_finish => electrons_output_finish
180 procedure :: process_is_slave => electrons_process_is_slave
181 procedure :: restart_write_data => electrons_restart_write_data
182 procedure :: restart_read_data => electrons_restart_read_data
183 procedure :: update_kinetic_energy => electrons_update_kinetic_energy
184 procedure :: algorithm_start => electrons_algorithm_start
185 procedure :: ground_state_run => electrons_ground_state_run_system
186 final :: electrons_finalize
187 end type electrons_t
188
189 interface electrons_t
190 procedure electrons_constructor
191 end interface electrons_t
192
193contains
194
199 function electrons_constructor(namespace, grp, calc_mode_id) result(sys)
200 class(electrons_t), pointer :: sys
201 type(namespace_t), intent(in) :: namespace
202 type(mpi_grp_t), intent(in) :: grp
203 integer, optional, intent(in) :: calc_mode_id
204
205 integer :: iatom
206 type(lattice_vectors_t) :: latt_inp
207 logical :: has_photons
208
209 push_sub_with_profile(electrons_constructor)
210
211 allocate(sys)
212
213 sys%namespace = namespace
214
215 call sys%init_parallelization(grp)
216
217 call messages_obsolete_variable(sys%namespace, 'SystemName')
218
219 sys%space = electron_space_t(sys%namespace)
220 call sys%space%write_info(sys%namespace)
221 if (sys%space%has_mixed_periodicity()) then
222 call messages_experimental('Support for mixed periodicity systems')
223 end if
225 sys%ions => ions_t(sys%namespace, grp=sys%grp, latt_inp=latt_inp, shared_namespace=.true.)
227 call grid_init_stage_1(sys%gr, sys%namespace, sys%space, sys%grp, sys%ions%symm, latt_inp, sys%ions%natoms, sys%ions%pos)
229 if (sys%space%is_periodic()) then
230 call sys%ions%latt%write_info(sys%namespace)
231 end if
233 ! Sanity check for atomic coordinates
234 do iatom = 1, sys%ions%natoms
235 ! Using the same tolerance of fold_into_cell to avoid problems with mixed periodicities
236 ! as the default tolerance of contains_point is too tight
237 if (.not. sys%gr%box%contains_point(sys%ions%pos(:, iatom), tol=1.0e-6_real64)) then
238 if (sys%space%periodic_dim /= sys%space%dim) then
239 write(message(1), '(a,i5,a)') "Atom ", iatom, " is outside the box."
240 call messages_warning(1, namespace=sys%namespace)
241 end if
242 end if
243 end do
244
245 ! Find possible non-symmorphic symmetries compatible with the real-space grid
246 if (sys%space%dim == 3) then
247 call symmetries_use_compatible_nonsymmorphic(sys%gr%symm, sys%gr%idx%ll, namespace)
248 end if
249
250 ! we need k-points for periodic systems
251 call kpoints_init(sys%kpoints, sys%namespace, sys%gr%symm, sys%space%dim, sys%space%periodic_dim, sys%ions%latt)
252
253 call states_elec_init(sys%st, sys%namespace, sys%space, sys%ions%val_charge(), sys%kpoints, calc_mode_id)
254 call sys%st%write_info(sys%namespace)
255
256 ! if independent particles in N dimensions are being used, need to initialize them
257 ! after masses are set to 1 in grid_init_stage_1 -> derivatives_init
258 call sys%st%modelmbparticles%copy_masses(sys%gr%der%masses)
259
260 call elf_init(sys%namespace)
262 if (present(calc_mode_id)) then
263 sys%generate_epot = calc_mode_id /= option__calculationmode__dummy
264 else
265 sys%generate_epot = .true.
266 end if
268 call sys%dipole%init(sys%space)
270 sys%supported_interactions_as_partner = [current_to_mxll_field]
272 call sys%quantities%add(quantity_t("wavefunctions", updated_on_demand = .false.))
273 call sys%quantities%add(quantity_t("current", updated_on_demand = .true., parents=["wavefunctions"]))
274 call sys%quantities%add(quantity_t("dipole", updated_on_demand = .true., parents=["wavefunctions"]))
275 call current_init(sys%current_calculator, sys%namespace)
277 !%Variable EnablePhotons
278 !%Type logical
279 !%Default no
280 !%Section Hamiltonian
281 !%Description
282 !% This variable can be used to enable photons in several types of calculations.
283 !% It can be used to activate the one-photon OEP formalism.
284 !% In the case of CalculationMode = casida, it enables photon modes as
285 !% described in ACS Photonics 2019, 6, 11, 2757-2778.
286 !% Finally, if set to yes when solving the ferquency-dependent Sternheimer
287 !% equation, the photons are coupled to the electronic subsystem.
288 !%End
289 call messages_obsolete_variable(namespace, 'OEPPtX', 'EnablePhotons')
290 call parse_variable(namespace, 'EnablePhotons', .false., has_photons)
291 if (has_photons) then
292 call messages_experimental("EnablePhotons = yes")
293 sys%photons => photons_t(sys%namespace)
294 else
295 nullify(sys%photons)
296 end if
297
298 call sys%wannier%init_from_input(sys%namespace, sys%kpoints)
299
301
302 pop_sub_with_profile(electrons_constructor)
303 end function electrons_constructor
304
305 ! ---------------------------------------------------------
306 subroutine electrons_init_interaction(this, interaction)
307 class(electrons_t), target, intent(inout) :: this
308 class(interaction_t), intent(inout) :: interaction
309
310 real(real64) :: dmin
311 integer :: rankmin, depth
312 logical :: mxll_interaction_present
313 logical :: calc_dipole
314
315 push_sub(electrons_init_interactions)
316
317 mxll_interaction_present = .false.
318 select type (interaction)
320 call interaction%init(this%gr, 3)
321 mxll_interaction_present = .true.
322 interaction%type = mxll_field_trans
324 call interaction%init(this%gr, 3)
325 mxll_interaction_present = .true.
327 call interaction%init(this%gr, 3)
328 mxll_interaction_present = .true.
329 class default
330 message(1) = "Trying to initialize an unsupported interaction by the electrons."
331 call messages_fatal(1, namespace=this%namespace)
332 end select
333
334 if (mxll_interaction_present) then
335 calc_dipole = any(this%hm%mxll%coupling_mode == &
337
338 if (calc_dipole) then
339 assert(this%space%periodic_dim == 0)
340 this%hm%mxll%calc_field_dip = .true.
341 this%hm%mxll%center_of_mass(1:3) = this%ions%center_of_mass()
342 this%hm%mxll%center_of_mass_ip = mesh_nearest_point(this%gr, this%hm%mxll%center_of_mass, dmin, rankmin)
343 this%hm%mxll%center_of_mass_rankmin = rankmin
344 end if
345 end if
346
347 ! set interpolation depth for field-transfer interactions
348 select type (interaction)
349 class is (field_transfer_t)
350 ! interpolation depth depends on the propagator
351 select type (algo => this%algo)
352 type is (propagator_exp_mid_t)
353 depth = 3
354 type is (propagator_aetrs_t)
355 depth = 3
356 type is (propagator_bomd_t)
357 depth = 1
358 class default
359 message(1) = "The chosen algorithm does not yet support interaction interpolation"
360 call messages_fatal(1, namespace=this%namespace)
361 end select
362
363 call interaction%init_interpolation(depth, interaction%label)
364 end select
365
366 pop_sub(electrons_init_interactions)
367 end subroutine electrons_init_interaction
368
369 ! ---------------------------------------------------------
370 subroutine electrons_init_parallelization(this)
371 class(electrons_t), intent(inout) :: this
372
373 integer(int64) :: index_range(4)
374 real(real64) :: mesh_global, mesh_local, wfns
375 integer :: idir
376 real(real64) :: spiral_q(3), spiral_q_red(3)
377 type(block_t) :: blk
378
380
381 ! store the ranges for these two indices (serves as initial guess
382 ! for parallelization strategy)
383 index_range(1) = this%gr%np_global ! Number of points in mesh
384 index_range(2) = this%st%nst ! Number of states
385 index_range(3) = this%st%nik ! Number of k-points
386 index_range(4) = 100000 ! Some large number
387
388 ! create index and domain communicators
389 call multicomm_init(this%mc, this%namespace, this%grp, calc_mode_par, &
390 this%grp%size, index_range, (/ 5000, 1, 1, 1 /))
391
392 call this%ions%partition(this%mc)
393 call kpoints_distribute(this%st, this%mc)
394 call states_elec_distribute_nodes(this%st, this%namespace, this%mc)
395
396
397 if (parse_is_defined(this%namespace, 'TDMomentumTransfer') .or. &
398 parse_is_defined(this%namespace, 'TDReducedMomentumTransfer')) then
399 spiral_q = m_zero
400 if (parse_block(this%namespace, 'TDMomentumTransfer', blk) == 0) then
401 do idir = 1, this%space%dim
402 call parse_block_float(blk, 0, idir - 1, spiral_q(idir))
403 end do
404 else if(parse_block(this%namespace, 'TDReducedMomentumTransfer', blk) == 0) then
405 do idir = 1, this%space%dim
406 call parse_block_float(blk, 0, idir - 1, spiral_q_red(idir))
407 end do
408 call kpoints_to_absolute(this%kpoints%latt, spiral_q_red(1:this%space%dim), spiral_q(1:this%space%dim))
409 end if
410 call parse_block_end(blk)
411 call grid_init_stage_2(this%gr, this%namespace, this%space, this%mc, spiral_q)
412 else
413 call grid_init_stage_2(this%gr, this%namespace, this%space, this%mc)
414 end if
415
416 if (this%st%symmetrize_density) then
417 call mesh_check_symmetries(this%gr, this%gr%symm, this%ions%space%periodic_dim)
418 end if
419
420 call output_init(this%outp, this%namespace, this%space, this%st, this%gr, this%st%nst, this%ks)
421 call states_elec_densities_init(this%st, this%gr)
422 call states_elec_exec_init(this%st, this%namespace, this%mc)
423
424 if (associated(this%photons)) then
425 call this%ks%v_ks_photons%set_active(.true.)
426 end if
427
428 call v_ks_init(this%ks, this%namespace, this%gr, this%st, this%ions, this%mc, this%space, &
429 this%kpoints)
430 if (this%ks%theory_level == kohn_sham_dft .or. this%ks%theory_level == generalized_kohn_sham_dft) then
431 this%xc_interaction => xc_interaction_t(this)
432 end if
433
434 ! For the moment the photons are initialized here
435 if (this%ks%v_ks_photons%active()) then
436 call this%ks%v_ks_photons%setup(this%namespace, this%photons%modes, this%gr, this%st, this%ions, &
437 this%mc, this%space, this%ks%xc, this%ks%xc_family, this%ks%oep%level)
438 end if
439
440
441 ! Temporary place for the initialization of the lasers
442 this%lasers => lasers_t(this%namespace)
443 call lasers_parse_external_fields(this%lasers)
444 call lasers_generate_potentials(this%lasers, this%gr, this%space, this%ions%latt)
445 if(this%lasers%no_lasers > 0) then
446 call this%ext_partners%add(this%lasers)
447 call lasers_check_symmetries(this%lasers, this%kpoints)
448 else
449 deallocate(this%lasers)
450 end if
451
452 ! Temporary place for the initialization of the gauge field
453 this%gfield => gauge_field_t(this%namespace, this%ions%latt%rcell_volume)
454 if(gauge_field_is_used(this%gfield)) then
455 call this%ext_partners%add(this%gfield)
456 call gauge_field_check_symmetries(this%gfield, this%kpoints)
457 else
458 deallocate(this%gfield)
459 end if
460
461 call hamiltonian_elec_init(this%hm, this%namespace, this%space, this%gr, this%ions, this%ext_partners, &
462 this%st, this%ks%theory_level, this%ks%xc, this%mc, this%kpoints, &
463 need_exchange = output_need_exchange(this%outp) .or. this%ks%oep%level /= oep_level_none, &
464 xc_photons = this%ks%v_ks_photons%get_xc_photons() )
466 if (this%hm%pcm%run_pcm .and. this%mc%par_strategy /= p_strategy_serial .and. this%mc%par_strategy /= p_strategy_states) then
467 call messages_experimental('Parallel in domain calculations with PCM')
468 end if
469
470 ! Print memory requirements
471 call messages_print_with_emphasis(msg='Approximate memory requirements', namespace=this%namespace)
472
473 mesh_global = mesh_global_memory(this%gr)
474 mesh_local = mesh_local_memory(this%gr)
475
476 call messages_write('Mesh')
477 call messages_new_line()
478 call messages_write(' global :')
479 call messages_write(mesh_global, units = unit_megabytes, fmt = '(f10.1)')
480 call messages_new_line()
481 call messages_write(' local :')
482 call messages_write(mesh_local, units = unit_megabytes, fmt = '(f10.1)')
483 call messages_new_line()
484 call messages_write(' total :')
485 call messages_write(mesh_global + mesh_local, units = unit_megabytes, fmt = '(f10.1)')
486 call messages_new_line()
487 call messages_info(namespace=this%namespace)
488
489 wfns = states_elec_wfns_memory(this%st, this%gr)
490 call messages_write('States')
491 call messages_new_line()
492 call messages_write(' real :')
493 call messages_write(wfns, units = unit_megabytes, fmt = '(f10.1)')
494 call messages_write(' (par_kpoints + par_states + par_domains)')
495 call messages_new_line()
496 call messages_write(' complex :')
497 call messages_write(2.0_8*wfns, units = unit_megabytes, fmt = '(f10.1)')
498 call messages_write(' (par_kpoints + par_states + par_domains)')
499 call messages_new_line()
500 call messages_info(namespace=this%namespace)
501
502 call messages_print_with_emphasis(namespace=this%namespace)
503
504 if (this%generate_epot) then
505 message(1) = "Info: Generating external potential"
506 call messages_info(1, namespace=this%namespace)
507 call hamiltonian_elec_epot_generate(this%hm, this%namespace, this%space, this%gr, this%ions, &
508 this%ext_partners, this%st)
509 message(1) = " done."
510 call messages_info(1, namespace=this%namespace)
511 end if
512
513 if (this%ks%theory_level /= independent_particles) then
514 call poisson_async_init(this%hm%psolver, this%mc)
515 ! slave nodes do not call the calculation routine
516 if (multicomm_is_slave(this%mc)) then
517 !for the moment we only have one type of slave
518 call poisson_slave_work(this%hm%psolver, this%namespace)
519 end if
520 end if
521
522 allocate(this%supported_interactions(0))
523 select case (this%hm%mxll%coupling_mode)
525 this%supported_interactions = [this%supported_interactions, mxll_e_field_to_matter]
527 this%supported_interactions = [this%supported_interactions, mxll_vec_pot_to_matter]
528 if (this%hm%mxll%add_zeeman) then
529 this%supported_interactions = [this%supported_interactions, mxll_b_field_to_matter]
530 end if
532 if (this%hm%mxll%add_electric_dip .or. this%hm%mxll%add_electric_quad) then
533 this%supported_interactions = [this%supported_interactions, mxll_e_field_to_matter]
534 end if
535 if (this%hm%mxll%add_magnetic_dip) then
536 this%supported_interactions = [this%supported_interactions, mxll_b_field_to_matter]
537 end if
539 ! Do not initialize any interaction with Maxwell
540 case default
541 message(1) = "Unknown maxwell-matter coupling"
542 call messages_fatal(1, namespace=this%namespace)
543 end select
544
545 call this%wannier%init_parallelization(this%namespace, this%st, this%ions, this%kpoints)
546
548 end subroutine electrons_init_parallelization
549
550 ! ---------------------------------------------------------
551 subroutine electrons_new_algorithm(this, factory)
552 class(electrons_t), intent(inout) :: this
553 class(algorithm_factory_t), intent(in) :: factory
554
556
557 call system_new_algorithm(this, factory)
558
559 select type (algo => this%algo)
560 class is (propagator_t)
561
562 call td_init(this%td, this%namespace, this%space, this%gr, this%ions, this%st, this%ks, &
563 this%hm, this%ext_partners, this%outp, this%dmp)
564
565 ! this corresponds to the first part of td_init_run
566 call td_allocate_wavefunctions(this%td, this%namespace, this%mc, this%gr, this%ions, this%st, &
567 this%hm, this%space)
568 call td_init_gaugefield(this%td, this%namespace, this%gr, this%st, this%ks, this%hm, &
569 this%ext_partners, this%space)
570
571 class is (minimizer_algorithm_t)
572
573 call electrons_gs_allocate_wavefunctions(this%namespace, this%gr, this%st, this%hm, this%scf, this%ks, &
574 this%ions)
575
576 class default
577 assert(.false.)
578 end select
579
581 end subroutine electrons_new_algorithm
582
583 ! ---------------------------------------------------------
584 subroutine electrons_initialize(this)
585 class(electrons_t), intent(inout) :: this
586
587 push_sub(electrons_initialize)
588
589 if (associated(this%ions)) call this%ions%initialize()
590
591 select type (algo => this%algo)
592 class is (propagator_t)
593 call td_set_from_scratch(this%td, .true.)
594 call td_load_restart_from_gs(this%td, this%namespace, this%space, this%mc, this%gr, &
595 this%ext_partners, this%st, this%ks, this%hm)
596 call this%wannier%init_data_from_file(this%kpoints, this%space)
597
598 class is (minimizer_algorithm_t)
599
600 call electrons_gs_initialize(this%namespace, this%scf, this%rdm, this%gr, this%mc, this%st, &
601 this%hm, this%ions, this%ks, this%space, this%ext_partners, fromscratch=.true.)
602 class default
603 assert(.false.)
604 end select
605
606 pop_sub(electrons_initialize)
607 end subroutine electrons_initialize
608
609 ! ---------------------------------------------------------
610 subroutine electrons_algorithm_start(this)
611 class(electrons_t), intent(inout) :: this
612
614
615 call system_algorithm_start(this)
616
617 select type (algo => this%algo)
618 class is (propagator_t)
619
620 ! additional initialization needed for electrons
621 call td_init_with_wavefunctions(this%td, this%namespace, this%space, this%mc, this%gr, this%ions, &
622 this%ext_partners, this%st, this%ks, this%hm, this%outp, this%dmp, td_get_from_scratch(this%td))
623
624 end select
625
627 end subroutine electrons_algorithm_start
628
629 ! ---------------------------------------------------------
630 logical function electrons_do_algorithmic_operation(this, operation, updated_quantities) result(done)
631 class(electrons_t), intent(inout) :: this
632 class(algorithmic_operation_t), intent(in) :: operation
633 character(len=:), allocatable, intent(out) :: updated_quantities(:)
634
635 logical :: update_energy_
636 type(gauge_field_t), pointer :: gfield
637 real(real64) :: time
638 integer :: iter
639
641 call profiling_in(trim(this%namespace%get())//":"//trim(operation%id))
642
643 update_energy_ = .true.
644
645 ! kick at t > 0 still missing!
647 done = .true.
648 select type (algo => this%algo)
649 class is (propagator_t)
650 time = algo%iteration%value()
651 select case (operation%id)
652 case (aetrs_first_half)
653 ! propagate half of the time step with H(time)
654 call get_fields_from_interaction(this, time)
655 call propagation_ops_elec_update_hamiltonian(this%namespace, this%space, this%st, this%gr, &
656 this%hm, this%ext_partners, time)
657 call propagation_ops_elec_exp_apply(this%td%tr%te, this%namespace, this%st, this%gr, this%hm, m_half*algo%dt)
658
659 case (aetrs_extrapolate)
660 ! Do the extrapolation of the Hamiltonian
661 ! First the extrapolation of the potential
662 call this%hm%ks_pot%interpolation_new(this%td%tr%vks_old, time+algo%dt, algo%dt)
663
664 !Get the potentials from the interpolator
665 call propagation_ops_elec_interpolate_get(this%hm, this%td%tr%vks_old)
666
667 ! Second the ions and gauge field which later on will be treated as extrapolation
668 ! of interactions, but this is not yet possible
669
670 ! move the ions to time t
671 call propagation_ops_elec_move_ions(this%td%tr%propagation_ops_elec, this%gr, this%hm, &
672 this%st, this%namespace, this%space, this%td%ions_dyn, this%ions, this%ext_partners, &
673 this%mc, time+algo%dt, algo%dt)
674
675 !Propagate gauge field
676 gfield => list_get_gauge_field(this%ext_partners)
677 if(associated(gfield)) then
678 call propagation_ops_elec_propagate_gauge_field(this%td%tr%propagation_ops_elec, gfield, &
679 algo%dt, time+algo%dt)
680 end if
681
682 !Update Hamiltonian and current
683 call get_fields_from_interaction(this, time+algo%dt)
684 call propagation_ops_elec_update_hamiltonian(this%namespace, this%space, this%st, this%gr, &
685 this%hm, this%ext_partners, time+algo%dt)
686
687 case (aetrs_second_half)
688 !Do the time propagation for the second half of the time step
689 call propagation_ops_elec_fuse_density_exp_apply(this%td%tr%te, this%namespace, this%st, &
690 this%gr, this%hm, m_half*algo%dt)
691
692 updated_quantities = ["wavefunctions"]
693
694 case (expmid_extrapolate)
695 ! the half step of this propagator screws with the gauge field kick
696 gfield => list_get_gauge_field(this%ext_partners)
697 if(associated(gfield)) then
698 assert(gauge_field_is_propagated(gfield) .eqv. .false.)
699 end if
700
701 ! Do the extrapolation of the Hamiltonian
702 ! First the extrapolation of the potential
703 call this%hm%ks_pot%interpolation_new(this%td%tr%vks_old, time+algo%dt, algo%dt)
704
705 ! get the potentials from the interpolator
706 call this%hm%ks_pot%interpolate_potentials(this%td%tr%vks_old, 3, time+algo%dt, algo%dt, time + algo%dt/m_two)
707
708 ! Second the ions which later on will be treated as extrapolation of interactions,
709 ! but this is not yet possible
710 ! move the ions to the half step
711 call propagation_ops_elec_move_ions(this%td%tr%propagation_ops_elec, this%gr, this%hm, this%st, &
712 this%namespace, this%space, this%td%ions_dyn, this%ions, this%ext_partners, &
713 this%mc, time + m_half*algo%dt, m_half*algo%dt, save_pos=.true.)
714
715 call get_fields_from_interaction(this, time + m_half*algo%dt)
716 call propagation_ops_elec_update_hamiltonian(this%namespace, this%space, this%st, this%gr, &
717 this%hm, this%ext_partners, time + m_half*algo%dt)
718
719 case (expmid_propagate)
720 ! Do the actual propagation step
721 call propagation_ops_elec_fuse_density_exp_apply(this%td%tr%te, this%namespace, this%st, &
722 this%gr, this%hm, algo%dt)
723
724 ! restore to previous time
725 call propagation_ops_elec_restore_ions(this%td%tr%propagation_ops_elec, this%td%ions_dyn, this%ions)
726
727 updated_quantities = ["wavefunctions"]
728
729 case (bomd_start)
730 call scf_init(this%scf, this%namespace, this%gr, this%ions, this%st, this%mc, this%hm, this%space)
731 ! the ions are propagated inside the propagation step already, so no need to do it at the end
732 this%ions_propagated = .true.
733
734 case (verlet_update_pos)
735 ! move the ions to time t
736 call propagation_ops_elec_propagate_ions_and_cell(this%gr, this%hm, this%st, this%namespace, this%space, &
737 this%td%ions_dyn, this%ions, this%mc, time+algo%dt, algo%dt)
738
739 case (bomd_elec_scf)
740 call hamiltonian_elec_epot_generate(this%hm, this%namespace, this%space, this%gr, this%ions, &
741 this%ext_partners, this%st, time = time+algo%dt)
742 ! now calculate the eigenfunctions
743 call scf_run(this%scf, this%namespace, this%space, this%mc, this%gr, this%ions, &
744 this%ext_partners, this%st, this%ks, this%hm, verbosity = verb_compact)
745 ! TODO: Check if this call is realy needed. - NTD
746 call hamiltonian_elec_epot_generate(this%hm, this%namespace, this%space, this%gr, this%ions, &
747 this%ext_partners, this%st, time = time+algo%dt)
748
749 ! update Hamiltonian and eigenvalues (fermi is *not* called)
750 call v_ks_calc(this%ks, this%namespace, this%space, this%hm, this%st, this%ions, this%ext_partners, &
751 calc_eigenval = .true., time = time+algo%dt, calc_energy = .true.)
752
753 ! Get the energies.
754 call energy_calc_total(this%namespace, this%space, this%hm, this%gr, this%st, this%ext_partners, iunit = -1)
755
756 updated_quantities = ["wavefunctions"]
757
758 case (verlet_compute_acc)
759 ! Do nothing, forces are computing in scf_run
760 if (this%td%ions_dyn%cell_relax()) then
761 assert(this%scf%calc_stress)
762 call this%td%ions_dyn%update_stress(this%ions%space, this%st%stress_tensors%total, &
763 this%ions%latt%rlattice, this%ions%latt%rcell_volume)
764 end if
765
766 case (verlet_compute_vel)
767 call ion_dynamics_propagate_vel(this%td%ions_dyn, this%ions)
768 ! TODO: Check if this call is realy needed. - NTD
769 call hamiltonian_elec_epot_generate(this%hm, this%namespace, this%space, this%gr, this%ions, &
770 this%ext_partners, this%st, time = time+algo%dt)
771 call this%ions%update_kinetic_energy()
772
773 case (expmid_start)
774 this%ions_propagated = .false.
775
776 case (aetrs_start)
777 ! the ions are propagated inside the propagation step already, so no need to do it at the end
778 this%ions_propagated = .true.
779
780 case (iteration_done)
782 done = .false.
783
784 case (bomd_finish)
785 call scf_end(this%scf)
786
788 case default
789 done = .false.
790 end select
791
792 class is(minimizer_algorithm_t)
793
794 ! Clocks starts at 0....
795 iter = nint(this%iteration%value()) + 1
796
797 select case(operation%id)
798 case (gs_scf_start)
799 call scf_start(this%scf, this%namespace, this%gr, this%ions, this%st, this%ks, this%hm, this%outp)
800
801 case (gs_scf_iteration)
802
803 call scf_iter(this%scf, this%namespace, this%space, this%mc, this%gr, this%ions, &
804 this%ext_partners, this%st, this%ks, this%hm, iter, outp = this%outp, &
805 restart_dump=this%scf%restart_dump)
806
807 algo%converged = scf_iter_finish(this%scf, this%namespace, this%space, this%gr, this%ions,&
808 this%st, this%ks, this%hm, iter, outp = this%outp)
809
810 updated_quantities = ["wavefunctions"]
811
812 case (gs_scf_finish)
813
814 ! Here iteration is iter-1, as the clock ticked before SCF_FINISH
815 call scf_finish(this%scf, this%namespace, this%space, this%gr, this%ions, &
816 this%ext_partners, this%st, this%ks, this%hm, iter-1, outp = this%outp)
817
818 case default
819 done = .false.
820 end select
821 class default
822 done = .false.
823 end select
824
825 call profiling_out(trim(this%namespace%get())//":"//trim(operation%id))
828
829 ! ---------------------------------------------------------
830 logical function electrons_is_tolerance_reached(this, tol) result(converged)
831 class(electrons_t), intent(in) :: this
832 real(real64), intent(in) :: tol
833
835
836 converged = .false.
837
840
841 ! ---------------------------------------------------------
842 subroutine electrons_update_quantity(this, label)
843 class(electrons_t), intent(inout) :: this
844 character(len=*), intent(in) :: label
845
846 class(quantity_t), pointer :: quantity
847
849 call profiling_in(trim(this%namespace%get())//":"//"UPDATE_QUANTITY")
850
851 quantity => this%quantities%get(label)
852 if(associated(quantity)) then
853 assert(quantity%updated_on_demand)
854 endif
855
856 select case (label)
857 case ("current")
858 call states_elec_allocate_current(this%st, this%space, this%gr)
859 call current_calculate(this%current_calculator, this%namespace, this%gr, &
860 this%hm, this%space, this%st)
861 case ("dipole")
862 call this%dipole%calculate(this%gr, this%ions, this%st)
863 case default
864 message(1) = "Incompatible quantity: "//trim(label)//"."
865 call messages_fatal(1, namespace=this%namespace)
866 end select
867
868 call profiling_out(trim(this%namespace%get())//":"//"UPDATE_QUANTITY")
870 end subroutine electrons_update_quantity
871
872 ! ---------------------------------------------------------
873 subroutine electrons_init_interaction_as_partner(partner, interaction)
874 class(electrons_t), intent(in) :: partner
875 class(interaction_surrogate_t), intent(inout) :: interaction
876
878
879 select type (interaction)
881 call interaction%init_from_partner(partner%gr, partner%space, partner%namespace)
882 class default
883 message(1) = "Unsupported interaction."
884 call messages_fatal(1, namespace=partner%namespace)
885 end select
886
889
890 ! ---------------------------------------------------------
891 subroutine electrons_copy_quantities_to_interaction(partner, interaction)
892 class(electrons_t), intent(inout) :: partner
893 class(interaction_surrogate_t), intent(inout) :: interaction
894
896 call profiling_in(trim(partner%namespace%get())//":"//"COPY_QUANTITY_INTER")
897
898 select type (interaction)
900 assert(allocated(partner%st%current))
901 interaction%partner_field(:,:) = partner%st%current(1:partner%gr%np,:,1)
902 call interaction%do_mapping()
903 class default
904 message(1) = "Unsupported interaction."
905 call messages_fatal(1, namespace=partner%namespace)
906 end select
907
908 call profiling_out(trim(partner%namespace%get())//":"//"COPY_QUANTITY_INTER")
911
912 ! ---------------------------------------------------------
913 subroutine electrons_output_start(this)
914 class(electrons_t), intent(inout) :: this
915
916 push_sub(electrons_output_start)
917
919 end subroutine electrons_output_start
920
921 ! ---------------------------------------------------------
922 subroutine electrons_output_write(this)
923 class(electrons_t), intent(inout) :: this
924
925 integer :: iter
926
927 push_sub(electrons_output_write)
928 call profiling_in(trim(this%namespace%get())//":"//"OUTPUT_WRITE")
929
930 select type (algo => this%algo)
931 class is (propagator_t)
932 iter = this%iteration%counter()
933
934 call td_write_iter(this%td%write_handler, this%namespace, this%space, this%outp, this%gr, &
935 this%st, this%hm, this%ions, this%ext_partners, this%hm%kick, this%ks, algo%dt, iter, this%mc, &
936 this%td%recalculate_gs, this%dmp%adiabatic_st)
938 if (this%outp%anything_now(iter)) then ! output
939 call td_write_output(this%namespace, this%space, this%gr, this%st, this%hm, this%ks, &
940 this%outp, this%ions, this%ext_partners, iter, algo%dt)
941 end if
942 ! This is written as an exception to avoid modifying the args of `td_write_output`
943 ! TODO(Alex) Implement IO registry class
944 if (this%wannier%options%td_method /= td_wannier_method_none) then
945 call this%wannier%write_iter(this%namespace, this%outp, iter, this%ions, this%kpoints)
946 end if
947 end select
948
949 call profiling_out(trim(this%namespace%get())//":"//"OUTPUT_WRITE")
951 end subroutine electrons_output_write
952
953 ! ---------------------------------------------------------
954 subroutine electrons_output_finish(this)
955 class(electrons_t), intent(inout) :: this
956
958
960 end subroutine electrons_output_finish
961
962 ! ---------------------------------------------------------
963 logical function electrons_process_is_slave(this) result(is_slave)
964 class(electrons_t), intent(in) :: this
965
967
968 is_slave = multicomm_is_slave(this%mc)
969
971 end function electrons_process_is_slave
972
973 ! ---------------------------------------------------------
974 subroutine electrons_exec_end_of_timestep_tasks(this, prop)
975 class(electrons_t), intent(inout) :: this
976 class(propagator_t), intent(in) :: prop
977
978 logical :: stopping
979 logical :: generate
980 logical :: update_energy_
981 integer :: nt
982 real(real64) :: time
983 type(gauge_field_t), pointer :: gfield
984
986 call profiling_in(trim(this%namespace%get())//":"//"END_OF_TIMESTEP")
987
988 stopping = .false.
989
990 nt = this%td%iter
991 ! this is the time at the end of the timestep, as required in all routines here
992 time = prop%dt*nt
993 update_energy_ = .true.
994
995 !Apply mask absorbing boundaries
996 if (this%hm%abs_boundaries%abtype == mask_absorbing) call zvmask(this%gr, this%hm, this%st)
997
998 !Photoelectron stuff
999 if (this%td%pesv%calc_spm .or. this%td%pesv%calc_mask .or. this%td%pesv%calc_flux) then
1000 call pes_calc(this%td%pesv, this%namespace, this%space, this%gr, this%st, &
1001 prop%dt, nt, this%gr%der, this%hm%kpoints, this%ext_partners, stopping)
1002 end if
1003
1004 ! For BOMD, we do not want the lines below to be executed
1005 select type(prop)
1006 type is(propagator_bomd_t)
1007 call profiling_out(trim(this%namespace%get())//":"//"END_OF_TIMESTEP")
1009 return
1010 end select
1011
1012 ! The propagation of the ions and the gauge field is currently done here.
1013 ! TODO: this code is to be moved to their own systems at some point
1014 generate = .false.
1015 if (this%td%ions_dyn%is_active()) then
1016 if (.not. this%ions_propagated) then
1017 call propagation_ops_elec_propagate_ions_and_cell(this%gr, this%hm, this%st, this%namespace, this%space, &
1018 this%td%ions_dyn, this%ions, this%mc, abs(nt*prop%dt), this%td%ions_dyn%ionic_scale*prop%dt)
1019 generate = .true.
1020 end if
1021 end if
1022
1023 gfield => list_get_gauge_field(this%ext_partners)
1024 if(associated(gfield)) then
1025 if (gauge_field_is_propagated(gfield) .and. .not. this%ions_propagated) then
1027 end if
1028 end if
1029
1030 if (generate .or. this%ions%has_time_dependent_species()) then
1031 call hamiltonian_elec_epot_generate(this%hm, this%namespace, this%space, this%gr, this%ions, &
1032 this%ext_partners, this%st, time = abs(nt*prop%dt))
1033 end if
1034
1035 call v_ks_calc(this%ks, this%namespace, this%space, this%hm, this%st, this%ions, this%ext_partners, &
1036 calc_eigenval = update_energy_, time = abs(nt*prop%dt), calc_energy = update_energy_)
1037
1038 if (update_energy_) then
1039 call energy_calc_total(this%namespace, this%space, this%hm, this%gr, this%st, this%ext_partners, iunit = -1)
1040 end if
1041
1042 ! Recalculate forces, update velocities...
1043 if (this%td%ions_dyn%ions_move() .or. this%outp%what(option__output__forces) &
1044 .or. this%td%write_handler%out(out_separate_forces)%write) then
1045 call forces_calculate(this%gr, this%namespace, this%ions, this%hm, this%ext_partners, &
1046 this%st, this%ks, t = abs(nt*prop%dt), dt = prop%dt)
1047 end if
1048
1049 if (this%td%ions_dyn%cell_relax() .or. this%outp%what(option__output__stress)) then
1050 call stress_calculate(this%namespace, this%gr, this%hm, this%st, this%ions, this%ks, this%ext_partners)
1051 end if
1052
1053 if(this%td%ions_dyn%is_active()) then
1054 call ion_dynamics_propagate_vel(this%td%ions_dyn, this%ions, atoms_moved = generate)
1055 call this%ions%update_kinetic_energy()
1056 end if
1057
1058 if(associated(gfield)) then
1059 if(gauge_field_is_propagated(gfield)) then
1060 call gauge_field_get_force(gfield, this%gr, this%st%d%spin_channels, this%st%current, this%ks%xc%lrc)
1062 end if
1063 end if
1064
1065 !We update the occupation matrices
1066 call lda_u_update_occ_matrices(this%hm%lda_u, this%namespace, this%gr, this%st, this%hm%phase, this%hm%energy)
1067
1068 ! this is needed to be compatible with the code in td_*
1069 this%td%iter = this%td%iter + 1
1070
1071 call profiling_out(trim(this%namespace%get())//":"//"END_OF_TIMESTEP")
1074
1075 ! ---------------------------------------------------------
1076 subroutine electrons_restart_write_data(this)
1077 class(electrons_t), intent(inout) :: this
1078
1079 integer :: ierr
1080
1082 call profiling_in(trim(this%namespace%get())//":"//"RESTART_WRITE")
1083
1084 select type (algo => this%algo)
1085 class is (propagator_t)
1086 call td_write_data(this%td%write_handler)
1087 call td_dump(this%td, this%namespace, this%space, this%gr, this%st, this%hm, &
1088 this%ks, this%ext_partners, this%iteration%counter(), ierr)
1089 if (ierr /= 0) then
1090 message(1) = "Unable to write time-dependent restart information."
1091 call messages_warning(1, namespace=this%namespace)
1092 end if
1093
1094 ! TODO: this is here because of legacy reasons and should be moved to the output framework
1095 call pes_output(this%td%pesv, this%namespace, this%space, this%gr, this%st, this%iteration%counter(), &
1096 this%outp, algo%dt, this%ions)
1097
1098 if (this%wannier%options%td_method /= td_wannier_method_none) then
1099 call this%wannier%restart_write_data(this%namespace, this%mc, this%gr)
1100 end if
1101 end select
1102
1103 call profiling_out(trim(this%namespace%get())//":"//"RESTART_WRITE")
1105 end subroutine electrons_restart_write_data
1106
1107 ! ---------------------------------------------------------
1108 ! this function returns true if restart data could be read
1109 logical function electrons_restart_read_data(this)
1110 class(electrons_t), intent(inout) :: this
1111
1112 logical :: from_scratch
1113
1115 call profiling_in(trim(this%namespace%get())//":"//"RESTART_READ")
1116
1117 select type (algo => this%algo)
1118 class is (propagator_t)
1119 from_scratch = .false.
1120 call td_load_restart_from_td(this%td, this%namespace, this%space, this%mc, this%gr, &
1121 this%ext_partners, this%st, this%ks, this%hm, from_scratch)
1122
1123 if (.not. from_scratch .and. this%wannier%options%td_method /= td_wannier_method_none) then
1124 call this%wannier%restart_read_data(this%namespace, this%mc, this%gr)
1125 end if
1126
1127 call td_set_from_scratch(this%td, from_scratch)
1128
1129 class is (minimizer_algorithm_t)
1130 from_scratch = .false.
1131 call electrons_gs_load_from_restart(this%namespace, this%scf, this%gr, this%mc, this%st, this%hm, &
1132 this%ks, this%space, this%ions, this%ext_partners,from_scratch)
1133
1134 ! electrons_gs_initialize still knows about fromScratch.
1135 assert(.false.)
1136 end select
1137
1138 if (from_scratch) then
1139 ! restart data could not be loaded
1141 else
1142 ! restart data could be loaded
1144 end if
1145
1146 call profiling_out(trim(this%namespace%get())//":"//"RESTART_READ")
1148 end function electrons_restart_read_data
1149
1150 !----------------------------------------------------------
1151 subroutine electrons_update_kinetic_energy(this)
1152 class(electrons_t), intent(inout) :: this
1153
1155
1156 if (states_are_real(this%st)) then
1157 this%kinetic_energy = denergy_calc_electronic(this%namespace, this%hm, this%gr%der, this%st, terms = term_kinetic)
1158 else
1159 this%kinetic_energy = zenergy_calc_electronic(this%namespace, this%hm, this%gr%der, this%st, terms = term_kinetic)
1160 end if
1161
1163
1164 end subroutine electrons_update_kinetic_energy
1165
1166 ! ---------------------------------------------------------
1167 subroutine get_fields_from_interaction(this, time)
1168 class(electrons_t), intent(inout) :: this
1169 real(real64), intent(in) :: time
1170
1172 real(real64), allocatable :: field_tmp(:, :)
1173
1175
1176 if (this%hm%mxll%coupling_mode == no_maxwell_coupling) then
1178 return
1179 end if
1180
1181 assert(this%gr%box%dim == 3)
1182
1183 safe_allocate(field_tmp(1:this%gr%np, 1:this%gr%box%dim))
1184 this%hm%mxll%e_field = m_zero
1185 this%hm%mxll%b_field = m_zero
1186 this%hm%mxll%vec_pot = m_zero
1187
1188 ! interpolate field from interaction
1189 call iter%start(this%interactions)
1190 do while (iter%has_next())
1191 select type (interaction => iter%get_next())
1192 class is (mxll_e_field_to_matter_t)
1193 call interaction%interpolate(time, field_tmp)
1194 call lalg_axpy(this%gr%np, 3, m_one, field_tmp, this%hm%mxll%e_field)
1195 class is (mxll_vec_pot_to_matter_t)
1196 call interaction%interpolate(time, field_tmp)
1197 call lalg_axpy(this%gr%np, 3, m_one, field_tmp, this%hm%mxll%vec_pot)
1198 class is (mxll_b_field_to_matter_t)
1199 call interaction%interpolate(time, field_tmp)
1200 call lalg_axpy(this%gr%np, 3, m_one, field_tmp, this%hm%mxll%b_field)
1201 end select
1202 end do
1203
1204 safe_deallocate_a(field_tmp)
1206
1207 end subroutine get_fields_from_interaction
1208
1209
1211 subroutine electrons_ground_state_run_system(sys, from_scratch)
1212 class(electrons_t), intent(inout) :: sys
1213 logical, intent(inout) :: from_scratch
1214
1216
1217 call electrons_ground_state_run(sys%namespace, sys%mc, sys%gr, sys%ions, &
1218 sys%ext_partners, sys%st, sys%ks, sys%hm, sys%outp, sys%space, from_scratch)
1219
1221
1223
1224
1225 subroutine electrons_finalize(sys)
1226 type(electrons_t), intent(inout) :: sys
1227
1228 type(partner_iterator_t) :: iter
1229 class(interaction_partner_t), pointer :: partner
1230
1231 push_sub(electrons_finalize)
1232
1233 if (associated(sys%algo)) then
1234 select type (algo => sys%algo)
1235 class is (propagator_t)
1236 call td_end_run(sys%td, sys%st, sys%hm, sys%dmp)
1237 call td_end(sys%td)
1238 class is(minimizer_algorithm_t)
1239 call electrons_gs_cleanup(sys%ks, sys%scf, sys%rdm, sys%st, sys%hm)
1240 end select
1241 end if
1242
1243 if (sys%ks%theory_level /= independent_particles) then
1244 call poisson_async_end(sys%hm%psolver, sys%mc)
1245 end if
1247 call iter%start(sys%ext_partners)
1248 do while (iter%has_next())
1249 partner => iter%get_next()
1250 safe_deallocate_p(partner)
1251 end do
1252 call sys%ext_partners%empty()
1253
1254 safe_deallocate_p(sys%xc_interaction)
1255
1256 call hamiltonian_elec_end(sys%hm)
1257
1258 nullify(sys%gfield)
1259 nullify(sys%lasers)
1260
1261 call multicomm_end(sys%mc)
1263 call sys%dipole%end()
1264
1265 call v_ks_end(sys%ks)
1266
1267 call states_elec_end(sys%st)
1268
1269 deallocate(sys%ions)
1270 safe_deallocate_p(sys%photons)
1271
1272 call kpoints_end(sys%kpoints)
1273
1274 call grid_end(sys%gr)
1275
1276 call system_end(sys)
1277
1278 pop_sub(electrons_finalize)
1279 end subroutine electrons_finalize
1280
1281
1282end module electrons_oct_m
1283
1284!! Local Variables:
1285!! mode: f90
1286!! coding: utf-8
1287!! End:
constant times a vector plus a vector
Definition: lalg_basic.F90:173
integer, parameter, public mask_absorbing
This module defines the abstract interfact for algorithm factories.
This module implements the basic elements defining algorithms.
Definition: algorithm.F90:143
character(len=algo_label_len), parameter, public iteration_done
Definition: algorithm.F90:174
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.
Definition: current.F90:372
subroutine, public current_init(this, namespace)
Definition: current.F90:180
This module implements a calculator for the density and defines related functions.
Definition: density.F90:122
This modules implements the dipole moment of the matter system.
Definition: dipole.F90:110
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)
Definition: electrons.F90:680
logical function electrons_restart_read_data(this)
Definition: electrons.F90:1205
logical function electrons_process_is_slave(this)
Definition: electrons.F90:1059
subroutine electrons_init_interaction(this, interaction)
Definition: electrons.F90:402
subroutine electrons_finalize(sys)
Definition: electrons.F90:1321
subroutine electrons_exec_end_of_timestep_tasks(this, prop)
Definition: electrons.F90:1070
logical function electrons_do_algorithmic_operation(this, operation, updated_quantities)
Definition: electrons.F90:726
subroutine electrons_new_algorithm(this, factory)
Definition: electrons.F90:647
subroutine electrons_output_write(this)
Definition: electrons.F90:1018
subroutine get_fields_from_interaction(this, time)
Definition: electrons.F90:1263
subroutine electrons_algorithm_start(this)
Definition: electrons.F90:706
subroutine electrons_output_finish(this)
Definition: electrons.F90:1050
subroutine electrons_output_start(this)
Definition: electrons.F90:1009
subroutine electrons_init_parallelization(this)
Definition: electrons.F90:466
subroutine electrons_init_interaction_as_partner(partner, interaction)
Definition: electrons.F90:969
subroutine electrons_ground_state_run_system(sys, from_scratch)
Run a ground state calculation for a system of electrons.
Definition: electrons.F90:1307
subroutine electrons_update_kinetic_energy(this)
Definition: electrons.F90:1247
logical function electrons_is_tolerance_reached(this, tol)
Definition: electrons.F90:926
class(electrons_t) function, pointer electrons_constructor(namespace, grp, calc_mode_id)
@ brief Instantiate an instance of an electrons system
Definition: electrons.F90:295
subroutine electrons_copy_quantities_to_interaction(partner, interaction)
Definition: electrons.F90:987
subroutine electrons_restart_write_data(this)
Definition: electrons.F90:1172
subroutine electrons_update_quantity(this, label)
Definition: electrons.F90:938
subroutine, public elf_init(namespace)
Definition: elf.F90:146
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)
Definition: forces.F90:340
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
Definition: global.F90:202
real(real64), parameter, public m_zero
Definition: global.F90:200
integer, parameter, public independent_particles
Theory level.
Definition: global.F90:250
integer, parameter, public generalized_kohn_sham_dft
Definition: global.F90:250
integer, parameter, public kohn_sham_dft
Definition: global.F90:250
real(real64), parameter, public m_half
Definition: global.F90:206
real(real64), parameter, public m_one
Definition: global.F90:201
This module implements the underlying real-space grid.
Definition: grid.F90:119
subroutine, public grid_init_stage_1(gr, namespace, space, grp, symm, latt, n_sites, site_position)
First stage of the grid initialization.
Definition: grid.F90:197
subroutine, public grid_init_stage_2(gr, namespace, space, mc, qvector)
Second stage of the grid initialization.
Definition: grid.F90:463
subroutine, public grid_end(gr)
finalize a grid object
Definition: grid.F90:490
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)
Definition: kpoints.F90:1059
subroutine, public kpoints_init(this, namespace, symm, dim, periodic_dim, latt)
Definition: kpoints.F90:416
subroutine, public kpoints_to_absolute(latt, kin, kout)
Definition: kpoints.F90:1137
A module to handle KS potential, without the external potential.
subroutine, public lasers_check_symmetries(this, kpoints)
Definition: lasers.F90:558
subroutine, public lasers_parse_external_fields(this)
Definition: lasers.F90:247
subroutine, public lasers_generate_potentials(this, mesh, space, latt)
Definition: lasers.F90:446
subroutine, public lda_u_update_occ_matrices(this, namespace, mesh, st, phase, energy)
Definition: lda_u.F90:895
System information (time, memory, sysname)
Definition: loct.F90:117
This module defines the meshes, which are used in Octopus.
Definition: mesh.F90:120
subroutine, public mesh_check_symmetries(mesh, symm, periodic_dim)
Definition: mesh.F90:835
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.
Definition: mesh.F90:386
real(real64) pure function, public mesh_global_memory(mesh)
Definition: mesh.F90:791
real(real64) pure function, public mesh_local_memory(mesh)
Definition: mesh.F90:802
subroutine, public messages_print_with_emphasis(msg, iunit, namespace)
Definition: messages.F90:898
character(len=512), private msg
Definition: messages.F90:167
subroutine, public messages_warning(no_lines, all_nodes, namespace)
Definition: messages.F90:525
subroutine, public messages_obsolete_variable(namespace, name, rep)
Definition: messages.F90:1000
subroutine, public messages_new_line()
Definition: messages.F90:1089
character(len=256), dimension(max_lines), public message
to be output by fatal, warning
Definition: messages.F90:162
subroutine, public messages_fatal(no_lines, only_root_writes, namespace)
Definition: messages.F90:410
subroutine, public messages_experimental(name, namespace)
Definition: messages.F90:1040
subroutine, public messages_info(no_lines, iunit, debug_only, stress, all_nodes, namespace)
Definition: messages.F90:594
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.
Definition: multicomm.F90:147
subroutine, public multicomm_end(mc)
Definition: multicomm.F90:706
logical pure function, public multicomm_is_slave(this)
Definition: multicomm.F90:846
subroutine, public multicomm_init(mc, namespace, base_grp, mode_para, n_node, index_range, min_range)
create index and domain communicators
Definition: multicomm.F90:273
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
Definition: output_low.F90:117
this module contains the output system
Definition: output.F90:117
logical function, public output_need_exchange(outp)
Definition: output.F90:855
subroutine, public output_init(outp, namespace, space, st, gr, nst, ks)
Definition: output.F90:206
logical function, public parse_is_defined(namespace, name)
Definition: parser.F90:463
integer function, public parse_block(namespace, name, blk, check_varinfo_)
Definition: parser.F90:623
subroutine, public pes_calc(pes, namespace, space, mesh, st, dt, iter, der, kpoints, ext_partners, stopping)
Definition: pes.F90:271
subroutine, public pes_output(pes, namespace, space, gr, st, iter, outp, dt, ions)
Definition: pes.F90:297
subroutine, public poisson_async_init(this, mc)
Definition: poisson.F90:1159
subroutine, public poisson_slave_work(this, namespace)
Definition: poisson.F90:1187
subroutine, public poisson_async_end(this, mc)
Definition: poisson.F90:1171
subroutine, public profiling_out(label)
Increment out counter and sum up difference between entry and exit time.
Definition: profiling.F90:631
subroutine, public profiling_in(label, exclude)
Increment in counter and save entry time.
Definition: profiling.F90:554
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_interpolate_get(hm, vks_old)
subroutine, public propagation_ops_elec_fuse_density_exp_apply(te, namespace, st, gr, hm, dt, dt2, op)
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.
Definition: propagator.F90:119
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...
Definition: quantity.F90:140
Implementation details for regridding.
Definition: regridding.F90:172
subroutine, public scf_finish(scf, namespace, space, gr, ions, ext_partners, st, ks, hm, iter, outp)
Definition: scf.F90:1300
subroutine, public scf_start(scf, namespace, gr, ions, st, ks, hm, outp, verbosity)
Preparation of the SCF cycle.
Definition: scf.F90:693
integer, parameter, public verb_compact
Definition: scf.F90:206
subroutine, public scf_init(scf, namespace, gr, ions, st, mc, hm, space)
Definition: scf.F90:259
subroutine, public scf_end(scf)
Definition: scf.F90:557
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.
Definition: scf.F90:838
subroutine, public scf_iter(scf, namespace, space, mc, gr, ions, ext_partners, st, ks, hm, iter, outp, restart_dump)
Definition: scf.F90:884
logical function, public scf_iter_finish(scf, namespace, space, gr, ions, st, ks, hm, iter, outp, iters_done)
Definition: scf.F90:1221
This module is intended to contain "only mathematical" functions and procedures.
Definition: sort.F90:119
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.
Definition: stress.F90:120
subroutine, public stress_calculate(namespace, gr, hm, st, ions, ks, ext_partners)
This computes the total stress on the lattice.
Definition: stress.F90:188
subroutine, public symmetries_use_compatible_nonsymmorphic(this, ll, namespace)
Detect if some non-symmorphic operations are compatible with the real-space grid If yes,...
Definition: symmetries.F90:811
This module implements the abstract system type.
Definition: system.F90:120
subroutine, public system_algorithm_start(this)
Definition: system.F90:1023
subroutine, public system_end(this)
Definition: system.F90:1152
subroutine, public system_new_algorithm(this, factory)
Definition: system.F90:948
Definition: td.F90:116
subroutine, public td_init_with_wavefunctions(td, namespace, space, mc, gr, ions, ext_partners, st, ks, hm, outp, dmp, from_scratch)
Definition: td.F90:928
subroutine, public td_end(td)
Definition: td.F90:649
subroutine, public td_load_restart_from_gs(td, namespace, space, mc, gr, ext_partners, st, ks, hm)
Definition: td.F90:1249
subroutine, public td_allocate_wavefunctions(td, namespace, mc, gr, ions, st, hm, space)
Definition: td.F90:584
subroutine, public td_init(td, namespace, space, gr, ions, st, ks, hm, ext_partners, outp, dmp)
Definition: td.F90:239
logical function, public td_get_from_scratch(td)
Definition: td.F90:1578
subroutine, public td_set_from_scratch(td, from_scratch)
Definition: td.F90:1589
subroutine, public td_dump(td, namespace, space, gr, st, hm, ks, ext_partners, iter, ierr)
Definition: td.F90:1382
subroutine, public td_init_gaugefield(td, namespace, gr, st, ks, hm, ext_partners, space)
Definition: td.F90:618
subroutine, public td_load_restart_from_td(td, namespace, space, mc, gr, ext_partners, st, ks, hm, from_scratch)
Definition: td.F90:1213
subroutine, public td_end_run(td, st, hm, dmp)
Definition: td.F90:664
subroutine, public td_write_output(namespace, space, gr, st, hm, ks, outp, ions, ext_partners, iter, dt)
Definition: td_write.F90:1286
subroutine, public td_write_iter(writ, namespace, space, outp, gr, st, hm, ions, ext_partners, kick, ks, dt, iter, mc, recalculate_gs, dmp_st)
Definition: td_write.F90:1069
subroutine, public td_write_data(writ)
Definition: td_write.F90:1252
integer, parameter, public out_separate_forces
Definition: td_write.F90:204
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)
Definition: v_ks.F90:588
subroutine, public v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, calc_eigenval, time, calc_energy, calc_current, force_semilocal)
Definition: v_ks.F90:708
subroutine, public v_ks_init(ks, namespace, gr, st, ions, mc, space, kpoints)
Definition: v_ks.F90:250
Wannier module.
Definition: wannier.F90:108
Wannier options module.
integer, parameter, public td_wannier_method_none
Definition: xc.F90:120
integer, parameter, public oep_level_none
the OEP levels
Definition: xc_oep.F90:174
Abstract class for the algorithm factories.
Descriptor of one algorithmic operation.
Definition: algorithm.F90:165
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.
Definition: electrons.F90:222
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
surrogate interaction class to avoid circular dependencies between modules.
Abstract class implementing minimizers.
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.
Definition: propagator.F90:144
Systems (system_t) can expose quantities that can be used to calculate interactions with other system...
Definition: quantity.F90:173
Abstract class for systems.
Definition: system.F90:175
Main object containing all Wannier-related data and methods.
Definition: wannier.F90:150
int true(void)