Octopus
sternheimer.F90
Go to the documentation of this file.
1!! Copyright (C) 2004-2012 Xavier Andrade, Eugene S. Kadantsev (ekadants@mjs1.phy.queensu.ca), David Strubbe
2!! Copyright (C) 2021 Davis Welakuh
3!!
4!! This program is free software; you can redistribute it and/or modify
5!! it under the terms of the GNU General Public License as published by
6!! the Free Software Foundation; either version 2, or (at your option)
7!! any later version.
8!!
9!! This program is distributed in the hope that it will be useful,
10!! but WITHOUT ANY WARRANTY; without even the implied warranty of
11!! MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12!! GNU General Public License for more details.
13!!
14!! You should have received a copy of the GNU General Public License
15!! along with this program; if not, write to the Free Software
16!! Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
17!! 02110-1301, USA.
18!!
19
20#include "global.h"
21
23 use batch_oct_m
25 use comm_oct_m
26 use debug_oct_m
30 use global_oct_m
31 use grid_oct_m
34 use io_oct_m
35 use, intrinsic :: iso_fortran_env
39 use lda_u_oct_m
42 use math_oct_m
43 use mesh_oct_m
46 use mix_oct_m
47 use mpi_oct_m
50 use parser_oct_m
57 use smear_oct_m
58 use space_oct_m
62 use unit_oct_m
64 use types_oct_m
65 use v_ks_oct_m
67 use xc_oct_m
68 use xc_sic_oct_m
69 use xc_f03_lib_m
72
73 implicit none
74
75 private
76 public :: &
97 swap_sigma, &
100 dcalc_hvar, &
101 zcalc_hvar, &
102 dcalc_kvar, &
104
105 character(len=*), public, parameter :: EM_RESP_PHOTONS_DIR = "em_resp_photons/"
106
107 type sternheimer_t
108 private
109 type(linear_solver_t) :: solver
110 type(mix_t) :: mixer
111 type(mixfield_t), pointer :: mixfield
112 type(scf_tol_t) :: scf_tol
113 real(real64), allocatable :: fxc(:,:,:)
114 real(real64), allocatable :: fxc_grad(:,:,:,:,:)
115 real(real64), allocatable :: fxc_grad_spin(:,:,:,:)
116 logical :: gga = .false.
117 real(real64), allocatable :: kxc(:,:,:,:)
118 real(real64), pointer, contiguous :: drhs(:, :, :, :) => null()
119 complex(real64), pointer, contiguous :: zrhs(:, :, :, :) => null()
120 real(real64), pointer, contiguous :: dinhomog(:, :, :, :, :) => null()
121 complex(real64), pointer, contiguous :: zinhomog(:, :, :, :, :) => null()
122 logical :: add_fxc_kernel
123 logical :: ok
124 logical :: occ_response
125 logical :: last_occ_response
126 logical :: occ_response_by_sternheimer
127 logical :: preorthogonalization
128 logical, public :: has_photons
129 real(real64) :: domega
130 complex(real64) :: zomega
131 real(real64), allocatable, public :: dphoton_coord_q(:, :)
132 complex(real64), allocatable, public :: zphoton_coord_q(:, :)
133 real(real64) :: pt_eta
134 type(photon_mode_t) :: pt_modes
135
136 real(real64) :: coeff_hartree
137 contains
138 procedure :: add_fxc => sternheimer_add_fxc
139 procedure :: add_hartree => sternheimer_add_hartree
140 end type sternheimer_t
141
142
143contains
144
145 !-----------------------------------------------------------
146 subroutine sternheimer_init(this, namespace, space, gr, st, hm, ks, mc, wfs_are_cplx, set_ham_var, set_occ_response, &
147 set_last_occ_response, occ_response_by_sternheimer)
148 type(sternheimer_t), intent(out) :: this
149 type(namespace_t), intent(in) :: namespace
150 class(space_t), intent(in) :: space
151 type(grid_t), intent(inout) :: gr
152 type(states_elec_t), intent(in) :: st
153 type(hamiltonian_elec_t), intent(in) :: hm
154 type(v_ks_t), intent(in) :: ks
155 type(multicomm_t), intent(in) :: mc
156 logical, intent(in) :: wfs_are_cplx
157 integer, optional, intent(in) :: set_ham_var
158 logical, optional, intent(in) :: set_occ_response
159 logical, optional, intent(in) :: set_last_occ_response
160 logical, optional, intent(in) :: occ_response_by_sternheimer
161
162 logical :: add_hartree
163 integer :: ham_var, iunit
164 logical :: default_preorthog
165
166 push_sub(sternheimer_init)
167
168 if (family_is_mgga(ks%xc%family)) then
169 call messages_not_implemented("MGGA functionals with Sternheimer calculation")
170 end if
171 if (family_is_hybrid(ks%xc)) then
172 call messages_not_implemented("Hybrid functionals with Sternheimer calculation")
173 end if
174
175 if (ks%sic%level /= sic_none) then
176 call messages_not_implemented("SIC with Sternheimer calculation")
177 end if
178
179 if (hm%lda_u_level /= dft_u_none) then
180 call messages_not_implemented("DFT+U with Sterheimer calculation")
181 end if
182
183 if (st%smear%method == smear_fixed_occ) then
184 call messages_experimental("Sternheimer equation for arbitrary occupations", namespace=namespace)
185 end if
186 if (st%smear%method == smear_semiconductor .and. &
187 (abs(st%smear%ef_occ) > m_epsilon) .and. abs(st%smear%ef_occ - m_one) > m_epsilon) then
188 write(message(1),'(a,f12.6)') 'Partial occupation at the Fermi level: ', st%smear%ef_occ
189 message(2) = 'Semiconducting smearing cannot be used for Sternheimer in this situation.'
190 call messages_fatal(2, namespace=namespace)
191 end if
192
193 if (wfs_are_cplx) then
194 call mix_init(this%mixer, namespace, space, gr%der, gr%np, st%d%nspin, func_type_= type_cmplx)
195 else
196 call mix_init(this%mixer, namespace, space, gr%der, gr%np, st%d%nspin, func_type_= type_float)
197 end if
198 call mix_get_field(this%mixer, this%mixfield)
199
200 this%occ_response = optional_default(set_occ_response, .false.)
201 this%occ_response_by_sternheimer = optional_default(occ_response_by_sternheimer, .false.)
202 this%last_occ_response = optional_default(set_last_occ_response, .false.)
203
204 !%Variable Preorthogonalization
205 !%Type logical
206 !%Section Linear Response::Sternheimer
207 !%Description
208 !% Whether initial linear-response wavefunctions should be orthogonalized
209 !% or not against the occupied states, at the start of each SCF cycle.
210 !% Default is true only if <tt>SmearingFunction = semiconducting</tt>,
211 !% or if the <tt>Occupations</tt> block specifies all full or empty states,
212 !% and we are not solving for linear response in the occupied subspace too.
213 !%End
214 default_preorthog = (st%smear%method == smear_semiconductor .or. &
215 (st%smear%method == smear_fixed_occ .and. st%smear%integral_occs)) &
216 .and. .not. this%occ_response
217 call parse_variable(namespace, 'Preorthogonalization', default_preorthog, this%preorthogonalization)
219 !%Variable HamiltonianVariation
220 !%Type integer
221 !%Default hartree+fxc
222 !%Section Linear Response::Sternheimer
223 !%Description
224 !% The terms to be considered in the variation of the
225 !% Hamiltonian. The external potential (V_ext) is always considered. The default is to include
226 !% also the exchange-correlation and Hartree terms, which fully
227 !% takes into account local fields.
228 !% Just <tt>hartree</tt> gives you the random-phase approximation (RPA).
229 !% If you want to choose the exchange-correlation kernel, use the variable
230 !% <tt>XCKernel</tt>. For <tt>kdotp</tt> and magnetic <tt>em_resp</tt> modes,
231 !% or if <tt>TheoryLevel = independent_particles</tt>,
232 !% the value <tt>V_ext_only</tt> is used and this variable is ignored.
233 !%Option V_ext_only 0
234 !% Neither Hartree nor XC potentials included.
235 !%Option hartree 1
236 !% The variation of the Hartree potential only.
237 !%Option fxc 2
238 !% The exchange-correlation kernel (the variation of the
239 !% exchange-correlation potential) only.
240 !%End
241 if (present(set_ham_var)) then
242 ham_var = set_ham_var
243 else if (hm%theory_level /= independent_particles) then
244 call parse_variable(namespace, 'HamiltonianVariation', 3, ham_var)
245 else
246 ham_var = 0
247 end if
248
249 if (hm%theory_level /= independent_particles) then
250 this%add_fxc_kernel = ((ham_var / 2) == 1)
251 add_hartree = (mod(ham_var, 2) == 1)
252 else
253 this%add_fxc_kernel = .false.
254 add_hartree = .false.
255 end if
256
257
258 if (hm%kpoints%use_symmetries .and. (add_hartree .or. this%add_fxc_kernel)) then
259 message(1) = "The first-order density is accumulated on the symmetry-reduced k-point grid"
260 message(2) = "without symmetry unfolding, so the self-consistent (Hartree + fxc) response"
261 message(3) = "may be incorrect unless the k-point grid was reduced with SymmetryBreakDir"
262 message(4) = "set along the perturbation direction."
263 call messages_warning(4, namespace=namespace)
264 end if
265
266 message(1) = "Variation of the Hamiltonian in Sternheimer equation: V_ext"
267 if (add_hartree) write(message(1), '(2a)') trim(message(1)), ' + hartree'
268 if (this%add_fxc_kernel) write(message(1), '(2a)') trim(message(1)), ' + fxc'
269
270 message(2) = "Solving Sternheimer equation for"
271 if (this%occ_response) then
272 write(message(2), '(2a)') trim(message(2)), ' full linear response.'
273 else
274 write(message(2), '(2a)') trim(message(2)), ' linear response in unoccupied subspace only.'
275 end if
276
277 message(3) = "Sternheimer preorthogonalization:"
278 if (this%preorthogonalization) then
279 write(message(3), '(2a)') trim(message(3)), ' yes'
280 else
281 write(message(3), '(2a)') trim(message(3)), ' no'
282 end if
283 call messages_info(3, namespace=namespace)
284
285 call linear_solver_init(this%solver, namespace, gr, states_are_real(st), mc, space)
286
287 ! will not converge for non-self-consistent calculation unless LRTolScheme = fixed
288 if (ham_var == 0) then
289 call scf_tol_init(this%scf_tol, namespace, st%qtot, tol_scheme = 0) ! fixed
290 else
291 call scf_tol_init(this%scf_tol, namespace, st%qtot)
292 end if
293
294 ! Build the fxc from the GS density
295 this%coeff_hartree = m_zero
296 if (this%add_fxc_kernel) then
297 this%coeff_hartree = this%coeff_hartree - ks%xc%lrc%alpha / (m_four * m_pi)
298 end if
299 if (add_hartree) this%coeff_hartree = this%coeff_hartree + m_one
300 if (this%add_fxc_kernel) then
301 call sternheimer_build_fxc(this, namespace, gr, st, ks%xc)
302
303 call messages_print_with_emphasis(msg="XC Kernel level", namespace=namespace)
304 call xc_write_fxc_info(ks%xc, namespace=namespace)
305 call xc_sic_write_info(ks%sic, namespace=namespace)
306 call messages_print_with_emphasis(namespace=namespace)
307 end if
308
309
310 ! This variable is documented in xc_oep_init.
311 call parse_variable(namespace, 'EnablePhotons', .false., this%has_photons)
312 call messages_print_var_value('EnablePhotons', this%has_photons, namespace=namespace)
313
314 if (this%has_photons) then
315 call messages_experimental('EnablePhotons = yes', namespace=namespace)
316 call photon_mode_init(this%pt_modes, namespace, space%dim)
317 call photon_mode_set_n_electrons(this%pt_modes, m_zero)
318 call photon_mode_compute_dipoles(this%pt_modes, gr)
319 call io_mkdir(em_resp_photons_dir, namespace)
320 iunit = io_open(em_resp_photons_dir // 'photon_modes', namespace, action='write')
321 call photon_mode_write_info(this%pt_modes, iunit=iunit)
322 safe_allocate(this%zphoton_coord_q(1:this%pt_modes%nmodes, 1:space%dim))
323 call io_close(iunit)
324 end if
325
326 !%Variable PhotonEta
327 !%Type float
328 !%Default 0.0000367
329 !%Section Linear Response::Sternheimer
330 !%Description
331 !% This variable provides the value for the broadening of the photonic spectra
332 !% when the coupling of electrons to photons is enabled in the frequency-dependent Sternheimer equation
333 !%End
334 call parse_variable(namespace, 'PhotonEta', 0.0000367_real64, this%pt_eta, units_inp%energy)
335 call messages_print_var_value('PhotonEta', this%pt_eta, units_inp%energy, namespace=namespace)
336
337
338 pop_sub(sternheimer_init)
339 end subroutine sternheimer_init
340
341 !-----------------------------------------------------------
342 subroutine sternheimer_end(this)
343 type(sternheimer_t), intent(inout) :: this
344
345 push_sub(sternheimer_end)
346
347 safe_deallocate_a(this%zphoton_coord_q)
348
349 call linear_solver_end(this%solver)
350 call scf_tol_end(this%scf_tol)
351 call mix_end(this%mixer)
352
353 nullify(this%mixfield)
354
355 safe_deallocate_a(this%fxc)
356 safe_deallocate_a(this%fxc_grad)
357 safe_deallocate_a(this%fxc_grad_spin)
358
359 pop_sub(sternheimer_end)
360 end subroutine sternheimer_end
361
362
363 !-----------------------------------------------------------
365 subroutine sternheimer_build_fxc(this, namespace, gr, st, xc)
366 type(sternheimer_t), intent(inout) :: this
367 type(namespace_t), intent(in) :: namespace
368 type(grid_t), intent(in) :: gr
369 type(states_elec_t), intent(in) :: st
370 type(xc_t), intent(in) :: xc
371
372 real(real64), allocatable :: rho(:, :)
373
374 push_sub(sternheimer_build_fxc)
375
376 safe_allocate(this%fxc(1:gr%np, 1:st%d%nspin, 1:st%d%nspin))
377 safe_allocate(rho(1:gr%np_part, 1:st%d%nspin))
378 call states_elec_total_density(st, gr, rho)
379
380 this%gga = in_family(xc%kernel_family, [xc_family_gga])
381 if (this%gga) then
382 safe_allocate(this%fxc_grad(1:gr%np, 1:gr%der%dim, 1:gr%der%dim, 1:st%d%nspin, 1:st%d%nspin))
383 if (st%d%ispin == spin_polarized) then
384 safe_allocate(this%fxc_grad_spin(1:gr%np, 1:gr%der%dim, 1:st%d%nspin, 1:st%d%nspin))
385 else
386 safe_allocate(this%fxc_grad_spin(0, 0, 0, 0))
387 end if
388 call xc_get_fxc(xc, gr, namespace, rho, st%d%ispin, this%fxc, this%fxc_grad, this%fxc_grad_spin)
389 else
390 call xc_get_fxc(xc, gr, namespace, rho, st%d%ispin, this%fxc)
391 end if
392
393 safe_deallocate_a(rho)
394
395 pop_sub(sternheimer_build_fxc)
396 end subroutine sternheimer_build_fxc
397
398
399 !-----------------------------------------------------------
400 subroutine sternheimer_build_kxc(this, namespace, mesh, st, xc)
401 type(sternheimer_t), intent(inout) :: this
402 type(namespace_t), intent(in) :: namespace
403 class(mesh_t), intent(in) :: mesh
404 type(states_elec_t), intent(in) :: st
405 type(xc_t), intent(in) :: xc
406
407 real(real64), allocatable :: rho(:, :)
408
409 push_sub(sternheimer_build_kxc)
410
411 if (this%add_fxc()) then
412 safe_allocate(this%kxc(1:mesh%np, 1:st%d%nspin, 1:st%d%nspin, 1:st%d%nspin))
413 this%kxc = m_zero
414
415 safe_allocate(rho(1:mesh%np, 1:st%d%nspin))
416 call states_elec_total_density(st, mesh, rho)
417 call xc_get_kxc(xc, mesh, namespace, rho, st%d%ispin, this%kxc)
418 safe_deallocate_a(rho)
419 end if
420
421 pop_sub(sternheimer_build_kxc)
422
423 end subroutine sternheimer_build_kxc
424
425 !---------------------------------------------
426 subroutine sternheimer_unset_kxc(this)
427 type(sternheimer_t), intent(inout) :: this
428
429 push_sub(sternheimer_unset_kxc)
430
431 safe_deallocate_a(this%kxc)
432
433 pop_sub(sternheimer_unset_kxc)
434 end subroutine sternheimer_unset_kxc
435
436 !-----------------------------------------------------------
437 pure logical function sternheimer_add_fxc(this) result(rr)
438 class(sternheimer_t), intent(in) :: this
439 rr = this%add_fxc_kernel
440 end function sternheimer_add_fxc
441
442
443 !-----------------------------------------------------------
444 pure logical function sternheimer_add_hartree(this) result(rr)
445 class(sternheimer_t), intent(in) :: this
446 rr = abs(this%coeff_hartree) > m_epsilon
447 end function sternheimer_add_hartree
448
449
450 !-----------------------------------------------------------
451 logical function sternheimer_has_converged(this) result(rr)
452 type(sternheimer_t), intent(in) :: this
453 rr = this%ok
454 end function sternheimer_has_converged
455
456 !-----------------------------------------------------------
457 logical pure function sternheimer_have_rhs(this) result(have)
458 type(sternheimer_t), intent(in) :: this
459 have = associated(this%drhs) .or. associated(this%zrhs)
461
462 !-----------------------------------------------------------
463 subroutine sternheimer_unset_rhs(this)
464 type(sternheimer_t), intent(inout) :: this
465
466 push_sub(sternheimer_unset_rhs)
467
468 nullify(this%drhs)
469 nullify(this%zrhs)
470
471 pop_sub(sternheimer_unset_rhs)
472 end subroutine sternheimer_unset_rhs
473
474 !-----------------------------------------------------------
475 logical pure function sternheimer_have_inhomog(this) result(have)
476 type(sternheimer_t), intent(in) :: this
477 have = associated(this%dinhomog) .or. associated(this%zinhomog)
478 end function sternheimer_have_inhomog
479
480 !-----------------------------------------------------------
481 subroutine sternheimer_unset_inhomog(this)
482 type(sternheimer_t), intent(inout) :: this
483
485
486 nullify(this%dinhomog)
487 nullify(this%zinhomog)
488
490 end subroutine sternheimer_unset_inhomog
491
492 !-----------------------------------------------------------
493 integer pure function swap_sigma(sigma)
494 integer, intent(in) :: sigma
496 if (sigma == 1) then
497 swap_sigma = 2
498 else
499 swap_sigma = 1
500 end if
501
502 end function swap_sigma
503
504! ---------------------------------------------------------
505 character(len=100) function wfs_tag_sigma(namespace, base_name, isigma) result(str)
506 type(namespace_t), intent(in) :: namespace
507 character(len=*), intent(in) :: base_name
508 integer, intent(in) :: isigma
509
510 character :: sigma_char
511
512 push_sub(wfs_tag_sigma)
513
514 select case (isigma)
515 case (1)
516 sigma_char = '+'
517 case (2)
518 sigma_char = '-'
519 case default
520 write(message(1),'(a,i2)') "Illegal integer isigma passed to wfs_tag_sigma: ", isigma
521 call messages_fatal(1, namespace=namespace)
522 end select
523
524 str = trim(base_name) // sigma_char
525
526 pop_sub(wfs_tag_sigma)
527
528 end function wfs_tag_sigma
529
530 ! --------------------------------------------------------
531
532 subroutine sternheimer_obsolete_variables(namespace, old_prefix, new_prefix)
533 type(namespace_t), intent(in) :: namespace
534 character(len=*), intent(in) :: old_prefix
535 character(len=*), intent(in) :: new_prefix
536
538
539 call messages_obsolete_variable(namespace, trim(old_prefix)//'Preorthogonalization', trim(new_prefix)//'Preorthogonalization')
540 call messages_obsolete_variable(namespace, trim(old_prefix)//'HamiltonianVariation', trim(new_prefix)//'HamiltonianVariation')
541
542 call linear_solver_obsolete_variables(namespace, old_prefix, new_prefix)
543 call scf_tol_obsolete_variables(namespace, old_prefix, new_prefix)
544
547
548 !--------------------------------------------------------------
549 subroutine calc_hvar_photons(this, mesh, nspin, lr_rho, nsigma, hvar, idir)
550 type(sternheimer_t), intent(inout) :: this
551 class(mesh_t), intent(in) :: mesh
552 integer, intent(in) :: nspin
553 integer, intent(in) :: nsigma
554 complex(real64), intent(in) :: lr_rho(:,:)
555 complex(real64), intent(inout) :: hvar(:,:,:)
556 integer, intent(in) :: idir
557
558 real(real64), allocatable :: lambda_dot_r(:)
559 complex(real64), allocatable :: s_lr_rho(:), vp_dip_self_ener(:), vp_bilinear_el_pt(:)
560 integer :: nm, is, ii, ip
561 complex(real64) :: first_moments
562
563 push_sub(calc_hvar_photons)
564 call profiling_in('CALC_HVAR_PHOTONS')
565
566 nm = this%pt_modes%nmodes
567
568 ! photonic terms
569 safe_allocate(s_lr_rho(1:mesh%np))
570 safe_allocate(lambda_dot_r(1:mesh%np))
571 safe_allocate(vp_dip_self_ener(1:mesh%np))
572 safe_allocate(vp_bilinear_el_pt(1:mesh%np))
573
574 ! spin summed density
575 s_lr_rho = m_zero
576 do is = 1, nspin
577 s_lr_rho = s_lr_rho + lr_rho(:, is)
578 end do
579
580 ! Compute electron-photon potentials
581 vp_dip_self_ener = m_zero
582 vp_bilinear_el_pt = m_zero
583 do ii = 1, nm
584 !$omp parallel do
585 do ip = 1, mesh%np
586 lambda_dot_r(ip) = this%pt_modes%lambda(ii)*this%pt_modes%pol_dipole(ip, ii)
587 end do
588 !$omp end parallel do
589 first_moments = zmf_integrate(mesh, lambda_dot_r(1:mesh%np)*s_lr_rho(1:mesh%np))
590
591 ! Compute photon displacement coordinate q_{\alpha}s
592 this%zphoton_coord_q(ii, idir) = -m_half * &
593 ((m_one/(this%zomega - cmplx(this%pt_modes%omega(ii),-this%pt_eta, real64))) - &
594 (m_one/(this%zomega + cmplx(this%pt_modes%omega(ii), this%pt_eta, real64)))) *first_moments
595
596 ! Compute potential for bilinear el-pt interaction
597 vp_bilinear_el_pt = vp_bilinear_el_pt - &
598 this%pt_modes%omega(ii)*lambda_dot_r(1:mesh%np)*this%zphoton_coord_q(ii, idir)
599
600 ! Compute potential with dipole-self energy term
601 vp_dip_self_ener = vp_dip_self_ener + first_moments*lambda_dot_r(1:mesh%np)
602 end do
603
604 !$omp parallel do
605 do ip = 1, mesh%np
606 hvar(ip, 1, 1) = hvar(ip, 1, 1) + vp_dip_self_ener(ip) + vp_bilinear_el_pt(ip)
607 end do
608 !$omp end parallel do
609 do ii = 2, nspin
610 hvar(1:mesh%np, ii, 1) = hvar(1:mesh%np, 1, 1)
611 end do
612
613 safe_deallocate_a(s_lr_rho)
614 safe_deallocate_a(lambda_dot_r)
615 safe_deallocate_a(vp_dip_self_ener)
616 safe_deallocate_a(vp_bilinear_el_pt)
617
618 if (nsigma == 2) hvar(1:mesh%np, 1:nspin, 2) = conjg(hvar(1:mesh%np, 1:nspin, 1))
619
620 call profiling_out('CALC_HVAR_PHOTONS')
621 pop_sub(calc_hvar_photons)
622 end subroutine calc_hvar_photons
623
624
625#include "complex.F90"
626#include "sternheimer_inc.F90"
628#include "undef.F90"
629
630#include "real.F90"
631#include "sternheimer_inc.F90"
632
633end module sternheimer_oct_m
634
635!! Local Variables:
636!! mode: f90
637!! coding: utf-8
638!! End:
Prints out to iunit a message in the form: ["InputVariable" = value] where "InputVariable" is given b...
Definition: messages.F90:182
This module implements batches of mesh functions.
Definition: batch.F90:135
This module implements common operations on batches of mesh functions.
Definition: batch_ops.F90:118
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
This module calculates the derivatives (gradients, Laplacians, etc.) of a function.
integer, parameter, public spin_polarized
real(real64), parameter, public m_zero
Definition: global.F90:200
real(real64), parameter, public m_four
Definition: global.F90:204
real(real64), parameter, public m_pi
some mathematical constants
Definition: global.F90:198
integer, parameter, public independent_particles
Theory level.
Definition: global.F90:250
real(real64), parameter, public m_epsilon
Definition: global.F90:216
real(real64), parameter, public m_one
Definition: global.F90:201
This module implements the underlying real-space grid.
Definition: grid.F90:119
Definition: io.F90:116
subroutine, public io_close(iunit, grp)
Definition: io.F90:467
subroutine, public io_mkdir(fname, namespace, parents)
Definition: io.F90:361
integer function, public io_open(file, namespace, action, status, form, position, die, recl, grp)
Definition: io.F90:402
A module to handle KS potential, without the external potential.
integer, parameter, public dft_u_none
Definition: lda_u.F90:205
subroutine, public linear_solver_end(this)
subroutine, public linear_solver_init(this, namespace, gr, states_are_real, mc, space)
This module is intended to contain "only mathematical" functions and procedures.
Definition: math.F90:117
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
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_experimental(name, namespace)
Definition: messages.F90:1040
subroutine, public messages_info(no_lines, iunit, debug_only, stress, all_nodes, namespace)
Definition: messages.F90:594
subroutine, public mix_get_field(this, mixfield)
Definition: mix.F90:838
subroutine, public mix_init(smix, namespace, space, der, d1, d2, def_, func_type_, prefix_)
Initialise mix_t instance.
Definition: mix.F90:269
subroutine, public mix_end(smix)
Definition: mix.F90:568
This module handles the communicators for the various parallelization strategies.
Definition: multicomm.F90:147
subroutine, public photon_mode_compute_dipoles(this, mesh)
Computes the polarization dipole.
subroutine, public photon_mode_write_info(this, iunit, namespace)
subroutine, public photon_mode_set_n_electrons(this, qtot)
subroutine, public photon_mode_init(this, namespace, dim, photon_free)
subroutine, public scf_tol_init(this, namespace, qtot, def_maximumiter, tol_scheme)
Definition: scf_tol.F90:162
subroutine, public scf_tol_end(this)
Definition: scf_tol.F90:363
integer, parameter, public smear_semiconductor
Definition: smear.F90:176
integer, parameter, public smear_fixed_occ
Definition: smear.F90:176
pure logical function, public states_are_real(st)
This module handles reading and writing restart information for the states_elec_t.
subroutine, public zsternheimer_set_inhomog(this, inhomog)
subroutine, public zsternheimer_calc_hvar(this, namespace, gr, hm, lr, nsigma, hvar, idir, lr_rho, exclude_hartree)
Computes the first-order variation of the Kohn-Sham potential from the stored xc kernel,...
subroutine, public dsternheimer_solve(this, namespace, space, gr, kpoints, st, hm, mc, lr, nsigma, omega, perturbation, restart, rho_tag, wfs_tag, idir, have_restart_rho, have_exact_freq)
This routine calculates the first-order variations of the wavefunctions for an applied perturbation.
subroutine, public zcalc_hvar(namespace, coeff_hartree, gr, hm, lr_rho, nsigma, hvar, fxc, fxc_grad, fxc_grad_spin)
Computes the first-order variation of the Kohn-Sham Hamiltonian.
subroutine, public dsternheimer_calc_hvar(this, namespace, gr, hm, lr, nsigma, hvar, idir, lr_rho, exclude_hartree)
Computes the first-order variation of the Kohn-Sham potential from the stored xc kernel,...
integer pure function, public swap_sigma(sigma)
subroutine sternheimer_build_fxc(this, namespace, gr, st, xc)
Builds the exchange-correlation kernel for computing the density response.
subroutine, public dcalc_kvar(this, mesh, st, lr_rho1, lr_rho2, nsigma, kvar)
logical function, public sternheimer_has_converged(this)
subroutine, public zsternheimer_set_rhs(this, rhs)
character(len=100) function, public wfs_tag_sigma(namespace, base_name, isigma)
subroutine calc_hvar_photons(this, mesh, nspin, lr_rho, nsigma, hvar, idir)
logical pure function, public sternheimer_have_rhs(this)
subroutine, public dsternheimer_solve_order2(sh1, sh2, sh_2ndorder, namespace, space, gr, kpoints, st, hm, mc, lr1, lr2, nsigma, omega1, omega2, pert1, pert2, lr_2ndorder, pert_2ndorder, restart, rho_tag, wfs_tag, have_restart_rho, have_exact_freq, give_pert1psi2, give_dl_eig1)
subroutine, public dsternheimer_set_rhs(this, rhs)
subroutine, public dcalc_hvar(namespace, coeff_hartree, gr, hm, lr_rho, nsigma, hvar, fxc, fxc_grad, fxc_grad_spin)
Computes the first-order variation of the Kohn-Sham Hamiltonian.
pure logical function sternheimer_add_fxc(this)
subroutine, public zsternheimer_solve_order2(sh1, sh2, sh_2ndorder, namespace, space, gr, kpoints, st, hm, mc, lr1, lr2, nsigma, omega1, omega2, pert1, pert2, lr_2ndorder, pert_2ndorder, restart, rho_tag, wfs_tag, have_restart_rho, have_exact_freq, give_pert1psi2, give_dl_eig1)
subroutine, public sternheimer_unset_kxc(this)
subroutine, public zsternheimer_solve(this, namespace, space, gr, kpoints, st, hm, mc, lr, nsigma, omega, perturbation, restart, rho_tag, wfs_tag, idir, have_restart_rho, have_exact_freq)
This routine calculates the first-order variations of the wavefunctions for an applied perturbation.
pure logical function sternheimer_add_hartree(this)
subroutine, public sternheimer_unset_inhomog(this)
logical pure function, public sternheimer_have_inhomog(this)
subroutine, public zcalc_kvar(this, mesh, st, lr_rho1, lr_rho2, nsigma, kvar)
subroutine, public sternheimer_end(this)
subroutine, public sternheimer_obsolete_variables(namespace, old_prefix, new_prefix)
subroutine, public sternheimer_build_kxc(this, namespace, mesh, st, xc)
subroutine, public dsternheimer_set_inhomog(this, inhomog)
subroutine, public sternheimer_init(this, namespace, space, gr, st, hm, ks, mc, wfs_are_cplx, set_ham_var, set_occ_response, set_last_occ_response, occ_response_by_sternheimer)
subroutine, public sternheimer_unset_rhs(this)
type(type_t), parameter, public type_cmplx
Definition: types.F90:136
type(type_t), parameter, public type_float
Definition: types.F90:135
brief This module defines the class unit_t which is used by the unit_systems_oct_m module.
Definition: unit.F90:134
This module defines the unit system, used for input and output.
type(unit_system_t), public units_inp
the units systems for reading and writing
This module provices a simple timer class which can be used to trigger the writing of a restart file ...
Definition: walltimer.F90:123
subroutine, public xc_get_fxc(xcs, gr, namespace, rho, ispin, fxc, fxc_grad, fxc_grad_spin)
Returns the exchange-correlation kernel.
Definition: xc_kernel.F90:172
subroutine, public xc_get_kxc(xcs, mesh, namespace, rho, ispin, kxc)
Definition: xc_kernel.F90:550
Definition: xc.F90:120
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_hybrid(xcs)
Returns true if the functional is an hybrid functional.
Definition: xc.F90:749
pure logical function, public in_family(family, xc_families)
Definition: xc.F90:762
subroutine, public xc_write_fxc_info(xcs, iunit, namespace)
Definition: xc.F90:294
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
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.