root / src / Path_module.f90 @ 4
Historique | Voir | Annoter | Télécharger (11,83 ko)
1 | 1 | equemene | MODULE Path_module |
---|---|---|---|
2 | 1 | equemene | ! This module contains most of the variables needed for the path |
3 | 1 | equemene | |
4 | 1 | equemene | use VarTypes |
5 | 1 | equemene | |
6 | 1 | equemene | IMPLICIT NONE |
7 | 1 | equemene | |
8 | 1 | equemene | SAVE |
9 | 1 | equemene | |
10 | 1 | equemene | INTEGER(KINT), PARAMETER :: NMaxL=21 |
11 | 1 | equemene | INTEGER(KINT), PARAMETER :: Max_Z=86 |
12 | 1 | equemene | INTEGER(KINT), PARAMETER :: MaxFroz=100 |
13 | 1 | equemene | REAL(KREAL), PARAMETER :: a0=0.529177249d0 |
14 | 1 | equemene | REAL(KREAL), PARAMETER :: Unit=1.d0/a0 |
15 | 1 | equemene | REAL(KREAL), PARAMETER :: au2kcal=627.509608d0 |
16 | 1 | equemene | REAL(KREAL) :: Pi |
17 | 1 | equemene | |
18 | 1 | equemene | ! Frozen contains the indices of frozen atoms |
19 | 1 | equemene | INTEGER(KINT),ALLOCATABLE :: Frozen(:) !Nat |
20 | 1 | equemene | ! Cart contains the indices of atoms described in cartesian coords |
21 | 1 | equemene | INTEGER(KINT),ALLOCATABLE :: Cart(:) !Nat |
22 | 1 | equemene | ! intFroz is the number of internal coord frozen |
23 | 1 | equemene | ! NFroz the number of frozen atoms |
24 | 1 | equemene | ! Ncart the number of atoms described in cartesian coords |
25 | 1 | equemene | INTEGER(KINT) :: IntFroz, NFroz, NCart |
26 | 1 | equemene | ! FrozAtoms is true for a frozen atom, false else. |
27 | 1 | equemene | LOGICAL, ALLOCATABLE :: FrozAtoms(:) !! Nat |
28 | 1 | equemene | ! Number of Primitives (mainly for Baker coordinates) |
29 | 1 | equemene | INTEGER(KINT) :: NPrim |
30 | 1 | equemene | ! Nat number of atoms |
31 | 1 | equemene | INTEGER(KINT) :: Nat |
32 | 1 | equemene | ! NGeomI number of initial geometries |
33 | 1 | equemene | ! NgeomF number of final geometries |
34 | 1 | equemene | INTEGER(KINT) :: NGeomI, NGeomF |
35 | 1 | equemene | ! NCoord=3*Nat or NFree depending on the coordinate choice |
36 | 1 | equemene | INTEGER(KINT) :: NCoord |
37 | 1 | equemene | INTEGER(KINT) :: NMaxPtPath=1000 |
38 | 1 | equemene | ! IReparam is the period of reparameterization of the Path |
39 | 1 | equemene | INTEGER(KINT) :: IReparam=1 |
40 | 1 | equemene | ! IReparamT is the period of reparameterization of the tangents along the path |
41 | 1 | equemene | ! Be default IReparamT=IReparam |
42 | 1 | equemene | INTEGER(KINT) :: IReparamT |
43 | 1 | equemene | ! ISpline is the iteration number where spline interpolation starts to be used |
44 | 1 | equemene | ! instead of linear interpolation |
45 | 1 | equemene | INTEGER(KINT) :: ISpline=1 |
46 | 1 | equemene | ! Linear: if TRUE, then we perform linear interpolation and not spline |
47 | 1 | equemene | LOGICAL :: Linear |
48 | 1 | equemene | |
49 | 1 | equemene | ! FrozTol is the criterion to decide wether a frozen atom has moved between |
50 | 1 | equemene | ! two initial geometries |
51 | 1 | equemene | REAL(KREAL) :: FrozTol=1e-4 |
52 | 1 | equemene | |
53 | 1 | equemene | ! BoxTol is the criterion to decide wether an atom has crossed the box between |
54 | 1 | equemene | ! two initial geometries |
55 | 1 | equemene | REAL(KREAL) :: BoxTol=0.5 |
56 | 1 | equemene | |
57 | 1 | equemene | |
58 | 1 | equemene | LOGICAL :: Freq, MW, Bohr, Renum, Hinv |
59 | 4 | pfleura2 | ! OptReac: if TRUE the reactants will be optimized. Default is FALSE |
60 | 4 | pfleura2 | LOGICAL :: OptReac |
61 | 4 | pfleura2 | ! OptProd: if TRUE the products will be optimized. Default is FALSE |
62 | 4 | pfleura2 | LOGICAL :: OptProd |
63 | 4 | pfleura2 | ! PathOnly: if TRUE, only the initial path will be constructed. |
64 | 4 | pfleura2 | ! Default is FALSE, that is OpenPath construct the path and optimize it |
65 | 4 | pfleura2 | LOGICAL :: PathOnly |
66 | 4 | pfleura2 | ! CalcEReac: if TRUE the reactants energy will be computed. Default is FALSE |
67 | 4 | pfleura2 | ! Not compatible with RunMode=Para |
68 | 4 | pfleura2 | LOGICAL :: CalcEReac |
69 | 4 | pfleura2 | ! CalEProd: if TRUE the products energy will be computed. Default is FALSE |
70 | 4 | pfleura2 | ! Not compatible with RunMode=Para |
71 | 4 | pfleura2 | LOGICAL :: CalcEProd |
72 | 1 | equemene | LOGICAL :: IniHup,HupNeighbour |
73 | 1 | equemene | |
74 | 1 | equemene | REAL(KREAL) :: Fact,FTan |
75 | 1 | equemene | ! IGeomRef is the index of the reference geometry, used to calculate the Zmat |
76 | 1 | equemene | ! or the Baker coordinates. |
77 | 1 | equemene | INTEGER(KINT) :: IGeomRef=-1 |
78 | 1 | equemene | ! For geometry optimization , OptGeom is the index of the starting geometry |
79 | 1 | equemene | INTEGER(KINT) :: OptGeom=-1 |
80 | 1 | equemene | |
81 | 1 | equemene | ! Optimization parameter |
82 | 1 | equemene | INTEGER(KINT) :: MaxCyc |
83 | 1 | equemene | REAL(KREAL) :: SThresh, Smax, SthreshRms |
84 | 1 | equemene | REAL(KREAL) :: GThresh, GThreshRMS |
85 | 1 | equemene | |
86 | 1 | equemene | ! Number of steps in memory for Step_RFO_all |
87 | 1 | equemene | INTEGER(KINT) :: NGintMax = 10 |
88 | 1 | equemene | |
89 | 1 | equemene | CHARACTER(SCHARS) :: Coord='HYBRID' |
90 | 1 | equemene | CHARACTER(SCHARS) :: Step_method='RFO' |
91 | 1 | equemene | CHARACTER(SCHARS) :: Prog="GAUSSIAN" |
92 | 1 | equemene | CHARACTER(VLCHARS) :: ProgExe="g03" |
93 | 1 | equemene | |
94 | 4 | pfleura2 | ! PFL 06/2011: HesUpd is deprecated |
95 | 4 | pfleura2 | ! I replace it by HUpdate that is more intuitive to me |
96 | 1 | equemene | CHARACTER(SCHARS) :: hesupd="BFGS" |
97 | 4 | pfleura2 | ! HUpdate indicates which method to use for updating the Hessian or its inverse |
98 | 4 | pfleura2 | CHARACTER(SCHARS) :: HUpdate="BFGS" |
99 | 1 | equemene | |
100 | 1 | equemene | REAL(KREAL), ALLOCATABLE, TARGET :: XyzGeomI(:,:,:) ! (NGeomI,3,Nat) |
101 | 1 | equemene | REAL(KREAL), ALLOCATABLE :: XyzGeomF(:,:,:) ! (NGeomF,3,Nat) |
102 | 1 | equemene | REAL(KREAL), ALLOCATABLE :: XyzTangent(:,:) ! (NGeomF,3*Nat) |
103 | 1 | equemene | REAL(KREAL), ALLOCATABLE :: IntTangent(:,:) ! (NGeomF,Nfree=3Nat-6) |
104 | 1 | equemene | REAL(KREAL), ALLOCATABLE :: IntCoordI(:,:) ! (NGeomI,3*Nat-6) |
105 | 1 | equemene | ! IntCoordF: Final Internal coordinates for number of final geometries. |
106 | 1 | equemene | ! 3*Nat-6 is the number of coordinates (NCoord) of each geometry. |
107 | 1 | equemene | REAL(KREAL), ALLOCATABLE :: IntCoordF(:,:) ! (NGeomF,3*Nat-6) |
108 | 1 | equemene | REAL(KREAL), ALLOCATABLE :: Vfree(:,:) ! (Ncoord,Ncoord) |
109 | 1 | equemene | REAL(KREAL), ALLOCATABLE :: SGeom(:) ! (NGeomF) |
110 | 1 | equemene | REAL(KREAL), ALLOCATABLE :: Energies(:) ! NGeomF |
111 | 1 | equemene | ! NCoord=3*Nat or NFree depending on the coordinate choice |
112 | 1 | equemene | REAL(KREAL), ALLOCATABLE :: Grad(:,:) ! (NGeomF,NCoord) |
113 | 1 | equemene | REAL(KREAL), ALLOCATABLE :: Hess(:,:,:) !(NgeomF, N,N) |
114 | 1 | equemene | REAL(KREAL), ALLOCATABLE :: DzDc(:,:,:,:) ! (3,Nat,3,Nat) |
115 | 1 | equemene | REAL(KREAL), ALLOCATABLE :: BMat_BakerT(:,:) ! (3*Nat,NCoord) |
116 | 1 | equemene | INTEGER(KINT), ALLOCATABLE :: IndZmat(:,:) ! (Nat,5) |
117 | 1 | equemene | INTEGER(KINT), ALLOCATABLE :: Order(:),OrderInv(:) ! Nat |
118 | 1 | equemene | CHARACTER(10), ALLOCATABLE :: AtName(:) ! Nat |
119 | 1 | equemene | INTEGER(KINT), ALLOCATABLE :: Atome(:) ! Nat |
120 | 1 | equemene | REAL(KREAL), ALLOCATABLE :: MassAt(:) ! Nat |
121 | 1 | equemene | REAL(KREAL), ALLOCATABLE :: BTransInv(:,:) ! BTransInv (3*Nat-6,3*Nat), used for Baker case. |
122 | 1 | equemene | REAL(KREAL), ALLOCATABLE :: BTransInvF(:,:,:) ! BTransInvF (NGeomF,3*Nat-6,3*Nat) |
123 | 1 | equemene | ! BTransInv_local (3*Nat-6,3*Nat), used for Baker case in Opt_Geom.f90 |
124 | 1 | equemene | REAL(KREAL), ALLOCATABLE :: BTransInv_local(:,:) |
125 | 1 | equemene | REAL(KREAL), ALLOCATABLE :: UMat(:,:) !(NPrim,3*Nat-6) |
126 | 1 | equemene | REAL(KREAL), ALLOCATABLE :: UMat_local(:,:) !(NPrim,3*Nat-6) |
127 | 1 | equemene | REAL(KREAL), ALLOCATABLE :: UMatF(:,:,:) !(NGeomF,NPrim,3*Nat-6) |
128 | 1 | equemene | !REAL(KREAL), ALLOCATABLE :: IntCoordIBaker(:,:) ! (NGeomI,NCoord=3*Nat-6) |
129 | 1 | equemene | ! IntCoordIBaker allocated in PathCreate.f90 |
130 | 1 | equemene | REAL(KREAL), ALLOCATABLE :: Xprimitive(:,:) ! Xprimitive(NgeomI,NPrim) |
131 | 1 | equemene | REAL(KREAL), ALLOCATABLE :: Xprimitive_t(:) ! used in ConvertBakerInternal_cart.f as a temporary variable. |
132 | 1 | equemene | REAL(KREAL), ALLOCATABLE :: XprimitiveF(:,:) ! Xprimitive(NgeomF,NPrim) |
133 | 1 | equemene | REAL(KREAL), ALLOCATABLE :: GeomOld_all(:,:) |
134 | 1 | equemene | REAL(KREAL), ALLOCATABLE :: GeomOld(:) ! Used in DIIS step method. |
135 | 1 | equemene | |
136 | 1 | equemene | LOGICAL, PARAMETER :: FRot=.TRUE., FAlign=.TRUE. |
137 | 1 | equemene | REAL(KREAL), ALLOCATABLE :: BprimT(:,:) !(3*Nat,NPrim). This is B^prim. |
138 | 1 | equemene | REAL(KREAL), ALLOCATABLE :: BBT(:,:) ! BBT (3*Nat-6,3*Nat-6), used for Baker case |
139 | 1 | equemene | REAL(KREAL), ALLOCATABLE :: BBT_inv(:,:) ! BBT_inv (3*Nat-6,3*Nat-6), used for Baker case |
140 | 1 | equemene | INTEGER(KINT) :: Symmetry_elimination |
141 | 1 | equemene | LOGICAL :: FirstTimePathCreate |
142 | 1 | equemene | |
143 | 1 | equemene | Type (ListCoord), POINTER :: Coordinate, CurrentCoord |
144 | 1 | equemene | Type (ListCoord), POINTER :: ScanCoord |
145 | 1 | equemene | |
146 | 1 | equemene | ! Triggers the dynamical update of the maximum step |
147 | 1 | equemene | LOGICAL :: DynMaxStep |
148 | 1 | equemene | |
149 | 1 | equemene | ! Triggers the alignment of not |
150 | 1 | equemene | LOGICAL :: Align |
151 | 1 | equemene | |
152 | 1 | equemene | |
153 | 1 | equemene | |
154 | 1 | equemene | !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
155 | 1 | equemene | ! |
156 | 1 | equemene | ! Flags for printing |
157 | 1 | equemene | ! |
158 | 1 | equemene | !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
159 | 1 | equemene | |
160 | 1 | equemene | ! Vmd is set to TRUE if user wants to use VMD to look |
161 | 1 | equemene | ! at the Path. |
162 | 1 | equemene | ! For now, used only for VASP |
163 | 1 | equemene | |
164 | 1 | equemene | LOGICAL :: Vmd |
165 | 1 | equemene | |
166 | 1 | equemene | |
167 | 1 | equemene | !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
168 | 1 | equemene | ! |
169 | 1 | equemene | ! Variables for VASP input/output |
170 | 1 | equemene | ! |
171 | 1 | equemene | !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
172 | 1 | equemene | |
173 | 1 | equemene | REAL(KREAL) :: lat_a(3), lat_b(3), lat_c(3) |
174 | 1 | equemene | REAL(KREAL), ALLOCATABLE :: X0_vasp(:),Y0_vasp(:), Z0_vasp(:) ! nat |
175 | 1 | equemene | REAL(KREAL) :: Latr(3,3) |
176 | 1 | equemene | CHARACTER(LCHARS) :: V_direct |
177 | 1 | equemene | ! AutoCart : true if user let PATH determines which atoms should be |
178 | 1 | equemene | ! described in cartesian when COORD=MIXED |
179 | 1 | equemene | LOGICAL :: AutoCart |
180 | 1 | equemene | |
181 | 1 | equemene | |
182 | 1 | equemene | !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
183 | 1 | equemene | ! |
184 | 1 | equemene | ! General |
185 | 1 | equemene | ! |
186 | 1 | equemene | !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |
187 | 1 | equemene | |
188 | 1 | equemene | CHARACTER(2) :: Nom(0:max_Z)=(/ ' X',' H', 'HE', & |
189 | 1 | equemene | 'LI','BE', ' B',' C',' N',' O',' F','NE', & |
190 | 1 | equemene | 'NA','MG', 'AL','SI',' P',' S','CL','AR', & |
191 | 1 | equemene | ' K','CA', & |
192 | 1 | equemene | 'SC','TI',' V','CR','MN','FE','CO','NI','CU','ZN', & |
193 | 1 | equemene | 'GA','GE','AS','SE','BR','KR', & |
194 | 1 | equemene | 'RB','SR', & |
195 | 1 | equemene | ' Y','ZR','NB','MO','TC','RU','RH','PD','AG','CD', & |
196 | 1 | equemene | 'IN','SN','SB','TE',' I','XE', & |
197 | 1 | equemene | 'CS','BA', & |
198 | 1 | equemene | 'LA', & |
199 | 1 | equemene | 'CE','PR','ND','PM','SM','EU','GD','TB','DY','HO', & |
200 | 1 | equemene | 'ER','TM','YB','LU', & |
201 | 1 | equemene | 'HF','TA',' W','RE','OS','IR','PT','AU','HG', & |
202 | 1 | equemene | 'TL','PB','BI','PO','AT','RN'/) |
203 | 1 | equemene | |
204 | 1 | equemene | ! This is the new table, more complete, taken from a periodic table |
205 | 1 | equemene | ! some value have been changed to be consistent |
206 | 1 | equemene | REAL(KREAL) :: r_cov(0:max_Z)=(/ 1e-13, 37., 93., & |
207 | 1 | equemene | ! 2 'LI','BE', ' B',' C',' N',' O',' F','NE', |
208 | 1 | equemene | 123.,90., 82., 77., 75., 73., 71., 69., & |
209 | 1 | equemene | ! 3 'NA','MG', 'AL','SI',' P',' S','CL','AR', |
210 | 1 | equemene | 154.,136., 118.,111.,106.,102., 99., 97., & |
211 | 1 | equemene | ! 4 ' K','CA', |
212 | 1 | equemene | 203., 174., & |
213 | 1 | equemene | ! 4 'SC','TI',' V','CR','MN','FE','CO','NI','CU','ZN', |
214 | 1 | equemene | 144.,132.,122.,118.,117.,117.,116.,115.,117.,125., & |
215 | 1 | equemene | ! 4 'GA','GE','AS','SE','BR','KR', |
216 | 1 | equemene | 120.,122.,122.,117.,114.,110., & |
217 | 1 | equemene | ! 5 'RB','SR', |
218 | 1 | equemene | 216.,191., & |
219 | 1 | equemene | ! 5 ' Y','ZR','NB','MO','TC','RU','RH','PD','AG','CD', |
220 | 1 | equemene | 162.,145.,134.,130.,127.,125.,125.,128.,134.,148., & |
221 | 1 | equemene | ! 5 'IN','SN','SB','TE',' I','XE', |
222 | 1 | equemene | 144.,140.,143.,135.,133.,130., & |
223 | 1 | equemene | ! 6 'CS','BA', |
224 | 1 | equemene | 235., 198., & |
225 | 1 | equemene | ! 6 'LA', |
226 | 1 | equemene | ! 'CE','PR','ND','PM','SM','EU','GD','TB','DY','HO', & |
227 | 1 | equemene | ! 'ER','TM','YB','LU', & |
228 | 1 | equemene | 169., & |
229 | 1 | equemene | 165., 165., 164., 163., 162., 185., 161., 159., 159., 158., & |
230 | 1 | equemene | 157., 156., 184.,156., & |
231 | 1 | equemene | ! 6 'HF','TA',' W','RE','OS','IR','PT','AU','HG', |
232 | 1 | equemene | ! 6 'TL','PB','BI','PO','AT','RN'/ |
233 | 1 | equemene | 144., 134., 130., 126., 126., 127., 120., 134., 149., & |
234 | 1 | equemene | 148., 147., 146., 146., 148., 151. /) |
235 | 1 | equemene | |
236 | 1 | equemene | REAL(KREAL) :: Mass(0:Max_Z)=(/0.0D0,1.0078D0, 4.0026D0, & |
237 | 1 | equemene | 7.0160D0, 9.0122D0,11.0093D0, & |
238 | 1 | equemene | 12.0000D0,14.0031D0,15.9949D0,18.9984D0,19.9924D0, & |
239 | 1 | equemene | 22.9898D0,23.9850D0,26.9815D0, & |
240 | 1 | equemene | 27.9769D0,30.9738D0,31.9721D0,34.9688D0,39.9624D0, & |
241 | 1 | equemene | 39.0983D0,40.08D0, & |
242 | 1 | equemene | 44.9559D0, 47.88D0, 50.9415D0, 51.996D0, 54.9380D0, & |
243 | 1 | equemene | 55.847D0, 58.9332D0, 58.69D0, 63.546D0, 65.39D0, & |
244 | 1 | equemene | 69.72D0,72.59D0,74.9216D0,78.96D0,79.904D0,83.80D0, & |
245 | 1 | equemene | 85.4678D0,87.62D0,88.9059D0,91.224D0,92.9064D0, & |
246 | 1 | equemene | 95.94D0,98D0,101.07D0,102.906D0,106.42D0,107.868D0,112.41D0, & |
247 | 1 | equemene | 114.82D0,118.71D0,121.75D0,127.60D0,126.905D0,131.29D0, & |
248 | 1 | equemene | ! 6 'CS','BA', |
249 | 1 | equemene | 132.905D0,137.34D0, & |
250 | 1 | equemene | ! 6 'LA', |
251 | 1 | equemene | ! 'CE','PR','ND','PM','SM','EU','GD', |
252 | 1 | equemene | ! 'TB','DY','HO', 'ER','TM','YB','LU', |
253 | 1 | equemene | 138.91D0, & |
254 | 1 | equemene | 140.12D0, 130.91D0, 144.24D0,147.D0,150.35D0, 151.96D0,157.25D0, & |
255 | 1 | equemene | 158.924D0, 162.50D0, 164.93D0, 167.26D0,168.93D0,173.04D0,174.97D0, & |
256 | 1 | equemene | ! 6 'HF','TA',' W','RE','OS','IR','PT', |
257 | 1 | equemene | ! 'AU','HG', |
258 | 1 | equemene | ! 6 'TL','PB','BI','PO','AT','RN'/ |
259 | 1 | equemene | 178.49D0, 180.95D0, 183.85D0, 186.2D0, 190.2D0, 192.2D0, 195.09D0, & |
260 | 1 | equemene | 196.97D0, 200.59D0, & |
261 | 1 | equemene | 204.37D0, 207.19D0,208.98D0,210.D0,210.D0,222.D0 /) |
262 | 1 | equemene | |
263 | 1 | equemene | END MODULE Path_module |