Merge branch 'lipid' into AFM
[unres.git] / source / wham / src-M / initialize_p.F
1       subroutine initialize
2
3 C Define constants and zero out tables.
4 C
5       implicit real*8 (a-h,o-z)
6       include 'DIMENSIONS'
7       include 'DIMENSIONS.ZSCOPT'
8 #ifdef MPI
9       include 'mpif.h'
10 #endif
11       include 'COMMON.IOUNITS'
12       include 'COMMON.CHAIN'
13       include 'COMMON.INTERACT'
14       include 'COMMON.GEO'
15       include 'COMMON.LOCAL'
16       include 'COMMON.TORSION'
17       include 'COMMON.FFIELD'
18       include 'COMMON.SBRIDGE'
19       include 'COMMON.MINIM' 
20       include 'COMMON.DERIV'
21       include "COMMON.WEIGHTS"
22       include "COMMON.NAMES"
23       include "COMMON.TIME1"
24 C
25 C The following is just to define auxiliary variables used in angle conversion
26 C
27       pi=4.0D0*datan(1.0D0)
28       dwapi=2.0D0*pi
29       dwapi3=dwapi/3.0D0
30       pipol=0.5D0*pi
31       deg2rad=pi/180.0D0
32       rad2deg=1.0D0/deg2rad
33       angmin=10.0D0*deg2rad
34 C
35 C Define I/O units.
36 C
37       inp=    1
38       iout=   2
39       ipdbin= 3
40       ipdb=   7
41       imol2=  4
42       igeom=  8
43       intin=  9
44       ithep= 11
45       irotam=12
46       itorp= 13
47       itordp= 23
48       ielep= 14
49       isidep=15 
50       isidep1=22
51       iscpp=25
52       icbase=16
53       ifourier=20
54       istat= 17
55       ientin=18
56       ientout=19
57       ibond=28
58       isccor=29
59 C
60 C WHAM files
61 C
62       ihist=30
63       iweight=31
64       izsc=32
65 C Lipidic input file for parameters range 60-79
66       iliptranpar=60
67 C
68 C Set default weights of the energy terms.
69 C
70       wlong=1.0D0
71       welec=1.0D0
72       wtor =1.0D0
73       wang =1.0D0
74       wscloc=1.0D0
75       wstrain=1.0D0
76 C
77 C Zero out tables.
78 C
79       ndih_constr=0
80       do i=1,maxres2
81         do j=1,3
82           c(j,i)=0.0D0
83           dc(j,i)=0.0D0
84         enddo
85       enddo
86       do i=1,maxres
87         do j=1,3
88           xloc(j,i)=0.0D0
89         enddo
90       enddo
91       do i=1,ntyp
92         do j=1,ntyp
93           aa_lip(i,j)=0.0D0
94           bb_lip(i,j)=0.0D0
95           aa_aq(i,j)=0.0D0
96           bb_aq(i,j)=0.0D0
97           augm(i,j)=0.0D0
98           sigma(i,j)=0.0D0
99           r0(i,j)=0.0D0
100           chi(i,j)=0.0D0
101         enddo
102         do j=1,2
103           bad(i,j)=0.0D0
104         enddo
105         chip(i)=0.0D0
106         alp(i)=0.0D0
107         sigma0(i)=0.0D0
108         sigii(i)=0.0D0
109         rr0(i)=0.0D0
110         a0thet(i)=0.0D0
111         do j=1,2
112          do ichir1=-1,1
113           do ichir2=-1,1
114           athet(j,i,ichir1,ichir2)=0.0D0
115           bthet(j,i,ichir1,ichir2)=0.0D0
116           enddo
117          enddo
118         enddo
119         do j=0,3
120           polthet(j,i)=0.0D0
121         enddo
122         do j=1,3
123           gthet(j,i)=0.0D0
124         enddo
125         theta0(i)=0.0D0
126         sig0(i)=0.0D0
127         sigc0(i)=0.0D0
128         do j=1,maxlob
129           bsc(j,i)=0.0D0
130           do k=1,3
131             censc(k,j,i)=0.0D0
132           enddo
133           do k=1,3
134             do l=1,3
135               gaussc(l,k,j,i)=0.0D0
136             enddo
137           enddo
138           nlob(i)=0
139         enddo
140       enddo
141       nlob(ntyp1)=0
142       dsc(ntyp1)=0.0D0
143       do i=-maxtor,maxtor
144         itortyp(i)=0
145        do iblock=1,2
146         do j=-maxtor,maxtor
147           do k=1,maxterm
148             v1(k,j,i,iblock)=0.0D0
149             v2(k,j,i,iblock)=0.0D0
150           enddo
151         enddo
152         enddo
153       enddo
154       do iblock=1,2
155        do i=-maxtor,maxtor
156         do j=-maxtor,maxtor
157          do k=-maxtor,maxtor
158           do l=1,maxtermd_1
159             v1c(1,l,i,j,k,iblock)=0.0D0
160             v1s(1,l,i,j,k,iblock)=0.0D0
161             v1c(2,l,i,j,k,iblock)=0.0D0
162             v1s(2,l,i,j,k,iblock)=0.0D0
163           enddo !l
164           do l=1,maxtermd_2
165            do m=1,maxtermd_2
166             v2c(m,l,i,j,k,iblock)=0.0D0
167             v2s(m,l,i,j,k,iblock)=0.0D0
168            enddo !m
169           enddo !l
170         enddo !k
171        enddo !j
172       enddo !i
173       enddo !iblock
174       do i=1,maxres
175         itype(i)=0
176         itel(i)=0
177       enddo
178 C Initialize the bridge arrays
179       ns=0
180       nss=0 
181       nhpb=0
182       do i=1,maxss
183         iss(i)=0
184       enddo
185       do i=1,maxdim
186         dhpb(i)=0.0D0
187       enddo
188       do i=1,maxres
189         ihpb(i)=0
190         jhpb(i)=0
191         dyn_ss_mask(i)=.false.
192       enddo
193 C
194 C Initialize timing.
195 C
196       call set_timers
197 C
198 C Initialize variables used in minimization.
199 C   
200 c     maxfun=5000
201 c     maxit=2000
202       maxfun=500
203       maxit=200
204       tolf=1.0D-2
205       rtolf=5.0D-4
206
207 C Initialize the variables responsible for the mode of gradient storage.
208 C
209       nfl=0
210       icg=1
211       do i=1,14
212         do j=1,14
213           if (print_order(i).eq.j) then
214             iw(print_order(i))=j
215             goto 1121
216           endif
217         enddo
218 1121    continue
219       enddo
220       calc_grad=.false.
221 C Set timers and counters for the respective routines
222       t_func = 0.0d0
223       t_grad = 0.0d0
224       t_fhel = 0.0d0
225       t_fbet = 0.0d0
226       t_ghel = 0.0d0
227       t_gbet = 0.0d0
228       t_viol = 0.0d0
229       t_gviol = 0.0d0
230       n_func = 0
231       n_grad = 0
232       n_fhel = 0
233       n_fbet = 0
234       n_ghel = 0
235       n_gbet = 0
236       n_viol = 0
237       n_gviol = 0
238       n_map = 0
239 #ifndef SPLITELE
240       nprint_ene=nprint_ene-1
241 #endif
242       return
243       end
244 c-------------------------------------------------------------------------
245       block data nazwy
246       implicit real*8 (a-h,o-z)
247       include 'DIMENSIONS'
248       include 'DIMENSIONS.ZSCOPT'
249       include 'COMMON.NAMES'
250       include 'COMMON.WEIGHTS'
251       include 'COMMON.FFIELD'
252       data restyp /
253      &'DD','DAU','DAI','DDB','DSM','DPR','DLY','DAR','DHI','DAS','DGL',
254      & 'DSG','DGN','DSN','DTH',
255      &'DYY','DAL','DTY','DTR','DVA','DLE','DIL','DPN','MED','DCY','ZER',
256      &'CYS','MET','PHE','ILE','LEU','VAL','TRP','TYR','ALA','GLY','THR',
257      &'SER','GLN','ASN','GLU','ASP','HIS','ARG','LYS','PRO','SME','DBZ',
258      &'AIB','ABU','D'/
259       data onelet /
260      &'z','z','z','z','z','p','k','r','h','d','e','n','q','s','t','g',
261      &'a','y','w','v','l','i','f','m','c','x',
262      &'C','M','F','I','L','V','W','Y','A','G','T',
263      &'S','Q','N','E','D','H','R','K','P','z','z','z','z','X'/
264       data potname /'LJ','LJK','BP','GB','GBV'/
265       data ename / 
266      &   "EVDW SC-SC","EVDW2 SC-p","EES p-p","ECORR4 ","ECORR5 ",
267      &   "ECORR6 ","EELLO ","ETURN3 ","ETURN4 ","ETURN6 ",
268      &   "EBE bend","ESC SCloc","ETORS ","ETORSD ","EHPB","EVDWPP",
269      &   "EVDW2_14","ESTR","ESCCOR","EDIHC","EVDW_T","ELIPTRAN",
270      &   "EAFM","ETHETC"/
271       data wname /
272      &   "WSC","WSCP","WELEC","WCORR","WCORR5","WCORR6","WEL_LOC",
273      &   "WTURN3","WTURN4","WTURN6","WANG","WSCLOC","WTOR","WTORD",
274      &   "WHPB","WVDWPP","WSCP14","WBOND","WSCCOR","WDIHC","WSC",
275      &   "WLIPTRAN","WAFM","WTHETC"/
276       data ww0 /1.0d0,1.0d0,1.0d0,1.0d0,1.0d0,1.0d0,1.0d0,1.0d0,1.0d0,
277      &    1.0d0,1.0d0,1.0d0,1.0d0,1.0d0,1.0d0,1.0d0,0.4d0,1.0d0,1.0d0,
278      &    0.0d0,0.0,0.0d0,0.0d0,0.0d0/
279       data nprint_ene /22/
280       data print_order /1,2,3,18,11,12,13,14,4,5,6,7,8,9,10,19,
281      &  16,15,17,20,21,24,22,23/
282       end 
283 c---------------------------------------------------------------------------
284       subroutine init_int_table
285       implicit real*8 (a-h,o-z)
286       include 'DIMENSIONS'
287       include 'DIMENSIONS.ZSCOPT'
288 #ifdef MPI
289       include 'mpif.h'
290 #endif
291 #ifdef MP
292       include 'COMMON.INFO'
293 #endif
294       include 'COMMON.CHAIN'
295       include 'COMMON.INTERACT'
296       include 'COMMON.LOCAL'
297       include 'COMMON.SBRIDGE'
298       include 'COMMON.IOUNITS'
299       logical scheck,lprint
300 #ifdef MPL
301       integer my_sc_int(0:max_fg_Procs-1),my_sc_intt(0:max_fg_Procs),
302      & my_ele_int(0:max_fg_Procs-1),my_ele_intt(0:max_fg_Procs)
303 C... Determine the numbers of start and end SC-SC interaction 
304 C... to deal with by current processor.
305       lprint=.false.
306       if (lprint)
307      &write (iout,*) 'INIT_INT_TABLE nres=',nres,' nnt=',nnt,' nct=',nct
308       n_sc_int_tot=(nct-nnt+1)*(nct-nnt)/2-nss
309       MyRank=MyID-(MyGroup-1)*fgProcs
310       call int_bounds(n_sc_int_tot,my_sc_inds,my_sc_inde)
311       if (lprint)
312      &  write (iout,*) 'Processor',MyID,' MyRank',MyRank,
313      &  ' n_sc_int_tot',n_sc_int_tot,' my_sc_inds=',my_sc_inds,
314      &  ' my_sc_inde',my_sc_inde
315       ind_sctint=0
316       iatsc_s=0
317       iatsc_e=0
318 #endif
319       lprint=.false.
320       do i=1,maxres
321         nint_gr(i)=0
322         nscp_gr(i)=0
323         do j=1,maxint_gr
324           istart(i,1)=0
325           iend(i,1)=0
326           ielstart(i)=0
327           ielend(i)=0
328           iscpstart(i,1)=0
329           iscpend(i,1)=0    
330         enddo
331       enddo
332       ind_scint=0
333       ind_scint_old=0
334 cd    write (iout,*) 'ns=',ns,' nss=',nss,' ihpb,jhpb',
335 cd   &   (ihpb(i),jhpb(i),i=1,nss)
336       do i=nnt,nct-1
337         scheck=.false.
338         if (dyn_ss) goto 10
339         do ii=1,nss
340           if (ihpb(ii).eq.i+nres) then
341             scheck=.true.
342             jj=jhpb(ii)-nres
343             goto 10
344           endif
345         enddo
346    10   continue
347 cd      write (iout,*) 'i=',i,' scheck=',scheck,' jj=',jj
348         if (scheck) then
349           if (jj.eq.i+1) then
350 #ifdef MPL
351             write (iout,*) 'jj=i+1'
352             call int_partition(ind_scint,my_sc_inds,my_sc_inde,i,
353      & iatsc_s,iatsc_e,i+2,nct,nint_gr(i),istart(i,1),iend(i,1),*12)
354 #else
355             nint_gr(i)=1
356             istart(i,1)=i+2
357             iend(i,1)=nct
358 #endif
359           else if (jj.eq.nct) then
360 #ifdef MPL
361             write (iout,*) 'jj=nct'
362             call int_partition(ind_scint,my_sc_inds,my_sc_inde,i,
363      &  iatsc_s,iatsc_e,i+1,nct-1,nint_gr(i),istart(i,1),iend(i,1),*12)
364 #else
365             nint_gr(i)=1
366             istart(i,1)=i+1
367             iend(i,1)=nct-1
368 #endif
369           else
370 #ifdef MPL
371             call int_partition(ind_scint,my_sc_inds,my_sc_inde,i,
372      & iatsc_s,iatsc_e,i+1,jj-1,nint_gr(i),istart(i,1),iend(i,1),*12)
373             ii=nint_gr(i)+1
374             call int_partition(ind_scint,my_sc_inds,my_sc_inde,i,
375      & iatsc_s,iatsc_e,jj+1,nct,nint_gr(i),istart(i,ii),iend(i,ii),*12)
376 #else
377             nint_gr(i)=2
378             istart(i,1)=i+1
379             iend(i,1)=jj-1
380             istart(i,2)=jj+1
381             iend(i,2)=nct
382 #endif
383           endif
384         else
385 #ifdef MPL
386           call int_partition(ind_scint,my_sc_inds,my_sc_inde,i,
387      &    iatsc_s,iatsc_e,i+1,nct,nint_gr(i),istart(i,1),iend(i,1),*12)
388 #else
389           nint_gr(i)=1
390           istart(i,1)=i+1
391           iend(i,1)=nct
392           ind_scint=int_scint+nct-i
393 #endif
394         endif
395 #ifdef MPL
396         ind_scint_old=ind_scint
397 #endif
398       enddo
399    12 continue
400 #ifndef MPL
401       iatsc_s=nnt
402       iatsc_e=nct-1
403 #endif
404 #ifdef MPL
405       if (lprint) then
406         write (iout,*) 'Processor',MyID,' Group',MyGroup
407         write (iout,*) 'iatsc_s=',iatsc_s,' iatsc_e=',iatsc_e
408       endif
409 #endif
410       if (lprint) then
411       write (iout,'(a)') 'Interaction array:'
412       do i=iatsc_s,iatsc_e
413         write (iout,'(i3,2(2x,2i3))') 
414      & i,(istart(i,iint),iend(i,iint),iint=1,nint_gr(i))
415       enddo
416       endif
417       ispp=2
418 #ifdef MPL
419 C Now partition the electrostatic-interaction array
420       npept=nct-nnt
421       nele_int_tot=(npept-ispp)*(npept-ispp+1)/2
422       call int_bounds(nele_int_tot,my_ele_inds,my_ele_inde)
423       if (lprint)
424      & write (iout,*) 'Processor',MyID,' MyRank',MyRank,
425      &  ' nele_int_tot',nele_int_tot,' my_ele_inds=',my_ele_inds,
426      &               ' my_ele_inde',my_ele_inde
427       iatel_s=0
428       iatel_e=0
429       ind_eleint=0
430       ind_eleint_old=0
431       do i=nnt,nct-3
432         ijunk=0
433         call int_partition(ind_eleint,my_ele_inds,my_ele_inde,i,
434      &    iatel_s,iatel_e,i+ispp,nct-1,ijunk,ielstart(i),ielend(i),*13)
435       enddo ! i 
436    13 continue
437 #else
438       iatel_s=nnt
439       iatel_e=nct-3
440       do i=iatel_s,iatel_e
441         ielstart(i)=i+2
442         ielend(i)=nct-1
443       enddo
444 #endif
445       if (lprint) then
446         write (iout,'(a)') 'Electrostatic interaction array:'
447         do i=iatel_s,iatel_e
448           write (iout,'(i3,2(2x,2i3))') i,ielstart(i),ielend(i)
449         enddo
450       endif ! lprint
451 c     iscp=3
452       iscp=2
453 C Partition the SC-p interaction array
454 #ifdef MPL
455       nscp_int_tot=(npept-iscp+1)*(npept-iscp+1)
456       call int_bounds(nscp_int_tot,my_scp_inds,my_scp_inde)
457       if (lprint)
458      & write (iout,*) 'Processor',MyID,' MyRank',MyRank,
459      &  ' nscp_int_tot',nscp_int_tot,' my_scp_inds=',my_scp_inds,
460      &               ' my_scp_inde',my_scp_inde
461       iatscp_s=0
462       iatscp_e=0
463       ind_scpint=0
464       ind_scpint_old=0
465       do i=nnt,nct-1
466         if (i.lt.nnt+iscp) then
467 cd        write (iout,*) 'i.le.nnt+iscp'
468           call int_partition(ind_scpint,my_scp_inds,my_scp_inde,i,
469      &      iatscp_s,iatscp_e,i+iscp,nct,nscp_gr(i),iscpstart(i,1),
470      &      iscpend(i,1),*14)
471         else if (i.gt.nct-iscp) then
472 cd        write (iout,*) 'i.gt.nct-iscp'
473           call int_partition(ind_scpint,my_scp_inds,my_scp_inde,i,
474      &      iatscp_s,iatscp_e,nnt,i-iscp,nscp_gr(i),iscpstart(i,1),
475      &      iscpend(i,1),*14)
476         else
477           call int_partition(ind_scpint,my_scp_inds,my_scp_inde,i,
478      &      iatscp_s,iatscp_e,nnt,i-iscp,nscp_gr(i),iscpstart(i,1),
479      &      iscpend(i,1),*14)
480           ii=nscp_gr(i)+1
481           call int_partition(ind_scpint,my_scp_inds,my_scp_inde,i,
482      &      iatscp_s,iatscp_e,i+iscp,nct,nscp_gr(i),iscpstart(i,ii),
483      &      iscpend(i,ii),*14)
484         endif
485       enddo ! i
486    14 continue
487 #else
488       iatscp_s=nnt
489       iatscp_e=nct-1
490       do i=nnt,nct-1
491         if (i.lt.nnt+iscp) then
492           nscp_gr(i)=1
493           iscpstart(i,1)=i+iscp
494           iscpend(i,1)=nct
495         elseif (i.gt.nct-iscp) then
496           nscp_gr(i)=1
497           iscpstart(i,1)=nnt
498           iscpend(i,1)=i-iscp
499         else
500           nscp_gr(i)=2
501           iscpstart(i,1)=nnt
502           iscpend(i,1)=i-iscp
503           iscpstart(i,2)=i+iscp
504           iscpend(i,2)=nct
505         endif 
506       enddo ! i
507 #endif
508       if (lprint) then
509         write (iout,'(a)') 'SC-p interaction array:'
510         do i=iatscp_s,iatscp_e
511           write (iout,'(i3,2(2x,2i3))') 
512      &         i,(iscpstart(i,j),iscpend(i,j),j=1,nscp_gr(i))
513         enddo
514       endif ! lprint
515 C Partition local interactions
516 #ifdef MPL
517       call int_bounds(nres-2,loc_start,loc_end)
518       loc_start=loc_start+1
519       loc_end=loc_end+1
520       call int_bounds(nres-2,ithet_start,ithet_end)
521       ithet_start=ithet_start+2
522       ithet_end=ithet_end+2
523       call int_bounds(nct-nnt-2,iphi_start,iphi_end) 
524       iphi_start=iphi_start+nnt+2
525       iphi_end=iphi_end+nnt+2
526       call int_bounds(nres-3,itau_start,itau_end)
527       itau_start=itau_start+3
528       itau_end=itau_end+3
529       if (lprint) then 
530         write (iout,*) 'Processor:',MyID,
531      & ' loc_start',loc_start,' loc_end',loc_end,
532      & ' ithet_start',ithet_start,' ithet_end',ithet_end,
533      & ' iphi_start',iphi_start,' iphi_end',iphi_end
534         write (*,*) 'Processor:',MyID,
535      & ' loc_start',loc_start,' loc_end',loc_end,
536      & ' ithet_start',ithet_start,' ithet_end',ithet_end,
537      & ' iphi_start',iphi_start,' iphi_end',iphi_end
538       endif
539       if (fgprocs.gt.1 .and. MyID.eq.BossID) then
540         write(iout,'(i10,a,i10,a,i10,a/a,i3,a)') n_sc_int_tot,' SC-SC ',
541      & nele_int_tot,' electrostatic and ',nscp_int_tot,
542      & ' SC-p interactions','were distributed among',fgprocs,
543      & ' fine-grain processors.'
544       endif
545 #else
546       loc_start=2
547       loc_end=nres-1
548       ithet_start=3
549       ithet_end=nres
550       iphi_start=nnt+3
551       iphi_end=nct
552       itau_start=4
553       itau_end=nres
554 #endif
555       return
556       end 
557 c---------------------------------------------------------------------------
558       subroutine int_partition(int_index,lower_index,upper_index,atom,
559      & at_start,at_end,first_atom,last_atom,int_gr,jat_start,jat_end,*)
560       implicit real*8 (a-h,o-z)
561       include 'DIMENSIONS'
562       include 'COMMON.IOUNITS'
563       integer int_index,lower_index,upper_index,atom,at_start,at_end,
564      & first_atom,last_atom,int_gr,jat_start,jat_end
565       logical lprn
566       lprn=.false.
567       if (lprn) write (iout,*) 'int_index=',int_index
568       int_index_old=int_index
569       int_index=int_index+last_atom-first_atom+1
570       if (lprn) 
571      &   write (iout,*) 'int_index=',int_index,
572      &               ' int_index_old',int_index_old,
573      &               ' lower_index=',lower_index,
574      &               ' upper_index=',upper_index,
575      &               ' atom=',atom,' first_atom=',first_atom,
576      &               ' last_atom=',last_atom
577       if (int_index.ge.lower_index) then
578         int_gr=int_gr+1
579         if (at_start.eq.0) then
580           at_start=atom
581           jat_start=first_atom-1+lower_index-int_index_old
582         else
583           jat_start=first_atom
584         endif
585         if (lprn) write (iout,*) 'jat_start',jat_start
586         if (int_index.ge.upper_index) then
587           at_end=atom
588           jat_end=first_atom-1+upper_index-int_index_old
589           return1
590         else
591           jat_end=last_atom
592         endif
593         if (lprn) write (iout,*) 'jat_end',jat_end
594       endif
595       return
596       end
597 c------------------------------------------------------------------------------
598       subroutine hpb_partition
599       implicit real*8 (a-h,o-z)
600       include 'DIMENSIONS'
601       include 'COMMON.SBRIDGE'
602       include 'COMMON.IOUNITS'
603 #ifdef MPL
604       include 'COMMON.INFO'
605       call int_bounds(nhpb,link_start,link_end)
606 #else
607       link_start=1
608       link_end=nhpb
609 #endif
610 cd    write (iout,*) 'Processor',MyID,' MyRank',MyRank,
611 cd   &  ' nhpb',nhpb,' link_start=',link_start,
612 cd   &  ' link_end',link_end
613       return
614       end