eb10b7ff4591b41e3231457ec2c87cddaa5989d1
[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 multreadi(controlcard,"IFRAG",ifrag_(1,1),2*nfrag_,0)
2585       call multreadi(controlcard,"IPAIR",ipair_(1,1),2*npair_,0)
2586       call multreada(controlcard,"WFRAG",wfrag_(1),nfrag_,0.0d0)
2587       call multreada(controlcard,"WPAIR",wpair_(1),npair_,0.0d0)
2588 c      write (iout,*) "NFRAG",nfrag_," NPAIR",npair_," NDIST",ndist_
2589 c      write (iout,*) "IFRAG"
2590 c      do i=1,nfrag_
2591 c        write (iout,*) i,ifrag_(1,i),ifrag_(2,i),wfrag_(i)
2592 c      enddo
2593 c      write (iout,*) "IPAIR"
2594 c      do i=1,npair_
2595 c        write (iout,*) i,ipair_(1,i),ipair_(2,i),wpair_(i)
2596 c      enddo
2597       if (.not.refstr .and. nfrag.gt.0) then
2598         write (iout,*) 
2599      &  "ERROR: no reference structure to compute distance restraints"
2600         write (iout,*)
2601      &  "Restraints must be specified explicitly (NDIST=number)"
2602         stop 
2603       endif
2604       if (nfrag.lt.2 .and. npair.gt.0) then 
2605         write (iout,*) "ERROR: Less than 2 fragments specified",
2606      &   " but distance restraints between pairs requested"
2607         stop 
2608       endif 
2609       call flush(iout)
2610       do i=1,nfrag_
2611         if (ifrag_(1,i).lt.nstart_sup) ifrag_(1,i)=nstart_sup
2612         if (ifrag_(2,i).gt.nstart_sup+nsup-1)
2613      &    ifrag_(2,i)=nstart_sup+nsup-1
2614 c        write (iout,*) i,ifrag_(1,i),ifrag_(2,i),wfrag_(i)
2615         call flush(iout)
2616         if (wfrag_(i).gt.0.0d0) then
2617         do j=ifrag_(1,i),ifrag_(2,i)-1
2618           do k=j+1,ifrag_(2,i)
2619 c            write (iout,*) "j",j," k",k
2620             ddjk=dist(j,k)
2621             if (constr_dist.eq.1) then
2622             nhpb=nhpb+1
2623             ihpb(nhpb)=j
2624             jhpb(nhpb)=k
2625               dhpb(nhpb)=ddjk
2626             forcon(nhpb)=wfrag_(i) 
2627             else if (constr_dist.eq.2) then
2628               if (ddjk.le.dist_cut) then
2629                 nhpb=nhpb+1
2630                 ihpb(nhpb)=j
2631                 jhpb(nhpb)=k
2632                 dhpb(nhpb)=ddjk
2633                 forcon(nhpb)=wfrag_(i) 
2634               endif
2635             else
2636               nhpb=nhpb+1
2637               ihpb(nhpb)=j
2638               jhpb(nhpb)=k
2639               dhpb(nhpb)=ddjk
2640               forcon(nhpb)=wfrag_(i)*dexp(-0.5d0*(ddjk/dist_cut)**2)
2641             endif
2642 #ifdef MPI
2643             if (.not.out1file .or. me.eq.king) 
2644      &      write (iout,'(a,3i5,f8.2,1pe12.2)') "+dist.constr ",
2645      &       nhpb,ihpb(nhpb),jhpb(nhpb),dhpb(nhpb),forcon(nhpb)
2646 #else
2647             write (iout,'(a,3i5,f8.2,1pe12.2)') "+dist.constr ",
2648      &       nhpb,ihpb(nhpb),jhpb(nhpb),dhpb(nhpb),forcon(nhpb)
2649 #endif
2650           enddo
2651         enddo
2652         endif
2653       enddo
2654       do i=1,npair_
2655         if (wpair_(i).gt.0.0d0) then
2656         ii = ipair_(1,i)
2657         jj = ipair_(2,i)
2658         if (ii.gt.jj) then
2659           itemp=ii
2660           ii=jj
2661           jj=itemp
2662         endif
2663         do j=ifrag_(1,ii),ifrag_(2,ii)
2664           do k=ifrag_(1,jj),ifrag_(2,jj)
2665             nhpb=nhpb+1
2666             ihpb(nhpb)=j
2667             jhpb(nhpb)=k
2668             forcon(nhpb)=wpair_(i)
2669             dhpb(nhpb)=dist(j,k)
2670 #ifdef MPI
2671             if (.not.out1file .or. me.eq.king)
2672      &      write (iout,'(a,3i5,f8.2,f10.1)') "+dist.constr ",
2673      &       nhpb,ihpb(nhpb),jhpb(nhpb),dhpb(nhpb),forcon(nhpb)
2674 #else
2675             write (iout,'(a,3i5,f8.2,f10.1)') "+dist.constr ",
2676      &       nhpb,ihpb(nhpb),jhpb(nhpb),dhpb(nhpb),forcon(nhpb)
2677 #endif
2678           enddo
2679         enddo
2680         endif
2681       enddo 
2682       do i=1,ndist_
2683         read (inp,*) ihpb(nhpb+1),jhpb(nhpb+1),dhpb(i),dhpb1(i),
2684      &     ibecarb(i),forcon(nhpb+1)
2685         if (forcon(nhpb+1).gt.0.0d0) then
2686           nhpb=nhpb+1
2687           if (ibecarb(i).gt.0) then
2688             ihpb(i)=ihpb(i)+nres
2689             jhpb(i)=jhpb(i)+nres
2690           endif
2691           if (dhpb(nhpb).eq.0.0d0) 
2692      &       dhpb(nhpb)=dist(ihpb(nhpb),jhpb(nhpb))
2693         endif
2694       enddo
2695 #ifdef MPI
2696       if (.not.out1file .or. me.eq.king) then
2697 #endif
2698       do i=1,nhpb
2699           write (iout,'(a,3i5,2f8.2,i2,f10.1)') "+dist.constr ",
2700      &     i,ihpb(i),jhpb(i),dhpb(i),dhpb1(i),ibecarb(i),forcon(i)
2701       enddo
2702       call flush(iout)
2703 #ifdef MPI
2704       endif
2705 #endif
2706       return
2707       end
2708 c-------------------------------------------------------------------------------
2709
2710       subroutine read_constr_homology
2711
2712       include 'DIMENSIONS'
2713 #ifdef MPI
2714       include 'mpif.h'
2715 #endif
2716       include 'COMMON.SETUP'
2717       include 'COMMON.CONTROL'
2718       include 'COMMON.CHAIN'
2719       include 'COMMON.IOUNITS'
2720       include 'COMMON.MD'
2721       include 'COMMON.GEO'
2722       include 'COMMON.INTERACT'
2723 c
2724 c For new homol impl
2725 c
2726       include 'COMMON.VAR'
2727 c
2728
2729 c     double precision odl_temp,sigma_odl_temp,waga_theta,waga_d,
2730 c    &                 dist_cut
2731 c     common /przechowalnia/ odl_temp(maxres,maxres,max_template),
2732 c    &    sigma_odl_temp(maxres,maxres,max_template)
2733       character*2 kic2
2734       character*24 model_ki_dist, model_ki_angle
2735       character*500 controlcard
2736       integer ki, i, j, k, l, ii_in_use(maxdim),i_tmp,idomain_tmp
2737       logical lprn /.true./
2738       integer ilen
2739       external ilen
2740 c
2741 c     FP - Nov. 2014 Temporary specifications for new vars
2742 c
2743       double precision rescore_tmp,x12,y12,z12,rescore2_tmp
2744       double precision, dimension (max_template,maxres) :: rescore
2745       double precision, dimension (max_template,maxres) :: rescore2
2746       character*24 pdbfile,tpl_k_rescore
2747 c -----------------------------------------------------------------
2748 c Reading multiple PDB ref structures and calculation of retraints
2749 c not using pre-computed ones stored in files model_ki_{dist,angle}
2750 c FP (Nov., 2014)
2751 c -----------------------------------------------------------------
2752 c
2753 c
2754 c Alternative: reading from input
2755       call card_concat(controlcard)
2756       call reada(controlcard,"HOMOL_DIST",waga_dist,1.0d0)
2757       call reada(controlcard,"HOMOL_ANGLE",waga_angle,1.0d0)
2758       call reada(controlcard,"HOMOL_THETA",waga_theta,1.0d0) ! new
2759       call reada(controlcard,"HOMOL_SCD",waga_d,1.0d0) ! new
2760       call reada(controlcard,'DIST_CUT',dist_cut,5.0d0) ! for diff ways of calc sigma
2761  
2762       call readi(controlcard,"HOMOL_NSET",homol_nset,1)       
2763       read2sigma=(index(controlcard,'READ2SIGMA').gt.0)
2764       start_from_model=(index(controlcard,'START_FROM_MODELS').gt.0)
2765       if(.not.read2sigma.and.start_from_model) then
2766           write(iout,*) 'START_FROM_MODELS works only with READ2SIGMA'
2767           start_from_model=.false.
2768       endif
2769       if(start_from_model) write(iout,*) 'START_FROM_MODELS is ON'
2770       if(start_from_model .and. rest) then 
2771         write(iout,*) 'START_FROM_MODELS is OFF'
2772         write(iout,*) 'remove restart keyword from input'
2773       endif
2774       if (homol_nset.gt.1)then
2775          call card_concat(controlcard)
2776          read(controlcard,*) (waga_homology(i),i=1,homol_nset) 
2777          if(me.eq.king .or. .not. out1file .and. fg_rank.eq.0) then
2778           write(iout,*) "iset homology_weight "
2779           do i=1,homol_nset
2780            write(iout,*) i,waga_homology(i)
2781           enddo
2782          endif
2783          iset=mod(kolor,homol_nset)+1
2784       else
2785        iset=1
2786        waga_homology(1)=1.0
2787       endif
2788
2789 cd      write (iout,*) "nnt",nnt," nct",nct
2790 cd      call flush(iout)
2791
2792
2793       lim_odl=0
2794       lim_dih=0
2795 c
2796 c  New
2797 c
2798       lim_theta=0
2799       lim_xx=0
2800 c
2801       write(iout,*) 'nnt=',nnt,'nct=',nct
2802 c
2803       do i = nnt,nct
2804         do k=1,constr_homology
2805          idomain(k,i)=0
2806         enddo
2807       enddo
2808
2809       ii=0
2810       do i = nnt,nct-2 
2811         do j=i+2,nct 
2812         ii=ii+1
2813         ii_in_use(ii)=0
2814         enddo
2815       enddo
2816
2817       do k=1,constr_homology
2818
2819         read(inp,'(a)') pdbfile
2820 c  Next stament causes error upon compilation (?)
2821 c       if(me.eq.king.or. .not. out1file)
2822 c         write (iout,'(2a)') 'PDB data will be read from file ',
2823 c    &   pdbfile(:ilen(pdbfile))
2824          write (iout,'(a,5x,a)') 'HOMOL: Opening PDB file',
2825      &  pdbfile(:ilen(pdbfile))
2826         open(ipdbin,file=pdbfile,status='old',err=33)
2827         goto 34
2828   33    write (iout,'(a,5x,a)') 'Error opening PDB file',
2829      &  pdbfile(:ilen(pdbfile))
2830         stop
2831   34    continue
2832 c        print *,'Begin reading pdb data'
2833 c
2834 c Files containing res sim or local scores (former containing sigmas)
2835 c
2836
2837         write(kic2,'(bz,i2.2)') k
2838
2839         tpl_k_rescore="template"//kic2//".sco"
2840
2841         unres_pdb=.false.
2842         if (read2sigma) then
2843           call readpdb_template(k)
2844         else
2845           call readpdb
2846         endif
2847 c
2848 c     Distance restraints
2849 c
2850 c          ... --> odl(k,ii)
2851 C Copy the coordinates from reference coordinates (?)
2852         do i=1,2*nres
2853           do j=1,3
2854             c(j,i)=cref(j,i)
2855 c           write (iout,*) "c(",j,i,") =",c(j,i)
2856           enddo
2857         enddo
2858 c
2859 c From read_dist_constr (commented out 25/11/2014 <-> res sim)
2860 c
2861 c         write(iout,*) "tpl_k_rescore - ",tpl_k_rescore
2862           open (ientin,file=tpl_k_rescore,status='old')
2863           if (nnt.gt.1) rescore(k,1)=0.0d0
2864           do irec=nnt,maxdim ! loop for reading res sim 
2865             if (read2sigma) then
2866              read (ientin,*,end=1401) i_tmp,rescore2_tmp,rescore_tmp,
2867      &                                idomain_tmp
2868              i_tmp=i_tmp+nnt-1
2869              idomain(k,i_tmp)=idomain_tmp
2870              rescore(k,i_tmp)=rescore_tmp
2871              rescore2(k,i_tmp)=rescore2_tmp
2872             else
2873              idomain(k,irec)=1
2874              read (ientin,*,end=1401) rescore_tmp
2875
2876 c           rescore(k,irec)=rescore_tmp+1.0d0 ! to avoid 0 values
2877              rescore(k,irec)=0.5d0*(rescore_tmp+0.5d0) ! alt transf to reduce scores
2878 c           write(iout,*) "rescore(",k,irec,") =",rescore(k,irec)
2879             endif
2880           enddo  
2881  1401   continue
2882         close (ientin)        
2883         if (waga_dist.ne.0.0d0) then
2884           ii=0
2885           do i = nnt,nct-2 
2886             do j=i+2,nct 
2887
2888             if (idomain(k,i).eq.idomain(k,j).and.idomain(k,i).ne.0) then
2889                   
2890               ii=ii+1
2891               ii_in_use(ii)=1
2892               l_homo(k,ii)=.true.
2893
2894 c             write (iout,*) "k",k
2895 c             write (iout,*) "i",i," j",j," constr_homology",
2896 c    &                       constr_homology
2897               ires_homo(ii)=i
2898               jres_homo(ii)=j
2899 c
2900 c Attempt to replace dist(i,j) by its definition in ...
2901 c
2902               x12=c(1,i)-c(1,j)
2903               y12=c(2,i)-c(2,j)
2904               z12=c(3,i)-c(3,j)
2905               distal=dsqrt(x12*x12+y12*y12+z12*z12)
2906               odl(k,ii)=distal
2907               if (read2sigma) then
2908                 sigma_odl(k,ii)=0
2909                 do ik=i,j
2910                  sigma_odl(k,ii)=sigma_odl(k,ii)+rescore2(k,ik)
2911                 enddo
2912                 sigma_odl(k,ii)=sigma_odl(k,ii)/(j-i+1)
2913                 if (odl(k,ii).gt.dist_cut) sigma_odl(k,ii) = 
2914      &        sigma_odl(k,ii)*dexp(0.5d0*(odl(k,ii)/dist_cut)**2-0.5d0)
2915               else
2916                 if (odl(k,ii).le.dist_cut) then
2917                  sigma_odl(k,ii)=rescore(k,i)+rescore(k,j) ! other exprs possible
2918 c                sigma_odl(k,ii)=hmscore(k)*rescore(k,i)*rescore(k,j)
2919                 else
2920 #ifdef OLDSIGMA
2921                  sigma_odl(k,ii)=(rescore(k,i)+rescore(k,j))* ! sigma ~ rescore ~ error 
2922      &                      dexp(0.5d0*(odl(k,ii)/dist_cut)**2)
2923 #else
2924                  sigma_odl(k,ii)=(rescore(k,i)+rescore(k,j))* ! sigma ~ rescore ~ error 
2925      &                      dexp(0.5d0*(odl(k,ii)/dist_cut)**2-0.5d0)
2926 #endif
2927                 endif
2928               endif
2929 c   Following expr replaced by a positive exp argument
2930 c             sigma_odl(k,ii)=(rescore(k,i)+rescore(k,j))*
2931 c    &                      dexp(-0.5d0*(odl(k,ii)/dist_cut)**2)
2932
2933 c             sigma_odl(k,ii)=hmscore(k)*rescore(k,i)*rescore(k,j)*
2934 c    &                      dexp(-0.5d0*(odl(k,ii)/dist_cut)**2)
2935 c
2936               sigma_odl(k,ii)=1.0d0/(sigma_odl(k,ii)*sigma_odl(k,ii)) ! rescore ~ error
2937 c             sigma_odl(k,ii)=sigma_odl(k,ii)*sigma_odl(k,ii)
2938 c
2939 c             sigma_odl(k,ii)=sigma_odl_temp(i,j,k)* ! new var read from file (?)
2940 c    &                        sigma_odl_temp(i,j,k)  ! not inverse because of use of res. similarity
2941             else
2942               ii=ii+1
2943               l_homo(k,ii)=.false.
2944             endif
2945             enddo
2946           enddo
2947         lim_odl=ii
2948         endif
2949 c
2950 c     Theta, dihedral and SC retraints
2951 c
2952         if (waga_angle.gt.0.0d0) then
2953 c         open (ientin,file=tpl_k_sigma_dih,status='old')
2954 c         do irec=1,maxres-3 ! loop for reading sigma_dih
2955 c            read (ientin,*,end=1402) i,j,ki,l,sigma_dih(k,i+nnt-1) ! j,ki,l what for?
2956 c            if (i+nnt-1.gt.lim_dih) lim_dih=i+nnt-1 ! right?
2957 c            sigma_dih(k,i+nnt-1)=sigma_dih(k,i+nnt-1)* ! not inverse because of use of res. similarity
2958 c    &                            sigma_dih(k,i+nnt-1)
2959 c         enddo
2960 c1402   continue
2961 c         close (ientin)
2962           do i = nnt+3,nct 
2963             if (idomain(k,i).eq.0) then 
2964                sigma_dih(k,i)=0.0
2965                cycle
2966             endif
2967             dih(k,i)=phiref(i) ! right?
2968 c           read (ientin,*) sigma_dih(k,i) ! original variant
2969 c             write (iout,*) "dih(",k,i,") =",dih(k,i)
2970 c             write(iout,*) "rescore(",k,i,") =",rescore(k,i),
2971 c    &                      "rescore(",k,i-1,") =",rescore(k,i-1),
2972 c    &                      "rescore(",k,i-2,") =",rescore(k,i-2),
2973 c    &                      "rescore(",k,i-3,") =",rescore(k,i-3)
2974
2975             sigma_dih(k,i)=(rescore(k,i)+rescore(k,i-1)+
2976      &                     rescore(k,i-2)+rescore(k,i-3))/4.0
2977 c            if (read2sigma) sigma_dih(k,i)=sigma_dih(k,i)/4.0
2978 c           write (iout,*) "Raw sigmas for dihedral angle restraints"
2979 c           write (iout,'(i5,10(2f8.2,4x))') i,sigma_dih(k,i)
2980 c           sigma_dih(k,i)=hmscore(k)*rescore(k,i)*rescore(k,i-1)*
2981 c                          rescore(k,i-2)*rescore(k,i-3)  !  right expression ?
2982 c   Instead of res sim other local measure of b/b str reliability possible
2983             sigma_dih(k,i)=1.0d0/(sigma_dih(k,i)*sigma_dih(k,i))
2984 c           sigma_dih(k,i)=sigma_dih(k,i)*sigma_dih(k,i)
2985           enddo
2986           lim_dih=nct-nnt-2 
2987         endif
2988
2989         if (waga_theta.gt.0.0d0) then
2990 c         open (ientin,file=tpl_k_sigma_theta,status='old')
2991 c         do irec=1,maxres-2 ! loop for reading sigma_theta, right bounds?
2992 c            read (ientin,*,end=1403) i,j,ki,sigma_theta(k,i+nnt-1) ! j,ki what for?
2993 c            sigma_theta(k,i+nnt-1)=sigma_theta(k,i+nnt-1)* ! not inverse because of use of res. similarity
2994 c    &                              sigma_theta(k,i+nnt-1)
2995 c         enddo
2996 c1403   continue
2997 c         close (ientin)
2998
2999           do i = nnt+2,nct ! right? without parallel.
3000 c         do i = i=1,nres ! alternative for bounds acc to readpdb?
3001 c         do i=ithet_start,ithet_end ! with FG parallel.
3002              if (idomain(k,i).eq.0) then  
3003               sigma_theta(k,i)=0.0
3004               cycle
3005              endif
3006              thetatpl(k,i)=thetaref(i)
3007 c            write (iout,*) "thetatpl(",k,i,") =",thetatpl(k,i)
3008 c            write(iout,*)  "rescore(",k,i,") =",rescore(k,i),
3009 c    &                      "rescore(",k,i-1,") =",rescore(k,i-1),
3010 c    &                      "rescore(",k,i-2,") =",rescore(k,i-2)
3011 c            read (ientin,*) sigma_theta(k,i) ! 1st variant
3012              sigma_theta(k,i)=(rescore(k,i)+rescore(k,i-1)+
3013      &                        rescore(k,i-2))/3.0
3014 c             if (read2sigma) sigma_theta(k,i)=sigma_theta(k,i)/3.0
3015              sigma_theta(k,i)=1.0d0/(sigma_theta(k,i)*sigma_theta(k,i))
3016
3017 c            sigma_theta(k,i)=hmscore(k)*rescore(k,i)*rescore(k,i-1)*
3018 c                             rescore(k,i-2) !  right expression ?
3019 c            sigma_theta(k,i)=sigma_theta(k,i)*sigma_theta(k,i)
3020           enddo
3021         endif
3022         lim_theta=nct-nnt-1 
3023
3024         if (waga_d.gt.0.0d0) then
3025 c       open (ientin,file=tpl_k_sigma_d,status='old')
3026 c         do irec=1,maxres-1 ! loop for reading sigma_theta, right bounds?
3027 c            read (ientin,*,end=1404) i,j,sigma_d(k,i+nnt-1) ! j,ki what for?
3028 c            sigma_d(k,i+nnt-1)=sigma_d(k,i+nnt-1)* ! not inverse because of use of res. similarity
3029 c    &                          sigma_d(k,i+nnt-1)
3030 c         enddo
3031 c1404   continue
3032
3033           do i = nnt,nct ! right? without parallel.
3034 c         do i=2,nres-1 ! alternative for bounds acc to readpdb?
3035 c         do i=loc_start,loc_end ! with FG parallel.
3036                if (itype(i).eq.10) cycle 
3037                if (idomain(k,i).eq.0 ) then 
3038                   sigma_d(k,i)=0.0
3039                   cycle
3040                endif
3041                xxtpl(k,i)=xxref(i)
3042                yytpl(k,i)=yyref(i)
3043                zztpl(k,i)=zzref(i)
3044 c              write (iout,*) "xxtpl(",k,i,") =",xxtpl(k,i)
3045 c              write (iout,*) "yytpl(",k,i,") =",yytpl(k,i)
3046 c              write (iout,*) "zztpl(",k,i,") =",zztpl(k,i)
3047 c              write(iout,*)  "rescore(",k,i,") =",rescore(k,i)
3048                sigma_d(k,i)=rescore(k,i) !  right expression ?
3049                sigma_d(k,i)=1.0d0/(sigma_d(k,i)*sigma_d(k,i))
3050
3051 c              sigma_d(k,i)=hmscore(k)*rescore(k,i) !  right expression ?
3052 c              sigma_d(k,i)=sigma_d(k,i)*sigma_d(k,i)
3053 c              read (ientin,*) sigma_d(k,i) ! 1st variant
3054                if (i-nnt+1.gt.lim_xx) lim_xx=i-nnt+1 ! right?
3055           enddo
3056           lim_xx=nct-nnt+1 
3057         endif
3058       enddo
3059 c
3060 c remove distance restraints not used in any model from the list
3061 c shift data in all arrays
3062 c
3063       if (waga_dist.ne.0.0d0) then
3064         ii=0
3065         do i=nnt,nct-2 
3066          do j=i+2,nct 
3067           ii=ii+1
3068           if (ii_in_use(ii).eq.0) then 
3069              do ki=ii,lim_odl-1
3070               ires_homo(ki)=ires_homo(ki+1)
3071               jres_homo(ki)=jres_homo(ki+1)
3072               ii_in_use(ki)=ii_in_use(ki+1)
3073               do k=1,constr_homology
3074                odl(k,ki)=odl(k,ki+1)
3075                sigma_odl(k,ki)=sigma_odl(k,ki+1)
3076                l_homo(k,ki)=l_homo(k,ki+1)
3077               enddo
3078              enddo
3079              ii=ii-1
3080              lim_odl=lim_odl-1
3081           endif
3082          enddo
3083         enddo
3084       endif
3085       if (constr_homology.gt.0) call homology_partition
3086       if (constr_homology.gt.0) call init_int_table
3087 cd      write (iout,*) "homology_partition: lim_theta= ",lim_theta,
3088 cd     & "lim_xx=",lim_xx
3089 c     write (iout,*) "ithet_start =",ithet_start,"ithet_end =",ithet_end
3090 c     write (iout,*) "loc_start =",loc_start,"loc_end =",loc_end
3091 c
3092 c Print restraints
3093 c
3094       if (.not.lprn) return
3095 cd      write(iout,*) "waga_theta",waga_theta,"waga_d",waga_d
3096       if(me.eq.king .or. .not. out1file .and. fg_rank.eq.0) then
3097        write (iout,*) "Distance restraints from templates"
3098        do ii=1,lim_odl
3099        write(iout,'(3i5,10(2f8.2,1x,l1,4x))') 
3100      &  ii,ires_homo(ii),jres_homo(ii),
3101      &  (odl(ki,ii),1.0d0/dsqrt(sigma_odl(ki,ii)),l_homo(ki,ii),
3102      &  ki=1,constr_homology)
3103        enddo
3104        write (iout,*) "Dihedral angle restraints from templates"
3105        do i=nnt+3,lim_dih
3106         write (iout,'(i5,10(2f8.2,4x))') i,(rad2deg*dih(ki,i),
3107      &      rad2deg/dsqrt(sigma_dih(ki,i)),ki=1,constr_homology)
3108        enddo
3109        write (iout,*) "Virtual-bond angle restraints from templates"
3110        do i=nnt+2,lim_theta
3111         write (iout,'(i5,10(2f8.2,4x))') i,(rad2deg*thetatpl(ki,i),
3112      &      rad2deg/dsqrt(sigma_theta(ki,i)),ki=1,constr_homology)
3113        enddo
3114        write (iout,*) "SC restraints from templates"
3115        do i=nnt,lim_xx
3116         write(iout,'(i5,10(4f8.2,4x))') i,
3117      &  (xxtpl(ki,i),yytpl(ki,i),zztpl(ki,i),
3118      &   1.0d0/dsqrt(sigma_d(ki,i)),ki=1,constr_homology)
3119        enddo
3120       endif
3121 c -----------------------------------------------------------------
3122       return
3123       end
3124 c----------------------------------------------------------------------
3125
3126 #ifdef WINIFL
3127       subroutine flush(iu)
3128       return
3129       end
3130 #endif
3131 #ifdef AIX
3132       subroutine flush(iu)
3133       call flush_(iu)
3134       return
3135       end
3136 #endif
3137
3138 c------------------------------------------------------------------------------
3139       subroutine copy_to_tmp(source)
3140       include "DIMENSIONS"
3141       include "COMMON.IOUNITS"
3142       character*(*) source
3143       character* 256 tmpfile
3144       integer ilen
3145       external ilen
3146       logical ex
3147       tmpfile=curdir(:ilen(curdir))//"/"//source(:ilen(source))
3148       inquire(file=tmpfile,exist=ex)
3149       if (ex) then
3150         write (*,*) "Copying ",tmpfile(:ilen(tmpfile)),
3151      &   " to temporary directory..."
3152         write (*,*) "/bin/cp "//tmpfile(:ilen(tmpfile))//" "//tmpdir
3153         call system("/bin/cp "//tmpfile(:ilen(tmpfile))//" "//tmpdir)
3154       endif
3155       return
3156       end
3157 c------------------------------------------------------------------------------
3158       subroutine move_from_tmp(source)
3159       include "DIMENSIONS"
3160       include "COMMON.IOUNITS"
3161       character*(*) source
3162       integer ilen
3163       external ilen
3164       write (*,*) "Moving ",source(:ilen(source)),
3165      & " from temporary directory to working directory"
3166       write (*,*) "/bin/mv "//source(:ilen(source))//" "//curdir
3167       call system("/bin/mv "//source(:ilen(source))//" "//curdir)
3168       return
3169       end
3170 c------------------------------------------------------------------------------
3171       subroutine random_init(seed)
3172 C
3173 C Initialize random number generator
3174 C
3175       implicit real*8 (a-h,o-z)
3176       include 'DIMENSIONS'
3177 #ifdef AMD64
3178       integer*8 iseedi8
3179 #endif
3180 #ifdef MPI
3181       include 'mpif.h'
3182       logical OKRandom, prng_restart
3183       real*8  r1
3184       integer iseed_array(4)
3185 #endif
3186       include 'COMMON.IOUNITS'
3187       include 'COMMON.TIME1'
3188       include 'COMMON.THREAD'
3189       include 'COMMON.SBRIDGE'
3190       include 'COMMON.CONTROL'
3191       include 'COMMON.MCM'
3192       include 'COMMON.MAP'
3193       include 'COMMON.HEADER'
3194 csa      include 'COMMON.CSA'
3195       include 'COMMON.CHAIN'
3196       include 'COMMON.MUCA'
3197       include 'COMMON.MD'
3198       include 'COMMON.FFIELD'
3199       include 'COMMON.SETUP'
3200       iseed=-dint(dabs(seed))
3201       if (iseed.eq.0) then
3202         write (iout,'(/80(1h*)/20x,a/80(1h*))') 
3203      &    'Random seed undefined. The program will stop.'
3204         write (*,'(/80(1h*)/20x,a/80(1h*))') 
3205      &    'Random seed undefined. The program will stop.'
3206 #ifdef MPI
3207         call mpi_finalize(mpi_comm_world,ierr)
3208 #endif
3209         stop 'Bad random seed.'
3210       endif
3211 #ifdef MPI
3212       if (fg_rank.eq.0) then
3213       seed=seed*(me+1)+1
3214 #ifdef AMD64
3215       iseedi8=dint(seed)
3216       if(me.eq.king .or. .not. out1file)
3217      &  write (iout,*) 'MPI: node= ', me, ' iseed= ',iseedi8
3218       write (*,*) 'MPI: node= ', me, ' iseed= ',iseedi8
3219       OKRandom = prng_restart(me,iseedi8)
3220 #else
3221       do i=1,4
3222        tmp=65536.0d0**(4-i)
3223        iseed_array(i) = dint(seed/tmp)
3224        seed=seed-iseed_array(i)*tmp
3225       enddo
3226       if(me.eq.king .or. .not. out1file)
3227      & write (iout,*) 'MPI: node= ', me, ' iseed(4)= ',
3228      &                 (iseed_array(i),i=1,4)
3229       write (*,*) 'MPI: node= ',me, ' iseed(4)= ',
3230      &                 (iseed_array(i),i=1,4)
3231       OKRandom = prng_restart(me,iseed_array)
3232 #endif
3233       if (OKRandom) then
3234         r1=ran_number(0.0D0,1.0D0)
3235         if(me.eq.king .or. .not. out1file)
3236      &   write (iout,*) 'ran_num',r1
3237         if (r1.lt.0.0d0) OKRandom=.false.
3238       endif
3239       if (.not.OKRandom) then
3240         write (iout,*) 'PRNG IS NOT WORKING!!!'
3241         print *,'PRNG IS NOT WORKING!!!'
3242         if (me.eq.0) then 
3243          call flush(iout)
3244          call mpi_abort(mpi_comm_world,error_msg,ierr)
3245          stop
3246         else
3247          write (iout,*) 'too many processors for parallel prng'
3248          write (*,*) 'too many processors for parallel prng'
3249          call flush(iout)
3250          stop
3251         endif
3252       endif
3253       endif
3254 #else
3255       call vrndst(iseed)
3256       write (iout,*) 'ran_num',ran_number(0.0d0,1.0d0)
3257 #endif
3258       return
3259       end