Octopus
xc_sic.F90
Go to the documentation of this file.
1!! Copyright (C) 2002-2006 M. Marques, A. Castro, A. Rubio, G. Bertsch
2!! Copyright (C) 2022 N. Tancogne-Dejean
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
22module xc_sic_oct_m
23 use debug_oct_m
25 use global_oct_m
26 use grid_oct_m
33 use parser_oct_m
36 use space_oct_m
40 use xc_oct_m
41 use xc_f03_lib_m
42 use xc_oep_oct_m
44 use xc_vxc_oct_m
45
46 implicit none
47
48 private
49 public :: &
50 xc_sic_t, &
56
58 integer, parameter, public :: &
59 SIC_NONE = 1, & !< no self-interaction correction
60 sic_pz_oep = 2, &
61 sic_amaldi = 3, &
62 sic_adsic = 4
63
65 type xc_sic_t
66 private
67 integer, public :: level = sic_none
68 real(real64), public :: amaldi_factor
69 type(xc_oep_t), public :: oep
70 end type xc_sic_t
71
72contains
73
74 ! ---------------------------------------------------------
76 !
77 subroutine xc_sic_init(sic, namespace, gr, st, mc, space)
78 type(xc_sic_t), intent(out) :: sic
79 type(namespace_t), intent(in) :: namespace
80 type(grid_t), intent(inout) :: gr
81 type(states_elec_t), intent(in) :: st
82 type(multicomm_t), intent(in) :: mc
83 class(space_t), intent(in) :: space
84
85
86 push_sub(xc_sic_init)
87
88 !%Variable SICCorrection
89 !%Type integer
90 !%Default sic_none
91 !%Section Hamiltonian::XC
92 !%Description
93 !% This variable controls which form of self-interaction correction to use. Note that
94 !% this correction will be applied to the functional chosen by <tt>XCFunctional</tt>.
95 !%Option sic_none 1
96 !% No self-interaction correction.
97 !%Option sic_pz 2
98 !% Perdew-Zunger SIC, handled by the OEP technique.
99 !% J. P. Perdew and Alex Zunger, Phys. Rev. B 23, 5048 (1981)
100 !% Extension to the spinor case follows Tancogne-Dejean et al., J. Chem. Phys. 159, 224110 (2023)
101 !%
102 !% Note that the current implement uses canonical orbitals and not minimizing orbitals.
103 !% Please check <tt>SCDMforPZSIC</tt> for using SCDM-based Wannier orbitals instead of canonical orbitals.
104 !%Option sic_amaldi 3
105 !% Amaldi correction term. Not implemeneted for spinors.
106 !% E. Fermi and E. Amaldi, Mem. Reale Accad. Italia 6, 119 (1934)
107 !%Option sic_adsic 4
108 !% Average-density SIC.
109 !% C. Legrand <i>et al.</i>, <i>J. Phys. B</i> <b>35</b>, 1115 (2002).
110 !% Extension to the spinor case follows Tancogne-Dejean et al., J. Chem. Phys. 159, 224110 (2023)
111 !%End
112 call parse_variable(namespace, 'SICCorrection', sic_none, sic%level)
113 if (.not. varinfo_valid_option('SICCorrection', sic%level)) call messages_input_error(namespace, 'SICCorrection')
114
115 ! check whether we should introduce the Amaldi SIC correction
116 sic%amaldi_factor = m_one
117 if (sic%level == sic_amaldi) then
118 sic%amaldi_factor = (st%qtot - m_one)/st%qtot
119 if(st%d%ispin == spinors) then
120 call messages_not_implemented("Amaldi SIC with non-collinear spins")
121 end if
122 end if
123
124 if(sic%level == sic_pz_oep) then
125 call xc_oep_init(sic%oep, namespace, gr, st, mc, space, oep_type = oep_type_sic)
126
127 if(st%nik > st%d%spin_channels) then
128 call messages_not_implemented("PZ-SIC with k-points")
129 end if
130 end if
131
132 if (allocated(st%rho_core)) then
133 call messages_not_implemented('SIC with nonlinear core corrections')
134 end if
135
136 if (allocated(st%frozen_rho) .and. (sic%level == sic_pz_oep .or. sic%level == sic_amaldi)) then
137 call messages_not_implemented('PZ-SIC with frozen orbitals')
138 end if
139
140 if (space%is_periodic() .and. sic%level /= sic_none) then
141 call messages_not_implemented("SIC corrections in periodic systems")
142 end if
143
144 pop_sub(xc_sic_init)
145 end subroutine xc_sic_init
146
147 ! ---------------------------------------------------------
149 subroutine xc_sic_end(sic)
150 type(xc_sic_t), intent(inout) :: sic
151
152 if (sic%level == sic_none) return
154 push_sub(xc_sic_end)
155
156 if(sic%level == sic_pz_oep) call xc_oep_end(sic%oep)
157
158 pop_sub(xc_sic_end)
159 end subroutine xc_sic_end
161
162 ! ---------------------------------------------------------
163 subroutine xc_sic_write_info(sic, iunit, namespace)
164 type(xc_sic_t), intent(in) :: sic
165 integer, optional, intent(in) :: iunit
166 type(namespace_t), optional, intent(in) :: namespace
167
168 if (sic%level == sic_none) return
169
170 push_sub(xc_sic_write_info)
171
172 call messages_print_var_option('SICCorrection', sic%level, iunit=iunit, namespace=namespace)
173
174 pop_sub(xc_sic_write_info)
175 end subroutine xc_sic_write_info
176
177 ! ---------------------------------------------------------
194 subroutine xc_sic_calc_adsic(sic, namespace, space, gr, st, hm, xc, density, vxc, ex, ec)
195 type(xc_sic_t), intent(in) :: sic
196 type(namespace_t), intent(in) :: namespace
197 class(space_t), intent(in) :: space
198 type(grid_t), intent(in) :: gr
199 type(states_elec_t), intent(in) :: st
200 type(hamiltonian_elec_t), intent(in) :: hm
201 type(xc_t), intent(inout) :: xc
202 real(real64), contiguous, intent(in) :: density(:,:)
203 real(real64), contiguous, intent(inout) :: vxc(:,:)
204 real(real64), optional, intent(inout) :: ex, ec
205
206 integer :: ispin, ist, ik, ip
207 real(real64), allocatable :: vxc_sic(:,:), vh_sic(:), rho(:, :)
208 real(real64) :: ex_sic, ec_sic, qsp(2)
209 real(real64) :: dtot, dpol, vpol, wpol
210 real(real64) :: nup
213 real(real64), parameter :: adsic_dpol_reg = 1.0e-10_real64
214
215 push_sub(xc_sic_calc_adsic)
216
217 assert(sic%level == sic_adsic)
218 assert(present(ex) .eqv. present(ec))
219
220 if (st%d%ispin == spinors .and. .not. in_family(hm%xc%family, [xc_family_lda, xc_family_gga])) then
221 write(message(1),'(a)') 'ADSIC with non-collinear spin is currently only possible'
222 write(message(2),'(a)') 'with LDA and GGA functionals.'
223 call messages_fatal(2, namespace=namespace)
224 end if
225
226 if (xc_is_not_size_consistent(xc, namespace)) then
227 call messages_not_implemented('ADSIC with size inconsistent functionals', namespace=namespace)
228 end if
229
230 ! We compute here the number of electrons per spin channel
231 qsp = m_zero
232 if( .not. allocated(st%frozen_rho)) then
233 select case (st%d%ispin)
235 do ist = 1, st%nst
236 do ik = 1, st%nik
237 ispin = st%d%get_spin_index(ik)
238 qsp(ispin) = qsp(ispin) + st%occ(ist, ik) * st%kweights(ik)
239 end do
240 end do
241 end select
242 else
243 ! In the case of the frozen density, we can only get the charge from the integral
244 ! of the total density, including valence and frozen density
245 qsp(1:st%d%spin_channels) = dmf_integrate(gr, st%d%spin_channels, density)
246 end if
247
248 safe_allocate(vxc_sic(1:gr%np, 1:2))
249 safe_allocate(vh_sic(1:gr%np))
250 safe_allocate(rho(1:gr%np, 1:2))
251 ! We first compute the average xc self-interction error and we substract it
252 select case (st%d%ispin)
254 do ispin = 1, st%d%spin_channels
255 if (abs(qsp(ispin)) <= m_min_occ) cycle
256
257 rho = m_zero
258 vxc_sic = m_zero
259
260 rho(:, ispin) = density(:, ispin) / qsp(ispin)
261 if(present(ex)) then
262 ex_sic = m_zero
263 ec_sic = m_zero
264 ! This needs always to be called for the spin-polarized case
265 ! force_host is needed to ensure the correct density is used for the libxc call on GPU (see comment in xc_vxc_inc.F90)
266 call xc_get_vxc(gr, xc, st, hm%kpoints, hm%psolver, namespace, space, &
267 rho, spin_polarized, hm%ions%latt%rcell_volume, vxc_sic, ex = ex_sic, ec = ec_sic, force_host=.true.)
268 ex = ex - ex_sic * qsp(ispin)
269 ec = ec - ec_sic * qsp(ispin)
270 else
271 ! This needs always to be called for the spin-polarized case
272 ! force_host is needed to ensure the correct density is used for the libxc call on GPU (see comment in xc_vxc_inc.F90)
273 call xc_get_vxc(gr, xc, st, hm%kpoints, hm%psolver, namespace, space, &
274 rho, spin_polarized, hm%ions%latt%rcell_volume, vxc_sic, force_host=.true.)
275 end if
276
277 call lalg_axpy(gr%np, -m_one, vxc_sic(:, ispin), vxc(:, ispin))
278
279 ! We now substract the averaged Hartree self-interaction error
280 ! See Eq. 15 in [Pietezak and Vieira, Theoretical Chemistry Accounts (2021) 140:130]
281 vh_sic = m_zero
282 call dpoisson_solve(hm%psolver, namespace, vh_sic, rho(:, ispin), all_nodes=.false.)
283 call lalg_axpy(gr%np, -m_one, vh_sic, vxc(:, ispin))
284
285 ! Compute the corresponding energy contribution
286 if(present(ex)) then
287 ex = ex - m_half*dmf_dotp(gr, rho(:,ispin), vh_sic) * qsp(ispin)
288 end if
290 end do
291
292 case (spinors)
293 ! Here we only treat the case of LDA/GGA. We rotate the average density in the local frame
294 ! And we then compute the SIC correction from it
295 ! This cannot excerce any xc torque, by construction
296 assert(in_family(hm%xc%family, [xc_family_lda, xc_family_gga]))
297
298 do ispin = 1, 2
299 rho = m_zero
300 vxc_sic = m_zero
301 ! Averaged density in the local frame
302 do ip = 1, gr%np
303 dtot = density(ip, 1) + density(ip, 2)
304 dpol = sqrt((density(ip, 1) - density(ip, 2))**2 + &
305 m_four*(density(ip, 3)**2 + density(ip, 4)**2))
306 if(ispin == 1) then
307 rho(ip, 1) = max(m_half*(dtot + dpol), m_zero)
308 else
309 rho(ip, 2) = max(m_half*(dtot - dpol), m_zero)
310 end if
311 end do
312 nup = dmf_integrate(gr, rho(:,ispin))
313 if (nup <= m_min_occ) cycle
314 call lalg_scal(gr%np, m_one/nup, rho(:,ispin))
315
316 ! This needs always to be called for the spin-polarized case
317 if(present(ex) .and. present(ec)) then
318 ex_sic = m_zero
319 ec_sic = m_zero
320 call xc_get_vxc(gr, xc, st, hm%kpoints, hm%psolver, namespace, space, &
321 rho, spin_polarized, hm%ions%latt%rcell_volume, vxc_sic, ex = ex_sic, ec = ec_sic, force_host=.true.)
322 ex = ex - ex_sic * nup
323 ec = ec - ec_sic * nup
324 else
325 call xc_get_vxc(gr, xc, st, hm%kpoints, hm%psolver, namespace, space, &
326 rho, spin_polarized, hm%ions%latt%rcell_volume, vxc_sic, force_host=.true.)
327 end if
328
329 ! Select only the potential correspond to this spin channel
330 if(ispin == 2) then
331 vxc_sic(:, 1) = m_zero
332 else
333 vxc_sic(:, 2) = m_zero
334 end if
335
336 vh_sic = m_zero
337 call dpoisson_solve(hm%psolver, namespace, vh_sic, rho(:, ispin), all_nodes=.false.)
338 call lalg_axpy(gr%np, m_one, vh_sic, vxc_sic(:, ispin))
339 ! Compute the corresponding energy contribution
340 if(present(ex)) then
341 ex = ex - m_half*dmf_dotp(gr, rho(:,ispin), vh_sic) * nup
342 end if
343
344 do ip = 1, gr%np
345 dpol = sqrt((density(ip, 1) - density(ip, 2))**2 + &
346 m_four*(density(ip, 3)**2 + density(ip, 4)**2))
347 ! See lda_process in xc_vxc_inc.F90
348 if (dpol > xc_tiny*(density(ip, 1)+density(ip, 2))) then
349 ! Unlike for the LDA potential, the two local-frame SIC potentials do not become
350 ! equal as |m| -> 0 (they are normalized by different electron numbers), so the
351 ! magnetic part of the correction must be damped where the local frame direction
352 ! m/|m| is not well defined.
353 wpol = dpol**2/(dpol**2 + (adsic_dpol_reg*(density(ip, 1)+density(ip, 2)))**2)
354 vpol = wpol*(vxc_sic(ip, 1) - vxc_sic(ip, 2))*(density(ip, 1) - density(ip, 2))/(safe_tol(dpol, xc_tiny))
355
356 vxc(ip, 1) = vxc(ip, 1) - m_half*(vxc_sic(ip, 1) + vxc_sic(ip, 2) + vpol)
357 vxc(ip, 2) = vxc(ip, 2) - m_half*(vxc_sic(ip, 1) + vxc_sic(ip, 2) - vpol)
358 vxc(ip, 3) = vxc(ip, 3) - wpol*(vxc_sic(ip, 1) - vxc_sic(ip, 2))*density(ip, 3)/(safe_tol(dpol, xc_tiny))
359 vxc(ip, 4) = vxc(ip, 4) - wpol*(vxc_sic(ip, 1) - vxc_sic(ip, 2))*density(ip, 4)/(safe_tol(dpol, xc_tiny))
360 else
361 vxc(ip, 1) = vxc(ip, 1) - m_half*(vxc_sic(ip, 1) + vxc_sic(ip, 2))
362 vxc(ip, 2) = vxc(ip, 2) - m_half*(vxc_sic(ip, 1) + vxc_sic(ip, 2))
363 end if
364 end do
365 end do
366
367
368 end select
369
370 safe_deallocate_a(vxc_sic)
371 safe_deallocate_a(vh_sic)
372 safe_deallocate_a(rho)
373
374 pop_sub(xc_sic_calc_adsic)
375 end subroutine xc_sic_calc_adsic
376
377 ! ---------------------------------------------------------
381 subroutine xc_sic_add_fxc_adsic(namespace, xc, st, gr, rho, fxc, fxc_grad, fxc_grad_spin, triplet)
382 type(namespace_t), intent(in) :: namespace
383 type(xc_t), intent(in) :: xc
384 type(states_elec_t), intent(in) :: st
385 type(grid_t), intent(in) :: gr
386 real(real64), intent(in) :: rho(:,:)
387 real(real64), contiguous, intent(inout) :: fxc(:,:,:)
388 real(real64), contiguous, intent(inout) :: fxc_grad(:,:,:,:,:)
389 real(real64), contiguous, intent(inout) :: fxc_grad_spin(:,:,:,:)
390 logical, intent(in) :: triplet
391
392 real(real64), allocatable :: rho_averaged(:, :)
393 real(real64), allocatable :: fxc_sic(:,:,:)
394 real(real64), allocatable :: fxc_grad_sic(:,:,:,:,:)
395 real(real64), allocatable :: fxc_grad_spin_sic(:,:,:,:)
396 real(real64) :: qtot
397 integer :: ispin
398
399 push_sub(xc_sic_add_fxc_adsic)
400
401 !Check spin and triplets
402 assert(st%d%ispin /= spinors)
403 assert(.not. allocated(st%frozen_rho))
404
405 if ( bitand(xc%kernel_family, xc_family_lda) == 0 .and. bitand(xc%kernel_family, xc_family_gga) == 0 ) then
406 message(1) = "fxc calculation with ADSIC not implemented beyond LDAs and GGAs."
407 call messages_fatal(1, namespace=namespace)
408 end if
409
410 if (xc_is_not_size_consistent(xc, namespace)) then
411 call messages_not_implemented('ADSIC with size inconsistent functionals', namespace=namespace)
412 end if
413
414 if (st%d%ispin == spinors) then
415 call messages_not_implemented('ADSIC fxc with non-collinear spin')
416 end if
417
418
419 ! This needs always to be called for the spin-polarized case
420 ! SAFE_ALLOCATE(rho_averaged(1:gr%np, 1:2))
421 safe_allocate(rho_averaged(1:gr%np_part, 1:2))
422 safe_allocate(fxc_sic(1:gr%np, 1:2, 1:2))
423 safe_allocate(fxc_grad_sic(1:gr%np, 1:gr%der%dim, 1:gr%der%dim, 1:2, 1:2))
424 safe_allocate(fxc_grad_spin_sic(1:gr%np, 1:gr%der%dim, 1:2, 1:2))
425
426 do ispin = 1, st%d%nspin
427 rho_averaged = m_zero
428 qtot = dmf_integrate(gr, rho(:, ispin))
429 if (abs(qtot) <= m_min_occ) cycle
430
431 call lalg_copy(gr%np, rho(:, ispin), rho_averaged(:, ispin))
432 call lalg_scal(gr%np, m_one/qtot, rho_averaged(:, ispin))
433
434 if(triplet) then
435 call lalg_scal(gr%np, m_half, rho_averaged(:, 1))
436 call lalg_copy(gr%np, rho_averaged(:, 1), rho_averaged(:, 2))
437 endif
438
439 fxc_sic = m_zero
440 fxc_grad_sic = m_zero
441 fxc_grad_spin_sic = m_zero
442 call xc_get_fxc(xc, gr, namespace, rho_averaged, spin_polarized, fxc_sic, &
443 fxc_grad_sic, fxc_grad_spin_sic)
444
445 ! For Casida triplet, fxc = 1/2 (fxc_up[n_up] - fxc_up [n_down])
446 if (triplet) then
447 call lalg_axpy(gr%np, -m_half/qtot, fxc_sic(:, 1, 1), fxc(:, 1, 1))
448 call lalg_axpy(gr%np, +m_half/qtot, fxc_sic(:, 1, 2), fxc(:, 1, 1))
449 call lalg_axpy(gr%np, gr%der%dim, gr%der%dim, -m_half/qtot, fxc_grad_sic(:, :, :, 1, 1), fxc_grad(:, :, :, 1, 1))
450 call lalg_axpy(gr%np, gr%der%dim, gr%der%dim, +m_half/qtot, fxc_grad_sic(:, :, :, 1, 2), fxc_grad(:, :, :, 1, 1))
451 else
452 call lalg_axpy(gr%np, -m_one/qtot, fxc_sic(:, ispin, ispin), fxc(:, ispin, ispin))
453 call lalg_axpy(gr%np, gr%der%dim, gr%der%dim, -m_one/qtot, fxc_grad_sic(:, :, :, ispin, ispin), &
454 fxc_grad(:, :, :, ispin, ispin))
455 if (st%d%nspin > 1) then
456 call lalg_axpy(gr%np, gr%der%dim, -m_one/qtot, fxc_grad_spin_sic(:, :, ispin, ispin), &
457 fxc_grad_spin(:, :, ispin, ispin))
458 end if
459 end if
460
461 end do
462
463 safe_deallocate_a(rho_averaged)
464 safe_deallocate_a(fxc_sic)
465 safe_deallocate_a(fxc_grad_sic)
466 safe_deallocate_a(fxc_grad_spin_sic)
467
468 pop_sub(xc_sic_add_fxc_adsic)
469 end subroutine xc_sic_add_fxc_adsic
470
471end module xc_sic_oct_m
472
473!! Local Variables:
474!! mode: f90
475!! coding: utf-8
476!! End:
constant times a vector plus a vector
Definition: lalg_basic.F90:173
Copies a vector x, to a vector y.
Definition: lalg_basic.F90:188
scales a vector by a constant
Definition: lalg_basic.F90:159
double sqrt(double __x) __attribute__((__nothrow__
integer, parameter, public unpolarized
Parameters...
integer, parameter, public spinors
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_half
Definition: global.F90:206
real(real64), parameter, public m_one
Definition: global.F90:201
real(real64), parameter, public m_min_occ
Minimal occupation that is considered to be non-zero.
Definition: global.F90:227
This module implements the underlying real-space grid.
Definition: grid.F90:119
This module defines various routines, operating on mesh functions.
subroutine, public messages_not_implemented(feature, namespace)
Definition: messages.F90:1068
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
This module handles the communicators for the various parallelization strategies.
Definition: multicomm.F90:147
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:1010
This module handles spin dimensions of the states and the k-point distribution.
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
Definition: xc.F90:120
real(real64), parameter, public xc_tiny
Arbitrary definition of tiny, for use in XC context.
Definition: xc.F90:255
logical function, public xc_is_not_size_consistent(xcs, namespace)
Is one of the x or c functional is not size consistent.
Definition: xc.F90:821
pure logical function, public in_family(family, xc_families)
Definition: xc.F90:749
subroutine, public xc_oep_end(oep)
Definition: xc_oep.F90:358
subroutine, public xc_oep_init(oep, namespace, gr, st, mc, space, oep_type)
Definition: xc_oep.F90:219
integer, parameter, public oep_type_sic
Definition: xc_oep.F90:186
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
subroutine, public xc_sic_add_fxc_adsic(namespace, xc, st, gr, rho, fxc, fxc_grad, fxc_grad_spin, triplet)
Adds to fxc the ADSIC contribution.
Definition: xc_sic.F90:477
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
Description of the grid, containing information on derivatives, stencil, and symmetries.
Definition: grid.F90:171
The states_elec_t class contains all electronic wave functions.
This class contains information about the self-interaction correction.
Definition: xc_sic.F90:160
int true(void)