source: opereg.f@ bd2278d

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

Reformatting comments and continuation marks.

Fortran 90 and higher use ! to mark comments no matter where they are in the
code. The only valid continuation marker is &.
I also added the SMMP.kdevelop.filelist to the repository to make it easier
to use kdevelop.

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

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