subroutine dftfun_user (key,name,fderiv,open,igrad,npt,rhoc,rhoo, > sigmacc,sigmaco,sigmaoo, > tauc,tauo,upsilonc,upsilono, > zk,vrhoc,vrhoo, > vsigmacc,vsigmaco,vsigmaoo, > vtauc,vtauo,vupsilonc,vupsilono) implicit double precision (a-h,o-z) logical fderiv,open integer igrad,npt character*(*) key,name double precision rhoc(*),rhoo(*) double precision sigmacc(*),sigmaco(*),sigmaoo(*) double precision tauc(*),tauo(*) double precision upsilonc(*),upsilono(*) double precision zk(*),vrhoc(*),vrhoo(*) double precision vsigmacc(*),vsigmaco(*),vsigmaoo(*) double precision vtauc(*),vtauo(*) double precision vupsilonc(*),vupsilono(*)evaluates density-functional integrand
![]() |
(1) |
Input parameters:
key |
specifies code-name of functional |
fderiv |
functional derivative required, else just ![]() |
npt |
number of ![]() |
rhoc |
![]() |
rhoo |
![]() |
sigmacc |
![]() |
sigmaco |
![]() |
sigmaoo |
![]() |
tauc |
![]() |
tauo |
![]() |
upsilonc |
![]() |
upsilono |
![]() |
Output parameters:
name |
full descriptive name of functional |
igrad |
maximum order of density differentiation (0, 1 or 2) |
zk |
![]() |
vrhoc |
![]() |
vrhoo |
![]() |
vsigmacc |
![]() |
vsigmaco |
![]() |
vsigmaoo |
![]() |
vtauc |
![]() |
vtauo |
![]() |
vupsilonc |
![]() |
vupsilono |
![]() |
All of the available functionals are of the general form
![]() |
(2) |
is always evaluated, and overwrites whatever was in
zk
.
If fderiv
, relevant functional derivatives computed,
and are added in to the appropriate arrays.
If
.not.open
, and other open-shell entities are
ignored.
If
igrad.lt.2
, and similar are ignored;
if
igrad.lt.1
, and similar are ignored.
Additional functionals can go in like this:
else if (key.eq.'MINE') then call dftfun_mine(name,fderiv,open,igrad,npt,rhoc,rhoo, > sigmacc,sigmaco,sigmaoo,tauc,tauo, > upsilonc,upsilono, > zk,vrhoc,vrhoo, > vsigmacc,vsigmaco,vsigmaoo,vtauc,vtauo, > vupsilonc,vupsilono)
Or simply inline as you like;
see src/dft/dftfun.f for examples.
P.J. Knowles and H.-J. Werner