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