root / src / Hupdate_MS.f90 @ 2
Historique | Voir | Annoter | Télécharger (2,02 ko)
1 |
! This program reads an old hessian, old forces, new forces |
---|---|
2 |
! and print the updated hessian and old coordinates. |
3 |
! We use the Murtagh-Sargent update |
4 |
|
5 |
SUBROUTINE Hupdate_MS(Nfree,ds,dgrad,Hess) |
6 |
|
7 |
IMPLICIT NONE |
8 |
|
9 |
INTEGER, PARAMETER :: KINT=KIND(1) |
10 |
INTEGER, PARAMETER :: KREAL=KIND(1.D0) |
11 |
|
12 |
INTEGER(KINT), INTENT(IN) :: NFREE |
13 |
REAL(KREAL), INTENT(INOUT) :: Hess(Nfree,Nfree) |
14 |
REAL(KREAL), INTENT(IN) :: ds(Nfree) |
15 |
REAL(KREAL), INTENT(IN) :: dGrad(Nfree) |
16 |
|
17 |
|
18 |
REAL(KREAL), ALLOCATABLE :: HessOld(:,:) , HupMS(:,:) |
19 |
REAL(KREAL), ALLOCATABLE :: Hup(:,:) |
20 |
REAL(KREAL), ALLOCATABLE :: HupInt(:) |
21 |
REAL(KREAL), ALLOCATABLE :: HS(:), Num(:,:) |
22 |
REAL(KREAL) :: Phi, Num3, Den, Den2,NormDS |
23 |
CHARACTER(120) :: fmt,fmt2,Line |
24 |
INTEGER(KINT) :: i,j, idx |
25 |
|
26 |
LOGICAL debug,valid |
27 |
EXTERNAL valid |
28 |
|
29 |
debug=valid("Hupdate").OR.Valid("Hupdate_MS") |
30 |
|
31 |
if (debug) Call Header("Entering Hupdate_MS") |
32 |
|
33 |
ALLOCATE(HessOld(nfree,nfree), HupMS(nfree,nfree), & |
34 |
Hup(nfree,nfree), & |
35 |
HupInt(nfree), HS(nfree), & |
36 |
Num(nfree,nfree)) |
37 |
|
38 |
HessOld=Hess |
39 |
|
40 |
if (debug) THEN |
41 |
WRITE(*,*) 'DBG Hupdate HessOld' |
42 |
Idx=min(12,Nfree) |
43 |
DO I=1,NFree |
44 |
WRITE(*,'(12(1X,F8.4))') HessOld(I,1:Idx) |
45 |
END DO |
46 |
WRITE(*,*) 'DBG Hupdate ds' |
47 |
WRITE(*,'(12(1X,F8.4))') ds(1:Idx) |
48 |
WRITE(*,*) 'DBG Hupdate dGrad' |
49 |
WRITE(*,'(12(1X,F8.4))') dGrad(1:Idx) |
50 |
END IF |
51 |
|
52 |
NormDS=sqrt(DOT_PRODUCT(DS,DS)) |
53 |
if (NormDS>=1e-6) THEN |
54 |
|
55 |
HS=0 |
56 |
DO I=1,nfree |
57 |
DO J=1,nfree |
58 |
HS(I)=HS(I)+HessOld(i,j)*Ds(j) |
59 |
END DO |
60 |
END DO |
61 |
HupInt=DGrad-HS |
62 |
|
63 |
! WE calculate the MS update |
64 |
Num=0. |
65 |
Den=0. |
66 |
DO I=1,nfree |
67 |
DO J=1,nfree |
68 |
Num(I,J)=HUpInt(i)*HupInt(j) |
69 |
END DO |
70 |
Den=Den+Hupint(i)*Ds(i) |
71 |
END DO |
72 |
|
73 |
HupMS=Num/Den |
74 |
|
75 |
Hess=HessOld+HupMS |
76 |
ELSE |
77 |
Hess=HessOld |
78 |
END IF |
79 |
! WRITE(*,*) 'New hess' |
80 |
! DO I=1,nfree |
81 |
! WRITE(*,fmt) Hess(i,:) |
82 |
! END DO |
83 |
|
84 |
DEALLOCATE(HessOld, HupMS,HupInt, HS, Num ) |
85 |
|
86 |
if (debug) Call Header("Hupdate_MS Over") |
87 |
|
88 |
END SUBROUTINE Hupdate_MS |