root / src / CalcTangent.f90 @ 5
Historique | Voir | Annoter | Télécharger (6 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 |
|