Octopus
lcao.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
19#include "global.h"
20
21module lcao_oct_m
22 use atom_oct_m
24 use batch_oct_m
25 use blacs_oct_m
28 use comm_oct_m
29 use debug_oct_m
31 use epot_oct_m
32 use global_oct_m
33 use grid_oct_m
36 use io_oct_m
38 use ions_oct_m
39 use, intrinsic :: iso_fortran_env
43 use lapack_oct_m
44 use loct_oct_m
46 use math_oct_m
47 use mesh_oct_m
50 use mpi_oct_m
53 use parser_oct_m
55 use ps_oct_m
59 use smear_oct_m
60 use space_oct_m
69 use unit_oct_m
71 use v_ks_oct_m
74
75 implicit none
76
77 private
78 public :: &
79 lcao_t, &
80 lcao_init, &
82 lcao_wf, &
83 lcao_run, &
84 lcao_end, &
86
87 integer, parameter :: &
88 INITRHO_PARAMAGNETIC = 1, &
90 initrho_random = 3, &
92
93 type lcao_t
94 private
95 integer :: mode
96 logical :: complex_ylms
97 logical :: initialized
98 integer :: norbs
99 integer :: maxorbs
100 integer, allocatable :: atom(:)
101 integer, allocatable :: level(:)
102 integer, allocatable :: ddim(:)
103 logical :: alternative
104 logical :: derivative
105 integer, allocatable :: cst(:, :)
106 integer, allocatable :: ck(:, :)
107 real(4), allocatable :: dbuff_single(:, :, :, :)
108 complex(4), allocatable :: zbuff_single(:, :, :, :)
109 real(real64), allocatable :: dbuff(:, :, :, :)
110 complex(real64), allocatable :: zbuff(:, :, :, :)
111 logical :: save_memory
112 logical :: initialized_orbitals
113 real(real64) :: orbital_scale_factor
114
116 logical, allocatable :: is_empty(:)
117 ! !< This occurs in domain parallelization if the atom is not
118 ! !< in the local domain
119
121 logical :: keep_orb
122 real(real64), allocatable :: radius(:)
123 real(real64) :: lapdist
124 integer :: mult
125 integer :: maxorb
127 integer, allocatable :: basis_atom(:)
128 integer, allocatable :: basis_orb(:)
129 integer, allocatable :: atom_orb_basis(:, :)
130 integer, allocatable :: norb_atom(:)
131 logical :: parallel
132 integer :: lsize(1:2)
133 integer :: nproc(1:2)
134 integer :: myroc(1:2)
135 integer :: desc(1:BLACS_DLEN)
136 logical, allocatable :: calc_atom(:)
137 real(real64) :: diag_tol
138 type(submesh_t), allocatable :: sphere(:)
139 type(batch_t), allocatable :: orbitals(:)
140 logical, allocatable :: is_orbital_initialized(:)
141
142 integer :: gmd_opt
143 end type lcao_t
144
145
146
147 real(real64), parameter, public :: default_eigenval = 1.0e10_real64
148
149contains
150
151 ! ---------------------------------------------------------
152 subroutine lcao_init(this, namespace, space, gr, ions, st, st_start)
153 type(lcao_t), intent(out) :: this
154 type(namespace_t), intent(in) :: namespace
155 type(electron_space_t), intent(in) :: space
156 type(grid_t), intent(in) :: gr
157 type(ions_t), intent(in) :: ions
158 type(states_elec_t), intent(in) :: st
159 integer, intent(in) :: st_start
160
161 integer :: ia, n, iorb, jj, maxj, idim
162 integer :: ii, ll, mm, norbs, ii_tmp
163 integer :: mode_default
164 real(real64) :: max_orb_radius, maxradius
165 integer :: iunit_o
166
167 push_sub(lcao_init)
168
169 this%initialized = .true.
170 this%gmd_opt = initrho_userdef
171
172 ! The initial LCAO calculation is done by default if we have species representing atoms.
173 ! Otherwise, it is not the default value and has to be enforced in the input file.
174 mode_default = option__lcaostart__lcao_states
175 if (ions%only_user_def) mode_default = option__lcaostart__lcao_none
176
177 !%Variable LCAOStart
178 !%Type integer
179 !%Section SCF::LCAO
180 !%Description
181 !% Before starting a SCF calculation, <tt>Octopus</tt> can perform
182 !% a linear combination of atomic orbitals (LCAO) calculation.
183 !% These can provide <tt>Octopus</tt> with a good set
184 !% of initial wavefunctions and with a new guess for the density.
185 !% (Up to the current version, only a minimal basis set is used.)
186 !% The default is <tt>lcao_states</tt> if at least one species representing an atom is present.
187 !% The default is <tt>lcao_none</tt> if all species are <tt>species_user_defined</tt>,
188 !% <tt>species_charge_density</tt>, <tt>species_from_file</tt>, or <tt>species_jellium_slab</tt>.
189 !%
190 !% The initial guess densities for LCAO are taken from the atomic orbitals for pseudopotential species;
191 !% from the natural charge density for <tt>species_charge_density</tt>, <tt>species_point</tt>,
192 !% <tt>species_jellium</tt>, and <tt>species_jellium_slab</tt>;
193 !% or uniform for <tt>species_full_delta</tt>, <tt>species_full_gaussian</tt>,
194 !% <tt>species_user_defined</tt>, or <tt>species_from_file</tt>.
195 !% Pseudopotential species use the pseudo-wavefunctions as orbitals, full-potential atomic species
196 !% (<tt>species_full_delta</tt> and <tt>species_full_gaussian</tt>) use hydrogenic wavefunctions, and
197 !% others use harmonic-oscillator wavefunctions.
198 !%
199 !% The LCAO implementation currently does not simultaneously support k-point parallelism and states parallelism.
200 !% You must select one or the other, or alternatively use lcao_none (random wavefunctions) as an initial guess.
201 !%
202 !% Note: Some pseudopotential files (CPI, FHI for example) do not
203 !% contain full information about the orbitals. In this case,
204 !% Octopus generates the starting density from the normalized
205 !% square root of the local potential. If no orbitals are
206 !% available at all from the pseudopotential files, Octopus will
207 !% not be able to perform an LCAO and the initial states will be
208 !% randomized.
209 !%
210 !%Option lcao_none 0
211 !% Do not perform a LCAO calculation before the SCF cycle. Instead use random wavefunctions.
212 !%Option lcao_states 2
213 !% Do a LCAO calculation before the SCF cycle and use the resulting wavefunctions as
214 !% initial wavefunctions without changing the guess density.
215 !% This will speed up the convergence of the eigensolver during the first SCF iterations.
216 !%Option lcao_full 3
217 !% Do a LCAO calculation before the SCF cycle and use the LCAO wavefunctions to build a new
218 !% guess density and a new KS potential.
219 !% Using the LCAO density as a new guess density may improve the convergence, but can
220 !% also slow it down or yield wrong results (especially for spin-polarized calculations).
221 !%Option lcao_states_batch 4
222 !% (Experimental) Same as lcao_states, but faster for GPUs, large systems and parallel in states.
223 !% It is not working for spinors, however.
224 !% This is not used for unocc calculations at the moment.
225 !%End
226 call parse_variable(namespace, 'LCAOStart', mode_default, this%mode)
227 if (.not. varinfo_valid_option('LCAOStart', this%mode)) call messages_input_error(namespace, 'LCAOStart')
229 call messages_print_var_option('LCAOStart', this%mode, namespace=namespace)
231 ! LCAO alternative not implemented for st_start > 1
232 if (this%mode == option__lcaostart__lcao_states_batch .and. st_start > 1) then
233 message(1) = "LCAOStart = lcao_states_batch not compatible with this run."
234 message(2) = "Please use LCAOStart = lcao_states instead"
235 call messages_fatal(2, namespace=namespace)
236 end if
238 !TODO: Remove the alternative flag
239 this%alternative = this%mode == option__lcaostart__lcao_states_batch
240
241 if (this%mode == option__lcaostart__lcao_none) then
242 pop_sub(lcao_init)
243 return
244 end if
245
246 call messages_obsolete_variable(namespace, 'LCAOAlternative')
248
249 ! DAS: For spinors, you will always get magnetization in (1, 0, 0) direction, and the
250 ! eigenvalues will be incorrect. This is due to confusion between spins and spinors in the code.
251 if (st%d%ispin == spinors .and. this%alternative) then
252 message(1) = "LCAOStart = lcao_states_batch is not working for spinors."
253 call messages_fatal(1, namespace=namespace)
254 end if
255 if (space%is_periodic() .and. this%alternative) then
256 call messages_experimental("LCAOStart = lcao_states_batch in periodic systems", namespace=namespace)
257 ! specifically, if you get the message about submesh radius > box size, results will probably be totally wrong.
258 end if
259
260 !%Variable LCAOComplexYlms
261 !%Type logical
262 !%Default false
263 !%Section SCF::LCAO
264 !%Description
265 !% If set to true, and using complex states, complex spherical harmonics will be used, <i>i.e.</i>
266 !% with <math>e^{\pm i m \phi}</math>.
267 !% If false, real spherical harmonics with <math>\sin(m \phi)</math> or <math>\cos(m \phi)</math> are used.
268 !% This variable will make it more likely to get states that are eigenvectors of the <math>L_z</math>
269 !% operator, with a definite angular momentum.
270 !%End
271
272 if (states_are_complex(st)) then
273 call parse_variable(namespace, 'LCAOComplexYlms', .false., this%complex_ylms)
274 else
275 this%complex_ylms = .false.
276 end if
277
278 !%Variable LCAOSaveMemory
279 !%Type logical
280 !%Default false
281 !%Section SCF::LCAO
282 !%Description
283 !% If set to true, the LCAO will allocate extra memory needed in single precision instead of
284 !% double precision.
285 !%End
286 call parse_variable(namespace, 'LCAOSaveMemory', .false., this%save_memory)
287
288
289 if (debug%info .and. st%system_grp%is_root()) then
290 call io_mkdir('debug/lcao', namespace)
291 iunit_o = io_open('debug/lcao/orbitals', namespace, action='write')
292 write(iunit_o,'(7a6)') 'iorb', 'atom', 'level', 'i', 'l', 'm', 'spin'
293 end if
294
295 if (.not. this%alternative) then
296
297 !%Variable LCAOScaleFactor
298 !%Type float
299 !%Default 1.0
300 !%Section SCF::LCAO
301 !%Description
302 !% The coordinates of the atomic orbitals used by the LCAO
303 !% procedure will be rescaled by the value of this variable. 1.0 means no rescaling.
304 !%End
305 call parse_variable(namespace, 'LCAOScaleFactor', m_one, this%orbital_scale_factor)
306 call messages_print_var_value('LCAOScaleFactor', this%orbital_scale_factor, namespace=namespace)
307
308 !%Variable LCAOMaximumOrbitalRadius
309 !%Type float
310 !%Default 20.0 a.u.
311 !%Section SCF::LCAO
312 !%Description
313 !% The LCAO procedure will ignore orbitals that have an
314 !% extent greater that this value.
315 !%End
316 call parse_variable(namespace, 'LCAOMaximumOrbitalRadius', 20.0_real64, max_orb_radius, unit = units_inp%length)
317 call messages_print_var_value('LCAOMaximumOrbitalRadius', max_orb_radius, units_out%length, namespace=namespace)
318
319 ! count the number of orbitals available
320 maxj = 0
321 this%maxorbs = 0
322 do ia = 1, ions%natoms
323 maxj = max(maxj, ions%atom(ia)%species%get_niwfs())
324 this%maxorbs = this%maxorbs + ions%atom(ia)%species%get_niwfs()
325 end do
326
327 this%maxorbs = this%maxorbs*st%d%dim
328
329 if (this%maxorbs == 0) then
330 call messages_write('The are no atomic orbitals available, cannot do LCAO.')
331 call messages_warning(namespace=namespace)
332 this%mode = option__lcaostart__lcao_none
333 pop_sub(lcao_init)
334 return
335 end if
336
337 ! generate tables to know which indices each atomic orbital has
338
339 safe_allocate( this%atom(1:this%maxorbs))
340 safe_allocate(this%level(1:this%maxorbs))
341 safe_allocate( this%ddim(1:this%maxorbs))
342
343 safe_allocate(this%is_empty(1:this%maxorbs))
344 this%is_empty = .false.
345
346 ! this is determined by the stencil we are using and the spacing
347 this%lapdist = maxval(abs(gr%idx%enlarge)*gr%spacing)
348
349 ! calculate the radius of each orbital
350 safe_allocate(this%radius(1:ions%natoms))
351
352 do ia = 1, ions%natoms
353 norbs = ions%atom(ia)%species%get_niwfs()
354
355 maxradius = m_zero
356 do iorb = 1, norbs
357 call ions%atom(ia)%species%get_iwf_ilm(iorb, 1, ii, ll, mm)
358 ! For all-electron species, we need to use the principal quantum number
359 if(ions%atom(ia)%species%is_full()) call ions%atom(ia)%species%get_iwf_n( iorb, 1, ii)
360 maxradius = max(maxradius, ions%atom(ia)%species%get_iwf_radius( ii, is = 1))
361 end do
362
363 maxradius = min(maxradius, m_two*maxval(gr%box%bounding_box_l(1:space%dim)))
364
365 this%radius(ia) = maxradius
366 end do
367
368
369 ! Each atom provides niwfs pseudo-orbitals (this number is given in
370 ! ions%atom(ia)%species%niwfs for atom number ia). This number is
371 ! actually multiplied by two in case of spin-unrestricted or spinors
372 ! calculations.
373 !
374 ! The pseudo-orbitals are placed in order in the following way (Natoms
375 ! is the total number of atoms).
376 !
377 ! n = 1 => first orbital of atom 1,
378 ! n = 2 => first orbital of atom 2.
379 ! n = 3 => first orbital of atom 3.
380 ! ....
381 ! n = Natoms => first orbital of atom Natoms
382 ! n = Natoms + 1 = > second orbital of atom 1
383 ! ....
384 !
385 ! If at some point in this loop an atom pseudo cannot provide the corresponding
386 ! orbital (because the niws orbitals have been exhausted), it moves on to the following
387 ! atom.
388 !
389 ! In the spinors case, it changes a bit:
390 !
391 ! n = 1 => first spin-up orbital of atom 1, assigned to the spin-up component of the spinor.
392 ! n = 2 => first spin-down orbital of atom 1, assigned to the spin-down component of the spinor.
393 ! n = 3 => first spin-up orbital of atom 2, assigned to the spin-up component of the spinor.
394
395 iorb = 1
396 do jj = 1, maxj
397 do ia = 1, ions%natoms
398 do idim = 1,st%d%dim
399 if (jj > ions%atom(ia)%species%get_niwfs()) cycle
400 call ions%atom(ia)%species%get_iwf_ilm(jj, idim, ii, ll, mm)
401 ! For all-electron species, we need to use the principal quantum number
402 if(ions%atom(ia)%species%is_full()) then
403 ii_tmp = ii
404 call ions%atom(ia)%species%get_iwf_n( ii_tmp, 1, ii)
405 end if
406 if (this%orbital_scale_factor*ions%atom(ia)%species%get_iwf_radius( ii, is = 1) >= max_orb_radius) cycle
407
408 this%atom(iorb) = ia
409 this%level(iorb) = jj
410 this%ddim(iorb) = idim
411
412 if (debug%info .and. st%system_grp%is_root()) then
413 write(iunit_o,'(7i6)') iorb, this%atom(iorb), this%level(iorb), ii, ll, mm, this%ddim(iorb)
414 end if
415
416 iorb = iorb + 1
417 end do
418 end do
419 end do
420
421 if (debug%info .and. st%system_grp%is_root()) then
422 call io_close(iunit_o)
423 end if
424
425 ! some orbitals might have been removed because of their radii
426 if (this%maxorbs /= iorb - 1) then
427 call messages_write('Info: ')
428 call messages_write(this%maxorbs - iorb + 1)
429 call messages_write(' of ')
430 call messages_write(this%maxorbs)
431 call messages_write(' orbitals cannot be used for the LCAO calculation,')
432 call messages_new_line()
433 call messages_write(' their radii exceeds LCAOMaximumOrbitalRadius (')
434 call messages_write(max_orb_radius, units = units_out%length, fmt = '(f6.1)')
435 call messages_write(').')
436 call messages_warning(namespace=namespace)
437
438 this%maxorbs = iorb - 1
439 end if
440
441 if (this%maxorbs < st%nst) then
442 call messages_write('Cannot do LCAO for all states because there are not enough atomic orbitals.')
443 call messages_new_line()
444
445 call messages_write('Required: ')
446 call messages_write(st%nst)
447 call messages_write('. Available: ')
448 call messages_write(this%maxorbs)
449 call messages_write('. ')
450 call messages_write(st%nst - this%maxorbs)
451 call messages_write(' orbitals will be randomized.')
452 call messages_warning(namespace=namespace)
453 end if
454
455 !%Variable LCAODimension
456 !%Type integer
457 !%Section SCF::LCAO
458 !%Description
459 !% (Only applies if <tt>LCAOStart /= lcao_states_batch</tt>.)
460 !% Before starting the SCF cycle, an initial LCAO calculation can be performed
461 !% in order to obtain reasonable initial guesses for spin-orbitals and densities.
462 !% For this purpose, the code calculates a number of atomic orbitals.
463 !% The number available for a species described by a pseudopotential is all the
464 !% orbitals up the maximum angular momentum in the pseudopotential, minus any orbitals that
465 !% are found to be unbound. For non-pseudopotential species, the number is equal to
466 !% twice the valence charge.
467 !% The default dimension for the LCAO basis
468 !% set will be the sum of all these numbers, or twice the number of required orbitals
469 !% for the full calculation, whichever is less.
470 !%
471 !% This dimension however can be changed by making use of this
472 !% variable. Note that <tt>LCAODimension</tt> cannot be smaller than the
473 !% number of orbitals needed in the full calculation -- if
474 !% <tt>LCAODimension</tt> is smaller, it will be silently increased to meet
475 !% this requirement. In the same way, if <tt>LCAODimension</tt> is larger
476 !% than the available number of atomic orbitals, it will be
477 !% reduced. If you want to use the largest possible number, set
478 !% <tt>LCAODimension</tt> to a negative number.
479 !%End
480 call parse_variable(namespace, 'LCAODimension', 0, n)
481
482 if (n > 0 .and. n <= st%nst .and. st%nst <= this%maxorbs) then
483 ! n was made too small
484 this%norbs = st%nst
485 else if (n > st%nst .and. n <= this%maxorbs) then
486 ! n is a reasonable value
487 this%norbs = n
488 else if (n == 0) then
489 ! using the default
490 this%norbs = min(this%maxorbs, 2*st%nst)
491 else
492 ! n was negative, or greater than maxorbs
493 this%norbs = this%maxorbs
494 end if
495
496 assert(this%norbs <= this%maxorbs)
497
498 safe_allocate(this%cst(1:this%norbs, 1:st%d%spin_channels))
499 safe_allocate(this%ck(1:this%norbs, 1:st%d%spin_channels))
500 this%initialized_orbitals = .false.
501 else
502 call lcao2_init()
503 end if
504
505 pop_sub(lcao_init)
506
507 contains
508
509 subroutine lcao2_init()
510 integer :: iatom, iorb, norbs
511 real(real64) :: maxradius
512 integer :: ibasis
513#ifdef HAVE_SCALAPACK
514 integer :: jatom, jorb, jbasis, ilbasis, jlbasis, proc(1:2), info, nbl
515#endif
516 push_sub(lcao_init.lcao2_init)
517
518 call messages_write('Info: Using LCAO batched implementation.')
519 call messages_info(namespace=namespace)
520
521 call messages_experimental('LCAO alternative implementation', namespace=namespace)
522
523 !%Variable LCAOKeepOrbitals
524 !%Type logical
525 !%Default yes
526 !%Section SCF::LCAO
527 !%Description
528 !% Only applies if <tt>LCAOStart = lcao_states_batch</tt>.
529 !% If set to yes (the default) Octopus keeps atomic orbitals in
530 !% memory during the LCAO procedure. If set to no, the orbitals
531 !% are generated each time that they are needed, increasing
532 !% computational time but saving memory.
533 !%
534 !% When set to yes, Octopus prints the amount of memory per node
535 !% that is required to store the orbitals.
536 !%
537 !%End
538 call parse_variable(namespace, 'LCAOKeepOrbitals', .true., this%keep_orb)
539
540 !%Variable LCAOExtraOrbitals
541 !%Type logical
542 !%Default false
543 !%Section SCF::LCAO
544 !%Description
545 !% Only applies if <tt>LCAOStart = lcao_states_batch</tt>, and all species are pseudopotentials.
546 !% (experimental) If this variable is set to yes, the LCAO
547 !% procedure will add an extra set of numerical orbitals (by
548 !% using the derivative of the radial part of the original
549 !% orbitals). Note that this corresponds roughly to adding orbitals
550 !% with higher principal quantum numbers, but the same angular momentum.
551 !% This option may cause problems for unoccupied states since you may miss
552 !% some lower-lying states which correspond to higher angular momenta instead
553 !% of higher principal quantum number.
554 !%End
555 call parse_variable(namespace, 'LCAOExtraOrbitals', .false., this%derivative)
556
557 ! DAS: if you calculate the Na atom this way, spin-polarized, with just one unoccupied state,
558 ! you will obtain states (up and down) which are actually the 10th states if you start with
559 ! random wavefunctions! We really need to implement taking the derivative of the angular part
560 ! instead to be sure of getting decent results!
561
562 if (this%derivative) then
563 call messages_experimental('LCAO extra orbitals', namespace=namespace)
564
565 if (st%nst * st%smear%el_per_state > st%qtot) then
566 message(1) = "Lower-lying empty states may be missed with LCAOExtraOrbitals."
567 call messages_warning(1, namespace=namespace)
568 end if
569 end if
570
571 !%Variable LCAODiagTol
572 !%Type float
573 !%Default 1e-10
574 !%Section SCF::LCAO
575 !%Description
576 !% Only applies if <tt>LCAOStart = lcao_states_batch</tt>.
577 !% The tolerance for the diagonalization of the LCAO Hamiltonian.
578 !%End
579 call parse_variable(namespace, 'LCAODiagTol', 1e-10_real64, this%diag_tol)
580
581 if (this%derivative) then
582 this%mult = 2
583 else
584 this%mult = 1
585 end if
586
587 safe_allocate(this%sphere(1:ions%natoms))
588 safe_allocate(this%orbitals(1:ions%natoms))
589 safe_allocate(this%is_orbital_initialized(1:ions%natoms))
590 this%is_orbital_initialized = .false.
591
592 safe_allocate(this%norb_atom(1:ions%natoms))
593
594 this%maxorb = 0
595 this%norbs = 0
596 do iatom = 1, ions%natoms
597 this%norb_atom(iatom) = this%mult*ions%atom(iatom)%species%get_niwfs()
598 this%maxorb = max(this%maxorb, ions%atom(iatom)%species%get_niwfs())
599 this%norbs = this%norbs + ions%atom(iatom)%species%get_niwfs()
600 end do
601
602 this%maxorb = this%maxorb*this%mult
603 this%norbs = this%norbs*this%mult
605 safe_allocate(this%basis_atom(1:this%norbs))
606 safe_allocate(this%basis_orb(1:this%norbs))
607 safe_allocate(this%atom_orb_basis(1:ions%natoms, 1:this%maxorb))
608
609 ! Initialize the mapping between indices
610
611 ibasis = 0
612 do iatom = 1, ions%natoms
613 norbs = ions%atom(iatom)%species%get_niwfs()
614
615 do iorb = 1, this%mult*norbs
616 ibasis = ibasis + 1
617 this%atom_orb_basis(iatom, iorb) = ibasis
618 this%basis_atom(ibasis) = iatom
619 this%basis_orb(ibasis) = iorb
620
621 ! no stored spin index in alternative mode
622 if (debug%info .and. st%system_grp%is_root()) then
623 call ions%atom(iatom)%species%get_iwf_ilm(iorb, 1, ii, ll, mm)
624 write(iunit_o,'(7i6)') ibasis, iatom, iorb, ii, ll, mm, 1
625 end if
626 end do
627 end do
628
629 if (debug%info .and. st%system_grp%is_root()) then
630 call io_close(iunit_o)
631 end if
632
633 ! this is determined by the stencil we are using and the spacing
634 this%lapdist = maxval(abs(gr%idx%enlarge)*gr%spacing)
635
636 ! calculate the radius of each orbital
637 safe_allocate(this%radius(1:ions%natoms))
638
639 do iatom = 1, ions%natoms
640 norbs = ions%atom(iatom)%species%get_niwfs()
641
642 maxradius = m_zero
643 do iorb = 1, norbs
644 call ions%atom(iatom)%species%get_iwf_ilm(iorb, 1, ii, ll, mm)
645 ! For all-electron species, we need to use the principal quantum number
646 if(ions%atom(iatom)%species%is_full()) call ions%atom(iatom)%species%get_iwf_n( iorb, 1, ii)
647 maxradius = max(maxradius, ions%atom(iatom)%species%get_iwf_radius( ii, is = 1))
648 end do
649
650 if (this%derivative) maxradius = maxradius + this%lapdist
651
652 maxradius = min(maxradius, m_two*maxval(gr%box%bounding_box_l(1:space%dim)))
653
654 this%radius(iatom) = maxradius
655 end do
656
657 safe_allocate(this%calc_atom(1:ions%natoms))
658 this%calc_atom = .true.
659
660 ! initialize parallel data
661#ifndef HAVE_SCALAPACK
662 this%parallel = .false.
663#else
664 this%parallel = (st%parallel_in_states .or. gr%parallel_in_domains) &
665 .and. .not. blacs_proc_grid_null(st%dom_st_proc_grid)
666
667 if (this%parallel) then
668 nbl = min(16, this%norbs)
669
670 ! The size of the distributed matrix in each node
671 this%lsize(1) = max(1, numroc(this%norbs, nbl, st%dom_st_proc_grid%myrow, 0, st%dom_st_proc_grid%nprow))
672 this%lsize(2) = max(1, numroc(this%norbs, nbl, st%dom_st_proc_grid%mycol, 0, st%dom_st_proc_grid%npcol))
673
674 this%nproc(1) = st%dom_st_proc_grid%nprow
675 this%nproc(2) = st%dom_st_proc_grid%npcol
676 this%myroc(1) = st%dom_st_proc_grid%myrow
677 this%myroc(2) = st%dom_st_proc_grid%mycol
678
679 call descinit(this%desc(1), this%norbs, this%norbs, nbl, nbl, 0, 0, &
680 st%dom_st_proc_grid%context, this%lsize(1), info)
681
682 if (info /= 0) then
683 write(message(1), '(a,i6)') 'descinit for BLACS failed with error code ', info
684 call messages_fatal(1, namespace=namespace)
685 end if
686
687 this%calc_atom = .false.
688 do iatom = 1, ions%natoms
689 ibasis = this%atom_orb_basis(iatom, 1)
690
691 do jatom = 1, ions%natoms
692 jbasis = this%atom_orb_basis(jatom, 1)
693
694 do iorb = 1, this%norb_atom(iatom)
695 do jorb = 1, this%norb_atom(jatom)
696 call lcao_local_index(this, ibasis - 1 + iorb, jbasis - 1 + jorb, &
697 ilbasis, jlbasis, proc(1), proc(2))
698
699 this%calc_atom(this%basis_atom(jbasis)) = &
700 this%calc_atom(this%basis_atom(jbasis)) .or. proc(2) == this%myroc(2)
701
702 end do
703 end do
704
705 end do
706 end do
707
708 end if
709#endif
710
711 pop_sub(lcao_init.lcao2_init)
712 end subroutine lcao2_init
713
714 end subroutine lcao_init
715
716
717 ! ---------------------------------------------------------
718 subroutine lcao_run(namespace, space, gr, ions, ext_partners, st, ks, hm, st_start, lmm_r, known_lower_bound)
719 type(namespace_t), intent(in) :: namespace
720 type(electron_space_t), intent(in) :: space
721 type(grid_t), intent(in) :: gr
722 type(ions_t), intent(in) :: ions
723 type(partner_list_t), intent(in) :: ext_partners
724 type(states_elec_t), intent(inout) :: st
725 type(v_ks_t), intent(inout) :: ks
726 type(hamiltonian_elec_t), intent(inout) :: hm
727 integer, optional, intent(in) :: st_start
728 real(real64), optional, intent(in) :: lmm_r
729 logical, optional, intent(out) :: known_lower_bound
730
731 type(lcao_t) :: lcao
732 integer :: st_start_random, required_min_nst
733 logical :: lcao_done
734 logical :: is_orbital_dependent
735
736 push_sub(lcao_run)
737
738 if (present(known_lower_bound)) known_lower_bound = .false.
739
740 if (present(st_start)) then
741 ! If we are doing unocc calculation, do not mess with the correct eigenvalues
742 ! of the occupied states.
743 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, &
744 calc_eigenval=.not. present(st_start), calc_current=.false.)
745
746 assert(st_start >= 1)
747 if (st_start > st%nst) then ! nothing to be done in LCAO
748 if (present(known_lower_bound)) known_lower_bound = .true.
749 pop_sub(lcao_run)
750 return
751 end if
752 end if
753
754 call profiling_in('LCAO_RUN')
755
756 call lcao_init(lcao, namespace, space, gr, ions, st, optional_default(st_start, 1))
757
758 call lcao_init_orbitals(lcao, namespace, st, gr, ions, start = st_start)
759
760 ! By default, we want to use vxc for the LCAO.
761 ! However, we can only do this if vxc depends on the density only
762 ! For cases like MGGA or hybrids, OEP, we cannot do this
763 is_orbital_dependent = v_ks_is_orbital_dependent(ks)
764
765 if (.not. present(st_start)) then
766 call lcao_guess_density(lcao, namespace, st, gr, hm, ions, st%qtot, st%d%ispin, st%rho)
767
768 if (st%d%ispin > unpolarized) then
769 assert(present(lmm_r))
770 call compute_and_write_magnetic_moments(gr, st, hm%phase, hm%ep, ions, lmm_r, namespace=namespace)
771 end if
772
773 ! set up Hamiltonian (we do not call v_ks_h_setup here because we do not want to
774 ! overwrite the guess density)
775 message(1) = 'Info: Setting up Hamiltonian.'
776 call messages_info(1, namespace=namespace)
777
778 ! get the effective potential (we don`t need the eigenvalues yet)
779 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, calc_eigenval=.false., &
780 calc_current=.false., calc_energy=.false., force_semilocal=is_orbital_dependent)
781 ! eigenvalues have nevertheless to be initialized to something
782 ! This value must be larger that the highest eigenvalue from LCAO to get the correct occupations
783 st%eigenval = default_eigenval
784 end if
785
786 lcao_done = .false.
787
788 ! after initialized, can check that LCAO is possible
789 if (lcao_is_available(lcao)) then
790 lcao_done = .true.
791
792 if (present(st_start)) then
793 write(message(1),'(a,i8,a)') 'Performing LCAO for states ', st_start, ' and above'
794 call messages_info(1, namespace=namespace)
795 end if
796
797 call lcao_wf(lcao, st, gr, ions, hm, namespace, start = st_start)
798
799 ! In some rare cases, like bad pseudopotentials with unbound orbitals,
800 ! we might not have enough orbitals to go up to the Fermi energy
801 ! In this case, we cannot set the eigenvales to a huge value, as
802 ! the smearing will not converge. We set them to zero then
803 select case (st%d%ispin)
804 case (unpolarized)
805 required_min_nst = int(st%qtot/2)
806 case (spin_polarized)
807 required_min_nst = int(st%qtot/2)
808 case (spinors)
809 required_min_nst = int(st%qtot)
810 end select
811 if (st%smear%method /= smear_fixed_occ .and. st%smear%method /= smear_semiconductor) then
812 if (lcao%norbs <= required_min_nst .and. lcao%norbs < st%nst) then
813 st%eigenval(lcao%norbs+1:,:) = m_zero
814 end if
815 end if
816
817 if (.not. present(st_start)) then
818 call states_elec_fermi(st, namespace, gr)
819 call states_elec_write_eigenvalues(min(st%nst, lcao%norbs), st, space, hm%kpoints, namespace=namespace)
820
821 ! Update the density and the Hamiltonian
822 if (lcao%mode == option__lcaostart__lcao_full) then
823 call v_ks_h_setup(namespace, space, gr, ions, ext_partners, st, ks, hm, &
824 calc_eigenval = .false., calc_current=.false.)
825 if (st%d%ispin > unpolarized) then
826 assert(present(lmm_r))
827 call compute_and_write_magnetic_moments(gr, st, hm%phase, hm%ep, ions, lmm_r, namespace=namespace)
828 end if
829 end if
830 end if
831
832 if (present(known_lower_bound) .and. lcao%norbs >= st%nst .and. .not. is_orbital_dependent) known_lower_bound = .true.
833 end if
834
835 if (.not. lcao_done .or. lcao%norbs < st%nst) then
836
837 if (lcao_done) then
838 st_start_random = lcao%norbs + 1
839 else
840 st_start_random = 1
841 end if
842 if (present(st_start)) st_start_random = max(st_start, st_start_random)
843
844 if (st_start_random > 1) then
845 write(message(1),'(a,i8,a)') 'Generating random wavefunctions for states ', st_start_random, ' and above'
846 call messages_info(1, namespace=namespace)
847 end if
848
849 ! Randomly generate the initial wavefunctions.
850 call states_elec_generate_random(st, gr, hm%kpoints, ist_start_ = st_start_random, normalized = .false.)
851
852 ! For spinors, we rotate the random states in the local frame of the magnetization
853 ! Unless the user specified the spin directions using InitialSpins
854 if (.not. st%fixed_spins) then
855 call rotate_random_states_to_local_frame(st, gr, st_start_random, lcao%gmd_opt)
856 end if
857
858 call messages_write('Orthogonalizing wavefunctions.')
859 call messages_info(namespace=namespace)
860 call states_elec_orthogonalize(st, namespace, gr)
861
862 if (.not. lcao_done) then
863 ! If we are doing unocc calculation, do not mess with the correct eigenvalues and occupations
864 ! of the occupied states.
865 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, &
866 calc_eigenval=.not. present(st_start), calc_current=.false., force_semilocal=is_orbital_dependent) ! get potentials
867 if (.not. present(st_start)) then
868 call states_elec_fermi(st, namespace, gr) ! occupations
869 end if
870
871 end if
872
873 else if (present(st_start)) then
874
875 if (st_start > 1) then
876 call messages_write('Orthogonalizing wavefunctions.')
877 call messages_info(namespace=namespace)
878 call states_elec_orthogonalize(st, namespace, gr)
879 end if
880
881 end if
882
883 call lcao_end(lcao)
884
885
886 call profiling_out('LCAO_RUN')
887 pop_sub(lcao_run)
888 end subroutine lcao_run
889
890 ! ---------------------------------------------------------
891 subroutine lcao_end(this)
892 type(lcao_t), intent(inout) :: this
893
894 push_sub(lcao_end)
895
896 safe_deallocate_a(this%calc_atom)
897 safe_deallocate_a(this%norb_atom)
898 safe_deallocate_a(this%basis_atom)
899 safe_deallocate_a(this%basis_orb)
900 safe_deallocate_a(this%atom_orb_basis)
901 safe_deallocate_a(this%radius)
902 safe_deallocate_a(this%sphere)
903 safe_deallocate_a(this%orbitals)
904
905 safe_deallocate_a(this%atom)
906 safe_deallocate_a(this%level)
907 safe_deallocate_a(this%ddim)
908 safe_deallocate_a(this%cst)
909 safe_deallocate_a(this%ck)
910 safe_deallocate_a(this%dbuff_single)
911 safe_deallocate_a(this%zbuff_single)
912 safe_deallocate_a(this%dbuff)
913 safe_deallocate_a(this%zbuff)
914
915 this%initialized = .false.
916 pop_sub(lcao_end)
917 end subroutine lcao_end
918
919
920 ! ---------------------------------------------------------
921 subroutine lcao_wf(this, st, gr, ions, hm, namespace, start)
922 type(lcao_t), intent(inout) :: this
923 type(states_elec_t), intent(inout) :: st
924 type(grid_t), intent(in) :: gr
925 type(ions_t), intent(in) :: ions
926 type(hamiltonian_elec_t), intent(in) :: hm
927 type(namespace_t), intent(in) :: namespace
928 integer, optional, intent(in) :: start
929
930 integer :: start_
931
932 assert(this%initialized)
933
934 call profiling_in("LCAO")
935 push_sub(lcao_wf)
936
937 start_ = 1
938 if (present(start)) start_ = start
940 if (this%alternative) then
941 if (states_are_real(st)) then
942 call dlcao_alt_wf(this, st, gr, ions, hm, namespace, start_)
943 else
944 call zlcao_alt_wf(this, st, gr, ions, hm, namespace, start_)
945 end if
946 else
947 if (states_are_real(st)) then
948 call dlcao_wf(this, st, gr, ions, hm, namespace, start_)
949 else
950 call zlcao_wf(this, st, gr, ions, hm, namespace, start_)
951 end if
952 end if
953 pop_sub(lcao_wf)
954 call profiling_out("LCAO")
955 end subroutine lcao_wf
956
957
958 ! ---------------------------------------------------------
960 logical function lcao_is_available(this) result(available)
961 type(lcao_t), intent(in) :: this
962
963 push_sub(lcao_is_available)
964
965 available = this%initialized .and. this%mode /= option__lcaostart__lcao_none &
966 .and. this%norbs > 0
967
968 pop_sub(lcao_is_available)
969 end function lcao_is_available
970
971
972 ! ---------------------------------------------------------
973 subroutine lcao_local_index(this, ig, jg, il, jl, prow, pcol)
974 type(lcao_t), intent(in) :: this
975 integer, intent(in) :: ig
976 integer, intent(in) :: jg
977 integer, intent(out) :: il
978 integer, intent(out) :: jl
979 integer, intent(out) :: prow
980 integer, intent(out) :: pcol
981
982 ! no PUSH_SUB, called too often
983#ifdef HAVE_SCALAPACK
984 call infog2l(ig, jg, this%desc(1), this%nproc(1), this%nproc(2), this%myroc(1), this%myroc(2), &
985 il, jl, prow, pcol)
986#else
987 il = ig
988 jl = jg
989 prow = 0
990 pcol = 0
991#endif
992
993 end subroutine lcao_local_index
994
995 ! ---------------------------------------------------------
996
1000 subroutine lcao_alt_end_orbital(this, iatom)
1001 type(lcao_t), intent(inout) :: this
1002 integer, intent(in) :: iatom
1003
1004 push_sub(lcao_alt_end_orbital)
1005
1006 if (this%is_orbital_initialized(iatom)) then
1007 call this%orbitals(iatom)%end()
1008 this%is_orbital_initialized(iatom) = .false.
1009 end if
1010
1011 pop_sub(lcao_alt_end_orbital)
1012
1013 end subroutine lcao_alt_end_orbital
1014
1015 ! ---------------------------------------------------------
1016
1017 subroutine lcao_atom_density(this, st, mesh, ions, iatom, spin_channels, rho)
1018 type(lcao_t), intent(inout) :: this
1019 type(states_elec_t), intent(in) :: st
1020 class(mesh_t), intent(in) :: mesh
1021 type(ions_t), target, intent(in) :: ions
1022 integer, intent(in) :: iatom
1023 integer, intent(in) :: spin_channels
1024 real(real64), contiguous, intent(inout) :: rho(:, :)
1025
1026 real(real64), allocatable :: dorbital(:, :)
1027 complex(real64), allocatable :: zorbital(:, :)
1028 real(real64), allocatable :: factors(:)
1029 real(real64) :: factor, aa
1030 integer :: iorb, ip, ii, ll, mm, ispin
1031 type(ps_t), pointer :: ps
1032 logical :: use_stored_orbitals
1033
1034 push_sub(lcao_atom_density)
1035
1036 rho = m_zero
1037
1038 use_stored_orbitals = ions%atom(iatom)%species%is_ps() &
1039 .and. states_are_real(st) .and. spin_channels == 1 .and. lcao_is_available(this) &
1040 .and. st%d%dim == 1 .and. .not. ions%space%is_periodic()
1041
1042
1043 ! we can use the orbitals we already have calculated
1044 if (use_stored_orbitals) then
1045 !There is no periodic copies here, so this will not work for periodic systems
1046 assert(.not. ions%space%is_periodic())
1047
1048 select type(spec=>ions%atom(iatom)%species)
1049 class is(pseudopotential_t)
1050 ps => spec%ps
1051 class default
1052 assert(.false.)
1053 end select
1054
1055 if (.not. this%alternative) then
1056
1057 if (states_are_real(st)) then
1058 safe_allocate(dorbital(1:mesh%np, 1:st%d%dim))
1059 else
1060 safe_allocate(zorbital(1:mesh%np, 1:st%d%dim))
1061 end if
1062
1063 do iorb = 1, this%norbs
1064 if (iatom /= this%atom(iorb)) cycle
1066 call ions%atom(iatom)%species%get_iwf_ilm(this%level(iorb), 1, ii, ll, mm)
1067 factor = ps%conf%occ(ii, 1)/(m_two*ll + m_one)
1068
1069 if (states_are_real(st)) then
1070 call dget_ao(this, st, mesh, ions, iorb, 1, dorbital, use_psi = .true.)
1071 !$omp parallel do
1072 do ip = 1, mesh%np
1073 rho(ip, 1) = rho(ip, 1) + factor*dorbital(ip, 1)**2
1074 end do
1075 else
1076 call zget_ao(this, st, mesh, ions, iorb, 1, zorbital, use_psi = .true.)
1077 !$omp parallel do
1078 do ip = 1, mesh%np
1079 rho(ip, 1) = rho(ip, 1) + factor*abs(zorbital(ip, 1))**2
1080 end do
1081 end if
1082
1083 end do
1084
1085 safe_deallocate_a(dorbital)
1086 safe_deallocate_a(zorbital)
1087
1088 else
1089
1090 ! for simplicity, always use real ones here.
1091 call dlcao_alt_get_orbital(this, this%sphere(iatom), ions, 1, iatom, this%norb_atom(iatom))
1092
1093 ! the extra orbitals with the derivative are not relevant here, hence we divide by this%mult
1094 safe_allocate(factors(1:this%norb_atom(iatom)/this%mult))
1095
1096 do iorb = 1, this%norb_atom(iatom)/this%mult
1097 call ions%atom(iatom)%species%get_iwf_ilm(iorb, 1, ii, ll, mm)
1098 factors(iorb) = ps%conf%occ(ii, 1)/(m_two*ll + m_one)
1099 end do
1100
1101 !$omp parallel do private(ip, aa, iorb) if(.not. this%sphere(iatom)%overlap)
1102 do ip = 1, this%sphere(iatom)%np
1103 aa = m_zero
1104 do iorb = 1, this%norb_atom(iatom)/this%mult
1105 aa = aa + factors(iorb)*this%orbitals(iatom)%dff_linear(ip, iorb)**2
1106 end do
1107 rho(this%sphere(iatom)%map(ip), 1) = rho(this%sphere(iatom)%map(ip), 1) + aa
1108 end do
1109
1110 safe_deallocate_a(factors)
1111
1112 end if
1113
1114 else
1115 call species_atom_density(ions%atom(iatom)%species, ions%namespace, ions%space, ions%latt, &
1116 ions%pos(:, iatom), mesh, spin_channels, rho)
1117 end if
1118
1119 ! The above code can sometimes return negative values of the density. Here we avoid introducing
1120 ! them in the calculation of v_s, mixing, ...
1121 do ispin = 1, spin_channels
1122 !$omp parallel do simd
1123 do ip = 1, mesh%np
1124 rho(ip, ispin) = max(rho(ip, ispin), m_zero)
1125 end do
1126 end do
1127
1128 pop_sub(lcao_atom_density)
1129 end subroutine lcao_atom_density
1130
1131 ! ---------------------------------------------------------
1133 subroutine lcao_guess_density(this, namespace, st, gr, hm, ions, qtot, ispin, rho)
1134 type(lcao_t), intent(inout) :: this
1135 type(namespace_t), intent(in) :: namespace
1136 type(states_elec_t), intent(in) :: st
1137 type(grid_t), intent(in) :: gr
1138 type(hamiltonian_elec_t), intent(in) :: hm
1139 type(ions_t), intent(in) :: ions
1140 real(real64), intent(in) :: qtot
1141 integer, intent(in) :: ispin
1142 real(real64), contiguous, intent(out) :: rho(:, :)
1143
1144 integer :: ia, is, idir, ip, m_dim, ispin2
1145 integer(int64), save :: iseed = splitmix64_321
1146 type(block_t) :: blk
1147 real(real64) :: rr, rnd, phi, theta, lmag, n1, n2
1148 real(real64), allocatable :: atom_rho(:,:), mag(:,:)
1149 real(real64), parameter :: tol_min_mag = 1.0e-20_real64
1150
1151 push_sub(lcao_guess_density)
1152
1153 if (st%d%spin_channels == 1) then
1154 this%gmd_opt = initrho_paramagnetic
1155 else
1156 !%Variable GuessMagnetDensity
1157 !%Type integer
1158 !%Default ferromagnetic
1159 !%Section SCF::LCAO
1160 !%Description
1161 !% The guess density for the SCF cycle is just the sum of all the atomic densities.
1162 !% When performing spin-polarized or non-collinear-spin calculations this option sets
1163 !% the guess magnetization density.
1164 !%
1165 !% For anti-ferromagnetic configurations, the <tt>user_defined</tt> option should be used.
1166 !%
1167 !% Note that if the <tt>paramagnetic</tt> option is used, the final ground state will also be
1168 !% paramagnetic, but the same is not true for the other options.
1169 !%Option paramagnetic 1
1170 !% Magnetization density is zero.
1171 !%Option ferromagnetic 2
1172 !% Magnetization density is the sum of the atomic magnetization densities.
1173 !%Option random 3
1174 !% Each atomic magnetization density is randomly rotated.
1175 !%Option user_defined 77
1176 !% The atomic magnetization densities are rotated so that the magnetization
1177 !% vector has the same direction as a vector provided by the user. In this case,
1178 !% the <tt>AtomsMagnetDirection</tt> block has to be set.
1179 !%End
1180 call parse_variable(namespace, 'GuessMagnetDensity', initrho_ferromagnetic, this%gmd_opt)
1181 if (.not. varinfo_valid_option('GuessMagnetDensity', this%gmd_opt)) call messages_input_error(namespace, 'GuessMagnetDensity')
1182 call messages_print_var_option('GuessMagnetDensity', this%gmd_opt, namespace=namespace)
1183 end if
1184
1185 if (this%gmd_opt /= initrho_ferromagnetic .and. this%gmd_opt /= initrho_paramagnetic &
1186 .and. (hm%theory_level == hartree_fock .or. hm%theory_level == generalized_kohn_sham_dft) .and. st%d%spin_channels > 1) then
1187 message(1) = "Only paramagnetic and ferromagnetic options for GuessMagnetDensity can be used "
1188 message(2) = " for Hartree-Fock and generalized Kohn-Sham calculation."
1189 message(3) = "Please perform a LDA or GGA calculation first and restart from this calculation if you want another option."
1190 call messages_fatal(3, namespace=namespace)
1191 end if
1192
1193 if (this%gmd_opt == initrho_userdef) then
1194 !%Variable AtomsMagnetDirection
1195 !%Type block
1196 !%Section SCF::LCAO
1197 !%Description
1198 !% This option is only used when <tt>GuessMagnetDensity</tt> is
1199 !% set to <tt>user_defined</tt>. It provides a direction for the
1200 !% magnetization vector of each atom when building the guess
1201 !% density. In order to do that, the user should specify the
1202 !% coordinates of a vector that has the desired direction and
1203 !% norm. Note that it is necessary to maintain the ordering in
1204 !% which the species were defined in the coordinates
1205 !% specifications.
1206 !%
1207 !% For spin-polarized calculations, the vectors should have only
1208 !% one component; for non-collinear-spin calculations, they
1209 !% should have three components. If the norm of the vector is greater
1210 !% than the number of valence electrons in the atom, it will be rescaled
1211 !% to this number, which is the maximum possible magnetization.
1212 !%End
1213 if (parse_block(namespace, 'AtomsMagnetDirection', blk) < 0) then
1214 message(1) = "AtomsMagnetDirection block is not defined."
1215 call messages_fatal(1, namespace=namespace)
1216 end if
1217
1218 if (parse_block_n(blk) /= ions%natoms) then
1219 message(1) = "The number of rows in the AtomsMagnetDirection block does not equal the number of atoms."
1220 call messages_fatal(1, namespace=namespace)
1221 end if
1222
1223 if (ispin == spin_polarized) then
1224 m_dim = 1
1225 elseif(ispin == spinors) then
1226 m_dim = 3
1227 endif
1228
1229 safe_allocate(mag(1:m_dim, 1:ions%natoms))
1230 do ia = 1, ions%natoms
1231 !Read from AtomsMagnetDirection block
1232 do idir = 1, m_dim
1233 call parse_block_float(blk, ia-1, idir-1, mag(idir, ia))
1234 if (abs(mag(idir, ia)) < tol_min_mag) mag(idir, ia) = m_zero
1235 end do
1236 end do
1237 call parse_block_end(blk)
1238 end if
1239
1240 rho = m_zero
1241
1242 safe_allocate(atom_rho(1:gr%np, 1:st%d%spin_channels))
1243 select case (this%gmd_opt)
1244 case (initrho_paramagnetic)
1245 do ia = ions%atoms_dist%start, ions%atoms_dist%end
1246 call lcao_atom_density(this, st, gr, ions, ia, st%d%spin_channels, atom_rho)
1247 call lalg_axpy(gr%np, st%d%spin_channels, m_one, atom_rho, rho)
1248 end do
1249
1250 if (st%d%spin_channels == 2) then
1251 !$omp parallel do
1252 do ip = 1, gr%np
1253 rho(ip, 1) = m_half*(rho(ip, 1) + rho(ip, 2))
1254 rho(ip, 2) = rho(ip, 1)
1255 end do
1256 end if
1257
1259 do ia = ions%atoms_dist%start, ions%atoms_dist%end
1260 call lcao_atom_density(this, st, gr, ions, ia, 2, atom_rho(:, 1:2))
1261 do ispin2 = 1, 2
1262 call lalg_axpy(gr%np, m_one, atom_rho(:, ispin2), rho(:, ispin2))
1263 end do
1264 end do
1265
1266 case (initrho_random) ! Randomly oriented spins
1267 do ia = ions%atoms_dist%start, ions%atoms_dist%end
1268 call lcao_atom_density(this, st, gr, ions, ia, 2, atom_rho)
1269
1270 ! For charge neutral atoms, the magnetization density will always be zero
1271 ! In order to still make a random spin structure, we then reassign the charge in
1272 ! one spin channel to have a 1 \nu_B for this atom, with a random direction
1273 !
1274 ! An example where this is needed is a Xe3 cluster where we put an excess charge
1275 ! Each atom is neutral but the full system has a net magnetiation
1276 n1 = dmf_integrate(gr, atom_rho(:, 1))
1277 n2 = dmf_integrate(gr, atom_rho(:, 2))
1278
1279 if (is_close(n1, n2)) then
1280 lmag = m_one
1281
1282 call lalg_axpy(gr%np, (lmag - n1 + n2)/m_two/n2, atom_rho(:, 2), atom_rho(:, 1))
1283 call lalg_scal(gr%np, (n1 + n2 - lmag)/m_two/n2, atom_rho(:, 2))
1284 end if
1285
1286
1287 if (ispin == spin_polarized) then
1288 call quickrnd(iseed, rnd)
1289 rnd = rnd - m_half
1290 if (rnd > m_zero) then
1291 do ispin2 = 1, 2
1292 call lalg_axpy(gr%np, m_one, atom_rho(:, ispin2), rho(:, ispin2))
1293 end do
1294 else
1295 call lalg_axpy(gr%np, m_one, atom_rho(:, 2), rho(:, 1))
1296 call lalg_axpy(gr%np, m_one, atom_rho(:, 1), rho(:, 2))
1297 end if
1298 elseif (ispin == spinors) then
1299 call quickrnd(iseed, phi)
1300 call quickrnd(iseed, theta)
1301 phi = phi*m_two*m_pi
1302 theta = theta*m_pi*m_half
1303
1304 call accumulate_rotated_density(gr, rho, atom_rho, theta, phi)
1305 end if
1306 end do
1307
1308 case (initrho_userdef) ! User-defined
1309 do ia = ions%atoms_dist%start, ions%atoms_dist%end
1310 !Get atomic density
1311 call lcao_atom_density(this, st, gr, ions, ia, 2, atom_rho)
1312
1313 !Scale magnetization density
1314 n1 = dmf_integrate(gr, atom_rho(:, 1))
1315 n2 = dmf_integrate(gr, atom_rho(:, 2))
1316
1317 lmag = norm2(mag(:, ia))
1318 if (lmag > n1 + n2) then
1319 mag(:, ia) = mag(:, ia)*(n1 + n2)/lmag
1320 lmag = n1 + n2
1321 elseif (abs(lmag) <= m_epsilon) then
1322 if (abs(n1 - n2) <= m_epsilon) then
1323 call lalg_axpy(gr%np, 2, m_one, atom_rho, rho)
1324 else
1325 !$omp parallel do simd
1326 do ip = 1, gr%np
1327 atom_rho(ip, 1) = m_half*(atom_rho(ip, 1) + atom_rho(ip, 2))
1328 rho(ip, 1) = rho(ip, 1) + atom_rho(ip, 1)
1329 rho(ip, 2) = rho(ip, 2) + atom_rho(ip, 1)
1330 end do
1331 end if
1332 cycle
1333 end if
1334
1335 if (.not. is_close(n1 - n2, lmag) .and. abs(n2) > m_epsilon) then
1336 if (n1 - n2 < lmag) then
1337 call lalg_axpy(gr%np, (lmag - n1 + n2)/m_two/n2, atom_rho(:, 2), atom_rho(:, 1))
1338 call lalg_scal(gr%np, (n1 + n2 - lmag)/m_two/n2, atom_rho(:, 2))
1339 elseif (n1 - n2 > lmag) then
1340 call lalg_axpy(gr%np, (n1 - n2 - lmag)/m_two/n1, atom_rho(:, 1), atom_rho(:, 2))
1341 call lalg_scal(gr%np, (n1 + n2 + lmag)/m_two/n1, atom_rho(:, 1))
1342 end if
1343 end if
1344
1345 !Rotate magnetization density
1346 if (ispin == spin_polarized) then
1347
1348 if (mag(1, ia) > m_zero) then
1349 call lalg_axpy(gr%np, 2, m_one, atom_rho, rho)
1350 else
1351 call lalg_axpy(gr%np, m_one, atom_rho(:,2), rho(:,1))
1352 call lalg_axpy(gr%np, m_one, atom_rho(:,1), rho(:,2))
1353 end if
1354
1355 elseif (ispin == spinors) then
1356
1357 call get_angles_from_magnetization(mag(:, ia), lmag, theta, phi)
1358 call accumulate_rotated_density(gr, rho, atom_rho, theta, phi)
1359 end if
1360 end do
1361
1362 end select
1363
1364
1365 if (ions%atoms_dist%parallel) then
1366 do is = 1, st%d%nspin
1367 call lalg_copy(gr%np, rho(:,is), atom_rho(:,1))
1368 call ions%atoms_dist%mpi_grp%allreduce(atom_rho(1, 1), rho(1, is), gr%np, mpi_double_precision, mpi_sum)
1369 end do
1370 end if
1371
1372 ! we now renormalize the density (necessary if we have a charged system)
1373 rr = sum(dmf_integrate(gr, st%d%spin_channels, rho))
1374 write(message(1),'(a,f13.6)')'Info: Unnormalized total charge = ', rr
1375 call messages_info(1, namespace=namespace)
1376
1377 ! We only renormalize if the density is not zero
1378 if (abs(rr) > m_epsilon) then
1379 call lalg_scal(gr%np, st%d%nspin, qtot/rr, rho)
1380 rr = sum(dmf_integrate(gr, st%d%spin_channels, rho))
1381 write(message(1),'(a,f13.6)')'Info: Renormalized total charge = ', rr
1382 call messages_info(1, namespace=namespace)
1383 end if
1384
1385 ! Symmetrize the density if needed
1386 if (st%symmetrize_density) then
1387 do is = 1, st%d%nspin
1388 call dgrid_symmetrize_scalar_field(gr, rho(:, is))
1389 end do
1390 end if
1391
1392 safe_deallocate_a(atom_rho)
1393 safe_deallocate_a(mag)
1394
1395 pop_sub(lcao_guess_density)
1396 end subroutine lcao_guess_density
1397
1398 ! ---------------------------------------------------------
1399 subroutine accumulate_rotated_density(mesh, rho, atom_rho, theta, phi)
1400 class(mesh_t), intent(in) :: mesh
1401 real(real64), contiguous, intent(inout) :: rho(:,:)
1402 real(real64), contiguous, intent(in) :: atom_rho(:,:)
1403 real(real64), intent(in) :: theta, phi
1404
1405 integer :: ip
1406 real(real64) :: half_theta
1407
1409
1410 half_theta = m_half * theta
1411
1412 !$omp parallel do simd
1413 do ip = 1, mesh%np
1414 rho(ip, 1) = rho(ip, 1) + cos(half_theta)**2*atom_rho(ip, 1) + sin(half_theta)**2*atom_rho(ip, 2)
1415 rho(ip, 2) = rho(ip, 2) + sin(half_theta)**2*atom_rho(ip, 1) + cos(half_theta)**2*atom_rho(ip, 2)
1416 rho(ip, 3) = rho(ip, 3) + cos(half_theta)*sin(half_theta)*cos(phi)*(atom_rho(ip, 1)-atom_rho(ip, 2))
1417 rho(ip, 4) = rho(ip, 4) - cos(half_theta)*sin(half_theta)*sin(phi)*(atom_rho(ip, 1)-atom_rho(ip, 2))
1418 end do
1419
1421 end subroutine accumulate_rotated_density
1422
1423 ! ---------------------------------------------------------
1424
1425 subroutine lcao_init_orbitals(this, namespace, st, gr, ions, start)
1426 type(lcao_t), intent(inout) :: this
1427 type(namespace_t), intent(in) :: namespace
1428 type(states_elec_t), intent(inout) :: st
1429 type(grid_t), intent(in) :: gr
1430 type(ions_t), intent(in) :: ions
1431 integer, optional, intent(in) :: start
1432
1433 if (.not. lcao_is_available(this)) return
1434
1435 push_sub(lcao_init_orbitals)
1436
1437 if (.not. this%alternative) then
1438 if (states_are_real(st)) then
1439 call dinit_orbitals(this, namespace, st, gr, ions, start)
1440 else
1441 call zinit_orbitals(this, namespace, st, gr, ions, start)
1442 end if
1443 else
1444 if (states_are_real(st)) then
1445 call dlcao_alt_init_orbitals(this, namespace, st, gr, ions, start)
1446 else
1447 call zlcao_alt_init_orbitals(this, namespace, st, gr, ions, start)
1448 end if
1449
1450 end if
1451
1452 pop_sub(lcao_init_orbitals)
1453 end subroutine lcao_init_orbitals
1454
1456 subroutine get_angles_from_magnetization(mag, lmag, theta, phi)
1457 real(real64), intent(in) :: mag(3)
1458 real(real64), intent(in) :: lmag
1459 real(real64), intent(out) :: theta
1460 real(real64), intent(out) :: phi
1461
1462 assert(lmag > m_zero)
1463
1464 theta = acos(max(-1.0_real64, min(1.0_real64, mag(3)/lmag)))
1465
1466 if (abs(mag(1)) <= m_epsilon) then
1467 if (abs(mag(2)) <= m_epsilon) then
1468 phi = m_zero
1469 elseif (mag(2) < m_zero) then
1470 phi = m_pi*m_three*m_half
1471 else
1472 phi = m_pi*m_half
1473 end if
1474 else
1475
1476 phi = atan2(mag(2), mag(1))
1477 !note: atan2 returns the correct phase. The correction from wikipedia on spherical coordinates is not necessary.
1478
1479 end if
1480
1481 end subroutine get_angles_from_magnetization
1482
1483
1490 subroutine rotate_random_states_to_local_frame(st, gr, ist_start, gmd_opt)
1491 type(states_elec_t), intent(inout) :: st
1492 type(grid_t), intent(in) :: gr
1493 integer, intent(in) :: ist_start
1494 integer, intent(in) :: gmd_opt
1495
1496 integer :: ik, ist, ip
1497 real(real64), allocatable :: md(:,:), up(:)
1498 complex(real64), allocatable :: down(:), psi(:,:)
1499 real(real64) :: lmag, theta, phi, norm, mm(3)
1500
1501 if (st%d%ispin /= spinors) return
1502 if (gmd_opt == initrho_random) return
1503
1505
1506 safe_allocate(psi(1:gr%np, 1:st%d%dim))
1507
1508 select case (gmd_opt)
1509 case(initrho_paramagnetic)
1510 ! Random spinors should have no net magnetization
1511 do ik = st%d%kpt%start, st%d%kpt%end
1512 do ist = ist_start, st%st_end
1513 call states_elec_get_state(st, gr, ist, ik, psi)
1514 !$omp parallel do private(norm)
1515 do ip = 1, gr%np
1516 psi(ip, 1) = psi(ip, 1) + psi(ip, 2)
1517 psi(ip, 2) = psi(ip, 1)
1518 end do
1519 call zmf_normalize(gr, st%d%dim, psi)
1520 call states_elec_set_state(st, gr, ist, ik, psi)
1521 end do
1522 end do
1523
1525 ! Random spinors magnetization is aligned along the z axis
1526 do ik = st%d%kpt%start, st%d%kpt%end
1527 do ist = ist_start, st%st_end
1528 call states_elec_get_state(st, gr, ist, ik, psi)
1529 !$omp parallel do
1530 do ip = 1, gr%np
1531 psi(ip, 1) = psi(ip, 1) + psi(ip, 2)
1532 psi(ip, 2) = m_zero
1533 end do
1534 call zmf_normalize(gr, st%d%dim, psi)
1535 call states_elec_set_state(st, gr, ist, ik, psi)
1536 end do
1537 end do
1539 case(initrho_userdef)
1540 ! Random spinors magnetization is aligned along the local frame
1541 safe_allocate(md(1:gr%np, 1:3))
1542 safe_allocate(up(1:gr%np))
1543 safe_allocate(down(1:gr%np))
1544 call magnetic_density(gr, st%d, st%rho, md)
1545
1546 mm(1) = dmf_integrate(gr, md(:, 1), reduce = .false.)
1547 mm(2) = dmf_integrate(gr, md(:, 2), reduce = .false.)
1548 mm(3) = dmf_integrate(gr, md(:, 3), reduce = .false.)
1549
1550 if (gr%parallel_in_domains) then
1551 call gr%allreduce(mm)
1552 end if
1553
1554 ! If the density has a net direction, we align globally the spinors to this direction
1555 ! This allows to generate random pure states
1556 lmag = norm2(mm)
1557 if (lmag > 1.0e-2_real64) then
1558 call get_angles_from_magnetization(mm, lmag, theta, phi)
1559 up(:) = cos(theta/m_two)
1560 down(:) = exp(m_zi * phi) * sin(theta/m_two)
1561 else
1562 ! We do a rotation in the local frame
1563 ! Note that this produces mixed states, so the norm of the magnetization is smaller than 1
1564 !
1565 !$omp parallel do private(lmag, theta, phi)
1566 do ip = 1, gr%np
1567 lmag = norm2(md(ip, 1:3))
1568 if (lmag > 1.0e-10_real64) then
1569 call get_angles_from_magnetization(md(ip,:), lmag, theta, phi)
1570 up(ip) = cos(theta/m_two)
1571 down(ip) = exp(m_zi * phi) * sin(theta/m_two)
1572 else
1573 up(ip) = m_one
1574 down(ip) = m_zero
1575 end if
1576 end do
1577 safe_deallocate_a(md)
1578 end if
1579
1580 ! Rotate the spinors
1581 do ik = st%d%kpt%start, st%d%kpt%end
1582 do ist = ist_start, st%st_end
1583 call states_elec_get_state(st, gr, ist, ik, psi)
1584 call zmf_normalize(gr, st%d%dim, psi)
1585 !$omp parallel do private(norm)
1586 do ip = 1, gr%np
1587 norm = sqrt(real(psi(ip, 1)*conjg(psi(ip, 1)) + psi(ip, 2)*conjg(psi(ip, 2))))
1588 psi(ip, 1) = norm * up(ip)
1589 psi(ip, 2) = norm * down(ip)
1590 end do
1591 call states_elec_set_state(st, gr, ist, ik, psi)
1592 end do
1593 end do
1594 safe_deallocate_a(up)
1595 safe_deallocate_a(down)
1596
1597 end select
1598 safe_deallocate_a(psi)
1599
1602
1603#include "undef.F90"
1604#include "real.F90"
1605#include "lcao_inc.F90"
1606
1607#include "undef.F90"
1608#include "complex.F90"
1609#include "lcao_inc.F90"
1610
1611
1612end module lcao_oct_m
1613
1614!! Local Variables:
1615!! mode: f90
1616!! coding: utf-8
1617!! End:
subroutine info()
Definition: em_resp.F90:1099
constant times a vector plus a vector
Definition: lalg_basic.F90:194
Copies a vector x, to a vector y.
Definition: lalg_basic.F90:220
scales a vector by a constant
Definition: lalg_basic.F90:170
Prints out to iunit a message in the form: ["InputVariable" = value] where "InputVariable" is given b...
Definition: messages.F90:182
double acos(double __x) __attribute__((__nothrow__
double exp(double __x) __attribute__((__nothrow__
double sin(double __x) __attribute__((__nothrow__
double cos(double __x) __attribute__((__nothrow__
double atan2(double __y, double __x) __attribute__((__nothrow__
subroutine lcao2_init()
Definition: lcao.F90:605
This module implements batches of mesh functions.
Definition: batch.F90:135
This module contains interfaces for BLACS routines Interfaces are from http:
Definition: blacs.F90:27
This module provides the BLACS processor grid.
logical pure function, public blacs_proc_grid_null(this)
Module implementing boundary conditions in Octopus.
Definition: boundaries.F90:124
type(debug_t), save, public debug
Definition: debug.F90:156
integer, parameter, public unpolarized
Parameters...
integer, parameter, public spinors
integer, parameter, public spin_polarized
real(real64), parameter, public m_two
Definition: global.F90:202
real(real64), parameter, public m_zero
Definition: global.F90:200
real(real64), parameter, public m_pi
some mathematical constants
Definition: global.F90:198
integer, parameter, public hartree_fock
Definition: global.F90:250
integer, parameter, public generalized_kohn_sham_dft
Definition: global.F90:250
complex(real64), parameter, public m_zi
Definition: global.F90:214
real(real64), parameter, public m_epsilon
Definition: global.F90:216
real(real64), parameter, public m_half
Definition: global.F90:206
real(real64), parameter, public m_one
Definition: global.F90:201
real(real64), parameter, public m_three
Definition: global.F90:203
This module implements the underlying real-space grid.
Definition: grid.F90:119
subroutine, public dgrid_symmetrize_scalar_field(gr, field, suppress_warning)
Definition: grid.F90:682
This module defines classes and functions for interaction partners.
Definition: io.F90:116
subroutine, public io_close(iunit, grp)
Definition: io.F90:467
subroutine, public io_mkdir(fname, namespace, parents)
Definition: io.F90:361
integer function, public io_open(file, namespace, action, status, form, position, die, recl, grp)
Definition: io.F90:402
A module to handle KS potential, without the external potential.
This module contains interfaces for LAPACK routines.
Definition: lapack.F90:120
subroutine, public lcao_init_orbitals(this, namespace, st, gr, ions, start)
Definition: lcao.F90:1474
subroutine, public lcao_wf(this, st, gr, ions, hm, namespace, start)
Definition: lcao.F90:970
subroutine zlcao_alt_init_orbitals(this, namespace, st, gr, ions, start)
Definition: lcao.F90:3316
subroutine zget_ao(this, st, mesh, ions, iorb, ispin, ao, use_psi)
Definition: lcao.F90:3284
subroutine, public lcao_end(this)
Definition: lcao.F90:940
subroutine zlcao_alt_wf(this, st, gr, ions, hm, namespace, start)
The alternative implementation.
Definition: lcao.F90:3369
subroutine dlcao_wf(this, st, gr, ions, hm, namespace, start)
Definition: lcao.F90:1792
subroutine dlcao_alt_init_orbitals(this, namespace, st, gr, ions, start)
Definition: lcao.F90:2193
subroutine zlcao_wf(this, st, gr, ions, hm, namespace, start)
Definition: lcao.F90:2907
subroutine rotate_random_states_to_local_frame(st, gr, ist_start, gmd_opt)
Rotate the spinors with band index >= ist_start to the local frame of the magnetization.
Definition: lcao.F90:1539
subroutine, public lcao_run(namespace, space, gr, ions, ext_partners, st, ks, hm, st_start, lmm_r, known_lower_bound)
Definition: lcao.F90:767
subroutine dlcao_alt_wf(this, st, gr, ions, hm, namespace, start)
The alternative implementation.
Definition: lcao.F90:2246
integer, parameter initrho_userdef
Definition: lcao.F90:182
subroutine get_angles_from_magnetization(mag, lmag, theta, phi)
Given a magnetization vector, and its norm, this returns the corresponding inclination and azimuthal ...
Definition: lcao.F90:1505
integer, parameter initrho_random
Definition: lcao.F90:182
subroutine lcao_alt_end_orbital(this, iatom)
This function deallocates a set of an atomic orbitals for an atom. It can be called when the batch is...
Definition: lcao.F90:1049
subroutine lcao_local_index(this, ig, jg, il, jl, prow, pcol)
Definition: lcao.F90:1022
subroutine lcao_guess_density(this, namespace, st, gr, hm, ions, qtot, ispin, rho)
builds a density which is the sum of the atomic densities
Definition: lcao.F90:1182
subroutine dinit_orbitals(this, namespace, st, gr, ions, start)
Definition: lcao.F90:2052
subroutine dget_ao(this, st, mesh, ions, iorb, ispin, ao, use_psi)
Definition: lcao.F90:2161
subroutine dlcao_alt_get_orbital(this, sphere, ions, ispin, iatom, norbs)
This function generates the set of an atomic orbitals for an atom and stores it in the batch orbitalb...
Definition: lcao.F90:2711
subroutine zinit_orbitals(this, namespace, st, gr, ions, start)
Definition: lcao.F90:3175
subroutine lcao_atom_density(this, st, mesh, ions, iatom, spin_channels, rho)
Definition: lcao.F90:1066
subroutine, public lcao_init(this, namespace, space, gr, ions, st, st_start)
Definition: lcao.F90:248
subroutine accumulate_rotated_density(mesh, rho, atom_rho, theta, phi)
Definition: lcao.F90:1448
integer, parameter initrho_ferromagnetic
Definition: lcao.F90:182
logical function, public lcao_is_available(this)
Returns true if LCAO can be done.
Definition: lcao.F90:1009
System information (time, memory, sysname)
Definition: loct.F90:117
subroutine, public compute_and_write_magnetic_moments(gr, st, phase, ep, ions, lmm_r, calc_orb_moments, iunit, namespace)
Computes and prints the global and local magnetic moments.
Definition: magnetic.F90:225
subroutine, public magnetic_density(mesh, std, rho, md)
Definition: magnetic.F90:165
This module is intended to contain "only mathematical" functions and procedures.
Definition: math.F90:117
This module defines various routines, operating on mesh functions.
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:120
subroutine, public messages_warning(no_lines, all_nodes, namespace)
Definition: messages.F90:525
subroutine, public messages_obsolete_variable(namespace, name, rep)
Definition: messages.F90:1000
subroutine, public messages_new_line()
Definition: messages.F90:1089
character(len=256), dimension(max_lines), public message
to be output by fatal, warning
Definition: messages.F90:162
subroutine, public messages_fatal(no_lines, only_root_writes, namespace)
Definition: messages.F90:410
subroutine, public messages_input_error(namespace, var, details, row, column)
Definition: messages.F90:691
subroutine, public messages_experimental(name, namespace)
Definition: messages.F90:1040
subroutine, public messages_info(no_lines, iunit, debug_only, stress, all_nodes, namespace)
Definition: messages.F90:594
integer function, public parse_block(namespace, name, blk, check_varinfo_)
Definition: parser.F90:623
subroutine, public profiling_out(label)
Increment out counter and sum up difference between entry and exit time.
Definition: profiling.F90:631
subroutine, public profiling_in(label, exclude)
Increment in counter and save entry time.
Definition: profiling.F90:554
Definition: ps.F90:116
integer(int64), parameter, public splitmix64_321
Definition: quickrnd.F90:138
This module contains interfaces for ScaLAPACK routines Interfaces are from http:
Definition: scalapack.F90:133
integer, parameter, public smear_semiconductor
Definition: smear.F90:176
integer, parameter, public smear_fixed_occ
Definition: smear.F90:176
subroutine, public species_atom_density(species, namespace, space, latt, pos, mesh, spin_channels, rho)
pure logical function, public states_are_complex(st)
pure logical function, public states_are_real(st)
subroutine, public states_elec_orthogonalize(st, namespace, mesh)
Orthogonalize electronic states.
This module defines routines to write information about states.
subroutine, public states_elec_write_eigenvalues(nst, st, space, kpoints, error, st_start, compact, iunit, namespace)
write the eigenvalues for some states to a file.
subroutine, public states_elec_fermi(st, namespace, mesh, compute_spin)
calculate the Fermi level for the states in this object
subroutine, public states_elec_generate_random(st, mesh, kpoints, ist_start_, ist_end_, ikpt_start_, ikpt_end_, normalized)
randomize states
brief This module defines the class unit_t which is used by the unit_systems_oct_m module.
Definition: unit.F90:134
This module defines the unit system, used for input and output.
type(unit_system_t), public units_out
type(unit_system_t), public units_inp
the units systems for reading and writing
logical function, public v_ks_is_orbital_dependent(ks)
Is the theory method and functional orbital-dependent?
Definition: v_ks.F90:1514
subroutine, public v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, calc_eigenval, time, calc_energy, calc_current, force_semilocal)
Definition: v_ks.F90:720
subroutine, public v_ks_h_setup(namespace, space, gr, ions, ext_partners, st, ks, hm, calc_eigenval, calc_current)
Definition: v_ks.F90:666
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:171
Describes mesh distribution to nodes.
Definition: mesh.F90:187
A type storing the information and data about a pseudopotential.
Definition: ps.F90:188
The states_elec_t class contains all electronic wave functions.
int true(void)