Statistiques
| Révision :

root / src / CalcTangent.f90 @ 3

Historique | Voir | Annoter | Télécharger (5,99 ko)

1
!This programs reads a set of geometries, and print the tangent
2
! to the path they form
3

    
4
SUBROUTINE CalcTangent(XgeomF,NGeomS,XGeom,Coef)
5

    
6
  use Path_module, only: IntCoordI, Nat, Coord, XyzGeomI, Atome, Order, &
7
                         OrderInv, IndZmat, NMaxPtPath, IntTangent, XyzTangent, &
8
						 NGeomF, NCoord
9
  use Io_module, ONly : IoTmp,PathName, Kint,KReal
10
  use VarTypes
11

    
12
  IMPLICIT NONE
13
  ! NGeomS: number of geometries.
14
  INTEGER(KINT), INTENT(IN) :: NGeomS
15
  REAL(KREAL), INTENT(IN) :: XGeomF(NGeomF),Xgeom(NGeomS),Coef(NGeomS,NCoord)
16
  
17
  REAL(KREAL), ALLOCATABLE :: Path(:,:) ! NGeomS,NCoord
18
  REAL(KREAL), ALLOCATABLE :: PathTan(:,:) ! NGeomF,NCoord
19
  REAL(KREAL), ALLOCATABLE :: DbgTgt(:),GeomTmp(:) ! NCoord
20

    
21
  INTEGER(KINT) :: i, j, n3at, Idx, iat,igeom,k
22
  INTEGER(KINT), SAVE :: icall=-1
23
  INTEGER(KINT) :: NMaxPt
24
  REAL(KREAL), PARAMETER :: Inf=1e32, h=0.001d0
25
  CHARACTER(120) :: Line,File
26
  CHARACTER(LCHARS) :: TITLE
27
  LOGICAL :: Debug=.False.
28
  REAL(KREAL) :: utmp,der
29

    
30
  LOGICAL, EXTERNAL :: valid
31

    
32
  debug=valid('calctangent')
33

    
34
  if (debug) WRITE(*,*) "======================================== Entering CalcTangen ============================"
35
  n3at=3*nat
36

    
37
  ALLOCATE(Path(NGeomS,Ncoord),PathTan(NGeomF,NCoord),GeomTMP(NCoord))
38

    
39
 icall=icall+2
40
 write(Line,'(I5)') icall
41
 File=TRIM(adjustl(PathName)) // '_dbgtgt_' // TRIM(adjustl(Line)) // '.dat'
42
 OPEN(IOTMP,File=File)
43

    
44
  ! We construct path, depending on COORD:
45
  ! Path(NGeomS,Ncoord), NGeoms is equal to NGeomI
46
  ! IntCoordI(:,:) ! (NGeomI,3*Nat-6)
47
 SELECT CASE(Coord)
48
    CASE ('ZMAT','MIXED')
49
     Path(:,:)=IntCoordI(:,:)
50
  CASE ('CART','HYBRID')
51
     Path=reshape(XyzGeomI,(/NGeomS,NCoord/))
52
  CASE ('BAKER')
53
	 Path(:,:)=IntCoordI(:,:)
54
  CASE DEFAULT
55
     WRITE(*,*) "Coord=",TRIM(COORD)," not recognized in CalcTangent. STOP"
56
     STOP
57
  END SELECT
58

    
59

    
60
  if (debug) THEN
61
     WRITE(*,*) 'DBG CalcTangent. Geometries from Path'
62
     DO I=1,NGeomS
63
        GeomTmp=Path(I,1:NCoord)
64
        WRITE(Title,"('Geometry ',I3,'/',I3,' for iteration ',I3)") I,NgeomS
65
        Call PrintGeom(Title,Nat,Ncoord,GeomTmp,Coord,6,Atome,Order,OrderInv,IndZmat)
66
!         IF (COORD.EQ.'ZMAT') THEN
67
!            WRITE(*,"('Geometry ',I3,'/',I3,' for iteration ',I3)") I,NgeomS
68
!            WRITE(*,'(1X,A5,3(1X,A4,1X,F11.6))') Nom(Atome(OrderInv(indzmat(1,1))))
69
!            WRITE(*,'(1X,A5,3(1X,A4,1X,F11.6))') Nom(Atome(OrderInv(indzmat(2,1)))), &
70
!                 Nom(Atome(OrderInv(indzmat(2,2)))),Path(I,1)
71
!            WRITE(*,'(1X,A5,3(1X,A4,1X,F11.6))') Nom(Atome(OrderInv(indzmat(3,1)))), &
72
!                 Nom(Atome(OrderInv(indzmat(3,2)))),Path(I,2), &
73
!                 Nom(Atome(OrderInv(indzmat(3,3)))),Path(I,3)
74
!            Idx=4
75
!            DO Iat=4,Nat
76
!               WRITE(*,'(1X,A5,3(1X,A4,1X,F11.6))') Nom(Atome(OrderInv(indzmat(iat,1)))), &
77
!                    Nom(Atome(OrderInv(indzmat(iat,2)))),Path(I,Idx), &
78
!                    Nom(Atome(OrderInv(indzmat(iat,3)))),Path(I,Idx+1), &
79
!                    Nom(Atome(OrderInv(indzmat(iat,4)))),Path(I,Idx+2)
80
!               Idx=Idx+3
81
!            END DO
82
!         ELSE
83
!            WRITE(*,*) Nat
84
!            WRITE(*,"('Geometry ',I3,'/',I3,' for iteration ',I3)") I,NgeomF
85
!            DO Iat=1,Nat
86
!               WRITE(*,'(1X,A5,3(1X,F11.6))') Nom(Atome(OrderInv(indzmat(iat,1)))), &
87
!                    Path(I,3*Iat-2:3*Iat)
88
!            END DO
89
!         END IF
90
     END DO
91
  END IF
92

    
93
!Debug info
94
 IF (debug.AND.(COORD.EQ.'ZMAT')) THEN
95
     ALLOCATE(DbgTgt(NCoord))
96
     WRITE(*,*) 'DBG CalcTangent. Path written in ' // TRIM(File)
97
     WRITE(*,'(A,12(1X,F10.5))') "DBG CalcTangent, XgeomF:",XGeomF
98

    
99
     NMaxPt=min(200,NMaxPtPath)-1
100
    DO K=0,NMaxPt
101
       utmp=K*Xgeom(NGeomS)/NMaxPt
102
       DO J=1,NCoord
103
       Call Splint(utmp,DbgTgt(J),NGeomS,Xgeom,Path(1,J),Coef(1,J))
104
       END DO
105
       WRITE(IOTMP,'(12(1X,F10.5))') utmp,DbgTgt
106
    END DO
107
    DEALLOCATE(DbgTgt)
108
 END IF
109

    
110
!We construct the derivatives
111
DO I=1,NGeomF
112
  DO J=1,NCoord
113
        Call SplinDer(XgeomF(I),PathTan(I,J),NGeomS,Xgeom,Path(1,J),Coef(1,J))
114
  END DO
115
END DO
116

    
117
 SELECT CASE(Coord)
118
    CASE ('ZMAT','MIXED')
119
     IntTangent=PathTan
120
  CASE ('CART','HYBRID')
121
     XyzTangent=Pathtan
122
  END SELECT
123

    
124

    
125
  if (debug) THEN
126
     WRITE(*,*) 'DBG CalcTangent. Tangents'
127
     DO I=1,NGeomF
128
        GeomTmp=PathTan(I,1:NCoord)
129
        WRITE(Title,"('Tangents for geometry ',I3,'/',I3,' for iteration ',I3)") I,NgeomF
130
        Call PrintGeom(Title,Nat,Ncoord,GeomTmp,Coord,6,Atome,Order,OrderInv,IndZmat)
131

    
132
        WRITe(*,'(A,12(1X,F10.6))') "Test:",GeomTmp(1:NCoord)
133

    
134
!         IF (COORD.EQ.'ZMAT') THEN
135
!            WRITE(*,"('Tangent for Geometry ',I3,'/',I3,' for iteration ',I3)") I,NgeomF
136
!            WRITE(*,'(1X,A5,3(1X,A4,1X,F11.6))') Nom(Atome(OrderInv(indzmat(1,1))))
137
!            WRITE(*,'(1X,A5,3(1X,A4,1X,F11.6))') Nom(Atome(OrderInv(indzmat(2,1)))), &
138
!                 Nom(Atome(OrderInv(indzmat(2,2)))),IntTangent(I,1)
139
!            WRITE(*,'(1X,A5,3(1X,A4,1X,F11.6))') Nom(Atome(OrderInv(indzmat(3,1)))), &
140
!                 Nom(Atome(OrderInv(indzmat(3,2)))),IntTangent(I,2), &
141
!                 Nom(Atome(OrderInv(indzmat(3,3)))),IntTangent(I,3)
142
!            Idx=4
143
!            DO Iat=4,Nat
144
!               WRITE(*,'(1X,A5,3(1X,A4,1X,F11.6))') Nom(Atome(OrderInv(indzmat(iat,1)))), &
145
!                    Nom(Atome(OrderInv(indzmat(iat,2)))),IntTangent(I,Idx), &
146
!                    Nom(Atome(OrderInv(indzmat(iat,3)))),IntTangent(I,Idx+1), &
147
!                    Nom(Atome(OrderInv(indzmat(iat,4)))),IntTangent(I,Idx+2)
148
!               Idx=Idx+3
149
!            END DO
150
!         ELSE
151
!            WRITE(*,*) Nat
152
!            WRITE(*,"('Tangent for Geometry ',I3,'/',I3,' for iteration ',I3)") I,NgeomF
153
!            DO Iat=1,Nat
154
!               WRITE(*,'(1X,A5,3(1X,F11.6))') Nom(Atome(OrderInv(indzmat(iat,1)))), &
155
!                    XyzTangent(I,3*Iat-2:3*Iat)
156
!            END DO
157
!         END IF
158
     END DO
159
  END IF
160

    
161

    
162
DeALLOCATE(Path) 
163

    
164
 CLOSE(IOTMP)
165
  if (debug) WRITE(*,*) "======================================== Ending CalcTangent ============================"
166

    
167
END SUBROUTINE CalcTangent
168