source: opeshe.f@ e40e335

Last change on this file since e40e335 was e40e335, checked in by baerbaer <baerbaer@…>, 16 years ago

Initial import to BerliOS corresponding to 3.0.4

git-svn-id: svn+ssh://svn.berlios.de/svnroot/repos/smmp/trunk@1 26dc1dd8-5c4e-0410-9ffe-d298b4865968

  • Property mode set to 100644
File size: 9.2 KB
Line 
1c **************************************************************
2c
3c This file contains the subroutines: opeshe,gdtshe
4c
5c Copyright 2003-2005 Frank Eisenmenger, U.H.E. Hansmann,
6c Shura Hayryan, Chin-Ku
7c Copyright 2007 Frank Eisenmenger, U.H.E. Hansmann,
8c Jan H. Meinke, Sandipan Mohanty
9c
10c **************************************************************
11
12 subroutine opeshe(nml)
13
14c ......................................................................
15c PURPOSE: Calculate internal energy for ECEPP/3 dataset and its partial
16c derivatives vs. variables using recursive algorithm from:
17c Noguti T, Go N, J Phys Soc (Japan) v52 3685-3690 1984; Abe H,
18c Braun W, Noguti T, Go N, Comp Chem v8 239-247 1984; Mazur A K,
19c Abagyan R A, J Biomol Struct Dyn v6 815-832, which I modified
20c for atomic forces instead of simple derivatives (see Lavery R,
21c Sklenar H, Zakrzewska K, Pullman B, J Biomol Struct Dyn v3
22c 989-1014 1986)
23c
24c CALLS: gdtshe
25c ......................................................................
26
27 include 'INCL.H'
28
29 dimension xfat(mxat),yfat(mxat),zfat(mxat),
30 # xfvr(mxvr),yfvr(mxvr),zfvr(mxvr),
31 # xfrvr(mxvr),yfrvr(mxvr),zfrvr(mxvr)
32
33
34 eyel=0.d0
35 eyvw=0.d0
36 eyhb=0.d0
37 eyvr=0.d0
38 eysm=0.d0
39
40 ntlvr=nvrml(nml)
41 if (ntlvr.eq.0) then
42 write (*,'(a,i4)')
43 # ' opeshe> No variables defined in molecule #',nml
44 return
45 endif
46
47 ifivr=ivrml1(nml)
48 ilavr=ifivr+ntlvr-1
49
50 do i=ifivr,ilavr
51 gdeyvr(i)=0.d0
52 xfvr(i)=0.d0
53 yfvr(i)=0.d0
54 zfvr(i)=0.d0
55 xfrvr(i)=0.d0
56 yfrvr(i)=0.d0
57 zfrvr(i)=0.d0
58 enddo
59
60 do i=iatrs1(irsml1(nml)),iatrs2(irsml2(nml))
61 xfat(i)=0.d0
62 yfat(i)=0.d0
63 zfat(i)=0.d0
64 enddo
65
66 i1s=imsml1(nml)+nmsml(nml)
67 i1a=iadml1(nml)+nadml(nml)
68
69 do io=ilavr,ifivr,-1 ! ______ loop over variables in desc. order
70
71 iv=iorvr(io) ! index of var.
72
73 ia=iatvr(iv) ! prim.mv.at
74 ib=iowat(ia) ! base
75
76 xb=xat(ib)
77 yb=yat(ib)
78 zb=zat(ib)
79
80 it=ityvr(iv) ! type
81 ic=iclvr(iv) ! class
82
83 fvr=0.d0
84
85 if (it.eq.3) then ! torsion
86
87 ex=xtoat(ib)
88 ey=ytoat(ib)
89 ez=ztoat(ib)
90
91 vr=toat(ia)
92 e0=e0to(ic)
93
94 if (e0.ne.0.d0) then
95 vrn=vr*rnto(ic)
96 eyvr=eyvr+e0*(1.d0+sgto(ic)*cos(vrn))
97 fvr=esnto(ic)*sin(vrn) ! FORCE from variable
98 endif
99
100 elseif (it.eq.2) then ! b.angle
101
102 ex=xbaat(ia)
103 ey=ybaat(ia)
104 ez=zbaat(ia)
105
106 vr=baat(ia)
107
108 elseif (it.eq.1) then ! b.length
109
110 ex=xtoat(ia)
111 ey=ytoat(ia)
112 ez=ztoat(ia)
113
114 vr=blat(ia)
115
116 endif
117
118c ============================================ Energies & Atomic forces
119
120 xfiv=0.d0
121 yfiv=0.d0
122 zfiv=0.d0
123 xfriv=0.d0
124 yfriv=0.d0
125 zfriv=0.d0
126
127 i2s=i1s-1 ! last m.s per 'iv'
128 i1s=imsvr1(iv) ! 1st m.s
129
130 do ims=i1s,i2s ! __ loop over m.s
131
132 i1=latms1(ims)
133 i2=latms2(ims)
134
135 do i=i1,i2 ! __ loop over atoms i ===================
136
137 ity=ityat(i)
138 cqi=conv*cgat(i)
139
140 xi=xat(i)
141 yi=yat(i)
142 zi=zat(i)
143
144 xfi=xfat(i)
145 yfi=yfat(i)
146 zfi=zfat(i)
147
148 do ivw=ivwat1(i),ivwat2(i) ! loop over vdW-domains of 'i'
149
150 do j=lvwat1(ivw),lvwat2(ivw) ! atoms j
151
152 jty=ityat(j)
153
154 xij=xat(j)-xi
155 yij=yat(j)-yi
156 zij=zat(j)-zi
157
158 rij2=xij*xij+yij*yij+zij*zij
159 rij4=rij2*rij2
160 rij6=rij4*rij2
161 rij = sqrt(rij2)
162
163 if (epsd) then
164
165 sr=slp*rij
166 sr2=sr*sr
167 xsr=(plt-1.d0)*exp(-sr)/2.d0
168 ep=plt-(sr2+2.d0*sr+2.d0)*xsr
169 eel=cqi*cgat(j)/(rij*ep)
170 deel=eel+cqi*cgat(j)*(slp*sr2*xsr)/(ep*ep)
171
172 else
173
174 eel=cqi*cgat(j)/rij
175 deel=eel
176
177 endif
178
179 eyel=eyel+eel
180
181 if (ihbty(ity,jty).ne.0) then
182 eyrp=ahb(ity,jty)/(rij6*rij6)
183 eyds=chb(ity,jty)/(rij6*rij4)
184 eyhb=eyhb+eyrp-eyds
185 c=(-12.d0*eyrp+10.d0*eyds-deel)/rij2
186 else
187 eyrp=aij(ity,jty)/(rij6*rij6)
188 eyds=cij(ity,jty)/rij6
189 eyvw=eyvw+eyrp-eyds
190 c=(-12.d0*eyrp+6.d0*eyds-deel)/rij2
191 endif
192
193 xfji=c*xij
194 yfji=c*yij
195 zfji=c*zij
196
197 xfi=xfi+xfji
198 yfi=yfi+yfji
199 zfi=zfi+zfji
200
201 xfat(j)=xfat(j)-xfji
202 yfat(j)=yfat(j)-yfji
203 zfat(j)=zfat(j)-zfji
204
205 enddo ! ... atoms j
206 enddo ! ... vdW-domains of i
207
208 do i14=i14at1(i),i14at2(i) ! loop over 1-4 partn. of 'i'
209 j=l14at(i14)
210
211 jty=ityat(j)
212
213 xij=xat(j)-xi
214 yij=yat(j)-yi
215 zij=zat(j)-zi
216
217 rij2=xij*xij+yij*yij+zij*zij
218 rij4=rij2*rij2
219 rij6=rij4*rij2
220 rij = sqrt(rij2)
221
222 if (epsd) then
223
224 sr=slp*rij
225 sr2=sr*sr
226 xsr=(plt-1.d0)*exp(-sr)/2.d0
227 ep=plt-(sr2+2.d0*sr+2.d0)*xsr
228 eel=cqi*cgat(j)/(rij*ep)
229 deel=eel+cqi*cgat(j)*(slp*sr2*xsr)/(ep*ep)
230
231 else
232
233 eel=cqi*cgat(j)/rij
234 deel=eel
235
236 end if
237
238 eyel=eyel+eel
239
240 if (ihbty(ity,jty).ne.0) then
241 eyrp=ahb(ity,jty)/(rij6*rij6)
242 eyds=chb(ity,jty)/(rij6*rij4)
243 eyhb=eyhb+eyrp-eyds
244 c=(-12.d0*eyrp+10.d0*eyds-deel)/rij2
245 else
246 eyrp=a14(ity,jty)/(rij6*rij6)
247 eyds=cij(ity,jty)/rij6
248 eyvw=eyvw+eyrp-eyds
249 c=(-12.d0*eyrp+6.d0*eyds-deel)/rij2
250 endif
251
252 xfji=c*xij
253 yfji=c*yij
254 zfji=c*zij
255
256 xfi=xfi+xfji
257 yfi=yfi+yfji
258 zfi=zfi+zfji
259
260 xfat(j)=xfat(j)-xfji
261 yfat(j)=yfat(j)-yfji
262 zfat(j)=zfat(j)-zfji
263
264 enddo ! ... 1-4-partners of i
265
266 xfat(i)=xfi
267 yfat(i)=yfi
268 zfat(i)=zfi
269
270 xfiv=xfiv + xfi
271 yfiv=yfiv + yfi
272 zfiv=zfiv + zfi
273
274 xfriv=xfriv + yfi*zi-zfi*yi
275 yfriv=yfriv + zfi*xi-xfi*zi
276 zfriv=zfriv + xfi*yi-yfi*xi
277
278 enddo ! ... atoms i
279 enddo ! ... m.s.
280
281 i2a=i1a-1 ! last 'added' var.
282 i1a=iadvr1(iv) ! 1st 'added' var.
283
284 do iad=i1a,i2a
285 lad=ladvr(iad)
286
287 xfiv=xfiv+xfvr(lad)
288 yfiv=yfiv+yfvr(lad)
289 zfiv=zfiv+zfvr(lad)
290 xfriv=xfriv+xfrvr(lad)
291 yfriv=yfriv+yfrvr(lad)
292 zfriv=zfriv+zfrvr(lad)
293 enddo
294
295 xfvr(iv)=xfiv
296 yfvr(iv)=yfiv
297 zfvr(iv)=zfiv
298 xfrvr(iv)=xfriv
299 yfrvr(iv)=yfriv
300 zfrvr(iv)=zfriv
301
302 if (it.eq.3.or.it.eq.2) then ! torsion,b.angle
303
304 gdeyvr(iv)= (ey*zb-ez*yb)*xfiv+(ez*xb-ex*zb)*yfiv+
305 # (ex*yb-ey*xb)*zfiv
306 # +ex*xfriv+ey*yfriv+ez*zfriv -fvr
307
308 elseif (it.eq.1) then ! b.length
309
310 gdeyvr(iv)= -(ex*xfiv+ey*yfiv+ez*zfiv) -fvr
311
312 endif
313
314 if (tesgrd) call gdtshe(nml,iv)
315
316 enddo ! ... variables
317
318 eysm= eyel+eyvw+eyhb+eyvr
319
320 return
321 end
322c *****************************
323 subroutine gdtshe(nml,iv)
324
325c .....................................................................
326c PURPOSE: calculate partial derivative of internal energy for molecule
327c 'nml' vs. variable 'iv' NUMERICALLY and compare with
328c its value obtained analytically
329c
330c CALLS: setvar, enyshe
331c .....................................................................
332
333 include 'INCL.H'
334
335 parameter (del=1.d-7)
336
337 dimension vlvrx(mxvr)
338
339c ____________________________ get & save values of variables
340 do i=1,ivrml1(ntlml)+nvrml(ntlml)-1
341 it=ityvr(i) ! type
342 if (it.eq.3) then ! torsion
343 vlvrx(i)=toat(iatvr(i))
344 elseif (it.eq.2) then ! b.angle
345 vlvrx(i)=baat(iatvr(i))
346 elseif (it.eq.1) then ! b.length
347 vlvrx(i)=blat(iatvr(i))
348 endif
349 enddo
350
351 ovr=vlvrx(iv)
352 eyol=enyshe(nml)
353
354 vlvrx(iv)=ovr+del ! change variable 'iv' by 'del'
355 call setvar(nml,vlvrx)
356 eynw=enyshe(nml) ! new energy
357
358 gdn=(eynw-eyol)/del ! numerical derivative
359 gda=gdeyvr(iv) ! analytical der.
360
361 write (*,'(1x,2a,2(e12.6,a))') nmvr(iv),': ',gda,' (',
362 # abs(gda-gdn),')'
363
364c _________________________ restore
365 vlvrx(iv)=ovr
366 call setvar(nml,vlvrx)
367
368 return
369 end
370
Note: See TracBrowser for help on using the repository browser.