15 integer,
parameter ::
dp = kind(1.0d0)
20 character(20) :: mixertype
44 type(
mx_type),
intent(inout) :: input
45 integer,
parameter :: nkey_char = 1, nkey_int = 2, nkey_re = 1, nkey_log = 1
46 character(len=*) :: filename
49 character(len=50),
parameter :: keyvector_char(nkey_char) = [character(len=100) :: &
51 character(len=100) :: valvector_char(nkey_char) = [character(len=100) :: &
54 character(len=50),
parameter :: keyvector_int(nkey_int) = [character(len=50) :: &
56 integer :: valvector_int(nkey_int) = (/ &
59 character(len=50),
parameter :: keyvector_re(nkey_re) = [character(len=50) :: &
61 real(
dp) :: valvector_re(nkey_re) = (/&
64 character(len=50),
parameter :: keyvector_log(nkey_log) = [character(len=100) :: &
66 logical :: valvector_log(nkey_log) = (/&
70 character(len=50),
parameter :: startstop(2) = [character(len=50) :: &
74 ,keyvector_int,valvector_int,keyvector_re,valvector_re,&
75 keyvector_log,valvector_log,trim(filename),startstop)
78 input%mixertype = valvector_char(1)
81 input%verbose = valvector_int(1)
82 input%mpulay = valvector_int(2)
85 input%mixeron = valvector_log(1)
88 input%mixcoeff = valvector_re(1)
103 subroutine prg_qmixer(charges,oldcharges,dqin,dqout,scferror,piter,pulaycoef,mpulay,verbose)
106 integer :: i,j,info,s,k,n
107 real(
dp) :: alpha,coeff
108 real(
dp),
intent(in) :: pulaycoef
109 real(
dp),
intent(inout) :: scferror
110 real(
dp) :: error, errop
112 real(
dp) :: dt, atenuacion
113 integer :: nint, na, nb
114 integer,
intent(in) :: mpulay,verbose
115 real(
dp),
allocatable :: d(:),dl(:),dnewin(:)
116 real(
dp),
allocatable :: dnewout(:)
117 real(
dp),
intent(inout) :: charges(:)
118 real(
dp),
allocatable,
intent(inout) :: oldcharges(:)
119 real(
dp),
allocatable,
intent(inout) :: dqin(:,:),dqout(:,:)
120 real(
dp),
allocatable :: coef(:,:),b(:),ipiv(:)
122 if(verbose > 0)
write(*,*)
"Performing Pulay mixing scheme ..."
127 if(
allocated(oldcharges).eqv..false.)
then
128 allocate(oldcharges(n),dqin(n,mpulay),dqout(n,mpulay))
131 if(
allocated(dqin).eqv..false.)
then
132 allocate(dqin(n,mpulay),dqout(n,mpulay))
135 s=min(piter-1,mpulay)
138 charges=(1.0_dp-alpha)*oldcharges + alpha*charges
139 scferror =
prg_norm2(charges(:)-oldcharges(:))
141 write(*,*)
"SCF error =", scferror
146 allocate(d(n),dnewin(n),dnewout(n))
150 allocate(coef(s+1,s+1))
154 if(piter.le.mpulay+1)
then
155 dqin(:,piter-1)=oldcharges(:)
156 dqout(:,piter-1)=d(:)
159 if(piter.gt.mpulay+1)
then
162 dqin(:,j)=dqin(:,j+1)
163 dqout(:,j)=dqout(:,j+1)
166 dqin(:,s)=oldcharges(:)
184 coef(i,j)=coef(i,j)+(dqout(k,i)-dqin(k,i))*(dqout(k,j)-dqin(k,j))
192 write(*,
'(10f12.5)')(coef(i,j),j=1,s+1)
195 write(*,
'(10f12.5)')(dqin(n,j),j=1,s)
198 call dgesv(s+1,1,coef,s+1,ipiv,b,s+1,info)
201 write(*,*)
'WARNING: (At prg_qmixer) Singular matrix in pulay. Doing linear mixing'
203 charges=(1.0_dp-alpha*0.1_dp)*oldcharges + alpha*0.1_dp*charges
204 scferror =
prg_norm2(charges(:)-oldcharges(:))
213 write(*,*)
"eigen coefs"
214 write(*,
'(6f10.5)')(b(j),j=1,s)
218 dnewin(:)=dnewin(:)+b(j)*dqin(:,j)
219 dnewout(:)= dnewout(:)+b(j)*dqout(:,j)
222 d=(1.0_dp-alpha)*dnewin + alpha*dnewout
224 scferror =
prg_norm2(charges(:)-oldcharges(:))
227 write(*,*)
"SCF error =", scferror
247 real(
dp),
intent(in) :: linmixcoef
248 real(
dp),
intent(inout) :: scferror
249 integer,
intent(in) :: verbose
250 real(
dp),
allocatable,
intent(inout) :: charges(:),oldcharges(:)
252 scferror =
prg_norm2(charges(:)-oldcharges(:))
255 write(*,*)
"SCF error =", scferror
258 charges = (1.0_dp - linmixcoef)*oldcharges + linmixcoef*charges
Some general parsing functions.
subroutine, public prg_parsing_kernel(keyvector_char, valvector_char, keyvector_int, valvector_int, keyvector_re, valvector_re, keyvector_log, valvector_log, filename, startstop)
The general parsing function. It is used to vectorize a set of "keywords" "value" pairs as included i...
subroutine, public prg_parse_mixer(input, filename)
The parser for the mixer routines.
subroutine, public prg_qmixer(charges, oldcharges, dqin, dqout, scferror, piter, pulaycoef, mpulay, verbose)
Mixing the charges to acelerate scf convergence.
subroutine, public prg_linearmixer(charges, oldcharges, scferror, linmixcoef, verbose)
Routine to perform linear mixing.