source: opesol.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: 7.8 KB
Line 
1! **************************************************************
2!
3! This file contains the subroutines: opesol,gdtsol
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 opesol(nml)
13
14! ......................................................................
15! PURPOSE: derivatives of solvatation energy vs. internal variables for
16! molecule 'nml'
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: esolan, gdtsol
31! ......................................................................
32
33 include 'INCL.H'
34 double precision xfvr, yfvr, zfvr, xfrvr, yfrvr, zfrvr, esolan, dx
35 double precision dy, dz, xfat, yfat, zfat, xi, yi, zi, xfrat
36 double precision yfrat, zfrat, xb, yb, zb, ex, ey, ez, xfiv, yfiv
37 double precision zfiv, xfriv, yfriv, zfriv
38
39 integer ntlvr, nml, ix2, ifivr, ilavr, i, i1s, i1a, io, iv, it, ia
40 integer ib, i2s, ims, i1, i2, i2a, iad, lad, ivw, j, i14
41
42 dimension xfat(mxat),yfat(mxat),zfat(mxat),
43 & xfrat(mxat),yfrat(mxat),zfrat(mxat),
44
45 & xfvr(mxvr),yfvr(mxvr),zfvr(mxvr),
46 & xfrvr(mxvr),yfrvr(mxvr),zfrvr(mxvr)
47
48 logical lnb
49
50
51 ntlvr=nvrml(nml)
52 if (ntlvr.eq.0) then
53 write (logString, '(a,i4)')
54 & ' opesol> No variables defined in molecule #',nml
55 return
56 endif
57
58 ix2=ixrfpt(2,nml) ! as indicator for situation noted above
59
60 ifivr=ivrml1(nml) ! 1st var. &
61 ilavr=ifivr+ntlvr-1 ! last var. of 'nml'
62
63 do i=ifivr,ilavr ! variables of 'nml'
64 gdeysl(i)=0.d0
65 xfvr(i)=0.d0
66 yfvr(i)=0.d0
67 zfvr(i)=0.d0
68 xfrvr(i)=0.d0
69 yfrvr(i)=0.d0
70 zfrvr(i)=0.d0
71 enddo
72
73 eysl = esolan(nml)
74
75! -------------------------------------------------- f & g for atoms
76
77 do i=iatrs1(irsml1(nml)),iatrs2(irsml2(nml))
78
79 dx = -gradan(i,1) ! f = - sigma * dA(r)/dr ( calc. in esolan() )
80 dy = -gradan(i,2)
81 dz = -gradan(i,3)
82
83 xfat(i) = dx
84 yfat(i) = dy
85 zfat(i) = dz
86
87 xi = xat(i)
88 yi = yat(i)
89 zi = zat(i)
90
91 xfrat(i) = dy*zi-dz*yi ! g = f x r
92 yfrat(i) = dz*xi-dx*zi !
93 zfrat(i) = dx*yi-dy*xi !
94
95 enddo
96
97 i1s=imsml1(nml)+nmsml(nml) ! last mov. set of 'nml' + 1
98 i1a=iadml1(nml)+nadml(nml) ! last added var. of 'nml' + 1
99
100 do io=ilavr,ifivr,-1 ! ______ loop over vars in desc. order
101
102 lnb = .false. ! = true, if situation noted above takes place
103
104 iv=iorvr(io) ! index,
105 it=ityvr(iv) ! type,
106 ia=iatvr(iv) ! primary mov. atom,
107 ib=iowat(ia) ! "base" of current var.
108
109 xb=xat(ib)
110 yb=yat(ib)
111 zb=zat(ib)
112
113 if (it.eq.3) then ! torsion
114
115 ex=xtoat(ib)
116 ey=ytoat(ib)
117 ez=ztoat(ib)
118
119 if (ib.eq.ix2) lnb = .true.
120
121 elseif (it.eq.2) then ! b.angle
122
123 ex=xbaat(ia)
124 ey=ybaat(ia)
125 ez=zbaat(ia)
126
127 if (ib.eq.ix2) lnb = .true.
128
129 elseif (it.eq.1) then ! b.length
130
131 ex=xtoat(ia)
132 ey=ytoat(ia)
133 ez=ztoat(ia)
134
135 if (ia.eq.ix2) lnb = .true.
136
137 endif
138
139 xfiv=0.d0
140 yfiv=0.d0
141 zfiv=0.d0
142 xfriv=0.d0
143 yfriv=0.d0
144 zfriv=0.d0
145
146 if (.not.lnb) then
147
148 i2s=i1s-1 ! last m.s &
149 i1s=imsvr1(iv) ! 1st m.s for var. index 'iv'
150
151 do ims=i1s,i2s ! __ loop over moving sets
152
153 i1=latms1(ims) ! 1st &
154 i2=latms2(ims) ! last mov. atom in mov. set 'ims'
155
156 do i=i1,i2 ! __ loop over atoms i ===================
157
158 xfiv = xfiv + xfat(i) ! f
159 yfiv = yfiv + yfat(i) !
160 zfiv = zfiv + zfat(i) !
161
162 xfriv = xfriv + xfrat(i) ! g
163 yfriv = yfriv + yfrat(i) !
164 zfriv = zfriv + zfrat(i) !
165
166 enddo ! ... atoms i
167 enddo ! ... m.s.
168
169 i2a=i1a-1 ! last &
170 i1a=iadvr1(iv) ! 1st 'added' var. for 'iv'
171
172 do iad=i1a,i2a ! loop over add. var.
173
174 lad=ladvr(iad)
175
176 xfiv = xfiv + xfvr(lad)
177 yfiv = yfiv + yfvr(lad)
178 zfiv = zfiv + zfvr(lad)
179 xfriv = xfriv + xfrvr(lad)
180 yfriv = yfriv + yfrvr(lad)
181 zfriv = zfriv + zfrvr(lad)
182
183 enddo
184
185 else
186
187 do ivw=ivwat1(ia),ivwat2(ia) ! vdW-domains of 'ia'
188 do j=lvwat1(ivw),lvwat2(ivw) ! .. their atoms
189
190 xfiv = xfiv - xfat(j)
191 yfiv = yfiv - yfat(j)
192 zfiv = zfiv - zfat(j)
193
194 xfriv = xfriv - xfrat(j)
195 yfriv = yfriv - yfrat(j)
196 zfriv = zfriv - zfrat(j)
197
198 enddo
199 enddo
200
201 do i14=i14at1(ia),i14at2(ia) ! 1-4 partn. of 'ia'
202 j=l14at(i14)
203
204 xfiv = xfiv - xfat(j)
205 yfiv = yfiv - yfat(j)
206 zfiv = zfiv - zfat(j)
207
208 xfriv = xfriv - xfrat(j)
209 yfriv = yfriv - yfrat(j)
210 zfriv = zfriv - zfrat(j)
211
212 enddo
213
214 endif
215
216 xfvr(iv) = xfiv
217 yfvr(iv) = yfiv
218 zfvr(iv) = zfiv
219 xfrvr(iv) = xfriv
220 yfrvr(iv) = yfriv
221 zfrvr(iv) = zfriv
222
223 if (it.eq.3.or.it.eq.2) then ! torsion,b.angle
224
225 gdeysl(iv)= (ey*zb-ez*yb)*xfiv+(ez*xb-ex*zb)*yfiv+
226 & (ex*yb-ey*xb)*zfiv
227 & +ex*xfriv+ey*yfriv+ez*zfriv
228
229 elseif (it.eq.1) then ! b.length
230
231 gdeysl(iv)= -(ex*xfiv+ey*yfiv+ez*zfiv)
232
233 endif
234
235 if (tesgrd) call gdtsol(nml,iv)
236
237 enddo ! ... variables in desc. order
238
239 return
240 end
241! *****************************
242 subroutine gdtsol(nml,iv)
243
244! .....................................................................
245! PURPOSE: calculate partial derivative of solvation energy for molecule
246! 'nml' vs. variable 'iv' NUMERICALLY and compare with
247! its value obtained analytically
248!
249! CALLS: setvar, esolan
250! .....................................................................
251
252 include 'INCL.H'
253
254 double precision del, vlvrx, ovr, eynw, esolan, gda, gdn
255
256 integer i, it, iv, nml
257
258
259 parameter (del=1.d-6)
260
261 dimension vlvrx(mxvr)
262
263
264! ____________________________ get & save values of variables
265 do i=1,ivrml1(ntlml)+nvrml(ntlml)-1
266 it=ityvr(i) ! type
267 if (it.eq.3) then ! torsion
268 vlvrx(i)=toat(iatvr(i))
269 elseif (it.eq.2) then ! b.angle
270 vlvrx(i)=baat(iatvr(i))
271 elseif (it.eq.1) then ! b.length
272 vlvrx(i)=blat(iatvr(i))
273 endif
274 enddo
275
276 ovr=vlvrx(iv)
277
278 vlvrx(iv)=ovr+del ! change variable 'iv' by 'del'
279 call setvar(nml,vlvrx)
280
281 eynw=esolan(nml)
282 gda=gdeysl(iv)
283 gdn=(eynw-eysl)/del ! numerical derivative
284
285 write (logString, '(1x,2a,2(e12.6,a))') nmvr(iv),': ',gda,' (',
286 & abs(gda-gdn),')'
287
288! _________________________ restore vars
289 vlvrx(iv)=ovr
290
291 call setvar(nml,vlvrx)
292
293 return
294 end
295
Note: See TracBrowser for help on using the repository browser.