source: opeshe.f

Last change on this file was 38d77eb, checked in by baerbaer <baerbaer@…>, 14 years ago

Redirected standard out to logString.

SMMP produced a lot of log messages. This became an issue when run in massively
parallel environments. I replaced all writes to standard out to a write to logString.
The next step is to pass this string to a function that writes the messages to a log
file according to their importance and the chosen log level.

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

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