Statistiques
| Révision :

root / src / Hupdate_MS.f90 @ 2

Historique | Voir | Annoter | Télécharger (2,02 ko)

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