Added src_Eshel (decoy processing for threading)
[unres.git] / source / unres / src_Eshel / unres.F
1 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
2 C                                                                              C
3 C                                U N R E S                                     C
4 C                                                                              C
5 C Version for use in parameter optimization on fixed set of decoys             C
6 C                                                                              C
7 C A. Liwo 12/14/13                                                             C
8 C                                                                              C
9 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
10       implicit real*8 (a-h,o-z)
11       include 'DIMENSIONS'
12       include 'COMMON.TIME1'
13       include 'COMMON.INTERACT'
14       include 'COMMON.NAMES'
15       include 'COMMON.GEO'
16       include 'COMMON.HEADER'
17       include 'COMMON.CONTROL'
18       include 'COMMON.CONTACTS'
19       include 'COMMON.CHAIN'
20       include 'COMMON.VAR'
21       include 'COMMON.IOUNITS'
22       include 'COMMON.FFIELD'
23       include 'COMMON.REMD'
24       include 'COMMON.MD'
25       include 'COMMON.SBRIDGE'
26       double precision hrtime,mintime,sectime
27       double precision energia(0:n_ene)
28
29 C Initializing variables, setting constants, translation of residue types
30 C to numeric types, etc. MUST be called.
31       call init_task
32 C Read force field parameters and job setup data
33       call readrtns
34 C
35 C
36 #ifdef MPI
37 With fine-graining energy, slaves compute only their energy chunks.
38       if (fg_rank.gt.0) then
39 C Fine-grain slaves just do energy and gradient components.
40         call ergastulum ! slave workhouse in Latin
41       else
42 #endif
43         if (indpdb.gt.0) then
44           do ifile=1,npdbfile
45             call pdbinput(ifile) 
46             call exec_eeval_or_minim(energia(0))
47             call statout(ifile,energia(0))
48           enddo
49         else
50           call exec_eeval_or_minim(energia(0))
51           call statout(1,energia(0))
52         endif
53 #ifdef MPI
54       endif
55 C Finish task.
56       if (fg_rank.eq.0) call finish_task
57 #ifdef TIMING
58        call print_detailed_timing
59 #endif
60       call MPI_Finalize(ierr)
61       stop 'Bye Bye...'
62 #else
63       call dajczas(tcpu(),hrtime,mintime,sectime)
64       stop '********** Program terminated normally.'
65 #endif
66       end
67 c--------------------------------------------------------------------------
68       subroutine exec_eeval_or_minim(energy)
69       implicit real*8 (a-h,o-z)
70       include 'DIMENSIONS'
71 #ifdef MPI
72       include 'mpif.h'
73 #endif
74       include 'COMMON.SETUP'
75       include 'COMMON.TIME1'
76       include 'COMMON.INTERACT'
77       include 'COMMON.NAMES'
78       include 'COMMON.GEO'
79       include 'COMMON.HEADER'
80       include 'COMMON.CONTROL'
81       include 'COMMON.CONTACTS'
82       include 'COMMON.CHAIN'
83       include 'COMMON.VAR'
84       include 'COMMON.IOUNITS'
85       include 'COMMON.FFIELD'
86       include 'COMMON.REMD'
87       include 'COMMON.MD'
88       include 'COMMON.SBRIDGE'
89       include 'COMMON.ECOMPON'
90       common /srutu/ icall
91       double precision energy(0:n_ene)
92       double precision energy_long(0:n_ene),energy_short(0:n_ene)
93       double precision varia(maxvar)
94       if (indpdb.eq.0) call chainbuild
95 #ifdef MPI
96       time00=MPI_Wtime()
97 #else
98       time00=tcpu()
99 #endif
100       do i=nnt+1,nct-1
101         do j=1,3
102           dc(j,i)=c(j,i+1)-c(j,i)
103         enddo
104       enddo
105       if (nnt.gt.1) then
106         do j=1,3
107           dc(j,1)=dc(j,3)
108           c(j,1)=c(j,2)-dc(j,1)
109         enddo
110       endif
111       if (nct.lt.nres) then
112         do j=1,3
113           dc(j,nres-1)=dc(j,nres-3)
114           c(j,nres)=c(j,nres)+dc(j,nres-1)
115         enddo
116       endif 
117       call cartprint
118       call int_from_cart(.true.,.false.)
119       write (iout,*) "Time for energy evaluation",time_ene
120
121 crc overlap test
122       if (overlapsc) then 
123         print *, 'Calling OVERLAP_SC'
124         call overlap_sc(fail)
125       endif 
126
127       if (searchsc) then 
128         call sc_move(2,nres-1,10,1d10,nft_sc,etot)
129         print *,'SC_move',nft_sc,etot
130         write(iout,*) 'SC_move',nft_sc,etot
131       endif 
132
133       call etotal(energy(0))
134 #ifdef MPI
135       time_ene=MPI_Wtime()-time00
136 #else
137       time_ene=tcpu()-time00
138 #endif
139       if (regular) then
140         call gen_dist_constr
141         call regularize(nct-nnt+1,etot,rms,cref(1,nnt),iretcode)
142         call etotal(energy(0))
143         energy(0)=energy(0)-energy(14)
144         etot=energy(0)
145         call enerprint(energy(0))
146         call intout
147         if (refstr) call rms_nac_nnc(rms,frac,frac_nn,co,.true.)
148         write (iout,'(a,i3)') 'SUMSL return code:',iretcode
149       else if (minim) then
150         print *, 'Calling MINIM_DC'
151 #ifdef MPI
152         time1=MPI_WTIME()
153 #else
154         time1=tcpu()
155 #endif
156         call minim_dc(etot,iretcode,nfun)
157         print *,'SUMSL return code is',iretcode,' eval ',nfun
158 #ifdef MPI
159         evals=nfun/(MPI_WTIME()-time1)
160 #else
161         evals=nfun/(tcpu()-time1)
162 #endif
163         print *,'# eval/s',evals
164         print *,'refstr=',refstr
165         call etotal(energy(0))
166         etot = energy(0)
167         call enerprint(energy(0))
168
169         call intout
170         call briefout(0,etot)
171         if (refstr) call rms_nac_nnc(rms,frac,frac_nn,co,.true.)
172         write (iout,'(a,i3)') 'SUMSL return code:',iretcode
173         write (iout,'(a,i20)') '# of energy evaluations:',nfun+1
174         write (iout,'(a,f16.3)')'# of energy evaluations/sec:',evals
175       else
176         if (refstr) call rms_nac_nnc(rms,frac,frac_nn,co,.true.)
177       endif
178       call enerprint(energy)
179 #define DEBUG
180 #ifdef DEBUG
181 c Check the correctness of energy components
182       evdw=0.0d0
183       etor=0.0d0
184       esccor=0.0d0
185       do i=1,ntyp
186         do j=1,ntyp
187           evdw=evdw+vdwcompon(i,j)
188           etor=etor+torcompon(i,j)
189           esccor=esccor+sccorcompon(i,j)
190         enddo
191       enddo
192       ebe=0.0d0
193       esc=0.0d0
194       evdw2=0.0d0
195       etord=0.0d0
196       do i=1,ntyp
197         ebe=ebe+becompon(i)
198         esc=esc+sccompon(i)
199         evdw2=evdw2+vdw2compon(i)
200         etord=etord+tordcompon(i) 
201       enddo
202       write (iout,'(a8,1pe15.6)') "EVDW",evdw,"EVDW2",EVDW2,"EBEND",ebe,
203      &  "ESCLOC",esc,"ETOR",etor,"ETORD",etord,"ESCCOR",esccor
204 #endif
205 #undef DEBUG
206       if (outpdb) call pdbout(etot,titel(:32),ipdb)
207       if (outmol2) call mol2out(etot,titel(:32))
208       return
209       end
210 c---------------------------------------------------------------------------