98
98
AC%DupMatrix = AC%Matrix
99
99
! not needed (SVD) AC%DupMatrix(slot,slot) = (1+AC%w0) * AC%DupMatrix(slot,slot)
100
100
! Call ZHESV('L', Slot, 1, AC%DupMatrix(1,1), AC%Nmax, &
101
! AC%IPIV(1), AC%Gamma(1), AC%Nmax, AC%Work(1), AC%LWork, i)
101
!& AC%IPIV(1), AC%Gamma(1), AC%Nmax, AC%Work(1), AC%LWork, i)
103
103
! Call ZGESV(Slot, 1, AC%DupMatrix(1,1), AC%Nmax, AC%IPIV(1), &
104
! AC%Gamma(1), AC%Nmax, i)
104
!& AC%Gamma(1), AC%Nmax, i)
105
105
! Call ZGESV(currentdim, 1, AC%DupMatrix(1,1), AC%Nmax, AC%IPIV(1), &
106
! AC%Gamma(1), AC%Nmax, i)
106
!& AC%Gamma(1), AC%Nmax, i)
108
108
n = AC%Nmax; j= currentdim
109
109
CALL DGESDD('A',j,j,AC%DupMatrix(1,1),n,AC%S(1), &
110
AC%U(1,1),n,AC%VT(1,1),n,AC%Work(1),AC%Lwork, AC%IPIV(1),i)
110
& AC%U(1,1),n,AC%VT(1,1),n,AC%Work(1),AC%Lwork, AC%IPIV(1),i)
112
112
WRITE(AC%Err_Unit,*) 'Anderson_Mix: Error in DGESDD. Error=',i
118
118
WRITE(AC%Err_Unit,*) 'in Anderson_Mix -- completed SVD with values'
119
WRITE(AC%Err_Unit,'(1p5e15.7)') (AC%S(i),i=1,j)
119
WRITE(AC%Err_Unit,'(1p,5e15.7)') (AC%S(i),i=1,j)
121
121
AC%Work(1:j) = AC%Gamma(1:j)
125
125
IF (ABS(AC%S(i)).GT.tmp) THEN
126
126
AC%Gamma(1:j)=AC%Gamma(1:j)+&
127
(AC%VT(i,1:j))*DOT_PRODUCT(AC%U(1:j,i),AC%Work(1:j))/AC%S(i)
127
& (AC%VT(i,1:j))*DOT_PRODUCT(AC%U(1:j,i),AC%Work(1:j))/AC%S(i)
175
175
!******************************************************************************
177
177
SUBROUTINE FreeAnderson(AC)
178
TYPE (Anderson_Context), POINTER :: AC
180
DEALLOCATE(AC%Xprev, AC%Fprev , AC%DX, AC%DF, AC%Matrix, AC%Gamma)
181
DEALLOCATE(AC%DupMatrix, AC%U, AC%VT, AC%Work, AC%RWork, AC%IPIV, AC%S)
178
TYPE (Anderson_Context), POINTER :: AC
179
IF (ASSOCIATED(AC)) then
180
IF (ASSOCIATED(AC%Matrix)) DEALLOCATE(AC%Matrix)
181
IF (ASSOCIATED(AC%Gamma)) DEALLOCATE(AC%Gamma)
182
IF (ASSOCIATED(AC%DF)) DEALLOCATE(AC%DF)
183
IF (ASSOCIATED(AC%Fprev)) DEALLOCATE(AC%Fprev)
184
IF (ASSOCIATED(AC%DX)) DEALLOCATE(AC%DX)
185
IF (ASSOCIATED(AC%Xprev)) DEALLOCATE(AC%Xprev)
186
IF (ASSOCIATED(AC%IPIV)) DEALLOCATE(AC%IPIV)
187
IF (ASSOCIATED(AC%S)) DEALLOCATE(AC%S)
188
IF (ASSOCIATED(AC%RWork)) DEALLOCATE(AC%RWork)
189
IF (ASSOCIATED(AC%U)) DEALLOCATE(AC%U)
190
IF (ASSOCIATED(AC%VT)) DEALLOCATE(AC%VT)
191
IF (ASSOCIATED(AC%Work)) DEALLOCATE(AC%Work)
192
IF (ASSOCIATED(AC%DupMatrix)) DEALLOCATE(AC%DupMatrix)
185
195
END SUBROUTINE FreeAnderson
187
197
!******************************************************************************
220
230
! AC%Lwork = 2*Nmax
221
231
! Allocate(AC%Gamma(Nmax), AC%Work(AC%Lwork), AC%Fprev(VecSize), &
222
! AC%DF(VecSize, Nmax), AC%Matrix(Nmax, Nmax), AC%IPIV(Nmax), &
223
! AC%DX(VecSize, Nmax), AC%Xprev(VecSize), &
224
! AC%DupMatrix(Nmax, Nmax), STAT=i)
232
!& AC%DF(VecSize, Nmax), AC%Matrix(Nmax, Nmax), AC%IPIV(Nmax), &
233
!& AC%DX(VecSize, Nmax), AC%Xprev(VecSize), &
234
!& AC%DupMatrix(Nmax, Nmax), STAT=i)
226
236
ALLOCATE(AC%Xprev(VecSize), AC%Fprev(VecSize) , AC%DX(VecSize,Nmax), &
227
AC%DF(VecSize,Nmax), AC%Matrix(Nmax,Nmax) , AC%Gamma(Nmax), &
237
& AC%DF(VecSize,Nmax), AC%Matrix(Nmax,Nmax) , AC%Gamma(Nmax), &
252
262
WRITE(Err_Unit,*) 'Machaccur = ', AC%Machaccur
254
264
ALLOCATE(AC%DupMatrix(Nmax,Nmax), AC%U(Nmax, Nmax), AC%VT(Nmax,Nmax), &
255
AC%Work(AC%Lwork), AC%RWork(AC%LRWork), AC%IPIV(8*Nmax), &
265
& AC%Work(AC%Lwork), AC%RWork(AC%LRWork), AC%IPIV(8*Nmax), &
266
& AC%S(Nmax), STAT=i)
261
271
END SUBROUTINE InitAnderson
264
273
END MODULE anderson_realmix