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