DIST2_CUT introduced for homology to remove restraints
[unres.git] / source / unres / src_MD / readrtns.F
1       subroutine readrtns
2       implicit real*8 (a-h,o-z)
3       include 'DIMENSIONS'
4 #ifdef MPI
5       include 'mpif.h'
6 #endif
7       include 'COMMON.SETUP'
8       include 'COMMON.CONTROL'
9       include 'COMMON.SBRIDGE'
10       include 'COMMON.IOUNITS'
11       include 'COMMON.CHAIN'
12       logical file_exist
13 C Read force-field parameters except weights
14       call parmread
15 C Read job setup parameters
16       call read_control
17 C Read control parameters for energy minimzation if required
18       if (minim) call read_minim
19 C Read MCM control parameters if required
20       if (modecalc.eq.3 .or. modecalc.eq.6) call mcmread
21 C Read MD control parameters if reqjuired
22       if (modecalc.eq.12) call read_MDpar
23 C Read MREMD control parameters if required
24       if (modecalc.eq.14) then 
25          call read_MDpar
26          call read_REMDpar
27       endif
28 C Read MUCA control parameters if required
29       if (lmuca) call read_muca
30 C Read CSA control parameters if required (from fort.40 if exists
31 C otherwise from general input file)
32 csa      if (modecalc.eq.8) then
33 csa       inquire (file="fort.40",exist=file_exist)
34 csa       if (.not.file_exist) call csaread
35 csa      endif 
36 cfmc      if (modecalc.eq.10) call mcmfread
37 C Read molecule information, molecule geometry, energy-term weights, and
38 C restraints if requested
39       call molread
40 C Print restraint information
41 #ifdef MPI
42       if (.not. out1file .or. me.eq.king) then
43 #endif
44       if (nhpb.gt.nss) 
45      &write (iout,'(a,i5,a)') "The following",nhpb-nss,
46      & " distance constraints have been imposed"
47       do i=nss+1,nhpb
48         write (iout,'(3i6,i2,3f10.5)') i-nss,ihpb(i),jhpb(i),
49      &     ibecarb(i),dhpb(i),dhpb1(i),forcon(i)
50       enddo
51 #ifdef MPI
52       endif
53 #endif
54 c      print *,"Processor",myrank," leaves READRTNS"
55       return
56       end
57 C-------------------------------------------------------------------------------
58       subroutine read_control
59 C
60 C Read contorl data
61 C
62       implicit real*8 (a-h,o-z)
63       include 'DIMENSIONS'
64 #ifdef MP
65       include 'mpif.h'
66       logical OKRandom, prng_restart
67       real*8  r1
68 #endif
69       include 'COMMON.IOUNITS'
70       include 'COMMON.TIME1'
71       include 'COMMON.THREAD'
72       include 'COMMON.SBRIDGE'
73       include 'COMMON.CONTROL'
74       include 'COMMON.MCM'
75       include 'COMMON.MAP'
76       include 'COMMON.HEADER'
77 csa      include 'COMMON.CSA'
78       include 'COMMON.CHAIN'
79       include 'COMMON.MUCA'
80       include 'COMMON.MD'
81       include 'COMMON.FFIELD'
82       include 'COMMON.SETUP'
83       COMMON /MACHSW/ KDIAG,ICORFL,IXDR
84       character*8 diagmeth(0:3) /'Library','EVVRSP','Givens','Jacobi'/
85       character*80 ucase
86       character*320 controlcard
87
88       nglob_csa=0
89       eglob_csa=1d99
90       nmin_csa=0
91       read (INP,'(a)') titel
92       call card_concat(controlcard)
93 c      out1file=index(controlcard,'OUT1FILE').gt.0 .or. fg_rank.gt.0
94 c      print *,"Processor",me," fg_rank",fg_rank," out1file",out1file
95       call reada(controlcard,'SEED',seed,0.0D0)
96       call random_init(seed)
97 C Set up the time limit (caution! The time must be input in minutes!)
98       read_cart=index(controlcard,'READ_CART').gt.0
99       call readi(controlcard,'CONSTR_DIST',constr_dist,0)
100       call readi(controlcard,'CONSTR_HOMOL',constr_homology,0)
101       call reada(controlcard,'TIMLIM',timlim,960.0D0) ! default 16 hours
102       unres_pdb = index(controlcard,'UNRES_PDB') .gt. 0
103       call reada(controlcard,'SAFETY',safety,30.0D0) ! default 30 minutes
104       call reada(controlcard,'RMSDBC',rmsdbc,3.0D0)
105       call reada(controlcard,'RMSDBC1',rmsdbc1,0.5D0)
106       call reada(controlcard,'RMSDBC1MAX',rmsdbc1max,1.5D0)
107       call reada(controlcard,'RMSDBCM',rmsdbcm,3.0D0)
108       call reada(controlcard,'DRMS',drms,0.1D0)
109       if(me.eq.king .or. .not. out1file .and. fg_rank.eq.0) then
110        write (iout,'(a,f10.1)')'RMSDBC = ',rmsdbc 
111        write (iout,'(a,f10.1)')'RMSDBC1 = ',rmsdbc1 
112        write (iout,'(a,f10.1)')'RMSDBC1MAX = ',rmsdbc1max 
113        write (iout,'(a,f10.1)')'DRMS    = ',drms 
114        write (iout,'(a,f10.1)')'RMSDBCM = ',rmsdbcm 
115        write (iout,'(a,f10.1)') 'Time limit (min):',timlim
116       endif
117       call readi(controlcard,'NZ_START',nz_start,0)
118       call readi(controlcard,'NZ_END',nz_end,0)
119       call readi(controlcard,'IZ_SC',iz_sc,0)
120       timlim=60.0D0*timlim
121       safety = 60.0d0*safety
122       timem=timlim
123       modecalc=0
124       call reada(controlcard,"T_BATH",t_bath,300.0d0)
125       minim=(index(controlcard,'MINIMIZE').gt.0)
126       dccart=(index(controlcard,'CART').gt.0)
127       overlapsc=(index(controlcard,'OVERLAP').gt.0)
128       overlapsc=.not.overlapsc
129       searchsc=(index(controlcard,'NOSEARCHSC').gt.0)
130       searchsc=.not.searchsc
131       sideadd=(index(controlcard,'SIDEADD').gt.0)
132       energy_dec=(index(controlcard,'ENERGY_DEC').gt.0)
133       outpdb=(index(controlcard,'PDBOUT').gt.0)
134       outx=(index(controlcard,'XOUT').gt.0)
135       outmol2=(index(controlcard,'MOL2OUT').gt.0)
136       pdbref=(index(controlcard,'PDBREF').gt.0)
137       refstr=pdbref .or. (index(controlcard,'REFSTR').gt.0)
138       indpdb=index(controlcard,'PDBSTART')
139       extconf=(index(controlcard,'EXTCONF').gt.0)
140       call readi(controlcard,'IPRINT',iprint,0)
141       call readi(controlcard,'MAXGEN',maxgen,10000)
142       call readi(controlcard,'MAXOVERLAP',maxoverlap,1000)
143       call readi(controlcard,"KDIAG",kdiag,0)
144       call readi(controlcard,"RESCALE_MODE",rescale_mode,2)
145       if(me.eq.king .or. .not. out1file .and. fg_rank.eq.0)
146      & write (iout,*) "RESCALE_MODE",rescale_mode
147       split_ene=index(controlcard,'SPLIT_ENE').gt.0
148       if (index(controlcard,'REGULAR').gt.0.0D0) then
149         call reada(controlcard,'WEIDIS',weidis,0.1D0)
150         modecalc=1
151         refstr=.true.
152       endif
153       if (index(controlcard,'CHECKGRAD').gt.0) then
154         modecalc=5
155         if (index(controlcard,'CART').gt.0) then
156           icheckgrad=1
157         elseif (index(controlcard,'CARINT').gt.0) then
158           icheckgrad=2
159         else
160           icheckgrad=3
161         endif
162       elseif (index(controlcard,'THREAD').gt.0) then
163         modecalc=2
164         call readi(controlcard,'THREAD',nthread,0)
165         if (nthread.gt.0) then
166           call reada(controlcard,'WEIDIS',weidis,0.1D0)
167         else
168           if (fg_rank.eq.0)
169      &    write (iout,'(a)')'A number has to follow the THREAD keyword.'
170           stop 'Error termination in Read_Control.'
171         endif
172       else if (index(controlcard,'MCMA').gt.0) then
173         modecalc=3
174       else if (index(controlcard,'MCEE').gt.0) then
175         modecalc=6
176       else if (index(controlcard,'MULTCONF').gt.0) then
177         modecalc=4
178       else if (index(controlcard,'MAP').gt.0) then
179         modecalc=7
180         call readi(controlcard,'MAP',nmap,0)
181       else if (index(controlcard,'CSA').gt.0) then
182            write(*,*) "CSA not supported in this version"
183            stop
184 csa        modecalc=8
185 crc      else if (index(controlcard,'ZSCORE').gt.0) then
186 crc   
187 crc  ZSCORE is rm from UNRES, modecalc=9 is available
188 crc
189 crc        modecalc=9
190 cfcm      else if (index(controlcard,'MCMF').gt.0) then
191 cfmc        modecalc=10
192       else if (index(controlcard,'SOFTREG').gt.0) then
193         modecalc=11
194       else if (index(controlcard,'CHECK_BOND').gt.0) then
195         modecalc=-1
196       else if (index(controlcard,'TEST').gt.0) then
197         modecalc=-2
198       else if (index(controlcard,'MD').gt.0) then
199         modecalc=12
200       else if (index(controlcard,'RE ').gt.0) then
201         modecalc=14
202       endif
203
204       lmuca=index(controlcard,'MUCA').gt.0
205       call readi(controlcard,'MUCADYN',mucadyn,0)      
206       call readi(controlcard,'MUCASMOOTH',muca_smooth,0)
207       if (lmuca .and. (me.eq.king .or. .not.out1file )) 
208      & then
209        write (iout,*) 'MUCADYN=',mucadyn
210        write (iout,*) 'MUCASMOOTH=',muca_smooth
211       endif
212
213       iscode=index(controlcard,'ONE_LETTER')
214       indphi=index(controlcard,'PHI')
215       indback=index(controlcard,'BACK')
216       iranconf=index(controlcard,'RAND_CONF')
217       i2ndstr=index(controlcard,'USE_SEC_PRED')
218       gradout=index(controlcard,'GRADOUT').gt.0
219       gnorm_check=index(controlcard,'GNORM_CHECK').gt.0
220       
221       if(me.eq.king.or..not.out1file)
222      & write (iout,'(2a)') diagmeth(kdiag),
223      &  ' routine used to diagonalize matrices.'
224       return
225       end
226 c--------------------------------------------------------------------------
227       subroutine read_REMDpar
228 C
229 C Read REMD settings
230 C
231       implicit real*8 (a-h,o-z)
232       include 'DIMENSIONS'
233       include 'COMMON.IOUNITS'
234       include 'COMMON.TIME1'
235       include 'COMMON.MD'
236 #ifndef LANG0
237       include 'COMMON.LANGEVIN'
238 #else
239       include 'COMMON.LANGEVIN.lang0'
240 #endif
241       include 'COMMON.INTERACT'
242       include 'COMMON.NAMES'
243       include 'COMMON.GEO'
244       include 'COMMON.REMD'
245       include 'COMMON.CONTROL'
246       include 'COMMON.SETUP'
247       character*80 ucase
248       character*320 controlcard
249       character*3200 controlcard1
250       integer iremd_m_total
251
252       if(me.eq.king.or..not.out1file)
253      & write (iout,*) "REMD setup"
254
255       call card_concat(controlcard)
256       call readi(controlcard,"NREP",nrep,3)
257       call readi(controlcard,"NSTEX",nstex,1000)
258       call reada(controlcard,"RETMIN",retmin,10.0d0)
259       call reada(controlcard,"RETMAX",retmax,1000.0d0)
260       mremdsync=(index(controlcard,'SYNC').gt.0)
261       call readi(controlcard,"NSYN",i_sync_step,100)
262       restart1file=(index(controlcard,'REST1FILE').gt.0)
263       traj1file=(index(controlcard,'TRAJ1FILE').gt.0)
264       call readi(controlcard,"TRAJCACHE",max_cache_traj_use,1)
265       if(max_cache_traj_use.gt.max_cache_traj)
266      &           max_cache_traj_use=max_cache_traj
267       if(me.eq.king.or..not.out1file) then
268 cd       if (traj1file) then
269 crc caching is in testing - NTWX is not ignored
270 cd        write (iout,*) "NTWX value is ignored"
271 cd        write (iout,*) "  trajectory is stored to one file by master"
272 cd        write (iout,*) "  before exchange at NSTEX intervals"
273 cd       endif
274        write (iout,*) "NREP= ",nrep
275        write (iout,*) "NSTEX= ",nstex
276        write (iout,*) "SYNC= ",mremdsync 
277        write (iout,*) "NSYN= ",i_sync_step
278        write (iout,*) "TRAJCACHE= ",max_cache_traj_use
279       endif
280
281       t_exchange_only=(index(controlcard,'TONLY').gt.0)
282       call readi(controlcard,"HREMD",hremd,0)
283       if((me.eq.king.or..not.out1file).and.hremd.gt.0) then 
284         write (iout,*) "Hamiltonian REMD with ",hremd," sets of weights"
285       endif
286       if(usampl.and.hremd.gt.0) then
287             write (iout,'(//a)') 
288      &      "========== ERROR: USAMPL and HREMD cannot be used together"
289 #ifdef MPI
290             call MPI_Abort(MPI_COMM_WORLD,IERROR,ERRCODE)            
291 #endif
292             stop
293       endif
294
295
296       remd_tlist=.false.
297       if (index(controlcard,'TLIST').gt.0) then
298          remd_tlist=.true.
299          call card_concat(controlcard1)
300          read(controlcard1,*) (remd_t(i),i=1,nrep) 
301          if(me.eq.king.or..not.out1file)
302      &    write (iout,*)'tlist',(remd_t(i),i=1,nrep) 
303       endif
304       remd_mlist=.false.
305       if (index(controlcard,'MLIST').gt.0) then
306          remd_mlist=.true.
307          call card_concat(controlcard1)
308          read(controlcard1,*) (remd_m(i),i=1,nrep)  
309          if(me.eq.king.or..not.out1file) then
310           write (iout,*)'mlist',(remd_m(i),i=1,nrep)
311           iremd_m_total=0
312           do i=1,nrep
313            iremd_m_total=iremd_m_total+remd_m(i)
314           enddo
315           if(hremd.gt.1)then
316            write (iout,*) 'Total number of replicas ',
317      &       iremd_m_total*hremd
318           else
319            write (iout,*) 'Total number of replicas ',iremd_m_total
320           endif
321          endif
322       endif
323       if(me.eq.king.or..not.out1file) 
324      &   write (iout,'(/30(1h=),a,29(1h=)/)') " End of REMD run setup "
325       return
326       end
327 c--------------------------------------------------------------------------
328       subroutine read_MDpar
329 C
330 C Read MD settings
331 C
332       implicit real*8 (a-h,o-z)
333       include 'DIMENSIONS'
334       include 'COMMON.IOUNITS'
335       include 'COMMON.TIME1'
336       include 'COMMON.MD'
337 #ifndef LANG0
338       include 'COMMON.LANGEVIN'
339 #else
340       include 'COMMON.LANGEVIN.lang0'
341 #endif
342       include 'COMMON.INTERACT'
343       include 'COMMON.NAMES'
344       include 'COMMON.GEO'
345       include 'COMMON.SETUP'
346       include 'COMMON.CONTROL'
347       include 'COMMON.SPLITELE'
348       character*80 ucase
349       character*320 controlcard
350
351       call card_concat(controlcard)
352       call readi(controlcard,"NSTEP",n_timestep,1000000)
353       call readi(controlcard,"NTWE",ntwe,100)
354       call readi(controlcard,"NTWX",ntwx,1000)
355       call reada(controlcard,"DT",d_time,1.0d-1)
356       call reada(controlcard,"DVMAX",dvmax,2.0d1)
357       call reada(controlcard,"DAMAX",damax,1.0d1)
358       call reada(controlcard,"EDRIFTMAX",edriftmax,1.0d+1)
359       call readi(controlcard,"LANG",lang,0)
360       RESPA = index(controlcard,"RESPA") .gt. 0
361       call readi(controlcard,"NTIME_SPLIT",ntime_split,1)
362       ntime_split0=ntime_split
363       call readi(controlcard,"MAXTIME_SPLIT",maxtime_split,64)
364       ntime_split0=ntime_split
365       call reada(controlcard,"R_CUT",r_cut,2.0d0)
366       call reada(controlcard,"LAMBDA",rlamb,0.3d0)
367       rest = index(controlcard,"REST").gt.0
368       tbf = index(controlcard,"TBF").gt.0
369       call readi(controlcard,"HMC",hmc,0)
370       tnp = index(controlcard,"NOSEPOINCARE99").gt.0
371       tnp1 = index(controlcard,"NOSEPOINCARE01").gt.0
372       tnh = index(controlcard,"NOSEHOOVER96").gt.0
373       if (RESPA.and.tnh)then
374         xiresp = index(controlcard,"XIRESP").gt.0
375       endif
376       call reada(controlcard,"Q_NP",Q_np,0.1d0)
377       usampl = index(controlcard,"USAMPL").gt.0
378       mdpdb = index(controlcard,"MDPDB").gt.0
379       call reada(controlcard,"T_BATH",t_bath,300.0d0)
380       call reada(controlcard,"TAU_BATH",tau_bath,1.0d-1) 
381       call reada(controlcard,"EQ_TIME",eq_time,1.0d+4)
382       call readi(controlcard,"RESET_MOMENT",count_reset_moment,1000)
383       if (count_reset_moment.eq.0) count_reset_moment=1000000000
384       call readi(controlcard,"RESET_VEL",count_reset_vel,1000)
385       reset_moment=lang.eq.0 .and. tbf .and. count_reset_moment.gt.0
386       reset_vel=lang.eq.0 .and. tbf .and. count_reset_vel.gt.0
387       if (count_reset_vel.eq.0) count_reset_vel=1000000000
388       large = index(controlcard,"LARGE").gt.0
389       print_compon = index(controlcard,"PRINT_COMPON").gt.0
390       rattle = index(controlcard,"RATTLE").gt.0
391       preminim = index(controlcard,"PREMINIM").gt.0
392       if (preminim) then
393         dccart=(index(controlcard,'CART').gt.0)
394         call read_minim
395       endif
396 c  if performing umbrella sampling, fragments constrained are read from the fragment file 
397       nset=0
398       if(usampl) then
399         call read_fragments
400       endif
401       
402       if(me.eq.king.or..not.out1file) then
403        write (iout,*)
404        write (iout,'(27(1h=),a26,27(1h=))') " Parameters of the MD run "
405        write (iout,*)
406        write (iout,'(a)') "The units are:"
407        write (iout,'(a)') "positions: angstrom, time: 48.9 fs"
408        write (iout,'(2a)') "velocity: angstrom/(48.9 fs),",
409      &  " acceleration: angstrom/(48.9 fs)**2"
410        write (iout,'(a)') "energy: kcal/mol, temperature: K"
411        write (iout,*)
412        write (iout,'(a60,i10)') "Number of time steps:",n_timestep
413        write (iout,'(a60,f10.5,a)') 
414      &  "Initial time step of numerical integration:",d_time,
415      &  " natural units"
416        write (iout,'(60x,f10.5,a)') d_time*48.9," fs"
417        if (RESPA) then
418         write (iout,'(2a,i4,a)') 
419      &    "A-MTS algorithm used; initial time step for fast-varying",
420      &    " short-range forces split into",ntime_split," steps."
421         write (iout,'(a,f5.2,a,f5.2)') "Short-range force cutoff",
422      &   r_cut," lambda",rlamb
423        endif
424        write (iout,'(2a,f10.5)') 
425      &  "Maximum acceleration threshold to reduce the time step",
426      &  "/increase split number:",damax
427        write (iout,'(2a,f10.5)') 
428      &  "Maximum predicted energy drift to reduce the timestep",
429      &  "/increase split number:",edriftmax
430        write (iout,'(a60,f10.5)') 
431      & "Maximum velocity threshold to reduce velocities:",dvmax
432        write (iout,'(a60,i10)') "Frequency of property output:",ntwe
433        write (iout,'(a60,i10)') "Frequency of coordinate output:",ntwx
434        if (rattle) write (iout,'(a60)') 
435      &  "Rattle algorithm used to constrain the virtual bonds"
436        if (preminim .or. iranconf.gt.0) then
437          write (iout,'(a60)')
438      &      "Initial structure will be energy-minimized" 
439        endif
440       endif
441       reset_fricmat=1000
442       if (lang.gt.0) then
443         call reada(controlcard,"ETAWAT",etawat,0.8904d0)
444         call reada(controlcard,"RWAT",rwat,1.4d0)
445         call reada(controlcard,"SCAL_FRIC",scal_fric,2.0d-2)
446         surfarea=index(controlcard,"SURFAREA").gt.0
447         call readi(controlcard,"RESET_FRICMAT",reset_fricmat,1000)
448         if(me.eq.king.or..not.out1file)then
449          write (iout,'(/a,$)') "Langevin dynamics calculation"
450          if (lang.eq.1) then
451           write (iout,'(a/)') 
452      &      " with direct integration of Langevin equations"  
453          else if (lang.eq.2) then
454           write (iout,'(a/)') " with TINKER stochasic MD integrator"
455          else if (lang.eq.3) then
456           write (iout,'(a/)') " with Ciccotti's stochasic MD integrator"
457          else if (lang.eq.4) then
458           write (iout,'(a/)') " in overdamped mode"
459          else
460           write (iout,'(//a,i5)') 
461      &      "=========== ERROR: Unknown Langevin dynamics mode:",lang
462           stop
463          endif
464          write (iout,'(a60,f10.5)') "Temperature:",t_bath
465          write (iout,'(a60,f10.5)') "Viscosity of the solvent:",etawat
466          write (iout,'(a60,f10.5)') "Radius of solvent molecule:",rwat
467          write (iout,'(a60,f10.5)') 
468      &   "Scaling factor of the friction forces:",scal_fric
469          if (surfarea) write (iout,'(2a,i10,a)') 
470      &     "Friction coefficients will be scaled by solvent-accessible",
471      &     " surface area every",reset_fricmat," steps."
472         endif
473 c Calculate friction coefficients and bounds of stochastic forces
474         eta=6*pi*cPoise*etawat
475         if(me.eq.king.or..not.out1file)
476      &   write(iout,'(a60,f10.5)')"Eta of the solvent in natural units:"
477      &   ,eta
478         gamp=scal_fric*(pstok+rwat)*eta
479         stdfp=dsqrt(2*Rb*t_bath/d_time)
480         do i=1,ntyp
481           gamsc(i)=scal_fric*(restok(i)+rwat)*eta  
482           stdfsc(i)=dsqrt(2*Rb*t_bath/d_time)
483         enddo 
484         if(me.eq.king.or..not.out1file)then
485          write (iout,'(/2a/)') 
486      &   "Radii of site types and friction coefficients and std's of",
487      &   " stochastic forces of fully exposed sites"
488          write (iout,'(a5,f5.2,2f10.5)')'p',pstok,gamp,stdfp*dsqrt(gamp)
489          do i=1,ntyp
490           write (iout,'(a5,f5.2,2f10.5)') restyp(i),restok(i),
491      &     gamsc(i),stdfsc(i)*dsqrt(gamsc(i))
492          enddo
493         endif
494       else if (tbf) then
495         if(me.eq.king.or..not.out1file)then
496          write (iout,'(a)') "Berendsen bath calculation"
497          write (iout,'(a60,f10.5)') "Temperature:",t_bath
498          write (iout,'(a60,f10.5)') "Coupling constant (tau):",tau_bath
499          if (reset_moment) 
500      &   write (iout,'(a,i10,a)') "Momenta will be reset at zero every",
501      &   count_reset_moment," steps"
502          if (reset_vel) 
503      &    write (iout,'(a,i10,a)') 
504      &    "Velocities will be reset at random every",count_reset_vel,
505      &   " steps"
506         endif
507       else if (tnp .or. tnp1 .or. tnh) then
508         if (tnp .or. tnp1) then
509            write (iout,'(a)') "Nose-Poincare bath calculation"
510            if (tnp) write (iout,'(a)') 
511      & "J.Comput.Phys. 151 114 (1999) S.D.Bond B.J.Leimkuhler B.B.Laird"
512            if (tnp1) write (iout,'(a)') "JPSJ 70 75 (2001) S. Nose" 
513         else
514            write (iout,'(a)') "Nose-Hoover bath calculation"
515            write (iout,'(a)') "Mol.Phys. 87 1117 (1996) Martyna et al."
516               nresn=1
517               nyosh=1
518               nnos=1
519               do i=1,nnos
520                qmass(i)=Q_np
521                xlogs(i)=1.0
522                vlogs(i)=0.0
523               enddo
524               do i=1,nyosh
525                WDTI(i) = 1.0*d_time/nresn
526                WDTI2(i)=WDTI(i)/2
527                WDTI4(i)=WDTI(i)/4
528                WDTI8(i)=WDTI(i)/8
529               enddo
530               if (RESPA) then
531                if(xiresp) then
532                  write (iout,'(a)') "NVT-XI-RESPA algorithm"
533                else    
534                  write (iout,'(a)') "NVT-XO-RESPA algorithm"
535                endif
536                do i=1,nyosh
537                 WDTIi(i) = 1.0*d_time/nresn/ntime_split
538                 WDTIi2(i)=WDTIi(i)/2
539                 WDTIi4(i)=WDTIi(i)/4
540                 WDTIi8(i)=WDTIi(i)/8
541                enddo
542               endif
543         endif 
544
545         write (iout,'(a60,f10.5)') "Temperature:",t_bath
546         write (iout,'(a60,f10.5)') "Q =",Q_np
547         if (reset_moment) 
548      &  write (iout,'(a,i10,a)') "Momenta will be reset at zero every",
549      &   count_reset_moment," steps"
550         if (reset_vel) 
551      &    write (iout,'(a,i10,a)') 
552      &    "Velocities will be reset at random every",count_reset_vel,
553      &   " steps"
554
555       else if (hmc.gt.0) then
556          write (iout,'(a)') "Hybrid Monte Carlo calculation"
557          write (iout,'(a60,f10.5)') "Temperature:",t_bath
558          write (iout,'(a60,i10)') 
559      &         "Number of MD steps between Metropolis tests:",hmc
560
561       else
562         if(me.eq.king.or..not.out1file)
563      &   write (iout,'(a31)') "Microcanonical mode calculation"
564       endif
565       if(me.eq.king.or..not.out1file)then
566        if (rest) write (iout,'(/a/)') "===== Calculation restarted ===="
567        if (usampl) then
568           write(iout,*) "MD running with constraints."
569           write(iout,*) "Equilibration time ", eq_time, " mtus." 
570           write(iout,*) "Constraining ", nfrag," fragments."
571           write(iout,*) "Length of each fragment, weight and q0:"
572           do iset=1,nset
573            write (iout,*) "Set of restraints #",iset
574            do i=1,nfrag
575               write(iout,'(2i5,f8.1,f7.4)') ifrag(1,i,iset),
576      &           ifrag(2,i,iset),wfrag(i,iset),qinfrag(i,iset)
577            enddo
578            write(iout,*) "constraints between ", npair, "fragments."
579            write(iout,*) "constraint pairs, weights and q0:"
580            do i=1,npair
581             write(iout,'(2i5,f8.1,f7.4)') ipair(1,i,iset),
582      &             ipair(2,i,iset),wpair(i,iset),qinpair(i,iset)
583            enddo
584            write(iout,*) "angle constraints within ", nfrag_back, 
585      &      "backbone fragments."
586            write(iout,*) "fragment, weights:"
587            do i=1,nfrag_back
588             write(iout,'(2i5,3f8.1)') ifrag_back(1,i,iset),
589      &         ifrag_back(2,i,iset),wfrag_back(1,i,iset),
590      &         wfrag_back(2,i,iset),wfrag_back(3,i,iset)
591            enddo
592           enddo
593         iset=mod(kolor,nset)+1
594        endif
595       endif
596       if(me.eq.king.or..not.out1file)
597      & write (iout,'(/30(1h=),a,29(1h=)/)') " End of MD run setup "
598       return
599       end
600 c------------------------------------------------------------------------------
601       subroutine molread
602 C
603 C Read molecular data.
604 C
605       implicit real*8 (a-h,o-z)
606       include 'DIMENSIONS'
607 #ifdef MPI
608       include 'mpif.h'
609       integer error_msg
610 #endif
611       include 'COMMON.IOUNITS'
612       include 'COMMON.GEO'
613       include 'COMMON.VAR'
614       include 'COMMON.INTERACT'
615       include 'COMMON.LOCAL'
616       include 'COMMON.NAMES'
617       include 'COMMON.CHAIN'
618       include 'COMMON.FFIELD'
619       include 'COMMON.SBRIDGE'
620       include 'COMMON.HEADER'
621       include 'COMMON.CONTROL'
622       include 'COMMON.DBASE'
623       include 'COMMON.THREAD'
624       include 'COMMON.CONTACTS'
625       include 'COMMON.TORCNSTR'
626       include 'COMMON.TIME1'
627       include 'COMMON.BOUNDS'
628       include 'COMMON.MD'
629       include 'COMMON.REMD'
630       include 'COMMON.SETUP'
631       character*4 sequence(maxres)
632       integer rescode
633       double precision x(maxvar)
634       character*256 pdbfile
635       character*320 weightcard
636       character*80 weightcard_t,ucase
637       dimension itype_pdb(maxres)
638       common /pizda/ itype_pdb
639       logical seq_comp,fail
640       double precision energia(0:n_ene)
641       
642       integer ilen
643       external ilen
644 C
645 C Body
646 C
647 C Read weights of the subsequent energy terms.
648       if(hremd.gt.0) then
649
650        k=0
651        do il=1,hremd
652         do i=1,nrep
653          do j=1,remd_m(i)
654           i2set(k)=il
655           k=k+1
656          enddo
657         enddo
658        enddo
659
660        if(me.eq.king.or..not.out1file) then
661         write (iout,*) 'Reading ',hremd,' sets of weights for HREMD'
662         write (iout,*) 'Current weights for processor ', 
663      &                 me,' set ',i2set(me)
664        endif
665
666        do i=1,hremd
667          call card_concat(weightcard)
668          call reada(weightcard,'WLONG',wlong,1.0D0)
669          call reada(weightcard,'WSC',wsc,wlong)
670          call reada(weightcard,'WSCP',wscp,wlong)
671          call reada(weightcard,'WELEC',welec,1.0D0)
672          call reada(weightcard,'WVDWPP',wvdwpp,welec)
673          call reada(weightcard,'WEL_LOC',wel_loc,1.0D0)
674          call reada(weightcard,'WCORR4',wcorr4,0.0D0)
675          call reada(weightcard,'WCORR5',wcorr5,0.0D0)
676          call reada(weightcard,'WCORR6',wcorr6,0.0D0)
677          call reada(weightcard,'WTURN3',wturn3,1.0D0)
678          call reada(weightcard,'WTURN4',wturn4,1.0D0)
679          call reada(weightcard,'WTURN6',wturn6,1.0D0)
680          call reada(weightcard,'WSCCOR',wsccor,1.0D0)
681          call reada(weightcard,'WSTRAIN',wstrain,1.0D0)
682          call reada(weightcard,'WBOND',wbond,1.0D0)
683          call reada(weightcard,'WTOR',wtor,1.0D0)
684          call reada(weightcard,'WTORD',wtor_d,1.0D0)
685          call reada(weightcard,'WANG',wang,1.0D0)
686          call reada(weightcard,'WSCLOC',wscloc,1.0D0)
687          call reada(weightcard,'SCAL14',scal14,0.4D0)
688          call reada(weightcard,'SCALSCP',scalscp,1.0d0)
689          call reada(weightcard,'CUTOFF',cutoff_corr,7.0d0)
690          call reada(weightcard,'DELT_CORR',delt_corr,0.5d0)
691          call reada(weightcard,'TEMP0',temp0,300.0d0)
692          if (index(weightcard,'SOFT').gt.0) ipot=6
693 C 12/1/95 Added weight for the multi-body term WCORR
694          call reada(weightcard,'WCORRH',wcorr,1.0D0)
695          if (wcorr4.gt.0.0d0) wcorr=wcorr4
696
697          hweights(i,1)=wsc
698          hweights(i,2)=wscp
699          hweights(i,3)=welec
700          hweights(i,4)=wcorr
701          hweights(i,5)=wcorr5
702          hweights(i,6)=wcorr6
703          hweights(i,7)=wel_loc
704          hweights(i,8)=wturn3
705          hweights(i,9)=wturn4
706          hweights(i,10)=wturn6
707          hweights(i,11)=wang
708          hweights(i,12)=wscloc
709          hweights(i,13)=wtor
710          hweights(i,14)=wtor_d
711          hweights(i,15)=wstrain
712          hweights(i,16)=wvdwpp
713          hweights(i,17)=wbond
714          hweights(i,18)=scal14
715          hweights(i,21)=wsccor
716
717        enddo
718
719        do i=1,n_ene
720          weights(i)=hweights(i2set(me),i)
721        enddo
722        wsc    =weights(1) 
723        wscp   =weights(2) 
724        welec  =weights(3) 
725        wcorr  =weights(4) 
726        wcorr5 =weights(5) 
727        wcorr6 =weights(6) 
728        wel_loc=weights(7) 
729        wturn3 =weights(8) 
730        wturn4 =weights(9) 
731        wturn6 =weights(10)
732        wang   =weights(11)
733        wscloc =weights(12)
734        wtor   =weights(13)
735        wtor_d =weights(14)
736        wstrain=weights(15)
737        wvdwpp =weights(16)
738        wbond  =weights(17)
739        scal14 =weights(18)
740        wsccor =weights(21)
741
742
743       else
744        call card_concat(weightcard)
745        call reada(weightcard,'WLONG',wlong,1.0D0)
746        call reada(weightcard,'WSC',wsc,wlong)
747        call reada(weightcard,'WSCP',wscp,wlong)
748        call reada(weightcard,'WELEC',welec,1.0D0)
749        call reada(weightcard,'WVDWPP',wvdwpp,welec)
750        call reada(weightcard,'WEL_LOC',wel_loc,1.0D0)
751        call reada(weightcard,'WCORR4',wcorr4,0.0D0)
752        call reada(weightcard,'WCORR5',wcorr5,0.0D0)
753        call reada(weightcard,'WCORR6',wcorr6,0.0D0)
754        call reada(weightcard,'WTURN3',wturn3,1.0D0)
755        call reada(weightcard,'WTURN4',wturn4,1.0D0)
756        call reada(weightcard,'WTURN6',wturn6,1.0D0)
757        call reada(weightcard,'WSCCOR',wsccor,1.0D0)
758        call reada(weightcard,'WSTRAIN',wstrain,1.0D0)
759        call reada(weightcard,'WBOND',wbond,1.0D0)
760        call reada(weightcard,'WTOR',wtor,1.0D0)
761        call reada(weightcard,'WTORD',wtor_d,1.0D0)
762        call reada(weightcard,'WANG',wang,1.0D0)
763        call reada(weightcard,'WSCLOC',wscloc,1.0D0)
764        call reada(weightcard,'WDFAD',wdfa_dist,0.0d0)
765        call reada(weightcard,'WDFAT',wdfa_tor,0.0d0)
766        call reada(weightcard,'WDFAN',wdfa_nei,0.0d0)
767        call reada(weightcard,'WDFAB',wdfa_beta,0.0d0)
768        call reada(weightcard,'SCAL14',scal14,0.4D0)
769        call reada(weightcard,'SCALSCP',scalscp,1.0d0)
770        call reada(weightcard,'CUTOFF',cutoff_corr,7.0d0)
771        call reada(weightcard,'DELT_CORR',delt_corr,0.5d0)
772        call reada(weightcard,'TEMP0',temp0,300.0d0)
773        if (index(weightcard,'SOFT').gt.0) ipot=6
774 C 12/1/95 Added weight for the multi-body term WCORR
775        call reada(weightcard,'WCORRH',wcorr,1.0D0)
776        if (wcorr4.gt.0.0d0) wcorr=wcorr4
777        weights(1)=wsc
778        weights(2)=wscp
779        weights(3)=welec
780        weights(4)=wcorr
781        weights(5)=wcorr5
782        weights(6)=wcorr6
783        weights(7)=wel_loc
784        weights(8)=wturn3
785        weights(9)=wturn4
786        weights(10)=wturn6
787        weights(11)=wang
788        weights(12)=wscloc
789        weights(13)=wtor
790        weights(14)=wtor_d
791        weights(15)=wstrain
792        weights(16)=wvdwpp
793        weights(17)=wbond
794        weights(18)=scal14
795        weights(21)=wsccor
796       endif
797        weights(25)=wdfa_dist
798        weights(26)=wdfa_tor
799        weights(27)=wdfa_nei
800        weights(28)=wdfa_beta
801
802       if(me.eq.king.or..not.out1file)
803      & write (iout,10) wsc,wscp,welec,wvdwpp,wbond,wang,wscloc,wtor,
804      &  wtor_d,wstrain,wel_loc,wcorr,wcorr5,wcorr6,wsccor,wturn3,
805      &  wturn4,wturn6,
806      &  wdfa_dist,wdfa_tor,wdfa_nei,wdfa_beta
807    10 format (/'Energy-term weights (unscaled):'//
808      & 'WSCC=   ',f10.6,' (SC-SC)'/
809      & 'WSCP=   ',f10.6,' (SC-p)'/
810      & 'WELEC=  ',f10.6,' (p-p electr)'/
811      & 'WVDWPP= ',f10.6,' (p-p VDW)'/
812      & 'WBOND=  ',f10.6,' (stretching)'/
813      & 'WANG=   ',f10.6,' (bending)'/
814      & 'WSCLOC= ',f10.6,' (SC local)'/
815      & 'WTOR=   ',f10.6,' (torsional)'/
816      & 'WTORD=  ',f10.6,' (double torsional)'/
817      & 'WSTRAIN=',f10.6,' (SS bridges & dist. cnstr.)'/
818      & 'WEL_LOC=',f10.6,' (multi-body 3-rd order)'/
819      & 'WCORR4= ',f10.6,' (multi-body 4th order)'/
820      & 'WCORR5= ',f10.6,' (multi-body 5th order)'/
821      & 'WCORR6= ',f10.6,' (multi-body 6th order)'/
822      & 'WSCCOR= ',f10.6,' (back-scloc correlation)'/
823      & 'WTURN3= ',f10.6,' (turns, 3rd order)'/
824      & 'WTURN4= ',f10.6,' (turns, 4th order)'/
825      & 'WTURN6= ',f10.6,' (turns, 6th order)'/
826      & 'WDFA_D= ',f10.6,' (DFA, distance)'   /
827      & 'WDFA_T= ',f10.6,' (DFA, torsional)'   /
828      & 'WDFA_N= ',f10.6,' (DFA, number of neighbor)'   /
829      & 'WDFA_B= ',f10.6,' (DFA, beta formation)')
830       if(me.eq.king.or..not.out1file)then
831        if (wcorr4.gt.0.0d0) then
832         write (iout,'(/2a/)') 'Local-electrostatic type correlation ',
833      &   'between contact pairs of peptide groups'
834         write (iout,'(2(a,f5.3/))') 
835      &  'Cutoff on 4-6th order correlation terms: ',cutoff_corr,
836      &  'Range of quenching the correlation terms:',2*delt_corr 
837        else if (wcorr.gt.0.0d0) then
838         write (iout,'(/2a/)') 'Hydrogen-bonding correlation ',
839      &   'between contact pairs of peptide groups'
840        endif
841        write (iout,'(a,f8.3)') 
842      &  'Scaling factor of 1,4 SC-p interactions:',scal14
843        write (iout,'(a,f8.3)') 
844      &  'General scaling factor of SC-p interactions:',scalscp
845       endif
846       r0_corr=cutoff_corr-delt_corr
847       do i=1,20
848         aad(i,1)=scalscp*aad(i,1)
849         aad(i,2)=scalscp*aad(i,2)
850         bad(i,1)=scalscp*bad(i,1)
851         bad(i,2)=scalscp*bad(i,2)
852       enddo
853       call rescale_weights(t_bath)
854       if(me.eq.king.or..not.out1file)
855      & write (iout,22) wsc,wscp,welec,wvdwpp,wbond,wang,wscloc,wtor,
856      &  wtor_d,wstrain,wel_loc,wcorr,wcorr5,wcorr6,wsccor,wturn3,
857      &  wturn4,wturn6,
858      &  wdfa_dist,wdfa_tor,wdfa_nei,wdfa_beta
859    22 format (/'Energy-term weights (scaled):'//
860      & 'WSCC=   ',f10.6,' (SC-SC)'/
861      & 'WSCP=   ',f10.6,' (SC-p)'/
862      & 'WELEC=  ',f10.6,' (p-p electr)'/
863      & 'WVDWPP= ',f10.6,' (p-p VDW)'/
864      & 'WBOND=  ',f10.6,' (stretching)'/
865      & 'WANG=   ',f10.6,' (bending)'/
866      & 'WSCLOC= ',f10.6,' (SC local)'/
867      & 'WTOR=   ',f10.6,' (torsional)'/
868      & 'WTORD=  ',f10.6,' (double torsional)'/
869      & 'WSTRAIN=',f10.6,' (SS bridges & dist. cnstr.)'/
870      & 'WEL_LOC=',f10.6,' (multi-body 3-rd order)'/
871      & 'WCORR4= ',f10.6,' (multi-body 4th order)'/
872      & 'WCORR5= ',f10.6,' (multi-body 5th order)'/
873      & 'WCORR6= ',f10.6,' (multi-body 6th order)'/
874      & 'WSCCOR= ',f10.6,' (back-scloc correlatkion)'/
875      & 'WTURN3= ',f10.6,' (turns, 3rd order)'/
876      & 'WTURN4= ',f10.6,' (turns, 4th order)'/
877      & 'WTURN6= ',f10.6,' (turns, 6th order)'/
878      & 'WDFA_D= ',f10.6,' (DFA, distance)'   /
879      & 'WDFA_T= ',f10.6,' (DFA, torsional)'   /
880      & 'WDFA_N= ',f10.6,' (DFA, number of neighbor)'   /
881      & 'WDFA_B= ',f10.6,' (DFA, beta formation)')
882       if(me.eq.king.or..not.out1file)
883      & write (iout,*) "Reference temperature for weights calculation:",
884      &  temp0
885       call reada(weightcard,"D0CM",d0cm,3.78d0)
886       call reada(weightcard,"AKCM",akcm,15.1d0)
887       call reada(weightcard,"AKTH",akth,11.0d0)
888       call reada(weightcard,"AKCT",akct,12.0d0)
889       call reada(weightcard,"V1SS",v1ss,-1.08d0)
890       call reada(weightcard,"V2SS",v2ss,7.61d0)
891       call reada(weightcard,"V3SS",v3ss,13.7d0)
892       call reada(weightcard,"EBR",ebr,-5.50D0)
893       dyn_ss=(index(weightcard,'DYN_SS').gt.0)
894       do i=1,maxres
895         dyn_ss_mask(i)=.false.
896       enddo
897       do i=1,maxres-1
898         do j=i+1,maxres
899           dyn_ssbond_ij(i,j)=1.0d300
900         enddo
901       enddo
902       call reada(weightcard,"HT",Ht,0.0D0)
903       if (dyn_ss) then
904         ss_depth=ebr/wsc-0.25*eps(1,1)
905         Ht=Ht/wsc-0.25*eps(1,1)
906         akcm=akcm*wstrain/wsc
907         akth=akth*wstrain/wsc
908         akct=akct*wstrain/wsc
909         v1ss=v1ss*wstrain/wsc
910         v2ss=v2ss*wstrain/wsc
911         v3ss=v3ss*wstrain/wsc
912       else
913         ss_depth=ebr/wstrain-0.25*eps(1,1)*wsc/wstrain
914       endif
915
916       if(me.eq.king.or..not.out1file) then
917        write (iout,*) "Parameters of the SS-bond potential:"
918        write (iout,*) "D0CM",d0cm," AKCM",akcm," AKTH",akth,
919      & " AKCT",akct
920        write (iout,*) "V1SS",v1ss," V2SS",v2ss," V3SS",v3ss
921        write (iout,*) "EBR",ebr," SS_DEPTH",ss_depth
922        write (iout,*)" HT",Ht
923        print *,'indpdb=',indpdb,' pdbref=',pdbref
924       endif
925       if (indpdb.gt.0 .or. pdbref) then
926         read(inp,'(a)') pdbfile
927         if(me.eq.king.or..not.out1file)
928      &   write (iout,'(2a)') 'PDB data will be read from file ',
929      &   pdbfile(:ilen(pdbfile))
930         open(ipdbin,file=pdbfile,status='old',err=33)
931         goto 34 
932   33    write (iout,'(a)') 'Error opening PDB file.'
933         stop
934   34    continue
935 c        print *,'Begin reading pdb data'
936         call readpdb
937         do i=1,2*nres
938           do j=1,3
939             crefjlee(j,i)=c(j,i)
940           enddo
941         enddo
942 #ifdef DEBUG
943         do i=1,nres
944           write (iout,'(i5,3f8.3,5x,3f8.3)') i,(crefjlee(j,i),j=1,3),
945      &      (crefjlee(j,i+nres),j=1,3)
946         enddo
947 #endif
948 c        print *,'Finished reading pdb data'
949         if(me.eq.king.or..not.out1file)
950      &   write (iout,'(a,i3,a,i3)')'nsup=',nsup,
951      &   ' nstart_sup=',nstart_sup
952         do i=1,nres
953           itype_pdb(i)=itype(i)
954         enddo
955         close (ipdbin)
956         nnt=nstart_sup
957         nct=nstart_sup+nsup-1
958         call contact(.false.,ncont_ref,icont_ref,co)
959
960         if (sideadd) then 
961 C Following 2 lines for diagnostics; comment out if not needed
962          write (iout,*) "Before sideadd"
963          call intout
964          if(me.eq.king.or..not.out1file)
965      &    write(iout,*)'Adding sidechains'
966          maxsi=1000
967          do i=2,nres-1
968           iti=itype(i)
969           if (iti.ne.10) then
970             nsi=0
971             fail=.true.
972             do while (fail.and.nsi.le.maxsi)
973               call gen_side(iti,theta(i+1),alph(i),omeg(i),fail)
974               nsi=nsi+1
975             enddo
976             if(fail) write(iout,*)'Adding sidechain failed for res ',
977      &              i,' after ',nsi,' trials'
978           endif
979          enddo
980 C 10/03/12 Adam: Recalculate coordinates with new side chain positions
981          call chainbuild
982         endif  
983 C Following 2 lines for diagnostics; comment out if not needed
984 c        write (iout,*) "After sideadd"
985 c        call intout
986       endif
987       if (indpdb.eq.0) then
988 C Read sequence if not taken from the pdb file.
989         read (inp,*) nres
990 c        print *,'nres=',nres
991         if (iscode.gt.0) then
992           read (inp,'(80a1)') (sequence(i)(1:1),i=1,nres)
993         else
994           read (inp,'(20(1x,a3))') (sequence(i),i=1,nres)
995         endif
996 C Convert sequence to numeric code
997         do i=1,nres
998           itype(i)=rescode(i,sequence(i),iscode)
999         enddo
1000         if (itype(2).eq.10.and.itype(1).eq.ntyp1) then
1001           write (iout,*) 
1002      &     "Glycine is the first full residue, initial dummy deleted"
1003           do i=1,nres
1004             itype(i)=itype(i+1)
1005           enddo
1006           nres=nres-1
1007         endif
1008         if (itype(nres-1).eq.10.and.itype(nres).eq.ntyp1) then
1009           write (iout,*) 
1010      &     "Glycine is the last full residue, terminal dummy deleted"
1011           nres=nres-1
1012         endif
1013
1014 C Assign initial virtual bond lengths
1015         do i=2,nres
1016           vbld(i)=vbl
1017           vbld_inv(i)=vblinv
1018         enddo
1019         do i=2,nres-1
1020           vbld(i+nres)=dsc(itype(i))
1021           vbld_inv(i+nres)=dsc_inv(itype(i))
1022 c          write (iout,*) "i",i," itype",itype(i),
1023 c     &      " dsc",dsc(itype(i))," vbld",vbld(i),vbld(i+nres)
1024         enddo
1025       endif 
1026 c      print *,nres
1027 c      print '(20i4)',(itype(i),i=1,nres)
1028       do i=1,nres
1029 #ifdef PROCOR
1030         if (itype(i).eq.21 .or. itype(i+1).eq.21) then
1031 #else
1032         if (itype(i).eq.21) then
1033 #endif
1034           itel(i)=0
1035 #ifdef PROCOR
1036         else if (itype(i+1).ne.20) then
1037 #else
1038         else if (itype(i).ne.20) then
1039 #endif
1040           itel(i)=1
1041         else
1042           itel(i)=2
1043         endif  
1044       enddo
1045       if(me.eq.king.or..not.out1file)then
1046        write (iout,*) "ITEL"
1047        do i=1,nres-1
1048          write (iout,*) i,itype(i),itel(i)
1049        enddo
1050        print *,'Call Read_Bridge.'
1051       endif
1052       call read_bridge
1053 C 8/13/98 Set limits to generating the dihedral angles
1054       do i=1,nres
1055         phibound(1,i)=-pi
1056         phibound(2,i)=pi
1057       enddo
1058       read (inp,*) ndih_constr
1059       if (ndih_constr.gt.0) then
1060         read (inp,*) ftors
1061         read (inp,*) (idih_constr(i),phi0(i),drange(i),i=1,ndih_constr)
1062         if(me.eq.king.or..not.out1file)then
1063          write (iout,*) 
1064      &   'There are',ndih_constr,' constraints on phi angles.'
1065          do i=1,ndih_constr
1066           write (iout,'(i5,2f8.3)') idih_constr(i),phi0(i),drange(i)
1067          enddo
1068         endif
1069         do i=1,ndih_constr
1070           phi0(i)=deg2rad*phi0(i)
1071           drange(i)=deg2rad*drange(i)
1072         enddo
1073         if(me.eq.king.or..not.out1file)
1074      &   write (iout,*) 'FTORS',ftors
1075         do i=1,ndih_constr
1076           ii = idih_constr(i)
1077           phibound(1,ii) = phi0(i)-drange(i)
1078           phibound(2,ii) = phi0(i)+drange(i)
1079         enddo 
1080       endif
1081       nnt=1
1082 #ifdef MPI
1083       if (me.eq.king) then
1084 #endif
1085        write (iout,'(a)') 'Boundaries in phi angle sampling:'
1086        do i=1,nres
1087          write (iout,'(a3,i5,2f10.1)') 
1088      &   restyp(itype(i)),i,phibound(1,i)*rad2deg,phibound(2,i)*rad2deg
1089        enddo
1090 #ifdef MP
1091       endif
1092 #endif
1093       nct=nres
1094 cd      print *,'NNT=',NNT,' NCT=',NCT
1095       if (itype(1).eq.21) nnt=2
1096       if (itype(nres).eq.21) nct=nct-1
1097
1098 C     Bartek:READ init_vars
1099 C     Initialize variables!
1100 C     Juyong:READ read_info
1101 C     READ fragment information!!
1102 C     both routines should be in dfa.F file!!
1103
1104 #ifdef DFA
1105       if (.not. (wdfa_dist.eq.0.0 .and. wdfa_tor.eq.0.0 .and.
1106      &            wdfa_nei.eq.0.0 .and. wdfa_beta.eq.0.0)) then
1107        call init_dfa_vars
1108        print*, 'init_dfa_vars finished!'
1109        call read_dfa_info
1110        print*, 'read_dfa_info finished!'
1111       endif
1112 #endif
1113 C
1114       if (pdbref) then
1115         if(me.eq.king.or..not.out1file)
1116      &   write (iout,'(a,i3)') 'nsup=',nsup
1117         nstart_seq=nnt
1118         if (nsup.le.(nct-nnt+1)) then
1119           do i=0,nct-nnt+1-nsup
1120             if (seq_comp(itype(nnt+i),itype_pdb(nstart_sup),nsup)) then
1121               nstart_seq=nnt+i
1122               goto 111
1123             endif
1124           enddo
1125           write (iout,'(a)') 
1126      &            'Error - sequences to be superposed do not match.'
1127           stop
1128         else
1129           do i=0,nsup-(nct-nnt+1)
1130             if (seq_comp(itype(nnt),itype_pdb(nstart_sup+i),nct-nnt+1)) 
1131      &      then
1132               nstart_sup=nstart_sup+i
1133               nsup=nct-nnt+1
1134               goto 111
1135             endif
1136           enddo 
1137           write (iout,'(a)') 
1138      &            'Error - sequences to be superposed do not match.'
1139         endif
1140   111   continue
1141         if (nsup.eq.0) nsup=nct-nnt
1142         if (nstart_sup.eq.0) nstart_sup=nnt
1143         if (nstart_seq.eq.0) nstart_seq=nnt
1144         if(me.eq.king.or..not.out1file)  
1145      &   write (iout,*) 'nsup=',nsup,' nstart_sup=',nstart_sup,
1146      &                 ' nstart_seq=',nstart_seq
1147       endif
1148 c--- Zscore rms -------
1149       if (nz_start.eq.0) nz_start=nnt
1150       if (nz_end.eq.0 .and. nsup.gt.0) then
1151         nz_end=nnt+nsup-1
1152       else if (nz_end.eq.0) then
1153         nz_end=nct
1154       endif
1155       if(me.eq.king.or..not.out1file)then
1156        write (iout,*) 'NZ_START=',nz_start,' NZ_END=',nz_end
1157        write (iout,*) 'IZ_SC=',iz_sc
1158       endif
1159 c----------------------
1160       call init_int_table
1161       if (refstr) then
1162         if (.not.pdbref) then
1163           call read_angles(inp,*38)
1164           goto 39
1165    38     write (iout,'(a)') 'Error reading reference structure.'
1166 #ifdef MPI
1167           call MPI_Finalize(MPI_COMM_WORLD,IERROR)
1168           stop 'Error reading reference structure'
1169 #endif
1170    39     call chainbuild
1171           call setup_var
1172 czscore          call geom_to_var(nvar,coord_exp_zs(1,1))
1173           nstart_sup=nnt
1174           nstart_seq=nnt
1175           nsup=nct-nnt+1
1176           do i=1,2*nres
1177             do j=1,3
1178               cref(j,i)=c(j,i)
1179             enddo
1180           enddo
1181           call contact(.true.,ncont_ref,icont_ref,co)
1182         endif
1183         if(me.eq.king.or..not.out1file)
1184      &   write (iout,*) 'Contact order:',co
1185         if (pdbref) then
1186         if(me.eq.king.or..not.out1file)
1187      &   write (2,*) 'Shifting contacts:',nstart_seq,nstart_sup
1188         do i=1,ncont_ref
1189           do j=1,2
1190             icont_ref(j,i)=icont_ref(j,i)+nstart_seq-nstart_sup
1191           enddo
1192           if(me.eq.king.or..not.out1file)
1193      &     write (2,*) i,' ',restyp(itype(icont_ref(1,i))),' ',
1194      &     icont_ref(1,i),' ',
1195      &     restyp(itype(icont_ref(2,i))),' ',icont_ref(2,i)
1196         enddo
1197         endif
1198       endif
1199 c        write (iout,*) "constr_dist",constr_dist,nstart_sup,nsup
1200       if (constr_dist.gt.0) then
1201         call read_dist_constr
1202       endif
1203
1204
1205       if (constr_homology.gt.0) then
1206         call read_constr_homology
1207         if (indpdb.gt.0 .or. pdbref) then
1208           do i=1,2*nres
1209             do j=1,3
1210               c(j,i)=crefjlee(j,i)
1211               cref(j,i)=crefjlee(j,i)
1212             enddo
1213           enddo
1214         endif
1215 #ifdef DEBUG
1216         write (iout,*) "Array C"
1217         do i=1,nres
1218           write (iout,'(i5,3f8.3,5x,3f8.3)') i,(c(j,i),j=1,3),
1219      &      (c(j,i+nres),j=1,3)
1220         enddo
1221         write (iout,*) "Array Cref"
1222         do i=1,nres
1223           write (iout,'(i5,3f8.3,5x,3f8.3)') i,(cref(j,i),j=1,3),
1224      &      (cref(j,i+nres),j=1,3)
1225         enddo
1226 #endif
1227        call int_from_cart1(.false.)
1228        call sc_loc_geom(.false.)
1229        do i=1,nres
1230          thetaref(i)=theta(i)
1231          phiref(i)=phi(i)
1232        enddo
1233        do i=1,nres-1
1234          do j=1,3
1235            dc(j,i)=c(j,i+1)-c(j,i)
1236            dc_norm(j,i)=dc(j,i)*vbld_inv(i+1)
1237          enddo
1238        enddo
1239        do i=2,nres-1
1240          do j=1,3
1241            dc(j,i+nres)=c(j,i+nres)-c(j,i)
1242            dc_norm(j,i+nres)=dc(j,i+nres)*vbld_inv(i+nres)
1243          enddo
1244        enddo
1245       else
1246         homol_nset=0
1247       endif
1248
1249
1250       if (nhpb.gt.0) call hpb_partition
1251 c      write (iout,*) "After read_dist_constr nhpb",nhpb
1252 c      call flush(iout)
1253       if (indpdb.eq.0 .and. modecalc.ne.2 .and. modecalc.ne.4
1254      &    .and. modecalc.ne.8 .and. modecalc.ne.9 .and. 
1255      &    modecalc.ne.10) then
1256 C If input structure hasn't been supplied from the PDB file read or generate
1257 C initial geometry.
1258         if (iranconf.eq.0 .and. .not. extconf) then
1259           if(me.eq.king.or..not.out1file .and.fg_rank.eq.0)
1260      &     write (iout,'(a)') 'Initial geometry will be read in.'
1261           if (read_cart) then
1262             read (inp,*) time,potE,uconst,t_bath,
1263      &       nss,(ihpb(j),jhpb(j),j=1,nss), nn, (qfrag(i),i=1,nn)
1264             read(inp,'(8f10.5)',end=36,err=36)
1265      &       ((c(l,k),l=1,3),k=1,nres),
1266      &       ((c(l,k+nres),l=1,3),k=nnt,nct)
1267             call int_from_cart1(.false.)
1268             do i=1,nres-1
1269               do j=1,3
1270                 dc(j,i)=c(j,i+1)-c(j,i)
1271                 dc_norm(j,i)=dc_norm(j,i)*vbld_inv(i+1)
1272               enddo
1273             enddo
1274             do i=nnt,nct
1275               if (itype(i).ne.10) then
1276                 do j=1,3
1277                   dc(j,i+nres)=c(j,i+nres)-c(j,i) 
1278                   dc_norm(j,i+nres)=dc_norm(j,i+nres)*vbld_inv(i+nres)
1279                 enddo
1280               endif
1281             enddo
1282 c            return
1283           else
1284             call read_angles(inp,*36)
1285           endif
1286           goto 37
1287    36     write (iout,'(a)') 'Error reading angle file.'
1288 #ifdef MPI
1289           call mpi_finalize( MPI_COMM_WORLD,IERR )
1290 #endif
1291           stop 'Error reading angle file.'
1292    37     continue 
1293         else if (extconf) then
1294          if(me.eq.king.or..not.out1file .and. fg_rank.eq.0)
1295      &    write (iout,'(a)') 'Extended chain initial geometry.'
1296          do i=3,nres
1297           theta(i)=90d0*deg2rad
1298          enddo
1299          do i=4,nres
1300           phi(i)=180d0*deg2rad
1301          enddo
1302          do i=2,nres-1
1303           alph(i)=110d0*deg2rad
1304          enddo
1305          do i=2,nres-1
1306           omeg(i)=-120d0*deg2rad
1307          enddo
1308         else
1309           if(me.eq.king.or..not.out1file)
1310      &     write (iout,'(a)') 'Random-generated initial geometry.'
1311
1312
1313 #ifdef MPI
1314           if (me.eq.king  .or. fg_rank.eq.0 .and. (
1315      &           modecalc.eq.12 .or. modecalc.eq.14) ) then  
1316 #endif
1317             do itrial=1,100
1318               itmp=1
1319               call gen_rand_conf(itmp,*30)
1320               goto 40
1321    30         write (iout,*) 'Failed to generate random conformation',
1322      &          ', itrial=',itrial
1323               write (*,*) 'Processor:',me,
1324      &          ' Failed to generate random conformation',
1325      &          ' itrial=',itrial
1326               call intout
1327
1328 #ifdef AIX
1329               call flush_(iout)
1330 #else
1331               call flush(iout)
1332 #endif
1333             enddo
1334             write (iout,'(a,i3,a)') 'Processor:',me,
1335      &        ' error in generating random conformation.'
1336             write (*,'(a,i3,a)') 'Processor:',me,
1337      &        ' error in generating random conformation.'
1338             call flush(iout)
1339 #ifdef MPI
1340             call MPI_Abort(mpi_comm_world,error_msg,ierrcode)            
1341    40       continue
1342           endif
1343 #else
1344    40     continue
1345 #endif
1346         endif
1347       elseif (modecalc.eq.4) then
1348         read (inp,'(a)') intinname
1349         open (intin,file=intinname,status='old',err=333)
1350         if (me.eq.king .or. .not.out1file.and.fg_rank.eq.0)
1351      &  write (iout,'(a)') 'intinname',intinname
1352         write (*,'(a)') 'Processor',myrank,' intinname',intinname
1353         goto 334
1354   333   write (iout,'(2a)') 'Error opening angle file ',intinname
1355 #ifdef MPI 
1356         call MPI_Finalize(MPI_COMM_WORLD,IERR)
1357 #endif   
1358         stop 'Error opening angle file.' 
1359   334   continue
1360
1361       endif 
1362 C Generate distance constraints, if the PDB structure is to be regularized. 
1363       if (nthread.gt.0) then
1364         call read_threadbase
1365       endif
1366       write (iout,*) "READRTNS: Calling setup_var"
1367       call flush(iout)
1368       call setup_var
1369       if (me.eq.king .or. .not. out1file)
1370      & call intout
1371       if (ns.gt.0 .and. (me.eq.king .or. .not.out1file) ) then
1372         write (iout,'(/a,i3,a)') 
1373      &  'The chain contains',ns,' disulfide-bridging cysteines.'
1374         write (iout,'(20i4)') (iss(i),i=1,ns)
1375        if (dyn_ss) then
1376           write(iout,*)"Running with dynamic disulfide-bond formation"
1377        else
1378         write (iout,'(/a/)') 'Pre-formed links are:' 
1379         do i=1,nss
1380           i1=ihpb(i)-nres
1381           i2=jhpb(i)-nres
1382           it1=itype(i1)
1383           it2=itype(i2)
1384           write (iout,'(2a,i3,3a,i3,a,3f10.3)')
1385      &    restyp(it1),'(',i1,') -- ',restyp(it2),'(',i2,')',dhpb(i),
1386      &    ebr,forcon(i)
1387         enddo
1388         write (iout,'(a)')
1389        endif
1390       endif
1391       if (ns.gt.0.and.dyn_ss) then
1392           do i=nss+1,nhpb
1393             ihpb(i-nss)=ihpb(i)
1394             jhpb(i-nss)=jhpb(i)
1395             forcon(i-nss)=forcon(i)
1396             dhpb(i-nss)=dhpb(i)
1397           enddo
1398           nhpb=nhpb-nss
1399           nss=0
1400           call hpb_partition
1401           do i=1,ns
1402             dyn_ss_mask(iss(i))=.true.
1403           enddo
1404       endif
1405       if (i2ndstr.gt.0) call secstrp2dihc
1406 c      call geom_to_var(nvar,x)
1407 c      call etotal(energia(0))
1408 c      call enerprint(energia(0))
1409 c      call briefout(0,etot)
1410 c      stop
1411 cd    write (iout,'(2(a,i3))') 'NNT',NNT,' NCT',NCT
1412 cd    write (iout,'(a)') 'Variable list:'
1413 cd    write (iout,'(i4,f10.5)') (i,rad2deg*x(i),i=1,nvar)
1414 #ifdef MPI
1415       if (me.eq.king .or. (fg_rank.eq.0 .and. .not.out1file))
1416      &  write (iout,'(//80(1h*)/20x,a,i4,a/80(1h*)//)') 
1417      &  'Processor',myrank,': end reading molecular data.'
1418 #endif
1419       return
1420       end
1421 c--------------------------------------------------------------------------
1422       logical function seq_comp(itypea,itypeb,length)
1423       implicit none
1424       integer length,itypea(length),itypeb(length)
1425       integer i
1426       do i=1,length
1427         if (itypea(i).ne.itypeb(i)) then
1428           seq_comp=.false.
1429           return
1430         endif
1431       enddo
1432       seq_comp=.true.
1433       return
1434       end
1435 c-----------------------------------------------------------------------------
1436       subroutine read_bridge
1437 C Read information about disulfide bridges.
1438       implicit real*8 (a-h,o-z)
1439       include 'DIMENSIONS'
1440 #ifdef MPI
1441       include 'mpif.h'
1442 #endif
1443       include 'COMMON.IOUNITS'
1444       include 'COMMON.GEO'
1445       include 'COMMON.VAR'
1446       include 'COMMON.INTERACT'
1447       include 'COMMON.LOCAL'
1448       include 'COMMON.NAMES'
1449       include 'COMMON.CHAIN'
1450       include 'COMMON.FFIELD'
1451       include 'COMMON.SBRIDGE'
1452       include 'COMMON.HEADER'
1453       include 'COMMON.CONTROL'
1454       include 'COMMON.DBASE'
1455       include 'COMMON.THREAD'
1456       include 'COMMON.TIME1'
1457       include 'COMMON.SETUP'
1458 C Read bridging residues.
1459       read (inp,*) ns,(iss(i),i=1,ns)
1460       print *,'ns=',ns
1461       if(me.eq.king.or..not.out1file)
1462      &  write (iout,*) 'ns=',ns,' iss:',(iss(i),i=1,ns)
1463 C Check whether the specified bridging residues are cystines.
1464       do i=1,ns
1465         if (itype(iss(i)).ne.1) then
1466           if (me.eq.king.or..not.out1file) write (iout,'(2a,i3,a)') 
1467      &   'Do you REALLY think that the residue ',
1468      &    restyp(itype(iss(i))),i,
1469      &   ' can form a disulfide bridge?!!!'
1470           write (*,'(2a,i3,a)') 
1471      &   'Do you REALLY think that the residue ',
1472      &    restyp(itype(iss(i))),i,
1473      &   ' can form a disulfide bridge?!!!'
1474 #ifdef MPI
1475          call MPI_Finalize(MPI_COMM_WORLD,ierror)
1476          stop
1477 #endif
1478         endif
1479       enddo
1480 C Read preformed bridges.
1481       if (ns.gt.0) then
1482       read (inp,*) nss,(ihpb(i),jhpb(i),i=1,nss)
1483       if(fg_rank.eq.0)
1484      & write(iout,*)'nss=',nss,' ihpb,jhpb: ',(ihpb(i),jhpb(i),i=1,nss)
1485       if (nss.gt.0) then
1486         nhpb=nss
1487 C Check if the residues involved in bridges are in the specified list of
1488 C bridging residues.
1489         do i=1,nss
1490           do j=1,i-1
1491             if (ihpb(i).eq.ihpb(j).or.ihpb(i).eq.jhpb(j)
1492      &      .or.jhpb(i).eq.ihpb(j).or.jhpb(i).eq.jhpb(j)) then
1493               write (iout,'(a,i3,a)') 'Disulfide pair',i,
1494      &      ' contains residues present in other pairs.'
1495               write (*,'(a,i3,a)') 'Disulfide pair',i,
1496      &      ' contains residues present in other pairs.'
1497 #ifdef MPI
1498               call MPI_Finalize(MPI_COMM_WORLD,ierror)
1499               stop 
1500 #endif
1501             endif
1502           enddo
1503           do j=1,ns
1504             if (ihpb(i).eq.iss(j)) goto 10
1505           enddo
1506           write (iout,'(a,i3,a)') 'Pair',i,' contains unknown cystine.'
1507    10     continue
1508           do j=1,ns
1509             if (jhpb(i).eq.iss(j)) goto 20
1510           enddo
1511           write (iout,'(a,i3,a)') 'Pair',i,' contains unknown cystine.'
1512    20     continue
1513           dhpb(i)=dbr
1514           forcon(i)=fbr
1515         enddo
1516         do i=1,nss
1517           ihpb(i)=ihpb(i)+nres
1518           jhpb(i)=jhpb(i)+nres
1519         enddo
1520       endif
1521       endif
1522       return
1523       end
1524 c----------------------------------------------------------------------------
1525       subroutine read_x(kanal,*)
1526       implicit real*8 (a-h,o-z)
1527       include 'DIMENSIONS'
1528       include 'COMMON.GEO'
1529       include 'COMMON.VAR'
1530       include 'COMMON.CHAIN'
1531       include 'COMMON.IOUNITS'
1532       include 'COMMON.CONTROL'
1533       include 'COMMON.LOCAL'
1534       include 'COMMON.INTERACT'
1535 c Read coordinates from input
1536 c
1537       read(kanal,'(8f10.5)',end=10,err=10)
1538      &  ((c(l,k),l=1,3),k=1,nres),
1539      &  ((c(l,k+nres),l=1,3),k=nnt,nct)
1540       do j=1,3
1541         c(j,nres+1)=c(j,1)
1542         c(j,2*nres)=c(j,nres)
1543       enddo
1544       call int_from_cart1(.false.)
1545       do i=1,nres-1
1546         do j=1,3
1547           dc(j,i)=c(j,i+1)-c(j,i)
1548           dc_norm(j,i)=dc(j,i)*vbld_inv(i+1)
1549         enddo
1550       enddo
1551       do i=nnt,nct
1552         if (itype(i).ne.10) then
1553           do j=1,3
1554             dc(j,i+nres)=c(j,i+nres)-c(j,i)
1555             dc_norm(j,i+nres)=dc(j,i+nres)*vbld_inv(i+nres)
1556           enddo
1557         endif
1558       enddo
1559
1560       return
1561    10 return1
1562       end
1563 c----------------------------------------------------------------------------
1564       subroutine read_threadbase
1565       implicit real*8 (a-h,o-z)
1566       include 'DIMENSIONS'
1567       include 'COMMON.IOUNITS'
1568       include 'COMMON.GEO'
1569       include 'COMMON.VAR'
1570       include 'COMMON.INTERACT'
1571       include 'COMMON.LOCAL'
1572       include 'COMMON.NAMES'
1573       include 'COMMON.CHAIN'
1574       include 'COMMON.FFIELD'
1575       include 'COMMON.SBRIDGE'
1576       include 'COMMON.HEADER'
1577       include 'COMMON.CONTROL'
1578       include 'COMMON.DBASE'
1579       include 'COMMON.THREAD'
1580       include 'COMMON.TIME1'
1581 C Read pattern database for threading.
1582       read (icbase,*) nseq
1583       do i=1,nseq
1584         read (icbase,'(i5,2x,a8,2i4)') nres_base(1,i),str_nam(i),
1585      &   nres_base(2,i),nres_base(3,i)
1586         read (icbase,'(9f8.3)') ((cart_base(k,j,i),k=1,3),j=1,
1587      &   nres_base(1,i))
1588 c       write (iout,'(i5,2x,a8,2i4)') nres_base(1,i),str_nam(i),
1589 c    &   nres_base(2,i),nres_base(3,i)
1590 c       write (iout,'(9f8.3)') ((cart_base(k,j,i),k=1,3),j=1,
1591 c    &   nres_base(1,i))
1592       enddo
1593       close (icbase)
1594       if (weidis.eq.0.0D0) weidis=0.1D0
1595       do i=nnt,nct
1596         do j=i+2,nct
1597           nhpb=nhpb+1
1598           ihpb(nhpb)=i
1599           jhpb(nhpb)=j
1600           forcon(nhpb)=weidis
1601         enddo
1602       enddo 
1603       read (inp,*) nexcl,(iexam(1,i),iexam(2,i),i=1,nexcl)
1604       write (iout,'(a,i5)') 'nexcl: ',nexcl
1605       write (iout,'(2i5)') (iexam(1,i),iexam(2,i),i=1,nexcl)
1606       return
1607       end
1608 c------------------------------------------------------------------------------
1609       subroutine setup_var
1610       implicit real*8 (a-h,o-z)
1611       include 'DIMENSIONS'
1612       include 'COMMON.IOUNITS'
1613       include 'COMMON.GEO'
1614       include 'COMMON.VAR'
1615       include 'COMMON.INTERACT'
1616       include 'COMMON.LOCAL'
1617       include 'COMMON.NAMES'
1618       include 'COMMON.CHAIN'
1619       include 'COMMON.FFIELD'
1620       include 'COMMON.SBRIDGE'
1621       include 'COMMON.HEADER'
1622       include 'COMMON.CONTROL'
1623       include 'COMMON.DBASE'
1624       include 'COMMON.THREAD'
1625       include 'COMMON.TIME1'
1626 C Set up variable list.
1627       ntheta=nres-2
1628       nphi=nres-3
1629       nvar=ntheta+nphi
1630       nside=0
1631       do i=2,nres-1
1632         if (itype(i).ne.10) then
1633           nside=nside+1
1634           ialph(i,1)=nvar+nside
1635           ialph(nside,2)=i
1636         endif
1637       enddo
1638       if (indphi.gt.0) then
1639         nvar=nphi
1640       else if (indback.gt.0) then
1641         nvar=nphi+ntheta
1642       else
1643         nvar=nvar+2*nside
1644       endif
1645 cd    write (iout,'(3i4)') (i,ialph(i,1),ialph(i,2),i=2,nres-1)
1646       return
1647       end
1648 c----------------------------------------------------------------------------
1649       subroutine gen_dist_constr
1650 C Generate CA distance constraints.
1651       implicit real*8 (a-h,o-z)
1652       include 'DIMENSIONS'
1653       include 'COMMON.IOUNITS'
1654       include 'COMMON.GEO'
1655       include 'COMMON.VAR'
1656       include 'COMMON.INTERACT'
1657       include 'COMMON.LOCAL'
1658       include 'COMMON.NAMES'
1659       include 'COMMON.CHAIN'
1660       include 'COMMON.FFIELD'
1661       include 'COMMON.SBRIDGE'
1662       include 'COMMON.HEADER'
1663       include 'COMMON.CONTROL'
1664       include 'COMMON.DBASE'
1665       include 'COMMON.THREAD'
1666       include 'COMMON.TIME1'
1667       dimension itype_pdb(maxres)
1668       common /pizda/ itype_pdb
1669       character*2 iden
1670 cd      print *,'gen_dist_constr: nnt=',nnt,' nct=',nct
1671 cd      write (2,*) 'gen_dist_constr: nnt=',nnt,' nct=',nct,
1672 cd     & ' nstart_sup',nstart_sup,' nstart_seq',nstart_seq,
1673 cd     & ' nsup',nsup
1674       do i=nstart_sup,nstart_sup+nsup-1
1675 cd      write (2,*) 'i',i,' seq ',restyp(itype(i+nstart_seq-nstart_sup)),
1676 cd     &    ' seq_pdb', restyp(itype_pdb(i))
1677         do j=i+2,nstart_sup+nsup-1
1678           nhpb=nhpb+1
1679           ihpb(nhpb)=i+nstart_seq-nstart_sup
1680           jhpb(nhpb)=j+nstart_seq-nstart_sup
1681           forcon(nhpb)=weidis
1682           dhpb(nhpb)=dist(i,j)
1683         enddo
1684       enddo 
1685 cd      write (iout,'(a)') 'Distance constraints:' 
1686 cd      do i=nss+1,nhpb
1687 cd        ii=ihpb(i)
1688 cd        jj=jhpb(i)
1689 cd        iden='CA'
1690 cd        if (ii.gt.nres) then
1691 cd          iden='SC'
1692 cd          ii=ii-nres
1693 cd          jj=jj-nres
1694 cd        endif
1695 cd        write (iout,'(a,1x,a,i4,3x,a,1x,a,i4,2f10.3)') 
1696 cd     &  restyp(itype(ii)),iden,ii,restyp(itype(jj)),iden,jj,
1697 cd     &  dhpb(i),forcon(i)
1698 cd      enddo
1699       return
1700       end
1701 c----------------------------------------------------------------------------
1702       subroutine map_read
1703       implicit real*8 (a-h,o-z)
1704       include 'DIMENSIONS'
1705       include 'COMMON.MAP'
1706       include 'COMMON.IOUNITS'
1707       character*3 angid(4) /'THE','PHI','ALP','OME'/
1708       character*80 mapcard,ucase
1709       do imap=1,nmap
1710         read (inp,'(a)') mapcard
1711         mapcard=ucase(mapcard)
1712         if (index(mapcard,'PHI').gt.0) then
1713           kang(imap)=1
1714         else if (index(mapcard,'THE').gt.0) then
1715           kang(imap)=2
1716         else if (index(mapcard,'ALP').gt.0) then
1717           kang(imap)=3
1718         else if (index(mapcard,'OME').gt.0) then
1719           kang(imap)=4
1720         else
1721           write(iout,'(a)')'Error - illegal variable spec in MAP card.'
1722           stop 'Error - illegal variable spec in MAP card.'
1723         endif
1724         call readi (mapcard,'RES1',res1(imap),0)
1725         call readi (mapcard,'RES2',res2(imap),0)
1726         if (res1(imap).eq.0) then
1727           res1(imap)=res2(imap)
1728         else if (res2(imap).eq.0) then
1729           res2(imap)=res1(imap)
1730         endif
1731         if(res1(imap)*res2(imap).eq.0 .or. res1(imap).gt.res2(imap))then
1732           write (iout,'(a)') 
1733      &    'Error - illegal definition of variable group in MAP.'
1734           stop 'Error - illegal definition of variable group in MAP.'
1735         endif
1736         call reada(mapcard,'FROM',ang_from(imap),0.0D0)
1737         call reada(mapcard,'TO',ang_to(imap),0.0D0)
1738         call readi(mapcard,'NSTEP',nstep(imap),0)
1739         if (ang_from(imap).eq.ang_to(imap) .or. nstep(imap).eq.0) then
1740           write (iout,'(a)') 
1741      &     'Illegal boundary and/or step size specification in MAP.'
1742           stop 'Illegal boundary and/or step size specification in MAP.'
1743         endif
1744       enddo ! imap
1745       return
1746       end 
1747 c----------------------------------------------------------------------------
1748 csa      subroutine csaread
1749 csa      implicit real*8 (a-h,o-z)
1750 csa      include 'DIMENSIONS'
1751 csa      include 'COMMON.IOUNITS'
1752 csa      include 'COMMON.GEO'
1753 csa      include 'COMMON.CSA'
1754 csa      include 'COMMON.BANK'
1755 csa      include 'COMMON.CONTROL'
1756 csa      character*80 ucase
1757 csa      character*620 mcmcard
1758 csa      call card_concat(mcmcard)
1759 csa
1760 csa      call readi(mcmcard,'NCONF',nconf,50)
1761 csa      call readi(mcmcard,'NADD',nadd,0)
1762 csa      call readi(mcmcard,'JSTART',jstart,1)
1763 csa      call readi(mcmcard,'JEND',jend,1)
1764 csa      call readi(mcmcard,'NSTMAX',nstmax,500000)
1765 csa      call readi(mcmcard,'N0',n0,1)
1766 csa      call readi(mcmcard,'N1',n1,6)
1767 csa      call readi(mcmcard,'N2',n2,4)
1768 csa      call readi(mcmcard,'N3',n3,0)
1769 csa      call readi(mcmcard,'N4',n4,0)
1770 csa      call readi(mcmcard,'N5',n5,0)
1771 csa      call readi(mcmcard,'N6',n6,10)
1772 csa      call readi(mcmcard,'N7',n7,0)
1773 csa      call readi(mcmcard,'N8',n8,0)
1774 csa      call readi(mcmcard,'N9',n9,0)
1775 csa      call readi(mcmcard,'N14',n14,0)
1776 csa      call readi(mcmcard,'N15',n15,0)
1777 csa      call readi(mcmcard,'N16',n16,0)
1778 csa      call readi(mcmcard,'N17',n17,0)
1779 csa      call readi(mcmcard,'N18',n18,0)
1780 csa
1781 csa      vdisulf=(index(mcmcard,'DYNSS').gt.0)
1782 csa
1783 csa      call readi(mcmcard,'NDIFF',ndiff,2)
1784 csa      call reada(mcmcard,'DIFFCUT',diffcut,0.0d0)
1785 csa      call readi(mcmcard,'IS1',is1,1)
1786 csa      call readi(mcmcard,'IS2',is2,8)
1787 csa      call readi(mcmcard,'NRAN0',nran0,4)
1788 csa      call readi(mcmcard,'NRAN1',nran1,2)
1789 csa      call readi(mcmcard,'IRR',irr,1)
1790 csa      call readi(mcmcard,'NSEED',nseed,20)
1791 csa      call readi(mcmcard,'NTOTAL',ntotal,10000)
1792 csa      call reada(mcmcard,'CUT1',cut1,2.0d0)
1793 csa      call reada(mcmcard,'CUT2',cut2,5.0d0)
1794 csa      call reada(mcmcard,'ESTOP',estop,-3000.0d0)
1795 csa      call readi(mcmcard,'ICMAX',icmax,3)
1796 csa      call readi(mcmcard,'IRESTART',irestart,0)
1797 csac!bankt      call readi(mcmcard,'NBANKTM',ntbankm,0)
1798 csa      ntbankm=0
1799 csac!bankt
1800 csa      call reada(mcmcard,'DELE',dele,20.0d0)
1801 csa      call reada(mcmcard,'DIFCUT',difcut,720.0d0)
1802 csa      call readi(mcmcard,'IREF',iref,0)
1803 csa      call reada(mcmcard,'RMSCUT',rmscut,4.0d0)
1804 csa      call reada(mcmcard,'PNCCUT',pnccut,0.5d0)
1805 csa      call readi(mcmcard,'NCONF_IN',nconf_in,0)
1806 csa      call reada(mcmcard,'RDIH_BIAS',rdih_bias,0.5d0)
1807 csa      write (iout,*) "NCONF_IN",nconf_in
1808 csa      return
1809 csa      end
1810 c----------------------------------------------------------------------------
1811 cfmc      subroutine mcmfread
1812 cfmc      implicit real*8 (a-h,o-z)
1813 cfmc      include 'DIMENSIONS'
1814 cfmc      include 'COMMON.MCMF'
1815 cfmc      include 'COMMON.IOUNITS'
1816 cfmc      include 'COMMON.GEO'
1817 cfmc      character*80 ucase
1818 cfmc      character*620 mcmcard
1819 cfmc      call card_concat(mcmcard)
1820 cfmc
1821 cfmc      call readi(mcmcard,'MAXRANT',maxrant,1000)
1822 cfmc      write(iout,*)'MAXRANT=',maxrant
1823 cfmc      call readi(mcmcard,'MAXFAM',maxfam,maxfam_p)
1824 cfmc      write(iout,*)'MAXFAM=',maxfam
1825 cfmc      call readi(mcmcard,'NNET1',nnet1,5)
1826 cfmc      write(iout,*)'NNET1=',nnet1
1827 cfmc      call readi(mcmcard,'NNET2',nnet2,4)
1828 cfmc      write(iout,*)'NNET2=',nnet2
1829 cfmc      call readi(mcmcard,'NNET3',nnet3,4)
1830 cfmc      write(iout,*)'NNET3=',nnet3
1831 cfmc      call readi(mcmcard,'ILASTT',ilastt,0)
1832 cfmc      write(iout,*)'ILASTT=',ilastt
1833 cfmc      call readi(mcmcard,'MAXSTR',maxstr,maxstr_mcmf)
1834 cfmc      write(iout,*)'MAXSTR=',maxstr
1835 cfmc      maxstr_f=maxstr/maxfam
1836 cfmc      write(iout,*)'MAXSTR_F=',maxstr_f
1837 cfmc      call readi(mcmcard,'NMCMF',nmcmf,10)
1838 cfmc      write(iout,*)'NMCMF=',nmcmf
1839 cfmc      call readi(mcmcard,'IFOCUS',ifocus,nmcmf)
1840 cfmc      write(iout,*)'IFOCUS=',ifocus
1841 cfmc      call readi(mcmcard,'NLOCMCMF',nlocmcmf,1000)
1842 cfmc      write(iout,*)'NLOCMCMF=',nlocmcmf
1843 cfmc      call readi(mcmcard,'INTPRT',intprt,1000)
1844 cfmc      write(iout,*)'INTPRT=',intprt
1845 cfmc      call readi(mcmcard,'IPRT',iprt,100)
1846 cfmc      write(iout,*)'IPRT=',iprt
1847 cfmc      call readi(mcmcard,'IMAXTR',imaxtr,100)
1848 cfmc      write(iout,*)'IMAXTR=',imaxtr
1849 cfmc      call readi(mcmcard,'MAXEVEN',maxeven,1000)
1850 cfmc      write(iout,*)'MAXEVEN=',maxeven
1851 cfmc      call readi(mcmcard,'MAXEVEN1',maxeven1,3)
1852 cfmc      write(iout,*)'MAXEVEN1=',maxeven1
1853 cfmc      call readi(mcmcard,'INIMIN',inimin,200)
1854 cfmc      write(iout,*)'INIMIN=',inimin
1855 cfmc      call readi(mcmcard,'NSTEPMCMF',nstepmcmf,10)
1856 cfmc      write(iout,*)'NSTEPMCMF=',nstepmcmf
1857 cfmc      call readi(mcmcard,'NTHREAD',nthread,5)
1858 cfmc      write(iout,*)'NTHREAD=',nthread
1859 cfmc      call readi(mcmcard,'MAXSTEPMCMF',maxstepmcmf,2500)
1860 cfmc      write(iout,*)'MAXSTEPMCMF=',maxstepmcmf
1861 cfmc      call readi(mcmcard,'MAXPERT',maxpert,9)
1862 cfmc      write(iout,*)'MAXPERT=',maxpert
1863 cfmc      call readi(mcmcard,'IRMSD',irmsd,1)
1864 cfmc      write(iout,*)'IRMSD=',irmsd
1865 cfmc      call reada(mcmcard,'DENEMIN',denemin,0.01D0)
1866 cfmc      write(iout,*)'DENEMIN=',denemin
1867 cfmc      call reada(mcmcard,'RCUT1S',rcut1s,3.5D0)
1868 cfmc      write(iout,*)'RCUT1S=',rcut1s
1869 cfmc      call reada(mcmcard,'RCUT1E',rcut1e,2.0D0)
1870 cfmc      write(iout,*)'RCUT1E=',rcut1e
1871 cfmc      call reada(mcmcard,'RCUT2S',rcut2s,0.5D0)
1872 cfmc      write(iout,*)'RCUT2S=',rcut2s
1873 cfmc      call reada(mcmcard,'RCUT2E',rcut2e,0.1D0)
1874 cfmc      write(iout,*)'RCUT2E=',rcut2e
1875 cfmc      call reada(mcmcard,'DPERT1',d_pert1,180.0D0)
1876 cfmc      write(iout,*)'DPERT1=',d_pert1
1877 cfmc      call reada(mcmcard,'DPERT1A',d_pert1a,180.0D0)
1878 cfmc      write(iout,*)'DPERT1A=',d_pert1a
1879 cfmc      call reada(mcmcard,'DPERT2',d_pert2,90.0D0)
1880 cfmc      write(iout,*)'DPERT2=',d_pert2
1881 cfmc      call reada(mcmcard,'DPERT2A',d_pert2a,45.0D0)
1882 cfmc      write(iout,*)'DPERT2A=',d_pert2a
1883 cfmc      call reada(mcmcard,'DPERT2B',d_pert2b,90.0D0)
1884 cfmc      write(iout,*)'DPERT2B=',d_pert2b
1885 cfmc      call reada(mcmcard,'DPERT2C',d_pert2c,60.0D0)
1886 cfmc      write(iout,*)'DPERT2C=',d_pert2c
1887 cfmc      d_pert1=deg2rad*d_pert1
1888 cfmc      d_pert1a=deg2rad*d_pert1a
1889 cfmc      d_pert2=deg2rad*d_pert2
1890 cfmc      d_pert2a=deg2rad*d_pert2a
1891 cfmc      d_pert2b=deg2rad*d_pert2b
1892 cfmc      d_pert2c=deg2rad*d_pert2c
1893 cfmc      call reada(mcmcard,'KT_MCMF1',kt_mcmf1,1.0D0)
1894 cfmc      write(iout,*)'KT_MCMF1=',kt_mcmf1
1895 cfmc      call reada(mcmcard,'KT_MCMF2',kt_mcmf2,1.0D0)
1896 cfmc      write(iout,*)'KT_MCMF2=',kt_mcmf2
1897 cfmc      call reada(mcmcard,'DKT_MCMF1',dkt_mcmf1,10.0D0)
1898 cfmc      write(iout,*)'DKT_MCMF1=',dkt_mcmf1
1899 cfmc      call reada(mcmcard,'DKT_MCMF2',dkt_mcmf2,1.0D0)
1900 cfmc      write(iout,*)'DKT_MCMF2=',dkt_mcmf2
1901 cfmc      call reada(mcmcard,'RCUTINI',rcutini,3.5D0)
1902 cfmc      write(iout,*)'RCUTINI=',rcutini
1903 cfmc      call reada(mcmcard,'GRAT',grat,0.5D0)
1904 cfmc      write(iout,*)'GRAT=',grat
1905 cfmc      call reada(mcmcard,'BIAS_MCMF',bias_mcmf,0.0D0)
1906 cfmc      write(iout,*)'BIAS_MCMF=',bias_mcmf
1907 cfmc
1908 cfmc      return
1909 cfmc      end 
1910 c----------------------------------------------------------------------------
1911       subroutine mcmread
1912       implicit real*8 (a-h,o-z)
1913       include 'DIMENSIONS'
1914       include 'COMMON.MCM'
1915       include 'COMMON.MCE'
1916       include 'COMMON.IOUNITS'
1917       character*80 ucase
1918       character*320 mcmcard
1919       call card_concat(mcmcard)
1920       call readi(mcmcard,'MAXACC',maxacc,100)
1921       call readi(mcmcard,'MAX_MCM_IT',max_mcm_it,10000)
1922       call readi(mcmcard,'MAXTRIAL',maxtrial,100)
1923       call readi(mcmcard,'MAXTRIAL_ITER',maxtrial_iter,1000)
1924       call readi(mcmcard,'MAXREPM',maxrepm,200)
1925       call reada(mcmcard,'RANFRACT',RanFract,0.5D0)
1926       call reada(mcmcard,'POOL_FRACT',pool_fraction,0.01D0)
1927       call reada(mcmcard,'OVERLAP',overlap_cut,1.0D3)
1928       call reada(mcmcard,'E_UP',e_up,5.0D0)
1929       call reada(mcmcard,'DELTE',delte,0.1D0)
1930       call readi(mcmcard,'NSWEEP',nsweep,5)
1931       call readi(mcmcard,'NSTEPH',nsteph,0)
1932       call readi(mcmcard,'NSTEPC',nstepc,0)
1933       call reada(mcmcard,'TMIN',tmin,298.0D0)
1934       call reada(mcmcard,'TMAX',tmax,298.0D0)
1935       call readi(mcmcard,'NWINDOW',nwindow,0)
1936       call readi(mcmcard,'PRINT_MC',print_mc,0)
1937       print_stat=(index(mcmcard,'NO_PRINT_STAT').le.0)
1938       print_int=(index(mcmcard,'NO_PRINT_INT').le.0)
1939       ent_read=(index(mcmcard,'ENT_READ').gt.0)
1940       call readi(mcmcard,'SAVE_FREQ',save_frequency,1000)
1941       call readi(mcmcard,'MESSAGE_FREQ',message_frequency,1000)
1942       call readi(mcmcard,'POOL_READ_FREQ',pool_read_freq,5000)
1943       call readi(mcmcard,'POOL_SAVE_FREQ',pool_save_freq,1000)
1944       call readi(mcmcard,'PRINT_FREQ',print_freq,1000)
1945       if (nwindow.gt.0) then
1946         read (inp,*) (winstart(i),winend(i),i=1,nwindow)
1947         do i=1,nwindow
1948           winlen(i)=winend(i)-winstart(i)+1
1949         enddo
1950       endif
1951       if (tmax.lt.tmin) tmax=tmin
1952       if (tmax.eq.tmin) then
1953         nstepc=0
1954         nsteph=0
1955       endif
1956       if (nstepc.gt.0 .and. nsteph.gt.0) then
1957         tsteph=(tmax/tmin)**(1.0D0/(nsteph+0.0D0)) 
1958         tstepc=(tmax/tmin)**(1.0D0/(nstepc+0.0D0)) 
1959       endif
1960 C Probabilities of different move types
1961       sumpro_type(0)=0.0D0
1962       call reada(mcmcard,'MULTI_BOND',sumpro_type(1),1.0d0)
1963       call reada(mcmcard,'ONE_ANGLE' ,sumpro_type(2),2.0d0)
1964       sumpro_type(2)=sumpro_type(1)+sumpro_type(2)
1965       call reada(mcmcard,'THETA'     ,sumpro_type(3),0.0d0)
1966       sumpro_type(3)=sumpro_type(2)+sumpro_type(3)
1967       call reada(mcmcard,'SIDE_CHAIN',sumpro_type(4),0.5d0)
1968       sumpro_type(4)=sumpro_type(3)+sumpro_type(4)
1969       do i=1,MaxMoveType
1970         print *,'i',i,' sumprotype',sumpro_type(i)
1971         sumpro_type(i)=sumpro_type(i)/sumpro_type(MaxMoveType)
1972         print *,'i',i,' sumprotype',sumpro_type(i)
1973       enddo
1974       return
1975       end 
1976 c----------------------------------------------------------------------------
1977       subroutine read_minim
1978       implicit real*8 (a-h,o-z)
1979       include 'DIMENSIONS'
1980       include 'COMMON.MINIM'
1981       include 'COMMON.IOUNITS'
1982       character*80 ucase
1983       character*320 minimcard
1984       call card_concat(minimcard)
1985       call readi(minimcard,'MAXMIN',maxmin,2000)
1986       call readi(minimcard,'MAXFUN',maxfun,5000)
1987       call readi(minimcard,'MINMIN',minmin,maxmin)
1988       call readi(minimcard,'MINFUN',minfun,maxmin)
1989       call reada(minimcard,'TOLF',tolf,1.0D-2)
1990       call reada(minimcard,'RTOLF',rtolf,1.0D-4)
1991       print_min_stat=min0(index(minimcard,'PRINT_MIN_STAT'),1)
1992       print_min_res=min0(index(minimcard,'PRINT_MIN_RES'),1)
1993       print_min_ini=min0(index(minimcard,'PRINT_MIN_INI'),1)
1994       write (iout,'(/80(1h*)/20x,a/80(1h*))') 
1995      &         'Options in energy minimization:'
1996       write (iout,'(4(a,i5),a,1pe14.5,a,1pe14.5)')
1997      & 'MaxMin:',MaxMin,' MaxFun:',MaxFun,
1998      & 'MinMin:',MinMin,' MinFun:',MinFun,
1999      & ' TolF:',TolF,' RTolF:',RTolF
2000       return
2001       end
2002 c----------------------------------------------------------------------------
2003       subroutine read_angles(kanal,*)
2004       implicit real*8 (a-h,o-z)
2005       include 'DIMENSIONS'
2006       include 'COMMON.GEO'
2007       include 'COMMON.VAR'
2008       include 'COMMON.CHAIN'
2009       include 'COMMON.IOUNITS'
2010       include 'COMMON.CONTROL'
2011 c Read angles from input 
2012 c
2013        read (kanal,*,err=10,end=10) (theta(i),i=3,nres)
2014        read (kanal,*,err=10,end=10) (phi(i),i=4,nres)
2015        read (kanal,*,err=10,end=10) (alph(i),i=2,nres-1)
2016        read (kanal,*,err=10,end=10) (omeg(i),i=2,nres-1)
2017
2018        do i=1,nres
2019 c 9/7/01 avoid 180 deg valence angle
2020         if (theta(i).gt.179.99d0) theta(i)=179.99d0
2021 c
2022         theta(i)=deg2rad*theta(i)
2023         phi(i)=deg2rad*phi(i)
2024         alph(i)=deg2rad*alph(i)
2025         omeg(i)=deg2rad*omeg(i)
2026        enddo
2027       return
2028    10 return1
2029       end
2030 c----------------------------------------------------------------------------
2031       subroutine reada(rekord,lancuch,wartosc,default)
2032       implicit none
2033       character*(*) rekord,lancuch
2034       double precision wartosc,default
2035       integer ilen,iread
2036       external ilen
2037       iread=index(rekord,lancuch)
2038       if (iread.eq.0) then
2039         wartosc=default 
2040         return
2041       endif   
2042       iread=iread+ilen(lancuch)+1
2043       read (rekord(iread:),*,err=10,end=10) wartosc
2044       return
2045   10  wartosc=default
2046       return
2047       end
2048 c----------------------------------------------------------------------------
2049       subroutine readi(rekord,lancuch,wartosc,default)
2050       implicit none
2051       character*(*) rekord,lancuch
2052       integer wartosc,default
2053       integer ilen,iread
2054       external ilen
2055       iread=index(rekord,lancuch)
2056       if (iread.eq.0) then
2057         wartosc=default 
2058         return
2059       endif   
2060       iread=iread+ilen(lancuch)+1
2061       read (rekord(iread:),*,err=10,end=10) wartosc
2062       return
2063   10  wartosc=default
2064       return
2065       end
2066 c----------------------------------------------------------------------------
2067       subroutine multreadi(rekord,lancuch,tablica,dim,default)
2068       implicit none
2069       integer dim,i
2070       integer tablica(dim),default
2071       character*(*) rekord,lancuch
2072       character*80 aux
2073       integer ilen,iread
2074       external ilen
2075       do i=1,dim
2076         tablica(i)=default
2077       enddo
2078       iread=index(rekord,lancuch(:ilen(lancuch))//"=")
2079       if (iread.eq.0) return
2080       iread=iread+ilen(lancuch)+1
2081       read (rekord(iread:),*,end=10,err=10) (tablica(i),i=1,dim)
2082    10 return
2083       end
2084 c----------------------------------------------------------------------------
2085       subroutine multreada(rekord,lancuch,tablica,dim,default)
2086       implicit none
2087       integer dim,i
2088       double precision tablica(dim),default
2089       character*(*) rekord,lancuch
2090       character*80 aux
2091       integer ilen,iread
2092       external ilen
2093       do i=1,dim
2094         tablica(i)=default
2095       enddo
2096       iread=index(rekord,lancuch(:ilen(lancuch))//"=")
2097       if (iread.eq.0) return
2098       iread=iread+ilen(lancuch)+1
2099       read (rekord(iread:),*,end=10,err=10) (tablica(i),i=1,dim)
2100    10 return
2101       end
2102 c----------------------------------------------------------------------------
2103       subroutine openunits
2104       implicit real*8 (a-h,o-z)
2105       include 'DIMENSIONS'    
2106 #ifdef MPI
2107       include 'mpif.h'
2108       character*16 form,nodename
2109       integer nodelen
2110 #endif
2111       include 'COMMON.SETUP'
2112       include 'COMMON.IOUNITS'
2113       include 'COMMON.MD'
2114       include 'COMMON.CONTROL'
2115       integer lenpre,lenpot,ilen,lentmp
2116       external ilen
2117       character*3 out1file_text,ucase
2118       character*3 ll
2119       external ucase
2120 c      print *,"Processor",myrank,"fg_rank",fg_rank," entered openunits"
2121       call getenv_loc("PREFIX",prefix)
2122       pref_orig = prefix
2123       call getenv_loc("POT",pot)
2124       call getenv_loc("DIRTMP",tmpdir)
2125       call getenv_loc("CURDIR",curdir)
2126       call getenv_loc("OUT1FILE",out1file_text)
2127 c      print *,"Processor",myrank,"fg_rank",fg_rank," did GETENV"
2128       out1file_text=ucase(out1file_text)
2129       if (out1file_text(1:1).eq."Y") then
2130         out1file=.true.
2131       else 
2132         out1file=fg_rank.gt.0
2133       endif
2134       lenpre=ilen(prefix)
2135       lenpot=ilen(pot)
2136       lentmp=ilen(tmpdir)
2137       if (lentmp.gt.0) then
2138           write (*,'(80(1h!))')
2139           write (*,'(a,19x,a,19x,a)') "!","  A T T E N T I O N  ","!"
2140           write (*,'(80(1h!))')
2141           write (*,*)"All output files will be on node /tmp directory." 
2142 #ifdef MPI
2143         call  MPI_GET_PROCESSOR_NAME( nodename, nodelen, IERROR )
2144         if (me.eq.king) then
2145           write (*,*) "The master node is ",nodename
2146         else if (fg_rank.eq.0) then
2147           write (*,*) "I am the CG slave node ",nodename
2148         else 
2149           write (*,*) "I am the FG slave node ",nodename
2150         endif
2151 #endif
2152         PREFIX = tmpdir(:lentmp)//'/'//prefix(:lenpre)
2153         lenpre = lentmp+lenpre+1
2154       endif
2155       entname=prefix(:lenpre)//'_'//pot(:lenpot)//'.entr'
2156 C Get the names and open the input files
2157 #if defined(WINIFL) || defined(WINPGI)
2158       open(1,file=pref_orig(:ilen(pref_orig))//
2159      &  '.inp',status='old',readonly,shared)
2160        open (9,file=prefix(:ilen(prefix))//'.intin',status='unknown')
2161 C      open (18,file=prefix(:ilen(prefix))//'.entin',status='unknown')
2162 C Get parameter filenames and open the parameter files.
2163       call getenv_loc('BONDPAR',bondname)
2164       open (ibond,file=bondname,status='old',readonly,shared)
2165       call getenv_loc('THETPAR',thetname)
2166       open (ithep,file=thetname,status='old',readonly,shared)
2167 #ifndef CRYST_THETA
2168       call getenv_loc('THETPARPDB',thetname_pdb)
2169       open (ithep_pdb,file=thetname_pdb,status='old',readonly,shared)
2170 #endif
2171       call getenv_loc('ROTPAR',rotname)
2172       open (irotam,file=rotname,status='old',readonly,shared)
2173 #ifndef CRYST_SC
2174       call getenv_loc('ROTPARPDB',rotname_pdb)
2175       open (irotam_pdb,file=rotname_pdb,status='old',readonly,shared)
2176 #endif
2177       call getenv_loc('TORPAR',torname)
2178       open (itorp,file=torname,status='old',readonly,shared)
2179       call getenv_loc('TORDPAR',tordname)
2180       open (itordp,file=tordname,status='old',readonly,shared)
2181       call getenv_loc('FOURIER',fouriername)
2182       open (ifourier,file=fouriername,status='old',readonly,shared)
2183       call getenv_loc('ELEPAR',elename)
2184       open (ielep,file=elename,status='old',readonly,shared)
2185       call getenv_loc('SIDEPAR',sidename)
2186       open (isidep,file=sidename,status='old',readonly,shared)
2187 #elif (defined CRAY) || (defined AIX)
2188       open(1,file=pref_orig(:ilen(pref_orig))//'.inp',status='old',
2189      &  action='read')
2190 c      print *,"Processor",myrank," opened file 1" 
2191       open (9,file=prefix(:ilen(prefix))//'.intin',status='unknown')
2192 c      print *,"Processor",myrank," opened file 9" 
2193 C      open (18,file=prefix(:ilen(prefix))//'.entin',status='unknown')
2194 C Get parameter filenames and open the parameter files.
2195       call getenv_loc('BONDPAR',bondname)
2196       open (ibond,file=bondname,status='old',action='read')
2197 c      print *,"Processor",myrank," opened file IBOND" 
2198       call getenv_loc('THETPAR',thetname)
2199       open (ithep,file=thetname,status='old',action='read')
2200 c      print *,"Processor",myrank," opened file ITHEP" 
2201 #ifndef CRYST_THETA
2202       call getenv_loc('THETPARPDB',thetname_pdb)
2203       open (ithep_pdb,file=thetname_pdb,status='old',action='read')
2204 #endif
2205       call getenv_loc('ROTPAR',rotname)
2206       open (irotam,file=rotname,status='old',action='read')
2207 c      print *,"Processor",myrank," opened file IROTAM" 
2208 #ifndef CRYST_SC
2209       call getenv_loc('ROTPARPDB',rotname_pdb)
2210       open (irotam_pdb,file=rotname_pdb,status='old',action='read')
2211 #endif
2212       call getenv_loc('TORPAR',torname)
2213       open (itorp,file=torname,status='old',action='read')
2214 c      print *,"Processor",myrank," opened file ITORP" 
2215       call getenv_loc('TORDPAR',tordname)
2216       open (itordp,file=tordname,status='old',action='read')
2217 c      print *,"Processor",myrank," opened file ITORDP" 
2218       call getenv_loc('SCCORPAR',sccorname)
2219       open (isccor,file=sccorname,status='old',action='read')
2220 c      print *,"Processor",myrank," opened file ISCCOR" 
2221       call getenv_loc('FOURIER',fouriername)
2222       open (ifourier,file=fouriername,status='old',action='read')
2223 c      print *,"Processor",myrank," opened file IFOURIER" 
2224       call getenv_loc('ELEPAR',elename)
2225       open (ielep,file=elename,status='old',action='read')
2226 c      print *,"Processor",myrank," opened file IELEP" 
2227       call getenv_loc('SIDEPAR',sidename)
2228       open (isidep,file=sidename,status='old',action='read')
2229 c      print *,"Processor",myrank," opened file ISIDEP" 
2230 c      print *,"Processor",myrank," opened parameter files" 
2231 #elif (defined G77)
2232       open(1,file=pref_orig(:ilen(pref_orig))//'.inp',status='old')
2233       open (9,file=prefix(:ilen(prefix))//'.intin',status='unknown')
2234 C      open (18,file=prefix(:ilen(prefix))//'.entin',status='unknown')
2235 C Get parameter filenames and open the parameter files.
2236       call getenv_loc('BONDPAR',bondname)
2237       open (ibond,file=bondname,status='old')
2238       call getenv_loc('THETPAR',thetname)
2239       open (ithep,file=thetname,status='old')
2240 #ifndef CRYST_THETA
2241       call getenv_loc('THETPARPDB',thetname_pdb)
2242       open (ithep_pdb,file=thetname_pdb,status='old')
2243 #endif
2244       call getenv_loc('ROTPAR',rotname)
2245       open (irotam,file=rotname,status='old')
2246 #ifndef CRYST_SC
2247       call getenv_loc('ROTPARPDB',rotname_pdb)
2248       open (irotam_pdb,file=rotname_pdb,status='old')
2249 #endif
2250       call getenv_loc('TORPAR',torname)
2251       open (itorp,file=torname,status='old')
2252       call getenv_loc('TORDPAR',tordname)
2253       open (itordp,file=tordname,status='old')
2254       call getenv_loc('SCCORPAR',sccorname)
2255       open (isccor,file=sccorname,status='old')
2256       call getenv_loc('FOURIER',fouriername)
2257       open (ifourier,file=fouriername,status='old')
2258       call getenv_loc('ELEPAR',elename)
2259       open (ielep,file=elename,status='old')
2260       call getenv_loc('SIDEPAR',sidename)
2261       open (isidep,file=sidename,status='old')
2262 #else
2263       open(1,file=pref_orig(:ilen(pref_orig))//'.inp',status='old',
2264      &action='read')
2265        open (9,file=prefix(:ilen(prefix))//'.intin',status='unknown')
2266 C      open (18,file=prefix(:ilen(prefix))//'.entin',status='unknown')
2267 C Get parameter filenames and open the parameter files.
2268       call getenv_loc('BONDPAR',bondname)
2269       open (ibond,file=bondname,status='old',action='read')
2270       call getenv_loc('THETPAR',thetname)
2271       open (ithep,file=thetname,status='old',action='read')
2272 #ifndef CRYST_THETA
2273       call getenv_loc('THETPARPDB',thetname_pdb)
2274       print *,"thetname_pdb ",thetname_pdb
2275       open (ithep_pdb,file=thetname_pdb,status='old',action='read')
2276       print *,ithep_pdb," opened"
2277 #endif
2278       call getenv_loc('ROTPAR',rotname)
2279       open (irotam,file=rotname,status='old',action='read')
2280 #ifndef CRYST_SC
2281       call getenv_loc('ROTPARPDB',rotname_pdb)
2282       open (irotam_pdb,file=rotname_pdb,status='old',action='read')
2283 #endif
2284       call getenv_loc('TORPAR',torname)
2285       open (itorp,file=torname,status='old',action='read')
2286       call getenv_loc('TORDPAR',tordname)
2287       open (itordp,file=tordname,status='old',action='read')
2288       call getenv_loc('SCCORPAR',sccorname)
2289       open (isccor,file=sccorname,status='old',action='read')
2290       call getenv_loc('FOURIER',fouriername)
2291       open (ifourier,file=fouriername,status='old',action='read')
2292       call getenv_loc('ELEPAR',elename)
2293       open (ielep,file=elename,status='old',action='read')
2294       call getenv_loc('SIDEPAR',sidename)
2295       open (isidep,file=sidename,status='old',action='read')
2296 #endif
2297 #ifndef OLDSCP
2298 C
2299 C 8/9/01 In the newest version SCp interaction constants are read from a file
2300 C Use -DOLDSCP to use hard-coded constants instead.
2301 C
2302       call getenv_loc('SCPPAR',scpname)
2303 #if defined(WINIFL) || defined(WINPGI)
2304       open (iscpp,file=scpname,status='old',readonly,shared)
2305 #elif (defined CRAY)  || (defined AIX)
2306       open (iscpp,file=scpname,status='old',action='read')
2307 #elif (defined G77)
2308       open (iscpp,file=scpname,status='old')
2309 #else
2310       open (iscpp,file=scpname,status='old',action='read')
2311 #endif
2312 #endif
2313       call getenv_loc('PATTERN',patname)
2314 #if defined(WINIFL) || defined(WINPGI)
2315       open (icbase,file=patname,status='old',readonly,shared)
2316 #elif (defined CRAY)  || (defined AIX)
2317       open (icbase,file=patname,status='old',action='read')
2318 #elif (defined G77)
2319       open (icbase,file=patname,status='old')
2320 #else
2321       open (icbase,file=patname,status='old',action='read')
2322 #endif
2323 #ifdef MPI
2324 C Open output file only for CG processes
2325 c      print *,"Processor",myrank," fg_rank",fg_rank
2326       if (fg_rank.eq.0) then
2327
2328       if (nodes.eq.1) then
2329         npos=3
2330       else
2331         npos = dlog10(dfloat(nodes-1))+1
2332       endif
2333       if (npos.lt.3) npos=3
2334       write (liczba,'(i1)') npos
2335       form = '(bz,i'//liczba(:ilen(liczba))//'.'//liczba(:ilen(liczba))
2336      &  //')'
2337       write (liczba,form) me
2338       outname=prefix(:lenpre)//'.out_'//pot(:lenpot)//
2339      &  liczba(:ilen(liczba))
2340       intname=prefix(:lenpre)//'_'//pot(:lenpot)//liczba(:ilen(liczba))
2341      &  //'.int'
2342       pdbname=prefix(:lenpre)//'_'//pot(:lenpot)//liczba(:ilen(liczba))
2343      &  //'.pdb'
2344       mol2name=prefix(:lenpre)//'_'//pot(:lenpot)//
2345      &  liczba(:ilen(liczba))//'.mol2'
2346       cartname=prefix(:lenpre)//'_'//pot(:lenpot)//
2347      &  liczba(:ilen(liczba))//'.x'
2348       statname=prefix(:lenpre)//'_'//pot(:lenpot)//
2349      &  liczba(:ilen(liczba))//'.stat'
2350       if (lentmp.gt.0)
2351      &  call copy_to_tmp(pref_orig(:ilen(pref_orig))//'_'//pot(:lenpot)
2352      &      //liczba(:ilen(liczba))//'.stat')
2353       rest2name=prefix(:ilen(prefix))//"_"//liczba(:ilen(liczba))
2354      &  //'.rst'
2355       if(usampl) then
2356           qname=prefix(:lenpre)//'_'//pot(:lenpot)//
2357      & liczba(:ilen(liczba))//'.const'
2358       endif 
2359
2360       endif
2361 #else
2362       outname=prefix(:lenpre)//'.out_'//pot(:lenpot)
2363       intname=prefix(:lenpre)//'_'//pot(:lenpot)//'.int'
2364       pdbname=prefix(:lenpre)//'_'//pot(:lenpot)//'.pdb'
2365       mol2name=prefix(:lenpre)//'_'//pot(:lenpot)//'.mol2'
2366       cartname=prefix(:lenpre)//'_'//pot(:lenpot)//'.x'
2367       statname=prefix(:lenpre)//'_'//pot(:lenpot)//'.stat'
2368       if (lentmp.gt.0)
2369      &  call copy_to_tmp(pref_orig(:ilen(pref_orig))//'_'//pot(:lenpot)
2370      &    //'.stat')
2371       rest2name=prefix(:ilen(prefix))//'.rst'
2372       if(usampl) then 
2373          qname=prefix(:lenpre)//'_'//pot(:lenpot)//'.const'
2374       endif 
2375 #endif
2376 #if defined(AIX) || defined(PGI)
2377       if (me.eq.king .or. .not. out1file) 
2378      &   open(iout,file=outname,status='unknown')
2379 c#define DEBUG
2380 #ifdef DEBUG
2381       if (fg_rank.gt.0) then
2382         write (liczba,'(i3.3)') myrank/nfgtasks
2383         write (ll,'(bz,i3.3)') fg_rank
2384         open(iout,file="debug"//liczba(:ilen(liczba))//"."//ll,
2385      &   status='unknown')
2386       endif
2387 #endif
2388 c#undef DEBUG
2389       if(me.eq.king) then
2390        open(igeom,file=intname,status='unknown',position='append')
2391        open(ipdb,file=pdbname,status='unknown')
2392        open(imol2,file=mol2name,status='unknown')
2393        open(istat,file=statname,status='unknown',position='append')
2394       else
2395 c1out       open(iout,file=outname,status='unknown')
2396       endif
2397 #else
2398       if (me.eq.king .or. .not.out1file)
2399      &    open(iout,file=outname,status='unknown')
2400 c#define DEBUG
2401 #ifdef DEBUG
2402       if (fg_rank.gt.0) then
2403         print "Processor",fg_rank," opening output file"
2404         write (liczba,'(i3.3)') myrank/nfgtasks
2405         write (ll,'(bz,i3.3)') fg_rank
2406         open(iout,file="debug"//liczba(:ilen(liczba))//"."//ll,
2407      &   status='unknown')
2408       endif
2409 #endif
2410 c#undef DEBUG
2411       if(me.eq.king) then
2412        open(igeom,file=intname,status='unknown',access='append')
2413        open(ipdb,file=pdbname,status='unknown')
2414        open(imol2,file=mol2name,status='unknown')
2415        open(istat,file=statname,status='unknown',access='append')
2416       else
2417 c1out       open(iout,file=outname,status='unknown')
2418       endif
2419 #endif
2420 csa      csa_rbank=prefix(:lenpre)//'.CSA.rbank'
2421 csa      csa_seed=prefix(:lenpre)//'.CSA.seed'
2422 csa      csa_history=prefix(:lenpre)//'.CSA.history'
2423 csa      csa_bank=prefix(:lenpre)//'.CSA.bank'
2424 csa      csa_bank1=prefix(:lenpre)//'.CSA.bank1'
2425 csa      csa_alpha=prefix(:lenpre)//'.CSA.alpha'
2426 csa      csa_alpha1=prefix(:lenpre)//'.CSA.alpha1'
2427 csac!bankt      csa_bankt=prefix(:lenpre)//'.CSA.bankt'
2428 csa      csa_int=prefix(:lenpre)//'.int'
2429 csa      csa_bank_reminimized=prefix(:lenpre)//'.CSA.bank_reminimized'
2430 csa      csa_native_int=prefix(:lenpre)//'.CSA.native.int'
2431 csa      csa_in=prefix(:lenpre)//'.CSA.in'
2432 c      print *,"Processor",myrank,"fg_rank",fg_rank," opened files"
2433 C Write file names
2434       if (me.eq.king)then
2435       write (iout,'(80(1h-))')
2436       write (iout,'(30x,a)') "FILE ASSIGNMENT"
2437       write (iout,'(80(1h-))')
2438       write (iout,*) "Input file                      : ",
2439      &  pref_orig(:ilen(pref_orig))//'.inp'
2440       write (iout,*) "Output file                     : ",
2441      &  outname(:ilen(outname))
2442       write (iout,*)
2443       write (iout,*) "Sidechain potential file        : ",
2444      &  sidename(:ilen(sidename))
2445 #ifndef OLDSCP
2446       write (iout,*) "SCp potential file              : ",
2447      &  scpname(:ilen(scpname))
2448 #endif
2449       write (iout,*) "Electrostatic potential file    : ",
2450      &  elename(:ilen(elename))
2451       write (iout,*) "Cumulant coefficient file       : ",
2452      &  fouriername(:ilen(fouriername))
2453       write (iout,*) "Torsional parameter file        : ",
2454      &  torname(:ilen(torname))
2455       write (iout,*) "Double torsional parameter file : ",
2456      &  tordname(:ilen(tordname))
2457       write (iout,*) "SCCOR parameter file : ",
2458      &  sccorname(:ilen(sccorname))
2459       write (iout,*) "Bond & inertia constant file    : ",
2460      &  bondname(:ilen(bondname))
2461       write (iout,*) "Bending parameter file          : ",
2462      &  thetname(:ilen(thetname))
2463       write (iout,*) "Rotamer parameter file          : ",
2464      &  rotname(:ilen(rotname))
2465       write (iout,*) "Threading database              : ",
2466      &  patname(:ilen(patname))
2467       if (lentmp.ne.0) 
2468      &write (iout,*)" DIRTMP                          : ",
2469      &  tmpdir(:lentmp)
2470       write (iout,'(80(1h-))')
2471       endif
2472       return
2473       end
2474 c----------------------------------------------------------------------------
2475       subroutine card_concat(card)
2476       implicit real*8 (a-h,o-z)
2477       include 'DIMENSIONS'
2478       include 'COMMON.IOUNITS'
2479       character*(*) card
2480       character*80 karta,ucase
2481       external ilen
2482       read (inp,'(a)') karta
2483       karta=ucase(karta)
2484       card=' '
2485       do while (karta(80:80).eq.'&')
2486         card=card(:ilen(card)+1)//karta(:79)
2487         read (inp,'(a)') karta
2488         karta=ucase(karta)
2489       enddo
2490       card=card(:ilen(card)+1)//karta
2491       return
2492       end
2493 c----------------------------------------------------------------------------------
2494       subroutine readrst
2495       implicit real*8 (a-h,o-z)
2496       include 'DIMENSIONS'
2497       include 'COMMON.CHAIN'
2498       include 'COMMON.IOUNITS'
2499       include 'COMMON.MD'
2500       include 'COMMON.CONTROL'
2501       open(irest2,file=rest2name,status='unknown')
2502       read(irest2,*) totT,EK,potE,totE,t_bath
2503       do i=1,2*nres
2504          read(irest2,'(3e15.5)') (d_t(j,i),j=1,3)
2505       enddo
2506       do i=1,2*nres
2507          read(irest2,'(3e15.5)') (dc(j,i),j=1,3)
2508       enddo
2509       if(usampl.or.homol_nset.gt.1) then
2510              read (irest2,*) iset
2511       endif
2512       close(irest2)
2513       return
2514       end
2515 c---------------------------------------------------------------------------------
2516       subroutine read_fragments
2517       implicit real*8 (a-h,o-z)
2518       include 'DIMENSIONS'
2519 #ifdef MPI
2520       include 'mpif.h'
2521 #endif
2522       include 'COMMON.SETUP'
2523       include 'COMMON.CHAIN'
2524       include 'COMMON.IOUNITS'
2525       include 'COMMON.MD'
2526       include 'COMMON.CONTROL'
2527       integer iset1
2528       read(inp,*) nset,nfrag,npair,nfrag_back
2529       if(me.eq.king.or..not.out1file)
2530      & write(iout,*) "nset",nset," nfrag",nfrag," npair",npair,
2531      &  " nfrag_back",nfrag_back
2532       do iset1=1,nset
2533          read(inp,*) mset(iset1)
2534        do i=1,nfrag
2535          read(inp,*) wfrag(i,iset1),ifrag(1,i,iset1),ifrag(2,i,iset1), 
2536      &     qinfrag(i,iset1)
2537          if(me.eq.king.or..not.out1file)
2538      &    write(iout,*) "R ",i,wfrag(i,iset1),ifrag(1,i,iset1),
2539      &     ifrag(2,i,iset1), qinfrag(i,iset1)
2540        enddo
2541        do i=1,npair
2542         read(inp,*) wpair(i,iset1),ipair(1,i,iset1),ipair(2,i,iset1), 
2543      &    qinpair(i,iset1)
2544         if(me.eq.king.or..not.out1file)
2545      &   write(iout,*) "R ",i,wpair(i,iset1),ipair(1,i,iset1),
2546      &    ipair(2,i,iset1), qinpair(i,iset1)
2547        enddo 
2548        do i=1,nfrag_back
2549         read(inp,*) wfrag_back(1,i,iset1),wfrag_back(2,i,iset1),
2550      &     wfrag_back(3,i,iset1),
2551      &     ifrag_back(1,i,iset1),ifrag_back(2,i,iset1)
2552         if(me.eq.king.or..not.out1file)
2553      &   write(iout,*) "A",i,wfrag_back(1,i,iset1),
2554      &   wfrag_back(2,i,iset1),
2555      &   wfrag_back(3,i,iset1),ifrag_back(1,i,iset1),
2556      &   ifrag_back(2,i,iset1)
2557        enddo 
2558       enddo
2559       return
2560       end
2561 c-------------------------------------------------------------------------------
2562       subroutine read_dist_constr
2563       implicit real*8 (a-h,o-z)
2564       include 'DIMENSIONS'
2565 #ifdef MPI
2566       include 'mpif.h'
2567 #endif
2568       include 'COMMON.SETUP'
2569       include 'COMMON.CONTROL'
2570       include 'COMMON.CHAIN'
2571       include 'COMMON.IOUNITS'
2572       include 'COMMON.SBRIDGE'
2573       integer ifrag_(2,100),ipair_(2,100)
2574       double precision wfrag_(100),wpair_(100)
2575       character*500 controlcard
2576 c      write (iout,*) "Calling read_dist_constr"
2577 c      write (iout,*) "nres",nres," nstart_sup",nstart_sup," nsup",nsup
2578 c      call flush(iout)
2579       call card_concat(controlcard)
2580       call readi(controlcard,"NFRAG",nfrag_,0)
2581       call readi(controlcard,"NPAIR",npair_,0)
2582       call readi(controlcard,"NDIST",ndist_,0)
2583       call reada(controlcard,'DIST_CUT',dist_cut,5.0d0)
2584       call reada(controlcard,'DIST2_CUT',dist2_cut,9999.0d0)
2585       call multreadi(controlcard,"IFRAG",ifrag_(1,1),2*nfrag_,0)
2586       call multreadi(controlcard,"IPAIR",ipair_(1,1),2*npair_,0)
2587       call multreada(controlcard,"WFRAG",wfrag_(1),nfrag_,0.0d0)
2588       call multreada(controlcard,"WPAIR",wpair_(1),npair_,0.0d0)
2589 c      write (iout,*) "NFRAG",nfrag_," NPAIR",npair_," NDIST",ndist_
2590 c      write (iout,*) "IFRAG"
2591 c      do i=1,nfrag_
2592 c        write (iout,*) i,ifrag_(1,i),ifrag_(2,i),wfrag_(i)
2593 c      enddo
2594 c      write (iout,*) "IPAIR"
2595 c      do i=1,npair_
2596 c        write (iout,*) i,ipair_(1,i),ipair_(2,i),wpair_(i)
2597 c      enddo
2598       if (.not.refstr .and. nfrag.gt.0) then
2599         write (iout,*) 
2600      &  "ERROR: no reference structure to compute distance restraints"
2601         write (iout,*)
2602      &  "Restraints must be specified explicitly (NDIST=number)"
2603         stop 
2604       endif
2605       if (nfrag.lt.2 .and. npair.gt.0) then 
2606         write (iout,*) "ERROR: Less than 2 fragments specified",
2607      &   " but distance restraints between pairs requested"
2608         stop 
2609       endif 
2610       call flush(iout)
2611       do i=1,nfrag_
2612         if (ifrag_(1,i).lt.nstart_sup) ifrag_(1,i)=nstart_sup
2613         if (ifrag_(2,i).gt.nstart_sup+nsup-1)
2614      &    ifrag_(2,i)=nstart_sup+nsup-1
2615 c        write (iout,*) i,ifrag_(1,i),ifrag_(2,i),wfrag_(i)
2616         call flush(iout)
2617         if (wfrag_(i).gt.0.0d0) then
2618         do j=ifrag_(1,i),ifrag_(2,i)-1
2619           do k=j+1,ifrag_(2,i)
2620 c            write (iout,*) "j",j," k",k
2621             ddjk=dist(j,k)
2622             if (constr_dist.eq.1) then
2623             nhpb=nhpb+1
2624             ihpb(nhpb)=j
2625             jhpb(nhpb)=k
2626               dhpb(nhpb)=ddjk
2627             forcon(nhpb)=wfrag_(i) 
2628             else if (constr_dist.eq.2) then
2629               if (ddjk.le.dist_cut) then
2630                 nhpb=nhpb+1
2631                 ihpb(nhpb)=j
2632                 jhpb(nhpb)=k
2633                 dhpb(nhpb)=ddjk
2634                 forcon(nhpb)=wfrag_(i) 
2635               endif
2636             else
2637               nhpb=nhpb+1
2638               ihpb(nhpb)=j
2639               jhpb(nhpb)=k
2640               dhpb(nhpb)=ddjk
2641               forcon(nhpb)=wfrag_(i)*dexp(-0.5d0*(ddjk/dist_cut)**2)
2642             endif
2643 #ifdef MPI
2644             if (.not.out1file .or. me.eq.king) 
2645      &      write (iout,'(a,3i5,f8.2,1pe12.2)') "+dist.constr ",
2646      &       nhpb,ihpb(nhpb),jhpb(nhpb),dhpb(nhpb),forcon(nhpb)
2647 #else
2648             write (iout,'(a,3i5,f8.2,1pe12.2)') "+dist.constr ",
2649      &       nhpb,ihpb(nhpb),jhpb(nhpb),dhpb(nhpb),forcon(nhpb)
2650 #endif
2651           enddo
2652         enddo
2653         endif
2654       enddo
2655       do i=1,npair_
2656         if (wpair_(i).gt.0.0d0) then
2657         ii = ipair_(1,i)
2658         jj = ipair_(2,i)
2659         if (ii.gt.jj) then
2660           itemp=ii
2661           ii=jj
2662           jj=itemp
2663         endif
2664         do j=ifrag_(1,ii),ifrag_(2,ii)
2665           do k=ifrag_(1,jj),ifrag_(2,jj)
2666             nhpb=nhpb+1
2667             ihpb(nhpb)=j
2668             jhpb(nhpb)=k
2669             forcon(nhpb)=wpair_(i)
2670             dhpb(nhpb)=dist(j,k)
2671 #ifdef MPI
2672             if (.not.out1file .or. me.eq.king)
2673      &      write (iout,'(a,3i5,f8.2,f10.1)') "+dist.constr ",
2674      &       nhpb,ihpb(nhpb),jhpb(nhpb),dhpb(nhpb),forcon(nhpb)
2675 #else
2676             write (iout,'(a,3i5,f8.2,f10.1)') "+dist.constr ",
2677      &       nhpb,ihpb(nhpb),jhpb(nhpb),dhpb(nhpb),forcon(nhpb)
2678 #endif
2679           enddo
2680         enddo
2681         endif
2682       enddo 
2683       do i=1,ndist_
2684         read (inp,*) ihpb(nhpb+1),jhpb(nhpb+1),dhpb(i),dhpb1(i),
2685      &     ibecarb(i),forcon(nhpb+1)
2686         if (forcon(nhpb+1).gt.0.0d0) then
2687           nhpb=nhpb+1
2688           if (ibecarb(i).gt.0) then
2689             ihpb(i)=ihpb(i)+nres
2690             jhpb(i)=jhpb(i)+nres
2691           endif
2692           if (dhpb(nhpb).eq.0.0d0) 
2693      &       dhpb(nhpb)=dist(ihpb(nhpb),jhpb(nhpb))
2694         endif
2695       enddo
2696 #ifdef MPI
2697       if (.not.out1file .or. me.eq.king) then
2698 #endif
2699       do i=1,nhpb
2700           write (iout,'(a,3i5,2f8.2,i2,f10.1)') "+dist.constr ",
2701      &     i,ihpb(i),jhpb(i),dhpb(i),dhpb1(i),ibecarb(i),forcon(i)
2702       enddo
2703       call flush(iout)
2704 #ifdef MPI
2705       endif
2706 #endif
2707       return
2708       end
2709 c-------------------------------------------------------------------------------
2710
2711       subroutine read_constr_homology
2712
2713       include 'DIMENSIONS'
2714 #ifdef MPI
2715       include 'mpif.h'
2716 #endif
2717       include 'COMMON.SETUP'
2718       include 'COMMON.CONTROL'
2719       include 'COMMON.CHAIN'
2720       include 'COMMON.IOUNITS'
2721       include 'COMMON.MD'
2722       include 'COMMON.GEO'
2723       include 'COMMON.INTERACT'
2724 c
2725 c For new homol impl
2726 c
2727       include 'COMMON.VAR'
2728 c
2729
2730 c     double precision odl_temp,sigma_odl_temp,waga_theta,waga_d,
2731 c    &                 dist_cut
2732 c     common /przechowalnia/ odl_temp(maxres,maxres,max_template),
2733 c    &    sigma_odl_temp(maxres,maxres,max_template)
2734       character*2 kic2
2735       character*24 model_ki_dist, model_ki_angle
2736       character*500 controlcard
2737       integer ki, i, j, k, l, ii_in_use(maxdim),i_tmp,idomain_tmp
2738       logical lprn /.true./
2739       integer ilen
2740       external ilen
2741 c
2742 c     FP - Nov. 2014 Temporary specifications for new vars
2743 c
2744       double precision rescore_tmp,x12,y12,z12,rescore2_tmp
2745       double precision, dimension (max_template,maxres) :: rescore
2746       double precision, dimension (max_template,maxres) :: rescore2
2747       character*24 pdbfile,tpl_k_rescore
2748 c -----------------------------------------------------------------
2749 c Reading multiple PDB ref structures and calculation of retraints
2750 c not using pre-computed ones stored in files model_ki_{dist,angle}
2751 c FP (Nov., 2014)
2752 c -----------------------------------------------------------------
2753 c
2754 c
2755 c Alternative: reading from input
2756       call card_concat(controlcard)
2757       call reada(controlcard,"HOMOL_DIST",waga_dist,1.0d0)
2758       call reada(controlcard,"HOMOL_ANGLE",waga_angle,1.0d0)
2759       call reada(controlcard,"HOMOL_THETA",waga_theta,1.0d0) ! new
2760       call reada(controlcard,"HOMOL_SCD",waga_d,1.0d0) ! new
2761       call reada(controlcard,'DIST_CUT',dist_cut,5.0d0) ! for diff ways of calc sigma
2762  
2763       call readi(controlcard,"HOMOL_NSET",homol_nset,1)       
2764       read2sigma=(index(controlcard,'READ2SIGMA').gt.0)
2765       start_from_model=(index(controlcard,'START_FROM_MODELS').gt.0)
2766       if(.not.read2sigma.and.start_from_model) then
2767           write(iout,*) 'START_FROM_MODELS works only with READ2SIGMA'
2768           start_from_model=.false.
2769       endif
2770       if(start_from_model) write(iout,*) 'START_FROM_MODELS is ON'
2771       if(start_from_model .and. rest) then 
2772         write(iout,*) 'START_FROM_MODELS is OFF'
2773         write(iout,*) 'remove restart keyword from input'
2774       endif
2775       if (homol_nset.gt.1)then
2776          call card_concat(controlcard)
2777          read(controlcard,*) (waga_homology(i),i=1,homol_nset) 
2778          if(me.eq.king .or. .not. out1file .and. fg_rank.eq.0) then
2779           write(iout,*) "iset homology_weight "
2780           do i=1,homol_nset
2781            write(iout,*) i,waga_homology(i)
2782           enddo
2783          endif
2784          iset=mod(kolor,homol_nset)+1
2785       else
2786        iset=1
2787        waga_homology(1)=1.0
2788       endif
2789
2790 cd      write (iout,*) "nnt",nnt," nct",nct
2791 cd      call flush(iout)
2792
2793
2794       lim_odl=0
2795       lim_dih=0
2796 c
2797 c  New
2798 c
2799       lim_theta=0
2800       lim_xx=0
2801 c
2802       write(iout,*) 'nnt=',nnt,'nct=',nct
2803 c
2804       do i = nnt,nct
2805         do k=1,constr_homology
2806          idomain(k,i)=0
2807         enddo
2808       enddo
2809
2810       ii=0
2811       do i = nnt,nct-2 
2812         do j=i+2,nct 
2813         ii=ii+1
2814         ii_in_use(ii)=0
2815         enddo
2816       enddo
2817
2818       do k=1,constr_homology
2819
2820         read(inp,'(a)') pdbfile
2821 c  Next stament causes error upon compilation (?)
2822 c       if(me.eq.king.or. .not. out1file)
2823 c         write (iout,'(2a)') 'PDB data will be read from file ',
2824 c    &   pdbfile(:ilen(pdbfile))
2825          write (iout,'(a,5x,a)') 'HOMOL: Opening PDB file',
2826      &  pdbfile(:ilen(pdbfile))
2827         open(ipdbin,file=pdbfile,status='old',err=33)
2828         goto 34
2829   33    write (iout,'(a,5x,a)') 'Error opening PDB file',
2830      &  pdbfile(:ilen(pdbfile))
2831         stop
2832   34    continue
2833 c        print *,'Begin reading pdb data'
2834 c
2835 c Files containing res sim or local scores (former containing sigmas)
2836 c
2837
2838         write(kic2,'(bz,i2.2)') k
2839
2840         tpl_k_rescore="template"//kic2//".sco"
2841
2842         unres_pdb=.false.
2843         if (read2sigma) then
2844           call readpdb_template(k)
2845         else
2846           call readpdb
2847         endif
2848 c
2849 c     Distance restraints
2850 c
2851 c          ... --> odl(k,ii)
2852 C Copy the coordinates from reference coordinates (?)
2853         do i=1,2*nres
2854           do j=1,3
2855             c(j,i)=cref(j,i)
2856 c           write (iout,*) "c(",j,i,") =",c(j,i)
2857           enddo
2858         enddo
2859 c
2860 c From read_dist_constr (commented out 25/11/2014 <-> res sim)
2861 c
2862 c         write(iout,*) "tpl_k_rescore - ",tpl_k_rescore
2863           open (ientin,file=tpl_k_rescore,status='old')
2864           if (nnt.gt.1) rescore(k,1)=0.0d0
2865           do irec=nnt,maxdim ! loop for reading res sim 
2866             if (read2sigma) then
2867              read (ientin,*,end=1401) i_tmp,rescore2_tmp,rescore_tmp,
2868      &                                idomain_tmp
2869              i_tmp=i_tmp+nnt-1
2870              idomain(k,i_tmp)=idomain_tmp
2871              rescore(k,i_tmp)=rescore_tmp
2872              rescore2(k,i_tmp)=rescore2_tmp
2873             else
2874              idomain(k,irec)=1
2875              read (ientin,*,end=1401) rescore_tmp
2876
2877 c           rescore(k,irec)=rescore_tmp+1.0d0 ! to avoid 0 values
2878              rescore(k,irec)=0.5d0*(rescore_tmp+0.5d0) ! alt transf to reduce scores
2879 c           write(iout,*) "rescore(",k,irec,") =",rescore(k,irec)
2880             endif
2881           enddo  
2882  1401   continue
2883         close (ientin)        
2884         if (waga_dist.ne.0.0d0) then
2885           ii=0
2886           do i = nnt,nct-2 
2887             do j=i+2,nct 
2888
2889               x12=c(1,i)-c(1,j)
2890               y12=c(2,i)-c(2,j)
2891               z12=c(3,i)-c(3,j)
2892               distal=dsqrt(x12*x12+y12*y12+z12*z12) 
2893
2894
2895             if (idomain(k,i).eq.idomain(k,j).and.idomain(k,i).ne.0
2896      &            .and. distal.le.dist2_cut ) then
2897
2898               ii=ii+1
2899               ii_in_use(ii)=1
2900               l_homo(k,ii)=.true.
2901
2902 c             write (iout,*) "k",k
2903 c             write (iout,*) "i",i," j",j," constr_homology",
2904 c    &                       constr_homology
2905               ires_homo(ii)=i
2906               jres_homo(ii)=j
2907               odl(k,ii)=distal
2908               if (read2sigma) then
2909                 sigma_odl(k,ii)=0
2910                 do ik=i,j
2911                  sigma_odl(k,ii)=sigma_odl(k,ii)+rescore2(k,ik)
2912                 enddo
2913                 sigma_odl(k,ii)=sigma_odl(k,ii)/(j-i+1)
2914                 if (odl(k,ii).gt.dist_cut) sigma_odl(k,ii) = 
2915      &        sigma_odl(k,ii)*dexp(0.5d0*(odl(k,ii)/dist_cut)**2-0.5d0)
2916               else
2917                 if (odl(k,ii).le.dist_cut) then
2918                  sigma_odl(k,ii)=rescore(k,i)+rescore(k,j) 
2919                 else
2920 #ifdef OLDSIGMA
2921                  sigma_odl(k,ii)=(rescore(k,i)+rescore(k,j))* 
2922      &                      dexp(0.5d0*(odl(k,ii)/dist_cut)**2)
2923 #else
2924                  sigma_odl(k,ii)=(rescore(k,i)+rescore(k,j))* 
2925      &                      dexp(0.5d0*(odl(k,ii)/dist_cut)**2-0.5d0)
2926 #endif
2927                 endif
2928               endif
2929               sigma_odl(k,ii)=1.0d0/(sigma_odl(k,ii)*sigma_odl(k,ii)) 
2930             else
2931               ii=ii+1
2932               l_homo(k,ii)=.false.
2933             endif
2934             enddo
2935           enddo
2936         lim_odl=ii
2937         endif
2938 c
2939 c     Theta, dihedral and SC retraints
2940 c
2941         if (waga_angle.gt.0.0d0) then
2942 c         open (ientin,file=tpl_k_sigma_dih,status='old')
2943 c         do irec=1,maxres-3 ! loop for reading sigma_dih
2944 c            read (ientin,*,end=1402) i,j,ki,l,sigma_dih(k,i+nnt-1) ! j,ki,l what for?
2945 c            if (i+nnt-1.gt.lim_dih) lim_dih=i+nnt-1 ! right?
2946 c            sigma_dih(k,i+nnt-1)=sigma_dih(k,i+nnt-1)* ! not inverse because of use of res. similarity
2947 c    &                            sigma_dih(k,i+nnt-1)
2948 c         enddo
2949 c1402   continue
2950 c         close (ientin)
2951           do i = nnt+3,nct 
2952             if (idomain(k,i).eq.0) then 
2953                sigma_dih(k,i)=0.0
2954                cycle
2955             endif
2956             dih(k,i)=phiref(i) ! right?
2957 c           read (ientin,*) sigma_dih(k,i) ! original variant
2958 c             write (iout,*) "dih(",k,i,") =",dih(k,i)
2959 c             write(iout,*) "rescore(",k,i,") =",rescore(k,i),
2960 c    &                      "rescore(",k,i-1,") =",rescore(k,i-1),
2961 c    &                      "rescore(",k,i-2,") =",rescore(k,i-2),
2962 c    &                      "rescore(",k,i-3,") =",rescore(k,i-3)
2963
2964             sigma_dih(k,i)=(rescore(k,i)+rescore(k,i-1)+
2965      &                     rescore(k,i-2)+rescore(k,i-3))/4.0
2966 c            if (read2sigma) sigma_dih(k,i)=sigma_dih(k,i)/4.0
2967 c           write (iout,*) "Raw sigmas for dihedral angle restraints"
2968 c           write (iout,'(i5,10(2f8.2,4x))') i,sigma_dih(k,i)
2969 c           sigma_dih(k,i)=hmscore(k)*rescore(k,i)*rescore(k,i-1)*
2970 c                          rescore(k,i-2)*rescore(k,i-3)  !  right expression ?
2971 c   Instead of res sim other local measure of b/b str reliability possible
2972             sigma_dih(k,i)=1.0d0/(sigma_dih(k,i)*sigma_dih(k,i))
2973 c           sigma_dih(k,i)=sigma_dih(k,i)*sigma_dih(k,i)
2974           enddo
2975           lim_dih=nct-nnt-2 
2976         endif
2977
2978         if (waga_theta.gt.0.0d0) then
2979 c         open (ientin,file=tpl_k_sigma_theta,status='old')
2980 c         do irec=1,maxres-2 ! loop for reading sigma_theta, right bounds?
2981 c            read (ientin,*,end=1403) i,j,ki,sigma_theta(k,i+nnt-1) ! j,ki what for?
2982 c            sigma_theta(k,i+nnt-1)=sigma_theta(k,i+nnt-1)* ! not inverse because of use of res. similarity
2983 c    &                              sigma_theta(k,i+nnt-1)
2984 c         enddo
2985 c1403   continue
2986 c         close (ientin)
2987
2988           do i = nnt+2,nct ! right? without parallel.
2989 c         do i = i=1,nres ! alternative for bounds acc to readpdb?
2990 c         do i=ithet_start,ithet_end ! with FG parallel.
2991              if (idomain(k,i).eq.0) then  
2992               sigma_theta(k,i)=0.0
2993               cycle
2994              endif
2995              thetatpl(k,i)=thetaref(i)
2996 c            write (iout,*) "thetatpl(",k,i,") =",thetatpl(k,i)
2997 c            write(iout,*)  "rescore(",k,i,") =",rescore(k,i),
2998 c    &                      "rescore(",k,i-1,") =",rescore(k,i-1),
2999 c    &                      "rescore(",k,i-2,") =",rescore(k,i-2)
3000 c            read (ientin,*) sigma_theta(k,i) ! 1st variant
3001              sigma_theta(k,i)=(rescore(k,i)+rescore(k,i-1)+
3002      &                        rescore(k,i-2))/3.0
3003 c             if (read2sigma) sigma_theta(k,i)=sigma_theta(k,i)/3.0
3004              sigma_theta(k,i)=1.0d0/(sigma_theta(k,i)*sigma_theta(k,i))
3005
3006 c            sigma_theta(k,i)=hmscore(k)*rescore(k,i)*rescore(k,i-1)*
3007 c                             rescore(k,i-2) !  right expression ?
3008 c            sigma_theta(k,i)=sigma_theta(k,i)*sigma_theta(k,i)
3009           enddo
3010         endif
3011         lim_theta=nct-nnt-1 
3012
3013         if (waga_d.gt.0.0d0) then
3014 c       open (ientin,file=tpl_k_sigma_d,status='old')
3015 c         do irec=1,maxres-1 ! loop for reading sigma_theta, right bounds?
3016 c            read (ientin,*,end=1404) i,j,sigma_d(k,i+nnt-1) ! j,ki what for?
3017 c            sigma_d(k,i+nnt-1)=sigma_d(k,i+nnt-1)* ! not inverse because of use of res. similarity
3018 c    &                          sigma_d(k,i+nnt-1)
3019 c         enddo
3020 c1404   continue
3021
3022           do i = nnt,nct ! right? without parallel.
3023 c         do i=2,nres-1 ! alternative for bounds acc to readpdb?
3024 c         do i=loc_start,loc_end ! with FG parallel.
3025                if (itype(i).eq.10) cycle 
3026                if (idomain(k,i).eq.0 ) then 
3027                   sigma_d(k,i)=0.0
3028                   cycle
3029                endif
3030                xxtpl(k,i)=xxref(i)
3031                yytpl(k,i)=yyref(i)
3032                zztpl(k,i)=zzref(i)
3033 c              write (iout,*) "xxtpl(",k,i,") =",xxtpl(k,i)
3034 c              write (iout,*) "yytpl(",k,i,") =",yytpl(k,i)
3035 c              write (iout,*) "zztpl(",k,i,") =",zztpl(k,i)
3036 c              write(iout,*)  "rescore(",k,i,") =",rescore(k,i)
3037                sigma_d(k,i)=rescore(k,i) !  right expression ?
3038                sigma_d(k,i)=1.0d0/(sigma_d(k,i)*sigma_d(k,i))
3039
3040 c              sigma_d(k,i)=hmscore(k)*rescore(k,i) !  right expression ?
3041 c              sigma_d(k,i)=sigma_d(k,i)*sigma_d(k,i)
3042 c              read (ientin,*) sigma_d(k,i) ! 1st variant
3043                if (i-nnt+1.gt.lim_xx) lim_xx=i-nnt+1 ! right?
3044           enddo
3045           lim_xx=nct-nnt+1 
3046         endif
3047       enddo
3048 c
3049 c remove distance restraints not used in any model from the list
3050 c shift data in all arrays
3051 c
3052       if (waga_dist.ne.0.0d0) then
3053         ii=0
3054         do i=nnt,nct-2 
3055          do j=i+2,nct 
3056           ii=ii+1
3057           if (ii_in_use(ii).eq.0) then 
3058              do ki=ii,lim_odl-1
3059               ires_homo(ki)=ires_homo(ki+1)
3060               jres_homo(ki)=jres_homo(ki+1)
3061               ii_in_use(ki)=ii_in_use(ki+1)
3062               do k=1,constr_homology
3063                odl(k,ki)=odl(k,ki+1)
3064                sigma_odl(k,ki)=sigma_odl(k,ki+1)
3065                l_homo(k,ki)=l_homo(k,ki+1)
3066               enddo
3067              enddo
3068              ii=ii-1
3069              lim_odl=lim_odl-1
3070           endif
3071          enddo
3072         enddo
3073       endif
3074       if (constr_homology.gt.0) call homology_partition
3075       if (constr_homology.gt.0) call init_int_table
3076 cd      write (iout,*) "homology_partition: lim_theta= ",lim_theta,
3077 cd     & "lim_xx=",lim_xx
3078 c     write (iout,*) "ithet_start =",ithet_start,"ithet_end =",ithet_end
3079 c     write (iout,*) "loc_start =",loc_start,"loc_end =",loc_end
3080 c
3081 c Print restraints
3082 c
3083       if (.not.lprn) return
3084 cd      write(iout,*) "waga_theta",waga_theta,"waga_d",waga_d
3085       if(me.eq.king .or. .not. out1file .and. fg_rank.eq.0) then
3086        write (iout,*) "Distance restraints from templates"
3087        do ii=1,lim_odl
3088        write(iout,'(3i5,10(2f8.2,1x,l1,4x))') 
3089      &  ii,ires_homo(ii),jres_homo(ii),
3090      &  (odl(ki,ii),1.0d0/dsqrt(sigma_odl(ki,ii)),l_homo(ki,ii),
3091      &  ki=1,constr_homology)
3092        enddo
3093        write (iout,*) "Dihedral angle restraints from templates"
3094        do i=nnt+3,lim_dih
3095         write (iout,'(i5,10(2f8.2,4x))') i,(rad2deg*dih(ki,i),
3096      &      rad2deg/dsqrt(sigma_dih(ki,i)),ki=1,constr_homology)
3097        enddo
3098        write (iout,*) "Virtual-bond angle restraints from templates"
3099        do i=nnt+2,lim_theta
3100         write (iout,'(i5,10(2f8.2,4x))') i,(rad2deg*thetatpl(ki,i),
3101      &      rad2deg/dsqrt(sigma_theta(ki,i)),ki=1,constr_homology)
3102        enddo
3103        write (iout,*) "SC restraints from templates"
3104        do i=nnt,lim_xx
3105         write(iout,'(i5,10(4f8.2,4x))') i,
3106      &  (xxtpl(ki,i),yytpl(ki,i),zztpl(ki,i),
3107      &   1.0d0/dsqrt(sigma_d(ki,i)),ki=1,constr_homology)
3108        enddo
3109       endif
3110 c -----------------------------------------------------------------
3111       return
3112       end
3113 c----------------------------------------------------------------------
3114
3115 #ifdef WINIFL
3116       subroutine flush(iu)
3117       return
3118       end
3119 #endif
3120 #ifdef AIX
3121       subroutine flush(iu)
3122       call flush_(iu)
3123       return
3124       end
3125 #endif
3126
3127 c------------------------------------------------------------------------------
3128       subroutine copy_to_tmp(source)
3129       include "DIMENSIONS"
3130       include "COMMON.IOUNITS"
3131       character*(*) source
3132       character* 256 tmpfile
3133       integer ilen
3134       external ilen
3135       logical ex
3136       tmpfile=curdir(:ilen(curdir))//"/"//source(:ilen(source))
3137       inquire(file=tmpfile,exist=ex)
3138       if (ex) then
3139         write (*,*) "Copying ",tmpfile(:ilen(tmpfile)),
3140      &   " to temporary directory..."
3141         write (*,*) "/bin/cp "//tmpfile(:ilen(tmpfile))//" "//tmpdir
3142         call system("/bin/cp "//tmpfile(:ilen(tmpfile))//" "//tmpdir)
3143       endif
3144       return
3145       end
3146 c------------------------------------------------------------------------------
3147       subroutine move_from_tmp(source)
3148       include "DIMENSIONS"
3149       include "COMMON.IOUNITS"
3150       character*(*) source
3151       integer ilen
3152       external ilen
3153       write (*,*) "Moving ",source(:ilen(source)),
3154      & " from temporary directory to working directory"
3155       write (*,*) "/bin/mv "//source(:ilen(source))//" "//curdir
3156       call system("/bin/mv "//source(:ilen(source))//" "//curdir)
3157       return
3158       end
3159 c------------------------------------------------------------------------------
3160       subroutine random_init(seed)
3161 C
3162 C Initialize random number generator
3163 C
3164       implicit real*8 (a-h,o-z)
3165       include 'DIMENSIONS'
3166 #ifdef AMD64
3167       integer*8 iseedi8
3168 #endif
3169 #ifdef MPI
3170       include 'mpif.h'
3171       logical OKRandom, prng_restart
3172       real*8  r1
3173       integer iseed_array(4)
3174 #endif
3175       include 'COMMON.IOUNITS'
3176       include 'COMMON.TIME1'
3177       include 'COMMON.THREAD'
3178       include 'COMMON.SBRIDGE'
3179       include 'COMMON.CONTROL'
3180       include 'COMMON.MCM'
3181       include 'COMMON.MAP'
3182       include 'COMMON.HEADER'
3183 csa      include 'COMMON.CSA'
3184       include 'COMMON.CHAIN'
3185       include 'COMMON.MUCA'
3186       include 'COMMON.MD'
3187       include 'COMMON.FFIELD'
3188       include 'COMMON.SETUP'
3189       iseed=-dint(dabs(seed))
3190       if (iseed.eq.0) then
3191         write (iout,'(/80(1h*)/20x,a/80(1h*))') 
3192      &    'Random seed undefined. The program will stop.'
3193         write (*,'(/80(1h*)/20x,a/80(1h*))') 
3194      &    'Random seed undefined. The program will stop.'
3195 #ifdef MPI
3196         call mpi_finalize(mpi_comm_world,ierr)
3197 #endif
3198         stop 'Bad random seed.'
3199       endif
3200 #ifdef MPI
3201       if (fg_rank.eq.0) then
3202       seed=seed*(me+1)+1
3203 #ifdef AMD64
3204       iseedi8=dint(seed)
3205       if(me.eq.king .or. .not. out1file)
3206      &  write (iout,*) 'MPI: node= ', me, ' iseed= ',iseedi8
3207       write (*,*) 'MPI: node= ', me, ' iseed= ',iseedi8
3208       OKRandom = prng_restart(me,iseedi8)
3209 #else
3210       do i=1,4
3211        tmp=65536.0d0**(4-i)
3212        iseed_array(i) = dint(seed/tmp)
3213        seed=seed-iseed_array(i)*tmp
3214       enddo
3215       if(me.eq.king .or. .not. out1file)
3216      & write (iout,*) 'MPI: node= ', me, ' iseed(4)= ',
3217      &                 (iseed_array(i),i=1,4)
3218       write (*,*) 'MPI: node= ',me, ' iseed(4)= ',
3219      &                 (iseed_array(i),i=1,4)
3220       OKRandom = prng_restart(me,iseed_array)
3221 #endif
3222       if (OKRandom) then
3223         r1=ran_number(0.0D0,1.0D0)
3224         if(me.eq.king .or. .not. out1file)
3225      &   write (iout,*) 'ran_num',r1
3226         if (r1.lt.0.0d0) OKRandom=.false.
3227       endif
3228       if (.not.OKRandom) then
3229         write (iout,*) 'PRNG IS NOT WORKING!!!'
3230         print *,'PRNG IS NOT WORKING!!!'
3231         if (me.eq.0) then 
3232          call flush(iout)
3233          call mpi_abort(mpi_comm_world,error_msg,ierr)
3234          stop
3235         else
3236          write (iout,*) 'too many processors for parallel prng'
3237          write (*,*) 'too many processors for parallel prng'
3238          call flush(iout)
3239          stop
3240         endif
3241       endif
3242       endif
3243 #else
3244       call vrndst(iseed)
3245       write (iout,*) 'ran_num',ran_number(0.0d0,1.0d0)
3246 #endif
3247       return
3248       end