Merge branch 'multichain' of mmka:unres into multichain
[unres.git] / source / unres / src_MD-M / unres.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       include 'COMMON.REMD'
29       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  4/25/08 7:29PM by adam'  
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 C
71       if (modecalc.eq.-2) then
72         call test
73         stop
74       else if (modecalc.eq.-1) then
75         write(iout,*) "call check_sc_map next"
76         call check_bond
77         stop
78       endif
79 #ifdef MPI
80       if (fg_rank.gt.0) then
81 C Fine-grain slaves just do energy and gradient components.
82         call ergastulum ! slave workhouse in Latin
83       else
84 #endif
85       if (modecalc.eq.0) then
86         call exec_eeval_or_minim
87       else if (modecalc.eq.1) then
88         call exec_regularize
89       else if (modecalc.eq.2) then
90         call exec_thread
91       else if (modecalc.eq.3 .or. modecalc .eq.6) then
92         call exec_MC
93       else if (modecalc.eq.4) then
94         call exec_mult_eeval_or_minim
95       else if (modecalc.eq.5) then
96         call exec_checkgrad
97       else if (ModeCalc.eq.7) then
98         call exec_map
99       else if (ModeCalc.eq.8) then
100         call exec_CSA
101       else if (modecalc.eq.11) then
102         call exec_softreg
103       else if (modecalc.eq.12) then
104         call exec_MD
105       else if (modecalc.eq.14) then
106         call exec_MREMD
107       else
108         write (iout,'(a)') 'This calculation type is not supported',
109      &   ModeCalc
110       endif
111 #ifdef MPI
112       endif
113 C Finish task.
114       if (fg_rank.eq.0) call finish_task
115 c      call memmon_print_usage()
116 #ifdef TIMING
117        call print_detailed_timing
118 #endif
119       call MPI_Finalize(ierr)
120       stop 'Bye Bye...'
121 #else
122       call dajczas(tcpu(),hrtime,mintime,sectime)
123       stop '********** Program terminated normally.'
124 #endif
125       end
126 c--------------------------------------------------------------------------
127       subroutine exec_MD
128       include 'DIMENSIONS'
129 #ifdef MPI
130       include "mpif.h"
131 #endif
132       include 'COMMON.SETUP'
133       include 'COMMON.CONTROL'
134       include 'COMMON.IOUNITS'
135       if (me.eq.king .or. .not. out1file)
136      &   write (iout,*) "Calling chainbuild"
137       call chainbuild
138       call MD
139       return
140       end
141 c---------------------------------------------------------------------------
142       subroutine exec_MREMD
143       include 'DIMENSIONS'
144 #ifdef MPI
145       include "mpif.h"
146 #endif
147       include 'COMMON.SETUP'
148       include 'COMMON.CONTROL'
149       include 'COMMON.IOUNITS'
150       include 'COMMON.REMD'
151       if (me.eq.king .or. .not. out1file)
152      &   write (iout,*) "Calling chainbuild"
153       call chainbuild
154       if (me.eq.king .or. .not. out1file)
155      &   write (iout,*) "Calling REMD"
156       if (remd_mlist) then 
157         call MREMD
158       else
159         do i=1,nrep
160           remd_m(i)=1
161         enddo
162         call MREMD
163       endif
164       return
165       end
166 c---------------------------------------------------------------------------
167       subroutine exec_eeval_or_minim
168       implicit real*8 (a-h,o-z)
169       include 'DIMENSIONS'
170 #ifdef MPI
171       include 'mpif.h'
172 #endif
173       include 'COMMON.SETUP'
174       include 'COMMON.TIME1'
175       include 'COMMON.INTERACT'
176       include 'COMMON.NAMES'
177       include 'COMMON.GEO'
178       include 'COMMON.HEADER'
179       include 'COMMON.CONTROL'
180       include 'COMMON.CONTACTS'
181       include 'COMMON.CHAIN'
182       include 'COMMON.VAR'
183       include 'COMMON.IOUNITS'
184       include 'COMMON.FFIELD'
185       include 'COMMON.REMD'
186       include 'COMMON.MD'
187       include 'COMMON.SBRIDGE'
188       common /srutu/ icall
189       double precision energy(0:n_ene)
190       double precision energy_long(0:n_ene),energy_short(0:n_ene)
191       double precision varia(maxvar)
192       if (indpdb.eq.0)     call chainbuild
193       time00=MPI_Wtime()
194       print *,'dc',c(1,1)
195       if (indpdb.ne.0) then
196       dc(1,0)=c(1,1)
197       dc(2,0)=c(2,1)
198       dc(3,0)=c(3,1)
199       endif
200       call chainbuild_cart
201       print *,'dc',dc(1,0),dc(2,0),dc(3,0)
202       if (split_ene) then
203        print *,"Processor",myrank," after chainbuild"
204        icall=1
205        call etotal_long(energy_long(0))
206        write (iout,*) "Printing long range energy"
207        call enerprint(energy_long(0))
208        call etotal_short(energy_short(0))
209        write (iout,*) "Printing short range energy"
210        call enerprint(energy_short(0))
211        do i=0,n_ene
212          energy(i)=energy_long(i)+energy_short(i)
213          write (iout,*) i,energy_long(i),energy_short(i),energy(i)
214        enddo
215        write (iout,*) "Printing long+short range energy"
216        call enerprint(energy(0))
217       endif
218       call etotal(energy(0))
219       time_ene=MPI_Wtime()-time00
220       write (iout,*) "Time for energy evaluation",time_ene
221       print *,"after etotal"
222       etota = energy(0)
223       etot =etota
224       call enerprint(energy(0))
225       call hairpin(.true.,nharp,iharp)
226         print *,'after hairpin'
227       call secondary2(.true.)
228         print *,'after secondary'
229       if (minim) then
230 crc overlap test
231         if (overlapsc) then 
232           print *, 'Calling OVERLAP_SC'
233           call overlap_sc(fail)
234         endif 
235
236         if (searchsc) then 
237           call sc_move(2,nres-1,10,1d10,nft_sc,etot)
238           print *,'SC_move',nft_sc,etot
239           write(iout,*) 'SC_move',nft_sc,etot
240         endif 
241
242         if (dccart) then
243           print *, 'Calling MINIM_DC'
244           time1=MPI_WTIME()
245           call minim_dc(etot,iretcode,nfun)
246         else
247           if (indpdb.ne.0) then 
248             call bond_regular
249             call chainbuild
250           endif
251           call geom_to_var(nvar,varia)
252           print *,'Calling MINIMIZE.'
253           time1=MPI_WTIME()
254           call minimize(etot,varia,iretcode,nfun)
255         endif
256         print *,'SUMSL return code is',iretcode,' eval ',nfun
257         evals=nfun/(MPI_WTIME()-time1)
258         print *,'# eval/s',evals
259         print *,'refstr=',refstr
260         call hairpin(.false.,nharp,iharp)
261         print *,'after hairpin'
262         call secondary2(.true.)
263         print *,'after secondary'
264         call etotal(energy(0))
265         etot = energy(0)
266         call enerprint(energy(0))
267
268         call intout
269         call briefout(0,etot)
270         if (refstr) call rms_nac_nnc(rms,frac,frac_nn,co,.true.)
271           write (iout,'(a,i3)') 'SUMSL return code:',iretcode
272           write (iout,'(a,i20)') '# of energy evaluations:',nfun+1
273           write (iout,'(a,f16.3)')'# of energy evaluations/sec:',evals
274       else
275         print *,'refstr=',refstr
276         if (refstr) call rms_nac_nnc(rms,frac,frac_nn,co,.true.)
277         call briefout(0,etot)
278       endif
279       if (outpdb) call pdbout(etot,titel(:32),ipdb)
280       if (outmol2) call mol2out(etot,titel(:32))
281       return
282       end
283 c---------------------------------------------------------------------------
284       subroutine exec_regularize
285       implicit real*8 (a-h,o-z)
286       include 'DIMENSIONS'
287 #ifdef MPI
288       include 'mpif.h'
289 #endif
290       include 'COMMON.SETUP'
291       include 'COMMON.TIME1'
292       include 'COMMON.INTERACT'
293       include 'COMMON.NAMES'
294       include 'COMMON.GEO'
295       include 'COMMON.HEADER'
296       include 'COMMON.CONTROL'
297       include 'COMMON.CONTACTS'
298       include 'COMMON.CHAIN'
299       include 'COMMON.VAR'
300       include 'COMMON.IOUNITS'
301       include 'COMMON.FFIELD'
302       include 'COMMON.REMD'
303       include 'COMMON.MD'
304       include 'COMMON.SBRIDGE'
305       double precision energy(0:n_ene)
306
307       call gen_dist_constr
308       call sc_conf
309       call intout
310       call regularize(nct-nnt+1,etot,rms,cref(1,nnt,1),iretcode)
311       call etotal(energy(0))
312       energy(0)=energy(0)-energy(14)
313       etot=energy(0)
314       call enerprint(energy(0))
315       call intout
316       call briefout(0,etot)
317       if (outpdb) call pdbout(etot,titel(:32),ipdb)
318       if (outmol2) call mol2out(etot,titel(:32))
319       if (refstr) call rms_nac_nnc(rms,frac,frac_nn,co,.true.)
320       write (iout,'(a,i3)') 'SUMSL return code:',iretcode
321       return
322       end
323 c---------------------------------------------------------------------------
324       subroutine exec_thread
325       include 'DIMENSIONS'
326 #ifdef MP
327       include "mpif.h"
328 #endif
329       include "COMMON.SETUP"
330       call thread_seq
331       return
332       end
333 c---------------------------------------------------------------------------
334       subroutine exec_MC
335       implicit real*8 (a-h,o-z)
336       include 'DIMENSIONS'
337       character*10 nodeinfo
338       double precision varia(maxvar)
339 #ifdef MPI
340       include "mpif.h"
341 #endif
342       include "COMMON.SETUP"
343       include 'COMMON.CONTROL'
344       call mcm_setup
345       if (minim) then
346 #ifdef MPI
347         if (modecalc.eq.3) then
348           call do_mcm(ipar)
349         else
350           call entmcm
351         endif
352 #else
353         if (modecalc.eq.3) then
354           call do_mcm(ipar)
355         else
356           call entmcm
357         endif
358 #endif
359       else
360         call monte_carlo
361       endif
362       return
363       end
364 c---------------------------------------------------------------------------
365       subroutine exec_mult_eeval_or_minim
366       implicit real*8 (a-h,o-z)
367       include 'DIMENSIONS'
368 #ifdef MPI
369       include 'mpif.h'
370       dimension muster(mpi_status_size)
371 #endif
372       include 'COMMON.SETUP'
373       include 'COMMON.TIME1'
374       include 'COMMON.INTERACT'
375       include 'COMMON.NAMES'
376       include 'COMMON.GEO'
377       include 'COMMON.HEADER'
378       include 'COMMON.CONTROL'
379       include 'COMMON.CONTACTS'
380       include 'COMMON.CHAIN'
381       include 'COMMON.VAR'
382       include 'COMMON.IOUNITS'
383       include 'COMMON.FFIELD'
384       include 'COMMON.REMD'
385       include 'COMMON.MD'
386       include 'COMMON.SBRIDGE'
387       double precision varia(maxvar)
388       dimension ind(6)
389       double precision energy(0:max_ene)
390       logical eof
391       eof=.false.
392 #ifdef MPI
393       if(me.ne.king) then
394         call minim_mcmf
395         return
396       endif
397
398       close (intin)
399       open(intin,file=intinname,status='old')
400       write (istat,'(a5,20a12)')"#    ",
401      &  (wname(print_order(i)),i=1,nprint_ene)
402       if (refstr) then
403         write (istat,'(a5,20a12)')"#    ",
404      &   (ename(print_order(i)),i=1,nprint_ene),
405      &   "ETOT total","RMSD","nat.contact","nnt.contact"        
406       else
407         write (istat,'(a5,20a12)')"#    ",
408      &    (ename(print_order(i)),i=1,nprint_ene),"ETOT total"
409       endif
410
411       if (.not.minim) then
412         do while (.not. eof)
413           if (read_cart) then
414             read (intin,'(e15.10,e15.5)',end=1100,err=1100) time,ene
415             call read_x(intin,*11)
416 #ifdef MPI
417 c Broadcast the order to compute internal coordinates to the slaves.
418             if (nfgtasks.gt.1)
419      &        call MPI_Bcast(6,1,MPI_INTEGER,king,FG_COMM,IERROR)
420 #endif
421             call int_from_cart1(.false.)
422           else
423             read (intin,'(i5)',end=1100,err=1100) iconf
424             call read_angles(intin,*11)
425             call geom_to_var(nvar,varia)
426             call chainbuild
427           endif
428           write (iout,'(a,i7)') 'Conformation #',iconf
429           call etotal(energy(0))
430           call briefout(iconf,energy(0))
431           call enerprint(energy(0))
432           etot=energy(0)
433           if (refstr) then 
434             call rms_nac_nnc(rms,frac,frac_nn,co,.true.)
435             write (istat,'(i5,20(f12.3))') iconf,
436      &      (energy(print_order(i)),i=1,nprint_ene),etot,
437      &       rms,frac,frac_nn,co
438 cjlee end
439           else
440             write (istat,'(i5,16(f12.3))') iconf,
441      &     (energy(print_order(i)),i=1,nprint_ene),etot
442           endif
443         enddo
444 1100    continue
445         goto 1101
446       endif
447
448       mm=0
449       imm=0
450       nft=0
451       ene0=0.0d0
452       n=0
453       iconf=0
454 c      do n=1,nzsc
455       do while (.not. eof)
456         mm=mm+1
457         if (mm.lt.nodes) then
458           if (read_cart) then
459             read (intin,'(e15.10,e15.5)',end=11,err=11) time,ene
460             call read_x(intin,*11)
461 #ifdef MPI
462 c Broadcast the order to compute internal coordinates to the slaves.
463             if (nfgtasks.gt.1) 
464      &        call MPI_Bcast(6,1,MPI_INTEGER,king,FG_COMM,IERROR)
465 #endif
466             call int_from_cart1(.false.)
467           else
468             read (intin,'(i5)',end=11,err=11) iconf
469             call read_angles(intin,*11)
470             call geom_to_var(nvar,varia)
471             call chainbuild
472           endif
473           write (iout,'(a,i7)') 'Conformation #',iconf
474           n=n+1
475          imm=imm+1
476          ind(1)=1
477          ind(2)=n
478          ind(3)=0
479          ind(4)=0
480          ind(5)=0
481          ind(6)=0
482          ene0=0.0d0
483          call mpi_send(ind,6,mpi_integer,mm,idint,CG_COMM,
484      *                  ierr)
485          call mpi_send(varia,nvar,mpi_double_precision,mm,
486      *                  idreal,CG_COMM,ierr)
487          call mpi_send(ene0,1,mpi_double_precision,mm,
488      *                  idreal,CG_COMM,ierr)
489 c         print *,'task ',n,' sent to worker ',mm,nvar
490         else
491          call mpi_recv(ind,6,mpi_integer,mpi_any_source,idint,
492      *                 CG_COMM,muster,ierr)
493          man=muster(mpi_source)
494 c         print *,'receiving result from worker ',man,' (',iii1,iii,')'
495          call mpi_recv(varia,nvar,mpi_double_precision, 
496      *               man,idreal,CG_COMM,muster,ierr)
497          call mpi_recv(ene,1,
498      *               mpi_double_precision,man,idreal,
499      *               CG_COMM,muster,ierr)
500          call mpi_recv(ene0,1,
501      *               mpi_double_precision,man,idreal,
502      *               CG_COMM,muster,ierr)
503 c         print *,'result received from worker ',man,' sending now'
504
505           call var_to_geom(nvar,varia)
506           call chainbuild
507           call etotal(energy(0))
508           iconf=ind(2)
509           write (iout,*)
510           write (iout,*)
511           write (iout,'(a,2i7)') 'Conformation #',iconf,ind(5)
512
513           etot=energy(0)
514           call enerprint(energy(0))
515           call briefout(it,etot)
516 c          if (minim) call briefout(it,etot)
517           if (refstr) then 
518             call rms_nac_nnc(rms,frac,frac_nn,co,.true.)
519             write (istat,'(i5,19(f12.3))') iconf,
520      &     (energy(print_order(i)),i=1,nprint_ene),etot,
521      &     rms,frac,frac_nn,co
522           else
523             write (istat,'(i5,15(f12.3))') iconf,
524      &     (energy(print_order(i)),i=1,nprint_ene),etot
525           endif
526
527           imm=imm-1
528           if (read_cart) then
529             read (intin,'(e15.10,e15.5)',end=1101,err=1101) time,ene
530             call read_x(intin,*11)
531 #ifdef MPI
532 c Broadcast the order to compute internal coordinates to the slaves.
533             if (nfgtasks.gt.1)
534      &        call MPI_Bcast(6,1,MPI_INTEGER,king,FG_COMM,IERROR)
535 #endif
536             call int_from_cart1(.false.)
537           else
538             read (intin,'(i5)',end=1101,err=1101) iconf
539             call read_angles(intin,*11)
540             call geom_to_var(nvar,varia)
541             call chainbuild
542           endif
543           n=n+1
544           imm=imm+1
545           ind(1)=1
546           ind(2)=n
547           ind(3)=0
548           ind(4)=0
549           ind(5)=0
550           ind(6)=0
551           call mpi_send(ind,6,mpi_integer,man,idint,CG_COMM,
552      *                  ierr)
553           call mpi_send(varia,nvar,mpi_double_precision,man, 
554      *                  idreal,CG_COMM,ierr)
555           call mpi_send(ene0,1,mpi_double_precision,man,
556      *                  idreal,CG_COMM,ierr)
557           nf_mcmf=nf_mcmf+ind(4)
558           nmin=nmin+1
559         endif
560       enddo
561 11    continue
562       do j=1,imm
563         call mpi_recv(ind,6,mpi_integer,mpi_any_source,idint,
564      *               CG_COMM,muster,ierr)
565         man=muster(mpi_source)
566         call mpi_recv(varia,nvar,mpi_double_precision, 
567      *               man,idreal,CG_COMM,muster,ierr)
568         call mpi_recv(ene,1,
569      *               mpi_double_precision,man,idreal,
570      *               CG_COMM,muster,ierr)
571         call mpi_recv(ene0,1,
572      *               mpi_double_precision,man,idreal,
573      *               CG_COMM,muster,ierr)
574
575         call var_to_geom(nvar,varia)
576         call chainbuild
577         call etotal(energy(0))
578         iconf=ind(2)
579         write (iout,*)
580         write (iout,*)
581         write (iout,'(a,2i7)') 'Conformation #',iconf,ind(5)
582
583         etot=energy(0)
584         call enerprint(energy(0))
585         call briefout(it,etot)
586         if (refstr) then 
587           call rms_nac_nnc(rms,frac,frac_nn,co,.true.)
588           write (istat,'(i5,19(f12.3))') iconf,
589      &   (energy(print_order(i)),i=1,nprint_ene),etot,
590      &   rms,frac,frac_nn,co
591         else
592           write (istat,'(i5,15(f12.3))') iconf,
593      &    (energy(print_order(i)),i=1,nprint_ene),etot
594         endif
595         nmin=nmin+1
596       enddo
597 1101  continue
598       do i=1, nodes-1
599          ind(1)=0
600          ind(2)=0
601          ind(3)=0
602          ind(4)=0
603          ind(5)=0
604          ind(6)=0
605          call mpi_send(ind,6,mpi_integer,i,idint,CG_COMM,
606      *                  ierr)
607       enddo
608 #else
609       close (intin)
610       open(intin,file=intinname,status='old')
611       write (istat,'(a5,20a12)')"#    ",
612      &   (wname(print_order(i)),i=1,nprint_ene)
613       write (istat,'("#    ",20(1pe12.4))')
614      &   (weights(print_order(i)),i=1,nprint_ene)
615       if (refstr) then
616         write (istat,'(a5,20a12)')"#    ",
617      &   (ename(print_order(i)),i=1,nprint_ene),
618      &   "ETOT total","RMSD","nat.contact","nnt.contact"
619       else
620         write (istat,'(a5,14a12)')"#    ",
621      &   (ename(print_order(i)),i=1,nprint_ene),"ETOT total"
622       endif
623       do while (.not. eof)
624           if (read_cart) then
625             read (intin,'(e15.10,e15.5)',end=1100,err=1100) time,ene
626             call read_x(intin,*11)
627 #ifdef MPI
628 c Broadcast the order to compute internal coordinates to the slaves.
629             if (nfgtasks.gt.1)
630      &        call MPI_Bcast(6,1,MPI_INTEGER,king,FG_COMM,IERROR)
631 #endif
632             call int_from_cart1(.false.)
633           else
634             read (intin,'(i5)',end=1100,err=1100) iconf
635             call read_angles(intin,*11)
636             call geom_to_var(nvar,varia)
637             call chainbuild
638           endif
639         write (iout,'(a,i7)') 'Conformation #',iconf
640         if (minim) call minimize(etot,varia,iretcode,nfun)
641         call etotal(energy(0))
642
643         etot=energy(0)
644         call enerprint(energy(0))
645         if (minim) call briefout(it,etot) 
646         if (refstr) then 
647           call rms_nac_nnc(rms,frac,frac_nn,co,.true.)
648           write (istat,'(i5,18(f12.3))') iconf,
649      &   (energy(print_order(i)),i=1,nprint_ene),
650      &   etot,rms,frac,frac_nn,co
651 cjlee end
652         else
653           write (istat,'(i5,14(f12.3))') iconf,
654      &   (energy(print_order(i)),i=1,nprint_ene),etot
655         endif
656       enddo
657    11 continue
658 #endif
659       return
660       end
661 c---------------------------------------------------------------------------
662       subroutine exec_checkgrad
663       implicit real*8 (a-h,o-z)
664       include 'DIMENSIONS'
665 #ifdef MPI
666       include 'mpif.h'
667 #endif
668       include 'COMMON.SETUP'
669       include 'COMMON.TIME1'
670       include 'COMMON.INTERACT'
671       include 'COMMON.NAMES'
672       include 'COMMON.GEO'
673       include 'COMMON.HEADER'
674       include 'COMMON.CONTROL'
675       include 'COMMON.CONTACTS'
676       include 'COMMON.CHAIN'
677       include 'COMMON.VAR'
678       include 'COMMON.IOUNITS'
679       include 'COMMON.FFIELD'
680       include 'COMMON.REMD'
681       include 'COMMON.MD'
682       include 'COMMON.SBRIDGE'
683       common /srutu/ icall
684       double precision energy(0:max_ene)
685 c      do i=2,nres
686 c        vbld(i)=vbld(i)+ran_number(-0.1d0,0.1d0)
687 c        if (itype(i).ne.10) 
688 c     &      vbld(i+nres)=vbld(i+nres)+ran_number(-0.001d0,0.001d0)
689 c      enddo
690       if (indpdb.eq.0) call chainbuild
691 c      do i=0,nres
692 c        do j=1,3
693 c          dc(j,i)=dc(j,i)+ran_number(-0.2d0,0.2d0)
694 c        enddo
695 c      enddo
696 c      do i=1,nres-1
697 c        if (itype(i).ne.10) then
698 c          do j=1,3
699 c            dc(j,i+nres)=dc(j,i+nres)+ran_number(-0.2d0,0.2d0)
700 c          enddo
701 c        endif
702 c      enddo
703 c      do j=1,3
704 c        dc(j,0)=ran_number(-0.2d0,0.2d0)
705 c      enddo
706       usampl=.true.
707       totT=1.d0
708       eq_time=0.0d0
709       call read_fragments
710       call chainbuild_cart
711       call cartprint
712       call intout
713       icall=1
714       call etotal(energy(0))
715       etot = energy(0)
716       call enerprint(energy(0))
717       write (iout,*) "Uconst",Uconst," Uconst_back",uconst_back
718       print *,'icheckgrad=',icheckgrad
719       goto (10,20,30) icheckgrad
720   10  call check_ecartint
721       return
722   20  call check_cartgrad
723       return
724   30  call check_eint
725       return
726       end
727 c---------------------------------------------------------------------------
728       subroutine exec_map
729 C Energy maps
730       call map_read
731       call map
732       return
733       end
734 c---------------------------------------------------------------------------
735       subroutine exec_CSA
736 #ifdef MPI
737       include "mpif.h"
738 #endif
739       include 'DIMENSIONS'
740       include 'COMMON.IOUNITS'
741 C Conformational Space Annealling programmed by Jooyoung Lee.
742 C This method works only with parallel machines!
743 #ifdef MPI
744       call together
745 #else
746       write (iout,*) "CSA works on parallel machines only"
747 #endif
748       return
749       end
750 c---------------------------------------------------------------------------
751       subroutine exec_softreg
752       include 'DIMENSIONS'
753       include 'COMMON.IOUNITS'
754       include 'COMMON.CONTROL'
755       double precision energy(0:max_ene)
756       call chainbuild
757       call etotal(energy(0))
758       call enerprint(energy(0))
759       if (.not.lsecondary) then
760         write(iout,*) 'Calling secondary structure recognition'
761         call secondary2(debug)
762       else
763         write(iout,*) 'Using secondary structure supplied in pdb'
764       endif
765
766       call softreg
767
768       call etotal(energy(0))
769       etot=energy(0)
770       call enerprint(energy(0))
771       call intout
772       call briefout(0,etot)
773       call secondary2(.true.)
774       if (refstr) call rms_nac_nnc(rms,frac,frac_nn,co,.true.)
775       return
776       end