Octopus
v_ks.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 v_ks_oct_m
22 use accel_oct_m
23 use types_oct_m
25 use debug_oct_m
28 use energy_oct_m
32 use global_oct_m
33 use grid_oct_m
37 use ions_oct_m
38 use, intrinsic :: iso_fortran_env
39 use isdf_oct_m, only: isdf_parallel_ace_compute_potentials => isdf_ace_compute_potentials
44 use lda_u_oct_m
48 use mesh_oct_m
51 use mpi_oct_m
54 use parser_oct_m
57 use pseudo_oct_m
60 use sort_oct_m
61 use space_oct_m
69 use xc_cam_oct_m
70 use xc_oct_m
71 use xc_f03_lib_m
72 use xc_fbe_oct_m
77 use xc_oep_oct_m
78 use xc_sic_oct_m
79 use xc_vxc_oct_m
80 use xc_vdw_oct_m
82
83 ! from the dftd3 library
84 use dftd3_api
85
86 implicit none
87
88 private
89 public :: &
90 v_ks_t, &
92 v_ks_init, &
93 v_ks_end, &
96 v_ks_calc, &
103
104 type v_ks_calc_t
105 private
106 logical :: calculating
107 logical :: time_present
108 real(real64) :: time
109 real(real64), allocatable :: density(:, :)
110 logical :: total_density_alloc
111 real(real64), pointer, contiguous :: total_density(:)
112 type(energy_t), allocatable :: energy
113
114 type(states_elec_t), pointer :: hf_st
118
119 real(real64), allocatable :: vxc(:, :)
120 real(real64), allocatable :: vtau(:, :)
121 real(real64), allocatable :: axc(:, :, :)
122 real(real64), allocatable :: a_ind(:, :)
123 real(real64), allocatable :: b_ind(:, :)
124 logical :: calc_energy
125 end type v_ks_calc_t
126
127 type v_ks_t
128 private
129 integer, public :: theory_level = -1
130 logical, public :: frozen_hxc = .false.
131
132 integer, public :: xc_family = 0
133 integer, public :: xc_flags = 0
134 type(xc_t), public :: xc
135 type(xc_oep_t), public :: oep
136 type(xc_ks_inversion_t), public :: ks_inversion
137 type(xc_sic_t), public :: sic
138 type(xc_vdw_t), public :: vdw
139 type(grid_t), pointer, public :: gr
140 type(v_ks_calc_t) :: calc
141 logical :: calculate_current = .false.
142 type(current_t) :: current_calculator
143 logical :: include_td_field = .false.
144
145 real(real64), public :: stress_xc_gga(3, 3)
146 type(v_ks_photon_t), public :: v_ks_photons
147 end type v_ks_t
148
149contains
150
151 ! ---------------------------------------------------------
152 subroutine v_ks_init(ks, namespace, gr, st, ions, mc, space, kpoints)
153 type(v_ks_t), intent(inout) :: ks
154 type(namespace_t), intent(in) :: namespace
155 type(grid_t), target, intent(inout) :: gr
156 type(states_elec_t), intent(in) :: st
157 type(ions_t), intent(inout) :: ions
158 type(multicomm_t), intent(in) :: mc
159 class(space_t), intent(in) :: space
160 type(kpoints_t), intent(in) :: kpoints
161
162 integer :: x_id, c_id, xk_id, ck_id, default, val
163 logical :: parsed_theory_level, using_hartree_fock
164 integer :: pseudo_x_functional, pseudo_c_functional
165 integer :: oep_type
166
167 push_sub(v_ks_init)
168
169 ! We need to parse TheoryLevel and XCFunctional, this is
170 ! complicated because they are interdependent.
171
172 !%Variable TheoryLevel
173 !%Type integer
174 !%Section Hamiltonian
175 !%Description
176 !% The calculations can be run with different "theory levels" that
177 !% control how electrons are simulated. The default is
178 !% <tt>dft</tt>. When hybrid functionals are requested, through
179 !% the <tt>XCFunctional</tt> variable, the default is
180 !% <tt>hartree_fock</tt>.
181 !%Option independent_particles 2
182 !% Particles will be considered as independent, <i>i.e.</i> as non-interacting.
183 !% This mode is mainly used for testing purposes, as the code is usually
184 !% much faster with <tt>independent_particles</tt>.
185 !%Option hartree 1
186 !% Calculation within the Hartree method (experimental). Note that, contrary to popular
187 !% belief, the Hartree potential is self-interaction-free. Therefore, this run
188 !% mode will not yield the same result as <tt>kohn-sham</tt> without exchange-correlation.
189 !%Option hartree_fock 3
190 !% This is the traditional Hartree-Fock scheme. Like the Hartree scheme, it is fully
191 !% self-interaction-free.
192 !%Option kohn_sham 4
193 !% This is the default density-functional theory scheme. Note that you can also use
194 !% hybrid functionals in this scheme, but they will be handled the "DFT" way, <i>i.e.</i>,
195 !% solving the OEP equation.
196 !%Option generalized_kohn_sham 5
197 !% This is similar to the <tt>kohn-sham</tt> scheme, except that this allows for nonlocal operators.
198 !% This is the default mode to run hybrid functionals, meta-GGA functionals, or DFT+U.
199 !% It can be more convenient to use <tt>kohn-sham</tt> DFT within the OEP scheme to get similar (but not the same) results.
200 !% Note that within this scheme you can use a correlation functional, or a hybrid
201 !% functional (see <tt>XCFunctional</tt>). In the latter case, you will be following the
202 !% quantum-chemistry recipe to use hybrids.
203 !%Option rdmft 7
204 !% (Experimental) Reduced Density Matrix functional theory.
205 !%End
207 ks%xc_family = xc_family_none
208 ks%sic%level = sic_none
209 ks%oep%level = oep_level_none
210
211 ks%theory_level = kohn_sham_dft
212 parsed_theory_level = .false.
213
214 ! the user knows what he wants, give her that
215 if (parse_is_defined(namespace, 'TheoryLevel')) then
216 call parse_variable(namespace, 'TheoryLevel', kohn_sham_dft, ks%theory_level)
217 if (.not. varinfo_valid_option('TheoryLevel', ks%theory_level)) call messages_input_error(namespace, 'TheoryLevel')
219 parsed_theory_level = .true.
220 end if
221
222 ! parse the XC functional
223
224 call get_functional_from_pseudos(pseudo_x_functional, pseudo_c_functional)
226 default = 0
227 if (ks%theory_level == kohn_sham_dft .or. ks%theory_level == generalized_kohn_sham_dft) then
228 default = xc_get_default_functional(space%dim, pseudo_x_functional, pseudo_c_functional)
229 end if
231 if (.not. parse_is_defined(namespace, 'XCFunctional') &
232 .and. (pseudo_x_functional /= pseudo_exchange_any .or. pseudo_c_functional /= pseudo_correlation_any)) then
233 call messages_write('Info: the XCFunctional has been selected to match the pseudopotentials', new_line = .true.)
234 call messages_write(' used in the calculation.')
235 call messages_info(namespace=namespace)
236 end if
238 ! The description of this variable can be found in file src/xc/functionals_list.F90
239 call parse_variable(namespace, 'XCFunctional', default, val)
241 ! the first 3 digits of the number indicate the X functional and
242 ! the next 3 the C functional.
243 c_id = val / libxc_c_index
244 x_id = val - c_id * libxc_c_index
245
246 if ((x_id /= pseudo_x_functional .and. pseudo_x_functional /= pseudo_exchange_any) .or. &
247 (c_id /= pseudo_c_functional .and. pseudo_c_functional /= pseudo_correlation_any)) then
248 call messages_write('The XCFunctional that you selected does not match the one used', new_line = .true.)
249 call messages_write('to generate the pseudopotentials.')
250 call messages_warning(namespace=namespace)
251 end if
252
253 ! FIXME: we rarely need this. We should only parse when necessary.
254
255 !%Variable XCKernel
256 !%Type integer
257 !%Default -1
258 !%Section Hamiltonian::XC
259 !%Description
260 !% Defines the exchange-correlation kernel. Only LDA kernels are available currently.
261 !% The options are the same as <tt>XCFunctional</tt>.
262 !% Note: the kernel is only needed for Casida, Sternheimer, or optimal-control calculations.
263 !%Option xc_functional -1
264 !% The same functional defined by <tt>XCFunctional</tt>. By default, this is the case.
265 !%End
266 call parse_variable(namespace, 'XCKernel', -1, val)
267 if (-1 == val) then
268 ck_id = c_id
269 xk_id = x_id
270 else
271 ck_id = val / libxc_c_index
272 xk_id = val - ck_id * libxc_c_index
273 end if
274
275 call messages_obsolete_variable(namespace, 'XFunctional', 'XCFunctional')
276 call messages_obsolete_variable(namespace, 'CFunctional', 'XCFunctional')
277
278 call ks%v_ks_photons%init(namespace)
279
280 ! initialize XC modules
281
282 ! This is a bit ugly, theory_level might not be generalized KS or HF now
283 ! but it might become generalized KS or HF later. This is safe because it
284 ! becomes generalized KS in the cases where the functional is hybrid
285 ! and the ifs inside check for both conditions.
286 using_hartree_fock = (ks%theory_level == hartree_fock) &
287 .or. (ks%theory_level == generalized_kohn_sham_dft .and. family_is_hybrid(ks%xc))
288 call xc_init(ks%xc, namespace, space%dim, space%periodic_dim, st%qtot, &
289 x_id, c_id, xk_id, ck_id, hartree_fock = using_hartree_fock, ispin=st%d%ispin)
290
291 ks%xc_family = ks%xc%family
292 ks%xc_flags = ks%xc%flags
293
294 if (.not. parsed_theory_level) then
295 default = kohn_sham_dft
296
297 ! the functional is a hybrid, use Hartree-Fock as theory level by default
298 if (family_is_hybrid(ks%xc) .or. family_is_mgga_with_exc(ks%xc)) then
300 end if
301
302 ! In principle we do not need to parse. However we do it for consistency
303 call parse_variable(namespace, 'TheoryLevel', default, ks%theory_level)
304 if (.not. varinfo_valid_option('TheoryLevel', ks%theory_level)) call messages_input_error(namespace, 'TheoryLevel')
305
306 end if
307
308 ! In case we need OEP, we need to find which type of OEP it is
309 oep_type = -1
310 if (family_is_mgga_with_exc(ks%xc)) then
311 call messages_experimental('MGGA energy functionals')
312
313 if (ks%theory_level == kohn_sham_dft) then
314 call messages_experimental("MGGA within the Kohn-Sham scheme")
315 ks%xc_family = ior(ks%xc_family, xc_family_oep)
316 oep_type = oep_type_mgga
317 end if
318 end if
319
320 call messages_obsolete_variable(namespace, 'NonInteractingElectrons', 'TheoryLevel')
321 call messages_obsolete_variable(namespace, 'HartreeFock', 'TheoryLevel')
322
323 ! Due to how the code is made, we need to set this to have theory level other than DFT
324 ! correct...
325 ks%sic%amaldi_factor = m_one
326
327 select case (ks%theory_level)
329
330 case (hartree)
331 call messages_experimental("Hartree theory level")
332 if (space%periodic_dim == space%dim) then
333 call messages_experimental("Hartree in fully periodic system")
334 end if
335 if (kpoints%full%npoints > 1) then
336 call messages_not_implemented("Hartree with k-points", namespace=namespace)
337 end if
338
339 case (hartree_fock)
340 if (kpoints%full%npoints > 1) then
341 call messages_experimental("Hartree-Fock with k-points")
342 end if
343
345 if (kpoints%full%npoints > 1 .and. family_is_hybrid(ks%xc)) then
346 call messages_experimental("Hybrid functionals with k-points")
347 end if
348
349 case (rdmft)
350 call messages_experimental('RDMFT theory level')
351
352 case (kohn_sham_dft)
353
354 ! check for SIC
355 if (bitand(ks%xc_family, xc_family_lda + xc_family_gga) /= 0) then
356 call xc_sic_init(ks%sic, namespace, gr, st, mc, space)
357 end if
358
359 if (bitand(ks%xc_family, xc_family_oep) /= 0) then
360 select case (ks%xc%functional(func_x,1)%id)
361 case (xc_oep_x_slater)
362 if (kpoints%reduced%npoints > 1 .and. st%d%ispin == spinors) then
363 call messages_not_implemented("Slater with k-points and spinor wavefunctions", namespace=namespace)
364 end if
365 if (kpoints%use_symmetries) then
366 call messages_not_implemented("Slater with k-points symmetries", namespace=namespace)
367 end if
368 ks%oep%level = oep_level_none
369 case (xc_oep_x_fbe)
370 if (kpoints%reduced%npoints > 1) then
371 call messages_not_implemented("FBE functional with k-points", namespace=namespace)
372 end if
373 ks%oep%level = oep_level_none
374 case default
375 if((.not. ks%v_ks_photons%active()) .or. (ks%v_ks_photons%functional() /= 0)) then
376 if(oep_type == -1) then ! Else we have a MGGA
377 oep_type = oep_type_exx
378 end if
379 call xc_oep_init(ks%oep, namespace, gr, st, mc, space, oep_type)
380 end if
381 end select
382 else
383 ks%oep%level = oep_level_none
384 end if
385
386 if (bitand(ks%xc_family, xc_family_ks_inversion) /= 0) then
387 call xc_ks_inversion_init(ks%ks_inversion, namespace, gr, ions, st, ks%xc, mc, space, kpoints)
388 end if
389
390 end select
391
392 if (ks%theory_level /= kohn_sham_dft .and. parse_is_defined(namespace, "SICCorrection")) then
393 message(1) = "SICCorrection can only be used with Kohn-Sham DFT"
394 call messages_fatal(1, namespace=namespace)
395 end if
396
397 if (st%d%ispin == spinors) then
398 if (bitand(ks%xc_family, xc_family_mgga + xc_family_hyb_mgga) /= 0) then
399 call messages_not_implemented("MGGA with spinors", namespace=namespace)
400 end if
401 end if
402
403 ks%frozen_hxc = .false.
404
405 call v_ks_write_info(ks, namespace=namespace)
406
407 ks%gr => gr
408 ks%calc%calculating = .false.
409
410 !The value of ks%calculate_current is set to false or true by Output
411 call current_init(ks%current_calculator, namespace)
412
413 call ks%vdw%init(namespace, space, gr, ks%xc, ions, x_id, c_id)
414 if (ks%vdw%vdw_correction /= option__vdwcorrection__none .and. ks%theory_level == rdmft) then
415 message(1) = "VDWCorrection and RDMFT are not compatible"
416 call messages_fatal(1, namespace=namespace)
417 end if
418 if (ks%vdw%vdw_correction /= option__vdwcorrection__none .and. ks%theory_level == independent_particles) then
419 message(1) = "VDWCorrection and independent particles are not compatible"
420 call messages_fatal(1, namespace=namespace)
421 end if
422
423 call ks%v_ks_photons%init_xc(namespace, space, gr, st)
424
425 pop_sub(v_ks_init)
426
427 contains
428
430 subroutine get_functional_from_pseudos(x_functional, c_functional)
431 integer, intent(out) :: x_functional
432 integer, intent(out) :: c_functional
433
434 integer :: xf, cf, ispecies
435 logical :: warned_inconsistent
436
437 x_functional = pseudo_exchange_any
438 c_functional = pseudo_correlation_any
439
440 warned_inconsistent = .false.
441 do ispecies = 1, ions%nspecies
442 select type(spec=>ions%species(ispecies)%s)
443 class is(pseudopotential_t)
444 xf = spec%x_functional()
445 cf = spec%c_functional()
446
447 if (xf == pseudo_exchange_unknown .or. cf == pseudo_correlation_unknown) then
448 call messages_write("Unknown XC functional for species '"//trim(ions%species(ispecies)%s%get_label())//"'")
449 call messages_warning(namespace=namespace)
450 cycle
451 end if
452
453 if (x_functional == pseudo_exchange_any) then
454 x_functional = xf
455 else
456 if (xf /= x_functional .and. .not. warned_inconsistent) then
457 call messages_write('Inconsistent XC functional detected between species')
458 call messages_warning(namespace=namespace)
459 warned_inconsistent = .true.
460 end if
461 end if
462
463 if (c_functional == pseudo_correlation_any) then
464 c_functional = cf
465 else
466 if (cf /= c_functional .and. .not. warned_inconsistent) then
467 call messages_write('Inconsistent XC functional detected between species')
468 call messages_warning(namespace=namespace)
469 warned_inconsistent = .true.
470 end if
471 end if
472
473 class default
476 end select
477
478 end do
479
480 assert(x_functional /= pseudo_exchange_unknown)
481 assert(c_functional /= pseudo_correlation_unknown)
482
483 end subroutine get_functional_from_pseudos
484 end subroutine v_ks_init
485 ! ---------------------------------------------------------
486
487 ! ---------------------------------------------------------
488 subroutine v_ks_end(ks)
489 type(v_ks_t), intent(inout) :: ks
490
491 push_sub(v_ks_end)
492
493 call ks%vdw%end()
494
495 select case (ks%theory_level)
496 case (kohn_sham_dft)
497 if (bitand(ks%xc_family, xc_family_ks_inversion) /= 0) then
498 call xc_ks_inversion_end(ks%ks_inversion)
499 end if
500 if (bitand(ks%xc_family, xc_family_oep) /= 0) then
501 call xc_oep_end(ks%oep)
502 end if
503 call xc_end(ks%xc)
505 call xc_end(ks%xc)
506 end select
507
508 call xc_sic_end(ks%sic)
509
510 call ks%v_ks_photons%end()
511
512 pop_sub(v_ks_end)
513 end subroutine v_ks_end
514 ! ---------------------------------------------------------
515
516
517 ! ---------------------------------------------------------
518 subroutine v_ks_write_info(ks, iunit, namespace)
519 type(v_ks_t), intent(in) :: ks
520 integer, optional, intent(in) :: iunit
521 type(namespace_t), optional, intent(in) :: namespace
522
523 push_sub(v_ks_write_info)
524
525 call messages_print_with_emphasis(msg="Theory Level", iunit=iunit, namespace=namespace)
526 call messages_print_var_option("TheoryLevel", ks%theory_level, iunit=iunit, namespace=namespace)
527
528 select case (ks%theory_level)
530 call messages_info(iunit=iunit, namespace=namespace)
531 call xc_write_info(ks%xc, iunit, namespace)
532
533 case (kohn_sham_dft)
534 call messages_info(iunit=iunit, namespace=namespace)
535 call xc_write_info(ks%xc, iunit, namespace)
536
537 call messages_info(iunit=iunit, namespace=namespace)
538
539 call xc_sic_write_info(ks%sic, iunit, namespace)
540 call xc_oep_write_info(ks%oep, iunit, namespace)
541 call xc_ks_inversion_write_info(ks%ks_inversion, iunit, namespace)
542
543 end select
544
545 call messages_print_with_emphasis(iunit=iunit, namespace=namespace)
546
547 pop_sub(v_ks_write_info)
548 end subroutine v_ks_write_info
549 ! ---------------------------------------------------------
550
551
552 !----------------------------------------------------------
553 subroutine v_ks_h_setup(namespace, space, gr, ions, ext_partners, st, ks, hm, calc_eigenval, calc_current)
554 type(namespace_t), intent(in) :: namespace
555 type(electron_space_t), intent(in) :: space
556 type(grid_t), intent(in) :: gr
557 type(ions_t), intent(in) :: ions
558 type(partner_list_t), intent(in) :: ext_partners
559 type(states_elec_t), intent(inout) :: st
560 type(v_ks_t), intent(inout) :: ks
561 type(hamiltonian_elec_t), intent(inout) :: hm
562 logical, optional, intent(in) :: calc_eigenval
563 logical, optional, intent(in) :: calc_current
564
565 integer, allocatable :: ind(:)
566 integer :: ist, ik
567 real(real64), allocatable :: copy_occ(:)
568 logical :: calc_eigenval_
569 logical :: calc_current_
570
571 push_sub(v_ks_h_setup)
572
573 calc_eigenval_ = optional_default(calc_eigenval, .true.)
574 calc_current_ = optional_default(calc_current, .true.)
575 call states_elec_fermi(st, namespace, gr)
576 call density_calc(st, gr, st%rho)
577 call v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, &
578 calc_eigenval = calc_eigenval_, calc_current = calc_current_) ! get potentials
579
580 if (st%restart_reorder_occs .and. .not. st%fromScratch) then
581 message(1) = "Reordering occupations for restart."
582 call messages_info(1, namespace=namespace)
584 safe_allocate(ind(1:st%nst))
585 safe_allocate(copy_occ(1:st%nst))
586
587 do ik = 1, st%nik
588 call sort(st%eigenval(:, ik), ind)
589 copy_occ(1:st%nst) = st%occ(1:st%nst, ik)
590 do ist = 1, st%nst
591 st%occ(ist, ik) = copy_occ(ind(ist))
592 end do
593 end do
594
595 safe_deallocate_a(ind)
596 safe_deallocate_a(copy_occ)
597 end if
598
599 if (calc_eigenval_) call states_elec_fermi(st, namespace, gr) ! occupations
600 call energy_calc_total(namespace, space, hm, gr, st, ext_partners)
601
602 pop_sub(v_ks_h_setup)
603 end subroutine v_ks_h_setup
604
605 ! ---------------------------------------------------------
606 subroutine v_ks_calc(ks, namespace, space, hm, st, ions, ext_partners, &
607 calc_eigenval, time, calc_energy, calc_current, force_semilocal)
608 type(v_ks_t), intent(inout) :: ks
609 type(namespace_t), intent(in) :: namespace
610 type(electron_space_t), intent(in) :: space
611 type(hamiltonian_elec_t), intent(inout) :: hm
612 type(states_elec_t), intent(inout) :: st
613 type(ions_t), intent(in) :: ions
614 type(partner_list_t), intent(in) :: ext_partners
615 logical, optional, intent(in) :: calc_eigenval
616 real(real64), optional, intent(in) :: time
617 logical, optional, intent(in) :: calc_energy
618 logical, optional, intent(in) :: calc_current
619 logical, optional, intent(in) :: force_semilocal
620
621 logical :: calc_current_
622
623 push_sub(v_ks_calc)
624
625 calc_current_ = optional_default(calc_current, .true.) &
626 .and. (ks%calculate_current &
627 .and. states_are_complex(st) &
629
630 if (calc_current_) then
631 call states_elec_allocate_current(st, space, ks%gr)
632 call current_calculate(ks%current_calculator, namespace, ks%gr, hm, space, st)
633 end if
634
635 call v_ks_calc_start(ks, namespace, space, hm, st, ions, hm%kpoints%latt, ext_partners, time, &
636 calc_energy, force_semilocal=force_semilocal)
637 call v_ks_calc_finish(ks, hm, namespace, space, hm%kpoints%latt, st, &
638 ext_partners, force_semilocal=force_semilocal)
639
640 if (optional_default(calc_eigenval, .false.)) then
641 call energy_calc_eigenvalues(namespace, hm, ks%gr%der, st)
642 end if
643
644 ! Update the magnetic constrain
645 call magnetic_constrain_update(hm%magnetic_constrain, ks%gr, st%d, space, hm%kpoints%latt, ions%pos, st%rho)
646 ! We add the potential to vxc, as this way the potential gets mixed together with vxc
647 ! While this is not ideal, this is a simple practical solution
648 if (hm%magnetic_constrain%level /= constrain_none) then
649 call lalg_axpy(ks%gr%np, st%d%nspin, m_one, hm%magnetic_constrain%pot, hm%ks_pot%vhxc)
650 end if
651
652 pop_sub(v_ks_calc)
653 end subroutine v_ks_calc
654
655 ! ---------------------------------------------------------
656
661 subroutine v_ks_calc_start(ks, namespace, space, hm, st, ions, latt, ext_partners, time, &
662 calc_energy, force_semilocal)
663 type(v_ks_t), target, intent(inout) :: ks
664 type(namespace_t), intent(in) :: namespace
665 class(space_t), intent(in) :: space
666 type(hamiltonian_elec_t), target, intent(in) :: hm
667 type(states_elec_t), target, intent(inout) :: st
668 type(ions_t), intent(in) :: ions
669 type(lattice_vectors_t), intent(in) :: latt
670 type(partner_list_t), intent(in) :: ext_partners
671 real(real64), optional, intent(in) :: time
672 logical, optional, intent(in) :: calc_energy
673 logical, optional, intent(in) :: force_semilocal
674
675 push_sub(v_ks_calc_start)
676
677 call profiling_in("KOHN_SHAM_CALC")
678
679 assert(.not. ks%calc%calculating)
680 ks%calc%calculating = .true.
681
682 write(message(1), '(a)') 'Debug: Calculating Kohn-Sham potential.'
683 call messages_info(1, namespace=namespace, debug_only=.true.)
684
685 ks%calc%time_present = present(time)
686 ks%calc%time = optional_default(time, m_zero)
687
688 ks%calc%calc_energy = optional_default(calc_energy, .true.)
689
690 ! If the Hxc term is frozen, there is nothing more to do (WARNING: MISSING ks%calc%energy%intnvxc)
691 if (ks%frozen_hxc) then
692 call profiling_out("KOHN_SHAM_CALC")
693 pop_sub(v_ks_calc_start)
694 return
695 end if
696
697 allocate(ks%calc%energy)
698
699 call energy_copy(hm%energy, ks%calc%energy)
700
701 ks%calc%energy%intnvxc = m_zero
702
703 nullify(ks%calc%total_density)
704
705 if (ks%theory_level /= independent_particles .and. abs(ks%sic%amaldi_factor) > m_epsilon) then
706
707 call calculate_density()
708
709 if (poisson_is_async(hm%psolver)) then
710 call dpoisson_solve_start(hm%psolver, ks%calc%total_density)
711 end if
712
713 if (ks%theory_level /= hartree .and. ks%theory_level /= rdmft) call v_a_xc(hm, force_semilocal)
714 else
715 ks%calc%total_density_alloc = .false.
716 end if
717
718 ! The exchange operator is computed from the states of the previous iteration
719 ! This is done by copying the state object to ks%calc%hf_st
720 ! For ACE, the states are the same in ks%calc%hf_st and st, as we compute the
721 ! ACE potential in v_ks_finish, so the copy is not needed
722 nullify(ks%calc%hf_st)
723 if (ks%theory_level == hartree .or. ks%theory_level == hartree_fock &
724 .or. ks%theory_level == rdmft .or. (ks%theory_level == generalized_kohn_sham_dft &
725 .and. family_is_hybrid(ks%xc))) then
726
727 if (st%parallel_in_states) then
728 if (accel_is_enabled()) then
729 call messages_write('State parallelization of Hartree-Fock exchange is not supported')
730 call messages_new_line()
731 call messages_write('when running with GPUs. Please use domain parallelization')
732 call messages_new_line()
733 call messages_write("or disable acceleration using 'DisableAccel = yes'.")
734 call messages_fatal(namespace=namespace)
735 end if
736 end if
737
738 if (hm%exxop%useACE) then
739 ks%calc%hf_st => st
740 else
741 safe_allocate(ks%calc%hf_st)
742 call states_elec_copy(ks%calc%hf_st, st)
743 end if
744 end if
745
746 ! Calculate the vector potential induced by the electronic current.
747 ! WARNING: calculating the self-induced magnetic field here only makes
748 ! sense if it is going to be used in the Hamiltonian, which does not happen
749 ! now. Otherwise one could just calculate it at the end of the calculation.
750 if (hm%self_induced_magnetic) then
751 safe_allocate(ks%calc%a_ind(1:ks%gr%np_part, 1:space%dim))
752 safe_allocate(ks%calc%b_ind(1:ks%gr%np_part, 1:space%dim))
753 call magnetic_induced(namespace, ks%gr, st, hm%psolver, hm%kpoints, ks%calc%a_ind, ks%calc%b_ind)
754 end if
755
756 if ((ks%v_ks_photons%active()) .and. (ks%calc%time_present) .and. (ks%v_ks_photons%functional() == 0) ) then
757 call ks%v_ks_photons%mf_calc(ks%gr, st, ions, time)
758 end if
759
760 ! if (ks%has_vibrations) then
761 ! call vibrations_eph_coup(ks%vib, ks%gr, hm, ions, st)
762 ! end if
763
764 call profiling_out("KOHN_SHAM_CALC")
765 pop_sub(v_ks_calc_start)
766
767 contains
768
769 subroutine calculate_density()
770 integer :: ip
771
773
774 ! get density taking into account non-linear core corrections
775 safe_allocate(ks%calc%density(1:ks%gr%np, 1:st%d%nspin))
776 call states_elec_total_density(st, ks%gr, ks%calc%density)
777
778 ! Amaldi correction on CPU
779 if (ks%sic%level == sic_amaldi) then
780 call lalg_scal(ks%gr%np, st%d%nspin, ks%sic%amaldi_factor, ks%calc%density)
781 end if
782
783 ! GPU counterpart of the CPU corrections above: the CPU path includes rho_core, frozen_rho,
784 ! and Amaldi scaling directly into ks%calc%density before calling xc_get_vxc.
785 ! On the GPU we cannot do the same to st%buff_density because:
786 ! - it is in wavefunction storage layout (pnp, nspin) while libxc expects (spin_channels, np)
787 ! - permanently modifying st%buff_density would corrupt the density for subsequent SCF steps.
788 ! Instead we upload the correction arrays here so that xc_update_internal_quantities can apply
789 ! them to dens_buff (already in libxc layout) via the xc_dens_apply_corrections kernel,
790 ! immediately after the xc_dens_extract_block kernel runs.
791 if (.not. ks%xc%xc_on_host .and. accel_buffer_is_allocated(st%buff_density)) then
792 if (allocated(st%rho_core)) then
793 call accel_create_buffer(ks%xc%quantities%buff_rho_core, &
794 accel_mem_read_only, type_float, int(ks%gr%np, int64))
795 call accel_write_buffer(ks%xc%quantities%buff_rho_core, &
796 int(ks%gr%np, int64), st%rho_core)
797 end if
798 if (allocated(st%frozen_rho)) then
799 call accel_create_buffer(ks%xc%quantities%buff_frozen_rho, &
800 accel_mem_read_only, type_float, int(ks%gr%np, int64)*int(st%d%nspin, int64))
801 call accel_write_buffer(ks%xc%quantities%buff_frozen_rho, &
802 int(ks%gr%np, int64), int(st%d%nspin, int64), st%frozen_rho)
803 ks%xc%quantities%frozen_rho_np = ks%gr%np
804 end if
805 if (ks%sic%level == sic_amaldi) then
806 ks%xc%quantities%amaldi_factor = ks%sic%amaldi_factor
807 end if
808 end if
809
810 nullify(ks%calc%total_density)
811 if (allocated(st%rho_core) .or. hm%d%spin_channels > 1) then
812 ks%calc%total_density_alloc = .true.
813
814 safe_allocate(ks%calc%total_density(1:ks%gr%np))
815
816 do ip = 1, ks%gr%np
817 ks%calc%total_density(ip) = sum(ks%calc%density(ip, 1:hm%d%spin_channels))
818 end do
819
820 ! remove non-local core corrections
821 if (allocated(st%rho_core)) then
822 call lalg_axpy(ks%gr%np, -ks%sic%amaldi_factor, st%rho_core, ks%calc%total_density)
823 end if
824 else
825 ks%calc%total_density_alloc = .false.
826 ks%calc%total_density => ks%calc%density(:, 1)
827 end if
828
830 end subroutine calculate_density
831
832 ! ---------------------------------------------------------
833 subroutine v_a_xc(hm, force_semilocal)
834 type(hamiltonian_elec_t), intent(in) :: hm
835 logical, optional, intent(in) :: force_semilocal
836
837 push_sub(v_ks_calc_start.v_a_xc)
838 call profiling_in("XC")
839
840 ks%calc%energy%exchange = m_zero
841 ks%calc%energy%correlation = m_zero
842 ks%calc%energy%xc_j = m_zero
843 ks%calc%energy%vdw = m_zero
844
845 allocate(ks%calc%vxc(1:ks%gr%np, 1:st%d%nspin))
846 ks%calc%vxc = m_zero
847
848 if (family_is_mgga_with_exc(hm%xc)) then
849 safe_allocate(ks%calc%vtau(1:ks%gr%np, 1:st%d%nspin))
850 ks%calc%vtau = m_zero
851 end if
852
853 ! Get the *local* XC term
854 if (ks%calc%calc_energy) then
855 if (family_is_mgga_with_exc(hm%xc)) then
856 call xc_get_vxc(ks%gr, ks%xc, st, hm%kpoints, hm%psolver, namespace, space, ks%calc%density, st%d%ispin, &
857 latt%rcell_volume, ks%calc%vxc, ex = ks%calc%energy%exchange, ec = ks%calc%energy%correlation, &
858 deltaxc = ks%calc%energy%delta_xc, vtau = ks%calc%vtau, force_orbitalfree=force_semilocal)
859 else
860 call xc_get_vxc(ks%gr, ks%xc, st, hm%kpoints, hm%psolver, namespace, space, ks%calc%density, st%d%ispin, &
861 latt%rcell_volume, ks%calc%vxc, ex = ks%calc%energy%exchange, ec = ks%calc%energy%correlation, &
862 deltaxc = ks%calc%energy%delta_xc, stress_xc=ks%stress_xc_gga, force_orbitalfree=force_semilocal)
863 end if
864 else
865 if (family_is_mgga_with_exc(hm%xc)) then
866 call xc_get_vxc(ks%gr, ks%xc, st, hm%kpoints, hm%psolver, namespace, space, ks%calc%density, &
867 st%d%ispin, latt%rcell_volume, ks%calc%vxc, vtau = ks%calc%vtau, force_orbitalfree=force_semilocal)
868 else
869 call xc_get_vxc(ks%gr, ks%xc, st, hm%kpoints, hm%psolver, namespace, space, ks%calc%density, &
870 st%d%ispin, latt%rcell_volume, ks%calc%vxc, stress_xc=ks%stress_xc_gga, force_orbitalfree=force_semilocal)
871 end if
872 end if
873
874 !Noncollinear functionals
875 if (bitand(hm%xc%family, xc_family_nc_lda + xc_family_nc_mgga) /= 0) then
876 if (st%d%ispin /= spinors) then
877 message(1) = "Noncollinear functionals can only be used with spinor wavefunctions."
878 call messages_fatal(1)
879 end if
880
881 if (optional_default(force_semilocal, .false.)) then
882 message(1) = "Cannot perform LCAO for noncollinear MGGAs."
883 message(2) = "Please perform a LDA calculation first."
884 call messages_fatal(2)
885 end if
886
887 if (ks%calc%calc_energy) then
888 if (family_is_mgga_with_exc(hm%xc)) then
889 call xc_get_nc_vxc(ks%gr, ks%xc, st, hm%kpoints, space, namespace, ks%calc%density, ks%calc%vxc, &
890 vtau = ks%calc%vtau, ex = ks%calc%energy%exchange, ec = ks%calc%energy%correlation)
891 else
892 call xc_get_nc_vxc(ks%gr, ks%xc, st, hm%kpoints, space, namespace, ks%calc%density, ks%calc%vxc, &
893 ex = ks%calc%energy%exchange, ec = ks%calc%energy%correlation)
894 end if
895 else
896 if (family_is_mgga_with_exc(hm%xc)) then
897 call xc_get_nc_vxc(ks%gr, ks%xc, st, hm%kpoints, space, namespace, ks%calc%density, &
898 ks%calc%vxc, vtau = ks%calc%vtau)
899 else
900 call xc_get_nc_vxc(ks%gr, ks%xc, st, hm%kpoints, space, namespace, ks%calc%density, ks%calc%vxc)
901 end if
902 end if
903 end if
904
905 call ks%vdw%calc(namespace, space, latt, ions%atom, ions%natoms, ions%pos, &
906 ks%gr, st, ks%calc%energy%vdw, ks%calc%vxc)
907
908 if (optional_default(force_semilocal, .false.)) then
909 call profiling_out("XC")
910 pop_sub(v_ks_calc_start.v_a_xc)
911 return
912 end if
913
914 ! ADSIC correction
915 if (ks%sic%level == sic_adsic) then
916 if (family_is_mgga(hm%xc%family)) then
917 call messages_not_implemented('ADSIC with MGGAs', namespace=namespace)
918 end if
919 if (ks%calc%calc_energy) then
920 call xc_sic_calc_adsic(ks%sic, namespace, space, ks%gr, st, hm, ks%xc, ks%calc%density, &
921 ks%calc%vxc, ex = ks%calc%energy%exchange, ec = ks%calc%energy%correlation)
922 else
923 call xc_sic_calc_adsic(ks%sic, namespace, space, ks%gr, st, hm, ks%xc, ks%calc%density, &
924 ks%calc%vxc)
925 end if
926 end if
927 !PZ SIC is done in the finish routine as OEP full needs to update the Hamiltonian
929 if (ks%theory_level == kohn_sham_dft) then
930 ! The OEP family has to be handled specially
931 ! Note that OEP is done in the finish state, as it requires updating the Hamiltonian and needs the new Hartre and vxc term
932 if (bitand(ks%xc_family, xc_family_oep) /= 0 .or. family_is_mgga_with_exc(ks%xc)) then
933
934 if (ks%xc%functional(func_x,1)%id == xc_oep_x_slater) then
935 call x_slater_calc(namespace, ks%gr, space, hm%exxop, st, hm%kpoints, ks%calc%energy%exchange, &
936 vxc = ks%calc%vxc)
937 else if (ks%xc%functional(func_x,1)%id == xc_oep_x_fbe .or. ks%xc%functional(func_x,1)%id == xc_oep_x_fbe_sl) then
938 call x_fbe_calc(ks%xc%functional(func_x,1)%id, namespace, hm%psolver, ks%gr, st, space, &
939 ks%calc%energy%exchange, vxc = ks%calc%vxc)
940
941 else if (ks%xc%functional(func_c,1)%id == xc_lda_c_fbe_sl) then
942
943 call fbe_c_lda_sl(namespace, ks%gr, st, space, ks%calc%energy%correlation, vxc = ks%calc%vxc)
944
945 end if
946
947 end if
948
949 if (bitand(ks%xc_family, xc_family_ks_inversion) /= 0) then
950 ! Also treat KS inversion separately (not part of libxc)
951 call xc_ks_inversion_calc(ks%ks_inversion, namespace, space, ks%gr, hm, ext_partners, st, vxc = ks%calc%vxc, &
952 time = ks%calc%time)
953 end if
954
955 ! compute the photon-free photon exchange potential and energy
956 if (ks%v_ks_photons%functional() /= 0) then
957 call ks%v_ks_photons%add_px(namespace, ks%calc%total_density, ks%gr, space, hm%psolver, st, &
958 hm%d%spin_channels, ks%calc%vxc, ks%calc%energy%photon_exchange)
959 end if
960
961 end if
962
963 if (ks%calc%calc_energy) then
964 ! MGGA vtau contribution is done after copying vtau to hm%vtau
965
966 call v_ks_update_dftu_energy(ks, namespace, hm, st, ks%calc%energy%int_dft_u)
967 end if
968
969 call profiling_out("XC")
970 pop_sub(v_ks_calc_start.v_a_xc)
971 end subroutine v_a_xc
972
973 end subroutine v_ks_calc_start
974 ! ---------------------------------------------------------
975
976 subroutine v_ks_calc_finish(ks, hm, namespace, space, latt, st, ext_partners, force_semilocal)
977 type(v_ks_t), target, intent(inout) :: ks
978 type(hamiltonian_elec_t), intent(inout) :: hm
979 type(namespace_t), intent(in) :: namespace
980 class(space_t), intent(in) :: space
981 type(lattice_vectors_t), intent(in) :: latt
982 type(states_elec_t), intent(inout) :: st
983 type(partner_list_t), intent(in) :: ext_partners
984 logical, optional, intent(in) :: force_semilocal
985
986 integer :: ip, ispin
987 type(states_elec_t) :: xst
989 real(real64) :: exx_energy
990 real(real64) :: factor
991
992 push_sub(v_ks_calc_finish)
993
994 assert(ks%calc%calculating)
995 ks%calc%calculating = .false.
996
997 if (ks%frozen_hxc) then
998 pop_sub(v_ks_calc_finish)
999 return
1000 end if
1001
1002 !change the pointer to the energy object
1003 safe_deallocate_a(hm%energy)
1004 call move_alloc(ks%calc%energy, hm%energy)
1005
1006 if (hm%self_induced_magnetic) then
1007 hm%a_ind(1:ks%gr%np, 1:space%dim) = ks%calc%a_ind(1:ks%gr%np, 1:space%dim)
1008 hm%b_ind(1:ks%gr%np, 1:space%dim) = ks%calc%b_ind(1:ks%gr%np, 1:space%dim)
1009
1010 safe_deallocate_a(ks%calc%a_ind)
1011 safe_deallocate_a(ks%calc%b_ind)
1012 end if
1013
1014 if (allocated(hm%v_static)) then
1015 hm%energy%intnvstatic = dmf_dotp(ks%gr, ks%calc%total_density, hm%v_static)
1016 else
1017 hm%energy%intnvstatic = m_zero
1018 end if
1019
1020 if (ks%theory_level == independent_particles .or. abs(ks%sic%amaldi_factor) <= m_epsilon) then
1021
1022 hm%ks_pot%vhxc = m_zero
1023 hm%energy%intnvxc = m_zero
1024 hm%energy%hartree = m_zero
1025 hm%energy%exchange = m_zero
1026 hm%energy%exchange_hf = m_zero
1027 hm%energy%correlation = m_zero
1028 else
1029
1030 hm%energy%hartree = m_zero
1031 call v_ks_hartree(namespace, ks, space, hm, ext_partners)
1032
1033 if (.not. optional_default(force_semilocal, .false.)) then
1034 !PZ-SIC
1035 if(ks%sic%level == sic_pz_oep) then
1036 if (states_are_real(st)) then
1037 call dxc_oep_calc(ks%sic%oep, namespace, ks%xc, ks%gr, hm, st, space, &
1038 latt%rcell_volume, hm%energy%exchange, hm%energy%correlation, vxc = ks%calc%vxc)
1039 else
1040 call zxc_oep_calc(ks%sic%oep, namespace, ks%xc, ks%gr, hm, st, space, &
1041 latt%rcell_volume, hm%energy%exchange, hm%energy%correlation, vxc = ks%calc%vxc)
1042 end if
1043 end if
1044
1045 ! OEP for exchange ad MGGAs (within Kohn-Sham DFT)
1046 if (ks%theory_level == kohn_sham_dft .and. ks%oep%level /= oep_level_none) then
1047 ! The OEP family has to be handled specially
1048 if (ks%xc%functional(func_x,1)%id == xc_oep_x .or. family_is_mgga_with_exc(ks%xc)) then
1049 if (states_are_real(st)) then
1050 call dxc_oep_calc(ks%oep, namespace, ks%xc, ks%gr, hm, st, space, &
1051 latt%rcell_volume, hm%energy%exchange, hm%energy%correlation, vxc = ks%calc%vxc)
1052 else
1053 call zxc_oep_calc(ks%oep, namespace, ks%xc, ks%gr, hm, st, space, &
1054 latt%rcell_volume, hm%energy%exchange, hm%energy%correlation, vxc = ks%calc%vxc)
1055 end if
1056 end if
1057 end if
1058 end if
1059
1060 if (ks%theory_level == kohn_sham_dft) then
1061 call ks%v_ks_photons%oep_calc(namespace, ks%xc, ks%gr, hm, st, space, ks%calc%vxc)
1062 end if
1063
1064
1065 if (ks%calc%calc_energy) then
1066 ! Now we calculate Int[n vxc] = energy%intnvxc
1067 hm%energy%intnvxc = m_zero
1068
1069 if (ks%theory_level /= independent_particles .and. ks%theory_level /= hartree .and. ks%theory_level /= rdmft) then
1070 do ispin = 1, hm%d%nspin
1071 if (ispin <= 2) then
1072 factor = m_one
1073 else
1074 factor = m_two
1075 end if
1076 hm%energy%intnvxc = hm%energy%intnvxc + &
1077 factor*dmf_dotp(ks%gr, st%rho(:, ispin), ks%calc%vxc(:, ispin), reduce = .false.)
1078 end do
1079 call ks%gr%allreduce(hm%energy%intnvxc)
1080 end if
1081 end if
1082
1083
1084 if (ks%theory_level /= hartree .and. ks%theory_level /= rdmft) then
1085 ! move allocation of vxc from ks%calc to hm
1086 safe_deallocate_a(hm%ks_pot%vxc)
1087 call move_alloc(ks%calc%vxc, hm%ks_pot%vxc)
1088
1089 if (family_is_mgga_with_exc(hm%xc)) then
1090 call hm%ks_pot%set_vtau(ks%calc%vtau)
1091 safe_deallocate_a(ks%calc%vtau)
1092
1093 ! We need to evaluate the energy after copying vtau to hm%vtau
1094 if (ks%theory_level == generalized_kohn_sham_dft .and. ks%calc%calc_energy) then
1095 ! MGGA vtau contribution
1096 if (states_are_real(st)) then
1097 hm%energy%intnvxc = hm%energy%intnvxc &
1098 + denergy_calc_electronic(namespace, hm, ks%gr%der, st, terms = term_mgga)
1099 else
1100 hm%energy%intnvxc = hm%energy%intnvxc &
1101 + zenergy_calc_electronic(namespace, hm, ks%gr%der, st, terms = term_mgga)
1102 end if
1103 end if
1104 end if
1105
1106 else
1107 hm%ks_pot%vxc = m_zero
1108 end if
1109
1110 if (.not. ks%v_ks_photons%includes_hartree()) then
1111 hm%energy%hartree = m_zero
1112 hm%ks_pot%vhartree = m_zero
1113 end if
1114
1115 ! Build Hartree + XC potential
1116
1117 do ip = 1, ks%gr%np
1118 hm%ks_pot%vhxc(ip, 1) = hm%ks_pot%vxc(ip, 1) + hm%ks_pot%vhartree(ip)
1119 end do
1120 if (allocated(hm%vberry)) then
1121 do ip = 1, ks%gr%np
1122 hm%ks_pot%vhxc(ip, 1) = hm%ks_pot%vhxc(ip, 1) + hm%vberry(ip, 1)
1123 end do
1124 end if
1125
1126 if (hm%d%ispin > unpolarized) then
1127 do ip = 1, ks%gr%np
1128 hm%ks_pot%vhxc(ip, 2) = hm%ks_pot%vxc(ip, 2) + hm%ks_pot%vhartree(ip)
1129 end do
1130 if (allocated(hm%vberry)) then
1131 do ip = 1, ks%gr%np
1132 hm%ks_pot%vhxc(ip, 2) = hm%ks_pot%vhxc(ip, 2) + hm%vberry(ip, 2)
1133 end do
1134 end if
1135 end if
1136
1137 if (hm%d%ispin == spinors) then
1138 do ispin=3, 4
1139 do ip = 1, ks%gr%np
1140 hm%ks_pot%vhxc(ip, ispin) = hm%ks_pot%vxc(ip, ispin)
1141 end do
1142 end do
1143 end if
1144
1145 ! Note: this includes hybrids calculated with the Fock operator instead of OEP
1146 hm%energy%exchange_hf = m_zero
1147 if (ks%theory_level == hartree .or. ks%theory_level == hartree_fock &
1148 .or. ks%theory_level == rdmft &
1149 .or. (ks%theory_level == generalized_kohn_sham_dft .and. family_is_hybrid(ks%xc))) then
1150
1151 ! swap the states object
1152 if (.not. hm%exxop%useACE) then
1153 ! We also close the MPI remote memory access to the old object
1154 if (associated(hm%exxop%st)) then
1156 call states_elec_end(hm%exxop%st)
1157 safe_deallocate_p(hm%exxop%st)
1158 end if
1159 ! We activate the MPI remote memory access for ks%calc%hf_st
1160 ! This allows to have all calls to exchange_operator_apply_standard to access
1161 ! the states over MPI
1163 end if
1164
1165 ! The exchange operator will use ks%calc%hf_st
1166 ! For the ACE case, this is the same as st
1167 if (.not. optional_default(force_semilocal, .false.)) then
1168 select case (ks%theory_level)
1170 if (family_is_hybrid(ks%xc)) then
1171 call exchange_operator_reinit(hm%exxop, ks%xc%cam, ks%calc%hf_st)
1172 end if
1173 case (hartree_fock)
1174 call exchange_operator_reinit(hm%exxop, ks%xc%cam, ks%calc%hf_st)
1175 case (hartree, rdmft)
1176 call exchange_operator_reinit(hm%exxop, cam_exact_exchange, ks%calc%hf_st)
1177 end select
1178
1179 !This should be changed and the CAM parameters should also be obtained from the restart information
1180 !Maybe the parameters should be mixed too.
1181 exx_energy = m_zero
1182 if (hm%exxop%useACE) then
1183 call xst%nullify()
1184 if (states_are_real(ks%calc%hf_st)) then
1185 ! TODO(Alex) Clean up nested if statements
1186 if (hm%exxop%with_isdf) then
1187 ! Find interpolation points from density, or read from file
1188 ! TODO(Alex) Issue #1195 Extend ISDF to spin-polarised systems
1189 call hm%exxop%isdf%get_interpolation_points(namespace, space, ks%gr, st%rho(1:ks%gr%np, 1))
1190 call isdf_ace_compute_potentials(hm%exxop, namespace, space, ks%gr, &
1191 ks%calc%hf_st, xst, hm%kpoints)
1192 else
1193 call dexchange_operator_compute_potentials(hm%exxop, namespace, space, ks%gr, &
1194 ks%calc%hf_st, xst, hm%kpoints)
1195 endif
1196 exx_energy = dexchange_operator_compute_ex(ks%gr, ks%calc%hf_st, xst)
1197 call dexchange_operator_ace(hm%exxop, namespace, ks%gr, ks%calc%hf_st, xst)
1198 else
1199 call zexchange_operator_compute_potentials(hm%exxop, namespace, space, ks%gr, &
1200 ks%calc%hf_st, xst, hm%kpoints)
1201 exx_energy = zexchange_operator_compute_ex(ks%gr, ks%calc%hf_st, xst)
1202 if (hm%phase%is_allocated()) then
1203 call zexchange_operator_ace(hm%exxop, namespace, ks%gr, ks%calc%hf_st, xst, hm%phase)
1204 else
1205 call zexchange_operator_ace(hm%exxop, namespace, ks%gr, ks%calc%hf_st, xst)
1206 end if
1207 end if
1208 call states_elec_end(xst)
1209 exx_energy = exx_energy + hm%exxop%singul%energy
1210 end if
1211
1212 ! Add the energy only the ACE case. In the non-ACE case, the singularity energy is added in energy_calc.F90
1213 select case (ks%theory_level)
1215 if (family_is_hybrid(ks%xc)) then
1216 hm%energy%exchange_hf = hm%energy%exchange_hf + exx_energy
1217 end if
1218 case (hartree_fock)
1219 hm%energy%exchange_hf = hm%energy%exchange_hf + exx_energy
1220 end select
1221 else
1222 ! If we ask for semilocal, we deactivate the exchange operator entirely
1223 call exchange_operator_reinit(hm%exxop, cam_null, ks%calc%hf_st)
1224 end if
1225 end if
1226
1227 end if
1228
1229 ! Because of the intent(in) in v_ks_calc_start, we need to update the parameters of hybrids for OEP
1230 ! here
1231 if (ks%theory_level == kohn_sham_dft .and. bitand(ks%xc_family, xc_family_oep) /= 0) then
1232 if (ks%xc%functional(func_x,1)%id /= xc_oep_x_slater .and. ks%xc%functional(func_x,1)%id /= xc_oep_x_fbe) then
1233 call exchange_operator_reinit(hm%exxop, ks%xc%cam)
1234 end if
1235 end if
1236
1237 if (ks%v_ks_photons%active() .and. (ks%v_ks_photons%functional() == 0)) then
1238 call ks%v_ks_photons%add_mf_potential(ks%gr, hm%ks_pot%vhxc, hm%d%ispin, hm%ep%photon_forces(1:space%dim))
1239 end if
1240
1241 if (ks%vdw%vdw_correction /= option__vdwcorrection__none) then
1242 assert(allocated(ks%vdw%forces))
1243 hm%ep%vdw_forces(:, :) = ks%vdw%forces(:, :)
1244 hm%ep%vdw_stress = ks%vdw%stress
1245 safe_deallocate_a(ks%vdw%forces)
1246 else
1247 hm%ep%vdw_forces = 0.0_real64
1248 end if
1249
1250 if (ks%calc%time_present .or. hm%time_zero) then
1251 call hm%update(ks%gr, namespace, space, ext_partners, time = ks%calc%time)
1252 else
1253 call hamiltonian_elec_update_pot(hm, ks%gr)
1254 end if
1255
1256
1257 safe_deallocate_a(ks%calc%density)
1258 if (ks%calc%total_density_alloc) then
1259 safe_deallocate_p(ks%calc%total_density)
1260 end if
1261 nullify(ks%calc%total_density)
1262
1263 pop_sub(v_ks_calc_finish)
1264 end subroutine v_ks_calc_finish
1265
1266
1269 !
1270 !! TODO(Alex) Once the implementation is finalised and benchmarked
1271 !! remove the serial version, and get rid of this routine.
1272 subroutine isdf_ace_compute_potentials(exxop, namespace, space, gr, hf_st, xst, kpoints)
1273 type(exchange_operator_t), intent(in ) :: exxop
1274 type(namespace_t), intent(in ) :: namespace
1275 class(space_t), intent(in ) :: space
1276 class(mesh_t), intent(in ) :: gr
1277 type(states_elec_t), intent(in ) :: hf_st
1278 type(kpoints_t), intent(in ) :: kpoints
1279
1280 type(states_elec_t), intent(inout) :: xst
1281
1282 if (exxop%isdf%use_serial) then
1283 call isdf_serial_ace_compute_potentials(exxop, namespace, space, gr, &
1284 hf_st, xst, kpoints)
1285 else
1286 call isdf_parallel_ace_compute_potentials(exxop, namespace, space, gr, &
1287 hf_st, xst, kpoints)
1288 endif
1289
1290 end subroutine isdf_ace_compute_potentials
1291
1292 ! ---------------------------------------------------------
1293 !
1297 !
1298 subroutine v_ks_hartree(namespace, ks, space, hm, ext_partners)
1299 type(namespace_t), intent(in) :: namespace
1300 type(v_ks_t), intent(inout) :: ks
1301 class(space_t), intent(in) :: space
1302 type(hamiltonian_elec_t), intent(inout) :: hm
1303 type(partner_list_t), intent(in) :: ext_partners
1304
1305 push_sub(v_ks_hartree)
1306
1307 if (.not. poisson_is_async(hm%psolver)) then
1308 ! solve the Poisson equation
1309 call dpoisson_solve(hm%psolver, namespace, hm%ks_pot%vhartree, ks%calc%total_density, reset=.false.)
1310 else
1311 ! The calculation was started by v_ks_calc_start.
1312 call dpoisson_solve_finish(hm%psolver, hm%ks_pot%vhartree)
1313 end if
1314
1315 if (ks%calc%calc_energy) then
1316 ! Get the Hartree energy
1317 hm%energy%hartree = m_half*dmf_dotp(ks%gr, ks%calc%total_density, hm%ks_pot%vhartree)
1318 end if
1319
1321 if(ks%calc%time_present) then
1322 if(hamiltonian_elec_has_kick(hm)) then
1323 call pcm_hartree_potential(hm%pcm, space, ks%gr, hm%psolver, ext_partners, hm%ks_pot%vhartree, &
1324 ks%calc%total_density, hm%energy%pcm_corr, kick=hm%kick, time=ks%calc%time)
1325 else
1326 call pcm_hartree_potential(hm%pcm, space, ks%gr, hm%psolver, ext_partners, hm%ks_pot%vhartree, &
1327 ks%calc%total_density, hm%energy%pcm_corr, time=ks%calc%time)
1328 end if
1329 else
1330 if(hamiltonian_elec_has_kick(hm)) then
1331 call pcm_hartree_potential(hm%pcm, space, ks%gr, hm%psolver, ext_partners, hm%ks_pot%vhartree, &
1332 ks%calc%total_density, hm%energy%pcm_corr, kick=hm%kick)
1333 else
1334 call pcm_hartree_potential(hm%pcm, space, ks%gr, hm%psolver, ext_partners, hm%ks_pot%vhartree, &
1335 ks%calc%total_density, hm%energy%pcm_corr)
1336 end if
1337 end if
1338
1339 pop_sub(v_ks_hartree)
1340 end subroutine v_ks_hartree
1341 ! ---------------------------------------------------------
1342
1343
1344 ! ---------------------------------------------------------
1345 subroutine v_ks_freeze_hxc(ks)
1346 type(v_ks_t), intent(inout) :: ks
1347
1348 push_sub(v_ks_freeze_hxc)
1349
1350 ks%frozen_hxc = .true.
1351
1352 pop_sub(v_ks_freeze_hxc)
1353 end subroutine v_ks_freeze_hxc
1354 ! ---------------------------------------------------------
1355
1356 subroutine v_ks_calculate_current(this, calc_cur)
1357 type(v_ks_t), intent(inout) :: this
1358 logical, intent(in) :: calc_cur
1359
1360 push_sub(v_ks_calculate_current)
1361
1362 this%calculate_current = calc_cur
1363
1364 pop_sub(v_ks_calculate_current)
1365 end subroutine v_ks_calculate_current
1366
1368 subroutine v_ks_update_dftu_energy(ks, namespace, hm, st, int_dft_u)
1369 type(v_ks_t), intent(inout) :: ks
1370 type(hamiltonian_elec_t), intent(in) :: hm
1371 type(namespace_t), intent(in) :: namespace
1372 type(states_elec_t), intent(inout) :: st
1373 real(real64), intent(out) :: int_dft_u
1374
1375 int_dft_u = m_zero
1376 if (hm%lda_u_level == dft_u_none) return
1377
1378 push_sub(v_ks_update_dftu_energy)
1379
1380 if (states_are_real(st)) then
1381 int_dft_u = denergy_calc_electronic(namespace, hm, ks%gr%der, st, terms = term_dft_u)
1382 else
1383 int_dft_u = zenergy_calc_electronic(namespace, hm, ks%gr%der, st, terms = term_dft_u)
1384 end if
1385
1387 end subroutine v_ks_update_dftu_energy
1388end module v_ks_oct_m
1389
1390!! Local Variables:
1391!! mode: f90
1392!! coding: utf-8
1393!! End:
constant times a vector plus a vector
Definition: lalg_basic.F90:173
scales a vector by a constant
Definition: lalg_basic.F90:159
This is the common interface to a sorting routine. It performs the shell algorithm,...
Definition: sort.F90:156
logical pure function, public accel_buffer_is_allocated(this)
Definition: accel.F90:1116
pure logical function, public accel_is_enabled()
Definition: accel.F90:403
integer, parameter, public accel_mem_read_only
Definition: accel.F90:186
subroutine, public current_calculate(this, namespace, gr, hm, space, st)
Compute total electronic current density.
Definition: current.F90:372
subroutine, public current_init(this, namespace)
Definition: current.F90:180
This module implements a calculator for the density and defines related functions.
Definition: density.F90:122
subroutine, public states_elec_total_density(st, mesh, total_rho)
This routine calculates the total electronic density.
Definition: density.F90:892
subroutine, public density_calc(st, gr, density, istin)
Computes the density from the orbitals in st.
Definition: density.F90:653
This module calculates the derivatives (gradients, Laplacians, etc.) of a function.
integer, parameter, public unpolarized
Parameters...
integer, parameter, public spinors
subroutine, public energy_calc_total(namespace, space, hm, gr, st, ext_partners, iunit, full)
This subroutine calculates the total energy of the system. Basically, it adds up the KS eigenvalues,...
real(real64) function, public zenergy_calc_electronic(namespace, hm, der, st, terms)
real(real64) function, public denergy_calc_electronic(namespace, hm, der, st, terms)
subroutine, public energy_calc_eigenvalues(namespace, hm, der, st)
subroutine, public energy_copy(ein, eout)
Definition: energy.F90:170
subroutine, public dexchange_operator_ace(this, namespace, mesh, st, xst, phase)
subroutine, public zexchange_operator_compute_potentials(this, namespace, space, gr, st, xst, kpoints, F_out)
subroutine, public exchange_operator_reinit(this, cam, st)
subroutine, public dexchange_operator_compute_potentials(this, namespace, space, gr, st, xst, kpoints, F_out)
subroutine, public zexchange_operator_ace(this, namespace, mesh, st, xst, phase)
real(real64) function, public dexchange_operator_compute_ex(mesh, st, xst)
Compute the exact exchange energy.
real(real64) function, public zexchange_operator_compute_ex(mesh, st, xst)
Compute the exact exchange energy.
real(real64), parameter, public m_two
Definition: global.F90:202
real(real64), parameter, public m_zero
Definition: global.F90:200
integer, parameter, public rdmft
Definition: global.F90:250
integer, parameter, public hartree_fock
Definition: global.F90:250
integer, parameter, public independent_particles
Theory level.
Definition: global.F90:250
integer, parameter, public generalized_kohn_sham_dft
Definition: global.F90:250
integer, parameter, public kohn_sham_dft
Definition: global.F90:250
real(real64), parameter, public m_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
integer, parameter, public hartree
Definition: global.F90:250
This module implements the underlying real-space grid.
Definition: grid.F90:119
integer, parameter, public term_mgga
integer, parameter, public term_dft_u
logical function, public hamiltonian_elec_has_kick(hm)
logical function, public hamiltonian_elec_needs_current(hm, states_are_real)
subroutine, public hamiltonian_elec_update_pot(this, mesh, accumulate)
Update the KS potential of the electronic Hamiltonian.
This module defines classes and functions for interaction partners.
Interoperable Separable Density Fitting (ISDF) molecular implementation.
Definition: isdf.F90:116
subroutine, public isdf_ace_compute_potentials(exxop, namespace, space, mesh, st, Vx_on_st, kpoints)
ISDF wrapper computing interpolation points and vectors, which are used to build the potential used ...
Definition: isdf.F90:161
Serial prototype for benchmarking and validating ISDF implementation.
subroutine, public isdf_serial_ace_compute_potentials(exxop, namespace, space, mesh, st, Vx_on_st, kpoints)
ISDF wrapper computing interpolation points and vectors, which are used to build the potential used ...
A module to handle KS potential, without the external potential.
integer, parameter, public dft_u_none
Definition: lda_u.F90:205
This modules implements the routines for doing constrain DFT for noncollinear magnetism.
integer, parameter, public constrain_none
subroutine, public magnetic_constrain_update(this, mesh, std, space, latt, pos, rho)
Recomputes the magnetic contraining potential.
subroutine, public magnetic_induced(namespace, gr, st, psolver, kpoints, a_ind, b_ind)
This subroutine receives as input a current, and produces as an output the vector potential that it i...
Definition: magnetic.F90:528
This module defines various routines, operating on mesh functions.
This module defines the meshes, which are used in Octopus.
Definition: mesh.F90:120
subroutine, public messages_print_with_emphasis(msg, iunit, namespace)
Definition: messages.F90:898
subroutine, public messages_not_implemented(feature, namespace)
Definition: messages.F90:1068
character(len=512), private msg
Definition: messages.F90:167
subroutine, public messages_warning(no_lines, all_nodes, namespace)
Definition: messages.F90:525
subroutine, public messages_obsolete_variable(namespace, name, rep)
Definition: messages.F90:1000
subroutine, public messages_new_line()
Definition: messages.F90:1089
character(len=256), dimension(max_lines), public message
to be output by fatal, warning
Definition: messages.F90:162
subroutine, public messages_fatal(no_lines, only_root_writes, namespace)
Definition: messages.F90:410
subroutine, public messages_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
This module handles the communicators for the various parallelization strategies.
Definition: multicomm.F90:147
logical function, public parse_is_defined(namespace, name)
Definition: parser.F90:463
subroutine, public pcm_hartree_potential(pcm, space, mesh, psolver, ext_partners, vhartree, density, pcm_corr, kick, time)
PCM reaction field due to the electronic density.
subroutine, public dpoisson_solve_start(this, rho)
Definition: poisson.F90:2007
subroutine, public dpoisson_solve(this, namespace, pot, rho, all_nodes, kernel, reset)
Calculates the Poisson equation. Given the density returns the corresponding potential.
Definition: poisson.F90:867
subroutine, public dpoisson_solve_finish(this, pot)
Definition: poisson.F90:2015
logical pure function, public poisson_is_async(this)
Definition: poisson.F90:1123
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
integer, parameter, public pseudo_exchange_unknown
Definition: pseudo.F90:190
integer, parameter, public pseudo_correlation_unknown
Definition: pseudo.F90:194
integer, parameter, public pseudo_correlation_any
Definition: pseudo.F90:194
integer, parameter, public pseudo_exchange_any
Definition: pseudo.F90:190
This module is intended to contain "only mathematical" functions and procedures.
Definition: sort.F90:119
integer, parameter, private libxc_c_index
Definition: species.F90:280
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_fermi(st, namespace, mesh, compute_spin)
calculate the Fermi level for the states in this object
subroutine, public states_elec_end(st)
finalize the 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_allocate_current(st, space, mesh)
This module provides routines for communicating states when using states parallelization.
subroutine, public states_elec_parallel_remote_access_stop(this)
stop remote memory access for states on other processors
subroutine, public states_elec_parallel_remote_access_start(this)
start remote memory access for states on other processors
type(type_t), parameter, public type_float
Definition: types.F90:135
subroutine v_ks_hartree(namespace, ks, space, hm, ext_partners)
Hartree contribution to the KS potential. This function is designed to be used by v_ks_calc_finish an...
Definition: v_ks.F90:1394
subroutine, public v_ks_calc_finish(ks, hm, namespace, space, latt, st, ext_partners, force_semilocal)
Definition: v_ks.F90:1072
subroutine, public v_ks_freeze_hxc(ks)
Definition: v_ks.F90:1441
subroutine, public v_ks_end(ks)
Definition: v_ks.F90:584
subroutine, public v_ks_calculate_current(this, calc_cur)
Definition: v_ks.F90:1452
subroutine, public v_ks_write_info(ks, iunit, namespace)
Definition: v_ks.F90:614
subroutine, public v_ks_update_dftu_energy(ks, namespace, hm, st, int_dft_u)
Update the value of <\psi | V_U | \psi>, where V_U is the DFT+U potential.
Definition: v_ks.F90:1464
subroutine, public v_ks_calc_start(ks, namespace, space, hm, st, ions, latt, ext_partners, time, calc_energy, force_semilocal)
This routine starts the calculation of the Kohn-Sham potential. The routine v_ks_calc_finish must be ...
Definition: v_ks.F90:758
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:703
subroutine, public v_ks_h_setup(namespace, space, gr, ions, ext_partners, st, ks, hm, calc_eigenval, calc_current)
Definition: v_ks.F90:649
subroutine, public v_ks_init(ks, namespace, gr, st, ions, mc, space, kpoints)
Definition: v_ks.F90:248
QEDFT / electron-photon (cavity) extension of the Kohn-Sham potential.
subroutine, public x_slater_calc(namespace, gr, space, exxop, st, kpoints, ex, vxc)
Interface to X(slater_calc)
Definition: x_slater.F90:147
type(xc_cam_t), parameter, public cam_null
All CAM parameters set to zero.
Definition: xc_cam.F90:152
type(xc_cam_t), parameter, public cam_exact_exchange
Use only Hartree Fock exact exchange.
Definition: xc_cam.F90:155
subroutine, public x_fbe_calc(id, namespace, psolver, gr, st, space, ex, vxc)
Interface to X(x_fbe_calc) Two possible run modes possible: adiabatic and Sturm-Liouville....
Definition: xc_fbe.F90:173
subroutine, public fbe_c_lda_sl(namespace, gr, st, space, ec, vxc)
Sturm-Liouville version of the FBE local-density correlation functional.
Definition: xc_fbe.F90:462
integer, parameter, public xc_family_ks_inversion
declaring 'family' constants for 'functionals' not handled by libxc careful not to use a value define...
integer function, public xc_get_default_functional(dim, pseudo_x_functional, pseudo_c_functional)
Returns the default functional given the one parsed from the pseudopotentials and the space dimension...
integer, parameter, public xc_family_nc_mgga
integer, parameter, public xc_oep_x
Exact exchange.
integer, parameter, public xc_lda_c_fbe_sl
LDA correlation based ib the force-balance equation - Sturm-Liouville version.
integer, parameter, public xc_family_nc_lda
integer, parameter, public xc_oep_x_fbe_sl
Exchange approximation based on the force balance equation - Sturn-Liouville version.
integer, parameter, public xc_oep_x_fbe
Exchange approximation based on the force balance equation.
integer, parameter, public xc_oep_x_slater
Slater approximation to the exact exchange.
integer, parameter, public func_c
integer, parameter, public func_x
subroutine, public xc_ks_inversion_end(ks_inv)
subroutine, public xc_ks_inversion_write_info(ks_inversion, iunit, namespace)
subroutine, public xc_ks_inversion_init(ks_inv, namespace, gr, ions, st, xc, mc, space, kpoints)
subroutine, public xc_ks_inversion_calc(ks_inversion, namespace, space, gr, hm, ext_partners, st, vxc, time)
subroutine, public xc_get_nc_vxc(gr, xcs, st, kpoints, space, namespace, rho, vxc, ex, ec, vtau, ex_density, ec_density)
This routines is similar to xc_get_vxc but for noncollinear functionals, which are not implemented in...
Definition: xc.F90:120
subroutine, public xc_write_info(xcs, iunit, namespace)
Definition: xc.F90:265
subroutine, public xc_init(xcs, namespace, ndim, periodic_dim, nel, x_id, c_id, xk_id, ck_id, hartree_fock, ispin)
Definition: xc.F90:352
pure logical function, public family_is_mgga(family, only_collinear)
Is the xc function part of the mGGA family.
Definition: xc.F90:702
logical pure function, public family_is_mgga_with_exc(xcs)
Is the xc function part of the mGGA family with an energy functional.
Definition: xc.F90:721
subroutine, public xc_end(xcs)
Definition: xc.F90:600
logical pure function, public family_is_hybrid(xcs)
Returns true if the functional is an hybrid functional.
Definition: xc.F90:736
integer, parameter, public oep_type_mgga
Definition: xc_oep.F90:186
integer, parameter, public oep_level_none
the OEP levels
Definition: xc_oep.F90:174
subroutine, public xc_oep_end(oep)
Definition: xc_oep.F90:358
subroutine, public zxc_oep_calc(oep, namespace, xcs, gr, hm, st, space, rcell_volume, ex, ec, vxc)
This file handles the evaluation of the OEP potential, in the KLI or full OEP as described in S....
Definition: xc_oep.F90:2412
subroutine, public dxc_oep_calc(oep, namespace, xcs, gr, hm, st, space, rcell_volume, ex, ec, vxc)
This file handles the evaluation of the OEP potential, in the KLI or full OEP as described in S....
Definition: xc_oep.F90:1479
subroutine, public xc_oep_write_info(oep, iunit, namespace)
Definition: xc_oep.F90:380
integer, parameter, public oep_type_exx
The different types of OEP that we can work with.
Definition: xc_oep.F90:186
subroutine, public xc_oep_init(oep, namespace, gr, st, mc, space, oep_type)
Definition: xc_oep.F90:219
integer, parameter, public sic_none
no self-interaction correction
Definition: xc_sic.F90:153
subroutine, public xc_sic_write_info(sic, iunit, namespace)
Definition: xc_sic.F90:259
integer, parameter, public sic_adsic
Averaged density SIC.
Definition: xc_sic.F90:153
subroutine, public xc_sic_init(sic, namespace, gr, st, mc, space)
initialize the SIC object
Definition: xc_sic.F90:173
subroutine, public xc_sic_end(sic)
finalize the SIC and, if needed, the included OEP
Definition: xc_sic.F90:245
integer, parameter, public sic_pz_oep
Perdew-Zunger SIC (OEP way)
Definition: xc_sic.F90:153
integer, parameter, public sic_amaldi
Amaldi correction term.
Definition: xc_sic.F90:153
subroutine, public xc_sic_calc_adsic(sic, namespace, space, gr, st, hm, xc, density, vxc, ex, ec)
Computes the ADSIC potential and energy.
Definition: xc_sic.F90:290
A module that takes care of xc contribution from vdW interactions.
Definition: xc_vdw.F90:118
subroutine, public xc_get_vxc(gr, xcs, st, kpoints, psolver, namespace, space, rho, ispin, rcell_volume, vxc, ex, ec, deltaxc, vtau, ex_density, ec_density, stress_xc, force_orbitalfree, force_host)
Definition: xc_vxc.F90:191
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
The states_elec_t class contains all electronic wave functions.
Photon (QEDFT) part of v_ks_t.
int true(void)
subroutine get_functional_from_pseudos(x_functional, c_functional)
Tries to find out the functional from the pseudopotential.
Definition: v_ks.F90:526
subroutine v_a_xc(hm, force_semilocal)
Definition: v_ks.F90:929
subroutine calculate_density()
Definition: v_ks.F90:865