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