Statistiques
| Révision :

root / src / Hinvup_BFGS.f90 @ 2

Historique | Voir | Annoter | Télécharger (3,94 ko)

1 1 equemene
! This program reads an old hessian, old forces, new
2 1 equemene
! forces and updates the hessian matrix inverse
3 1 equemene
! using the BFGS scheme.
4 1 equemene
!
5 1 equemene
! This routines has been modified so that its input is now:
6 1 equemene
SUBROUTINE Hinvup_BFGS(Nfree,ds,dgrad,Hess)
7 1 equemene
8 1 equemene
  IMPLICIT NONE
9 1 equemene
10 1 equemene
  INTEGER, PARAMETER :: KINT=KIND(1)
11 1 equemene
  INTEGER, PARAMETER :: KREAL=KIND(1.D0)
12 1 equemene
13 1 equemene
  INTEGER(KINT), INTENT(IN) :: NFREE
14 1 equemene
  REAL(KREAL), INTENT(INOUT) :: Hess(Nfree,Nfree)
15 1 equemene
  REAL(KREAL), INTENT(IN) :: ds(Nfree)
16 1 equemene
  REAL(KREAL), INTENT(IN) :: dGrad(Nfree)
17 1 equemene
18 1 equemene
  REAL(KREAL), ALLOCATABLE  :: HessOld(:,:) , Wy(:)
19 1 equemene
  REAL(KREAL), ALLOCATABLE  :: Hup(:,:),ssT(:,:)
20 1 equemene
  REAL(KREAL), ALLOCATABLE  :: HupInt(:)
21 1 equemene
  REAL(KREAL), ALLOCATABLE  :: Num(:,:), Num2(:,:)
22 1 equemene
  REAL(KREAL) :: Phi, Num3, Den, Den2,NormDS
23 1 equemene
  CHARACTER(120) :: fmt,fmt2,Line
24 1 equemene
  INTEGER(KINT) :: i,j,k, Idx
25 1 equemene
26 1 equemene
  LOGICAL debug,valid
27 1 equemene
  EXTERNAL valid
28 1 equemene
29 1 equemene
  debug=valid("Hinvup_BFGS")
30 1 equemene
31 1 equemene
  if (debug) WRITE(*,*) "=========================== Entering Hinvup_BFGS ===================="
32 1 equemene
33 1 equemene
  ALLOCATE(HessOld(nfree,nfree), Hup(nfree,nfree), &
34 1 equemene
       HupInt(nfree),  &
35 1 equemene
       Num(nfree,nfree), Num2(nfree,nfree),Wy(Nfree),ssT(Nfree,nFree) )
36 1 equemene
37 1 equemene
  ! Notations
38 1 equemene
  ! s=Geom-GeomOld
39 1 equemene
  ! y=Grad-GradOld
40 1 equemene
  ! W= (H)-1 ie the inverse matrix that we are updating
41 1 equemene
  ! W+=W - [s(yT)W+Wy(sT)]/(y,s)+ {1+[(y,Wy)/(y,s)]}(s(sT))/(y,s)
42 1 equemene
43 1 equemene
44 1 equemene
  HessOld=Hess
45 1 equemene
46 1 equemene
  if (debug) THEN
47 1 equemene
     WRITE(*,*) 'DBG Hinvup_BFGS HessOld'
48 1 equemene
     Idx=min(12,Nfree)
49 1 equemene
     DO I=1,NFree
50 1 equemene
        WRITE(*,'(12(1X,F8.4))') HessOld(I,1:Idx)
51 1 equemene
     END DO
52 1 equemene
     WRITE(*,*) 'DBG Hinvup_BFGS ds'
53 1 equemene
     WRITE(*,'(12(1X,F8.4))') ds(1:Idx)
54 1 equemene
     WRITE(*,*) 'DBG Hinvup_BFGS dGrad'
55 1 equemene
     WRITE(*,'(12(1X,F8.4))') dGrad(1:Idx)
56 1 equemene
  END IF
57 1 equemene
58 1 equemene
59 1 equemene
60 1 equemene
  NormDS=sqrt(DOT_PRODUCT(DS,DS))
61 1 equemene
  if (NormDS>=1e-6) THEN
62 1 equemene
     IF (debug) WRITE(*,*) 'NormDS=',NormDS
63 1 equemene
     IF (debug) WRITE(*,*) 'DS=',DS
64 1 equemene
     IF (debug) WRITE(*,*) 'DGrad=',DGrad
65 1 equemene
     ! We calculate the denominator (DGrad,DS)
66 1 equemene
     den=DOT_PRODUCT(DGrad,DS)
67 1 equemene
68 1 equemene
     if (debug) WRITE(*,*) "(y,s)=(yT)s",den
69 1 equemene
70 1 equemene
     ! We calculate Wy
71 1 equemene
     Wy=0
72 1 equemene
     DO I=1,nfree
73 1 equemene
        DO J=1,NFree
74 1 equemene
           Wy(I)=Wy(I)+HessOld(i,j)*DGrad(j)
75 1 equemene
        END DO
76 1 equemene
     END DO
77 1 equemene
78 1 equemene
     if (debug) WRITE(*,*) "Wy=",Wy
79 1 equemene
80 1 equemene
     ! We calculate Num=Wy(sT)
81 1 equemene
     Num=0.
82 1 equemene
     DO I=1,Nfree
83 1 equemene
        DO J=1,Nfree
84 1 equemene
           Num(I,J)=Wy(i)*Ds(j)
85 1 equemene
        END DO
86 1 equemene
     END DO
87 1 equemene
88 1 equemene
     if (debug) THEN
89 1 equemene
        WRITE(*,*) "Wy(sT)"
90 1 equemene
        DO I=1,NFree
91 1 equemene
           WRITE(*,*) Num(I,:)
92 1 equemene
        END DO
93 1 equemene
     END if
94 1 equemene
95 1 equemene
     ! We calculate Num2=s(yT)
96 1 equemene
     Num2=0
97 1 equemene
     Do I=1,NFree
98 1 equemene
        DO J=1,NFree
99 1 equemene
           Num2(I,J)=Ds(i)*DGrad(j)
100 1 equemene
        END DO
101 1 equemene
     END DO
102 1 equemene
103 1 equemene
     if (debug) THEN
104 1 equemene
        WRITE(*,*) "s(yT)"
105 1 equemene
        DO I=1,NFree
106 1 equemene
           WRITE(*,*) Num2(I,:)
107 1 equemene
        END DO
108 1 equemene
     END if
109 1 equemene
110 1 equemene
111 1 equemene
     ! we add Num2*W to Num
112 1 equemene
     Do I=1,NFree
113 1 equemene
        DO J=1,NFree
114 1 equemene
           DO K=1,NFree
115 1 equemene
              Num(I,J)=Num(I,J)+Num2(I,K)*HessOld(K,J)
116 1 equemene
           END DO
117 1 equemene
        END DO
118 1 equemene
     END DO
119 1 equemene
120 1 equemene
     if (debug) THEN
121 1 equemene
        WRITE(*,*) "Num=s(yT)W+Wy(sT)"
122 1 equemene
        DO I=1,NFree
123 1 equemene
           WRITE(*,*) Num(I,:)
124 1 equemene
        END DO
125 1 equemene
     END if
126 1 equemene
127 1 equemene
128 1 equemene
     ! we calculate ssT
129 1 equemene
     ssT=0.
130 1 equemene
     DO I=1,Nfree
131 1 equemene
        DO J=1,NFree
132 1 equemene
           ssT(I,J)=Ds(I)*Ds(J)
133 1 equemene
        END DO
134 1 equemene
     END DO
135 1 equemene
136 1 equemene
     if (debug) THEN
137 1 equemene
        WRITE(*,*) "s(sT)"
138 1 equemene
        DO I=1,NFree
139 1 equemene
           WRITE(*,*) ssT(I,:)
140 1 equemene
        END DO
141 1 equemene
     END if
142 1 equemene
143 1 equemene
144 1 equemene
     !We add everything
145 1 equemene
     Hup=(1+DOT_PRODUCT(DGRAD,Wy)/Den)*ssT/Den-Num/Den
146 1 equemene
     Hess=HessOld+Hup
147 1 equemene
148 1 equemene
     if (debug) THEN
149 1 equemene
        WRITE(*,*) 'DBG Hinvup_BFGS Hup'
150 1 equemene
        Idx=min(12,Nfree)
151 1 equemene
        DO I=1,NFree
152 1 equemene
           WRITE(*,'(12(1X,F8.4))') Hup(I,1:Idx)
153 1 equemene
        END DO
154 1 equemene
        WRITE(*,*) 'DBG Hinvup_BFGS Hess new'
155 1 equemene
        Idx=min(12,Nfree)
156 1 equemene
        DO I=1,NFree
157 1 equemene
           WRITE(*,'(12(1X,F8.4))') Hess(I,1:Idx)
158 1 equemene
        END DO
159 1 equemene
     END IF
160 1 equemene
161 1 equemene
  ELSE
162 1 equemene
     Hess=HessOld
163 1 equemene
  END IF
164 1 equemene
  !     WRITE(*,*) 'New hess'
165 1 equemene
  !     DO I=1,nfree
166 1 equemene
  !        WRITE(*,fmt) Hess(i,:)
167 1 equemene
  !     END DO
168 1 equemene
169 1 equemene
  DEALLOCATE(HessOld, Wy,ssT, Hup,HupInt, Num, Num2 )
170 1 equemene
171 1 equemene
  if (debug) WRITE(*,*) "=========================== Hinvup_BFGS Over ===================="
172 1 equemene
173 1 equemene
END SUBROUTINE Hinvup_BFGS