Introduction of PBC to cluster energy and reading, turn off wham one of the debug
[unres.git] / source / cluster / wham / src-M / readrtns.F
1       subroutine read_control
2 C
3 C Read molecular data
4 C
5       implicit none
6       include 'DIMENSIONS'
7       include 'sizesclu.dat'
8       include 'COMMON.IOUNITS'
9       include 'COMMON.TIME1'
10       include 'COMMON.SBRIDGE'
11       include 'COMMON.CONTROL'
12       include 'COMMON.CLUSTER'
13       include 'COMMON.CHAIN'
14       include 'COMMON.HEADER'
15       include 'COMMON.FFIELD'
16       include 'COMMON.FREE'
17       include 'COMMON.INTERACT'
18       character*320 controlcard,ucase
19 #ifdef MPL
20       include 'COMMON.INFO'
21 #endif
22       integer i
23
24       read (INP,'(a80)') titel
25       call card_concat(controlcard)
26
27       call readi(controlcard,'NRES',nres,0)
28       call readi(controlcard,'RESCALE',rescale_mode,2)
29       call reada(controlcard,'DISTCHAINMAX',distchainmax,50.0d0)
30       write (iout,*) "DISTCHAINMAX",distchainmax
31 C Reading the dimensions of box in x,y,z coordinates
32       call reada(controlcard,'BOXX',boxxsize,100.0d0)
33       call reada(controlcard,'BOXY',boxysize,100.0d0)
34       call reada(controlcard,'BOXZ',boxzsize,100.0d0)
35 c Cutoff range for interactions
36       call reada(controlcard,"R_CUT",r_cut,15.0d0)
37       call reada(controlcard,"LAMBDA",rlamb,0.3d0)
38       call readi(controlcard,'PDBOUT',outpdb,0)
39       call readi(controlcard,'MOL2OUT',outmol2,0)
40       refstr=(index(controlcard,'REFSTR').gt.0)
41       write (iout,*) "REFSTR",refstr
42       pdbref=(index(controlcard,'PDBREF').gt.0)
43       iscode=index(controlcard,'ONE_LETTER')
44       tree=(index(controlcard,'MAKE_TREE').gt.0)
45       min_var=(index(controlcard,'MINVAR').gt.0)
46       plot_tree=(index(controlcard,'PLOT_TREE').gt.0)
47       punch_dist=(index(controlcard,'PUNCH_DIST').gt.0)
48       call readi(controlcard,'NCUT',ncut,1)
49       call readi(controlcard,'SYM',symetr,1)
50       write (iout,*) 'sym', symetr
51       call readi(controlcard,'NSTART',nstart,0)
52       call readi(controlcard,'NEND',nend,0)
53       call reada(controlcard,'ECUT',ecut,10.0d0)
54       call reada(controlcard,'PROB',prob_limit,0.99d0)
55       write (iout,*) "Probability limit",prob_limit
56       lgrp=(index(controlcard,'LGRP').gt.0)
57       caonly=(index(controlcard,'CA_ONLY').gt.0)
58       print_dist=(index(controlcard,'PRINT_DIST').gt.0)
59       call multreada(controlcard,'CUTOFF',rcutoff,ncut,-1.0d0)
60       call readi(controlcard,'IOPT',iopt,2) 
61       lside = index(controlcard,"SIDE").gt.0
62       efree = index(controlcard,"EFREE").gt.0
63       call readi(controlcard,'NTEMP',nT,1)
64       write (iout,*) "nT",nT
65       call multreada(controlcard,'TEMPER',beta_h,nT,300.0d0)
66       write (iout,*) "nT",nT
67       write (iout,*) 'beta_h',(beta_h(i),i=1,nT)
68       do i=1,nT
69         beta_h(i)=1.0d0/(1.987D-3*beta_h(i))
70       enddo
71       write (iout,*) 'beta_h',(beta_h(i),i=1,nT)
72       lprint_cart=index(controlcard,"PRINT_CART") .gt.0
73       lprint_int=index(controlcard,"PRINT_INT") .gt.0
74       if (min_var) iopt=1
75       return
76       end
77 c--------------------------------------------------------------------------
78       subroutine molread
79 C
80 C Read molecular data.
81 C
82       implicit none
83       include 'DIMENSIONS'
84       include 'COMMON.IOUNITS'
85       include 'COMMON.GEO'
86       include 'COMMON.VAR'
87       include 'COMMON.INTERACT'
88       include 'COMMON.LOCAL'
89       include 'COMMON.NAMES'
90       include 'COMMON.CHAIN'
91       include 'COMMON.FFIELD'
92       include 'COMMON.SBRIDGE'
93       include 'COMMON.HEADER'
94       include 'COMMON.CONTROL'
95       include 'COMMON.CONTACTS'
96       include 'COMMON.TIME1'
97 #ifdef MPL
98       include 'COMMON.INFO'
99 #endif
100       character*4 sequence(maxres)
101       character*800 weightcard
102       integer rescode
103       double precision x(maxvar)
104       integer itype_pdb(maxres)
105       logical seq_comp
106       integer i,j,kkk
107 C
108 C Body
109 C
110 C Read weights of the subsequent energy terms.
111       call card_concat(weightcard)
112       call reada(weightcard,'WSC',wsc,1.0d0)
113       call reada(weightcard,'WLONG',wsc,wsc)
114       call reada(weightcard,'WSCP',wscp,1.0d0)
115       call reada(weightcard,'WELEC',welec,1.0D0)
116       call reada(weightcard,'WVDWPP',wvdwpp,welec)
117       call reada(weightcard,'WEL_LOC',wel_loc,1.0D0)
118       call reada(weightcard,'WCORR4',wcorr4,0.0D0)
119       call reada(weightcard,'WCORR5',wcorr5,0.0D0)
120       call reada(weightcard,'WCORR6',wcorr6,0.0D0)
121       call reada(weightcard,'WTURN3',wturn3,1.0D0)
122       call reada(weightcard,'WTURN4',wturn4,1.0D0)
123       call reada(weightcard,'WTURN6',wturn6,1.0D0)
124       call reada(weightcard,'WSTRAIN',wstrain,1.0D0)
125       call reada(weightcard,'WSCCOR',wsccor,1.0D0)
126       call reada(weightcard,'WBOND',wbond,1.0D0)
127       call reada(weightcard,'WTOR',wtor,1.0D0)
128       call reada(weightcard,'WTORD',wtor_d,1.0D0)
129       call reada(weightcard,'WANG',wang,1.0D0)
130       call reada(weightcard,'WSCLOC',wscloc,1.0D0)
131       call reada(weightcard,'SCAL14',scal14,0.4D0)
132       call reada(weightcard,'SCALSCP',scalscp,1.0d0)
133       call reada(weightcard,'CUTOFF',cutoff_corr,7.0d0)
134       call reada(weightcard,'DELT_CORR',delt_corr,0.5d0)
135       if (index(weightcard,'SOFT').gt.0) ipot=6
136 C 12/1/95 Added weight for the multi-body term WCORR
137       call reada(weightcard,'WCORRH',wcorr,1.0D0)
138       if (wcorr4.gt.0.0d0) wcorr=wcorr4
139       weights(1)=wsc
140       weights(2)=wscp
141       weights(3)=welec
142       weights(4)=wcorr
143       weights(5)=wcorr5
144       weights(6)=wcorr6
145       weights(7)=wel_loc
146       weights(8)=wturn3
147       weights(9)=wturn4
148       weights(10)=wturn6
149       weights(11)=wang
150       weights(12)=wscloc
151       weights(13)=wtor
152       weights(14)=wtor_d
153       weights(15)=wstrain
154       weights(16)=wvdwpp
155       weights(17)=wbond
156       weights(18)=scal14
157       weights(19)=wsccor
158       write (iout,10) wsc,wscp,welec,wvdwpp,wbond,wang,wscloc,wtor,
159      &  wtor_d,wstrain,wel_loc,wcorr,wcorr5,wcorr6,wturn3,
160      &  wturn4,wturn6,wsccor
161    10 format (/'Energy-term weights (unscaled):'//
162      & 'WSCC=   ',f10.6,' (SC-SC)'/
163      & 'WSCP=   ',f10.6,' (SC-p)'/
164      & 'WELEC=  ',f10.6,' (p-p electr)'/
165      & 'WVDWPP= ',f10.6,' (p-p VDW)'/
166      & 'WBOND=  ',f10.6,' (stretching)'/
167      & 'WANG=   ',f10.6,' (bending)'/
168      & 'WSCLOC= ',f10.6,' (SC local)'/
169      & 'WTOR=   ',f10.6,' (torsional)'/
170      & 'WTORD=  ',f10.6,' (double torsional)'/
171      & 'WSTRAIN=',f10.6,' (SS bridges & dist. cnstr.)'/
172      & 'WEL_LOC=',f10.6,' (multi-body 3-rd order)'/
173      & 'WCORR4= ',f10.6,' (multi-body 4th order)'/
174      & 'WCORR5= ',f10.6,' (multi-body 5th order)'/
175      & 'WCORR6= ',f10.6,' (multi-body 6th order)'/
176      & 'WTURN3= ',f10.6,' (turns, 3rd order)'/
177      & 'WTURN4= ',f10.6,' (turns, 4th order)'/
178      & 'WTURN6= ',f10.6,' (turns, 6th order)'/
179      & 'WSCCOR= ',f10.6,' (SC-backbone torsinal correalations)')
180
181       if (wcorr4.gt.0.0d0) then
182         write (iout,'(/2a/)') 'Local-electrostatic type correlation ',
183      &   'between contact pairs of peptide groups'
184         write (iout,'(2(a,f5.3/))')
185      &  'Cutoff on 4-6th order correlation terms: ',cutoff_corr,
186      &  'Range of quenching the correlation terms:',2*delt_corr
187       else if (wcorr.gt.0.0d0) then
188         write (iout,'(/2a/)') 'Hydrogen-bonding correlation ',
189      &   'between contact pairs of peptide groups'
190       endif
191       write (iout,'(a,f8.3)')
192      &  'Scaling factor of 1,4 SC-p interactions:',scal14
193       write (iout,'(a,f8.3)')
194      &  'General scaling factor of SC-p interactions:',scalscp
195       r0_corr=cutoff_corr-delt_corr
196       do i=1,20
197         aad(i,1)=scalscp*aad(i,1)
198         aad(i,2)=scalscp*aad(i,2)
199         bad(i,1)=scalscp*bad(i,1)
200         bad(i,2)=scalscp*bad(i,2)
201       enddo
202
203       call flush(iout)
204       print *,'indpdb=',indpdb,' pdbref=',pdbref
205
206 C Read sequence if not taken from the pdb file.
207       if (iscode.gt.0) then
208         read (inp,'(80a1)') (sequence(i)(1:1),i=1,nres)
209       else
210         read (inp,'(20(1x,a3))') (sequence(i),i=1,nres)
211       endif
212 C Convert sequence to numeric code
213       do i=1,nres
214         itype(i)=rescode(i,sequence(i),iscode)
215       enddo
216       print *,nres
217       print '(20i4)',(itype(i),i=1,nres)
218
219       do i=1,nres
220 #ifdef PROCOR
221         if (itype(i).eq.ntyp1 .or. itype(i+1).eq.ntyp1) then
222 #else
223         if (itype(i).eq.ntyp1) then
224 #endif
225           itel(i)=0
226 #ifdef PROCOR
227         else if (iabs(itype(i+1)).ne.20) then
228 #else
229         else if (iabs(itype(i)).ne.20) then
230 #endif
231           itel(i)=1
232         else
233           itel(i)=2
234         endif
235       enddo
236       write (iout,*) "ITEL"
237       do i=1,nres-1
238         write (iout,*) i,itype(i),itel(i)
239       enddo
240
241       print *,'Call Read_Bridge.'
242       call read_bridge
243       nnt=1
244       nct=nres
245       print *,'NNT=',NNT,' NCT=',NCT
246       if (itype(1).eq.ntyp1) nnt=2
247       if (itype(nres).eq.ntyp1) nct=nct-1
248       if (nstart.lt.nnt) nstart=nnt
249       if (nend.gt.nct .or. nend.eq.0) nend=nct
250       write (iout,*) "nstart",nstart," nend",nend
251       nres0=nres
252 c      if (pdbref) then
253 c        read(inp,'(a)') pdbfile
254 c        write (iout,'(2a)') 'PDB data will be read from file ',pdbfile
255 c        open(ipdbin,file=pdbfile,status='old',err=33)
256 c        goto 34 
257 c  33    write (iout,'(a)') 'Error opening PDB file.'
258 c        stop
259 c  34    continue
260 c        print *,'Begin reading pdb data'
261 c        call readpdb
262 c        print *,'Finished reading pdb data'
263 c        write (iout,'(a,i3,a,i3)')'nsup=',nsup,' nstart_sup=',nstart_sup
264 c        do i=1,nres
265 c          itype_pdb(i)=itype(i)
266 c        enddo
267 c        close (ipdbin)
268 c        write (iout,'(a,i3)') 'nsup=',nsup
269 c        nstart_seq=nnt
270 c        if (nsup.le.(nct-nnt+1)) then
271 c          do i=0,nct-nnt+1-nsup
272 c            if (seq_comp(itype(nnt+i),itype_pdb(nstart_sup),nsup)) then
273 c              nstart_seq=nnt+i
274 c              goto 111
275 c            endif
276 c          enddo
277 c          write (iout,'(a)') 
278 c     &            'Error - sequences to be superposed do not match.'
279 c          stop
280 c        else
281 c          do i=0,nsup-(nct-nnt+1)
282 c            if (seq_comp(itype(nnt),itype_pdb(nstart_sup+i),nct-nnt+1)) 
283 c     &      then
284 c              nstart_sup=nstart_sup+i
285 c              nsup=nct-nnt+1
286 c              goto 111
287 c            endif
288 c          enddo 
289 c          write (iout,'(a)') 
290 c     &            'Error - sequences to be superposed do not match.'
291 c        endif
292 c  111   continue
293 c        write (iout,*) 'nsup=',nsup,' nstart_sup=',nstart_sup,
294 c     &                 ' nstart_seq=',nstart_seq
295 c      endif
296       call init_int_table
297       call setup_var
298       write (iout,*) "molread: REFSTR",refstr
299       if (refstr) then
300         if (.not.pdbref) then
301           call read_angles(inp,*38)
302           goto 39
303    38     write (iout,'(a)') 'Error reading reference structure.'
304 #ifdef MPL
305           call mp_stopall(Error_Msg)
306 #else
307           stop 'Error reading reference structure'
308 #endif
309    39     call chainbuild     
310           nstart_sup=nnt
311           nstart_seq=nnt
312           nsup=nct-nnt+1
313           kkk=1
314           do i=1,2*nres
315             do j=1,3
316               cref(j,i,kkk)=c(j,i)
317             enddo
318           enddo
319         endif
320         call contact(.true.,ncont_ref,icont_ref)
321       endif
322       return
323       end
324 c-----------------------------------------------------------------------------
325       logical function seq_comp(itypea,itypeb,length)
326       implicit none
327       integer length,itypea(length),itypeb(length)
328       integer i
329       do i=1,length
330         if (itypea(i).ne.itypeb(i)) then
331           seq_comp=.false.
332           return
333         endif
334       enddo
335       seq_comp=.true.
336       return
337       end
338 c-----------------------------------------------------------------------------
339       subroutine read_bridge
340 C Read information about disulfide bridges.
341       implicit none
342       include 'DIMENSIONS'
343       include 'COMMON.IOUNITS'
344       include 'COMMON.GEO'
345       include 'COMMON.VAR'
346       include 'COMMON.INTERACT'
347       include 'COMMON.LOCAL'
348       include 'COMMON.NAMES'
349       include 'COMMON.CHAIN'
350       include 'COMMON.FFIELD'
351       include 'COMMON.SBRIDGE'
352       include 'COMMON.HEADER'
353       include 'COMMON.CONTROL'
354       include 'COMMON.TIME1'
355 #ifdef MPL
356       include 'COMMON.INFO'
357 #endif
358       integer i,j
359 C Read bridging residues.
360       read (inp,*) ns,(iss(i),i=1,ns)
361       print *,'ns=',ns
362 C Check whether the specified bridging residues are cystines.
363       do i=1,ns
364         if (itype(iss(i)).ne.1) then
365           write (iout,'(2a,i3,a)') 
366      &   'Do you REALLY think that the residue ',restyp(iss(i)),i,
367      &   ' can form a disulfide bridge?!!!'
368           write (*,'(2a,i3,a)') 
369      &   'Do you REALLY think that the residue ',restyp(iss(i)),i,
370      &   ' can form a disulfide bridge?!!!'
371 #ifdef MPL
372          call mp_stopall(error_msg)
373 #else
374          stop
375 #endif
376         endif
377       enddo
378 C Read preformed bridges.
379       if (ns.gt.0) then
380       read (inp,*) nss,(ihpb(i),jhpb(i),i=1,nss)
381       if (nss.gt.0) then
382         nhpb=nss
383 C Check if the residues involved in bridges are in the specified list of
384 C bridging residues.
385         do i=1,nss
386           do j=1,i-1
387             if (ihpb(i).eq.ihpb(j).or.ihpb(i).eq.jhpb(j)
388      &      .or.jhpb(i).eq.ihpb(j).or.jhpb(i).eq.jhpb(j)) then
389               write (iout,'(a,i3,a)') 'Disulfide pair',i,
390      &      ' contains residues present in other pairs.'
391               write (*,'(a,i3,a)') 'Disulfide pair',i,
392      &      ' contains residues present in other pairs.'
393 #ifdef MPL
394               call mp_stopall(error_msg)
395 #else
396               stop 
397 #endif
398             endif
399           enddo
400           do j=1,ns
401             if (ihpb(i).eq.iss(j)) goto 10
402           enddo
403           write (iout,'(a,i3,a)') 'Pair',i,' contains unknown cystine.'
404    10     continue
405           do j=1,ns
406             if (jhpb(i).eq.iss(j)) goto 20
407           enddo
408           write (iout,'(a,i3,a)') 'Pair',i,' contains unknown cystine.'
409    20     continue
410           dhpb(i)=dbr
411           forcon(i)=fbr
412         enddo
413         do i=1,nss
414           ihpb(i)=ihpb(i)+nres
415           jhpb(i)=jhpb(i)+nres
416         enddo
417       endif
418       endif
419       return
420       end
421 c----------------------------------------------------------------------------
422       subroutine read_angles(kanal,*)
423       implicit none
424       include 'DIMENSIONS'
425       include 'COMMON.GEO'
426       include 'COMMON.VAR'
427       include 'COMMON.CHAIN'
428       include 'COMMON.IOUNITS'
429       integer i,kanal
430       read (kanal,*,err=10,end=10) (theta(i),i=3,nres)
431       read (kanal,*,err=10,end=10) (phi(i),i=4,nres)
432       read (kanal,*,err=10,end=10) (alph(i),i=2,nres-1)
433       read (kanal,*,err=10,end=10) (omeg(i),i=2,nres-1)
434       do i=1,nres
435         theta(i)=deg2rad*theta(i)
436         phi(i)=deg2rad*phi(i)
437         alph(i)=deg2rad*alph(i)
438         omeg(i)=deg2rad*omeg(i)
439       enddo
440       return
441    10 return1
442       end
443 c----------------------------------------------------------------------------
444       subroutine reada(rekord,lancuch,wartosc,default)
445       implicit none
446       character*(*) rekord,lancuch
447       double precision wartosc,default
448       integer ilen,iread
449       external ilen
450       iread=index(rekord,lancuch)
451       if (iread.eq.0) then
452         wartosc=default 
453         return
454       endif   
455       iread=iread+ilen(lancuch)+1
456       read (rekord(iread:),*) wartosc
457       return
458       end
459 c----------------------------------------------------------------------------
460       subroutine multreada(rekord,lancuch,tablica,dim,default)
461       implicit none
462       integer dim,i
463       double precision tablica(dim),default
464       character*(*) rekord,lancuch
465       integer ilen,iread
466       external ilen
467       do i=1,dim
468         tablica(i)=default 
469       enddo
470       iread=index(rekord,lancuch)
471       if (iread.eq.0) return
472       iread=iread+ilen(lancuch)+1
473       read (rekord(iread:),*,end=10,err=10) (tablica(i),i=1,dim)
474    10 return
475       end
476 c----------------------------------------------------------------------------
477       subroutine readi(rekord,lancuch,wartosc,default)
478       implicit none
479       character*(*) rekord,lancuch
480       integer wartosc,default
481       integer ilen,iread
482       external ilen
483       iread=index(rekord,lancuch)
484       if (iread.eq.0) then
485         wartosc=default 
486         return
487       endif   
488       iread=iread+ilen(lancuch)+1
489       read (rekord(iread:),*) wartosc
490       return
491       end
492 c----------------------------------------------------------------------------
493       subroutine card_concat(card)
494       include 'DIMENSIONS'
495       include 'COMMON.IOUNITS'
496       character*(*) card
497       character*80 karta,ucase
498       external ilen
499       read (inp,'(a)') karta
500       karta=ucase(karta)
501       card=' '
502       do while (karta(80:80).eq.'&')
503         card=card(:ilen(card)+1)//karta(:79)
504         read (inp,'(a)') karta
505         karta=ucase(karta)
506       enddo
507       card=card(:ilen(card)+1)//karta
508       return
509       end
510 c----------------------------------------------------------------------------
511       subroutine openunits
512       implicit none
513       include 'DIMENSIONS'    
514 #ifdef MPI
515       include "mpif.h"
516       character*3 liczba
517       include "COMMON.MPI"
518 #endif
519       include 'COMMON.IOUNITS'
520       include 'COMMON.CONTROL'
521       integer lenpre,lenpot,ilen
522       external ilen
523       character*16 cformat,cprint
524       character*16 ucase
525       integer lenint,lenout
526       call getenv('INPUT',prefix)
527       call getenv('OUTPUT',prefout)
528       call getenv('INTIN',prefintin)
529       call getenv('COORD',cformat)
530       call getenv('PRINTCOOR',cprint)
531       call getenv('SCRATCHDIR',scratchdir)
532       from_bx=.true.
533       from_cx=.false.
534       if (index(ucase(cformat),'CX').gt.0) then
535         from_cx=.true.
536         from_bx=.false.
537       endif
538       from_cart=.true.
539       lenpre=ilen(prefix)
540       lenout=ilen(prefout)
541       lenint=ilen(prefintin)
542 C Get the names and open the input files
543       open (inp,file=prefix(:ilen(prefix))//'.inp',status='old')
544 #ifdef MPI
545       write (liczba,'(bz,i3.3)') me
546       outname=prefout(:lenout)//'_clust.out_'//liczba
547 #else
548       outname=prefout(:lenout)//'_clust.out'
549 #endif
550       if (from_bx) then
551         intinname=prefintin(:lenint)//'.bx'
552       else if (from_cx) then
553         intinname=prefintin(:lenint)//'.cx'
554       else
555         intinname=prefintin(:lenint)//'.int'
556       endif
557       rmsname=prefintin(:lenint)//'.rms'
558       open (jplot,file=prefout(:ilen(prefout))//'.tex',
559      &       status='unknown')
560       open (jrms,file=rmsname,status='unknown')
561       open(iout,file=outname,status='unknown')
562 C Get parameter filenames and open the parameter files.
563       call getenv('BONDPAR',bondname)
564       open (ibond,file=bondname,status='old')
565       call getenv('THETPAR',thetname)
566       open (ithep,file=thetname,status='old')
567       call getenv('ROTPAR',rotname)
568       open (irotam,file=rotname,status='old')
569       call getenv('TORPAR',torname)
570       open (itorp,file=torname,status='old')
571       call getenv('TORDPAR',tordname)
572       open (itordp,file=tordname,status='old')
573       call getenv('FOURIER',fouriername)
574       open (ifourier,file=fouriername,status='old')
575       call getenv('ELEPAR',elename)
576       open (ielep,file=elename,status='old')
577       call getenv('SIDEPAR',sidename)
578       open (isidep,file=sidename,status='old')
579       call getenv('SIDEP',sidepname)
580       open (isidep1,file=sidepname,status="old")
581       call getenv('SCCORPAR',sccorname)
582       open (isccor,file=sccorname,status="old")
583 #ifndef OLDSCP
584 C
585 C 8/9/01 In the newest version SCp interaction constants are read from a file
586 C Use -DOLDSCP to use hard-coded constants instead.
587 C
588       call getenv('SCPPAR',scpname)
589       open (iscpp,file=scpname,status='old')
590 #endif
591       return
592       end