source: minim.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: 8.0 KB
RevLine 
[bd2278d]1! **************************************************************
2!
3! This file contains the subroutines: minim,move
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! **************************************************************
[e40e335]11
12
13 subroutine minim(imin, maxit, eps)
14
[bd2278d]15! ......................................................................
16! PURPOSE: Use minimizers
17!
18! imin = 1: use Quasi-Newton
19! imin = 2: use Conjugated Gradients
20!
21! @param maxit maximum number of iterations
22! @param eps acceptance criterium
23!Institute
24! CALLS: difang,energy,gradient, mincjg,minqsn, nursvr
25! ......................................................................
[e40e335]26
27 include 'INCL.H'
[bd2278d]28!f2py intent(in) imin
29!f2py intent(in) maxit
30!f2py intent(in) eps
[2019dff]31 integer msvmx
32
33 integer imin
34
35 integer maxit
36
37 integer nursvr
38 double precision energy, difang
39
40 integer ngbvr, msv, i, j, mxop, n6, n3, n, n1, n2, n5, n4
41 integer ntlvr, nop, nv
42
43 double precision eps, acc, esm, gdey2, gbpro, gdvr, gdrg2, scl
44 double precision vlvrn, w, vlvro, vr
45
[e40e335]46 parameter (msvmx=mxvr*(mxvr+5)/(2*(2*mxvr+1)),
[bd2278d]47 & msv = 50 )
[e40e335]48
49 dimension w(mxvr*(mxvr+13)/2)
50
51 dimension vlvrn(mxvr),vlvro(mxvr),gdvr(mxvr),scl(mxvr)
52
[bd2278d]53! --------------------------- new
[e40e335]54 dimension gbpro(6,mxml)
55
56 mxop=maxit
57 acc=eps
58
59 if (msv.gt.msvmx) then
[38d77eb]60 write (logString, '(a,i5)') ' minreg> parameter MSV > ',msvmx
[e40e335]61 stop
62 endif
63
[bd2278d]64! ----------------------- energy & gradient
[e40e335]65
66 call gradient()
67
[38d77eb]68 write (logString, '(/,a,/)') ' Energy BEFORE minimization:'
[e40e335]69
70 if (ireg.eq.0) then
71
[38d77eb]72 write (logString, '(a,e12.5,/,3(a,e11.4),/,2(a,e11.4),/)')
73 & ' Total: ', eysm,
[bd2278d]74 & ' Coulomb: ',eyel,' Lennard-Jones: ',eyvw,' HB: ',eyhb,
75 & ' Variables: ',eyvr,' Solvatation: ',eysl
[e40e335]76
77 else
78
79
[38d77eb]80 write (logString, '(a,e12.5,/,3(a,e11.4),/,3(a,e11.4),/)')
81 & ' Total: ', wtey*eysm + wtrg*eyrg,
[bd2278d]82 & ' Coulomb: ',eyel,' Lennard-Jones: ',eyvw,' HB: ',eyhb,
83 & ' Variables: ',eyvr,' Solvatation: ',eysl,
84 & ' Regularization: ',eyrg
[e40e335]85
86 endif
87
[bd2278d]88! --------------------------------------- variables
[e40e335]89
90 ntlvr=ivrml1(ntlml)+nvrml(ntlml)-1
91 nv=0
92
93 gdey2=0.d0
94 gdrg2=0.d0
95
96 do i=1,ntlvr
97 if (.not.fxvr(i)) then
98
99 nv=nv+1
100
101 vlvrn(nv) = vlvr(i)
102
103 scl(nv) = 1.d0 ! scale grad_i
104
105 if (ireg.eq.0) then
106 gdvr(nv) = gdeyvr(i)
107 else
108 gdvr(nv) = wtey*gdeyvr(i)+wtrg*gdeyrg(i)
109 gdrg2 = gdrg2+gdeyrg(i)**2
110 endif
111
112 gdey2=gdey2+gdeyvr(i)**2
113
114 endif
115
116 vlvro(i)=vlvr(i)
117 enddo
118
119 n=nv
120
121 if (ireg.eq.0) then
122
123 esm=eysm
124
125 else
126
127 ngbvr=0
128
129 do i=1,ntlml
130 do j=1,6
131
132 n=n+1
133 ngbvr=ngbvr+1
134
135 vlvrn(n) = gbpr(j,i)
136 scl(n) = 1.d0 ! Scale
137
138 gbpro(j,i) = gbpr(j,i) ! save
139
140 gdvr(n) = wtrg*gdeygb(ngbvr)
141
142 gdrg2=gdrg2+gdeygb(ngbvr)**2
143 enddo
144 enddo
145
[bd2278d]146! if (abs(wtrg-1.d0).gt.1.d-4.and.abs(wtey-1.d0).gt.1.d-4) then
147! gdey2 = max(acc,gdey2)
148! gdrg2 = max(acc,gdrg2)
149! wtrg = wtrg * sqrt(gdey2/gdrg2)
[38d77eb]150! write (logString, *) ' --> Wt_energy = ',wtey,' Wt_regul. = ',wtrg
151! write (logString, *) ' '
[bd2278d]152! endif
[e40e335]153
154 esm=wtey*eysm+wtrg*eyrg
155
156 endif
157
158
159 if (imin.eq.1) then ! Quasi-Newton
160
161 n1=1+(n*(n+1))/2
162 n2=n1+n
163 n3=n2+n
164 n4=n3+n
165 n5=n4+n
166 n6=n5+n
167
168 call minqsn(n,mxvr,vlvrn,esm,gdvr,scl,acc,w,w(n1),w(n2),
[bd2278d]169 & w(n3),w(n4),w(n5),w(n6),mxop,nop)
[e40e335]170
171 elseif (imin.eq.2) then ! Conjugated Gradients
172
173 n1=1+n
174 n2=n1+n
175 n3=n2+n
176 n4=n3+n
177 n5=n4+n
178
179 call mincjg(n,mxvr,vlvrn,esm,gdvr,acc,w,w(n1),w(n2), ! no 'scl'
[bd2278d]180 & w(n3),w(n4),w(n5),mxop,nop)
[e40e335]181
182 endif
183
184
185 if (nop.lt.mxop) then
[38d77eb]186 write (logString, '(a)') ' ---- CONVERGENCE ----'
[e40e335]187 else
[38d77eb]188 write (logString, '(a)') '---- STEP LIMIT ----'
[e40e335]189 endif
190
191
[38d77eb]192 write (logString, '(/,2a,/)') ' Final energies ',
[bd2278d]193 & '__________________________________________________'
[e40e335]194
195 eysm = energy()
196
197 if (ireg.eq.0) then
198
[38d77eb]199 write (logString, '(a,e12.5,/,3(a,e11.4),/,2(a,e11.4))')
200 & ' Total: ',eysm,' Coulomb: ',eyel,' Lennard-Jones: ',eyvw,
201 & ' HB: ',eyhb, ' Variables: ',eyvr,' Solvatation: ',eysl
[e40e335]202
203 else
204
[38d77eb]205 write (logString, '(a,e12.5,/,3(a,e11.4),/,3(a,e11.4))')
206 & ' Total: ', wtey*eysm + wtrg*eyrg,
[bd2278d]207 & ' Coulomb: ',eyel,' Lennard-Jones: ',eyvw,' HB: ',eyhb,
208 & ' Variables: ',eyvr,' Solvatation: ',eysl,
209 & ' Regularization: ',eyrg
[e40e335]210
211 endif
212
[38d77eb]213 write (logString, '(/,a,/)') ' Variables _________________'
[e40e335]214
215 nv = 0
216 do i=1,ntlvr !! nvr
217 if (.not.fxvr(i)) then
218
219 nv=nv+1
220 vr=vlvrn(nv)
221 if (abs(vr).gt.pi) vr=vr-sign(pi2,vr)
222
[38d77eb]223 write (logString, '(1x,a,1x,i4,f8.1,a,f5.1,a)') nmvr(i),
224 & nursvr(i), vr*crd,' (',abs(difang(vr,vlvro(i)))*crd,')'
[e40e335]225
226 vlvr(i) = vr
227 endif
228 enddo
229
230
231 if (ireg.ne.0) then
232
[38d77eb]233 write (logString,'(/,a,/)') ' Global Variables ___________'
[e40e335]234
235 do i=1,ntlml
[38d77eb]236 write (logString, *) ' Molecule #',i,' old new'
[e40e335]237 do j=1,3
[38d77eb]238 write (logString, *) gbpro(j,i),' ',gbpr(j,i)
[e40e335]239 enddo
240 do j=4,6
[38d77eb]241 write (logString, *) gbpro(j,i)*crd,' ',gbpr(j,i)*crd
[e40e335]242 enddo
243 enddo
244
245 endif
246
[38d77eb]247 write (logString,'(/,2a)') ' Gradient ',
[bd2278d]248 & '______________________________________________________________'
[e40e335]249
[38d77eb]250 write (logString,'(8(1x,f8.3))') (gdvr(i),i=1,nv)
[e40e335]251
252 if (ireg.ne.0) then
253
[38d77eb]254 write (logString, *)
255 & ' -------------- global variables ------------'
256 write (logString, '(6(1x,f8.3))') (gdvr(i+nv),i=1,ngbvr)
[e40e335]257
258 endif
259
260 return
261 end
[bd2278d]262! ********************************************
[e40e335]263 subroutine move(nop,nvr1,esm,vlvrn,gdvr)
[bd2278d]264!
265! CALLS: gradient
266!
[e40e335]267 include 'INCL.H'
[2019dff]268 integer ngbvr
[e40e335]269
[2019dff]270 integer nop
271
272 integer nvr1
273
274 double precision esm
275
276 double precision vlvrn
277
278 double precision gdvr, gdsmey, gdsmrg
279
280 integer i, ii, j, ntlvr, n
281
[e40e335]282 dimension vlvrn(mxvr),gdvr(mxvr)
283
284
[bd2278d]285! ------------------------ compile & new variables
[e40e335]286
287 ntlvr=ivrml1(ntlml)+nvrml(ntlml)-1
288 n=0
289
290 do i=1,ntlvr
291 if (.not.fxvr(i)) then
292 n=n+1
293 vlvr(i)=vlvrn(n)
294 endif
295 enddo
296
297 if (ireg.ne.0) then
298
299 ii=0
300 do i=1,ntlml
301 do j=1,6 ! global vars.
302 ii=ii+1
303 gbpr(j,i)=vlvrn(ii+n)
304 enddo
305 enddo
306
307 endif
308
[bd2278d]309! -------------------------- new minimz. gradient
[e40e335]310
311 call gradient()
312
313 gdsmey=0.d0
314 gdsmrg=0.d0
315
316 n=0
317
318 do i=1,ntlvr
319 if (.not.fxvr(i)) then
320 n=n+1
321
322 if (ireg.eq.0) then
323 gdvr(n) = gdeyvr(i)
324 else
325 gdvr(n) = wtey*gdeyvr(i) + wtrg*gdeyrg(i)
326 gdsmrg = gdsmrg + gdeyrg(i)**2
327 endif
328
329 gdsmey = gdsmey + gdeyvr(i)**2
330
331 endif
332 enddo
333
334
335 if (ireg.eq.0) then
336
337 esm=eysm
338
[38d77eb]339 write (logString, '(a,i5,a,2(e13.6,a))') ' Step ',nop,
340 & ': energy ', esm, ' (',gdsmey,' )'
[e40e335]341
342 else
343
344 ii=0
345 do i=1,ntlml ! global vars.
346 do j=1,6
347 n=n+1
348 ii=ii+1
349
350 gdvr(n) = wtrg*gdeygb(ii)
351 gdsmrg = gdsmrg+gdeygb(ii)**2
352
353 enddo
354 enddo
355
356 esm=wtey*eysm+wtrg*eyrg
357
[38d77eb]358 write (logString, '(a,i5,a,3(e13.6,a))') ' Step ',nop,
359 & ': energy ',esm,' (',gdsmey,',',gdsmrg,' )'
[e40e335]360
361 endif
362
363 return
364 end
365
Note: See TracBrowser for help on using the repository browser.