Merge branch 'bartek' of mmka.chem.univ.gda.pl:unres into bartek
[unres.git] / source / unres / src_MIN / unres_min.F
1 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
2 C                                                                              C
3 C                                U N R E S                                     C
4 C                                                                              C
5 C Program to carry out conformational search of proteins in an united-residue  C
6 C approximation.                                                               C
7 C                                                                              C
8 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
9       implicit real*8 (a-h,o-z)
10       include 'DIMENSIONS'
11
12
13 #ifdef MPI
14       include 'mpif.h'
15       include 'COMMON.SETUP'
16 #endif
17       include 'COMMON.TIME1'
18       include 'COMMON.INTERACT'
19       include 'COMMON.NAMES'
20       include 'COMMON.GEO'
21       include 'COMMON.HEADER'
22       include 'COMMON.CONTROL'
23       include 'COMMON.CONTACTS'
24       include 'COMMON.CHAIN'
25       include 'COMMON.VAR'
26       include 'COMMON.IOUNITS'
27       include 'COMMON.FFIELD'
28 c      include 'COMMON.REMD'
29 c      include 'COMMON.MD'
30       include 'COMMON.SBRIDGE'
31       double precision hrtime,mintime,sectime
32       character*64 text_mode_calc(-2:14) /'test',
33      & 'SC rotamer distribution',
34      & 'Energy evaluation or minimization',
35      & 'Regularization of PDB structure',
36      & 'Threading of a sequence on PDB structures',
37      & 'Monte Carlo (with minimization) ',
38      & 'Energy minimization of multiple conformations',
39      & 'Checking energy gradient',
40      & 'Entropic sampling Monte Carlo (with minimization)',
41      & 'Energy map',
42      & 'CSA calculations',
43      & 'Not used 9',
44      & 'Not used 10',
45      & 'Soft regularization of PDB structure',
46      & 'Mesoscopic molecular dynamics (MD) ',
47      & 'Not used 13',
48      & 'Replica exchange molecular dynamics (REMD)'/
49       external ilen
50
51 c      call memmon_print_usage()
52
53       call init_task
54       if (me.eq.king)
55      & write(iout,*)'### LAST MODIFIED  11/03/09 1:19PM by czarek'  
56       if (me.eq.king) call cinfo
57 C Read force field parameters and job setup data
58       call readrtns
59       call flush(iout)
60 C
61       if (me.eq.king .or. .not. out1file) then
62        write (iout,'(2a/)') 
63      & text_mode_calc(modecalc)(:ilen(text_mode_calc(modecalc))),
64      & ' calculation.' 
65        if (minim) write (iout,'(a)') 
66      &  'Conformations will be energy-minimized.'
67        write (iout,'(80(1h*)/)') 
68       endif
69       call flush(iout)
70 #ifdef MPI
71       if (fg_rank.gt.0) then
72 C Fine-grain slaves just do energy and gradient components.
73         call ergastulum ! slave workhouse in Latin
74       else
75 #endif
76       if (modecalc.eq.0) then
77         call exec_eeval_or_minim
78       else if (modecalc.eq.5) then
79          call exec_checkgrad
80       else
81         write (iout,'(a)') 'This calculation type is not supported',
82      &   ModeCalc
83       endif
84 #ifdef MPI
85       endif
86 C Finish task.
87       if (fg_rank.eq.0) call finish_task
88 c      call memmon_print_usage()
89 #ifdef TIMING
90        call print_detailed_timing
91 #endif
92       call MPI_Finalize(ierr)
93       stop 'Bye Bye...'
94 #else
95       call dajczas(tcpu(),hrtime,mintime,sectime)
96       stop '********** Program terminated normally.'
97 #endif
98       end
99 c---------------------------------------------------------------------------
100       subroutine exec_eeval_or_minim
101       implicit real*8 (a-h,o-z)
102       include 'DIMENSIONS'
103 #ifdef MPI
104       include 'mpif.h'
105 #endif
106       include 'COMMON.SETUP'
107       include 'COMMON.TIME1'
108       include 'COMMON.INTERACT'
109       include 'COMMON.NAMES'
110       include 'COMMON.GEO'
111       include 'COMMON.HEADER'
112       include 'COMMON.CONTROL'
113       include 'COMMON.CONTACTS'
114       include 'COMMON.CHAIN'
115       include 'COMMON.VAR'
116       include 'COMMON.IOUNITS'
117       include 'COMMON.FFIELD'
118       include 'COMMON.SBRIDGE'
119       common /srutu/ icall
120       double precision energy(0:n_ene),varia(maxvar)
121       double precision energy_long(0:n_ene),energy_short(0:n_ene)
122       if (indpdb.eq.0) call chainbuild
123 #ifdef MPI
124       time00=MPI_Wtime()
125 #else
126       time00=tcpu()
127 #endif
128       call chainbuild_cart
129       call etotal(energy(0))
130 #ifdef MPI
131       time_ene=MPI_Wtime()-time00
132 #else
133       time_ene=tcpu()
134 #endif
135       write (iout,*) "Time for energy evaluation",time_ene
136       print *,"after etotal"
137       etota = energy(0)
138       etot =etota
139       call enerprint(energy(0))
140 c      call hairpin(.true.,nharp,iharp)
141 c      call secondary2(.true.)
142       if (minim) then
143
144         if (dccart) then
145           print *, 'Calling MINIM_DC'
146 #ifdef MPI
147           time1=MPI_WTIME()
148 #else
149           time1=tcpu()
150 #endif
151           call minim_dc(etot,iretcode,nfun)
152         else
153           if (indpdb.ne.0) then 
154             call bond_regular
155             call chainbuild
156           endif
157           call geom_to_var(nvar,varia)
158           print *,'Calling MINIMIZE.'
159 #ifdef MPI
160           time1=MPI_WTIME()
161 #else
162           time1=tcpu()
163 #endif
164           call minimize(etot,varia,iretcode,nfun)
165         endif
166         print *,'SUMSL return code is',iretcode,' eval ',nfun
167 #ifdef MPI
168         evals=nfun/(MPI_WTIME()-time1)
169 #else
170         evals=nfun/(tcpu()-time1)
171 #endif
172         print *,'# eval/s',evals
173         print *,'refstr=',refstr
174 c        call hairpin(.true.,nharp,iharp)
175 c        call secondary2(.true.)
176         call etotal(energy(0))
177         etot = energy(0)
178         call enerprint(energy(0))
179
180         call intout
181         call briefout(0,etot)
182 c        if (refstr) call rms_nac_nnc(rms,frac,frac_nn,co,.true.)
183           write (iout,'(a,i3)') 'SUMSL return code:',iretcode
184           write (iout,'(a,i20)') '# of energy evaluations:',nfun+1
185           write (iout,'(a,f16.3)')'# of energy evaluations/sec:',evals
186 c      else
187 c        print *,'refstr=',refstr
188 c        if (refstr) call rms_nac_nnc(rms,frac,frac_nn,co,.true.)
189 c        call briefout(0,etot)
190       endif
191       if (outpdb) call pdbout(etot,titel(:32),ipdb)
192       if (outmol2) call mol2out(etot,titel(:32))
193       return
194       end
195
196       subroutine exec_checkgrad
197       implicit real*8 (a-h,o-z)
198       include 'DIMENSIONS'
199 #ifdef MPI
200       include 'mpif.h'
201 #endif
202       include 'COMMON.SETUP'
203       include 'COMMON.TIME1'
204       include 'COMMON.INTERACT'
205       include 'COMMON.NAMES'
206       include 'COMMON.GEO'
207       include 'COMMON.HEADER'
208       include 'COMMON.CONTROL'
209       include 'COMMON.CONTACTS'
210       include 'COMMON.CHAIN'
211       include 'COMMON.VAR'
212       include 'COMMON.IOUNITS'
213       include 'COMMON.FFIELD'
214 c      include 'COMMON.REMD'
215       include 'COMMON.MD_'
216       include 'COMMON.SBRIDGE'
217       common /srutu/ icall
218       double precision energy(0:max_ene)
219 c      do i=2,nres
220 c        vbld(i)=vbld(i)+ran_number(-0.1d0,0.1d0)
221 c        if (itype(i).ne.10) 
222 c     &      vbld(i+nres)=vbld(i+nres)+ran_number(-0.001d0,0.001d0)
223 c      enddo
224       if (indpdb.eq.0) call chainbuild
225 c      do i=0,nres
226 c        do j=1,3
227 c          dc(j,i)=dc(j,i)+ran_number(-0.2d0,0.2d0)
228 c        enddo
229 c      enddo
230 c      do i=1,nres-1
231 c        if (itype(i).ne.10) then
232 c          do j=1,3
233 c            dc(j,i+nres)=dc(j,i+nres)+ran_number(-0.2d0,0.2d0)
234 c          enddo
235 c        endif
236 c      enddo
237 c      do j=1,3
238 c        dc(j,0)=ran_number(-0.2d0,0.2d0)
239 c      enddo
240       usampl=.true.
241       totT=1.d0
242       eq_time=0.0d0
243 c      call read_fragments
244       call chainbuild_cart
245       call cartprint
246       call intout
247       icall=1
248       call etotal(energy(0))
249       etot = energy(0)
250       call enerprint(energy(0))
251       write (iout,*) "Uconst",Uconst," Uconst_back",uconst_back
252       print *,'icheckgrad=',icheckgrad
253       goto (10,20,30) icheckgrad
254   10  call check_ecartint
255       return
256   20  call check_cartgrad
257       return
258   30  call check_eint
259       return
260       end