source: opereg.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: 10.3 KB
Line 
1! **************************************************************
2!
3! This file contains the subroutines: opereg,gdtgbl,gdtreg
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 opereg(nml)
13
14! .......................................................................
15! PURPOSE: calculate regul. energy & it's partial derivatives
16! for molecule 'nml' vs. variables 'iv'
17!
18! NB: if the unit axis for an internal variable coincides with a
19! global axis (i.e. for torsion or bond length variation round
20! or along 'xrfax', respectively, and bd. angle var. round
21! 'zrfax'): VdW & 14 interaction partners of moving set atoms
22! should be used for calculation, instead of the mov. sets,
23! with opposite sign.
24!
25! Example: By the the way the molecule-fixed system is set up,
26! changes in Phi_1 affect atomic positions BEFORE the
27! N-C^alpha bond relatively to the space-fixed system,
28! not the moving set of Phi_1.
29!
30! CALLS: gdtgbl, gdtreg
31! ......................................................................
32
33 include 'INCL.H'
34 include 'INCP.H'
35
36 double precision xfvr, yfvr, zfvr, xfrvr, yfrvr, zfrvr, x1, y1, z1
37 double precision a, sa, ca, xk, yk, zk, xi, yi, zi, xji, yji, zji
38 double precision dx, dy, dz, x, y, z, xfat, yfat, zfat, xfrat
39 double precision yfrat, zfrat, xb, yb, zb, ex, ey, ez, xfiv, yfiv
40 double precision zfiv, xfriv, yfriv, zfriv
41
42 integer ntlvr, nml, ix2, ifivr, ilavr, i, ii, j, i1s, i1a, io, iv
43 integer it, ia, ib, i2s, ims, i1, i2, i2a, iad, lad, ivw, i14
44
45 dimension xfat(mxat),yfat(mxat),zfat(mxat),
46 & xfrat(mxat),yfrat(mxat),zfrat(mxat),
47
48 & xfvr(mxvr),yfvr(mxvr),zfvr(mxvr),
49 & xfrvr(mxvr),yfrvr(mxvr),zfrvr(mxvr)
50
51 logical lnb
52
53
54 ntlvr=nvrml(nml)
55 if (ntlvr.eq.0) then
56 write (logString, '(a,i4)')
57 & ' opereg> No variables defined in molecule #',nml
58 return
59 endif
60
61 ix2=ixrfpt(2,nml) ! as indicator for situation noted above
62
63 ifivr=ivrml1(nml) ! 1st var. &
64 ilavr=ifivr+ntlvr-1 ! last var. of 'nml'
65
66! --------------------------- initializations
67 do i=ifivr,ilavr
68 gdeyrg(i)=0.d0
69 xfvr(i)=0.d0
70 yfvr(i)=0.d0
71 zfvr(i)=0.d0
72 xfrvr(i)=0.d0
73 yfrvr(i)=0.d0
74 zfrvr(i)=0.d0
75 enddo
76
77 ii=(nml-1)*6
78
79 do i=ii+1,ii+6
80 gdeygb(i) = 0.d0
81 enddo
82
83 x1=rfpt(1,nml) ! r_1
84 y1=rfpt(2,nml)
85 z1=rfpt(3,nml)
86
87 a= gbpr(4,nml) ! alpha
88 sa = sin(a)
89 ca = cos(a)
90
91 xk = yrfax(1,nml) ! axis K
92 yk = yrfax(2,nml)
93 zk = yrfax(3,nml)
94
95 eyrg = 0.d0
96
97 do i=iatrs1(irsml1(nml)),iatrs2(irsml2(nml))
98
99 j = ixatp(i)
100 if (j.gt.0) then
101
102 xi = xat(i) ! position of atom in internal model
103 yi = yat(i)
104 zi = zat(i)
105
106 xji = xatp(j) - xi ! x distance between internal model and PDB
107 yji = yatp(j) - yi
108 zji = zatp(j) - zi
109
110 eyrg = eyrg + xji**2 + yji**2 + zji**2 ! The regularization energy is just
111 ! the sum over the atom distances
112 ! squared.
113
114 dx = 2.d0 * xji ! f = - dE/dR_i
115 dy = 2.d0 * yji ! The factor of 2 comes from the derivative
116 dz = 2.d0 * zji
117
118! =============================================== global pars.
119
120 gdeygb(ii+1) = gdeygb(ii+1) - dx ! d(E_ij) / d(x_i)
121 gdeygb(ii+2) = gdeygb(ii+2) - dy ! d(E_ij) / d(y_i)
122 gdeygb(ii+3) = gdeygb(ii+3) - dz ! d(E_ij) / d(z_i)
123
124! -------------------------- r = r_i - r_1
125 x = xi - x1
126 y = yi - y1
127 z = zi - z1
128
129 gdeygb(ii+4) = gdeygb(ii+4) +dx*y-dy*x ! d(E_ij) / d(a)
130
131 gdeygb(ii+5) = gdeygb(ii+5) +z*(dy*ca-dx*sa)+dz*(x*sa-y*ca) ! d(E_ij) / d(b)
132
133 gdeygb(ii+6) = gdeygb(ii+6) +dx*(zk*y-yk*z)+dy*(xk*z-zk*x) ! d(E_ij) / d(g)
134 & +dz*(yk*x-xk*y)
135
136! =============================================== for internal vars.
137
138 xfat(i) = dx
139 yfat(i) = dy
140 zfat(i) = dz
141
142 xfrat(i) = dy*zi-dz*yi ! g = f x r
143 yfrat(i) = dz*xi-dx*zi !
144 zfrat(i) = dx*yi-dy*xi !
145
146 else
147 xfat(i) = 0.d0
148 yfat(i) = 0.d0
149 zfat(i) = 0.d0
150 xfrat(i) = 0.d0
151 yfrat(i) = 0.d0
152 zfrat(i) = 0.d0
153 endif
154
155 enddo ! atoms
156
157 if (tesgrd) call gdtgbl(nml)
158
159 i1s=imsml1(nml)+nmsml(nml) ! last mov. set of 'nml' + 1
160 i1a=iadml1(nml)+nadml(nml) ! last added var. of 'nml' + 1
161
162 do io=ilavr,ifivr,-1 ! ______ loop over vars in desc. order
163
164 lnb = .false. ! = true, if situation noted above takes place
165
166 iv=iorvr(io) ! index,
167 it=ityvr(iv) ! type,
168 ia=iatvr(iv) ! primary mov. atom,
169 ib=iowat(ia) ! "base" of current var.
170
171 xb=xat(ib)
172 yb=yat(ib)
173 zb=zat(ib)
174
175! ---------------------------------------- axis for var.
176
177 if (it.eq.3) then ! torsion
178
179 ex= xtoat(ib)
180 ey= ytoat(ib)
181 ez= ztoat(ib)
182
183 if (ib.eq.ix2) lnb = .true.
184
185 elseif (it.eq.2) then ! b.angle
186
187 ex= xbaat(ia)
188 ey= ybaat(ia)
189 ez= zbaat(ia)
190
191 if (ib.eq.ix2) lnb = .true.
192
193 elseif (it.eq.1) then ! b.length
194
195 ex=xtoat(ia)
196 ey=ytoat(ia)
197 ez=ztoat(ia)
198
199 if (ia.eq.ix2) lnb = .true.
200
201 endif
202
203 xfiv=0.0
204 yfiv=0.0
205 zfiv=0.0
206 xfriv=0.0
207 yfriv=0.0
208 zfriv=0.0
209
210 if (.not.lnb) then
211
212 i2s=i1s-1 ! last m.s &
213 i1s=imsvr1(iv) ! 1st m.s for var. index 'iv'
214
215 do ims=i1s,i2s ! __ loop over moving sets
216
217 i1=latms1(ims) ! 1st &
218 i2=latms2(ims) ! last mov. atom in mov. set 'ims'
219
220 do i=i1,i2 ! __ loop over atoms i ===================
221
222 xfiv = xfiv + xfat(i) ! f
223 yfiv = yfiv + yfat(i) !
224 zfiv = zfiv + zfat(i) !
225
226 xfriv = xfriv + xfrat(i) ! g
227 yfriv = yfriv + yfrat(i) !
228 zfriv = zfriv + zfrat(i) !
229
230 enddo ! ... atoms i
231 enddo ! ... m.s.
232
233 i2a=i1a-1 ! last &
234 i1a=iadvr1(iv) ! 1st 'added' var. for 'iv'
235
236 do iad=i1a,i2a ! loop over add. var.
237
238 lad=ladvr(iad)
239
240 xfiv = xfiv + xfvr(lad)
241 yfiv = yfiv + yfvr(lad)
242 zfiv = zfiv + zfvr(lad)
243 xfriv = xfriv + xfrvr(lad)
244 yfriv = yfriv + yfrvr(lad)
245 zfriv = zfriv + zfrvr(lad)
246
247 enddo
248
249 else
250
251 do ivw=ivwat1(ia),ivwat2(ia) ! vdW-domains of 'ia'
252 do j=lvwat1(ivw),lvwat2(ivw) ! .. their atoms
253
254 xfiv = xfiv - xfat(j)
255 yfiv = yfiv - yfat(j)
256 zfiv = zfiv - zfat(j)
257
258 xfriv = xfriv - xfrat(j)
259 yfriv = yfriv - yfrat(j)
260 zfriv = zfriv - zfrat(j)
261
262 enddo
263 enddo
264
265 do i14=i14at1(ia),i14at2(ia) ! 1-4 partn. of 'ia'
266 j=l14at(i14)
267
268 xfiv = xfiv - xfat(j)
269 yfiv = yfiv - yfat(j)
270 zfiv = zfiv - zfat(j)
271
272 xfriv = xfriv - xfrat(j)
273 yfriv = yfriv - yfrat(j)
274 zfriv = zfriv - zfrat(j)
275
276 enddo
277
278 endif
279
280 xfvr(iv) = xfiv
281 yfvr(iv) = yfiv
282 zfvr(iv) = zfiv
283 xfrvr(iv) = xfriv
284 yfrvr(iv) = yfriv
285 zfrvr(iv) = zfriv
286
287 if (it.eq.3.or.it.eq.2) then ! torsion,b.angle
288
289 gdeyrg(iv)= (ey*zb-ez*yb)*xfiv+(ez*xb-ex*zb)*yfiv+
290 & (ex*yb-ey*xb)*zfiv
291 & +ex*xfriv+ey*yfriv+ez*zfriv
292
293 elseif (it.eq.1) then ! b.length
294
295 gdeyrg(iv)= -(ex*xfiv+ey*yfiv+ez*zfiv)
296
297 endif
298
299 if (tesgrd) call gdtreg(nml,iv)
300
301 enddo ! ... variables in desc. order
302
303 return
304 end
305! **************************
306 subroutine gdtgbl(nml)
307!
308! CALLS: bldmol,enyreg
309!
310! -------------------------- gradtest for 'gbpr'
311
312 include 'INCL.H'
313
314 double precision del, pro, gdn, enyreg
315
316 integer ii, nml, i
317
318 parameter (del=1.d-7)
319
320
321 ii=(nml-1)*6
322
323 do i = 1,6
324
325! ----------------------------- modify
326 pro = gbpr(i,nml)
327 gbpr(i,nml) = pro+del
328 call bldmol(nml)
329
330 gdn = ( enyreg(nml) - eyrg ) / del
331
332 write (logString, *) ' Gb. var #',(ii+i),': ',gdeygb(ii+i),gdn,
333 & abs(gdn-gdeygb(ii+i))
334! ----------------------------- restore
335 gbpr(i,nml) = pro
336 call bldmol(nml)
337
338 enddo ! pars.
339
340 return
341 end
342! *****************************
343 subroutine gdtreg(nml,iv)
344
345! .................................................................
346! PURPOSE: calculate partial derivative of reg. energy for molecule
347! 'nml' vs. variable 'iv' NUMERICALLY and compare with
348! its value obtained analytically
349!
350! CALLS: setvar, enyreg
351! .................................................................
352
353 include 'INCL.H'
354
355 double precision del, vlvrx, ovr, eynw, enyreg, gdn, gda
356
357 integer i, it, iv, nml
358
359 parameter (del=1.d-6)
360
361 dimension vlvrx(mxvr)
362
363! ____________________________ get & save values of variables
364 do i=1,ivrml1(ntlml)+nvrml(ntlml)-1
365 it=ityvr(i) ! type
366 if (it.eq.3) then ! torsion
367 vlvrx(i)=toat(iatvr(i))
368 elseif (it.eq.2) then ! b.angle
369 vlvrx(i)=baat(iatvr(i))
370 elseif (it.eq.1) then ! b.length
371 vlvrx(i)=blat(iatvr(i))
372 endif
373 enddo
374
375 ovr=vlvrx(iv)
376 vlvrx(iv)=ovr+del ! change variable 'iv' by 'del'
377 call setvar(nml,vlvrx)
378
379 eynw=enyreg(nml)
380
381 gdn=(eynw-eyrg)/del ! numerical derivative
382 gda=gdeyrg(iv) ! analytical der.
383
384 write (logString, '(1x,2a,2(e12.6,a))') nmvr(iv),': ',gda,' (',
385 & abs(gda-gdn),')'
386
387! _________________________ restore vars
388 vlvrx(iv)=ovr
389 call setvar(nml,vlvrx)
390
391 return
392 end
393
Note: See TracBrowser for help on using the repository browser.