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