root / src / CalcTangent.f90 @ 2
Historique | Voir | Annoter | Télécharger (5,99 ko)
1 | 1 | equemene | !This programs reads a set of geometries, and print the tangent |
---|---|---|---|
2 | 1 | equemene | ! to the path they form |
3 | 1 | equemene | |
4 | 1 | equemene | SUBROUTINE CalcTangent(XgeomF,NGeomS,XGeom,Coef) |
5 | 1 | equemene | |
6 | 1 | equemene | use Path_module, only: IntCoordI, Nat, Coord, XyzGeomI, Atome, Order, & |
7 | 1 | equemene | OrderInv, IndZmat, NMaxPtPath, IntTangent, XyzTangent, & |
8 | 1 | equemene | NGeomF, NCoord |
9 | 1 | equemene | use Io_module, ONly : IoTmp,PathName, Kint,KReal |
10 | 1 | equemene | use VarTypes |
11 | 1 | equemene | |
12 | 1 | equemene | IMPLICIT NONE |
13 | 1 | equemene | ! NGeomS: number of geometries. |
14 | 1 | equemene | INTEGER(KINT), INTENT(IN) :: NGeomS |
15 | 1 | equemene | REAL(KREAL), INTENT(IN) :: XGeomF(NGeomF),Xgeom(NGeomS),Coef(NGeomS,NCoord) |
16 | 1 | equemene | |
17 | 1 | equemene | REAL(KREAL), ALLOCATABLE :: Path(:,:) ! NGeomS,NCoord |
18 | 1 | equemene | REAL(KREAL), ALLOCATABLE :: PathTan(:,:) ! NGeomF,NCoord |
19 | 1 | equemene | REAL(KREAL), ALLOCATABLE :: DbgTgt(:),GeomTmp(:) ! NCoord |
20 | 1 | equemene | |
21 | 1 | equemene | INTEGER(KINT) :: i, j, n3at, Idx, iat,igeom,k |
22 | 1 | equemene | INTEGER(KINT), SAVE :: icall=-1 |
23 | 1 | equemene | INTEGER(KINT) :: NMaxPt |
24 | 1 | equemene | REAL(KREAL), PARAMETER :: Inf=1e32, h=0.001d0 |
25 | 1 | equemene | CHARACTER(120) :: Line,File |
26 | 1 | equemene | CHARACTER(LCHARS) :: TITLE |
27 | 1 | equemene | LOGICAL :: Debug=.False. |
28 | 1 | equemene | REAL(KREAL) :: utmp,der |
29 | 1 | equemene | |
30 | 1 | equemene | LOGICAL, EXTERNAL :: valid |
31 | 1 | equemene | |
32 | 1 | equemene | debug=valid('calctangent') |
33 | 1 | equemene | |
34 | 1 | equemene | if (debug) WRITE(*,*) "======================================== Entering CalcTangen ============================" |
35 | 1 | equemene | n3at=3*nat |
36 | 1 | equemene | |
37 | 1 | equemene | ALLOCATE(Path(NGeomS,Ncoord),PathTan(NGeomF,NCoord),GeomTMP(NCoord)) |
38 | 1 | equemene | |
39 | 1 | equemene | icall=icall+2 |
40 | 1 | equemene | write(Line,'(I5)') icall |
41 | 1 | equemene | File=TRIM(adjustl(PathName)) // '_dbgtgt_' // TRIM(adjustl(Line)) // '.dat' |
42 | 1 | equemene | OPEN(IOTMP,File=File) |
43 | 1 | equemene | |
44 | 1 | equemene | ! We construct path, depending on COORD: |
45 | 1 | equemene | ! Path(NGeomS,Ncoord), NGeoms is equal to NGeomI |
46 | 1 | equemene | ! IntCoordI(:,:) ! (NGeomI,3*Nat-6) |
47 | 1 | equemene | SELECT CASE(Coord) |
48 | 1 | equemene | CASE ('ZMAT','MIXED') |
49 | 1 | equemene | Path(:,:)=IntCoordI(:,:) |
50 | 1 | equemene | CASE ('CART','HYBRID') |
51 | 1 | equemene | Path=reshape(XyzGeomI,(/NGeomS,NCoord/)) |
52 | 1 | equemene | CASE ('BAKER') |
53 | 1 | equemene | Path(:,:)=IntCoordI(:,:) |
54 | 1 | equemene | CASE DEFAULT |
55 | 1 | equemene | WRITE(*,*) "Coord=",TRIM(COORD)," not recognized in CalcTangent. STOP" |
56 | 1 | equemene | STOP |
57 | 1 | equemene | END SELECT |
58 | 1 | equemene | |
59 | 1 | equemene | |
60 | 1 | equemene | if (debug) THEN |
61 | 1 | equemene | WRITE(*,*) 'DBG CalcTangent. Geometries from Path' |
62 | 1 | equemene | DO I=1,NGeomS |
63 | 1 | equemene | GeomTmp=Path(I,1:NCoord) |
64 | 1 | equemene | WRITE(Title,"('Geometry ',I3,'/',I3,' for iteration ',I3)") I,NgeomS |
65 | 1 | equemene | Call PrintGeom(Title,Nat,Ncoord,GeomTmp,Coord,6,Atome,Order,OrderInv,IndZmat) |
66 | 1 | equemene | ! IF (COORD.EQ.'ZMAT') THEN |
67 | 1 | equemene | ! WRITE(*,"('Geometry ',I3,'/',I3,' for iteration ',I3)") I,NgeomS |
68 | 1 | equemene | ! WRITE(*,'(1X,A5,3(1X,A4,1X,F11.6))') Nom(Atome(OrderInv(indzmat(1,1)))) |
69 | 1 | equemene | ! WRITE(*,'(1X,A5,3(1X,A4,1X,F11.6))') Nom(Atome(OrderInv(indzmat(2,1)))), & |
70 | 1 | equemene | ! Nom(Atome(OrderInv(indzmat(2,2)))),Path(I,1) |
71 | 1 | equemene | ! WRITE(*,'(1X,A5,3(1X,A4,1X,F11.6))') Nom(Atome(OrderInv(indzmat(3,1)))), & |
72 | 1 | equemene | ! Nom(Atome(OrderInv(indzmat(3,2)))),Path(I,2), & |
73 | 1 | equemene | ! Nom(Atome(OrderInv(indzmat(3,3)))),Path(I,3) |
74 | 1 | equemene | ! Idx=4 |
75 | 1 | equemene | ! DO Iat=4,Nat |
76 | 1 | equemene | ! WRITE(*,'(1X,A5,3(1X,A4,1X,F11.6))') Nom(Atome(OrderInv(indzmat(iat,1)))), & |
77 | 1 | equemene | ! Nom(Atome(OrderInv(indzmat(iat,2)))),Path(I,Idx), & |
78 | 1 | equemene | ! Nom(Atome(OrderInv(indzmat(iat,3)))),Path(I,Idx+1), & |
79 | 1 | equemene | ! Nom(Atome(OrderInv(indzmat(iat,4)))),Path(I,Idx+2) |
80 | 1 | equemene | ! Idx=Idx+3 |
81 | 1 | equemene | ! END DO |
82 | 1 | equemene | ! ELSE |
83 | 1 | equemene | ! WRITE(*,*) Nat |
84 | 1 | equemene | ! WRITE(*,"('Geometry ',I3,'/',I3,' for iteration ',I3)") I,NgeomF |
85 | 1 | equemene | ! DO Iat=1,Nat |
86 | 1 | equemene | ! WRITE(*,'(1X,A5,3(1X,F11.6))') Nom(Atome(OrderInv(indzmat(iat,1)))), & |
87 | 1 | equemene | ! Path(I,3*Iat-2:3*Iat) |
88 | 1 | equemene | ! END DO |
89 | 1 | equemene | ! END IF |
90 | 1 | equemene | END DO |
91 | 1 | equemene | END IF |
92 | 1 | equemene | |
93 | 1 | equemene | !Debug info |
94 | 1 | equemene | IF (debug.AND.(COORD.EQ.'ZMAT')) THEN |
95 | 1 | equemene | ALLOCATE(DbgTgt(NCoord)) |
96 | 1 | equemene | WRITE(*,*) 'DBG CalcTangent. Path written in ' // TRIM(File) |
97 | 1 | equemene | WRITE(*,'(A,12(1X,F10.5))') "DBG CalcTangent, XgeomF:",XGeomF |
98 | 1 | equemene | |
99 | 1 | equemene | NMaxPt=min(200,NMaxPtPath)-1 |
100 | 1 | equemene | DO K=0,NMaxPt |
101 | 1 | equemene | utmp=K*Xgeom(NGeomS)/NMaxPt |
102 | 1 | equemene | DO J=1,NCoord |
103 | 1 | equemene | Call Splint(utmp,DbgTgt(J),NGeomS,Xgeom,Path(1,J),Coef(1,J)) |
104 | 1 | equemene | END DO |
105 | 1 | equemene | WRITE(IOTMP,'(12(1X,F10.5))') utmp,DbgTgt |
106 | 1 | equemene | END DO |
107 | 1 | equemene | DEALLOCATE(DbgTgt) |
108 | 1 | equemene | END IF |
109 | 1 | equemene | |
110 | 1 | equemene | !We construct the derivatives |
111 | 1 | equemene | DO I=1,NGeomF |
112 | 1 | equemene | DO J=1,NCoord |
113 | 1 | equemene | Call SplinDer(XgeomF(I),PathTan(I,J),NGeomS,Xgeom,Path(1,J),Coef(1,J)) |
114 | 1 | equemene | END DO |
115 | 1 | equemene | END DO |
116 | 1 | equemene | |
117 | 1 | equemene | SELECT CASE(Coord) |
118 | 1 | equemene | CASE ('ZMAT','MIXED') |
119 | 1 | equemene | IntTangent=PathTan |
120 | 1 | equemene | CASE ('CART','HYBRID') |
121 | 1 | equemene | XyzTangent=Pathtan |
122 | 1 | equemene | END SELECT |
123 | 1 | equemene | |
124 | 1 | equemene | |
125 | 1 | equemene | if (debug) THEN |
126 | 1 | equemene | WRITE(*,*) 'DBG CalcTangent. Tangents' |
127 | 1 | equemene | DO I=1,NGeomF |
128 | 1 | equemene | GeomTmp=PathTan(I,1:NCoord) |
129 | 1 | equemene | WRITE(Title,"('Tangents for geometry ',I3,'/',I3,' for iteration ',I3)") I,NgeomF |
130 | 1 | equemene | Call PrintGeom(Title,Nat,Ncoord,GeomTmp,Coord,6,Atome,Order,OrderInv,IndZmat) |
131 | 1 | equemene | |
132 | 1 | equemene | WRITe(*,'(A,12(1X,F10.6))') "Test:",GeomTmp(1:NCoord) |
133 | 1 | equemene | |
134 | 1 | equemene | ! IF (COORD.EQ.'ZMAT') THEN |
135 | 1 | equemene | ! WRITE(*,"('Tangent for Geometry ',I3,'/',I3,' for iteration ',I3)") I,NgeomF |
136 | 1 | equemene | ! WRITE(*,'(1X,A5,3(1X,A4,1X,F11.6))') Nom(Atome(OrderInv(indzmat(1,1)))) |
137 | 1 | equemene | ! WRITE(*,'(1X,A5,3(1X,A4,1X,F11.6))') Nom(Atome(OrderInv(indzmat(2,1)))), & |
138 | 1 | equemene | ! Nom(Atome(OrderInv(indzmat(2,2)))),IntTangent(I,1) |
139 | 1 | equemene | ! WRITE(*,'(1X,A5,3(1X,A4,1X,F11.6))') Nom(Atome(OrderInv(indzmat(3,1)))), & |
140 | 1 | equemene | ! Nom(Atome(OrderInv(indzmat(3,2)))),IntTangent(I,2), & |
141 | 1 | equemene | ! Nom(Atome(OrderInv(indzmat(3,3)))),IntTangent(I,3) |
142 | 1 | equemene | ! Idx=4 |
143 | 1 | equemene | ! DO Iat=4,Nat |
144 | 1 | equemene | ! WRITE(*,'(1X,A5,3(1X,A4,1X,F11.6))') Nom(Atome(OrderInv(indzmat(iat,1)))), & |
145 | 1 | equemene | ! Nom(Atome(OrderInv(indzmat(iat,2)))),IntTangent(I,Idx), & |
146 | 1 | equemene | ! Nom(Atome(OrderInv(indzmat(iat,3)))),IntTangent(I,Idx+1), & |
147 | 1 | equemene | ! Nom(Atome(OrderInv(indzmat(iat,4)))),IntTangent(I,Idx+2) |
148 | 1 | equemene | ! Idx=Idx+3 |
149 | 1 | equemene | ! END DO |
150 | 1 | equemene | ! ELSE |
151 | 1 | equemene | ! WRITE(*,*) Nat |
152 | 1 | equemene | ! WRITE(*,"('Tangent for Geometry ',I3,'/',I3,' for iteration ',I3)") I,NgeomF |
153 | 1 | equemene | ! DO Iat=1,Nat |
154 | 1 | equemene | ! WRITE(*,'(1X,A5,3(1X,F11.6))') Nom(Atome(OrderInv(indzmat(iat,1)))), & |
155 | 1 | equemene | ! XyzTangent(I,3*Iat-2:3*Iat) |
156 | 1 | equemene | ! END DO |
157 | 1 | equemene | ! END IF |
158 | 1 | equemene | END DO |
159 | 1 | equemene | END IF |
160 | 1 | equemene | |
161 | 1 | equemene | |
162 | 1 | equemene | DeALLOCATE(Path) |
163 | 1 | equemene | |
164 | 1 | equemene | CLOSE(IOTMP) |
165 | 1 | equemene | if (debug) WRITE(*,*) "======================================== Ending CalcTangent ============================" |
166 | 1 | equemene | |
167 | 1 | equemene | END SUBROUTINE CalcTangent |