Octopus
states_elec.F90
Go to the documentation of this file.
1!! Copyright (C) 2002-2006 M. Marques, A. Castro, A. Rubio, G. Bertsch
2!!
3!! This program is free software; you can redistribute it and/or modify
4!! it under the terms of the GNU General Public License as published by
5!! the Free Software Foundation; either version 2, or (at your option)
6!! any later version.
7!!
8!! This program is distributed in the hope that it will be useful,
9!! but WITHOUT ANY WARRANTY; without even the implied warranty of
10!! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11!! GNU General Public License for more details.
12!!
13!! You should have received a copy of the GNU General Public License
14!! along with this program; if not, write to the Free Software
15!! Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
16!! 02110-1301, USA.
17!!
18#include "global.h"
19
21 use accel_oct_m
22 use batch_oct_m
26 use batch_oct_m
29 use comm_oct_m
30 use debug_oct_m
34 use global_oct_m
35 use grid_oct_m
36 use io_oct_m
37 use, intrinsic :: iso_fortran_env
40 use loct_oct_m
41 use math_oct_m
42 use mesh_oct_m
47 use mpi_oct_m
50#ifdef HAVE_OPENMP
51 use omp_lib
52#endif
53 use parser_oct_m
57 use smear_oct_m
58 use space_oct_m
62 use types_oct_m
63 use unit_oct_m
67
68 implicit none
69
70 private
71
72 public :: &
103 stress_t, &
105
106
107 ! this type must be moved to stress module but due to circular dependency it is not possible now
108 type stress_t
109 real(real64) :: total(3,3) = m_zero
110 real(real64) :: kinetic(3,3) = m_zero
111 real(real64) :: Hartree(3,3) = m_zero
112 real(real64) :: xc(3,3) = m_zero
113 real(real64) :: ps_local(3,3) = m_zero
114 real(real64) :: ps_nl(3,3) = m_zero
115 real(real64) :: ion_ion(3,3) = m_zero
116 real(real64) :: vdw(3,3) = m_zero
117 real(real64) :: hubbard(3,3) = m_zero
118
119 real(real64) :: kinetic_sumrule
120 real(real64) :: hartree_sumrule
121 end type stress_t
122
123 ! TODO(Alex) Issue #672 Decouple k-point info from `states_elec_dim_t`
124
132 !
133 type, extends(states_abst_t) :: states_elec_t
134 ! Components are public by default
135 type(states_elec_dim_t) :: d
136 integer :: nst_conv
137
138 logical :: only_userdef_istates
139
140 type(states_elec_group_t) :: group
141 integer :: block_size
145 logical :: pack_states
149
150
151 character(len=1024), allocatable :: user_def_states(:,:,:)
154
155 ! TODO(Alex) Issue #821. Collate current quantities into an object.
156 ! the densities and currents (after all we are doing DFT :)
157 real(real64), allocatable :: rho(:,:)
158 real(real64), allocatable :: rho_core(:)
159
160 real(real64), allocatable :: current(:, :, :)
161 real(real64), allocatable :: current_para(:, :, :)
162 real(real64), allocatable :: current_dia(:, :, :)
163 real(real64), allocatable :: current_mag(:, :, :)
164 real(real64), allocatable :: current_kpt(:,:,:)
165
166 ! TODO(Alex) Issue #673. Create frozen density class and replace in states_elec_t
167 ! It may be required to "freeze" the deepest orbitals during the evolution; the density
168 ! of these orbitals is kept in frozen_rho. It is different from rho_core.
169 real(real64), allocatable :: frozen_rho(:, :)
170 real(real64), allocatable :: frozen_tau(:, :)
171 real(real64), allocatable :: frozen_gdens(:,:,:)
172 real(real64), allocatable :: frozen_ldens(:,:)
173
174 logical :: uniform_occ
175
176 real(real64), allocatable :: eigenval(:,:)
177 logical :: fixed_occ
178 logical :: restart_fixed_occ
179 logical :: restart_reorder_occs
180 real(real64), allocatable :: occ(:,:)
181 real(real64), allocatable :: kweights(:)
182 integer :: nik
183
184 logical, private :: fixed_spins
186 real(real64), allocatable :: spin(:, :, :)
187
188 real(real64) :: qtot
189 real(real64) :: val_charge
190
191 type(stress_t) :: stress_tensors
192
193 logical :: fromScratch
194 type(smear_t) :: smear
195
196 ! TODO(Alex) Issue #823 Move modelmbparticles out of states_elec_t
197 type(modelmb_particle_t) :: modelmbparticles
198 integer, allocatable :: mmb_nspindown(:,:)
199 integer, allocatable :: mmb_iyoung(:,:)
200 real(real64), allocatable :: mmb_proj(:)
202 logical :: parallel_in_states = .false.
204 ! TODO(Alex) Issue #824. Package the communicators in a single instance prior to removing
205 ! or consider creating a distributed_t instance for each (as distributed_t contains the an instance of mpi_grp_t)
206 type(mpi_grp_t) :: mpi_grp
207 type(mpi_grp_t) :: dom_st_mpi_grp
208 type(mpi_grp_t) :: st_kpt_mpi_grp
209 type(mpi_grp_t) :: dom_st_kpt_mpi_grp
210 type(blacs_proc_grid_t) :: dom_st_proc_grid
211
212 type(distributed_t) :: dist
213 logical :: scalapack_compatible
214
215 ! TODO(Alex) Issue #820. Remove lnst, st_start, st_end and node, as they are all contained within dist
216 integer :: lnst
217 integer :: st_start, st_end
218 integer, allocatable :: node(:)
219
220 ! TODO(Alex) Issue #824. Either change from data to a method, or package with `st_kpt_mpi_grp`
221 integer, allocatable :: st_kpt_task(:,:)
222
223 type(multicomm_all_pairs_t), private :: ap
224 logical :: symmetrize_density
225 integer :: randomization
226 integer :: orth_method = 0
227
228 real(real64) :: cl_states_mem
230 contains
231 procedure :: nullify => states_elec_null
232 procedure :: write_info => states_elec_write_info
233 procedure :: pack => states_elec_pack
234 procedure :: unpack => states_elec_unpack
235 procedure :: set_zero => states_elec_set_zero
236 procedure :: dipole => states_elec_calculate_dipole
237 end type states_elec_t
240 integer, public, parameter :: &
241 par_independent = 1, &
242 par_dependent = 2
243
245 interface states_elec_get_state
248 end interface states_elec_get_state
249
258
261 end interface
263contains
265 ! TODO(Alex): Issue #826. Rename to something like "states_elec_default_wfs_type", or remove
266 subroutine states_elec_null(st)
267 class(states_elec_t), intent(inout) :: st
268
271 st%wfs_type = type_float ! By default, calculations use real wavefunctions
273 st%packed = .false.
276 end subroutine states_elec_null
278
280 subroutine states_elec_init(st, namespace, space, valence_charge, kpoints)
281 type(states_elec_t), target, intent(inout) :: st
282 type(namespace_t), intent(in) :: namespace
283 type(electron_space_t), intent(in) :: space
284 real(real64), intent(in) :: valence_charge
285 type(kpoints_t), intent(in) :: kpoints
287 real(real64) :: excess_charge, nempty_percent
288 integer :: nempty, ntot, default
289 integer :: nempty_conv
290 logical :: force
291 real(real64), parameter :: tol = 1e-13_real64
293 push_sub_with_profile(states_elec_init)
294
295 st%fromScratch = .true. ! this will be reset if restart_read is called
296 call states_elec_null(st)
297
298 ! We get the spin dimension from the electronic space
299 ! TODO: Remove spin space information from states_elec_dim
300 st%d%ispin = space%ispin
302 ! Use of spinors requires complex wavefunctions.
303 if (st%d%ispin == spinors) call states_set_complex(st)
304
305 if (st%d%ispin /= unpolarized .and. kpoints%use_time_reversal) then
306 message(1) = "Time reversal symmetry is only implemented for unpolarized spins."
307 message(2) = "Use KPointsUseTimeReversal = no."
308 call messages_fatal(2, namespace=namespace)
309 end if
312 !%Variable ExcessCharge
313 !%Type float
314 !%Default 0.0
315 !%Section States
316 !%Description
317 !% The net charge of the system. A negative value means that we are adding
318 !% electrons, while a positive value means we are taking electrons
319 !% from the system.
320 !%End
321 call parse_variable(namespace, 'ExcessCharge', m_zero, excess_charge)
322
323 !%Variable TotalStates
324 !%Type integer
325 !%Default 0
326 !%Section States
327 !%Description
328 !% This variable sets the total number of states that Octopus will
329 !% use. This is normally not necessary since by default Octopus
330 !% sets the number of states to the minimum necessary to hold the
331 !% electrons present in the system. (This default behavior is
332 !% obtained by setting <tt>TotalStates</tt> to 0).
333 !%
334 !% If you want to add some unoccupied states, probably it is more convenient to use the variable
335 !% <tt>ExtraStates</tt>.
336 !%End
337 call parse_variable(namespace, 'TotalStates', 0, ntot)
338 if (ntot < 0) then
339 write(message(1), '(a,i5,a)') "Input: '", ntot, "' is not a valid value for TotalStates."
340 call messages_fatal(1, namespace=namespace)
341 end if
342
343 !%Variable ExtraStates
344 !%Type integer
345 !%Default 0
346 !%Section States
347 !%Description
348 !% The number of states is in principle calculated considering the minimum
349 !% numbers of states necessary to hold the electrons present in the system.
350 !% The number of electrons is
351 !% in turn calculated considering the nature of the species supplied in the
352 !% <tt>Species</tt> block, and the value of the <tt>ExcessCharge</tt> variable.
353 !% However, one may command <tt>Octopus</tt> to use more states, which is necessary if one wants to
354 !% use fractional occupational numbers, either fixed from the beginning through
355 !% the <tt>Occupations</tt> block or by prescribing
356 !% an electronic temperature with <tt>Smearing</tt>, or in order to calculate
357 !% excited states (including with <tt>CalculationMode = unocc</tt>).
358 !%End
359 call parse_variable(namespace, 'ExtraStates', 0, nempty)
360 if (nempty < 0) then
361 write(message(1), '(a,i5,a)') "Input: '", nempty, "' is not a valid value for ExtraStates."
362 message(2) = '(0 <= ExtraStates)'
363 call messages_fatal(2, namespace=namespace)
364 end if
365
366 if (ntot > 0 .and. nempty > 0) then
367 message(1) = 'You cannot set TotalStates and ExtraStates at the same time.'
368 call messages_fatal(1, namespace=namespace)
369 end if
370
371 !%Variable ExtraStatesInPercent
372 !%Type float
373 !%Default 0
374 !%Section States
375 !%Description
376 !% This variable allows to set the number of extra/empty states as percentage of the
377 !% used occupied states. For example, a value 35 for ExtraStatesInPercent would amount
378 !% to ceiling(35/100 * nstates) extra states, where nstates denotes the amount of occupied
379 !% states Octopus is using for the system at hand.
380 !%End
381 call parse_variable(namespace, 'ExtraStatesInPercent', m_zero, nempty_percent)
382 if (nempty_percent < 0) then
383 write(message(1), '(a,f8.6,a)') "Input: '", nempty_percent, &
384 "' should be a percentage value x (where x is parts in hundred) larger or equal 0"
385 call messages_fatal(1, namespace=namespace)
386 end if
387
388 if (nempty > 0 .and. nempty_percent > 0) then
389 message(1) = 'You cannot set ExtraStates and ExtraStatesInPercent at the same time.'
390 call messages_fatal(1, namespace=namespace)
391 end if
392
393 !%Variable ExtraStatesToConverge
394 !%Type integer
395 !%Default 0
396 !%Section States
397 !%Description
398 !% Only for unocc calculations.
399 !% Specifies the number of extra states that will be considered for reaching the convergence.
400 !% Together with <tt>ExtraStates</tt>, one can have some more states which will not be
401 !% considered for the convergence criteria, thus making the convergence of the
402 !% unocc calculation faster.
403 !% By default, all extra states need to be converged.
404 !%End
405 call parse_variable(namespace, 'ExtraStatesToConverge', nempty, nempty_conv)
406 if (nempty < 0) then
407 write(message(1), '(a,i5,a)') "Input: '", nempty_conv, "' is not a valid value for ExtraStatesToConverge."
408 message(2) = '(0 <= ExtraStatesToConverge)'
409 call messages_fatal(2, namespace=namespace)
410 end if
411
412 if (nempty_conv > nempty) then
413 message(1) = 'You cannot set ExtraStatesToConverge to a higher value than ExtraStates.'
414 call messages_fatal(1, namespace=namespace)
415 end if
416
417 ! For non-periodic systems this should just return the Gamma point
418 call states_elec_choose_kpoints(st, kpoints, namespace)
419
420 st%val_charge = valence_charge
421
422 st%qtot = -(st%val_charge + excess_charge)
423
424 if (st%qtot < -m_epsilon) then
425 write(message(1),'(a,f12.6,a)') 'Total charge = ', st%qtot, ' < 0'
426 message(2) = 'Check Species and ExcessCharge.'
427 call messages_fatal(2, only_root_writes = .true., namespace=namespace)
428 end if
429
430 select case (st%d%ispin)
431 case (unpolarized)
432 st%d%dim = 1
433 st%nst = nint(st%qtot/2)
434 if (st%nst*2 - st%qtot < -tol) st%nst = st%nst + 1
435 st%d%nspin = 1
436 st%d%spin_channels = 1
437 case (spin_polarized)
438 st%d%dim = 1
439 st%nst = nint(st%qtot/2)
440 print *, st%nst, st%nst*2 - st%qtot
441 if (st%nst*2 - st%qtot < -tol) st%nst = st%nst + 1
442 st%d%nspin = 2
443 st%d%spin_channels = 2
444 case (spinors)
445 st%d%dim = 2
446 st%nst = nint(st%qtot)
447 if (st%nst - st%qtot < -tol) st%nst = st%nst + 1
448 st%d%nspin = 4
449 st%d%spin_channels = 2
450 end select
451
452 if (ntot > 0) then
453 if (ntot < st%nst) then
454 message(1) = 'TotalStates is smaller than the number of states required by the system.'
455 call messages_fatal(1, namespace=namespace)
456 end if
457
458 st%nst = ntot
459 end if
460
461 if (nempty_percent > 0) then
462 nempty = ceiling(nempty_percent * st%nst / 100)
463 end if
464
465 st%nst_conv = st%nst + nempty_conv
466 st%nst = st%nst + nempty
467 if (st%nst == 0) then
468 message(1) = "Cannot run with number of states = zero."
469 call messages_fatal(1, namespace=namespace)
470 end if
471
472 !%Variable StatesBlockSize
473 !%Type integer
474 !%Section Execution::Optimization
475 !%Description
476 !% Some routines work over blocks of eigenfunctions, which
477 !% generally improves performance at the expense of increased
478 !% memory consumption. This variable selects the size of the
479 !% blocks to be used. If GPUs are used, the default is the
480 !% warp size (32 for NVIDIA, 32 or 64 for AMD);
481 !% otherwise it is 4.
482 !%End
483
484 if (accel_is_enabled()) then
485 ! Some AMD GPUs have a warp size of 64. When OpenCL is used
486 ! accel%warp_size = 1 which is why we use max(accel%warp_size, 32)
487 ! here so that StatesBlockSize is at least 32.
488 default = max(accel%warp_size, 32)
489 else
490 default = 4
491 end if
492
493 if (default > pad_pow2(st%nst)) default = pad_pow2(st%nst)
494
495 assert(default > 0)
496
497 call parse_variable(namespace, 'StatesBlockSize', default, st%block_size)
498 if (st%block_size < 1) then
499 call messages_write("The variable 'StatesBlockSize' must be greater than 0.")
500 call messages_fatal(namespace=namespace)
501 end if
502
503 st%block_size = min(st%block_size, st%nst)
504 conf%target_states_block_size = st%block_size
505
506 safe_allocate(st%eigenval(1:st%nst, 1:st%nik))
507 st%eigenval = huge(st%eigenval)
508
509 ! Periodic systems require complex wavefunctions
510 ! but not if it is Gamma-point only
511 if (.not. kpoints%gamma_only()) then
512 call states_set_complex(st)
513 end if
514
515 !%Variable OnlyUserDefinedInitialStates
516 !%Type logical
517 !%Default no
518 !%Section States
519 !%Description
520 !% If true, then only user-defined states from the block <tt>UserDefinedStates</tt>
521 !% will be used as initial states for a time-propagation. No attempt is made
522 !% to load ground-state orbitals from a previous ground-state run.
523 !%End
524 call parse_variable(namespace, 'OnlyUserDefinedInitialStates', .false., st%only_userdef_istates)
525
526 ! we now allocate some arrays
527 safe_allocate(st%occ (1:st%nst, 1:st%nik))
528 st%occ = m_zero
529 ! allocate space for formula strings that define user-defined states
530 if (parse_is_defined(namespace, 'UserDefinedStates') .or. parse_is_defined(namespace, 'OCTInitialUserdefined') &
531 .or. parse_is_defined(namespace, 'OCTTargetUserdefined')) then
532 safe_allocate(st%user_def_states(1:st%d%dim, 1:st%nst, 1:st%nik))
533 ! initially we mark all 'formulas' as undefined
534 st%user_def_states(1:st%d%dim, 1:st%nst, 1:st%nik) = 'undefined'
535 end if
536
537 if (st%d%ispin == spinors) then
538 safe_allocate(st%spin(1:3, 1:st%nst, 1:st%nik))
539 end if
540
541 !%Variable StatesRandomization
542 !%Type integer
543 !%Default par_independent
544 !%Section States
545 !%Description
546 !% The randomization of states can be done in two ways:
547 !% i) a parallelisation independent way (default), where the random states are identical,
548 !% irrespectively of the number of tasks and
549 !% ii) a parallelisation dependent way, which can prevent linear dependency
550 !% to occur for large systems.
551 !%Option par_independent 1
552 !% Parallelisation-independent randomization of states.
553 !%Option par_dependent 2
554 !% The randomization depends on the number of taks used in the calculation.
555 !%End
556 call parse_variable(namespace, 'StatesRandomization', par_independent, st%randomization)
557
558
559 call states_elec_read_initial_occs(st, namespace, excess_charge, kpoints)
560 call states_elec_read_initial_spins(st, namespace)
561
562 ! This test can only be done here, as smear_init is called inside states_elec_read_initial_occs, and
563 ! only there smear%photodop is set.
564
565 if (st%smear%photodop) then
566 if (nempty == 0) then
567 write(message(1), '(a,i5,a)') "PhotoDoping requires to specify ExtraStates."
568 message(2) = '(0 == ExtraStates)'
569 call messages_fatal(2, namespace=namespace)
570 end if
571 end if
572
573 st%st_start = 1
574 st%st_end = st%nst
575 st%lnst = st%nst
576 safe_allocate(st%node(1:st%nst))
577 st%node(1:st%nst) = 0
578
579 call mpi_grp_init(st%mpi_grp, mpi_comm_undefined)
580 st%parallel_in_states = .false.
581
582 call distributed_nullify(st%d%kpt, st%nik)
583
584 call modelmb_particles_init(st%modelmbparticles, namespace, space)
585 if (st%modelmbparticles%nparticle > 0) then
586 ! FIXME: check why this is not initialized properly in the test, or why it is written out when not initialized
587 safe_allocate(st%mmb_nspindown(1:st%modelmbparticles%ntype_of_particle, 1:st%nst))
588 st%mmb_nspindown(:,:) = -1
589 safe_allocate(st%mmb_iyoung(1:st%modelmbparticles%ntype_of_particle, 1:st%nst))
590 st%mmb_iyoung(:,:) = -1
591 safe_allocate(st%mmb_proj(1:st%nst))
592 st%mmb_proj(:) = m_zero
593 end if
594
595 !%Variable SymmetrizeDensity
596 !%Type logical
597 !%Default no
598 !%Section States
599 !%Description
600 !% When enabled the density is symmetrized. Currently, this can
601 !% only be done for periodic systems. (Experimental.)
602 !%End
603 call parse_variable(namespace, 'SymmetrizeDensity', kpoints%use_symmetries, st%symmetrize_density)
604 call messages_print_var_value('SymmetrizeDensity', st%symmetrize_density, namespace=namespace)
605
606 !%Variable ForceComplex
607 !%Type logical
608 !%Default no
609 !%Section Execution::Debug
610 !%Description
611 !% Normally <tt>Octopus</tt> determines automatically the type necessary
612 !% for the wavefunctions. When set to yes this variable will
613 !% force the use of complex wavefunctions.
614 !%
615 !% Warning: This variable is designed for testing and
616 !% benchmarking and normal users need not use it.
617 !%End
618 call parse_variable(namespace, 'ForceComplex', .false., force)
619
620 if (force) call states_set_complex(st)
621
622 st%packed = .false.
623
624 pop_sub_with_profile(states_elec_init)
625 end subroutine states_elec_init
626
627 ! ---------------------------------------------------------
630 !
631 subroutine states_elec_look(restart, nik, dim, nst, ierr)
632 type(restart_t), intent(in) :: restart
633 integer, intent(out) :: nik
634 integer, intent(out) :: dim
635 integer, intent(out) :: nst
636 integer, intent(out) :: ierr
637
638 character(len=256) :: lines(3)
639 character(len=20) :: char
640 integer :: iunit
641
642 push_sub(states_elec_look)
643
644 ierr = 0
645
646 iunit = restart_open(restart, 'states')
647 call restart_read(restart, iunit, lines, 3, ierr)
648 if (ierr == 0) then
649 read(lines(1), *) char, nst
650 read(lines(2), *) char, dim
651 read(lines(3), *) char, nik
652 end if
653 call restart_close(restart, iunit)
654
655 pop_sub(states_elec_look)
656 end subroutine states_elec_look
657
658 ! ---------------------------------------------------------
667 !
668 subroutine states_elec_read_initial_occs(st, namespace, excess_charge, kpoints)
669 type(states_elec_t), intent(inout) :: st
670 type(namespace_t), intent(in) :: namespace
671 real(real64), intent(in) :: excess_charge
672 type(kpoints_t), intent(in) :: kpoints
673
674 integer :: ik, ist, ispin, nspin, ncols, nrows, el_per_state, icol, start_pos, spin_n
675 type(block_t) :: blk
676 real(real64) :: rr, charge
677 logical :: integral_occs, unoccupied_states
678 real(real64), allocatable :: read_occs(:, :)
679 real(real64) :: charge_in_block
680
682
683 !%Variable RestartFixedOccupations
684 !%Type logical
685 !%Default yes
686 !%Section States
687 !%Description
688 !% Setting this variable will make the restart proceed as
689 !% if the occupations from the previous calculation had been set via the <tt>Occupations</tt> block,
690 !% <i>i.e.</i> fixed. Otherwise, occupations will be determined by smearing.
691 !%End
692 call parse_variable(namespace, 'RestartFixedOccupations', .true., st%restart_fixed_occ)
693 ! we will turn on st%fixed_occ if restart_read is ever called
694
695 !%Variable Occupations
696 !%Type block
697 !%Section States
698 !%Description
699 !% The occupation numbers of the orbitals can be fixed through the use of this
700 !% variable. For example:
701 !%
702 !% <tt>%Occupations
703 !% <br>&nbsp;&nbsp;2 | 2 | 2 | 2 | 2
704 !% <br>%</tt>
705 !%
706 !% would fix the occupations of the five states to 2. There can be
707 !% at most as many columns as states in the calculation. If there are fewer columns
708 !% than states, then the code will assume that the user is indicating the occupations
709 !% of the uppermost states where all lower states have full occupation (i.e. 2 for spin-unpolarized
710 !% calculations, 1 otherwise) and all higher states have zero occupation. The first column
711 !% will be taken to refer to the lowest state such that the occupations would be consistent
712 !% with the correct total charge. For example, if there are 8 electrons and 10 states (from
713 !% <tt>ExtraStates = 6</tt>), then an abbreviated specification
714 !%
715 !% <tt>%Occupations
716 !% <br>&nbsp;&nbsp;1 | 0 | 1
717 !% <br>%</tt>
718 !%
719 !% would be equivalent to a full specification
720 !%
721 !% <tt>%Occupations
722 !% <br>&nbsp;&nbsp;2 | 2 | 2 | 1 | 0 | 1 | 0 | 0 | 0 | 0
723 !% <br>%</tt>
724 !%
725 !% This is an example of use for constrained density-functional theory,
726 !% crudely emulating a HOMO->LUMO+1 optical excitation.
727 !% The number of rows should be equal
728 !% to the number of k-points times the number of spins. For example, for a finite system
729 !% with <tt>SpinComponents == spin_polarized</tt>,
730 !% this block should contain two lines, one for each spin channel.
731 !% All rows must have the same number of columns.
732 !%
733 !% The <tt>Occupations</tt> block is useful for the ground state of highly symmetric
734 !% small systems (like an open-shell atom), to fix the occupation numbers
735 !% of degenerate states in order to help <tt>octopus</tt> to converge. This is to
736 !% be used in conjuction with <tt>ExtraStates</tt>. For example, to calculate the
737 !% carbon atom, one would do:
738 !%
739 !% <tt>ExtraStates = 2
740 !% <br>%Occupations
741 !% <br>&nbsp;&nbsp;2 | 2/3 | 2/3 | 2/3
742 !% <br>%</tt>
743 !%
744 !% If you want the calculation to be spin-polarized (which makes more sense), you could do:
745 !%
746 !% <tt>ExtraStates = 2
747 !% <br>%Occupations
748 !% <br>&nbsp;&nbsp; 2/3 | 2/3 | 2/3
749 !% <br>&nbsp;&nbsp; 0 | 0 | 0
750 !% <br>%</tt>
751 !%
752 !% Note that in this case the first state is absent, the code will calculate four states
753 !% (two because there are four electrons, plus two because <tt>ExtraStates</tt> = 2), and since
754 !% it finds only three columns, it will occupy the first state with one electron for each
755 !% of the spin options.
756 !%
757 !% If the sum of occupations is not equal to the total charge set by <tt>ExcessCharge</tt>,
758 !% an error message is printed.
759 !% If <tt>FromScratch = no</tt> and <tt>RestartFixedOccupations = yes</tt>,
760 !% this block will be ignored.
761 !%End
762
763 integral_occs = .true.
764
765 occ_fix: if (parse_block(namespace, 'Occupations', blk) == 0) then
766 ! read in occupations
767 st%fixed_occ = .true.
768
769 ncols = parse_block_cols(blk, 0)
770 if (ncols > st%nst) then
771 call messages_input_error(namespace, "Occupations", "Too many columns in block Occupations.")
772 end if
773
774 nrows = parse_block_n(blk)
775 if (nrows /= st%nik) then
776 call messages_input_error(namespace, "Occupations", "Wrong number of rows in block Occupations.")
777 end if
778
779 do ik = 1, st%nik - 1
780 if (parse_block_cols(blk, ik) /= ncols) then
781 call messages_input_error(namespace, "Occupations", &
782 "All rows in block Occupations must have the same number of columns.")
783 end if
784 end do
785
786 ! Now we fill all the "missing" states with the maximum occupation.
787 if (st%d%ispin == unpolarized) then
788 el_per_state = 2
789 else
790 el_per_state = 1
791 end if
792
793 safe_allocate(read_occs(1:ncols, 1:st%nik))
794
795 charge_in_block = m_zero
796 do ik = 1, st%nik
797 do icol = 1, ncols
798 call parse_block_float(blk, ik - 1, icol - 1, read_occs(icol, ik))
799 charge_in_block = charge_in_block + read_occs(icol, ik) * st%kweights(ik)
800 end do
801 end do
802
803 spin_n = 2
804 select case (st%d%ispin)
805 case (unpolarized)
806 spin_n = 2
807 case (spin_polarized)
808 spin_n = 2
809 case (spinors)
810 spin_n = 1
811 end select
812
813 start_pos = nint((st%qtot - charge_in_block)/spin_n)
814
815 if (start_pos + ncols > st%nst) then
816 message(1) = "To balance charge, the first column in block Occupations is taken to refer to state"
817 write(message(2),'(a,i6,a)') "number ", start_pos, " but there are too many columns for the number of states."
818 write(message(3),'(a,i6,a)') "Solution: set ExtraStates = ", start_pos + ncols - st%nst
819 call messages_fatal(3, namespace=namespace)
820 end if
821
822 do ik = 1, st%nik
823 do ist = 1, start_pos
824 st%occ(ist, ik) = el_per_state
825 end do
826 end do
827
828 do ik = 1, st%nik
829 do ist = start_pos + 1, start_pos + ncols
830 st%occ(ist, ik) = read_occs(ist - start_pos, ik)
831 integral_occs = integral_occs .and. &
832 abs((st%occ(ist, ik) - el_per_state) * st%occ(ist, ik)) <= m_epsilon
833 end do
834 end do
835
836 do ik = 1, st%nik
837 do ist = start_pos + ncols + 1, st%nst
838 st%occ(ist, ik) = m_zero
839 end do
840 end do
841
842 call parse_block_end(blk)
843
844 safe_deallocate_a(read_occs)
845
846 else
847 st%fixed_occ = .false.
848 integral_occs = .false.
849
850 ! first guess for occupation...paramagnetic configuration
851 rr = m_one
852 if (st%d%ispin == unpolarized) rr = m_two
853
854 st%occ = m_zero
855 st%qtot = -(st%val_charge + excess_charge)
856
857 nspin = 1
858 if (st%d%nspin == 2) nspin = 2
859
860 do ik = 1, st%nik, nspin
861 charge = m_zero
862 do ist = 1, st%nst
863 do ispin = ik, ik + nspin - 1
864 st%occ(ist, ispin) = min(rr, -(st%val_charge + excess_charge) - charge)
865 charge = charge + st%occ(ist, ispin)
866 end do
867 end do
868 end do
869
870 end if occ_fix
871
872 !%Variable RestartReorderOccs
873 !%Type logical
874 !%Default no
875 !%Section States
876 !%Description
877 !% Consider doing a ground-state calculation, and then restarting with new occupations set
878 !% with the <tt>Occupations</tt> block, in an attempt to populate the orbitals of the original
879 !% calculation. However, the eigenvalues may reorder as the density changes, in which case the
880 !% occupations will now be referring to different orbitals. Setting this variable to yes will
881 !% try to solve this issue when the restart data is being read, by reordering the occupations
882 !% according to the order of the expectation values of the restart wavefunctions.
883 !%End
884 if (st%fixed_occ) then
885 call parse_variable(namespace, 'RestartReorderOccs', .false., st%restart_reorder_occs)
886 else
887 st%restart_reorder_occs = .false.
888 end if
889
890 call smear_init(st%smear, namespace, st%d%ispin, st%fixed_occ, integral_occs, kpoints)
891
892 unoccupied_states = (st%d%ispin /= spinors .and. st%nst*2 > st%qtot) .or. (st%d%ispin == spinors .and. st%nst > st%qtot)
893
894 if (.not. smear_is_semiconducting(st%smear) .and. .not. st%smear%method == smear_fixed_occ) then
895 if (.not. unoccupied_states) then
896 call messages_write('Smearing needs unoccupied states (via ExtraStates or TotalStates) to be useful.')
897 call messages_warning(namespace=namespace)
898 end if
899 end if
900
901 ! sanity check
902 charge = m_zero
903 do ist = 1, st%nst
904 charge = charge + sum(st%occ(ist, 1:st%nik) * st%kweights(1:st%nik))
905 end do
906 if (abs(charge - st%qtot) > 1e-6_real64) then
907 message(1) = "Initial occupations do not integrate to total charge."
908 write(message(2), '(6x,f12.6,a,f12.6)') charge, ' != ', st%qtot
909 call messages_fatal(2, only_root_writes = .true., namespace=namespace)
910 end if
911
912 st%uniform_occ = smear_is_semiconducting(st%smear) .and. .not. unoccupied_states
913
915 end subroutine states_elec_read_initial_occs
916
917
918 ! ---------------------------------------------------------
925 !
926 subroutine states_elec_read_initial_spins(st, namespace)
927 type(states_elec_t), intent(inout) :: st
928 type(namespace_t), intent(in) :: namespace
929
930 integer :: i, j
931 type(block_t) :: blk
932
934
935 st%fixed_spins = .false.
936 if (st%d%ispin /= spinors) then
938 return
939 end if
940
941 !%Variable InitialSpins
942 !%Type block
943 !%Section States
944 !%Description
945 !% The spin character of the initial random guesses for the spinors can
946 !% be fixed by making use of this block. Note that this will not "fix" the
947 !% the spins during the calculation (this cannot be done in spinors mode, in
948 !% being able to change the spins is why the spinors mode exists in the first
949 !% place).
950 !%
951 !% This block is meaningless and ignored if the run is not in spinors mode
952 !% (<tt>SpinComponents = spinors</tt>).
953 !%
954 !% The structure of the block is very simple: each column contains the desired
955 !% <math>\left< S_x \right>, \left< S_y \right>, \left< S_z \right> </math> for each spinor.
956 !% If the calculation is for a periodic system
957 !% and there is more than one <i>k</i>-point, the spins of all the <i>k</i>-points are
958 !% the same.
959 !%
960 !% For example, if we have two spinors, and we want one in the <math>S_x</math> "down" state,
961 !% and another one in the <math>S_x</math> "up" state:
962 !%
963 !% <tt>%InitialSpins
964 !% <br>&nbsp;&nbsp;&nbsp; 0.5 | 0.0 | 0.0
965 !% <br>&nbsp;&nbsp; -0.5 | 0.0 | 0.0
966 !% <br>%</tt>
967 !%
968 !% WARNING: if the calculation is for a system described by pseudopotentials (as
969 !% opposed to user-defined potentials or model systems), this option is
970 !% meaningless since the random spinors are overwritten by the atomic orbitals.
971 !%
972 !% This constraint must be fulfilled:
973 !% <br><math> \left< S_x \right>^2 + \left< S_y \right>^2 + \left< S_z \right>^2 = \frac{1}{4} </math>
974 !%End
975 spin_fix: if (parse_block(namespace, 'InitialSpins', blk) == 0) then
976 do i = 1, st%nst
977 do j = 1, 3
978 call parse_block_float(blk, i-1, j-1, st%spin(j, i, 1))
979 end do
980 if (abs(sum(st%spin(1:3, i, 1)**2) - m_fourth) > 1.0e-6_real64) call messages_input_error(namespace, 'InitialSpins')
981 end do
982 call parse_block_end(blk)
983 st%fixed_spins = .true.
984 do i = 2, st%nik
985 st%spin(:, :, i) = st%spin(:, :, 1)
986 end do
987 end if spin_fix
988
990 end subroutine states_elec_read_initial_spins
991
992
993 ! ---------------------------------------------------------
995 !
996 subroutine states_elec_allocate_wfns(st, mesh, wfs_type, skip, packed)
997 type(states_elec_t), intent(inout) :: st
998 class(mesh_t), intent(in) :: mesh
999 type(type_t), optional, intent(in) :: wfs_type
1000 logical, optional, intent(in) :: skip(:)
1001 logical, optional, intent(in) :: packed
1002
1004
1005 if (present(wfs_type)) then
1006 assert(wfs_type == type_float .or. wfs_type == type_cmplx)
1007 st%wfs_type = wfs_type
1008 end if
1009
1010 call states_elec_init_block(st, mesh, skip = skip, packed=packed)
1011 call states_elec_set_zero(st)
1012
1014 end subroutine states_elec_allocate_wfns
1015
1016 !---------------------------------------------------------------------
1033 subroutine states_elec_init_block(st, mesh, verbose, skip, packed)
1034 type(states_elec_t), intent(inout) :: st
1035 type(mesh_t), intent(in) :: mesh
1036 logical, optional, intent(in) :: verbose
1037 logical, optional, intent(in) :: skip(:)
1038 logical, optional, intent(in) :: packed
1039
1040 integer :: ib, iqn, ist, istmin, istmax
1041 logical :: same_node, verbose_, packed_
1042 integer, allocatable :: bstart(:), bend(:)
1043
1044 push_sub(states_elec_init_block)
1045
1046 safe_allocate(bstart(1:st%nst))
1047 safe_allocate(bend(1:st%nst))
1048 safe_allocate(st%group%iblock(1:st%nst))
1049
1050 st%group%iblock = 0
1051
1052 verbose_ = optional_default(verbose, .true.)
1053 packed_ = optional_default(packed, .false.)
1054
1055 !In case we have a list of state to skip, we do not allocate them
1056 istmin = 1
1057 if (present(skip)) then
1058 do ist = 1, st%nst
1059 if (.not. skip(ist)) then
1060 istmin = ist
1061 exit
1062 end if
1063 end do
1064 end if
1065
1066 istmax = st%nst
1067 if (present(skip)) then
1068 do ist = st%nst, istmin, -1
1069 if (.not. skip(ist)) then
1070 istmax = ist
1071 exit
1072 end if
1073 end do
1074 end if
1075
1076 if (present(skip) .and. verbose_) then
1077 call messages_write('Info: Allocating states from ')
1078 call messages_write(istmin, fmt = 'i8')
1079 call messages_write(' to ')
1080 call messages_write(istmax, fmt = 'i8')
1081 call messages_info()
1082 end if
1083
1084 ! count and assign blocks
1085 ib = 0
1086 st%group%nblocks = 0
1087 bstart(1) = istmin
1088 do ist = istmin, istmax
1089 ib = ib + 1
1090
1091 st%group%iblock(ist) = st%group%nblocks + 1
1092
1093 same_node = .true.
1094 if (st%parallel_in_states .and. ist /= istmax) then
1095 ! We have to avoid that states that are in different nodes end
1096 ! up in the same block
1097 same_node = (st%node(ist + 1) == st%node(ist))
1098 end if
1099
1100 if (ib == st%block_size .or. ist == istmax .or. .not. same_node) then
1101 ib = 0
1102 st%group%nblocks = st%group%nblocks + 1
1103 bend(st%group%nblocks) = ist
1104 if (ist /= istmax) bstart(st%group%nblocks + 1) = ist + 1
1105 end if
1106 end do
1107
1108 safe_allocate(st%group%psib(1:st%group%nblocks, st%d%kpt%start:st%d%kpt%end))
1109
1110 safe_allocate(st%group%block_is_local(1:st%group%nblocks, 1:st%nik))
1111 st%group%block_is_local = .false.
1112 st%group%block_start = -1
1113 st%group%block_end = -2 ! this will make that loops block_start:block_end do not run if not initialized
1114
1115 do ib = 1, st%group%nblocks
1116 if (bstart(ib) >= st%st_start .and. bend(ib) <= st%st_end) then
1117 if (st%group%block_start == -1) st%group%block_start = ib
1118 st%group%block_end = ib
1119 do iqn = st%d%kpt%start, st%d%kpt%end
1120 st%group%block_is_local(ib, iqn) = .true.
1121
1122 if (states_are_real(st)) then
1123 call dwfs_elec_init(st%group%psib(ib, iqn), st%d%dim, bstart(ib), bend(ib), mesh%np_part, iqn, &
1124 special=.true., packed=packed_)
1125 else
1126 call zwfs_elec_init(st%group%psib(ib, iqn), st%d%dim, bstart(ib), bend(ib), mesh%np_part, iqn, &
1127 special=.true., packed=packed_)
1128 end if
1129
1130 end do
1131 end if
1132 end do
1133
1134 safe_allocate(st%group%block_range(1:st%group%nblocks, 1:2))
1135 safe_allocate(st%group%block_size(1:st%group%nblocks))
1136
1137 st%group%block_range(1:st%group%nblocks, 1) = bstart(1:st%group%nblocks)
1138 st%group%block_range(1:st%group%nblocks, 2) = bend(1:st%group%nblocks)
1139 st%group%block_size(1:st%group%nblocks) = bend(1:st%group%nblocks) - bstart(1:st%group%nblocks) + 1
1140
1141 st%group%block_initialized = .true.
1142
1143 safe_allocate(st%group%block_node(1:st%group%nblocks))
1144
1145 assert(allocated(st%node))
1146 assert(all(st%node >= 0) .and. all(st%node < st%mpi_grp%size))
1147
1148 do ib = 1, st%group%nblocks
1149 st%group%block_node(ib) = st%node(st%group%block_range(ib, 1))
1150 assert(st%group%block_node(ib) == st%node(st%group%block_range(ib, 2)))
1151 end do
1152
1153 if (verbose_) then
1154 call messages_write('Info: Blocks of states')
1155 call messages_info()
1156 do ib = 1, st%group%nblocks
1157 call messages_write(' Block ')
1158 call messages_write(ib, fmt = 'i8')
1159 call messages_write(' contains ')
1160 call messages_write(st%group%block_size(ib), fmt = 'i8')
1161 call messages_write(' states')
1162 if (st%group%block_size(ib) > 0) then
1163 call messages_write(':')
1164 call messages_write(st%group%block_range(ib, 1), fmt = 'i8')
1165 call messages_write(' - ')
1166 call messages_write(st%group%block_range(ib, 2), fmt = 'i8')
1167 end if
1168 call messages_info()
1169 end do
1170 end if
1171
1172!!$!!!!DEBUG
1173!!$ ! some debug output that I will keep here for the moment
1174!!$ if (mpi_grp_is_root(mpi_world)) then
1175!!$ print*, "NST ", st%nst
1176!!$ print*, "BLOCKSIZE ", st%block_size
1177!!$ print*, "NBLOCKS ", st%group%nblocks
1178!!$
1179!!$ print*, "==============="
1180!!$ do ist = 1, st%nst
1181!!$ print*, st%node(ist), ist, st%group%iblock(ist)
1182!!$ end do
1183!!$ print*, "==============="
1184!!$
1185!!$ do ib = 1, st%group%nblocks
1186!!$ print*, ib, bstart(ib), bend(ib)
1187!!$ end do
1188!!$
1189!!$ end if
1190!!$!!!!ENDOFDEBUG
1191
1192 safe_deallocate_a(bstart)
1193 safe_deallocate_a(bend)
1194 pop_sub(states_elec_init_block)
1195 end subroutine states_elec_init_block
1196
1197
1198 ! ---------------------------------------------------------
1200 subroutine states_elec_deallocate_wfns(st)
1201 type(states_elec_t), intent(inout) :: st
1202
1204
1205 call states_elec_group_end(st%group, st%d)
1206
1208 end subroutine states_elec_deallocate_wfns
1209
1210
1211 ! ---------------------------------------------------------
1212 subroutine states_elec_densities_init(st, gr)
1213 type(states_elec_t), target, intent(inout) :: st
1214 type(grid_t), intent(in) :: gr
1215
1216 real(real64) :: fsize
1217
1219
1220 safe_allocate(st%rho(1:gr%np_part, 1:st%d%nspin))
1221 st%rho = m_zero
1222
1223 fsize = gr%np_part*8.0_real64*st%block_size
1224
1225 call messages_write('Info: states-block size = ')
1226 call messages_write(fsize, fmt = '(f10.1)', align_left = .true., units = unit_megabytes, print_units = .true.)
1227 call messages_info()
1228
1230 end subroutine states_elec_densities_init
1231
1232 !---------------------------------------------------------------------
1233 subroutine states_elec_allocate_current(st, space, mesh)
1234 type(states_elec_t), intent(inout) :: st
1235 class(space_t), intent(in) :: space
1236 class(mesh_t), intent(in) :: mesh
1237
1239
1240 if (.not. allocated(st%current)) then
1241 safe_allocate(st%current(1:mesh%np_part, 1:space%dim, 1:st%d%nspin))
1242 st%current = m_zero
1243 end if
1244
1245 if (.not. allocated(st%current_para)) then
1246 safe_allocate(st%current_para(1:mesh%np_part, 1:space%dim, 1:st%d%nspin))
1247 st%current_para = m_zero
1248 end if
1249
1250 if (.not. allocated(st%current_dia)) then
1251 safe_allocate(st%current_dia(1:mesh%np_part, 1:space%dim, 1:st%d%nspin))
1252 st%current_dia= m_zero
1253 end if
1254
1255 if (.not. allocated(st%current_mag)) then
1256 safe_allocate(st%current_mag(1:mesh%np_part, 1:space%dim, 1:st%d%nspin))
1257 st%current_mag= m_zero
1258 end if
1259
1260 if (.not. allocated(st%current_kpt)) then
1261 safe_allocate(st%current_kpt(1:mesh%np,1:space%dim,st%d%kpt%start:st%d%kpt%end))
1262 st%current_kpt = m_zero
1263 end if
1264
1266 end subroutine states_elec_allocate_current
1267
1268 !---------------------------------------------------------------------
1276 subroutine states_elec_exec_init(st, namespace, mc)
1277 type(states_elec_t), intent(inout) :: st
1278 type(namespace_t), intent(in) :: namespace
1279 type(multicomm_t), intent(in) :: mc
1280
1281 integer :: default
1282
1283 push_sub(states_elec_exec_init)
1284
1285 !%Variable StatesPack
1286 !%Type logical
1287 !%Section Execution::Optimization
1288 !%Description
1289 !% When set to yes, states are stored in packed mode, which improves
1290 !% performance considerably. Not all parts of the code will profit from
1291 !% this, but should nevertheless work regardless of how the states are
1292 !% stored.
1294 !% If GPUs are used and this variable is set to yes, Octopus
1295 !% will store the wave-functions in device (GPU) memory. If
1296 !% there is not enough memory to store all the wave-functions,
1297 !% execution will stop with an error.
1298 !%
1299 !% See also the related <tt>HamiltonianApplyPacked</tt> variable.
1300 !%
1301 !% The default is yes.
1302 !%End
1303
1304 call parse_variable(namespace, 'StatesPack', .true., st%pack_states)
1306 call messages_print_var_value('StatesPack', st%pack_states, namespace=namespace)
1307
1308 call messages_obsolete_variable(namespace, 'StatesMirror')
1309
1310 !%Variable StatesOrthogonalization
1311 !%Type integer
1312 !%Section SCF::Eigensolver
1313 !%Description
1314 !% The full orthogonalization method used by some
1315 !% eigensolvers. The default is <tt>cholesky_serial</tt>, except with state
1316 !% parallelization, the default is <tt>cholesky_parallel</tt>.
1317 !%Option cholesky_serial 1
1318 !% Cholesky decomposition implemented using
1319 !% BLAS/LAPACK. Can be used with domain parallelization but not
1320 !% state parallelization.
1321 !%Option cholesky_parallel 2
1322 !% Cholesky decomposition implemented using
1323 !% ScaLAPACK. Compatible with states parallelization.
1324 !%Option cgs 3
1325 !% Classical Gram-Schmidt (CGS) orthogonalization.
1326 !% Can be used with domain parallelization but not state parallelization.
1327 !% The algorithm is defined in Giraud et al., Computers and Mathematics with Applications 50, 1069 (2005).
1328 !%Option mgs 4
1329 !% Modified Gram-Schmidt (MGS) orthogonalization.
1330 !% Can be used with domain parallelization but not state parallelization.
1331 !% The algorithm is defined in Giraud et al., Computers and Mathematics with Applications 50, 1069 (2005).
1332 !%Option drcgs 5
1333 !% Classical Gram-Schmidt orthogonalization with double-step reorthogonalization.
1334 !% Can be used with domain parallelization but not state parallelization.
1335 !% The algorithm is taken from Giraud et al., Computers and Mathematics with Applications 50, 1069 (2005).
1336 !% According to this reference, this is much more precise than CGS or MGS algorithms. The MGS version seems not to improve much the stability and would require more communications over the domains.
1337 !%End
1338
1339 default = option__statesorthogonalization__cholesky_serial
1340#ifdef HAVE_SCALAPACK
1342 default = option__statesorthogonalization__cholesky_parallel
1343 end if
1344#endif
1345
1346 call parse_variable(namespace, 'StatesOrthogonalization', default, st%orth_method)
1347
1348 if (.not. varinfo_valid_option('StatesOrthogonalization', st%orth_method)) then
1349 call messages_input_error(namespace, 'StatesOrthogonalization')
1350 end if
1351 call messages_print_var_option('StatesOrthogonalization', st%orth_method, namespace=namespace)
1352
1353 !%Variable StatesCLDeviceMemory
1354 !%Type float
1355 !%Section Execution::Optimization
1356 !%Default -512
1357 !%Description
1358 !% This variable selects the amount of OpenCL device memory that
1359 !% will be used by Octopus to store the states.
1360 !%
1361 !% A positive number smaller than 1 indicates a fraction of the total
1362 !% device memory. A number larger than one indicates an absolute
1363 !% amount of memory in megabytes. A negative number indicates an
1364 !% amount of memory in megabytes that would be subtracted from
1365 !% the total device memory.
1366 !%End
1367 call parse_variable(namespace, 'StatesCLDeviceMemory', -512.0_real64, st%cl_states_mem)
1368
1370 end subroutine states_elec_exec_init
1371
1372
1373 ! ---------------------------------------------------------
1375 !
1376 subroutine states_elec_copy(stout, stin, exclude_wfns, exclude_eigenval, special)
1377 type(states_elec_t), target, intent(inout) :: stout
1378 type(states_elec_t), intent(in) :: stin
1379 logical, optional, intent(in) :: exclude_wfns
1380 logical, optional, intent(in) :: exclude_eigenval
1381 logical, optional, intent(in) :: special
1382
1383 logical :: exclude_wfns_
1384
1385 push_sub(states_elec_copy)
1386
1387 exclude_wfns_ = optional_default(exclude_wfns, .false.)
1388
1389 call states_elec_null(stout)
1390
1391 call states_elec_dim_copy(stout%d, stin%d)
1392 safe_allocate_source_a(stout%kweights, stin%kweights)
1393 stout%nik = stin%nik
1394
1395 call modelmb_particles_copy(stout%modelmbparticles, stin%modelmbparticles)
1396 if (stin%modelmbparticles%nparticle > 0) then
1397 safe_allocate_source_a(stout%mmb_nspindown, stin%mmb_nspindown)
1398 safe_allocate_source_a(stout%mmb_iyoung, stin%mmb_iyoung)
1399 safe_allocate_source_a(stout%mmb_proj, stin%mmb_proj)
1400 end if
1401
1402 stout%wfs_type = stin%wfs_type
1403 stout%nst = stin%nst
1404 stout%block_size = stin%block_size
1405 stout%orth_method = stin%orth_method
1406
1407 stout%cl_states_mem = stin%cl_states_mem
1408 stout%pack_states = stin%pack_states
1409
1410
1411 stout%only_userdef_istates = stin%only_userdef_istates
1412
1413 if (.not. exclude_wfns_) then
1414 safe_allocate_source_a(stout%rho, stin%rho)
1415 end if
1416
1417 stout%uniform_occ = stin%uniform_occ
1418
1419 if (.not. optional_default(exclude_eigenval, .false.)) then
1420 safe_allocate_source_a(stout%eigenval, stin%eigenval)
1421 safe_allocate_source_a(stout%occ, stin%occ)
1422 safe_allocate_source_a(stout%spin, stin%spin)
1423 end if
1424
1425 ! the call to init_block is done at the end of this subroutine
1426 ! it allocates iblock, psib, block_is_local
1427 stout%group%nblocks = stin%group%nblocks
1428
1429 safe_allocate_source_a(stout%user_def_states, stin%user_def_states)
1430
1431 safe_allocate_source_a(stout%current, stin%current)
1432 safe_allocate_source_a(stout%current_kpt, stin%current_kpt)
1433 safe_allocate_source_a(stout%rho_core, stin%rho_core)
1434 safe_allocate_source_a(stout%frozen_rho, stin%frozen_rho)
1435 safe_allocate_source_a(stout%frozen_tau, stin%frozen_tau)
1436 safe_allocate_source_a(stout%frozen_gdens, stin%frozen_gdens)
1437 safe_allocate_source_a(stout%frozen_ldens, stin%frozen_ldens)
1438
1439 stout%fixed_occ = stin%fixed_occ
1440 stout%restart_fixed_occ = stin%restart_fixed_occ
1441
1442 stout%fixed_spins = stin%fixed_spins
1443
1444 stout%qtot = stin%qtot
1445 stout%val_charge = stin%val_charge
1446
1447 call smear_copy(stout%smear, stin%smear)
1448
1449 stout%parallel_in_states = stin%parallel_in_states
1450 call mpi_grp_copy(stout%mpi_grp, stin%mpi_grp)
1451 call mpi_grp_copy(stout%dom_st_kpt_mpi_grp, stin%dom_st_kpt_mpi_grp)
1452 call mpi_grp_copy(stout%st_kpt_mpi_grp, stin%st_kpt_mpi_grp)
1453 call mpi_grp_copy(stout%dom_st_mpi_grp, stin%dom_st_mpi_grp)
1454 safe_allocate_source_a(stout%node, stin%node)
1455 safe_allocate_source_a(stout%st_kpt_task, stin%st_kpt_task)
1456
1457#ifdef HAVE_SCALAPACK
1458 call blacs_proc_grid_copy(stin%dom_st_proc_grid, stout%dom_st_proc_grid)
1459#endif
1460
1461 call distributed_copy(stin%dist, stout%dist)
1462
1463 stout%scalapack_compatible = stin%scalapack_compatible
1464
1465 stout%lnst = stin%lnst
1466 stout%st_start = stin%st_start
1467 stout%st_end = stin%st_end
1468
1469 if (stin%parallel_in_states) call multicomm_all_pairs_copy(stout%ap, stin%ap)
1470
1471 stout%symmetrize_density = stin%symmetrize_density
1472
1473 if (.not. exclude_wfns_) call states_elec_group_copy(stin%d, stin%group, stout%group, special=special)
1474
1475 stout%packed = stin%packed
1476
1477 stout%randomization = stin%randomization
1478
1479 pop_sub(states_elec_copy)
1480 end subroutine states_elec_copy
1481
1482
1483 ! ---------------------------------------------------------
1485 !
1486 subroutine states_elec_end(st)
1487 type(states_elec_t), intent(inout) :: st
1488
1489 push_sub(states_elec_end)
1490
1491 call states_elec_dim_end(st%d)
1492
1493 if (st%modelmbparticles%nparticle > 0) then
1494 safe_deallocate_a(st%mmb_nspindown)
1495 safe_deallocate_a(st%mmb_iyoung)
1496 safe_deallocate_a(st%mmb_proj)
1497 end if
1498 call modelmb_particles_end(st%modelmbparticles)
1499
1500 ! this deallocates dpsi, zpsi, psib, iblock, iblock
1502
1503 safe_deallocate_a(st%user_def_states)
1504
1505 safe_deallocate_a(st%rho)
1506 safe_deallocate_a(st%eigenval)
1507
1508 safe_deallocate_a(st%current)
1509 safe_deallocate_a(st%current_para)
1510 safe_deallocate_a(st%current_dia)
1511 safe_deallocate_a(st%current_mag)
1512 safe_deallocate_a(st%current_kpt)
1513 safe_deallocate_a(st%rho_core)
1514 safe_deallocate_a(st%frozen_rho)
1515 safe_deallocate_a(st%frozen_tau)
1516 safe_deallocate_a(st%frozen_gdens)
1517 safe_deallocate_a(st%frozen_ldens)
1518 safe_deallocate_a(st%occ)
1519 safe_deallocate_a(st%spin)
1520 safe_deallocate_a(st%kweights)
1521
1522
1523#ifdef HAVE_SCALAPACK
1524 call blacs_proc_grid_end(st%dom_st_proc_grid)
1525#endif
1526
1527 call distributed_end(st%dist)
1528
1529 safe_deallocate_a(st%node)
1530 safe_deallocate_a(st%st_kpt_task)
1531
1532 if (st%parallel_in_states) then
1533 safe_deallocate_a(st%ap%schedule)
1534 end if
1535
1536 pop_sub(states_elec_end)
1537 end subroutine states_elec_end
1538
1539
1540 ! TODO(Alex) Issue #684. Abstract duplicate code in states_elec_generate_random, to get it to
1541 ! a point where it can be refactored.
1543 subroutine states_elec_generate_random(st, mesh, kpoints, ist_start_, ist_end_, ikpt_start_, ikpt_end_, normalized)
1544 type(states_elec_t), intent(inout) :: st
1545 class(mesh_t), intent(in) :: mesh
1546 type(kpoints_t), intent(in) :: kpoints
1547 integer, optional, intent(in) :: ist_start_
1548 integer, optional, intent(in) :: ist_end_
1549 integer, optional, intent(in) :: ikpt_start_
1550 integer, optional, intent(in) :: ikpt_end_
1551 logical, optional, intent(in) :: normalized
1553
1554 integer :: ist, ik, id, ist_start, ist_end, jst, ikpt_start, ikpt_end
1555 complex(real64) :: alpha, beta
1556 real(real64), allocatable :: dpsi(:, :)
1557 complex(real64), allocatable :: zpsi(:, :), zpsi2(:)
1558 integer :: ikpoint, ip
1559 type(batch_t) :: ffb
1560
1561 logical :: normalized_
1562
1563 normalized_ = optional_default(normalized, .true.)
1564
1566
1567 ist_start = optional_default(ist_start_, 1)
1568 ist_end = optional_default(ist_end_, st%nst)
1569 ikpt_start = optional_default(ikpt_start_, 1)
1570 ikpt_end = optional_default(ikpt_end_, st%nik)
1571
1572 safe_allocate(dpsi(1:mesh%np, 1:st%d%dim))
1573 if (states_are_complex(st)) then
1574 safe_allocate(zpsi(1:mesh%np, 1:st%d%dim))
1575 end if
1576
1577 select case (st%d%ispin)
1580 do ik = ikpt_start, ikpt_end
1581 ikpoint = st%d%get_kpoint_index(ik)
1582 do ist = ist_start, ist_end
1583 if (states_are_real(st).or.kpoints_point_is_gamma(kpoints, ikpoint)) then
1584 if (st%randomization == par_independent) then
1585 call dmf_random(mesh, dpsi(:, 1), &
1586 pre_shift = mesh%pv%xlocal-1, &
1587 post_shift = mesh%pv%np_global - mesh%pv%xlocal - mesh%np + 1, &
1588 normalized = normalized)
1589 ! Ensures that the grid points are properly distributed in the domain parallel case
1590 if(mesh%parallel_in_domains) then
1591 call batch_init(ffb, dpsi(:,1))
1592 call dmesh_batch_exchange_points(mesh, ffb, backward_map = .true.)
1593 call ffb%end()
1594 end if
1595 else
1596 call dmf_random(mesh, dpsi(:, 1), normalized = normalized)
1597 end if
1598 if (.not. state_kpt_is_local(st, ist, ik)) cycle
1599 if (states_are_complex(st)) then !Gamma point
1600 do ip = 1, mesh%np
1601 zpsi(ip,1) = cmplx(dpsi(ip,1), m_zero, real64)
1602 end do
1603 call states_elec_set_state(st, mesh, ist, ik, zpsi)
1604 else
1605 call states_elec_set_state(st, mesh, ist, ik, dpsi)
1606 end if
1607 else
1608 if (st%randomization == par_independent) then
1609 call zmf_random(mesh, zpsi(:, 1), &
1610 pre_shift = mesh%pv%xlocal-1, &
1611 post_shift = mesh%pv%np_global - mesh%pv%xlocal - mesh%np + 1, &
1612 normalized = normalized)
1613 ! Ensures that the grid points are properly distributed in the domain parallel case
1614 if(mesh%parallel_in_domains) then
1615 call batch_init(ffb, zpsi(:,1))
1616 call zmesh_batch_exchange_points(mesh, ffb, backward_map = .true.)
1617 call ffb%end()
1618 end if
1619 else
1620 call zmf_random(mesh, zpsi(:, 1), normalized = normalized)
1621 end if
1622 if (.not. state_kpt_is_local(st, ist, ik)) cycle
1623 call states_elec_set_state(st, mesh, ist, ik, zpsi)
1624 end if
1625 end do
1626 end do
1627
1628 case (spinors)
1629
1630 assert(states_are_complex(st))
1631
1632 if (st%fixed_spins) then
1633
1634 do ik = ikpt_start, ikpt_end
1635 ikpoint = st%d%get_kpoint_index(ik)
1636 do ist = ist_start, ist_end
1637 if (kpoints_point_is_gamma(kpoints, ikpoint)) then
1638 if (st%randomization == par_independent) then
1639 call dmf_random(mesh, dpsi(:, 1), &
1640 pre_shift = mesh%pv%xlocal-1, &
1641 post_shift = mesh%pv%np_global - mesh%pv%xlocal - mesh%np + 1, &
1642 normalized = normalized)
1643 ! Ensures that the grid points are properly distributed in the domain parallel case
1644 if(mesh%parallel_in_domains) then
1645 call batch_init(ffb, dpsi(:,1))
1646 call dmesh_batch_exchange_points(mesh, ffb, backward_map = .true.)
1647 call ffb%end()
1648 end if
1649 else
1650 call dmf_random(mesh, dpsi(:, 1), normalized = normalized)
1651 if (.not. state_kpt_is_local(st, ist, ik)) cycle
1652 end if
1653 do ip = 1, mesh%np
1654 zpsi(ip,1) = cmplx(dpsi(ip,1), m_zero, real64)
1655 end do
1656 call states_elec_set_state(st, mesh, ist, ik, zpsi)
1657 else
1658 if (st%randomization == par_independent) then
1659 call zmf_random(mesh, zpsi(:, 1), &
1660 pre_shift = mesh%pv%xlocal-1, &
1661 post_shift = mesh%pv%np_global - mesh%pv%xlocal - mesh%np + 1, &
1662 normalized = normalized)
1663 ! Ensures that the grid points are properly distributed in the domain parallel case
1664 if(mesh%parallel_in_domains) then
1665 call batch_init(ffb, zpsi(:,1))
1666 call zmesh_batch_exchange_points(mesh, ffb, backward_map = .true.)
1667 call ffb%end()
1668 end if
1669 else
1670 call zmf_random(mesh, zpsi(:, 1), normalized = normalized)
1671 if (.not. state_kpt_is_local(st, ist, ik)) cycle
1672 end if
1673 end if
1674 if (.not. state_kpt_is_local(st, ist, ik)) cycle
1675 ! In this case, the spinors are made of a spatial part times a vector [alpha beta]^T in
1676 ! spin space (i.e., same spatial part for each spin component). So (alpha, beta)
1677 ! determines the spin values. The values of (alpha, beta) can be be obtained
1678 ! with simple formulae from <Sx>, <Sy>, <Sz>.
1679 !
1680 ! Note that here we orthonormalize the orbital part. This ensures that the spinors
1681 ! are untouched later in the general orthonormalization, and therefore the spin values
1682 ! of each spinor remain the same.
1683 safe_allocate(zpsi2(1:mesh%np))
1684 do jst = ist_start, ist - 1
1685 call states_elec_get_state(st, mesh, 1, jst, ik, zpsi2)
1686 zpsi(1:mesh%np, 1) = zpsi(1:mesh%np, 1) - zmf_dotp(mesh, zpsi(:, 1), zpsi2)*zpsi2(1:mesh%np)
1687 end do
1688 safe_deallocate_a(zpsi2)
1689
1690 call zmf_normalize(mesh, 1, zpsi)
1691 zpsi(1:mesh%np, 2) = zpsi(1:mesh%np, 1)
1692
1693 alpha = cmplx(sqrt(m_half + st%spin(3, ist, ik)), m_zero, real64)
1694 beta = cmplx(sqrt(m_one - abs(alpha)**2), m_zero, real64)
1695 if (abs(alpha) > m_zero) then
1696 beta = cmplx(st%spin(1, ist, ik) / abs(alpha), st%spin(2, ist, ik) / abs(alpha), real64)
1697 end if
1698 zpsi(1:mesh%np, 1) = alpha*zpsi(1:mesh%np, 1)
1699 zpsi(1:mesh%np, 2) = beta*zpsi(1:mesh%np, 2)
1700 call states_elec_set_state(st, mesh, ist, ik, zpsi)
1701 end do
1702 end do
1703 else
1704 do ik = ikpt_start, ikpt_end
1705 do ist = ist_start, ist_end
1706 do id = 1, st%d%dim
1707 if (st%randomization == par_independent) then
1708 call zmf_random(mesh, zpsi(:, id), &
1709 pre_shift = mesh%pv%xlocal-1, &
1710 post_shift = mesh%pv%np_global - mesh%pv%xlocal - mesh%np + 1, &
1711 normalized = .false.)
1712 ! Ensures that the grid points are properly distributed in the domain parallel case
1713 if(mesh%parallel_in_domains) then
1714 call batch_init(ffb, zpsi(:, id))
1715 call zmesh_batch_exchange_points(mesh, ffb, backward_map = .true.)
1716 call ffb%end()
1717 end if
1718 else
1719 call zmf_random(mesh, zpsi(:, id), normalized = .false.)
1720 end if
1721 end do
1722 ! We need to generate the wave functions even if not using them in order to be consistent with the random seed in parallel runs.
1723 if (.not. state_kpt_is_local(st, ist, ik)) cycle
1724 ! Note that mf_random normalizes each spin channel independently to 1.
1725 ! Therefore we need to renormalize the spinor:
1726 if (normalized_) call zmf_normalize(mesh, st%d%dim, zpsi)
1727 call states_elec_set_state(st, mesh, ist, ik, zpsi)
1728 end do
1729 end do
1730 end if
1731
1732 end select
1733
1734 safe_deallocate_a(dpsi)
1735 safe_deallocate_a(zpsi)
1736
1738 end subroutine states_elec_generate_random
1739
1740 ! ---------------------------------------------------------
1742 !
1743 subroutine states_elec_fermi(st, namespace, mesh, compute_spin)
1744 type(states_elec_t), intent(inout) :: st
1745 type(namespace_t), intent(in) :: namespace
1746 class(mesh_t), intent(in) :: mesh
1747 logical, optional, intent(in) :: compute_spin
1748
1750 integer :: ist, ik
1751 real(real64) :: charge
1752 complex(real64), allocatable :: zpsi(:, :)
1753
1754 push_sub(states_elec_fermi)
1755
1756 call smear_find_fermi_energy(st%smear, namespace, st%eigenval, st%occ, st%qtot, &
1757 st%nik, st%nst, st%kweights)
1758
1759 call smear_fill_occupations(st%smear, st%eigenval, st%occ, st%nik, st%nst)
1760
1761 ! check if everything is OK
1762 charge = m_zero
1763 do ist = 1, st%nst
1764 charge = charge + sum(st%occ(ist, 1:st%nik) * st%kweights(1:st%nik))
1765 end do
1766 if (abs(charge-st%qtot) > 1e-6_real64) then
1767 message(1) = 'Occupations do not integrate to total charge.'
1768 write(message(2), '(6x,f12.8,a,f12.8)') charge, ' != ', st%qtot
1769 call messages_warning(2, namespace=namespace)
1770 if (charge < m_epsilon) then
1771 message(1) = "There don't seem to be any electrons at all!"
1772 call messages_fatal(1, namespace=namespace)
1773 end if
1774 end if
1775
1776 if (st%d%ispin == spinors .and. optional_default(compute_spin,.true.)) then
1777 assert(states_are_complex(st))
1778
1779 st%spin(:,:,:) = m_zero
1780
1781 safe_allocate(zpsi(1:mesh%np, st%d%dim))
1782 do ik = st%d%kpt%start, st%d%kpt%end
1783 do ist = st%st_start, st%st_end
1784 call states_elec_get_state(st, mesh, ist, ik, zpsi)
1785 st%spin(1:3, ist, ik) = state_spin(mesh, zpsi)
1786 end do
1787 end do
1788 safe_deallocate_a(zpsi)
1789
1790 if (st%parallel_in_states .or. st%d%kpt%parallel) then
1791 call comm_allreduce(st%st_kpt_mpi_grp, st%spin)
1792 end if
1793
1794 end if
1795
1796 pop_sub(states_elec_fermi)
1797 end subroutine states_elec_fermi
1798
1799
1800 ! ---------------------------------------------------------
1802 !
1803 function states_elec_eigenvalues_sum(st, alt_eig) result(tot)
1804 type(states_elec_t), intent(in) :: st
1805 real(real64), optional, intent(in) :: alt_eig(st%st_start:, st%d%kpt%start:)
1807 real(real64) :: tot
1808
1809 integer :: ik
1810
1812
1813 tot = m_zero
1814 do ik = st%d%kpt%start, st%d%kpt%end
1815 if (present(alt_eig)) then
1816 tot = tot + st%kweights(ik) * sum(st%occ(st%st_start:st%st_end, ik) * &
1817 alt_eig(st%st_start:st%st_end, ik))
1818 else
1819 tot = tot + st%kweights(ik) * sum(st%occ(st%st_start:st%st_end, ik) * &
1820 st%eigenval(st%st_start:st%st_end, ik))
1821 end if
1822 end do
1823
1824 if (st%parallel_in_states .or. st%d%kpt%parallel) call comm_allreduce(st%st_kpt_mpi_grp, tot)
1825
1827 end function states_elec_eigenvalues_sum
1828
1829
1831 subroutine states_elec_distribute_nodes(st, namespace, mc)
1832 type(states_elec_t), intent(inout) :: st
1833 type(namespace_t), intent(in) :: namespace
1834 type(multicomm_t), intent(in) :: mc
1835
1836 logical :: default_scalapack_compatible
1837
1839
1840 ! TODO(Alex) Issue #820. This is superflous. These defaults are set in initialisation of
1841 ! states, and in the state distribution instance
1842 ! Defaults.
1843 st%node(:) = 0
1844 st%st_start = 1
1845 st%st_end = st%nst
1846 st%lnst = st%nst
1847 st%parallel_in_states = .false.
1848
1849 call mpi_grp_init(st%mpi_grp, mc%group_comm(p_strategy_states))
1850 call mpi_grp_init(st%dom_st_kpt_mpi_grp, mc%dom_st_kpt_comm)
1851 call mpi_grp_init(st%dom_st_mpi_grp, mc%dom_st_comm)
1852 call mpi_grp_init(st%st_kpt_mpi_grp, mc%st_kpt_comm)
1853
1854 default_scalapack_compatible = calc_mode_par%scalapack_compat() .and. .not. st%d%kpt%parallel
1855
1856 !%Variable ScaLAPACKCompatible
1857 !%Type logical
1858 !%Section Execution::Parallelization
1859 !%Description
1860 !% Whether to use a layout for states parallelization which is compatible with ScaLAPACK.
1861 !% The default is yes for <tt>CalculationMode = gs, unocc, go</tt> without k-point parallelization,
1862 !% and no otherwise. (Setting to other than default is experimental.)
1863 !% The value must be yes if any ScaLAPACK routines are called in the course of the run;
1864 !% it must be set by hand for <tt>td</tt> with <tt>TDDynamics = bo</tt>.
1865 !% This variable has no effect unless you are using states parallelization and have linked ScaLAPACK.
1866 !% Note: currently, use of ScaLAPACK is not compatible with task parallelization (<i>i.e.</i> slaves).
1867 !%End
1868 call parse_variable(namespace, 'ScaLAPACKCompatible', default_scalapack_compatible, st%scalapack_compatible)
1869
1870#ifdef HAVE_SCALAPACK
1871 if (default_scalapack_compatible .neqv. st%scalapack_compatible) then
1872 call messages_experimental('Setting ScaLAPACKCompatible to other than default', namespace=namespace)
1873 end if
1874
1875 if (st%scalapack_compatible) then
1876 if (multicomm_have_slaves(mc)) then
1877 call messages_not_implemented("ScaLAPACK usage with task parallelization (slaves)", namespace=namespace)
1878 end if
1879 call blacs_proc_grid_init(st%dom_st_proc_grid, st%dom_st_mpi_grp)
1880 end if
1881#else
1882 st%scalapack_compatible = .false.
1883#endif
1884
1886
1887#ifdef HAVE_MPI
1888 call multicomm_create_all_pairs(st%mpi_grp, st%ap)
1889#endif
1890
1891 if (st%nst < st%mpi_grp%size) then
1892 message(1) = "Have more processors than necessary"
1893 write(message(2),'(i4,a,i4,a)') st%mpi_grp%size, " processors and ", st%nst, " states."
1894 call messages_fatal(2, namespace=namespace)
1895 end if
1897 call distributed_init(st%dist, st%nst, st%mpi_grp%comm, "states", scalapack_compat = st%scalapack_compatible)
1898
1899 st%parallel_in_states = st%dist%parallel
1900
1901 ! TODO(Alex) Issue #820. Remove lnst, st_start, st_end and node, as they are all contained within dist
1902 st%st_start = st%dist%start
1903 st%st_end = st%dist%end
1904 st%lnst = st%dist%nlocal
1905 st%node(1:st%nst) = st%dist%node(1:st%nst)
1906
1907 end if
1908
1910
1912 end subroutine states_elec_distribute_nodes
1913
1914
1920 !
1921 subroutine states_elec_calc_quantities(gr, st, kpoints, nlcc, &
1922 kinetic_energy_density, paramagnetic_current, density_gradient, density_laplacian, &
1923 gi_kinetic_energy_density, st_end)
1924 type(grid_t), intent(in) :: gr
1925 type(states_elec_t), intent(in) :: st
1926 type(kpoints_t), intent(in) :: kpoints
1927 logical, intent(in) :: nlcc
1928 real(real64), optional, target, intent(out) :: kinetic_energy_density(:,:)
1929 real(real64), optional, target, intent(out) :: paramagnetic_current(:,:,:)
1930 real(real64), optional, intent(out) :: density_gradient(:,:,:)
1931 real(real64), contiguous, optional, intent(out) :: density_laplacian(:,:)
1932 real(real64), optional, intent(out) :: gi_kinetic_energy_density(:,:)
1933 integer, optional, intent(in) :: st_end
1934
1935 real(real64), pointer :: jp(:, :, :)
1936 real(real64), pointer :: tau(:, :)
1937 complex(real64), allocatable :: wf_psi(:,:), gwf_psi(:,:,:), wf_psi_conj(:,:), lwf_psi(:,:)
1938 real(real64), allocatable :: abs_wf_psi(:,:), abs_gwf_psi(:,:)
1939 complex(real64), allocatable :: psi_gpsi(:,:)
1940 complex(real64) :: c_tmp
1941 integer :: is, ik, ist, i_dim, st_dim, ii, st_end_
1942 real(real64) :: ww, kpoint(gr%der%dim)
1943 logical :: something_to_do
1944
1945 call profiling_in("STATES_CALC_QUANTITIES")
1946
1948
1949 st_end_ = min(st%st_end, optional_default(st_end, st%st_end))
1950
1951 something_to_do = present(kinetic_energy_density) .or. present(gi_kinetic_energy_density) .or. &
1952 present(paramagnetic_current) .or. present(density_gradient) .or. present(density_laplacian)
1953 assert(something_to_do)
1954
1955 safe_allocate( wf_psi(1:gr%np_part, 1:st%d%dim))
1956 safe_allocate( wf_psi_conj(1:gr%np_part, 1:st%d%dim))
1957 safe_allocate(gwf_psi(1:gr%np, 1:gr%der%dim, 1:st%d%dim))
1958 safe_allocate(abs_wf_psi(1:gr%np, 1:st%d%dim))
1959 safe_allocate(abs_gwf_psi(1:gr%np, 1:st%d%dim))
1960 safe_allocate(psi_gpsi(1:gr%np, 1:st%d%dim))
1961 if (present(density_laplacian)) then
1962 safe_allocate(lwf_psi(1:gr%np, 1:st%d%dim))
1963 end if
1964
1965 nullify(tau)
1966 if (present(kinetic_energy_density)) tau => kinetic_energy_density
1967
1968 nullify(jp)
1969 if (present(paramagnetic_current)) jp => paramagnetic_current
1970
1971 ! for the gauge-invariant kinetic energy density we need the
1972 ! current and the kinetic energy density
1973 if (present(gi_kinetic_energy_density)) then
1974 if (.not. present(paramagnetic_current) .and. states_are_complex(st)) then
1975 safe_allocate(jp(1:gr%np, 1:gr%der%dim, 1:st%d%nspin))
1976 end if
1977 if (.not. present(kinetic_energy_density)) then
1978 safe_allocate(tau(1:gr%np, 1:st%d%nspin))
1979 end if
1980 end if
1981
1982 if (associated(tau)) tau = m_zero
1983 if (associated(jp)) jp = m_zero
1984 if (present(density_gradient)) density_gradient(:,:,:) = m_zero
1985 if (present(density_laplacian)) density_laplacian(:,:) = m_zero
1986 if (present(gi_kinetic_energy_density)) gi_kinetic_energy_density = m_zero
1987
1988 do ik = st%d%kpt%start, st%d%kpt%end
1989
1990 kpoint(1:gr%der%dim) = kpoints%get_point(st%d%get_kpoint_index(ik))
1991 is = st%d%get_spin_index(ik)
1992
1993 do ist = st%st_start, st_end_
1994 ww = st%kweights(ik)*st%occ(ist, ik)
1995 if (abs(ww) <= m_epsilon) cycle
1996
1997 ! all calculations will be done with complex wavefunctions
1998 call states_elec_get_state(st, gr, ist, ik, wf_psi)
1999
2000 do st_dim = 1, st%d%dim
2001 call boundaries_set(gr%der%boundaries, gr, wf_psi(:, st_dim))
2002 end do
2003
2004 ! calculate gradient of the wavefunction
2005 do st_dim = 1, st%d%dim
2006 call zderivatives_grad(gr%der, wf_psi(:,st_dim), gwf_psi(:,:,st_dim), set_bc = .false.)
2007 end do
2008
2009 ! calculate the Laplacian of the wavefunction
2010 if (present(density_laplacian)) then
2011 do st_dim = 1, st%d%dim
2012 call zderivatives_lapl(gr%der, wf_psi(:,st_dim), lwf_psi(:,st_dim), ghost_update = .false., set_bc = .false.)
2013 end do
2014 end if
2015
2016 ! We precompute some quantites, to avoid to compute it many times
2017 wf_psi_conj(1:gr%np, 1:st%d%dim) = conjg(wf_psi(1:gr%np,1:st%d%dim))
2018 abs_wf_psi(1:gr%np, 1:st%d%dim) = real(wf_psi_conj(1:gr%np, 1:st%d%dim) * wf_psi(1:gr%np, 1:st%d%dim), real64)
2019
2020 if (present(density_laplacian)) then
2021 density_laplacian(1:gr%np, is) = density_laplacian(1:gr%np, is) + &
2022 ww * m_two*real(wf_psi_conj(1:gr%np, 1) * lwf_psi(1:gr%np, 1), real64)
2023 if (st%d%ispin == spinors) then
2024 density_laplacian(1:gr%np, 2) = density_laplacian(1:gr%np, 2) + &
2025 ww * m_two*real(wf_psi_conj(1:gr%np, 2) * lwf_psi(1:gr%np, 2), real64)
2026 !$omp parallel do private(c_tmp)
2027 do ii = 1, gr%np
2028 c_tmp = ww*(lwf_psi(ii, 1) * wf_psi_conj(ii, 2) + wf_psi(ii, 1) * conjg(lwf_psi(ii, 2)))
2029 density_laplacian(ii, 3) = density_laplacian(ii, 3) + real(c_tmp, real64)
2030 density_laplacian(ii, 4) = density_laplacian(ii, 4) + aimag(c_tmp)
2031 end do
2032 end if
2033 end if
2034
2035 if (associated(tau)) then
2036 tau(1:gr%np, is) = tau(1:gr%np, is) &
2037 + ww * sum(kpoint(1:gr%der%dim)**2) * abs_wf_psi(1:gr%np, 1)
2038 if (st%d%ispin == spinors) then
2039 tau(1:gr%np, 2) = tau(1:gr%np, 2) &
2040 + ww * sum(kpoint(1:gr%der%dim)**2) * abs_wf_psi(1:gr%np, 2)
2041
2042 !$omp parallel do private(c_tmp)
2043 do ii = 1, gr%np
2044 c_tmp = ww * sum(kpoint(1:gr%der%dim)**2) * wf_psi(ii, 1) * wf_psi_conj(ii, 2)
2045 tau(ii, 3) = tau(ii, 3) + real(c_tmp, real64)
2046 tau(ii, 4) = tau(ii, 4) + aimag(c_tmp)
2047 end do
2048 end if
2049 end if
2050
2051 do i_dim = 1, gr%der%dim
2052
2053 ! We precompute some quantites, to avoid to compute them many times
2054 psi_gpsi(1:gr%np, 1:st%d%dim) = wf_psi_conj(1:gr%np, 1:st%d%dim) &
2055 * gwf_psi(1:gr%np,i_dim,1:st%d%dim)
2056 abs_gwf_psi(1:gr%np, 1:st%d%dim) = real(conjg(gwf_psi(1:gr%np, i_dim, 1:st%d%dim)) &
2057 * gwf_psi(1:gr%np, i_dim, 1:st%d%dim), real64)
2058
2059 if (present(density_gradient)) then
2060 density_gradient(1:gr%np, i_dim, is) = density_gradient(1:gr%np, i_dim, is) &
2061 + ww * m_two * real(psi_gpsi(1:gr%np, 1), real64)
2062 if (st%d%ispin == spinors) then
2063 density_gradient(1:gr%np, i_dim, 2) = density_gradient(1:gr%np, i_dim, 2) &
2064 + ww * m_two*real(psi_gpsi(1:gr%np, 2), real64)
2065 !$omp parallel do private(c_tmp)
2066 do ii = 1, gr%np
2067 c_tmp = ww * (gwf_psi(ii, i_dim, 1) * wf_psi_conj(ii, 2) + wf_psi(ii, 1) * conjg(gwf_psi(ii, i_dim, 2)))
2068 density_gradient(ii, i_dim, 3) = density_gradient(ii, i_dim, 3) + real(c_tmp, real64)
2069 density_gradient(ii, i_dim, 4) = density_gradient(ii, i_dim, 4) + aimag(c_tmp)
2070 end do
2071 end if
2072 end if
2073
2074 if (present(density_laplacian)) then
2075 call lalg_axpy(gr%np, ww*m_two, abs_gwf_psi(:,1), density_laplacian(:,is))
2076 if (st%d%ispin == spinors) then
2077 call lalg_axpy(gr%np, ww*m_two, abs_gwf_psi(:,2), density_laplacian(:,2))
2078 !$omp parallel do private(c_tmp)
2079 do ii = 1, gr%np
2080 c_tmp = m_two * ww * gwf_psi(ii, i_dim, 1) * conjg(gwf_psi(ii, i_dim, 2))
2081 density_laplacian(ii, 3) = density_laplacian(ii, 3) + real(c_tmp, real64)
2082 density_laplacian(ii, 4) = density_laplacian(ii, 4) + aimag(c_tmp)
2083 end do
2084 end if
2085 end if
2086
2087 ! the expression for the paramagnetic current with spinors is
2088 ! j = ( jp(1) jp(3) + i jp(4) )
2089 ! (-jp(3) + i jp(4) jp(2) )
2090 if (associated(jp)) then
2091 if (.not.(states_are_real(st))) then
2092 jp(1:gr%np, i_dim, is) = jp(1:gr%np, i_dim, is) + &
2093 ww*(aimag(psi_gpsi(1:gr%np, 1)) - abs_wf_psi(1:gr%np, 1)*kpoint(i_dim))
2094 if (st%d%ispin == spinors) then
2095 jp(1:gr%np, i_dim, 2) = jp(1:gr%np, i_dim, 2) + &
2096 ww*( aimag(psi_gpsi(1:gr%np, 2)) - abs_wf_psi(1:gr%np, 2)*kpoint(i_dim))
2097 !$omp parallel do private(c_tmp)
2098 do ii = 1, gr%np
2099 c_tmp = -ww*m_half*m_zi*(gwf_psi(ii, i_dim, 1)*wf_psi_conj(ii, 2) - wf_psi(ii, 1)*conjg(gwf_psi(ii, i_dim, 2)) &
2100 - m_two * m_zi*wf_psi(ii, 1)*wf_psi_conj(ii, 2)*kpoint(i_dim))
2101 jp(ii, i_dim, 3) = jp(ii, i_dim, 3) + real(c_tmp, real64)
2102 jp(ii, i_dim, 4) = jp(ii, i_dim, 4) + aimag(c_tmp)
2103 end do
2104 end if
2105 end if
2106 end if
2107
2108 ! the expression for the paramagnetic current with spinors is
2109 ! t = ( tau(1) tau(3) + i tau(4) )
2110 ! ( tau(3) - i tau(4) tau(2) )
2111 if (associated(tau)) then
2112 tau(1:gr%np, is) = tau(1:gr%np, is) + ww*(abs_gwf_psi(1:gr%np,1) &
2113 - m_two*aimag(psi_gpsi(1:gr%np, 1))*kpoint(i_dim))
2114 if (st%d%ispin == spinors) then
2115 tau(1:gr%np, 2) = tau(1:gr%np, 2) + ww*(abs_gwf_psi(1:gr%np, 2) &
2116 - m_two*aimag(psi_gpsi(1:gr%np, 2))*kpoint(i_dim))
2117 !$omp parallel do private(c_tmp)
2118 do ii = 1, gr%np
2119 c_tmp = ww * ( gwf_psi(ii, i_dim, 1)*conjg(gwf_psi(ii, i_dim, 2)) &
2120 + m_zi * (gwf_psi(ii,i_dim,1)*wf_psi_conj(ii, 2) &
2121 - wf_psi(ii, 1)*conjg(gwf_psi(ii,i_dim,2)))*kpoint(i_dim))
2122 tau(ii, 3) = tau(ii, 3) + real(c_tmp, real64)
2123 tau(ii, 4) = tau(ii, 4) + aimag(c_tmp)
2124 end do
2125 end if
2126 end if
2127
2128 end do
2129
2130 end do
2131 end do
2132
2133 safe_deallocate_a(wf_psi_conj)
2134 safe_deallocate_a(abs_wf_psi)
2135 safe_deallocate_a(abs_gwf_psi)
2136 safe_deallocate_a(psi_gpsi)
2137
2138 if (.not. present(gi_kinetic_energy_density)) then
2139 if (.not. present(paramagnetic_current)) then
2140 safe_deallocate_p(jp)
2141 end if
2142 if (.not. present(kinetic_energy_density)) then
2143 safe_deallocate_p(tau)
2144 end if
2145 end if
2146
2147 if (st%parallel_in_states .or. st%d%kpt%parallel) call reduce_all(st%st_kpt_mpi_grp)
2148
2149 ! We have to symmetrize everything as they are calculated from the
2150 ! wavefunctions.
2151 ! This must be done before compute the gauge-invariant kinetic energy density
2152 if (st%symmetrize_density) then
2153 do is = 1, st%d%nspin
2154 if (associated(tau)) then
2155 call dgrid_symmetrize_scalar_field(gr, tau(:, is), suppress_warning = .true.)
2156 end if
2157
2158 if (present(density_laplacian)) then
2159 call dgrid_symmetrize_scalar_field(gr, density_laplacian(:, is), suppress_warning = .true.)
2160 end if
2161
2162 if (associated(jp)) then
2163 call dgrid_symmetrize_vector_field(gr, jp(:, :, is), suppress_warning = .true.)
2164 end if
2165
2166 if (present(density_gradient)) then
2167 call dgrid_symmetrize_vector_field(gr, density_gradient(:, :, is), suppress_warning = .true.)
2168 end if
2169 end do
2170 end if
2171
2172
2173 if (allocated(st%rho_core) .and. nlcc .and. (present(density_laplacian) .or. present(density_gradient))) then
2174 do ii = 1, gr%np
2175 wf_psi(ii, 1) = st%rho_core(ii)/st%d%spin_channels
2176 end do
2177
2178 call boundaries_set(gr%der%boundaries, gr, wf_psi(:, 1))
2179
2180 if (present(density_gradient)) then
2181 ! calculate gradient of the NLCC
2182 call zderivatives_grad(gr%der, wf_psi(:,1), gwf_psi(:,:,1), set_bc = .false.)
2183 do is = 1, st%d%spin_channels
2184 density_gradient(1:gr%np, 1:gr%der%dim, is) = density_gradient(1:gr%np, 1:gr%der%dim, is) + &
2185 real(gwf_psi(1:gr%np, 1:gr%der%dim,1))
2186 end do
2187 end if
2188
2189 ! calculate the Laplacian of the wavefunction
2190 if (present(density_laplacian)) then
2191 call zderivatives_lapl(gr%der, wf_psi(:,1), lwf_psi(:,1), set_bc = .false.)
2192
2193 do is = 1, st%d%spin_channels
2194 density_laplacian(1:gr%np, is) = density_laplacian(1:gr%np, is) + real(lwf_psi(1:gr%np, 1))
2195 end do
2196 end if
2197 end if
2198
2199 !If we freeze some of the orbitals, we need to had the contributions here
2200 !Only in the case we are not computing it
2201 if (allocated(st%frozen_tau) .and. .not. present(st_end)) then
2202 call lalg_axpy(gr%np, st%d%nspin, m_one, st%frozen_tau, tau)
2203 end if
2204 if (allocated(st%frozen_gdens) .and. .not. present(st_end)) then
2205 do is = 1, st%d%nspin
2206 call lalg_axpy(gr%np, gr%der%dim, m_one, st%frozen_gdens(:,:,is), density_gradient(:,:,is))
2207 end do
2208 end if
2209 if (allocated(st%frozen_tau) .and. .not. present(st_end)) then
2210 call lalg_axpy(gr%np, st%d%nspin, m_one, st%frozen_ldens, density_laplacian)
2211 end if
2212
2213 safe_deallocate_a(wf_psi)
2214 safe_deallocate_a(gwf_psi)
2215 safe_deallocate_a(lwf_psi)
2216
2217
2218 !We compute the gauge-invariant kinetic energy density
2219 if (present(gi_kinetic_energy_density)) then
2220 do is = 1, st%d%nspin
2221 assert(associated(tau))
2222 gi_kinetic_energy_density(1:gr%np, is) = tau(1:gr%np, is)
2223 end do
2224 if (states_are_complex(st)) then
2225 assert(associated(jp))
2226 if (st%d%ispin /= spinors) then
2227 do is = 1, st%d%nspin
2228 !$omp parallel do
2229 do ii = 1, gr%np
2230 if (st%rho(ii, is) < 1.0e-7_real64) cycle
2231 gi_kinetic_energy_density(ii, is) = &
2232 gi_kinetic_energy_density(ii, is) - sum(jp(ii,1:gr%der%dim, is)**2)/st%rho(ii, is)
2233 end do
2234 end do
2235 else ! Note that this is only the U(1) part of the gauge-invariant KED
2236 !$omp parallel do
2237 do ii = 1, gr%np
2238 gi_kinetic_energy_density(ii, 1) = gi_kinetic_energy_density(ii, 1) &
2239 - sum(jp(ii,1:gr%der%dim, 1)**2)/(safe_tol(st%rho(ii, 1),m_epsilon))
2240 gi_kinetic_energy_density(ii, 2) = gi_kinetic_energy_density(ii, 2) &
2241 - sum(jp(ii,1:gr%der%dim, 2)**2)/(safe_tol(st%rho(ii, 2),m_epsilon))
2242 gi_kinetic_energy_density(ii, 3) = &
2243 gi_kinetic_energy_density(ii, 3) - sum(jp(ii,1:gr%der%dim, 3)**2 + jp(ii,1:gr%der%dim, 4)**2) &
2244 /(safe_tol((st%rho(ii, 3)**2 + st%rho(ii, 4)**2), m_epsilon))*st%rho(ii, 3)
2245 gi_kinetic_energy_density(ii, 4) = &
2246 gi_kinetic_energy_density(ii, 4) + sum(jp(ii,1:gr%der%dim, 3)**2 + jp(ii,1:gr%der%dim, 4)**2) &
2247 /(safe_tol((st%rho(ii, 3)**2 + st%rho(ii, 4)**2), m_epsilon))*st%rho(ii, 4)
2248 end do
2249 end if
2250 end if
2251 end if
2252
2253 if (.not. present(kinetic_energy_density)) then
2254 safe_deallocate_p(tau)
2255 end if
2256 if (.not. present(paramagnetic_current)) then
2257 safe_deallocate_p(jp)
2258 end if
2259
2260
2262
2263 call profiling_out("STATES_CALC_QUANTITIES")
2264
2265 contains
2266
2267 subroutine reduce_all(grp)
2268 type(mpi_grp_t), intent(in) :: grp
2269
2271
2272 if (associated(tau)) call comm_allreduce(grp, tau, dim = (/gr%np, st%d%nspin/))
2273
2274 if (present(density_laplacian)) call comm_allreduce(grp, density_laplacian, dim = (/gr%np, st%d%nspin/))
2275
2276 do is = 1, st%d%nspin
2277 if (associated(jp)) call comm_allreduce(grp, jp(:, :, is), dim = (/gr%np, gr%der%dim/))
2278
2279 if (present(density_gradient)) then
2280 call comm_allreduce(grp, density_gradient(:, :, is), dim = (/gr%np, gr%der%dim/))
2281 end if
2282 end do
2283
2285 end subroutine reduce_all
2286
2287 end subroutine states_elec_calc_quantities
2288
2289
2290 ! ---------------------------------------------------------
2292 !
2293 function state_spin(mesh, f1) result(spin)
2294 type(mesh_t), intent(in) :: mesh
2295 complex(real64), intent(in) :: f1(:, :)
2296 real(real64) :: spin(1:3)
2297
2298 complex(real64) :: z
2299
2300 push_sub(state_spin)
2301
2302 z = zmf_dotp(mesh, f1(:, 1) , f1(:, 2))
2303
2304 spin(1) = m_two*real(z, real64)
2305 spin(2) = m_two*aimag(z)
2306 spin(3) = zmf_nrm2(mesh, f1(:, 1))**2 - zmf_nrm2(mesh, f1(:, 2))**2
2307 spin = m_half*spin ! spin is half the sigma matrix.
2308
2309 pop_sub(state_spin)
2310 end function state_spin
2311
2312 ! ---------------------------------------------------------
2314 !
2315 logical function state_is_local(st, ist)
2316 type(states_elec_t), intent(in) :: st
2317 integer, intent(in) :: ist
2318
2319 push_sub(state_is_local)
2320
2321 state_is_local = ist >= st%st_start.and.ist <= st%st_end
2322
2323 pop_sub(state_is_local)
2324 end function state_is_local
2325
2326 ! ---------------------------------------------------------
2328 !
2329 logical function state_kpt_is_local(st, ist, ik)
2330 type(states_elec_t), intent(in) :: st
2331 integer, intent(in) :: ist
2332 integer, intent(in) :: ik
2333
2334 push_sub(state_kpt_is_local)
2335
2336 state_kpt_is_local = ist >= st%st_start .and. ist <= st%st_end .and. &
2337 ik >= st%d%kpt%start .and. ik <= st%d%kpt%end
2338
2339 pop_sub(state_kpt_is_local)
2340 end function state_kpt_is_local
2341
2342
2343 ! ---------------------------------------------------------
2345 real(real64) function states_elec_wfns_memory(st, mesh) result(memory)
2346 type(states_elec_t), intent(in) :: st
2347 class(mesh_t), intent(in) :: mesh
2348
2349 push_sub(states_elec_wfns_memory)
2350 memory = m_zero
2351
2352 ! orbitals
2353 memory = memory + real64*real(mesh%np_part_global, real64) *st%d%dim*real(st%nst, real64) *st%d%kpt%nglobal
2354
2356 end function states_elec_wfns_memory
2357
2358 ! ---------------------------------------------------------
2361 subroutine states_elec_pack(st, copy)
2362 class(states_elec_t), intent(inout) :: st
2363 logical, optional, intent(in) :: copy
2364
2365 integer :: iqn, ib
2366 integer(int64) :: max_mem, mem
2367
2368 push_sub(states_elec_pack)
2369
2370 ! nothing to do, already packed
2371 if (st%packed) then
2372 pop_sub(states_elec_pack)
2373 return
2374 end if
2375
2376 st%packed = .true.
2377
2378 if (accel_is_enabled()) then
2379 max_mem = accel_global_memory_size()
2380
2381 if (st%cl_states_mem > m_one) then
2382 max_mem = int(st%cl_states_mem, int64)*(1024_8)**2
2383 else if (st%cl_states_mem < 0.0_real64) then
2384 max_mem = max_mem + int(st%cl_states_mem, int64)*(1024_8)**2
2385 else
2386 max_mem = int(st%cl_states_mem*real(max_mem, real64) , int64)
2387 end if
2388 else
2389 max_mem = huge(max_mem)
2390 end if
2391
2392 mem = 0
2393 qnloop: do iqn = st%d%kpt%start, st%d%kpt%end
2394 do ib = st%group%block_start, st%group%block_end
2395
2396 mem = mem + st%group%psib(ib, iqn)%pack_total_size()
2397
2398 if (mem > max_mem) then
2399 call messages_write('Not enough CL device memory to store all states simultaneously.', new_line = .true.)
2400 call messages_write('Only ')
2401 call messages_write(ib - st%group%block_start)
2402 call messages_write(' of ')
2403 call messages_write(st%group%block_end - st%group%block_start + 1)
2404 call messages_write(' blocks will be stored in device memory.', new_line = .true.)
2405 call messages_warning()
2406 exit qnloop
2407 end if
2409 call st%group%psib(ib, iqn)%do_pack(copy)
2410 end do
2411 end do qnloop
2412
2413 pop_sub(states_elec_pack)
2414 end subroutine states_elec_pack
2415
2416 ! ------------------------------------------------------------
2418 !
2419 subroutine states_elec_unpack(st, copy)
2420 class(states_elec_t), intent(inout) :: st
2421 logical, optional, intent(in) :: copy
2423 integer :: iqn, ib
2424
2425 push_sub(states_elec_unpack)
2426
2427 if (st%packed) then
2428 st%packed = .false.
2429
2430 do iqn = st%d%kpt%start, st%d%kpt%end
2431 do ib = st%group%block_start, st%group%block_end
2432 if (st%group%psib(ib, iqn)%is_packed()) call st%group%psib(ib, iqn)%do_unpack(copy)
2433 end do
2434 end do
2435 end if
2436
2437 pop_sub(states_elec_unpack)
2438 end subroutine states_elec_unpack
2439
2440 ! -----------------------------------------------------------
2442 !
2443 subroutine states_elec_write_info(st, namespace)
2444 class(states_elec_t), intent(in) :: st
2445 type(namespace_t), intent(in) :: namespace
2446
2447 push_sub(states_elec_write_info)
2448
2449 call messages_print_with_emphasis(msg="States", namespace=namespace)
2450
2451 write(message(1), '(a,f12.3)') 'Total electronic charge = ', st%qtot
2452 write(message(2), '(a,i8)') 'Number of states = ', st%nst
2453 write(message(3), '(a,i8)') 'States block-size = ', st%block_size
2454 call messages_info(3, namespace=namespace)
2455
2456 call messages_print_with_emphasis(namespace=namespace)
2457
2458 pop_sub(states_elec_write_info)
2459 end subroutine states_elec_write_info
2460
2461 ! ------------------------------------------------------------
2463 !
2464 subroutine states_elec_set_zero(st)
2465 class(states_elec_t), intent(inout) :: st
2466
2467 integer :: iqn, ib
2468
2469 push_sub(states_elec_set_zero)
2470
2471 do iqn = st%d%kpt%start, st%d%kpt%end
2472 do ib = st%group%block_start, st%group%block_end
2473 call batch_set_zero(st%group%psib(ib, iqn))
2474 end do
2475 end do
2476
2477 pop_sub(states_elec_set_zero)
2478 end subroutine states_elec_set_zero
2479
2480 ! ------------------------------------------------------------
2482 !
2483 integer pure function states_elec_block_min(st, ib) result(range)
2484 type(states_elec_t), intent(in) :: st
2485 integer, intent(in) :: ib
2486
2487 range = st%group%block_range(ib, 1)
2488 end function states_elec_block_min
2489
2490 ! ------------------------------------------------------------
2492 !
2493 integer pure function states_elec_block_max(st, ib) result(range)
2494 type(states_elec_t), intent(in) :: st
2495 integer, intent(in) :: ib
2496
2497 range = st%group%block_range(ib, 2)
2498 end function states_elec_block_max
2499
2500 ! ------------------------------------------------------------
2502 !
2503 integer pure function states_elec_block_size(st, ib) result(size)
2504 type(states_elec_t), intent(in) :: st
2505 integer, intent(in) :: ib
2506
2507 size = st%group%block_size(ib)
2508 end function states_elec_block_size
2509
2510 ! ---------------------------------------------------------
2513 subroutine states_elec_count_pairs(st, namespace, n_pairs, n_occ, n_unocc, is_included, is_frac_occ)
2514 type(states_elec_t), intent(in) :: st
2515 type(namespace_t), intent(in) :: namespace
2516 integer, intent(out) :: n_pairs
2517 integer, intent(out) :: n_occ(:)
2518 integer, intent(out) :: n_unocc(:)
2519 logical, allocatable, intent(out) :: is_included(:,:,:)
2521 logical, intent(out) :: is_frac_occ
2522
2523 integer :: ik, ist, ast, n_filled, n_partially_filled, n_half_filled
2524 character(len=80) :: nst_string, default, wfn_list
2525 real(real64) :: energy_window
2526
2527 push_sub(states_elec_count_pairs)
2528
2529 is_frac_occ = .false.
2530 do ik = 1, st%nik
2531 call occupied_states(st, namespace, ik, n_filled, n_partially_filled, n_half_filled)
2532 if (n_partially_filled > 0 .or. n_half_filled > 0) is_frac_occ = .true.
2533 n_occ(ik) = n_filled + n_partially_filled + n_half_filled
2534 n_unocc(ik) = st%nst - n_filled
2535 ! when we implement occupations, partially occupied levels need to be counted as both occ and unocc.
2536 end do
2537
2538 !%Variable CasidaKSEnergyWindow
2539 !%Type float
2540 !%Section Linear Response::Casida
2541 !%Description
2542 !% An alternative to <tt>CasidaKohnShamStates</tt> for specifying which occupied-unoccupied
2543 !% transitions will be used: all those whose eigenvalue differences are less than this
2544 !% number will be included. If a value less than 0 is supplied, this criterion will not be used.
2545 !%End
2546
2547 call parse_variable(namespace, 'CasidaKSEnergyWindow', -m_one, energy_window, units_inp%energy)
2548
2549 !%Variable CasidaKohnShamStates
2550 !%Type string
2551 !%Section Linear Response::Casida
2552 !%Default all states
2553 !%Description
2554 !% The calculation of the excitation spectrum of a system in the Casida frequency-domain
2555 !% formulation of linear-response time-dependent density functional theory (TDDFT)
2556 !% implies the use of a basis set of occupied/unoccupied Kohn-Sham orbitals. This
2557 !% basis set should, in principle, include all pairs formed by all occupied states,
2558 !% and an infinite number of unoccupied states. In practice, one has to truncate this
2559 !% basis set, selecting a number of occupied and unoccupied states that will form the
2560 !% pairs. These states are specified with this variable. If there are, say, 15 occupied
2561 !% states, and one sets this variable to the value "10-18", this means that occupied
2562 !% states from 10 to 15, and unoccupied states from 16 to 18 will be considered.
2563 !%
2564 !% This variable is a string in list form, <i>i.e.</i> expressions such as "1,2-5,8-15" are
2565 !% valid. You should include a non-zero number of unoccupied states and a non-zero number
2566 !% of occupied states.
2567 !%End
2568
2569 n_pairs = 0
2570 safe_allocate(is_included(maxval(n_occ), minval(n_occ) + 1:st%nst , st%nik))
2571 is_included(:,:,:) = .false.
2572
2573 if (energy_window < m_zero) then
2574 write(nst_string,'(i6)') st%nst
2575 write(default,'(a,a)') "1-", trim(adjustl(nst_string))
2576 call parse_variable(namespace, 'CasidaKohnShamStates', default, wfn_list)
2577
2578 write(message(1),'(a,a)') "Info: States that form the basis: ", trim(wfn_list)
2579 call messages_info(1, namespace=namespace)
2580
2581 ! count pairs
2582 n_pairs = 0
2583 do ik = 1, st%nik
2584 do ast = n_occ(ik) + 1, st%nst
2585 if (loct_isinstringlist(ast, wfn_list)) then
2586 do ist = 1, n_occ(ik)
2587 if (loct_isinstringlist(ist, wfn_list)) then
2588 n_pairs = n_pairs + 1
2589 is_included(ist, ast, ik) = .true.
2590 end if
2591 end do
2592 end if
2593 end do
2594 end do
2595
2596 else ! using CasidaKSEnergyWindow
2597
2598 write(message(1),'(a,f12.6,a)') "Info: including transitions with energy < ", &
2599 units_from_atomic(units_out%energy, energy_window), trim(units_abbrev(units_out%energy))
2600 call messages_info(1, namespace=namespace)
2601
2602 ! count pairs
2603 n_pairs = 0
2604 do ik = 1, st%nik
2605 do ast = n_occ(ik) + 1, st%nst
2606 do ist = 1, n_occ(ik)
2607 if (st%eigenval(ast, ik) - st%eigenval(ist, ik) < energy_window) then
2608 n_pairs = n_pairs + 1
2609 is_included(ist, ast, ik) = .true.
2610 end if
2611 end do
2612 end do
2613 end do
2614
2615 end if
2616
2618 end subroutine states_elec_count_pairs
2619
2620
2636 !
2637 subroutine occupied_states(st, namespace, ik, n_filled, n_partially_filled, n_half_filled, &
2638 filled, partially_filled, half_filled)
2639 type(states_elec_t), intent(in) :: st
2640 type(namespace_t), intent(in) :: namespace
2641 integer, intent(in) :: ik
2642 integer, intent(out) :: n_filled, n_partially_filled, n_half_filled
2643 integer, optional, intent(out) :: filled(:), partially_filled(:), half_filled(:)
2644
2645 integer :: ist
2646
2647 push_sub(occupied_states)
2648
2649 if (present(filled)) filled(:) = 0
2650 if (present(partially_filled)) partially_filled(:) = 0
2651 if (present(half_filled)) half_filled(:) = 0
2652 n_filled = 0
2653 n_partially_filled = 0
2654 n_half_filled = 0
2655
2656 select case (st%d%ispin)
2657 case (unpolarized)
2658 do ist = 1, st%nst
2659 if (abs(st%occ(ist, ik) - m_two) < m_min_occ) then
2660 n_filled = n_filled + 1
2661 if (present(filled)) filled(n_filled) = ist
2662 else if (abs(st%occ(ist, ik) - m_one) < m_min_occ) then
2663 n_half_filled = n_half_filled + 1
2664 if (present(half_filled)) half_filled(n_half_filled) = ist
2665 else if (st%occ(ist, ik) > m_min_occ) then
2666 n_partially_filled = n_partially_filled + 1
2667 if (present(partially_filled)) partially_filled(n_partially_filled) = ist
2668 else if (abs(st%occ(ist, ik)) > m_min_occ) then
2669 write(message(1),*) 'Internal error in occupied_states: Illegal occupation value ', st%occ(ist, ik)
2670 call messages_fatal(1, namespace=namespace)
2671 end if
2672 end do
2673 case (spin_polarized, spinors)
2674 do ist = 1, st%nst
2675 if (abs(st%occ(ist, ik)-m_one) < m_min_occ) then
2676 n_filled = n_filled + 1
2677 if (present(filled)) filled(n_filled) = ist
2678 else if (st%occ(ist, ik) > m_min_occ) then
2679 n_partially_filled = n_partially_filled + 1
2680 if (present(partially_filled)) partially_filled(n_partially_filled) = ist
2681 else if (abs(st%occ(ist, ik)) > m_min_occ) then
2682 write(message(1),*) 'Internal error in occupied_states: Illegal occupation value ', st%occ(ist, ik)
2683 call messages_fatal(1, namespace=namespace)
2684 end if
2685 end do
2686 end select
2687
2688 pop_sub(occupied_states)
2689 end subroutine occupied_states
2690
2691
2693 subroutine kpoints_distribute(this, mc)
2694 type(states_elec_t), intent(inout) :: this
2695 type(multicomm_t), intent(in) :: mc
2696
2697 push_sub(kpoints_distribute)
2698 call distributed_init(this%d%kpt, this%nik, mc%group_comm(p_strategy_kpoints), "k-points")
2699
2700 pop_sub(kpoints_distribute)
2701 end subroutine kpoints_distribute
2702
2703
2704 ! TODO(Alex) Issue #824. Consider converting this to a function to returns `st_kpt_task`
2705 ! as this is only called in a couple of places, or package with the `st_kpt_mpi_grp` when split
2706 ! from st instance
2709 type(states_elec_t), intent(inout) :: st
2710
2712
2713 if (.not. allocated(st%st_kpt_task)) then
2714 safe_allocate(st%st_kpt_task(0:st%st_kpt_mpi_grp%size-1, 1:4))
2715 end if
2716
2717 st%st_kpt_task(0:st%st_kpt_mpi_grp%size-1, :) = 0
2718 st%st_kpt_task(st%st_kpt_mpi_grp%rank, :) = [st%st_start, st%st_end, st%d%kpt%start, st%d%kpt%end]
2719
2720 if (st%parallel_in_states .or. st%d%kpt%parallel) then
2721 call comm_allreduce(st%st_kpt_mpi_grp, st%st_kpt_task)
2722 end if
2723
2726
2727 ! ---------------------------------------------------------
2729 !
2730 subroutine states_elec_choose_kpoints(st, kpoints, namespace)
2731 type(states_elec_t), target, intent(inout) :: st
2732 type(kpoints_t), intent(in) :: kpoints
2733 type(namespace_t), intent(in) :: namespace
2734
2735 integer :: ik, iq
2736 type(states_elec_dim_t), pointer :: dd
2737
2738
2740
2741 dd => st%d
2742
2743 st%nik = kpoints_number(kpoints)
2744
2745 if (dd%ispin == spin_polarized) st%nik = 2*st%nik
2746
2747 safe_allocate(st%kweights(1:st%nik))
2748
2749 do iq = 1, st%nik
2750 ik = dd%get_kpoint_index(iq)
2751 st%kweights(iq) = kpoints%get_weight(ik)
2752 end do
2753
2754 if (debug%info) call print_kpoints_debug
2756
2757 contains
2758 subroutine print_kpoints_debug
2759 integer :: iunit
2760
2762
2763 call io_mkdir('debug/', namespace)
2764 iunit = io_open('debug/kpoints', namespace, action = 'write')
2765 call kpoints%write_info(iunit=iunit, absolute_coordinates = .true.)
2766 call io_close(iunit)
2767
2769 end subroutine print_kpoints_debug
2770
2771 end subroutine states_elec_choose_kpoints
2772
2777 !
2778 function states_elec_calculate_dipole(this, gr) result(dipole)
2779 class(states_elec_t), intent(in) :: this
2780 class(mesh_t), intent(in) :: gr
2781 real(real64) :: dipole(1:gr%box%dim)
2782
2783 integer :: ispin
2784 real(real64) :: e_dip(1:gr%box%dim, this%d%spin_channels)
2785
2787
2788 do ispin = 1, this%d%spin_channels
2789 call dmf_dipole(gr, this%rho(:, ispin), e_dip(:, ispin))
2790 end do
2791
2792 dipole(:) = sum(e_dip(:, 1:this%d%spin_channels), 2) ! dipole moment <mu_el> = \sum_i -e <x_i>
2793
2795 end function states_elec_calculate_dipole
2796
2797
2798#include "undef.F90"
2799#include "real.F90"
2800#include "states_elec_inc.F90"
2802#include "undef.F90"
2803#include "complex.F90"
2804#include "states_elec_inc.F90"
2805#include "undef.F90"
2806
2807end module states_elec_oct_m
2808
2809
2810!! Local Variables:
2811!! mode: f90
2812!! coding: utf-8
2813!! End:
initialize a batch with existing memory
Definition: batch.F90:267
constant times a vector plus a vector
Definition: lalg_basic.F90:171
Prints out to iunit a message in the form: ["InputVariable" = value] where "InputVariable" is given b...
Definition: messages.F90:180
pure logical function, public accel_is_enabled()
Definition: accel.F90:400
type(accel_t), public accel
Definition: accel.F90:270
This module implements batches of mesh functions.
Definition: batch.F90:133
This module implements common operations on batches of mesh functions.
Definition: batch_ops.F90:116
This module provides the BLACS processor grid.
subroutine, public blacs_proc_grid_init(this, mpi_grp, procdim)
Initializes a blacs context from an MPI communicator with topological information.
subroutine, public blacs_proc_grid_end(this)
subroutine, public blacs_proc_grid_copy(cin, cout)
Module implementing boundary conditions in Octopus.
Definition: boundaries.F90:122
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_states
parallelization in states
This module calculates the derivatives (gradients, Laplacians, etc.) of a function.
subroutine, public zderivatives_grad(der, ff, op_ff, ghost_update, set_bc, to_cartesian)
apply the gradient to a mesh function
subroutine, public zderivatives_lapl(der, ff, op_ff, ghost_update, set_bc, factor)
apply the Laplacian to a mesh function
subroutine, public distributed_end(this)
subroutine, public distributed_nullify(this, total)
subroutine, public distributed_init(this, total, comm, tag, scalapack_compat)
Distribute N instances across M processes of communicator comm
subroutine, public distributed_copy(in, out)
@Brief Create a copy of a distributed instance
integer, parameter, public unpolarized
Parameters...
integer, parameter, public spinors
integer, parameter, public spin_polarized
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_fourth
Definition: global.F90:197
complex(real64), parameter, public m_zi
Definition: global.F90:202
real(real64), parameter, public m_epsilon
Definition: global.F90:204
type(conf_t), public conf
Global instance of Octopus configuration.
Definition: global.F90:178
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 dgrid_symmetrize_vector_field(gr, field, suppress_warning)
Definition: grid.F90:687
subroutine, public dgrid_symmetrize_scalar_field(gr, field, suppress_warning)
Definition: grid.F90:661
Definition: io.F90:114
logical pure function, public kpoints_point_is_gamma(this, ik)
Definition: kpoints.F90:1549
This module is intended to contain "only mathematical" functions and procedures.
Definition: math.F90:115
integer pure function, public pad_pow2(size)
create array size, which is padded to powers of 2
Definition: math.F90:887
This module defines functions over batches of mesh functions.
Definition: mesh_batch.F90:116
subroutine, public zmesh_batch_exchange_points(mesh, aa, forward_map, backward_map)
This functions exchanges points of a mesh according to a certain map. Two possible maps can be given....
subroutine, public dmesh_batch_exchange_points(mesh, aa, forward_map, backward_map)
This functions exchanges points of a mesh according to a certain map. Two possible maps can be given....
This module defines various routines, operating on mesh functions.
subroutine, public zmf_random(mesh, ff, pre_shift, post_shift, seed, normalized)
This subroutine fills a function with random values.
subroutine, public dmf_random(mesh, ff, pre_shift, post_shift, seed, normalized)
This subroutine fills a function with random values.
subroutine, public zmf_normalize(mesh, dim, psi, norm)
Normalize a mesh function psi.
This module defines the meshes, which are used in Octopus.
Definition: mesh.F90:118
subroutine, public messages_not_implemented(feature, namespace)
Definition: messages.F90:1113
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
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_input_error(namespace, var, details, row, column)
Definition: messages.F90:713
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
general module for modelmb particles
subroutine, public modelmb_particles_end(this)
subroutine, public modelmb_particles_init(this, namespace, space)
==============================================================
subroutine, public modelmb_particles_copy(modelmb_out, modelmb_in)
subroutine mpi_grp_copy(mpi_grp_out, mpi_grp_in)
Definition: mpi.F90:403
type(mpi_comm), parameter, public mpi_comm_undefined
used to indicate a communicator has not been initialized
Definition: mpi.F90:136
subroutine mpi_grp_init(grp, comm)
Initialize MPI group instance.
Definition: mpi.F90:346
This module handles the communicators for the various parallelization strategies.
Definition: multicomm.F90:145
logical pure function, public multicomm_strategy_is_parallel(mc, level)
Definition: multicomm.F90:925
subroutine, public multicomm_all_pairs_copy(apout, apin)
Definition: multicomm.F90:246
logical pure function, public multicomm_have_slaves(this)
Definition: multicomm.F90:1141
subroutine, public multicomm_create_all_pairs(mpi_grp, ap)
This routine uses the one-factorization (or near-one-factorization of a complete graph to construct a...
Definition: multicomm.F90:943
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 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 restart_read(restart, iunit, lines, nlines, ierr)
Definition: restart.F90:935
subroutine, public restart_close(restart, iunit)
Close a file previously opened with restart_open.
Definition: restart.F90:952
integer function, public restart_open(restart, filename, status, position, silent)
Open file "filename" found inside the current restart directory. Depending on the type of restart,...
Definition: restart.F90:861
subroutine, public smear_fill_occupations(this, eigenvalues, occupations, nik, nst)
Definition: smear.F90:529
subroutine, public smear_find_fermi_energy(this, namespace, eigenvalues, occupations, qtot, nik, nst, kweights)
Definition: smear.F90:344
subroutine, public smear_copy(to, from)
Definition: smear.F90:323
integer, parameter, public smear_fixed_occ
Definition: smear.F90:171
subroutine, public smear_init(this, namespace, ispin, fixed_occ, integral_occs, kpoints)
Definition: smear.F90:185
logical pure function, public smear_is_semiconducting(this)
Definition: smear.F90:833
subroutine, public states_set_complex(st)
pure logical function, public states_are_complex(st)
pure logical function, public states_are_real(st)
This module handles spin dimensions of the states and the k-point distribution.
subroutine, public states_elec_dim_copy(dout, din)
subroutine, public states_elec_dim_end(dim)
This module handles groups of electronic batches and their parallel distribution.
subroutine, public states_elec_group_copy(d, group_in, group_out, copy_data, special)
make a copy of a group
subroutine, public states_elec_group_end(this, d)
finalize the local blocks of wave functions and release local arrays
real(real64) function, public states_elec_wfns_memory(st, mesh)
return the memory usage of a states_elec_t object
integer pure function, public states_elec_block_max(st, ib)
return index of last state in block ib
subroutine zstates_elec_generate_random_vector(mesh, st, vector, normalized, reset_seed)
Generate a random vector.
subroutine, public states_elec_null(st)
subroutine, public states_elec_distribute_nodes(st, namespace, mc)
@Brief. Distribute states over the processes for states parallelization
subroutine, public states_elec_fermi(st, namespace, mesh, compute_spin)
calculate the Fermi level for the states in this object
logical function, public state_kpt_is_local(st, ist, ik)
check whether a given state (ist, ik) is on the local node
subroutine, public states_elec_calc_quantities(gr, st, kpoints, nlcc, kinetic_energy_density, paramagnetic_current, density_gradient, density_laplacian, gi_kinetic_energy_density, st_end)
calculated selected quantities
real(real64) function, dimension(1:gr%box%dim) states_elec_calculate_dipole(this, gr)
calculate the expectation value of the dipole moment of electrons
subroutine, public states_elec_densities_init(st, gr)
subroutine, public states_elec_end(st)
finalize the states_elec_t object
subroutine zstates_elec_get_state1(st, mesh, idim, ist, iqn, psi)
Write one component (dim) of a wave function into a state_elec_t object.
subroutine, public states_elec_deallocate_wfns(st)
Deallocates the KS wavefunctions defined within a states_elec_t structure.
subroutine, public states_elec_allocate_wfns(st, mesh, wfs_type, skip, packed)
Allocates the KS wavefunctions defined within a states_elec_t structure.
subroutine zstates_elec_get_points1(st, start_point, end_point, iqn, psi)
Returns the value of all the states for given k-point in the range of points [start_point:end_point].
subroutine states_elec_read_initial_occs(st, namespace, excess_charge, kpoints)
Reads from the input file the initial occupations, if the block "Occupations" is present....
subroutine, public states_elec_init(st, namespace, space, valence_charge, kpoints)
Initialize a new states_elec_t object.
subroutine zstates_elec_set_state1(st, mesh, idim, ist, iqn, psi)
get one dimension of local wave function for given k-point and states index from a states_elec_t obje...
real(real64) function, public states_elec_eigenvalues_sum(st, alt_eig)
function to calculate the eigenvalues sum using occupations as weights
integer, parameter, public par_independent
Method used to generate random states.
subroutine dstates_elec_generate_random_vector(mesh, st, vector, normalized, reset_seed)
Generate a random vector.
subroutine, public occupied_states(st, namespace, ik, n_filled, n_partially_filled, n_half_filled, filled, partially_filled, half_filled)
return information about occupied orbitals in many-body state
subroutine dstates_elec_get_state2(st, mesh, ist, iqn, psi)
Write a wave function into a state_elec_t object.
subroutine zstates_elec_set_state2(st, mesh, ist, iqn, psi)
get local wave function for given k-point and states index from a states_elec_t object
subroutine zstates_elec_get_state2(st, mesh, ist, iqn, psi)
Write a wave function into a state_elec_t object.
subroutine dstates_elec_get_points1(st, start_point, end_point, iqn, psi)
Returns the value of all the states for given k-point in the range of points [start_point:end_point].
integer pure function, public states_elec_block_size(st, ib)
return number of states in block ib
subroutine, public kpoints_distribute(this, mc)
distribute k-points over the nodes in the corresponding communicator
integer, parameter, public par_dependent
subroutine states_elec_pack(st, copy)
pack the batches in this states object
subroutine, public states_elec_choose_kpoints(st, kpoints, namespace)
double up k-points for SPIN_POLARIZED calculations
subroutine zstates_elec_get_state3(st, mesh, iqn, psi)
get local wave functions for given k-point from a states_elec_t object
logical function, public state_is_local(st, ist)
check whether a given state (ist) is on the local node
subroutine dstates_elec_set_state1(st, mesh, idim, ist, iqn, psi)
get one dimension of local wave function for given k-point and states index from a states_elec_t obje...
subroutine, public states_elec_exec_init(st, namespace, mc)
Further initializations.
subroutine dstates_elec_set_state4(st, mesh, psi)
set all local wave functions in a states_elec_t object
subroutine dstates_elec_set_state3(st, mesh, iqn, psi)
set local wave functions for given k-point in a states_elec_t object
subroutine states_elec_write_info(st, namespace)
write information about the states object
subroutine states_elec_init_block(st, mesh, verbose, skip, packed)
Initializes the data components in st that describe how the states are distributed in blocks:
real(real64) function, dimension(1:3) state_spin(mesh, f1)
calculate the spin vector for a spinor wave function f1
subroutine states_elec_kpoints_distribution(st)
Assign the start and end indices for states and kpoints, for "st_kpt_mpi_grp" communicator.
subroutine zstates_elec_get_state4(st, mesh, psi)
get all local wave functions from a states_elec_t object
subroutine, public states_elec_copy(stout, stin, exclude_wfns, exclude_eigenval, special)
make a (selective) copy of a states_elec_t object
subroutine, public states_elec_generate_random(st, mesh, kpoints, ist_start_, ist_end_, ikpt_start_, ikpt_end_, normalized)
randomize states
subroutine dstates_elec_get_state1(st, mesh, idim, ist, iqn, psi)
Write one component (dim) of a wave function into a state_elec_t object.
subroutine dstates_elec_set_state2(st, mesh, ist, iqn, psi)
get local wave function for given k-point and states index from a states_elec_t object
subroutine zstates_elec_set_state4(st, mesh, psi)
set all local wave functions in a states_elec_t object
subroutine states_elec_read_initial_spins(st, namespace)
Reads, if present, the "InitialSpins" block.
subroutine dstates_elec_get_state3(st, mesh, iqn, psi)
get local wave functions for given k-point from a states_elec_t object
subroutine dstates_elec_get_points2(st, start_point, end_point, psi)
Returns the value of all the states in the range of points [start_point:end_point].
integer pure function, public states_elec_block_min(st, ib)
return index of first state in block ib
subroutine states_elec_unpack(st, copy)
unpack the batches in this states object
subroutine, public states_elec_look(restart, nik, dim, nst, ierr)
Reads the 'states' file in the restart directory, and finds out the nik, dim, and nst contained in it...
subroutine dstates_elec_get_state4(st, mesh, psi)
get all local wave functions from a states_elec_t object
subroutine, public states_elec_count_pairs(st, namespace, n_pairs, n_occ, n_unocc, is_included, is_frac_occ)
number of occupied-unoccupied pairs for Casida
subroutine, public states_elec_allocate_current(st, space, mesh)
subroutine, public states_elec_set_zero(st)
expclicitely set all wave functions in the states to zero
subroutine zstates_elec_set_state3(st, mesh, iqn, psi)
set local wave functions for given k-point in a states_elec_t object
subroutine zstates_elec_get_points2(st, start_point, end_point, psi)
Returns the value of all the states in the range of points [start_point:end_point].
type(type_t), public type_float
Definition: types.F90:133
type(type_t), public type_cmplx
Definition: types.F90:134
brief This module defines the class unit_t which is used by the unit_systems_oct_m module.
Definition: unit.F90:132
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 zwfs_elec_init(this, dim, st_start, st_end, np, ik, special, packed)
initialize an empty wfs_elec_t object
Definition: wfs_elec.F90:537
subroutine, public dwfs_elec_init(this, dim, st_start, st_end, np, ik, special, packed)
initialize an empty wfs_elec_t object
Definition: wfs_elec.F90:394
subroutine reduce_all(grp)
subroutine print_kpoints_debug
Class defining batches of mesh functions.
Definition: batch.F90:159
Distribution of N instances over mpi_grpsize processes, for the local rank mpi_grprank....
Extension of space that contains the knowledge of the spin dimension.
Description of the grid, containing information on derivatives, stencil, and symmetries.
Definition: grid.F90:168
Describes mesh distribution to nodes.
Definition: mesh.F90:186
This is defined even when running serial.
Definition: mpi.F90:142
An all-pairs communication schedule for a given group.
Definition: multicomm.F90:235
Stores all communicators and groups.
Definition: multicomm.F90:206
abstract class for states
The states_elec_t class contains all electronic wave functions.
int true(void)