32 #include "../base/base_uses.f90"
37 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'xc_optx'
52 CHARACTER(LEN=*),
INTENT(OUT),
OPTIONAL :: reference, shortform
53 TYPE(xc_rho_cflags_type),
INTENT(inout),
OPTIONAL :: needs
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
80 TYPE(xc_rho_cflags_type),
INTENT(inout),
OPTIONAL :: needs
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 TYPE(xc_rho_set_type),
INTENT(IN) :: rho_set
111 TYPE(xc_derivative_set_type),
INTENT(IN) :: deriv_set
112 INTEGER,
INTENT(in) :: grad_deriv
113 TYPE(section_vals_type),
POINTER :: optx_params
116 INTEGER,
DIMENSION(2, 3) :: bo
117 REAL(kind=
dp) :: a1, a2, epsilon_drho, epsilon_rho, gam, &
119 REAL(kind=
dp),
CONTIGUOUS,
DIMENSION(:, :, :), &
120 POINTER :: e_0, e_ndrho, e_rho, norm_drho, rho
121 TYPE(xc_derivative_type),
POINTER :: deriv
123 NULLIFY (e_0, e_ndrho, e_rho, norm_drho, rho)
131 norm_drho=norm_drho, local_bounds=bo, rho_cutoff=epsilon_rho, &
132 drho_cutoff=epsilon_drho)
133 npoints = (bo(2, 1) - bo(1, 1) + 1)*(bo(2, 2) - bo(1, 2) + 1)*(bo(2, 3) - bo(1, 3) + 1)
136 allocate_deriv=.true.)
139 allocate_deriv=.true.)
142 allocate_deriv=.true.)
144 IF (grad_deriv > 1 .OR. grad_deriv < -1)
THEN
145 cpabort(
"derivatives bigger than 1 not implemented")
148 CALL optx_lda_calc(rho=rho, norm_drho=norm_drho, &
149 e_0=e_0, e_rho=e_rho, e_ndrho=e_ndrho, &
150 npoints=npoints, epsilon_rho=epsilon_rho, &
151 epsilon_drho=epsilon_drho, sx=sx, &
152 a1=a1, a2=a2, gam=gam)
169 TYPE(xc_rho_set_type),
INTENT(IN) :: rho_set
170 TYPE(xc_derivative_set_type),
INTENT(IN) :: deriv_set
171 INTEGER,
INTENT(in) :: grad_deriv
172 TYPE(section_vals_type),
POINTER :: optx_params
174 INTEGER :: ispin, npoints
175 INTEGER,
DIMENSION(2, 3) :: bo
176 REAL(kind=
dp) :: a1, a2, epsilon_drho, epsilon_rho, gam, &
178 REAL(kind=
dp),
CONTIGUOUS,
DIMENSION(:, :, :), &
180 TYPE(cp_3d_r_cp_type),
DIMENSION(2) :: e_ndrho, e_rho, ndrho, rho
181 TYPE(xc_derivative_type),
POINTER :: deriv
185 NULLIFY (e_rho(ispin)%array)
186 NULLIFY (e_ndrho(ispin)%array)
187 NULLIFY (rho(ispin)%array)
188 NULLIFY (ndrho(ispin)%array)
196 CALL xc_rho_set_get(rho_set, rhoa=rho(1)%array, rhob=rho(2)%array, &
197 norm_drhoa=ndrho(1)%array, &
198 norm_drhob=ndrho(2)%array, rho_cutoff=epsilon_rho, &
199 drho_cutoff=epsilon_drho, local_bounds=bo)
200 npoints = (bo(2, 1) - bo(1, 1) + 1)*(bo(2, 2) - bo(1, 2) + 1)*(bo(2, 3) - bo(1, 3) + 1)
203 allocate_deriv=.true.)
206 allocate_deriv=.true.)
209 allocate_deriv=.true.)
213 allocate_deriv=.true.)
216 allocate_deriv=.true.)
219 IF (grad_deriv > 1 .OR. grad_deriv < -1)
THEN
220 cpabort(
"derivatives bigger than 1 not implemented")
223 CALL optx_lsd_calc(rho=rho(ispin)%array, norm_drho=ndrho(ispin)%array, &
224 e_0=e_0, e_rho=e_rho(ispin)%array, e_ndrho=e_ndrho(ispin)%array, &
225 npoints=npoints, epsilon_rho=epsilon_rho, &
226 epsilon_drho=epsilon_drho, sx=sx, &
227 a1=a1, a2=a2, gam=gam)
249 SUBROUTINE optx_lda_calc(rho, norm_drho, e_0, e_rho, e_ndrho, &
250 epsilon_rho, epsilon_drho, npoints, sx, &
252 REAL(kind=
dp),
DIMENSION(*),
INTENT(IN) :: rho, norm_drho
253 REAL(kind=
dp),
DIMENSION(*),
INTENT(INOUT) :: e_0, e_rho, e_ndrho
254 REAL(kind=
dp),
INTENT(in) :: epsilon_rho, epsilon_drho
255 INTEGER,
INTENT(in) :: npoints
256 REAL(kind=
dp),
INTENT(in) :: sx, a1, a2, gam
258 REAL(kind=
dp),
PARAMETER :: cx = 0.930525736349100_dp, &
262 REAL(kind=
dp) :: denom, ex, gamxsxs, myndrho, myrho, &
274 myrho = 0.5_dp*rho(ii)
275 myndrho = 0.5_dp*max(norm_drho(ii), epsilon_drho)
276 IF (myrho > 0.5_dp*epsilon_rho)
THEN
280 denom = 1.0_dp/(1.0_dp + gamxsxs)
281 ex = rho43*(a1*cx + a2*(gamxsxs*denom)**2)
283 e_0(ii) = e_0(ii) - (2.0_dp*ex)*sx
284 tmp = rho43*2.0_dp*a2*gamxsxs*denom**2*(1.0_dp - gamxsxs*denom)
286 e_rho(ii) = e_rho(ii) - ((o43*ex + tmp*gamxsxs*(-2.0_dp*o43))/myrho)*sx
287 e_ndrho(ii) = e_ndrho(ii) - ((tmp*gam*2.0_dp*myndrho/rho43**2))*sx
293 END SUBROUTINE optx_lda_calc
313 SUBROUTINE optx_lsd_calc(rho, norm_drho, e_0, e_rho, e_ndrho, &
314 epsilon_rho, epsilon_drho, npoints, sx, &
316 REAL(kind=
dp),
DIMENSION(*),
INTENT(IN) :: rho, norm_drho
317 REAL(kind=
dp),
DIMENSION(*),
INTENT(INOUT) :: e_0, e_rho, e_ndrho
318 REAL(kind=
dp),
INTENT(in) :: epsilon_rho, epsilon_drho
319 INTEGER,
INTENT(in) :: npoints
320 REAL(kind=
dp),
INTENT(in) :: sx, a1, a2, gam
322 REAL(kind=
dp),
PARAMETER :: cx = 0.930525736349100_dp, &
326 REAL(kind=
dp) :: denom, ex, gamxsxs, myndrho, myrho, &
339 myndrho = max(norm_drho(ii), epsilon_drho)
340 IF (myrho > epsilon_rho)
THEN
344 denom = 1.0_dp/(1.0_dp + gamxsxs)
345 ex = rho43*(a1*cx + a2*(gamxsxs*denom)**2)
347 e_0(ii) = e_0(ii) - ex*sx
348 tmp = rho43*2.0_dp*a2*gamxsxs*denom**2*(1.0_dp - gamxsxs*denom)
350 e_rho(ii) = e_rho(ii) - ((o43*ex + tmp*gamxsxs*(-2.0_dp*o43))/myrho)*sx
351 e_ndrho(ii) = e_ndrho(ii) - ((tmp*gam*2.0_dp*myndrho/rho43**2))*sx
357 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