32#include "../base/base_uses.f90"
37 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'xc_optx'
52 CHARACTER(LEN=*),
INTENT(OUT),
OPTIONAL :: reference, shortform
54 INTEGER,
INTENT(out),
OPTIONAL :: max_deriv
56 IF (
PRESENT(reference))
THEN
57 reference =
"OPTX, Handy NC and Cohen AJ, JCP 116, p. 5411 (2002) (LDA)"
59 IF (
PRESENT(shortform))
THEN
60 shortform =
"OPTX exchange (LDA)"
62 IF (
PRESENT(needs))
THEN
64 needs%norm_drho = .true.
66 IF (
PRESENT(max_deriv)) max_deriv = 1
79 CHARACTER(LEN=*),
INTENT(OUT),
OPTIONAL :: reference, shortform
81 INTEGER,
INTENT(out),
OPTIONAL :: max_deriv
83 IF (
PRESENT(reference))
THEN
84 reference =
"OPTX, Handy NC and Cohen AJ, JCP 116, p. 5411 (2002), (LSD) "
86 IF (
PRESENT(shortform))
THEN
87 shortform =
"OPTX exchange (LSD)"
89 IF (
PRESENT(needs))
THEN
90 needs%rho_spin = .true.
91 needs%norm_drho_spin = .true.
93 IF (
PRESENT(max_deriv)) max_deriv = 1
110 INTEGER,
INTENT(in) :: grad_deriv
114 INTEGER,
DIMENSION(2, 3) :: bo
115 REAL(kind=
dp) :: a1, a2, epsilon_drho, epsilon_rho, gam, &
117 REAL(kind=
dp),
CONTIGUOUS,
DIMENSION(:, :, :), &
118 POINTER :: e_0, e_ndrho, e_rho, norm_drho, rho
121 NULLIFY (e_0, e_ndrho, e_rho, norm_drho, rho)
129 norm_drho=norm_drho, local_bounds=bo, rho_cutoff=epsilon_rho, &
130 drho_cutoff=epsilon_drho)
131 npoints = (bo(2, 1) - bo(1, 1) + 1)*(bo(2, 2) - bo(1, 2) + 1)*(bo(2, 3) - bo(1, 3) + 1)
134 allocate_deriv=.true.)
137 allocate_deriv=.true.)
140 allocate_deriv=.true.)
142 IF (grad_deriv > 1)
THEN
143 cpabort(
"derivatives bigger than 1 not implemented")
146 CALL optx_lda_calc(rho=rho, norm_drho=norm_drho, &
147 e_0=e_0, e_rho=e_rho, e_ndrho=e_ndrho, &
148 npoints=npoints, epsilon_rho=epsilon_rho, &
149 epsilon_drho=epsilon_drho, sx=sx, &
150 a1=a1, a2=a2, gam=gam)
167 INTEGER,
INTENT(in) :: grad_deriv
170 INTEGER :: ispin, npoints
171 INTEGER,
DIMENSION(2, 3) :: bo
172 REAL(kind=
dp) :: a1, a2, epsilon_drho, epsilon_rho, gam, &
174 REAL(kind=
dp),
CONTIGUOUS,
DIMENSION(:, :, :), &
181 NULLIFY (e_rho(ispin)%array)
182 NULLIFY (e_ndrho(ispin)%array)
183 NULLIFY (rho(ispin)%array)
184 NULLIFY (ndrho(ispin)%array)
192 CALL xc_rho_set_get(rho_set, rhoa=rho(1)%array, rhob=rho(2)%array, &
193 norm_drhoa=ndrho(1)%array, &
194 norm_drhob=ndrho(2)%array, rho_cutoff=epsilon_rho, &
195 drho_cutoff=epsilon_drho, local_bounds=bo)
196 npoints = (bo(2, 1) - bo(1, 1) + 1)*(bo(2, 2) - bo(1, 2) + 1)*(bo(2, 3) - bo(1, 3) + 1)
199 allocate_deriv=.true.)
202 allocate_deriv=.true.)
205 allocate_deriv=.true.)
209 allocate_deriv=.true.)
212 allocate_deriv=.true.)
215 IF (grad_deriv > 1)
THEN
216 cpabort(
"derivatives bigger than 1 not implemented")
219 CALL optx_lsd_calc(rho=rho(ispin)%array, norm_drho=ndrho(ispin)%array, &
220 e_0=e_0, e_rho=e_rho(ispin)%array, e_ndrho=e_ndrho(ispin)%array, &
221 npoints=npoints, epsilon_rho=epsilon_rho, &
222 epsilon_drho=epsilon_drho, sx=sx, &
223 a1=a1, a2=a2, gam=gam)
245 SUBROUTINE optx_lda_calc(rho, norm_drho, e_0, e_rho, e_ndrho, &
246 epsilon_rho, epsilon_drho, npoints, sx, &
248 REAL(kind=
dp),
DIMENSION(*),
INTENT(IN) :: rho, norm_drho
249 REAL(kind=
dp),
DIMENSION(*),
INTENT(INOUT) :: e_0, e_rho, e_ndrho
250 REAL(kind=
dp),
INTENT(in) :: epsilon_rho, epsilon_drho
251 INTEGER,
INTENT(in) :: npoints
252 REAL(kind=
dp),
INTENT(in) :: sx, a1, a2, gam
254 REAL(kind=
dp),
PARAMETER :: cx = 0.930525736349100_dp, &
258 REAL(kind=
dp) :: denom, ex, gamxsxs, myndrho, myrho, &
270 myrho = 0.5_dp*rho(ii)
271 myndrho = 0.5_dp*max(norm_drho(ii), epsilon_drho)
272 IF (myrho > 0.5_dp*epsilon_rho)
THEN
276 denom = 1.0_dp/(1.0_dp + gamxsxs)
277 ex = rho43*(a1*cx + a2*(gamxsxs*denom)**2)
279 e_0(ii) = e_0(ii) - (2.0_dp*ex)*sx
280 tmp = rho43*2.0_dp*a2*gamxsxs*denom**2*(1.0_dp - gamxsxs*denom)
282 e_rho(ii) = e_rho(ii) - ((o43*ex + tmp*gamxsxs*(-2.0_dp*o43))/myrho)*sx
283 e_ndrho(ii) = e_ndrho(ii) - ((tmp*gam*2.0_dp*myndrho/rho43**2))*sx
289 END SUBROUTINE optx_lda_calc
309 SUBROUTINE optx_lsd_calc(rho, norm_drho, e_0, e_rho, e_ndrho, &
310 epsilon_rho, epsilon_drho, npoints, sx, &
312 REAL(kind=
dp),
DIMENSION(*),
INTENT(IN) :: rho, norm_drho
313 REAL(kind=
dp),
DIMENSION(*),
INTENT(INOUT) :: e_0, e_rho, e_ndrho
314 REAL(kind=
dp),
INTENT(in) :: epsilon_rho, epsilon_drho
315 INTEGER,
INTENT(in) :: npoints
316 REAL(kind=
dp),
INTENT(in) :: sx, a1, a2, gam
318 REAL(kind=
dp),
PARAMETER :: cx = 0.930525736349100_dp, &
322 REAL(kind=
dp) :: denom, ex, gamxsxs, myndrho, myrho, &
335 myndrho = max(norm_drho(ii), epsilon_drho)
336 IF (myrho > epsilon_rho)
THEN
340 denom = 1.0_dp/(1.0_dp + gamxsxs)
341 ex = rho43*(a1*cx + a2*(gamxsxs*denom)**2)
343 e_0(ii) = e_0(ii) - ex*sx
344 tmp = rho43*2.0_dp*a2*gamxsxs*denom**2*(1.0_dp - gamxsxs*denom)
346 e_rho(ii) = e_rho(ii) - ((o43*ex + tmp*gamxsxs*(-2.0_dp*o43))/myrho)*sx
347 e_ndrho(ii) = e_ndrho(ii) - ((tmp*gam*2.0_dp*myndrho/rho43**2))*sx
353 END SUBROUTINE optx_lsd_calc
various utilities that regard array of different kinds: output, allocation,... maybe it is not a good...
Defines the basic variable types.
integer, parameter, public dp
Module with functions to handle derivative descriptors. derivative description are strings have the f...
integer, parameter, public deriv_norm_drho
integer, parameter, public deriv_norm_drhoa
integer, parameter, public deriv_rhob
integer, parameter, public deriv_rhoa
integer, parameter, public deriv_rho
integer, parameter, public deriv_norm_drhob
represent a group ofunctional derivatives
type(xc_derivative_type) function, pointer, public xc_dset_get_derivative(derivative_set, description, allocate_deriv)
returns the requested xc_derivative
Provides types for the management of the xc-functionals and their derivatives.
subroutine, public xc_derivative_get(deriv, split_desc, order, deriv_data, accept_null_data)
returns various information on the given derivative
subroutine, public optx_lda_info(reference, shortform, needs, max_deriv)
info about the optx functional
subroutine, public optx_lsd_eval(rho_set, deriv_set, grad_deriv, optx_params)
evaluates the optx functional for lsd
subroutine, public optx_lda_eval(rho_set, deriv_set, grad_deriv, optx_params)
evaluates the optx functional for lda
subroutine, public optx_lsd_info(reference, shortform, needs, max_deriv)
info about the optx functional (LSD)
subroutine, public xc_rho_set_get(rho_set, can_return_null, rho, drho, norm_drho, rhoa, rhob, norm_drhoa, norm_drhob, rho_1_3, rhoa_1_3, rhob_1_3, laplace_rho, laplace_rhoa, laplace_rhob, drhoa, drhob, rho_cutoff, drho_cutoff, tau_cutoff, tau, tau_a, tau_b, local_bounds)
returns the various attributes of rho_set
represent a pointer to a contiguous 3d array
A derivative set contains the different derivatives of a xc-functional in form of a linked list.
represent a derivative of a functional
contains a flag for each component of xc_rho_set, so that you can use it to tell which components you...
represent a density, with all the representation and data needed to perform a functional evaluation