29 use,
intrinsic :: iso_fortran_env
67 integer,
public,
parameter :: &
76 class(interaction_partner_t),
target,
intent(inout) :: partner
77 class(xc_interaction_t),
pointer :: this
83 this%label =
"exchange-correlation interaction"
85 this%partner => partner
92 class(xc_interaction_t),
intent(inout) :: this
101 class(xc_interaction_t),
intent(inout) :: this
112 class(xc_interaction_t),
intent(inout) :: this
124 class(xc_interaction_t),
intent(inout) :: this
134 class(xc_interaction_t),
intent(inout) :: this
138 safe_deallocate_a(this%density)
148 type(xc_interaction_t),
intent(inout) :: this
158 subroutine calc_tb09_c(mesh, space, functl, dens, gdens, ispin, rcell_volume)
159 class(
mesh_t),
intent(in) :: mesh
162 real(real64),
intent(in) :: dens(:,:)
163 real(real64),
intent(in) :: gdens(:,:,:)
164 integer,
intent(in) :: ispin
165 real(real64),
intent(in) :: rcell_volume
167 real(real64),
allocatable :: gnon(:)
173 safe_allocate(gnon(1:mesh%np))
178 gn(1:space%dim) = gdens(ii, 1:space%dim, 1)
180 n = dens(ii, 1) + dens(ii, 2)
181 gn(1:space%dim) = gdens(ii, 1:space%dim, 1) + gdens(ii, 1:space%dim, 2)
184 if (n <= 1e-7_real64)
then
187 gnon(ii) =
sqrt(sum((gn(1:space%dim)/n)**2))
195 safe_deallocate_a(gnon)
201 subroutine calc_mvorb_alpha(mesh, namespace, space, functl, dens, gdens, ispin, rcell_volume, cam)
202 class(
mesh_t),
intent(in) :: mesh
206 real(real64),
intent(in) :: dens(:,:)
207 real(real64),
intent(in) :: gdens(:,:,:)
208 integer,
intent(in) :: ispin
209 real(real64),
intent(in) :: rcell_volume
210 type(
xc_cam_t),
intent(inout) :: cam
212 real(real64),
allocatable :: gnon(:)
213 real(real64) :: tb09_c, alpha
214 real(real64) :: gn(space%dim), n
217 real(real64),
parameter :: tol_small_dens = 1e-11_real64
221 safe_allocate(gnon(1:mesh%np))
226 gn(1:space%dim) = gdens(ii, 1:space%dim, 1)
228 n = dens(ii, 1) + dens(ii, 2)
229 gn(1:space%dim) = gdens(ii, 1:space%dim, 1) + gdens(ii, 1:space%dim, 2)
232 if (n <= tol_small_dens)
then
235 gnon(ii) =
sqrt(sum((gn(1:space%dim)/n)**2))
236 gnon(ii) =
sqrt(gnon(ii))
242 safe_deallocate_a(gnon)
244 select case (functl(
func_c)%id)
246 alpha = 0.121983_real64+0.130711_real64*tb09_c**4
249 write(
message(1),
'(a,f6.3,a)')
'MVORB mixing parameter bigger than one (' , alpha ,
').'
253 write(
message(1),
'(a,f6.3,a)')
'MVORB mixing parameter is (' , alpha ,
').'
267 alpha = -1.00778_real64+1.10507_real64*tb09_c
270 write(
message(1),
'(a,f6.3,a)')
'MVORB mixing parameter bigger than one (' , alpha ,
').'
273 else if (alpha < 0)
then
274 write(
message(1),
'(a,f6.3,a)')
'MVORB mixing parameter smaller than zero (' , alpha ,
').'
278 write(
message(1),
'(a,f6.3,a)')
'MVORB mixing parameter is (' , alpha ,
').'
286 call messages_not_implemented(
"MVORB density-based mixing for functionals other than PBE0 and HSE06", namespace=namespace)
double sqrt(double __x) __attribute__((__nothrow__
integer, parameter, public unpolarized
Parameters...
real(real64), parameter, public m_zero
This module defines the abstract interaction_t class, and some auxiliary classes for interactions.
subroutine, public interaction_end(this)
This module defines classes and functions for interaction partners.
This module defines various routines, operating on mesh functions.
This module defines the meshes, which are used in Octopus.
subroutine, public messages_not_implemented(feature, namespace)
subroutine, public messages_warning(no_lines, all_nodes, namespace)
character(len=256), dimension(max_lines), public message
to be output by fatal, warning
subroutine, public messages_info(no_lines, iunit, debug_only, stress, all_nodes, namespace)
This module defines the quantity_t class and the IDs for quantities, which can be exposed by a system...
This module handles spin dimensions of the states and the k-point distribution.
integer, parameter, public xc_hyb_gga_xc_mvorb_pbeh
Density-based mixing parameter of PBE0.
integer, parameter, public xc_hyb_gga_xc_mvorb_hse06
Density-based mixing parameter of HSE06.
subroutine xc_interaction_finalize(this)
class(xc_interaction_t) function, pointer xc_interaction_constructor(partner)
subroutine, public xc_interaction_compute(this)
subroutine xc_interaction_end(this)
subroutine, public calc_tb09_c(mesh, space, functl, dens, gdens, ispin, rcell_volume)
integer, parameter, public func_c
subroutine xc_interaction_init(this)
subroutine xc_interaction_calculate(this)
subroutine xc_interaction_calculate_energy(this)
subroutine, public calc_mvorb_alpha(mesh, namespace, space, functl, dens, gdens, ispin, rcell_volume, cam)
Describes mesh distribution to nodes.
Coulomb-attenuating method parameters, used in the partitioning of the Coulomb potential into a short...