Statistiques
| Révision :

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