mirror of
https://github.com/pfloos/quack
synced 2024-12-22 20:34:46 +01:00
scaling of N-centered
This commit is contained in:
parent
1d3e156838
commit
a96719d0c2
44
input/basis
44
input/basis
@ -1,30 +1,18 @@
|
|||||||
1 6
|
1 3
|
||||||
S 8
|
S 3
|
||||||
1 1469.0000000 0.0007660
|
1 13.0100000 0.0196850
|
||||||
2 220.5000000 0.0058920
|
2 1.9620000 0.1379770
|
||||||
3 50.2600000 0.0296710
|
3 0.4446000 0.4781480
|
||||||
4 14.2400000 0.1091800
|
|
||||||
5 4.5810000 0.2827890
|
|
||||||
6 1.5800000 0.4531230
|
|
||||||
7 0.5640000 0.2747740
|
|
||||||
8 0.0734500 0.0097510
|
|
||||||
S 8
|
|
||||||
1 1469.0000000 -0.0001200
|
|
||||||
2 220.5000000 -0.0009230
|
|
||||||
3 50.2600000 -0.0046890
|
|
||||||
4 14.2400000 -0.0176820
|
|
||||||
5 4.5810000 -0.0489020
|
|
||||||
6 1.5800000 -0.0960090
|
|
||||||
7 0.5640000 -0.1363800
|
|
||||||
8 0.0734500 0.5751020
|
|
||||||
S 1
|
S 1
|
||||||
1 0.0280500 1.0000000
|
1 0.1220000 1.0000000
|
||||||
P 3
|
|
||||||
1 1.5340000 0.0227840
|
|
||||||
2 0.2749000 0.1391070
|
|
||||||
3 0.0736200 0.5003750
|
|
||||||
P 1
|
P 1
|
||||||
1 0.0240300 1.0000000
|
1 0.7270000 1.0000000
|
||||||
D 1
|
2 3
|
||||||
1 0.1239000 1.0000000
|
S 3
|
||||||
|
1 13.0100000 0.0196850
|
||||||
|
2 1.9620000 0.1379770
|
||||||
|
3 0.4446000 0.4781480
|
||||||
|
S 1
|
||||||
|
1 0.1220000 1.0000000
|
||||||
|
P 1
|
||||||
|
1 0.7270000 1.0000000
|
||||||
|
20
input/dft
20
input/dft
@ -18,22 +18,22 @@
|
|||||||
1
|
1
|
||||||
# Number of states in ensemble (nEns)
|
# Number of states in ensemble (nEns)
|
||||||
3
|
3
|
||||||
# occupation numbers of orbitals
|
# occupation numbers of orbitals nO and nO+1
|
||||||
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
|
||||||
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
|
|
||||||
1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
|
1 1 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0
|
||||||
# Ensemble weights: wEns(1),...,wEns(nEns-1)
|
# Ensemble weights: wEns(1),...,wEns(nEns-1)
|
||||||
0.00 1.00
|
0.00 1.00
|
||||||
# Ncentered ? 0 for NO
|
# Ncentered ? 0 for NO
|
||||||
1
|
0
|
||||||
# Parameters for CC weight-dependent exchange functional
|
# Parameters for CC weight-dependent exchange functional
|
||||||
0.420431 0.069097 -0.295049
|
0.445525 0.0901503 -0.286898
|
||||||
0.135075 -0.00770826 -0.028057
|
0.191734 -0.0364788 -0.017035
|
||||||
# choice of UCC exchange coefficient : 1 for Cx1, 2 for Cx2, 3 for Cx1*Cx2
|
# choice of UCC exchange coefficient : 1 for Cx1, 2 for Cx2, 3 for Cx1*Cx2
|
||||||
2
|
2
|
||||||
# GOK-DFT: maxSCF thresh DIIS n_diis guess_type ortho_type
|
# GOK-DFT: maxSCF thresh DIIS n_diis guess_type ortho_type
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
# nAt nEla nElb nCore nRyd
|
# nAt nEla nElb nCore nRyd
|
||||||
1 2 1 0 0
|
2 1 1 0 0
|
||||||
# Znuc x y z
|
# Znuc x y z
|
||||||
Li 0.0 0.0 0.0
|
H 0. 0. 0.
|
||||||
|
H 0. 0. 1.4
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
1
|
2
|
||||||
|
|
||||||
Li 0.0000000000 0.0000000000 0.0000000000
|
H 0.0000000000 0.0000000000 0.0000000000
|
||||||
|
H 0.0000000000 0.0000000000 0.7408481486
|
||||||
|
44
input/weight
44
input/weight
@ -1,30 +1,18 @@
|
|||||||
1 6
|
1 3
|
||||||
S 8
|
S 3
|
||||||
1 1469.0000000 0.0007660
|
1 13.0100000 0.0196850
|
||||||
2 220.5000000 0.0058920
|
2 1.9620000 0.1379770
|
||||||
3 50.2600000 0.0296710
|
3 0.4446000 0.4781480
|
||||||
4 14.2400000 0.1091800
|
|
||||||
5 4.5810000 0.2827890
|
|
||||||
6 1.5800000 0.4531230
|
|
||||||
7 0.5640000 0.2747740
|
|
||||||
8 0.0734500 0.0097510
|
|
||||||
S 8
|
|
||||||
1 1469.0000000 -0.0001200
|
|
||||||
2 220.5000000 -0.0009230
|
|
||||||
3 50.2600000 -0.0046890
|
|
||||||
4 14.2400000 -0.0176820
|
|
||||||
5 4.5810000 -0.0489020
|
|
||||||
6 1.5800000 -0.0960090
|
|
||||||
7 0.5640000 -0.1363800
|
|
||||||
8 0.0734500 0.5751020
|
|
||||||
S 1
|
S 1
|
||||||
1 0.0280500 1.0000000
|
1 0.1220000 1.0000000
|
||||||
P 3
|
|
||||||
1 1.5340000 0.0227840
|
|
||||||
2 0.2749000 0.1391070
|
|
||||||
3 0.0736200 0.5003750
|
|
||||||
P 1
|
P 1
|
||||||
1 0.0240300 1.0000000
|
1 0.7270000 1.0000000
|
||||||
D 1
|
2 3
|
||||||
1 0.1239000 1.0000000
|
S 3
|
||||||
|
1 13.0100000 0.0196850
|
||||||
|
2 1.9620000 0.1379770
|
||||||
|
3 0.4446000 0.4781480
|
||||||
|
S 1
|
||||||
|
1 0.1220000 1.0000000
|
||||||
|
P 1
|
||||||
|
1 0.7270000 1.0000000
|
||||||
|
50
scan_w.sh
50
scan_w.sh
@ -12,17 +12,27 @@ w1=0.00
|
|||||||
XF=$3
|
XF=$3
|
||||||
CF=$4
|
CF=$4
|
||||||
|
|
||||||
|
# for H
|
||||||
|
#aw1="1.49852 7.79815 25.1445"
|
||||||
|
#aw2="0.424545 -0.0382349 -0.32472"
|
||||||
|
|
||||||
|
|
||||||
# for He
|
# for He
|
||||||
aw1="0.420431 0.069097 -0.295049"
|
#aw1="0.429447 0.053506 -0.339391"
|
||||||
aw2="0.135075 -0.00770826 -0.028057"
|
#aw2="0.254939 -0.0893396 0.00765453"
|
||||||
|
|
||||||
# for H2
|
# for H2
|
||||||
#aw1="0.445525 0.0901503 -0.286898"
|
aw1="0.445525 0.0901503 -0.286898"
|
||||||
#aw2="0.191734 -0.0364788 -0.017035"
|
aw2="0.191734 -0.0364788 -0.017035"
|
||||||
|
|
||||||
# for Li
|
# for Li
|
||||||
#aw1="0.0560976 -0.00796904 -0.0238162"
|
#aw1="0.055105 -0.00943825 -0.0267771"
|
||||||
#aw2="0.0360106 0.00979306 -0.0172286"
|
#aw2="0.0359827 0.0096623 -0.0173542"
|
||||||
|
|
||||||
|
# for Li+
|
||||||
|
#aw1="0.503566, 0.137076, -0.348529"
|
||||||
|
#aw2="0.0553828, 0.00830375, -0.0234602"
|
||||||
|
|
||||||
|
|
||||||
# for B
|
# for B
|
||||||
#aw1="0.052676 -0.00624118 -0.000368825"
|
#aw1="0.052676 -0.00624118 -0.000368825"
|
||||||
@ -36,6 +46,9 @@ aw2="0.135075 -0.00770826 -0.028057"
|
|||||||
#aw1="-0.00201219 -0.00371002 -0.00212719"
|
#aw1="-0.00201219 -0.00371002 -0.00212719"
|
||||||
#aw2="-0.00117715 0.00188738 -0.000414761"
|
#aw2="-0.00117715 0.00188738 -0.000414761"
|
||||||
|
|
||||||
|
# for Be
|
||||||
|
#aw1="0.0663282, -0.0117682, -0.0335909"
|
||||||
|
#aw2="0.0479262, 0.00966351, -0.0208712"
|
||||||
|
|
||||||
|
|
||||||
DATA=${MOL}_${BASIS}_${XF}_${CF}_${w2}.dat
|
DATA=${MOL}_${BASIS}_${XF}_${CF}_${w2}.dat
|
||||||
@ -65,6 +78,15 @@ do
|
|||||||
echo " 1" >> input/dft
|
echo " 1" >> input/dft
|
||||||
echo "# Number of states in ensemble (nEns)" >> input/dft
|
echo "# Number of states in ensemble (nEns)" >> input/dft
|
||||||
echo " 3" >> input/dft
|
echo " 3" >> input/dft
|
||||||
|
echo "# occupation numbers of orbitals nO and nO+1" >> input/dft
|
||||||
|
echo " 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 " >> input/dft
|
||||||
|
echo " 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 " >> input/dft
|
||||||
|
echo " " >> input/dft
|
||||||
|
echo " 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 " >> input/dft
|
||||||
|
echo " 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 " >> input/dft
|
||||||
|
echo " " >> input/dft
|
||||||
|
echo " 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 " >> input/dft
|
||||||
|
echo " 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 " >> input/dft
|
||||||
echo "# Ensemble weights: wEns(1),...,wEns(nEns-1)" >> input/dft
|
echo "# Ensemble weights: wEns(1),...,wEns(nEns-1)" >> input/dft
|
||||||
echo " ${w1} ${w2} " >> input/dft
|
echo " ${w1} ${w2} " >> input/dft
|
||||||
echo "# Ncentered ? 0 for NO " >> input/dft
|
echo "# Ncentered ? 0 for NO " >> input/dft
|
||||||
@ -74,13 +96,6 @@ do
|
|||||||
echo ${aw2} >> input/dft
|
echo ${aw2} >> input/dft
|
||||||
echo "# choice of UCC exchange coefficient : 1 for Cx1, 2 for Cx2, 3 for Cx1*Cx2" >> input/dft
|
echo "# choice of UCC exchange coefficient : 1 for Cx1, 2 for Cx2, 3 for Cx1*Cx2" >> input/dft
|
||||||
echo "2" >> input/dft
|
echo "2" >> input/dft
|
||||||
echo "# occupation numbers of orbitals nO and nO+1" >> input/dft
|
|
||||||
echo " 1.00 0.00 " >> input/dft
|
|
||||||
echo " 0.00 0.00 " >> input/dft
|
|
||||||
echo " 0.00 0.00 " >> input/dft
|
|
||||||
echo " 0.00 0.00 " >> input/dft
|
|
||||||
echo " 1.00 0.00 " >> input/dft
|
|
||||||
echo " 0.00 1.00 " >> input/dft
|
|
||||||
echo "# GOK-DFT: maxSCF thresh DIIS n_diis guess_type ortho_type" >> input/dft
|
echo "# GOK-DFT: maxSCF thresh DIIS n_diis guess_type ortho_type" >> input/dft
|
||||||
echo " 1000 0.00001 T 5 1 1" >> input/dft
|
echo " 1000 0.00001 T 5 1 1" >> input/dft
|
||||||
OUTPUT=${MOL}_${BASIS}_${XF}_${CF}_${w2}.out
|
OUTPUT=${MOL}_${BASIS}_${XF}_${CF}_${w2}.out
|
||||||
@ -93,7 +108,12 @@ do
|
|||||||
EA=`grep "Electronic Affinity" ${OUTPUT} | grep " au" | tail -1 | cut -d":" -f 2 | sed 's/au//'`
|
EA=`grep "Electronic Affinity" ${OUTPUT} | grep " au" | tail -1 | cut -d":" -f 2 | sed 's/au//'`
|
||||||
FG=`grep "Fundamental Gap" ${OUTPUT} | grep " au" | tail -1 | cut -d":" -f 2 | sed 's/au//'`
|
FG=`grep "Fundamental Gap" ${OUTPUT} | grep " au" | tail -1 | cut -d":" -f 2 | sed 's/au//'`
|
||||||
Ex=`grep "Exchange energy:" ${OUTPUT} | cut -d":" -f 2 | sed 's/au//'`
|
Ex=`grep "Exchange energy:" ${OUTPUT} | cut -d":" -f 2 | sed 's/au//'`
|
||||||
echo $w1 $w2 $Ew $E0 $E1 $E2 $IP $EA $FG $Ex
|
HOMOa=`grep "HOMO a energy:" ${OUTPUT} | cut -d":" -f 2 | sed 's/eV//'`
|
||||||
echo $w1 $w2 $Ew $E0 $E1 $E2 $IP $EA $FG $Ex >> ${DATA}
|
LUMOa=`grep "LUMO a energy:" ${OUTPUT} | cut -d":" -f 2 | sed 's/eV//'`
|
||||||
|
HOMOb=`grep "HOMO a energy:" ${OUTPUT} | cut -d":" -f 2 | sed 's/eV//'`
|
||||||
|
LUMOb=`grep "LUMO b energy:" ${OUTPUT} | cut -d":" -f 2 | sed 's/eV//'`
|
||||||
|
|
||||||
|
echo $w1 $w2 $Ew $E0 $E1 $E2 $IP $EA $FG $Ex $HOMOa $LUMOa $HOMOb $LUMOb
|
||||||
|
echo $w1 $w2 $Ew $E0 $E1 $E2 $IP $EA $FG $Ex $HOMOa $LUMOa $HOMOb $LUMOb >> ${DATA}
|
||||||
done
|
done
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
subroutine UCC_lda_exchange_derivative_discontinuity(nEns,wEns,aCC_w1,aCC_w2,nGrid,weight,rhow,ExDD,Cx_choice)
|
subroutine UCC_lda_exchange_derivative_discontinuity(nEns,wEns,aCC_w1,aCC_w2,nGrid,weight,rhow,Cx_choice,doNcentered,ExDD)
|
||||||
|
|
||||||
! Compute the unrestricted version of the curvature-corrected exchange ensemble derivative
|
! Compute the unrestricted version of the curvature-corrected exchange ensemble derivative
|
||||||
|
|
||||||
@ -15,6 +15,8 @@ subroutine UCC_lda_exchange_derivative_discontinuity(nEns,wEns,aCC_w1,aCC_w2,nGr
|
|||||||
double precision,intent(in) :: weight(nGrid)
|
double precision,intent(in) :: weight(nGrid)
|
||||||
double precision,intent(in) :: rhow(nGrid)
|
double precision,intent(in) :: rhow(nGrid)
|
||||||
integer,intent(in) :: Cx_choice
|
integer,intent(in) :: Cx_choice
|
||||||
|
integer,intent(in) :: doNcentered
|
||||||
|
|
||||||
|
|
||||||
! Local variables
|
! Local variables
|
||||||
|
|
||||||
@ -28,52 +30,40 @@ subroutine UCC_lda_exchange_derivative_discontinuity(nEns,wEns,aCC_w1,aCC_w2,nGr
|
|||||||
double precision :: a2,b2,c2,w2
|
double precision :: a2,b2,c2,w2
|
||||||
double precision :: dCxdw1,dCxdw2
|
double precision :: dCxdw1,dCxdw2
|
||||||
|
|
||||||
|
double precision :: nEli,nElw
|
||||||
|
|
||||||
|
|
||||||
! Output variables
|
! Output variables
|
||||||
|
|
||||||
double precision,intent(out) :: ExDD(nEns)
|
double precision,intent(out) :: ExDD(nEns)
|
||||||
|
|
||||||
|
! External variable
|
||||||
|
|
||||||
|
double precision,external :: electron_number
|
||||||
|
|
||||||
|
|
||||||
! Memory allocation
|
! Memory allocation
|
||||||
|
|
||||||
allocate(dExdw(nEns))
|
allocate(dExdw(nEns))
|
||||||
|
|
||||||
! Single excitation parameters
|
|
||||||
|
|
||||||
! a1 = 0.0d0
|
! Parameters for N -> N-1
|
||||||
! b1 = 0.0d0
|
|
||||||
! c1 = 0.0d0
|
|
||||||
|
|
||||||
! Parameters for H2 at equilibrium
|
|
||||||
|
|
||||||
! a2 = +0.5751782560799208d0
|
|
||||||
! b2 = -0.021108186591137282d0
|
|
||||||
! c2 = -0.36718902716347124d0
|
|
||||||
|
|
||||||
! Parameters for stretch H2
|
|
||||||
|
|
||||||
! a2 = + 0.01922622507087411d0
|
|
||||||
! b2 = - 0.01799647558018601d0
|
|
||||||
! c2 = - 0.022945430666782573d0
|
|
||||||
|
|
||||||
! Parameters for He
|
|
||||||
|
|
||||||
! a2 = 1.9125735895875828d0
|
|
||||||
! b2 = 2.715266992840757d0
|
|
||||||
! c2 = 2.1634223380633086d0
|
|
||||||
|
|
||||||
! Parameters for He N -> N-1
|
|
||||||
|
|
||||||
a1 = aCC_w1(1)
|
a1 = aCC_w1(1)
|
||||||
b1 = aCC_w1(2)
|
b1 = aCC_w1(2)
|
||||||
c1 = aCC_w1(3)
|
c1 = aCC_w1(3)
|
||||||
|
|
||||||
|
|
||||||
! Parameters for He N -> N+1
|
! Parameters for N -> N+1
|
||||||
|
|
||||||
a2 = aCC_w2(1)
|
a2 = aCC_w2(1)
|
||||||
b2 = aCC_w2(2)
|
b2 = aCC_w2(2)
|
||||||
c2 = aCC_w2(3)
|
c2 = aCC_w2(3)
|
||||||
|
|
||||||
|
|
||||||
|
nElw = electron_number(nGrid,weight,rhow)
|
||||||
|
|
||||||
|
|
||||||
! Cx coefficient for unrestricted Slater LDA exchange
|
! Cx coefficient for unrestricted Slater LDA exchange
|
||||||
|
|
||||||
alpha = -(3d0/2d0)*(3d0/(4d0*pi))**(1d0/3d0)
|
alpha = -(3d0/2d0)*(3d0/(4d0*pi))**(1d0/3d0)
|
||||||
@ -96,23 +86,6 @@ subroutine UCC_lda_exchange_derivative_discontinuity(nEns,wEns,aCC_w1,aCC_w2,nGr
|
|||||||
* (0.5d0*b2 + (2d0*a2 + 0.5d0*c2)*(w2 - 0.5d0) - (1d0 - w2)*w2*(3d0*b2 + 4d0*c2*(w2 - 0.5d0)))
|
* (0.5d0*b2 + (2d0*a2 + 0.5d0*c2)*(w2 - 0.5d0) - (1d0 - w2)*w2*(3d0*b2 + 4d0*c2*(w2 - 0.5d0)))
|
||||||
end select
|
end select
|
||||||
|
|
||||||
! Double weight-dependency
|
|
||||||
|
|
||||||
! dCxdw1 = (0.5d0*b1 + (2d0*a1 + 0.5d0*c1)*(w1 - 0.5d0) - (1d0 - w1)*w1*(3d0*b1 + 4d0*c1*(w1 - 0.5d0))) &
|
|
||||||
! * (1d0 - w2*(1d0 - w2)*(a2 + b2*(w2 - 0.5d0) + c2*(w2 - 0.5d0)**2))
|
|
||||||
|
|
||||||
! dCxdw2 = (1d0 - w1*(1d0 - w1)*(a1 + b1*(w1 - 0.5d0) + c1*(w1 - 0.5d0)**2)) &
|
|
||||||
! * (0.5d0*b2 + (2d0*a2 + 0.5d0*c2)*(w2 - 0.5d0) - (1d0 - w2)*w2*(3d0*b2 + 4d0*c2*(w2 - 0.5d0)))
|
|
||||||
|
|
||||||
! left single-weight-dependency
|
|
||||||
! dCxdw1 = (0.5d0*b1 + (2d0*a1 + 0.5d0*c1)*(w1 - 0.5d0) - (1d0 - w1)*w1*(3d0*b1 + 4d0*c1*(w1 - 0.5d0)))
|
|
||||||
! dCxdw2 = 0.d0
|
|
||||||
|
|
||||||
! right single-weight-dependency
|
|
||||||
! dCxdw1 = 0.d0
|
|
||||||
! dCxdw2 =(0.5d0*b2 + (2d0*a2 + 0.5d0*c2)*(w2 - 0.5d0) - (1d0 - w2)*w2*(3d0*b2 + 4d0*c2*(w2 - 0.5d0)))
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
dCxdw1 = alpha*dCxdw1
|
dCxdw1 = alpha*dCxdw1
|
||||||
dCxdw2 = alpha*dCxdw2
|
dCxdw2 = alpha*dCxdw2
|
||||||
@ -143,4 +116,9 @@ subroutine UCC_lda_exchange_derivative_discontinuity(nEns,wEns,aCC_w1,aCC_w2,nGr
|
|||||||
end do
|
end do
|
||||||
end do
|
end do
|
||||||
|
|
||||||
|
if (doNcentered .NE. 0) then
|
||||||
|
ExDD(2) = ((nElw-1)/nElw)*ExDD(2)
|
||||||
|
ExDD(3) = ((nElw+1)/nElw)*ExDD(3)
|
||||||
|
end if
|
||||||
|
|
||||||
end subroutine UCC_lda_exchange_derivative_discontinuity
|
end subroutine UCC_lda_exchange_derivative_discontinuity
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
subroutine UCC_lda_exchange_individual_energy(nEns,wEns,aCC_w1,aCC_w2,nGrid,weight,rhow,rho,Ex,Cx_choice)
|
subroutine UCC_lda_exchange_individual_energy(nEns,wEns,aCC_w1,aCC_w2,nGrid,weight,rhow,rho,Cx_choice,doNcentered,Ex)
|
||||||
|
|
||||||
! Compute the unrestricted version of the curvature-corrected exchange functional
|
! Compute the unrestricted version of the curvature-corrected exchange functional
|
||||||
|
|
||||||
@ -16,12 +16,14 @@ subroutine UCC_lda_exchange_individual_energy(nEns,wEns,aCC_w1,aCC_w2,nGrid,weig
|
|||||||
double precision,intent(in) :: rhow(nGrid)
|
double precision,intent(in) :: rhow(nGrid)
|
||||||
double precision,intent(in) :: rho(nGrid)
|
double precision,intent(in) :: rho(nGrid)
|
||||||
integer,intent(in) :: Cx_choice
|
integer,intent(in) :: Cx_choice
|
||||||
|
integer,intent(in) :: doNcentered
|
||||||
|
|
||||||
! Local variables
|
! Local variables
|
||||||
|
|
||||||
integer :: iG
|
integer :: iG
|
||||||
double precision :: r,rI,alpha
|
double precision :: r,rI,alpha
|
||||||
double precision :: e_p,dedr
|
double precision :: e_p,dedr
|
||||||
|
double precision :: nEli,nElw
|
||||||
|
|
||||||
double precision :: a1,b1,c1,w1
|
double precision :: a1,b1,c1,w1
|
||||||
double precision :: a2,b2,c2,w2
|
double precision :: a2,b2,c2,w2
|
||||||
@ -31,37 +33,18 @@ subroutine UCC_lda_exchange_individual_energy(nEns,wEns,aCC_w1,aCC_w2,nGrid,weig
|
|||||||
|
|
||||||
double precision,intent(out) :: Ex
|
double precision,intent(out) :: Ex
|
||||||
|
|
||||||
! Single excitation parameter
|
! External variable
|
||||||
|
|
||||||
! a1 = 0.0d0
|
double precision,external :: electron_number
|
||||||
! b1 = 0.0d0
|
|
||||||
! c1 = 0.0d0
|
|
||||||
|
|
||||||
! Parameters for H2 at equilibrium
|
|
||||||
|
|
||||||
! a2 = +0.5751782560799208d0
|
! Parameters for N -> N-1
|
||||||
! b2 = -0.021108186591137282d0
|
|
||||||
! c2 = -0.36718902716347124d0
|
|
||||||
|
|
||||||
! Parameters for stretch H2
|
|
||||||
|
|
||||||
! a2 = + 0.01922622507087411d0
|
|
||||||
! b2 = - 0.01799647558018601d0
|
|
||||||
! c2 = - 0.022945430666782573d0
|
|
||||||
|
|
||||||
! Parameters for He
|
|
||||||
|
|
||||||
! a2 = 1.9125735895875828d0
|
|
||||||
! b2 = 2.715266992840757d0
|
|
||||||
! c2 = 2.1634223380633086d0
|
|
||||||
|
|
||||||
! Parameters for He N -> N-1
|
|
||||||
|
|
||||||
a1 = aCC_w1(1)
|
a1 = aCC_w1(1)
|
||||||
b1 = aCC_w1(2)
|
b1 = aCC_w1(2)
|
||||||
c1 = aCC_w1(3)
|
c1 = aCC_w1(3)
|
||||||
|
|
||||||
! Parameters for He N -> N+1
|
! Parameters for N -> N+1
|
||||||
|
|
||||||
a2 = aCC_w2(1)
|
a2 = aCC_w2(1)
|
||||||
b2 = aCC_w2(2)
|
b2 = aCC_w2(2)
|
||||||
@ -86,14 +69,10 @@ subroutine UCC_lda_exchange_individual_energy(nEns,wEns,aCC_w1,aCC_w2,nGrid,weig
|
|||||||
Cx = alpha*Fx2*Fx1
|
Cx = alpha*Fx2*Fx1
|
||||||
end select
|
end select
|
||||||
|
|
||||||
! for two-weight ensembles
|
nEli = electron_number(nGrid,weight,rho)
|
||||||
! Cx = alpha*Fx1*Fx2
|
|
||||||
|
|
||||||
! for left ensembles
|
nElw = electron_number(nGrid,weight,rhow)
|
||||||
! Cx = alpha*Fx1
|
|
||||||
|
|
||||||
! for right ensembles
|
|
||||||
! Cx = alpha*Fx2
|
|
||||||
|
|
||||||
! Compute LDA exchange matrix in the AO basis
|
! Compute LDA exchange matrix in the AO basis
|
||||||
|
|
||||||
@ -108,12 +87,19 @@ subroutine UCC_lda_exchange_individual_energy(nEns,wEns,aCC_w1,aCC_w2,nGrid,weig
|
|||||||
e_p = Cx*r**(1d0/3d0)
|
e_p = Cx*r**(1d0/3d0)
|
||||||
dedr = 1d0/3d0*Cx*r**(-2d0/3d0)
|
dedr = 1d0/3d0*Cx*r**(-2d0/3d0)
|
||||||
|
|
||||||
Ex = Ex - weight(iG)*dedr*r*r
|
if (doNcentered == 0) then
|
||||||
|
Ex = Ex - weight(iG)*dedr*r*r
|
||||||
|
else
|
||||||
|
Ex = Ex - weight(iG)*dedr*r*r*(nEli/nElw)
|
||||||
|
end if
|
||||||
|
|
||||||
if(rI > threshold) then
|
if(rI > threshold) then
|
||||||
|
|
||||||
Ex = Ex + weight(iG)*(e_p*rI + dedr*r*rI)
|
if (doNcentered == 0) then
|
||||||
|
Ex = Ex + weight(iG)*(e_p*rI + dedr*r*rI)
|
||||||
|
else
|
||||||
|
Ex = Ex + weight(iG)*((nEli/nElw)*e_p*rI + dedr*r*rI)
|
||||||
|
end if
|
||||||
endif
|
endif
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
subroutine US51_lda_exchange_individual_energy(nGrid,weight,rhow,rho,Ex)
|
subroutine US51_lda_exchange_individual_energy(nGrid,weight,rhow,rho,doNcentered,Ex)
|
||||||
|
|
||||||
! Compute the restricted version of Slater's LDA exchange individual energy
|
! Compute the restricted version of Slater's LDA exchange individual energy
|
||||||
|
|
||||||
@ -11,17 +11,29 @@ subroutine US51_lda_exchange_individual_energy(nGrid,weight,rhow,rho,Ex)
|
|||||||
double precision,intent(in) :: weight(nGrid)
|
double precision,intent(in) :: weight(nGrid)
|
||||||
double precision,intent(in) :: rhow(nGrid)
|
double precision,intent(in) :: rhow(nGrid)
|
||||||
double precision,intent(in) :: rho(nGrid)
|
double precision,intent(in) :: rho(nGrid)
|
||||||
|
integer,intent(in) :: doNcentered
|
||||||
|
|
||||||
|
|
||||||
! Local variables
|
! Local variables
|
||||||
|
|
||||||
integer :: iG
|
integer :: iG
|
||||||
double precision :: r,rI,alpha
|
double precision :: r,rI,alpha
|
||||||
double precision :: e,dedr
|
double precision :: e,dedr
|
||||||
|
double precision :: nEli,nElw
|
||||||
|
|
||||||
! Output variables
|
! Output variables
|
||||||
|
|
||||||
double precision,intent(out) :: Ex
|
double precision,intent(out) :: Ex
|
||||||
|
|
||||||
|
! External variable
|
||||||
|
|
||||||
|
double precision,external :: electron_number
|
||||||
|
|
||||||
|
nEli = electron_number(nGrid,weight,rho)
|
||||||
|
|
||||||
|
nElw = electron_number(nGrid,weight,rhow)
|
||||||
|
|
||||||
|
|
||||||
! Compute LDA exchange matrix in the AO basis
|
! Compute LDA exchange matrix in the AO basis
|
||||||
|
|
||||||
alpha = -(3d0/2d0)*(3d0/(4d0*pi))**(1d0/3d0)
|
alpha = -(3d0/2d0)*(3d0/(4d0*pi))**(1d0/3d0)
|
||||||
@ -37,11 +49,19 @@ subroutine US51_lda_exchange_individual_energy(nGrid,weight,rhow,rho,Ex)
|
|||||||
e = alpha*r**(1d0/3d0)
|
e = alpha*r**(1d0/3d0)
|
||||||
dedr = 1d0/3d0*alpha*r**(-2d0/3d0)
|
dedr = 1d0/3d0*alpha*r**(-2d0/3d0)
|
||||||
|
|
||||||
Ex = Ex - weight(iG)*dedr*r*r
|
if (doNcentered == 0) then
|
||||||
|
Ex = Ex - weight(iG)*dedr*r*r
|
||||||
|
else
|
||||||
|
Ex = Ex - weight(iG)*dedr*r*r*(nEli/nElw)
|
||||||
|
end if
|
||||||
|
|
||||||
if(rI > threshold) then
|
if(rI > threshold) then
|
||||||
|
|
||||||
Ex = Ex + weight(iG)*(e*rI + dedr*r*rI)
|
if (doNcentered == 0) then
|
||||||
|
Ex = Ex + weight(iG)*(e*rI + dedr*r*rI)
|
||||||
|
else
|
||||||
|
Ex = Ex + weight(iG)*((nEli/nElw)*e*rI + dedr*r*rI)
|
||||||
|
end if
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
@ -187,7 +187,7 @@ program eDFT
|
|||||||
call cpu_time(start_KS)
|
call cpu_time(start_KS)
|
||||||
call LIM_RKS(x_rung,x_DFA,c_rung,c_DFA,LDA_centered,nEns,nGrid,weight(:), &
|
call LIM_RKS(x_rung,x_DFA,c_rung,c_DFA,LDA_centered,nEns,nGrid,weight(:), &
|
||||||
aCC_w1,aCC_w2,maxSCF,thresh,max_diis,guess_type,nBas,AO(:,:),dAO(:,:,:),nO(1),nV(1), &
|
aCC_w1,aCC_w2,maxSCF,thresh,max_diis,guess_type,nBas,AO(:,:),dAO(:,:,:),nO(1),nV(1), &
|
||||||
S(:,:),T(:,:),V(:,:),Hc(:,:),ERI(:,:,:,:),X(:,:),ENuc,c(:,:),occnum,Cx_choice)
|
S(:,:),T(:,:),V(:,:),Hc(:,:),ERI(:,:,:,:),X(:,:),ENuc,c(:,:),occnum,Cx_choice,doNcentered)
|
||||||
call cpu_time(end_KS)
|
call cpu_time(end_KS)
|
||||||
|
|
||||||
t_KS = end_KS - start_KS
|
t_KS = end_KS - start_KS
|
||||||
@ -205,7 +205,7 @@ program eDFT
|
|||||||
call cpu_time(start_KS)
|
call cpu_time(start_KS)
|
||||||
call MOM_RKS(x_rung,x_DFA,c_rung,c_DFA,LDA_centered,nEns,nGrid,weight(:), &
|
call MOM_RKS(x_rung,x_DFA,c_rung,c_DFA,LDA_centered,nEns,nGrid,weight(:), &
|
||||||
aCC_w1,aCC_w2,maxSCF,thresh,max_diis,guess_type,nBas,AO(:,:),dAO(:,:,:),nO(1),nV(1), &
|
aCC_w1,aCC_w2,maxSCF,thresh,max_diis,guess_type,nBas,AO(:,:),dAO(:,:,:),nO(1),nV(1), &
|
||||||
S(:,:),T(:,:),V(:,:),Hc(:,:),ERI(:,:,:,:),X(:,:),ENuc,c(:,:),occnum,Cx_choice)
|
S(:,:),T(:,:),V(:,:),Hc(:,:),ERI(:,:,:,:),X(:,:),ENuc,c(:,:),occnum,Cx_choice,doNcentered)
|
||||||
call cpu_time(end_KS)
|
call cpu_time(end_KS)
|
||||||
|
|
||||||
t_KS = end_KS - start_KS
|
t_KS = end_KS - start_KS
|
||||||
@ -222,7 +222,8 @@ program eDFT
|
|||||||
|
|
||||||
call cpu_time(start_KS)
|
call cpu_time(start_KS)
|
||||||
call GOK_UKS(x_rung,x_DFA,c_rung,c_DFA,nEns,wEns(:),nGrid,weight(:),aCC_w1,aCC_w2,maxSCF,thresh,max_diis,guess_type, &
|
call GOK_UKS(x_rung,x_DFA,c_rung,c_DFA,nEns,wEns(:),nGrid,weight(:),aCC_w1,aCC_w2,maxSCF,thresh,max_diis,guess_type, &
|
||||||
nBas,AO(:,:),dAO(:,:,:),nO(:),nV(:),S(:,:),T(:,:),V(:,:),Hc(:,:),ERI(:,:,:,:),X(:,:),ENuc,Ew,occnum,Cx_choice)
|
nBas,AO(:,:),dAO(:,:,:),nO(:),nV(:),S(:,:),T(:,:),V(:,:),Hc(:,:),ERI(:,:,:,:),X(:,:),ENuc,Ew,occnum, &
|
||||||
|
Cx_choice,doNcentered)
|
||||||
call cpu_time(end_KS)
|
call cpu_time(end_KS)
|
||||||
|
|
||||||
t_KS = end_KS - start_KS
|
t_KS = end_KS - start_KS
|
||||||
@ -239,7 +240,7 @@ program eDFT
|
|||||||
|
|
||||||
call cpu_time(start_KS)
|
call cpu_time(start_KS)
|
||||||
call eDFT_UKS(x_rung,x_DFA,c_rung,c_DFA,nEns,wEns,aCC_w1,aCC_w2,nGrid,weight(:),maxSCF,thresh,max_diis,guess_type, &
|
call eDFT_UKS(x_rung,x_DFA,c_rung,c_DFA,nEns,wEns,aCC_w1,aCC_w2,nGrid,weight(:),maxSCF,thresh,max_diis,guess_type, &
|
||||||
nBas,AO,dAO,S,T,V,Hc,ERI,X,ENuc,Ew,occnum,Cx_choice)
|
nBas,AO,dAO,S,T,V,Hc,ERI,X,ENuc,Ew,occnum,Cx_choice,doNcentered)
|
||||||
call cpu_time(end_KS)
|
call cpu_time(end_KS)
|
||||||
|
|
||||||
t_KS = end_KS - start_KS
|
t_KS = end_KS - start_KS
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
subroutine eDFT_UKS(x_rung,x_DFA,c_rung,c_DFA,nEns,wEns,aCC_w1,aCC_w2,nGrid,weight,maxSCF,thresh,max_diis,guess_type, &
|
subroutine eDFT_UKS(x_rung,x_DFA,c_rung,c_DFA,nEns,wEns,aCC_w1,aCC_w2,nGrid,weight,maxSCF,thresh,max_diis,guess_type, &
|
||||||
nBas,AO,dAO,S,T,V,Hc,ERI,X,ENuc,Ew,occnum,Cx_choice)
|
nBas,AO,dAO,S,T,V,Hc,ERI,X,ENuc,Ew,occnum,Cx_choice,doNcentered)
|
||||||
|
|
||||||
! Perform unrestricted Kohn-Sham calculation for ensembles
|
! Perform unrestricted Kohn-Sham calculation for ensembles
|
||||||
|
|
||||||
@ -31,6 +31,7 @@ subroutine eDFT_UKS(x_rung,x_DFA,c_rung,c_DFA,nEns,wEns,aCC_w1,aCC_w2,nGrid,weig
|
|||||||
double precision,intent(in) :: ENuc
|
double precision,intent(in) :: ENuc
|
||||||
double precision,intent(in) :: occnum(nBas,nspin,nEns)
|
double precision,intent(in) :: occnum(nBas,nspin,nEns)
|
||||||
integer,intent(in) :: Cx_choice
|
integer,intent(in) :: Cx_choice
|
||||||
|
integer,intent(in) :: doNcentered
|
||||||
|
|
||||||
! Local variables
|
! Local variables
|
||||||
|
|
||||||
@ -380,6 +381,7 @@ subroutine eDFT_UKS(x_rung,x_DFA,c_rung,c_DFA,nEns,wEns,aCC_w1,aCC_w2,nGrid,weig
|
|||||||
!------------------------------------------------------------------------
|
!------------------------------------------------------------------------
|
||||||
|
|
||||||
call unrestricted_individual_energy(x_rung,x_DFA,c_rung,c_DFA,LDA_centered,nEns,wEns,aCC_w1,aCC_w2,nGrid,weight,nBas, &
|
call unrestricted_individual_energy(x_rung,x_DFA,c_rung,c_DFA,LDA_centered,nEns,wEns,aCC_w1,aCC_w2,nGrid,weight,nBas, &
|
||||||
AO,dAO,T,V,ERI,ENuc,eps,Pw,rhow,drhow,J,Fx,FxHF,Fc,P,rho,drho,Ew,E,Om,occnum,Cx_choice)
|
AO,dAO,T,V,ERI,ENuc,eps,Pw,rhow,drhow,J,Fx,FxHF,Fc,P,rho,drho,Ew,E,Om,occnum, &
|
||||||
|
Cx_choice,doNcentered)
|
||||||
|
|
||||||
end subroutine eDFT_UKS
|
end subroutine eDFT_UKS
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
subroutine unrestricted_auxiliary_energy(nBas,nEns,eps,Eaux,occnum)
|
subroutine unrestricted_auxiliary_energy(nBas,nEns,eps,occnum,doNcentered,Eaux)
|
||||||
|
|
||||||
! Compute the auxiliary KS energies
|
! Compute the auxiliary KS energies
|
||||||
|
|
||||||
@ -12,18 +12,28 @@ subroutine unrestricted_auxiliary_energy(nBas,nEns,eps,Eaux,occnum)
|
|||||||
integer,intent(in) :: nEns
|
integer,intent(in) :: nEns
|
||||||
double precision,intent(in) :: eps(nBas,nspin)
|
double precision,intent(in) :: eps(nBas,nspin)
|
||||||
double precision,intent(in) :: occnum(nBas,nspin,nEns)
|
double precision,intent(in) :: occnum(nBas,nspin,nEns)
|
||||||
|
integer,intent(in) :: doNcentered
|
||||||
|
|
||||||
! Local variables
|
! Local variables
|
||||||
|
|
||||||
integer :: iEns
|
integer :: iEns,iBas
|
||||||
integer :: ispin
|
integer :: ispin
|
||||||
integer :: p
|
integer :: p
|
||||||
|
double precision,allocatable :: nEl(:)
|
||||||
|
|
||||||
|
|
||||||
! Output variables
|
! Output variables
|
||||||
|
|
||||||
double precision,intent(out) :: Eaux(nspin,nEns)
|
double precision,intent(out) :: Eaux(nspin,nEns)
|
||||||
|
|
||||||
|
allocate(nEl(nEns))
|
||||||
|
nEl(:) = 0d0
|
||||||
|
do iEns=1,nEns
|
||||||
|
do iBas=1,nBas
|
||||||
|
nEl(iEns) = nEl(iEns) + occnum(iBas,1,iEns) + occnum(iBas,2,iEns)
|
||||||
|
end do
|
||||||
|
end do
|
||||||
|
|
||||||
! Compute auxiliary energies for each state of the ensemble based on occupation numbers
|
! Compute auxiliary energies for each state of the ensemble based on occupation numbers
|
||||||
|
|
||||||
Eaux(:,:) = 0d0
|
Eaux(:,:) = 0d0
|
||||||
@ -35,6 +45,11 @@ subroutine unrestricted_auxiliary_energy(nBas,nEns,eps,Eaux,occnum)
|
|||||||
|
|
||||||
end do
|
end do
|
||||||
end do
|
end do
|
||||||
|
|
||||||
|
! if (doNcentered .NE. 0) then
|
||||||
|
! Eaux(:,iEns) = Eaux(:,iEns)*(nEl(iEns)/nEl(1))
|
||||||
|
! end if
|
||||||
|
|
||||||
end do
|
end do
|
||||||
|
|
||||||
end subroutine unrestricted_auxiliary_energy
|
end subroutine unrestricted_auxiliary_energy
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
subroutine unrestricted_exchange_derivative_discontinuity(rung,DFA,nEns,wEns,aCC_w1,aCC_w2,nGrid,weight,rhow,drhow,ExDD,Cx_choice)
|
subroutine unrestricted_exchange_derivative_discontinuity(rung,DFA,nEns,wEns,aCC_w1,aCC_w2,nGrid,weight,rhow,drhow,&
|
||||||
|
Cx_choice,doNcentered,ExDD)
|
||||||
|
|
||||||
! Compute the exchange part of the derivative discontinuity
|
! Compute the exchange part of the derivative discontinuity
|
||||||
|
|
||||||
@ -18,6 +19,7 @@ subroutine unrestricted_exchange_derivative_discontinuity(rung,DFA,nEns,wEns,aCC
|
|||||||
double precision,intent(in) :: rhow(nGrid)
|
double precision,intent(in) :: rhow(nGrid)
|
||||||
double precision,intent(in) :: drhow(ncart,nGrid)
|
double precision,intent(in) :: drhow(ncart,nGrid)
|
||||||
integer,intent(in) :: Cx_choice
|
integer,intent(in) :: Cx_choice
|
||||||
|
integer,intent(in) :: doNcentered
|
||||||
|
|
||||||
! Local variables
|
! Local variables
|
||||||
|
|
||||||
@ -39,7 +41,7 @@ subroutine unrestricted_exchange_derivative_discontinuity(rung,DFA,nEns,wEns,aCC
|
|||||||
case(1)
|
case(1)
|
||||||
|
|
||||||
call unrestricted_lda_exchange_derivative_discontinuity(DFA,nEns,wEns(:),aCC_w1,aCC_w2,nGrid,weight(:),&
|
call unrestricted_lda_exchange_derivative_discontinuity(DFA,nEns,wEns(:),aCC_w1,aCC_w2,nGrid,weight(:),&
|
||||||
rhow(:),ExDD(:),Cx_choice)
|
rhow(:),Cx_choice,doNcentered,ExDD(:))
|
||||||
|
|
||||||
! GGA functionals
|
! GGA functionals
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
subroutine unrestricted_exchange_individual_energy(rung,DFA,LDA_centered,nEns,wEns,aCC_w1,aCC_w2,nGrid,weight,nBas, &
|
subroutine unrestricted_exchange_individual_energy(rung,DFA,LDA_centered,nEns,wEns,aCC_w1,aCC_w2,nGrid,weight,nBas, &
|
||||||
ERI,Pw,P,rhow,drhow,rho,drho,Ex,Cx_choice)
|
ERI,Pw,P,rhow,drhow,rho,drho,Cx_choice,doNcentered,Ex)
|
||||||
|
|
||||||
! Compute the exchange individual energy
|
! Compute the exchange individual energy
|
||||||
|
|
||||||
@ -26,6 +26,7 @@ subroutine unrestricted_exchange_individual_energy(rung,DFA,LDA_centered,nEns,wE
|
|||||||
double precision,intent(in) :: rho(nGrid)
|
double precision,intent(in) :: rho(nGrid)
|
||||||
double precision,intent(in) :: drho(ncart,nGrid)
|
double precision,intent(in) :: drho(ncart,nGrid)
|
||||||
integer,intent(in) :: Cx_choice
|
integer,intent(in) :: Cx_choice
|
||||||
|
integer,intent(in) :: doNcentered
|
||||||
|
|
||||||
! Local variables
|
! Local variables
|
||||||
|
|
||||||
@ -50,7 +51,7 @@ subroutine unrestricted_exchange_individual_energy(rung,DFA,LDA_centered,nEns,wE
|
|||||||
case(1)
|
case(1)
|
||||||
|
|
||||||
call unrestricted_lda_exchange_individual_energy(DFA,LDA_centered,nEns,wEns,aCC_w1,aCC_w2,nGrid,weight,&
|
call unrestricted_lda_exchange_individual_energy(DFA,LDA_centered,nEns,wEns,aCC_w1,aCC_w2,nGrid,weight,&
|
||||||
rhow,rho,ExLDA,Cx_choice)
|
rhow,rho,Cx_choice,doNcentered,ExLDA)
|
||||||
|
|
||||||
Ex = ExLDA
|
Ex = ExLDA
|
||||||
|
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
subroutine unrestricted_individual_energy(x_rung,x_DFA,c_rung,c_DFA,LDA_centered,nEns,wEns,aCC_w1,aCC_w2,nGrid,weight,nBas,AO,dAO, &
|
subroutine unrestricted_individual_energy(x_rung,x_DFA,c_rung,c_DFA,LDA_centered,nEns,wEns,aCC_w1,aCC_w2,nGrid,weight,nBas,AO,dAO, &
|
||||||
T,V,ERI,ENuc,eps,Pw,rhow,drhow,J,Fx,FxHF,Fc,P,rho,drho,Ew,E,Om,occnum,Cx_choice)
|
T,V,ERI,ENuc,eps,Pw,rhow,drhow,J,Fx,FxHF,Fc,P,rho,drho,Ew,E,Om,occnum,&
|
||||||
|
Cx_choice,doNcentered)
|
||||||
|
|
||||||
! Compute unrestricted individual energies as well as excitation energies
|
! Compute unrestricted individual energies as well as excitation energies
|
||||||
|
|
||||||
@ -42,6 +43,7 @@ subroutine unrestricted_individual_energy(x_rung,x_DFA,c_rung,c_DFA,LDA_centered
|
|||||||
double precision :: Ew
|
double precision :: Ew
|
||||||
double precision,intent(in) :: occnum(nBas,nspin,nEns)
|
double precision,intent(in) :: occnum(nBas,nspin,nEns)
|
||||||
integer,intent(in) :: Cx_choice
|
integer,intent(in) :: Cx_choice
|
||||||
|
integer,intent(in) :: doNcentered
|
||||||
|
|
||||||
|
|
||||||
! Local variables
|
! Local variables
|
||||||
@ -64,7 +66,9 @@ subroutine unrestricted_individual_energy(x_rung,x_DFA,c_rung,c_DFA,LDA_centered
|
|||||||
|
|
||||||
double precision,external :: trace_matrix
|
double precision,external :: trace_matrix
|
||||||
|
|
||||||
integer :: ispin,iEns
|
integer :: ispin,iEns,iBas
|
||||||
|
double precision,allocatable :: nEl(:)
|
||||||
|
|
||||||
|
|
||||||
double precision,external :: electron_number
|
double precision,external :: electron_number
|
||||||
|
|
||||||
@ -73,15 +77,31 @@ subroutine unrestricted_individual_energy(x_rung,x_DFA,c_rung,c_DFA,LDA_centered
|
|||||||
double precision,intent(out) :: E(nEns)
|
double precision,intent(out) :: E(nEns)
|
||||||
double precision,intent(out) :: Om(nEns)
|
double precision,intent(out) :: Om(nEns)
|
||||||
|
|
||||||
|
|
||||||
|
allocate(nEl(nEns))
|
||||||
|
nEl(:) = 0d0
|
||||||
|
do iEns=1,nEns
|
||||||
|
do iBas=1,nBas
|
||||||
|
nEl(iEns) = nEl(iEns) + occnum(iBas,1,iEns) + occnum(iBas,2,iEns)
|
||||||
|
end do
|
||||||
|
end do
|
||||||
|
|
||||||
|
print*,'test1'
|
||||||
|
|
||||||
!------------------------------------------------------------------------
|
!------------------------------------------------------------------------
|
||||||
! Kinetic energy
|
! Kinetic energy
|
||||||
!------------------------------------------------------------------------
|
!------------------------------------------------------------------------
|
||||||
|
|
||||||
do ispin=1,nspin
|
do ispin=1,nspin
|
||||||
do iEns=1,nEns
|
do iEns=1,nEns
|
||||||
ET(ispin,iEns) = trace_matrix(nBas,matmul(P(:,:,ispin,iEns),T(:,:)))
|
if (doNcentered == 0) then
|
||||||
|
ET(ispin,iEns) = trace_matrix(nBas,matmul(P(:,:,ispin,iEns),T(:,:)))
|
||||||
|
else
|
||||||
|
ET(ispin,iEns) = (nEl(iEns)/nEl(1))*trace_matrix(nBas,matmul(P(:,:,ispin,iEns),T(:,:)))
|
||||||
|
end if
|
||||||
end do
|
end do
|
||||||
end do
|
end do
|
||||||
|
print*,'test2'
|
||||||
|
|
||||||
!------------------------------------------------------------------------
|
!------------------------------------------------------------------------
|
||||||
! Potential energy
|
! Potential energy
|
||||||
@ -89,10 +109,15 @@ subroutine unrestricted_individual_energy(x_rung,x_DFA,c_rung,c_DFA,LDA_centered
|
|||||||
|
|
||||||
do iEns=1,nEns
|
do iEns=1,nEns
|
||||||
do ispin=1,nspin
|
do ispin=1,nspin
|
||||||
EV(ispin,iEns) = trace_matrix(nBas,matmul(P(:,:,ispin,iEns),V(:,:)))
|
if (doNcentered == 0) then
|
||||||
end do
|
EV(ispin,iEns) = trace_matrix(nBas,matmul(P(:,:,ispin,iEns),V(:,:)))
|
||||||
|
else
|
||||||
|
EV(ispin,iEns) = (nEl(iEns)/nEl(1))*trace_matrix(nBas,matmul(P(:,:,ispin,iEns),V(:,:)))
|
||||||
|
end if
|
||||||
|
end do
|
||||||
end do
|
end do
|
||||||
|
|
||||||
|
print*,'test3'
|
||||||
!------------------------------------------------------------------------
|
!------------------------------------------------------------------------
|
||||||
! Individual Hartree energy
|
! Individual Hartree energy
|
||||||
!------------------------------------------------------------------------
|
!------------------------------------------------------------------------
|
||||||
@ -113,9 +138,11 @@ subroutine unrestricted_individual_energy(x_rung,x_DFA,c_rung,c_DFA,LDA_centered
|
|||||||
|
|
||||||
EJ(3,iEns) = trace_matrix(nBas,matmul(P(:,:,2,iEns),J(:,:,2))) &
|
EJ(3,iEns) = trace_matrix(nBas,matmul(P(:,:,2,iEns),J(:,:,2))) &
|
||||||
- 0.5d0*trace_matrix(nBas,matmul(Pw(:,:,2),J(:,:,2)))
|
- 0.5d0*trace_matrix(nBas,matmul(Pw(:,:,2),J(:,:,2)))
|
||||||
|
if (doNcentered .NE. 0) then
|
||||||
|
EJ(:,iEns) = (nEl(iEns)/nEl(1))*EJ(:,iEns)
|
||||||
|
end if
|
||||||
end do
|
end do
|
||||||
|
print*,'test4'
|
||||||
!------------------------------------------------------------------------
|
!------------------------------------------------------------------------
|
||||||
! Checking Hartree contributions for each individual states
|
! Checking Hartree contributions for each individual states
|
||||||
!------------------------------------------------------------------------
|
!------------------------------------------------------------------------
|
||||||
@ -139,10 +166,12 @@ subroutine unrestricted_individual_energy(x_rung,x_DFA,c_rung,c_DFA,LDA_centered
|
|||||||
do ispin=1,nspin
|
do ispin=1,nspin
|
||||||
call unrestricted_exchange_individual_energy(x_rung,x_DFA,LDA_centered,nEns,wEns,aCC_w1,aCC_w2,nGrid,weight,nBas,ERI, &
|
call unrestricted_exchange_individual_energy(x_rung,x_DFA,LDA_centered,nEns,wEns,aCC_w1,aCC_w2,nGrid,weight,nBas,ERI, &
|
||||||
Pw(:,:,ispin),P(:,:,ispin,iEns),rhow(:,ispin),drhow(:,:,ispin), &
|
Pw(:,:,ispin),P(:,:,ispin,iEns),rhow(:,ispin),drhow(:,:,ispin), &
|
||||||
rho(:,ispin,iEns),drho(:,:,ispin,iEns),Ex(ispin,iEns),Cx_choice)
|
rho(:,ispin,iEns),drho(:,:,ispin,iEns),Cx_choice,doNcentered,Ex(ispin,iEns))
|
||||||
end do
|
end do
|
||||||
end do
|
end do
|
||||||
|
|
||||||
|
print*,'test5'
|
||||||
|
|
||||||
!------------------------------------------------------------------------
|
!------------------------------------------------------------------------
|
||||||
! Checking exchange contributions for each individual states
|
! Checking exchange contributions for each individual states
|
||||||
!------------------------------------------------------------------------
|
!------------------------------------------------------------------------
|
||||||
@ -184,7 +213,7 @@ subroutine unrestricted_individual_energy(x_rung,x_DFA,c_rung,c_DFA,LDA_centered
|
|||||||
! Compute auxiliary energies
|
! Compute auxiliary energies
|
||||||
!------------------------------------------------------------------------
|
!------------------------------------------------------------------------
|
||||||
|
|
||||||
call unrestricted_auxiliary_energy(nBas,nEns,eps,Eaux,occnum)
|
call unrestricted_auxiliary_energy(nBas,nEns,eps,occnum,doNcentered,Eaux)
|
||||||
|
|
||||||
!------------------------------------------------------------------------
|
!------------------------------------------------------------------------
|
||||||
! Compute derivative discontinuities
|
! Compute derivative discontinuities
|
||||||
@ -193,7 +222,7 @@ subroutine unrestricted_individual_energy(x_rung,x_DFA,c_rung,c_DFA,LDA_centered
|
|||||||
do ispin=1,nspin
|
do ispin=1,nspin
|
||||||
|
|
||||||
call unrestricted_exchange_derivative_discontinuity(x_rung,x_DFA,nEns,wEns,aCC_w1,aCC_w2,nGrid,weight, &
|
call unrestricted_exchange_derivative_discontinuity(x_rung,x_DFA,nEns,wEns,aCC_w1,aCC_w2,nGrid,weight, &
|
||||||
rhow(:,ispin),drhow(:,:,ispin),ExDD(ispin,:),Cx_choice)
|
rhow(:,ispin),drhow(:,:,ispin),Cx_choice,doNcentered,ExDD(ispin,:))
|
||||||
end do
|
end do
|
||||||
|
|
||||||
call unrestricted_correlation_derivative_discontinuity(c_rung,c_DFA,nEns,wEns,nGrid,weight,rhow,drhow,EcDD)
|
call unrestricted_correlation_derivative_discontinuity(c_rung,c_DFA,nEns,wEns,nGrid,weight,rhow,drhow,EcDD)
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
subroutine unrestricted_lda_exchange_derivative_discontinuity(DFA,nEns,wEns,aCC_w1,aCC_w2,nGrid,weight,rhow,ExDD,Cx_choice)
|
subroutine unrestricted_lda_exchange_derivative_discontinuity(DFA,nEns,wEns,aCC_w1,aCC_w2,nGrid,weight,rhow,&
|
||||||
|
Cx_choice,doNcentered,ExDD)
|
||||||
|
|
||||||
! Compute the exchange LDA part of the derivative discontinuity
|
! Compute the exchange LDA part of the derivative discontinuity
|
||||||
|
|
||||||
@ -17,6 +18,7 @@ subroutine unrestricted_lda_exchange_derivative_discontinuity(DFA,nEns,wEns,aCC_
|
|||||||
double precision,intent(in) :: weight(nGrid)
|
double precision,intent(in) :: weight(nGrid)
|
||||||
double precision,intent(in) :: rhow(nGrid)
|
double precision,intent(in) :: rhow(nGrid)
|
||||||
integer,intent(in) :: Cx_choice
|
integer,intent(in) :: Cx_choice
|
||||||
|
integer,intent(in) :: doNcentered
|
||||||
|
|
||||||
! Local variables
|
! Local variables
|
||||||
|
|
||||||
@ -25,7 +27,7 @@ subroutine unrestricted_lda_exchange_derivative_discontinuity(DFA,nEns,wEns,aCC_
|
|||||||
|
|
||||||
double precision,intent(out) :: ExDD(nEns)
|
double precision,intent(out) :: ExDD(nEns)
|
||||||
|
|
||||||
! Select correlation functional
|
! Select exchange functional
|
||||||
|
|
||||||
select case (DFA)
|
select case (DFA)
|
||||||
|
|
||||||
@ -35,7 +37,8 @@ subroutine unrestricted_lda_exchange_derivative_discontinuity(DFA,nEns,wEns,aCC_
|
|||||||
|
|
||||||
case ('CC')
|
case ('CC')
|
||||||
|
|
||||||
call UCC_lda_exchange_derivative_discontinuity(nEns,wEns,aCC_w1,aCC_w2,nGrid,weight(:),rhow(:),ExDD(:),Cx_choice)
|
call UCC_lda_exchange_derivative_discontinuity(nEns,wEns,aCC_w1,aCC_w2,nGrid,weight(:),rhow(:),&
|
||||||
|
Cx_choice,doNcentered,ExDD(:))
|
||||||
|
|
||||||
case default
|
case default
|
||||||
|
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
subroutine unrestricted_lda_exchange_individual_energy(DFA,LDA_centered,nEns,wEns,aCC_w1,aCC_w2,nGrid,weight,rhow,rho,Ex,Cx_choice)
|
subroutine unrestricted_lda_exchange_individual_energy(DFA,LDA_centered,nEns,wEns,aCC_w1,aCC_w2,nGrid,weight,rhow,rho,&
|
||||||
|
Cx_choice,doNcentered,Ex)
|
||||||
|
|
||||||
! Compute LDA exchange energy for individual states
|
! Compute LDA exchange energy for individual states
|
||||||
|
|
||||||
@ -18,6 +19,7 @@ subroutine unrestricted_lda_exchange_individual_energy(DFA,LDA_centered,nEns,wEn
|
|||||||
double precision,intent(in) :: rhow(nGrid)
|
double precision,intent(in) :: rhow(nGrid)
|
||||||
double precision,intent(in) :: rho(nGrid)
|
double precision,intent(in) :: rho(nGrid)
|
||||||
integer,intent(in) :: Cx_choice
|
integer,intent(in) :: Cx_choice
|
||||||
|
integer,intent(in) ::doNcentered
|
||||||
|
|
||||||
! Output variables
|
! Output variables
|
||||||
|
|
||||||
@ -29,11 +31,12 @@ subroutine unrestricted_lda_exchange_individual_energy(DFA,LDA_centered,nEns,wEn
|
|||||||
|
|
||||||
case ('S51')
|
case ('S51')
|
||||||
|
|
||||||
call US51_lda_exchange_individual_energy(nGrid,weight,rhow,rho,Ex)
|
call US51_lda_exchange_individual_energy(nGrid,weight,rhow,rho,doNcentered,Ex)
|
||||||
|
|
||||||
case ('CC')
|
case ('CC')
|
||||||
|
|
||||||
call UCC_lda_exchange_individual_energy(nEns,wEns,aCC_w1,aCC_w2,nGrid,weight,rhow,rho,Ex,Cx_choice)
|
call UCC_lda_exchange_individual_energy(nEns,wEns,aCC_w1,aCC_w2,nGrid,weight,rhow,rho,&
|
||||||
|
Cx_choice,doNcentered,Ex)
|
||||||
|
|
||||||
case default
|
case default
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user