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