03f4099aed15873f97aa98cd184792833bea591a
[unres.git] / source / unres / src_MD / initialize_p.F
1       block data
2       implicit real*8 (a-h,o-z)
3       include 'DIMENSIONS'
4       include 'COMMON.MCM'
5       include 'COMMON.MD'
6       data MovTypID
7      &  /'pool','chain regrow','multi-bond','phi','theta','side chain',
8      &   'total'/
9 c Conversion from poises to molecular unit and the gas constant
10       data cPoise /2.9361d0/, Rb /0.001986d0/
11       end
12 c--------------------------------------------------------------------------
13       subroutine initialize
14
15 C Define constants and zero out tables.
16 C
17       implicit real*8 (a-h,o-z)
18       include 'DIMENSIONS'
19 #ifdef MPI
20       include 'mpif.h'
21 #endif
22 #ifndef ISNAN
23       external proc_proc
24 #ifdef WINPGI
25 cMS$ATTRIBUTES C ::  proc_proc
26 #endif
27 #endif
28       include 'COMMON.IOUNITS'
29       include 'COMMON.CHAIN'
30       include 'COMMON.INTERACT'
31       include 'COMMON.GEO'
32       include 'COMMON.LOCAL'
33       include 'COMMON.TORSION'
34       include 'COMMON.FFIELD'
35       include 'COMMON.SBRIDGE'
36       include 'COMMON.MCM'
37       include 'COMMON.MINIM' 
38       include 'COMMON.DERIV'
39       include 'COMMON.SPLITELE'
40 c Common blocks from the diagonalization routines
41       COMMON /IOFILE/ IR,IW,IP,IJK,IPK,IDAF,NAV,IODA(400)
42       COMMON /MACHSW/ KDIAG,ICORFL,IXDR
43       logical mask_r
44 c      real*8 text1 /'initial_i'/
45
46       mask_r=.false.
47 #ifndef ISNAN
48 c NaNQ initialization
49       i=-1
50       arg=100.0d0
51       rr=dacos(arg)
52 #ifdef WINPGI
53       idumm=proc_proc(rr,i)
54 #else
55       call proc_proc(rr,i)
56 #endif
57 #endif
58
59       kdiag=0
60       icorfl=0
61       iw=2
62 C
63 C The following is just to define auxiliary variables used in angle conversion
64 C
65       pi=4.0D0*datan(1.0D0)
66       dwapi=2.0D0*pi
67       dwapi3=dwapi/3.0D0
68       pipol=0.5D0*pi
69       deg2rad=pi/180.0D0
70       rad2deg=1.0D0/deg2rad
71       angmin=10.0D0*deg2rad
72 C
73 C Define I/O units.
74 C
75       inp=    1
76       iout=   2
77       ipdbin= 3
78       ipdb=   7
79       icart = 30
80       imol2=  4
81       igeom=  8
82       intin=  9
83       ithep= 11
84       ithep_pdb=51
85       irotam=12
86       irotam_pdb=52
87       itorp= 13
88       itordp= 23
89       ielep= 14
90       isidep=15 
91       iscpp=25
92       icbase=16
93       ifourier=20
94       istat= 17
95       irest1=55
96       irest2=56
97       iifrag=57
98       ientin=18
99       ientout=19
100       ibond = 28
101       isccor = 29
102 crc for write_rmsbank1  
103       izs1=21
104 cdr  include secondary structure prediction bias
105       isecpred=27
106 C
107 C CSA I/O units (separated from others especially for Jooyoung)
108 C
109       icsa_rbank=30
110       icsa_seed=31
111       icsa_history=32
112       icsa_bank=33
113       icsa_bank1=34
114       icsa_alpha=35
115       icsa_alpha1=36
116       icsa_bankt=37
117       icsa_int=39
118       icsa_bank_reminimized=38
119       icsa_native_int=41
120       icsa_in=40
121 crc for ifc error 118
122       icsa_pdb=42
123 C
124 C Set default weights of the energy terms.
125 C
126       wlong=1.0D0
127       welec=1.0D0
128       wtor =1.0D0
129       wang =1.0D0
130       wscloc=1.0D0
131       wstrain=1.0D0
132 C
133 C Zero out tables.
134 C
135       print '(a,$)','Inside initialize'
136 c      call memmon_print_usage()
137       do i=1,maxres2
138         do j=1,3
139           c(j,i)=0.0D0
140           dc(j,i)=0.0D0
141         enddo
142       enddo
143       do i=1,maxres
144         do j=1,3
145           xloc(j,i)=0.0D0
146         enddo
147       enddo
148       do i=1,ntyp
149         do j=1,ntyp
150           aa(i,j)=0.0D0
151           bb(i,j)=0.0D0
152           augm(i,j)=0.0D0
153           sigma(i,j)=0.0D0
154           r0(i,j)=0.0D0
155           chi(i,j)=0.0D0
156         enddo
157         do j=1,2
158           bad(i,j)=0.0D0
159         enddo
160         chip(i)=0.0D0
161         alp(i)=0.0D0
162         sigma0(i)=0.0D0
163         sigii(i)=0.0D0
164         rr0(i)=0.0D0
165         a0thet(i)=0.0D0
166         do j=1,2
167          do ichir1=-1,1
168           do ichir2=-1,1
169           athet(j,i,ichir1,ichir2)=0.0D0
170           bthet(j,i,ichir1,ichir2)=0.0D0
171           enddo
172          enddo
173         enddo
174         do j=0,3
175           polthet(j,i)=0.0D0
176         enddo
177         do j=1,3
178           gthet(j,i)=0.0D0
179         enddo
180         theta0(i)=0.0D0
181         sig0(i)=0.0D0
182         sigc0(i)=0.0D0
183         do j=1,maxlob
184           bsc(j,i)=0.0D0
185           do k=1,3
186             censc(k,j,i)=0.0D0
187           enddo
188           do k=1,3
189             do l=1,3
190               gaussc(l,k,j,i)=0.0D0
191             enddo
192           enddo
193           nlob(i)=0
194         enddo
195       enddo
196       nlob(ntyp1)=0
197       dsc(ntyp1)=0.0D0
198       do i=-maxtor,maxtor
199         itortyp(i)=0
200        do iblock=1,2
201         do j=-maxtor,maxtor
202           do k=1,maxterm
203             v1(k,j,i,iblock)=0.0D0
204             v2(k,j,i,iblock)=0.0D0
205           enddo
206         enddo
207         enddo
208       enddo
209       do iblock=1,2
210        do i=-maxtor,maxtor
211         do j=-maxtor,maxtor
212          do k=-maxtor,maxtor
213           do l=1,maxtermd_1
214             v1c(1,l,i,j,k,iblock)=0.0D0
215             v1s(1,l,i,j,k,iblock)=0.0D0
216             v1c(2,l,i,j,k,iblock)=0.0D0
217             v1s(2,l,i,j,k,iblock)=0.0D0
218           enddo !l
219           do l=1,maxtermd_2
220            do m=1,maxtermd_2
221             v2c(m,l,i,j,k,iblock)=0.0D0
222             v2s(m,l,i,j,k,iblock)=0.0D0
223            enddo !m
224           enddo !l
225         enddo !k
226        enddo !j
227       enddo !i
228       enddo !iblock
229       do i=1,maxres
230         itype(i)=0
231         itel(i)=0
232       enddo
233 C Initialize the bridge arrays
234       ns=0
235       nss=0 
236       nhpb=0
237       do i=1,maxss
238         iss(i)=0
239       enddo
240       do i=1,maxdim
241         dhpb(i)=0.0D0
242       enddo
243       do i=1,maxres
244         ihpb(i)=0
245         jhpb(i)=0
246       enddo
247 C
248 C Initialize timing.
249 C
250       call set_timers
251 C
252 C Initialize variables used in minimization.
253 C   
254 c     maxfun=5000
255 c     maxit=2000
256       maxfun=500
257       maxit=200
258       tolf=1.0D-2
259       rtolf=5.0D-4
260
261 C Initialize the variables responsible for the mode of gradient storage.
262 C
263       nfl=0
264       icg=1
265 C
266 C Initialize constants used to split the energy into long- and short-range
267 C components
268 C
269       r_cut=2.0d0
270       rlamb=0.3d0
271 #ifndef SPLITELE
272       nprint_ene=nprint_ene-1
273 #endif
274       return
275       end
276 c-------------------------------------------------------------------------
277       block data nazwy
278       implicit real*8 (a-h,o-z)
279       include 'DIMENSIONS'
280       include 'COMMON.NAMES'
281       include 'COMMON.FFIELD'
282       data restyp /
283      &'DD' ,'DPR','DLY','DAR','DHI','DAS','DGL','DSG','DGN','DSN','DTH',
284      &'DYY','DAL','DTY','DTR','DVA','DLE','DIL','DPN','MED','DCY','ZER',
285      &'CYS','MET','PHE','ILE','LEU','VAL','TRP','TYR','ALA','GLY','THR',
286      &'SER','GLN','ASN','GLU','ASP','HIS','ARG','LYS','PRO','D'/
287       data onelet /
288      &'z','p','k','r','h','d','e','n','q','s','t','g',
289      &'a','y','w','v','l','i','f','m','c','x',
290      &'C','M','F','I','L','V','W','Y','A','G','T',
291      &'S','Q','N','E','D','H','R','K','P','X'/
292       data potname /'LJ','LJK','BP','GB','GBV'/
293       data ename /
294      &   "EVDW SC-SC","EVDW2 SC-p","EES p-p","ECORR4 ","ECORR5 ",
295      &   "ECORR6 ","EELLO ","ETURN3 ","ETURN4 ","ETURN6 ",
296      &   "EBE bend","ESC SCloc","ETORS ","ETORSD ","EHPB ","EVDWPP ",
297      &   "ESTR ","EVDW2_14 ","UCONST ", "      ","ESCCOR"," "," "/
298       data wname /
299      &   "WSC","WSCP","WELEC","WCORR","WCORR5","WCORR6","WEL_LOC",
300      &   "WTURN3","WTURN4","WTURN6","WANG","WSCLOC","WTOR","WTORD",
301      &   "WSTRAIN","WVDWPP","WBOND","SCAL14","     ","    ","WSCCOR",
302      &   " "," "/
303       data nprint_ene /20/
304       data print_order/1,2,3,11,12,13,14,4,5,6,7,8,9,10,19,18,15,17,16,
305      & 21,0,0,0/
306       end 
307 c---------------------------------------------------------------------------
308       subroutine init_int_table
309       implicit real*8 (a-h,o-z)
310       include 'DIMENSIONS'
311 #ifdef MPI
312       include 'mpif.h'
313       integer blocklengths(15),displs(15)
314 #endif
315       include 'COMMON.CONTROL'
316       include 'COMMON.SETUP'
317       include 'COMMON.CHAIN'
318       include 'COMMON.INTERACT'
319       include 'COMMON.LOCAL'
320       include 'COMMON.SBRIDGE'
321       include 'COMMON.TORCNSTR'
322       include 'COMMON.IOUNITS'
323       include 'COMMON.DERIV'
324       include 'COMMON.CONTACTS'
325       common /przechowalnia/ iturn3_start_all(0:MaxProcs),
326      & iturn3_end_all(0:MaxProcs),iturn4_start_all(0:MaxProcs),
327      & iturn4_end_all(0:MaxProcs),iatel_s_all(0:MaxProcs),
328      & iatel_e_all(0:MaxProcs),ielstart_all(maxres,0:MaxProcs-1),
329      & ielend_all(maxres,0:MaxProcs-1),
330      & ntask_cont_from_all(0:max_fg_procs-1),
331      & itask_cont_from_all(0:max_fg_procs-1,0:max_fg_procs-1),
332      & ntask_cont_to_all(0:max_fg_procs-1),
333      & itask_cont_to_all(0:max_fg_procs-1,0:max_fg_procs-1)
334       integer FG_GROUP,CONT_FROM_GROUP,CONT_TO_GROUP
335       logical scheck,lprint,flag
336 #ifdef MPI
337       integer my_sc_int(0:max_fg_Procs-1),my_sc_intt(0:max_fg_Procs),
338      & my_ele_int(0:max_fg_Procs-1),my_ele_intt(0:max_fg_Procs)
339 C... Determine the numbers of start and end SC-SC interaction 
340 C... to deal with by current processor.
341       do i=0,nfgtasks-1
342         itask_cont_from(i)=fg_rank
343         itask_cont_to(i)=fg_rank
344       enddo
345       lprint=.false.
346       if (lprint)
347      &write (iout,*) 'INIT_INT_TABLE nres=',nres,' nnt=',nnt,' nct=',nct
348       n_sc_int_tot=(nct-nnt+1)*(nct-nnt)/2-nss
349       call int_bounds(n_sc_int_tot,my_sc_inds,my_sc_inde)
350       if (lprint)
351      &  write (iout,*) 'Processor',fg_rank,' CG group',kolor,
352      &  ' absolute rank',MyRank,
353      &  ' n_sc_int_tot',n_sc_int_tot,' my_sc_inds=',my_sc_inds,
354      &  ' my_sc_inde',my_sc_inde
355       ind_sctint=0
356       iatsc_s=0
357       iatsc_e=0
358 #endif
359 c      lprint=.false.
360       do i=1,maxres
361         nint_gr(i)=0
362         nscp_gr(i)=0
363         do j=1,maxint_gr
364           istart(i,1)=0
365           iend(i,1)=0
366           ielstart(i)=0
367           ielend(i)=0
368           iscpstart(i,1)=0
369           iscpend(i,1)=0    
370         enddo
371       enddo
372       ind_scint=0
373       ind_scint_old=0
374 cd    write (iout,*) 'ns=',ns,' nss=',nss,' ihpb,jhpb',
375 cd   &   (ihpb(i),jhpb(i),i=1,nss)
376       do i=nnt,nct-1
377         scheck=.false.
378         do ii=1,nss
379           if (ihpb(ii).eq.i+nres) then
380             scheck=.true.
381             jj=jhpb(ii)-nres
382             goto 10
383           endif
384         enddo
385    10   continue
386 cd      write (iout,*) 'i=',i,' scheck=',scheck,' jj=',jj
387         if (scheck) then
388           if (jj.eq.i+1) then
389 #ifdef MPI
390 c            write (iout,*) 'jj=i+1'
391             call int_partition(ind_scint,my_sc_inds,my_sc_inde,i,
392      & iatsc_s,iatsc_e,i+2,nct,nint_gr(i),istart(i,1),iend(i,1),*12)
393 #else
394             nint_gr(i)=1
395             istart(i,1)=i+2
396             iend(i,1)=nct
397 #endif
398           else if (jj.eq.nct) then
399 #ifdef MPI
400 c            write (iout,*) 'jj=nct'
401             call int_partition(ind_scint,my_sc_inds,my_sc_inde,i,
402      &  iatsc_s,iatsc_e,i+1,nct-1,nint_gr(i),istart(i,1),iend(i,1),*12)
403 #else
404             nint_gr(i)=1
405             istart(i,1)=i+1
406             iend(i,1)=nct-1
407 #endif
408           else
409 #ifdef MPI
410             call int_partition(ind_scint,my_sc_inds,my_sc_inde,i,
411      & iatsc_s,iatsc_e,i+1,jj-1,nint_gr(i),istart(i,1),iend(i,1),*12)
412             ii=nint_gr(i)+1
413             call int_partition(ind_scint,my_sc_inds,my_sc_inde,i,
414      & iatsc_s,iatsc_e,jj+1,nct,nint_gr(i),istart(i,ii),iend(i,ii),*12)
415 #else
416             nint_gr(i)=2
417             istart(i,1)=i+1
418             iend(i,1)=jj-1
419             istart(i,2)=jj+1
420             iend(i,2)=nct
421 #endif
422           endif
423         else
424 #ifdef MPI
425           call int_partition(ind_scint,my_sc_inds,my_sc_inde,i,
426      &    iatsc_s,iatsc_e,i+1,nct,nint_gr(i),istart(i,1),iend(i,1),*12)
427 #else
428           nint_gr(i)=1
429           istart(i,1)=i+1
430           iend(i,1)=nct
431           ind_scint=ind_scint+nct-i
432 #endif
433         endif
434 #ifdef MPI
435         ind_scint_old=ind_scint
436 #endif
437       enddo
438    12 continue
439 #ifndef MPI
440       iatsc_s=nnt
441       iatsc_e=nct-1
442 #endif
443 #ifdef MPI
444       if (lprint) write (*,*) 'Processor',fg_rank,' CG Group',kolor,
445      &   ' absolute rank',myrank,' iatsc_s=',iatsc_s,' iatsc_e=',iatsc_e
446 #endif
447       if (lprint) then
448       write (iout,'(a)') 'Interaction array:'
449       do i=iatsc_s,iatsc_e
450         write (iout,'(i3,2(2x,2i3))') 
451      & i,(istart(i,iint),iend(i,iint),iint=1,nint_gr(i))
452       enddo
453       endif
454       ispp=4
455 #ifdef MPI
456 C Now partition the electrostatic-interaction array
457       npept=nct-nnt
458       nele_int_tot=(npept-ispp)*(npept-ispp+1)/2
459       call int_bounds(nele_int_tot,my_ele_inds,my_ele_inde)
460       if (lprint)
461      & write (*,*) 'Processor',fg_rank,' CG group',kolor,
462      &  ' absolute rank',MyRank,
463      &  ' nele_int_tot',nele_int_tot,' my_ele_inds=',my_ele_inds,
464      &               ' my_ele_inde',my_ele_inde
465       iatel_s=0
466       iatel_e=0
467       ind_eleint=0
468       ind_eleint_old=0
469       do i=nnt,nct-3
470         ijunk=0
471         call int_partition(ind_eleint,my_ele_inds,my_ele_inde,i,
472      &    iatel_s,iatel_e,i+ispp,nct-1,ijunk,ielstart(i),ielend(i),*13)
473       enddo ! i 
474    13 continue
475       if (iatel_s.eq.0) iatel_s=1
476       nele_int_tot_vdw=(npept-2)*(npept-2+1)/2
477 c      write (iout,*) "nele_int_tot_vdw",nele_int_tot_vdw
478       call int_bounds(nele_int_tot_vdw,my_ele_inds_vdw,my_ele_inde_vdw)
479 c      write (iout,*) "my_ele_inds_vdw",my_ele_inds_vdw,
480 c     & " my_ele_inde_vdw",my_ele_inde_vdw
481       ind_eleint_vdw=0
482       ind_eleint_vdw_old=0
483       iatel_s_vdw=0
484       iatel_e_vdw=0
485       do i=nnt,nct-3
486         ijunk=0
487         call int_partition(ind_eleint_vdw,my_ele_inds_vdw,
488      &    my_ele_inde_vdw,i,
489      &    iatel_s_vdw,iatel_e_vdw,i+2,nct-1,ijunk,ielstart_vdw(i),
490      &    ielend_vdw(i),*15)
491 c        write (iout,*) i," ielstart_vdw",ielstart_vdw(i),
492 c     &   " ielend_vdw",ielend_vdw(i)
493       enddo ! i 
494       if (iatel_s_vdw.eq.0) iatel_s_vdw=1
495    15 continue
496 #else
497       iatel_s=nnt
498       iatel_e=nct-5
499       do i=iatel_s,iatel_e
500         ielstart(i)=i+4
501         ielend(i)=nct-1
502       enddo
503       iatel_s_vdw=nnt
504       iatel_e_vdw=nct-3
505       do i=iatel_s_vdw,iatel_e_vdw
506         ielstart_vdw(i)=i+2
507         ielend_vdw(i)=nct-1
508       enddo
509 #endif
510       if (lprint) then
511         write (*,'(a)') 'Processor',fg_rank,' CG group',kolor,
512      &  ' absolute rank',MyRank
513         write (iout,*) 'Electrostatic interaction array:'
514         do i=iatel_s,iatel_e
515           write (iout,'(i3,2(2x,2i3))') i,ielstart(i),ielend(i)
516         enddo
517       endif ! lprint
518 c     iscp=3
519       iscp=2
520 C Partition the SC-p interaction array
521 #ifdef MPI
522       nscp_int_tot=(npept-iscp+1)*(npept-iscp+1)
523       call int_bounds(nscp_int_tot,my_scp_inds,my_scp_inde)
524       if (lprint) write (iout,*) 'Processor',fg_rank,' CG group',kolor,
525      &  ' absolute rank',myrank,
526      &  ' nscp_int_tot',nscp_int_tot,' my_scp_inds=',my_scp_inds,
527      &               ' my_scp_inde',my_scp_inde
528       iatscp_s=0
529       iatscp_e=0
530       ind_scpint=0
531       ind_scpint_old=0
532       do i=nnt,nct-1
533         if (i.lt.nnt+iscp) then
534 cd        write (iout,*) 'i.le.nnt+iscp'
535           call int_partition(ind_scpint,my_scp_inds,my_scp_inde,i,
536      &      iatscp_s,iatscp_e,i+iscp,nct,nscp_gr(i),iscpstart(i,1),
537      &      iscpend(i,1),*14)
538         else if (i.gt.nct-iscp) then
539 cd        write (iout,*) 'i.gt.nct-iscp'
540           call int_partition(ind_scpint,my_scp_inds,my_scp_inde,i,
541      &      iatscp_s,iatscp_e,nnt,i-iscp,nscp_gr(i),iscpstart(i,1),
542      &      iscpend(i,1),*14)
543         else
544           call int_partition(ind_scpint,my_scp_inds,my_scp_inde,i,
545      &      iatscp_s,iatscp_e,nnt,i-iscp,nscp_gr(i),iscpstart(i,1),
546      &      iscpend(i,1),*14)
547           ii=nscp_gr(i)+1
548           call int_partition(ind_scpint,my_scp_inds,my_scp_inde,i,
549      &      iatscp_s,iatscp_e,i+iscp,nct,nscp_gr(i),iscpstart(i,ii),
550      &      iscpend(i,ii),*14)
551         endif
552       enddo ! i
553    14 continue
554 #else
555       iatscp_s=nnt
556       iatscp_e=nct-1
557       do i=nnt,nct-1
558         if (i.lt.nnt+iscp) then
559           nscp_gr(i)=1
560           iscpstart(i,1)=i+iscp
561           iscpend(i,1)=nct
562         elseif (i.gt.nct-iscp) then
563           nscp_gr(i)=1
564           iscpstart(i,1)=nnt
565           iscpend(i,1)=i-iscp
566         else
567           nscp_gr(i)=2
568           iscpstart(i,1)=nnt
569           iscpend(i,1)=i-iscp
570           iscpstart(i,2)=i+iscp
571           iscpend(i,2)=nct
572         endif 
573       enddo ! i
574 #endif
575       if (lprint) then
576         write (iout,'(a)') 'SC-p interaction array:'
577         do i=iatscp_s,iatscp_e
578           write (iout,'(i3,2(2x,2i3))') 
579      &         i,(iscpstart(i,j),iscpend(i,j),j=1,nscp_gr(i))
580         enddo
581       endif ! lprint
582 C Partition local interactions
583 #ifdef MPI
584       call int_bounds(nres-2,loc_start,loc_end)
585       loc_start=loc_start+1
586       loc_end=loc_end+1
587       call int_bounds(nres-2,ithet_start,ithet_end)
588       ithet_start=ithet_start+2
589       ithet_end=ithet_end+2
590       call int_bounds(nct-nnt-2,iturn3_start,iturn3_end) 
591       iturn3_start=iturn3_start+nnt
592       iphi_start=iturn3_start+2
593       iturn3_end=iturn3_end+nnt
594       iphi_end=iturn3_end+2
595       iturn3_start=iturn3_start-1
596       iturn3_end=iturn3_end-1
597       call int_bounds(nres-3,itau_start,itau_end) 
598       itau_start=itau_start+3
599       itau_end=itau_end+3
600       call int_bounds(nres-3,iphi1_start,iphi1_end)
601       iphi1_start=iphi1_start+3
602       iphi1_end=iphi1_end+3
603       call int_bounds(nct-nnt-3,iturn4_start,iturn4_end) 
604       iturn4_start=iturn4_start+nnt
605       iphid_start=iturn4_start+2
606       iturn4_end=iturn4_end+nnt
607       iphid_end=iturn4_end+2
608       iturn4_start=iturn4_start-1
609       iturn4_end=iturn4_end-1
610       call int_bounds(nres-2,ibond_start,ibond_end) 
611       ibond_start=ibond_start+1
612       ibond_end=ibond_end+1
613       call int_bounds(nct-nnt,ibondp_start,ibondp_end) 
614       ibondp_start=ibondp_start+nnt
615       ibondp_end=ibondp_end+nnt
616       call int_bounds1(nres-1,ivec_start,ivec_end) 
617       print *,"Processor",myrank,fg_rank,fg_rank1,
618      &  " ivec_start",ivec_start," ivec_end",ivec_end
619       iset_start=loc_start+2
620       iset_end=loc_end+2
621       if (ndih_constr.eq.0) then
622         idihconstr_start=1
623         idihconstr_end=0
624       else
625         call int_bounds(ndih_constr,idihconstr_start,idihconstr_end)
626       endif
627       nsumgrad=(nres-nnt)*(nres-nnt+1)/2
628       nlen=nres-nnt+1
629       call int_bounds(nsumgrad,ngrad_start,ngrad_end)
630       igrad_start=((2*nlen+1)
631      &    -sqrt(float((2*nlen-1)**2-8*(ngrad_start-1))))/2
632       jgrad_start(igrad_start)=
633      &    ngrad_start-(2*nlen-igrad_start)*(igrad_start-1)/2
634      &    +igrad_start
635       jgrad_end(igrad_start)=nres
636       igrad_end=((2*nlen+1)
637      &    -sqrt(float((2*nlen-1)**2-8*(ngrad_end-1))))/2
638       if (igrad_end.gt.igrad_start) jgrad_start(igrad_end)=igrad_end+1
639       jgrad_end(igrad_end)=ngrad_end-(2*nlen-igrad_end)*(igrad_end-1)/2
640      &    +igrad_end
641       do i=igrad_start+1,igrad_end-1
642         jgrad_start(i)=i+1
643         jgrad_end(i)=nres
644       enddo
645       if (lprint) then 
646         write (*,*) 'Processor:',fg_rank,' CG group',kolor,
647      & ' absolute rank',myrank,
648      & ' loc_start',loc_start,' loc_end',loc_end,
649      & ' ithet_start',ithet_start,' ithet_end',ithet_end,
650      & ' iphi_start',iphi_start,' iphi_end',iphi_end,
651      & ' iphid_start',iphid_start,' iphid_end',iphid_end,
652      & ' ibond_start',ibond_start,' ibond_end',ibond_end,
653      & ' ibondp_start',ibondp_start,' ibondp_end',ibondp_end,
654      & ' iturn3_start',iturn3_start,' iturn3_end',iturn3_end,
655      & ' iturn4_start',iturn4_start,' iturn4_end',iturn4_end,
656      & ' ivec_start',ivec_start,' ivec_end',ivec_end,
657      & ' iset_start',iset_start,' iset_end',iset_end,
658      & ' idihconstr_start',idihconstr_start,' idihconstr_end',
659      &   idihconstr_end
660        write (*,*) 'Processor:',fg_rank,myrank,' igrad_start',
661      &   igrad_start,' igrad_end',igrad_end,' ngrad_start',ngrad_start,
662      &   ' ngrad_end',ngrad_end
663        do i=igrad_start,igrad_end
664          write(*,*) 'Processor:',fg_rank,myrank,i,
665      &    jgrad_start(i),jgrad_end(i)
666        enddo
667       endif
668       if (nfgtasks.gt.1) then
669         call MPI_Allgather(ivec_start,1,MPI_INTEGER,ivec_displ(0),1,
670      &    MPI_INTEGER,FG_COMM1,IERROR)
671         iaux=ivec_end-ivec_start+1
672         call MPI_Allgather(iaux,1,MPI_INTEGER,ivec_count(0),1,
673      &    MPI_INTEGER,FG_COMM1,IERROR)
674         call MPI_Allgather(iset_start-2,1,MPI_INTEGER,iset_displ(0),1,
675      &    MPI_INTEGER,FG_COMM,IERROR)
676         iaux=iset_end-iset_start+1
677         call MPI_Allgather(iaux,1,MPI_INTEGER,iset_count(0),1,
678      &    MPI_INTEGER,FG_COMM,IERROR)
679         call MPI_Allgather(ibond_start,1,MPI_INTEGER,ibond_displ(0),1,
680      &    MPI_INTEGER,FG_COMM,IERROR)
681         iaux=ibond_end-ibond_start+1
682         call MPI_Allgather(iaux,1,MPI_INTEGER,ibond_count(0),1,
683      &    MPI_INTEGER,FG_COMM,IERROR)
684         call MPI_Allgather(ithet_start,1,MPI_INTEGER,ithet_displ(0),1,
685      &    MPI_INTEGER,FG_COMM,IERROR)
686         iaux=ithet_end-ithet_start+1
687         call MPI_Allgather(iaux,1,MPI_INTEGER,ithet_count(0),1,
688      &    MPI_INTEGER,FG_COMM,IERROR)
689         call MPI_Allgather(iphi_start,1,MPI_INTEGER,iphi_displ(0),1,
690      &    MPI_INTEGER,FG_COMM,IERROR)
691         iaux=iphi_end-iphi_start+1
692         call MPI_Allgather(iaux,1,MPI_INTEGER,iphi_count(0),1,
693      &    MPI_INTEGER,FG_COMM,IERROR)
694         call MPI_Allgather(iphi1_start,1,MPI_INTEGER,iphi1_displ(0),1,
695      &    MPI_INTEGER,FG_COMM,IERROR)
696         iaux=iphi1_end-iphi1_start+1
697         call MPI_Allgather(iaux,1,MPI_INTEGER,iphi1_count(0),1,
698      &    MPI_INTEGER,FG_COMM,IERROR)
699         do i=0,maxprocs-1
700           do j=1,maxres
701             ielstart_all(j,i)=0
702             ielend_all(j,i)=0
703           enddo
704         enddo
705         call MPI_Allgather(iturn3_start,1,MPI_INTEGER,
706      &    iturn3_start_all(0),1,MPI_INTEGER,FG_COMM,IERROR)
707         call MPI_Allgather(iturn4_start,1,MPI_INTEGER,
708      &    iturn4_start_all(0),1,MPI_INTEGER,FG_COMM,IERROR)
709         call MPI_Allgather(iturn3_end,1,MPI_INTEGER,
710      &    iturn3_end_all(0),1,MPI_INTEGER,FG_COMM,IERROR)
711         call MPI_Allgather(iturn4_end,1,MPI_INTEGER,
712      &    iturn4_end_all(0),1,MPI_INTEGER,FG_COMM,IERROR)
713         call MPI_Allgather(iatel_s,1,MPI_INTEGER,
714      &    iatel_s_all(0),1,MPI_INTEGER,FG_COMM,IERROR)
715         call MPI_Allgather(iatel_e,1,MPI_INTEGER,
716      &    iatel_e_all(0),1,MPI_INTEGER,FG_COMM,IERROR)
717         call MPI_Allgather(ielstart(1),maxres,MPI_INTEGER,
718      &    ielstart_all(1,0),maxres,MPI_INTEGER,FG_COMM,IERROR)
719         call MPI_Allgather(ielend(1),maxres,MPI_INTEGER,
720      &    ielend_all(1,0),maxres,MPI_INTEGER,FG_COMM,IERROR)
721         if (lprint) then
722         write (iout,*) "iatel_s_all",(iatel_s_all(i),i=0,nfgtasks)
723         write (iout,*) "iatel_e_all",(iatel_e_all(i),i=0,nfgtasks)
724         write (iout,*) "iturn3_start_all",
725      &    (iturn3_start_all(i),i=0,nfgtasks-1)
726         write (iout,*) "iturn3_end_all",
727      &    (iturn3_end_all(i),i=0,nfgtasks-1)
728         write (iout,*) "iturn4_start_all",
729      &    (iturn4_start_all(i),i=0,nfgtasks-1)
730         write (iout,*) "iturn4_end_all",
731      &    (iturn4_end_all(i),i=0,nfgtasks-1)
732         write (iout,*) "The ielstart_all array"
733         do i=nnt,nct
734           write (iout,'(20i4)') i,(ielstart_all(i,j),j=0,nfgtasks-1)
735         enddo
736         write (iout,*) "The ielend_all array"
737         do i=nnt,nct
738           write (iout,'(20i4)') i,(ielend_all(i,j),j=0,nfgtasks-1)
739         enddo
740         call flush(iout)
741         endif
742         ntask_cont_from=0
743         ntask_cont_to=0
744         itask_cont_from(0)=fg_rank
745         itask_cont_to(0)=fg_rank
746         flag=.false.
747         do ii=iturn3_start,iturn3_end
748           call add_int(ii,ii+2,iturn3_sent(1,ii),
749      &                 ntask_cont_to,itask_cont_to,flag)
750         enddo
751         do ii=iturn4_start,iturn4_end
752           call add_int(ii,ii+3,iturn4_sent(1,ii),
753      &                 ntask_cont_to,itask_cont_to,flag)
754         enddo
755         do ii=iturn3_start,iturn3_end
756           call add_int_from(ii,ii+2,ntask_cont_from,itask_cont_from)
757         enddo
758         do ii=iturn4_start,iturn4_end
759           call add_int_from(ii,ii+3,ntask_cont_from,itask_cont_from)
760         enddo
761         if (lprint) then
762         write (iout,*) "After turn3 ntask_cont_from",ntask_cont_from,
763      &   " ntask_cont_to",ntask_cont_to
764         write (iout,*) "itask_cont_from",
765      &    (itask_cont_from(i),i=1,ntask_cont_from)
766         write (iout,*) "itask_cont_to",
767      &    (itask_cont_to(i),i=1,ntask_cont_to)
768         call flush(iout)
769         endif
770 c        write (iout,*) "Loop forward"
771 c        call flush(iout)
772         do i=iatel_s,iatel_e
773 c          write (iout,*) "from loop i=",i
774 c          call flush(iout)
775           do j=ielstart(i),ielend(i)
776             call add_int_from(i,j,ntask_cont_from,itask_cont_from)
777           enddo
778         enddo
779 c        write (iout,*) "Loop backward iatel_e-1",iatel_e-1,
780 c     &     " iatel_e",iatel_e
781 c        call flush(iout)
782         nat_sent=0
783         do i=iatel_s,iatel_e
784 c          write (iout,*) "i",i," ielstart",ielstart(i),
785 c     &      " ielend",ielend(i)
786 c          call flush(iout)
787           flag=.false.
788           do j=ielstart(i),ielend(i)
789             call add_int(i,j,iint_sent(1,j,nat_sent+1),ntask_cont_to,
790      &                   itask_cont_to,flag)
791           enddo
792           if (flag) then
793             nat_sent=nat_sent+1
794             iat_sent(nat_sent)=i
795           endif
796         enddo
797         if (lprint) then
798         write (iout,*)"After longrange ntask_cont_from",ntask_cont_from,
799      &   " ntask_cont_to",ntask_cont_to
800         write (iout,*) "itask_cont_from",
801      &    (itask_cont_from(i),i=1,ntask_cont_from)
802         write (iout,*) "itask_cont_to",
803      &    (itask_cont_to(i),i=1,ntask_cont_to)
804         call flush(iout)
805         write (iout,*) "iint_sent"
806         do i=1,nat_sent
807           ii=iat_sent(i)
808           write (iout,'(20i4)') ii,(j,(iint_sent(k,j,i),k=1,4),
809      &      j=ielstart(ii),ielend(ii))
810         enddo
811         write (iout,*) "iturn3_sent iturn3_start",iturn3_start,
812      &    " iturn3_end",iturn3_end
813         write (iout,'(20i4)') (i,(iturn3_sent(j,i),j=1,4),
814      &      i=iturn3_start,iturn3_end)
815         write (iout,*) "iturn4_sent iturn4_start",iturn4_start,
816      &    " iturn4_end",iturn4_end
817         write (iout,'(20i4)') (i,(iturn4_sent(j,i),j=1,4),
818      &      i=iturn4_start,iturn4_end)
819         call flush(iout)
820         endif
821         call MPI_Gather(ntask_cont_from,1,MPI_INTEGER,
822      &   ntask_cont_from_all,1,MPI_INTEGER,king,FG_COMM,IERR)
823 c        write (iout,*) "Gather ntask_cont_from ended"
824 c        call flush(iout)
825         call MPI_Gather(itask_cont_from(0),max_fg_procs,MPI_INTEGER,
826      &   itask_cont_from_all(0,0),max_fg_procs,MPI_INTEGER,king,
827      &   FG_COMM,IERR)
828 c        write (iout,*) "Gather itask_cont_from ended"
829 c        call flush(iout)
830         call MPI_Gather(ntask_cont_to,1,MPI_INTEGER,ntask_cont_to_all,
831      &   1,MPI_INTEGER,king,FG_COMM,IERR)
832 c        write (iout,*) "Gather ntask_cont_to ended"
833 c        call flush(iout)
834         call MPI_Gather(itask_cont_to,max_fg_procs,MPI_INTEGER,
835      &   itask_cont_to_all,max_fg_procs,MPI_INTEGER,king,FG_COMM,IERR)
836 c        write (iout,*) "Gather itask_cont_to ended"
837 c        call flush(iout)
838         if (fg_rank.eq.king) then
839           write (iout,*)"Contact receive task map (proc, #tasks, tasks)"
840           do i=0,nfgtasks-1
841             write (iout,'(20i4)') i,ntask_cont_from_all(i),
842      &       (itask_cont_from_all(j,i),j=1,ntask_cont_from_all(i)) 
843           enddo
844           write (iout,*)
845           call flush(iout)
846           write (iout,*) "Contact send task map (proc, #tasks, tasks)"
847           do i=0,nfgtasks-1
848             write (iout,'(20i4)') i,ntask_cont_to_all(i),
849      &       (itask_cont_to_all(j,i),j=1,ntask_cont_to_all(i)) 
850           enddo
851           write (iout,*)
852           call flush(iout)
853 C Check if every send will have a matching receive
854           ncheck_to=0
855           ncheck_from=0
856           do i=0,nfgtasks-1
857             ncheck_to=ncheck_to+ntask_cont_to_all(i)
858             ncheck_from=ncheck_from+ntask_cont_from_all(i)
859           enddo
860           write (iout,*) "Control sums",ncheck_from,ncheck_to
861           if (ncheck_from.ne.ncheck_to) then
862             write (iout,*) "Error: #receive differs from #send."
863             write (iout,*) "Terminating program...!"
864             call flush(iout)
865             flag=.false.
866           else
867             flag=.true.
868             do i=0,nfgtasks-1
869               do j=1,ntask_cont_to_all(i)
870                 ii=itask_cont_to_all(j,i)
871                 do k=1,ntask_cont_from_all(ii)
872                   if (itask_cont_from_all(k,ii).eq.i) then
873                     if(lprint)write(iout,*)"Matching send/receive",i,ii
874                     exit
875                   endif
876                 enddo
877                 if (k.eq.ntask_cont_from_all(ii)+1) then
878                   flag=.false.
879                   write (iout,*) "Error: send by",j," to",ii,
880      &            " would have no matching receive"
881                 endif
882               enddo
883             enddo
884           endif
885           if (.not.flag) then
886             write (iout,*) "Unmatched sends; terminating program"
887             call flush(iout)
888           endif
889         endif
890         call MPI_Bcast(flag,1,MPI_LOGICAL,king,FG_COMM,IERROR)
891 c        write (iout,*) "flag broadcast ended flag=",flag
892 c        call flush(iout)
893         if (.not.flag) then
894           call MPI_Finalize(IERROR)
895           stop "Error in INIT_INT_TABLE: unmatched send/receive."
896         endif
897         call MPI_Comm_group(FG_COMM,fg_group,IERR)
898 c        write (iout,*) "MPI_Comm_group ended"
899 c        call flush(iout)
900         call MPI_Group_incl(fg_group,ntask_cont_from+1,
901      &    itask_cont_from(0),CONT_FROM_GROUP,IERR)
902         call MPI_Group_incl(fg_group,ntask_cont_to+1,itask_cont_to(0),
903      &    CONT_TO_GROUP,IERR)
904         do i=1,nat_sent
905           ii=iat_sent(i)
906           iaux=4*(ielend(ii)-ielstart(ii)+1)
907           call MPI_Group_translate_ranks(fg_group,iaux,
908      &      iint_sent(1,ielstart(ii),i),CONT_TO_GROUP, 
909      &      iint_sent_local(1,ielstart(ii),i),IERR )
910 c          write (iout,*) "Ranks translated i=",i
911 c          call flush(iout)
912         enddo
913         iaux=4*(iturn3_end-iturn3_start+1)
914         call MPI_Group_translate_ranks(fg_group,iaux,
915      &      iturn3_sent(1,iturn3_start),CONT_TO_GROUP,
916      &      iturn3_sent_local(1,iturn3_start),IERR)
917         iaux=4*(iturn4_end-iturn4_start+1)
918         call MPI_Group_translate_ranks(fg_group,iaux,
919      &      iturn4_sent(1,iturn4_start),CONT_TO_GROUP,
920      &      iturn4_sent_local(1,iturn4_start),IERR)
921         if (lprint) then
922         write (iout,*) "iint_sent_local"
923         do i=1,nat_sent
924           ii=iat_sent(i)
925           write (iout,'(20i4)') ii,(j,(iint_sent_local(k,j,i),k=1,4),
926      &      j=ielstart(ii),ielend(ii))
927           call flush(iout)
928         enddo
929         write (iout,*) "iturn3_sent_local iturn3_start",iturn3_start,
930      &    " iturn3_end",iturn3_end
931         write (iout,'(20i4)') (i,(iturn3_sent_local(j,i),j=1,4),
932      &      i=iturn3_start,iturn3_end)
933         write (iout,*) "iturn4_sent_local iturn4_start",iturn4_start,
934      &    " iturn4_end",iturn4_end
935         write (iout,'(20i4)') (i,(iturn4_sent_local(j,i),j=1,4),
936      &      i=iturn4_start,iturn4_end)
937         call flush(iout)
938         endif
939         call MPI_Group_free(fg_group,ierr)
940         call MPI_Group_free(cont_from_group,ierr)
941         call MPI_Group_free(cont_to_group,ierr)
942         call MPI_Type_contiguous(3,MPI_DOUBLE_PRECISION,MPI_UYZ,IERROR)
943         call MPI_Type_commit(MPI_UYZ,IERROR)
944         call MPI_Type_contiguous(18,MPI_DOUBLE_PRECISION,MPI_UYZGRAD,
945      &    IERROR)
946         call MPI_Type_commit(MPI_UYZGRAD,IERROR)
947         call MPI_Type_contiguous(2,MPI_DOUBLE_PRECISION,MPI_MU,IERROR)
948         call MPI_Type_commit(MPI_MU,IERROR)
949         call MPI_Type_contiguous(4,MPI_DOUBLE_PRECISION,MPI_MAT1,IERROR)
950         call MPI_Type_commit(MPI_MAT1,IERROR)
951         call MPI_Type_contiguous(8,MPI_DOUBLE_PRECISION,MPI_MAT2,IERROR)
952         call MPI_Type_commit(MPI_MAT2,IERROR)
953         call MPI_Type_contiguous(6,MPI_DOUBLE_PRECISION,MPI_THET,IERROR)
954         call MPI_Type_commit(MPI_THET,IERROR)
955         call MPI_Type_contiguous(9,MPI_DOUBLE_PRECISION,MPI_GAM,IERROR)
956         call MPI_Type_commit(MPI_GAM,IERROR)
957 #ifndef MATGATHER
958 c 9/22/08 Derived types to send matrices which appear in correlation terms
959         do i=0,nfgtasks-1
960           if (ivec_count(i).eq.ivec_count(0)) then
961             lentyp(i)=0
962           else
963             lentyp(i)=1
964           endif
965         enddo
966         do ind_typ=lentyp(0),lentyp(nfgtasks-1)
967         if (ind_typ.eq.0) then
968           ichunk=ivec_count(0)
969         else
970           ichunk=ivec_count(1)
971         endif
972 c        do i=1,4
973 c          blocklengths(i)=4
974 c        enddo
975 c        displs(1)=0
976 c        do i=2,4
977 c          displs(i)=displs(i-1)+blocklengths(i-1)*maxres
978 c        enddo
979 c        do i=1,4
980 c          blocklengths(i)=blocklengths(i)*ichunk
981 c        enddo
982 c        write (iout,*) "blocklengths and displs"
983 c        do i=1,4
984 c          write (iout,*) i,blocklengths(i),displs(i)
985 c        enddo
986 c        call flush(iout)
987 c        call MPI_Type_indexed(4,blocklengths(1),displs(1),
988 c     &    MPI_DOUBLE_PRECISION,MPI_ROTAT1(ind_typ),IERROR)
989 c        call MPI_Type_commit(MPI_ROTAT1(ind_typ),IERROR)
990 c        write (iout,*) "MPI_ROTAT1",MPI_ROTAT1 
991 c        do i=1,4
992 c          blocklengths(i)=2
993 c        enddo
994 c        displs(1)=0
995 c        do i=2,4
996 c          displs(i)=displs(i-1)+blocklengths(i-1)*maxres
997 c        enddo
998 c        do i=1,4
999 c          blocklengths(i)=blocklengths(i)*ichunk
1000 c        enddo
1001 c        write (iout,*) "blocklengths and displs"
1002 c        do i=1,4
1003 c          write (iout,*) i,blocklengths(i),displs(i)
1004 c        enddo
1005 c        call flush(iout)
1006 c        call MPI_Type_indexed(4,blocklengths(1),displs(1),
1007 c     &    MPI_DOUBLE_PRECISION,MPI_ROTAT2(ind_typ),IERROR)
1008 c        call MPI_Type_commit(MPI_ROTAT2(ind_typ),IERROR)
1009 c        write (iout,*) "MPI_ROTAT2",MPI_ROTAT2 
1010         do i=1,8
1011           blocklengths(i)=2
1012         enddo
1013         displs(1)=0
1014         do i=2,8
1015           displs(i)=displs(i-1)+blocklengths(i-1)*maxres
1016         enddo
1017         do i=1,15
1018           blocklengths(i)=blocklengths(i)*ichunk
1019         enddo
1020         call MPI_Type_indexed(8,blocklengths,displs,
1021      &    MPI_DOUBLE_PRECISION,MPI_PRECOMP11(ind_typ),IERROR)
1022         call MPI_Type_commit(MPI_PRECOMP11(ind_typ),IERROR)
1023         do i=1,8
1024           blocklengths(i)=4
1025         enddo
1026         displs(1)=0
1027         do i=2,8
1028           displs(i)=displs(i-1)+blocklengths(i-1)*maxres
1029         enddo
1030         do i=1,15
1031           blocklengths(i)=blocklengths(i)*ichunk
1032         enddo
1033         call MPI_Type_indexed(8,blocklengths,displs,
1034      &    MPI_DOUBLE_PRECISION,MPI_PRECOMP12(ind_typ),IERROR)
1035         call MPI_Type_commit(MPI_PRECOMP12(ind_typ),IERROR)
1036         do i=1,6
1037           blocklengths(i)=4
1038         enddo
1039         displs(1)=0
1040         do i=2,6
1041           displs(i)=displs(i-1)+blocklengths(i-1)*maxres
1042         enddo
1043         do i=1,6
1044           blocklengths(i)=blocklengths(i)*ichunk
1045         enddo
1046         call MPI_Type_indexed(6,blocklengths,displs,
1047      &    MPI_DOUBLE_PRECISION,MPI_PRECOMP22(ind_typ),IERROR)
1048         call MPI_Type_commit(MPI_PRECOMP22(ind_typ),IERROR)
1049         do i=1,2
1050           blocklengths(i)=8
1051         enddo
1052         displs(1)=0
1053         do i=2,2
1054           displs(i)=displs(i-1)+blocklengths(i-1)*maxres
1055         enddo
1056         do i=1,2
1057           blocklengths(i)=blocklengths(i)*ichunk
1058         enddo
1059         call MPI_Type_indexed(2,blocklengths,displs,
1060      &    MPI_DOUBLE_PRECISION,MPI_PRECOMP23(ind_typ),IERROR)
1061         call MPI_Type_commit(MPI_PRECOMP23(ind_typ),IERROR)
1062         do i=1,4
1063           blocklengths(i)=1
1064         enddo
1065         displs(1)=0
1066         do i=2,4
1067           displs(i)=displs(i-1)+blocklengths(i-1)*maxres
1068         enddo
1069         do i=1,4
1070           blocklengths(i)=blocklengths(i)*ichunk
1071         enddo
1072         call MPI_Type_indexed(4,blocklengths,displs,
1073      &    MPI_DOUBLE_PRECISION,MPI_ROTAT_OLD(ind_typ),IERROR)
1074         call MPI_Type_commit(MPI_ROTAT_OLD(ind_typ),IERROR)
1075         enddo
1076 #endif
1077       endif
1078       iint_start=ivec_start+1
1079       iint_end=ivec_end+1
1080       do i=0,nfgtasks-1
1081           iint_count(i)=ivec_count(i)
1082           iint_displ(i)=ivec_displ(i)
1083           ivec_displ(i)=ivec_displ(i)-1
1084           iset_displ(i)=iset_displ(i)-1
1085           ithet_displ(i)=ithet_displ(i)-1
1086           iphi_displ(i)=iphi_displ(i)-1
1087           iphi1_displ(i)=iphi1_displ(i)-1
1088           ibond_displ(i)=ibond_displ(i)-1
1089       enddo
1090       if (nfgtasks.gt.1 .and. fg_rank.eq.king 
1091      &     .and. (me.eq.0 .or. out1file)) then
1092         write (iout,*) "IVEC_DISPL, IVEC_COUNT, ISET_START, ISET_COUNT"
1093         do i=0,nfgtasks-1
1094           write (iout,*) i,ivec_displ(i),ivec_count(i),iset_displ(i),
1095      &      iset_count(i)
1096         enddo
1097         write (iout,*) "iphi_start",iphi_start," iphi_end",iphi_end,
1098      &    " iphi1_start",iphi1_start," iphi1_end",iphi1_end
1099         write (iout,*)"IPHI_COUNT, IPHI_DISPL, IPHI1_COUNT, IPHI1_DISPL"
1100         do i=0,nfgtasks-1
1101           write (iout,*) i,iphi_count(i),iphi_displ(i),iphi1_count(i),
1102      &      iphi1_displ(i)
1103         enddo
1104         write(iout,'(i10,a,i10,a,i10,a/a,i3,a)') n_sc_int_tot,' SC-SC ',
1105      & nele_int_tot,' electrostatic and ',nscp_int_tot,
1106      & ' SC-p interactions','were distributed among',nfgtasks,
1107      & ' fine-grain processors.'
1108       endif
1109 #else
1110       loc_start=2
1111       loc_end=nres-1
1112       ithet_start=3 
1113       ithet_end=nres
1114       iturn3_start=nnt
1115       iturn3_end=nct-3
1116       iturn4_start=nnt
1117       iturn4_end=nct-4
1118       iphi_start=nnt+3
1119       iphi_end=nct
1120       iphi1_start=4
1121       iphi1_end=nres
1122       idihconstr_start=1
1123       idihconstr_end=ndih_constr
1124       iphid_start=iphi_start
1125       iphid_end=iphi_end-1
1126       itau_start=4
1127       itau_end=nres
1128       ibond_start=2
1129       ibond_end=nres-1
1130       ibondp_start=nnt+1
1131       ibondp_end=nct
1132       ivec_start=1
1133       ivec_end=nres-1
1134       iset_start=3
1135       iset_end=nres+1
1136       iint_start=2
1137       iint_end=nres-1
1138 #endif
1139       return
1140       end 
1141 #ifdef MPI
1142 c---------------------------------------------------------------------------
1143       subroutine add_int(ii,jj,itask,ntask_cont_to,itask_cont_to,flag)
1144       implicit none
1145       include "DIMENSIONS"
1146       include "COMMON.INTERACT"
1147       include "COMMON.SETUP"
1148       include "COMMON.IOUNITS"
1149       integer ii,jj,itask(4),ntask_cont_to,itask_cont_to(0:MaxProcs-1)
1150       logical flag
1151       integer iturn3_start_all,iturn3_end_all,iturn4_start_all,
1152      & iturn4_end_all,iatel_s_all,iatel_e_all,ielstart_all,ielend_all
1153       common /przechowalnia/ iturn3_start_all(0:MaxProcs),
1154      & iturn3_end_all(0:MaxProcs),iturn4_start_all(0:MaxProcs),
1155      & iturn4_end_all(0:MaxProcs),iatel_s_all(0:MaxProcs),
1156      & iatel_e_all(0:MaxProcs),ielstart_all(maxres,0:MaxProcs-1),
1157      & ielend_all(maxres,0:MaxProcs-1)
1158       integer iproc,isent,k,l
1159 c Determines whether to send interaction ii,jj to other processors; a given
1160 c interaction can be sent to at most 2 processors.
1161 c Sets flag=.true. if interaction ii,jj needs to be sent to at least 
1162 c one processor, otherwise flag is unchanged from the input value.
1163       isent=0
1164       itask(1)=fg_rank
1165       itask(2)=fg_rank
1166       itask(3)=fg_rank
1167       itask(4)=fg_rank
1168 c      write (iout,*) "ii",ii," jj",jj
1169 c Loop over processors to check if anybody could need interaction ii,jj
1170       do iproc=0,fg_rank-1
1171 c Check if the interaction matches any turn3 at iproc
1172         do k=iturn3_start_all(iproc),iturn3_end_all(iproc)
1173           l=k+2
1174           if (k.eq.ii-1 .and. l.eq.jj-1 .or. k.eq.ii-1 .and. l.eq.jj+1
1175      &   .or. k.eq.ii+1 .and. l.eq.jj+1 .or. k.eq.ii+1 .and. l.eq.jj-1)
1176      &    then 
1177 c            write (iout,*) "turn3 to iproc",iproc," ij",ii,jj,"kl",k,l
1178 c            call flush(iout)
1179             flag=.true.
1180             if (iproc.ne.itask(1).and.iproc.ne.itask(2)
1181      &        .and.iproc.ne.itask(3).and.iproc.ne.itask(4)) then
1182               isent=isent+1
1183               itask(isent)=iproc
1184               call add_task(iproc,ntask_cont_to,itask_cont_to)
1185             endif
1186           endif
1187         enddo
1188 C Check if the interaction matches any turn4 at iproc
1189         do k=iturn4_start_all(iproc),iturn4_end_all(iproc)
1190           l=k+3
1191           if (k.eq.ii-1 .and. l.eq.jj-1 .or. k.eq.ii-1 .and. l.eq.jj+1
1192      &   .or. k.eq.ii+1 .and. l.eq.jj+1 .or. k.eq.ii+1 .and. l.eq.jj-1)
1193      &    then 
1194 c            write (iout,*) "turn3 to iproc",iproc," ij",ii,jj," kl",k,l
1195 c            call flush(iout)
1196             flag=.true.
1197             if (iproc.ne.itask(1).and.iproc.ne.itask(2)
1198      &        .and.iproc.ne.itask(3).and.iproc.ne.itask(4)) then
1199               isent=isent+1
1200               itask(isent)=iproc
1201               call add_task(iproc,ntask_cont_to,itask_cont_to)
1202             endif
1203           endif
1204         enddo
1205         if (iatel_s_all(iproc).gt.0 .and. iatel_e_all(iproc).gt.0 .and. 
1206      &  iatel_s_all(iproc).le.ii-1 .and. iatel_e_all(iproc).ge.ii-1)then
1207           if (ielstart_all(ii-1,iproc).le.jj-1.and.
1208      &        ielend_all(ii-1,iproc).ge.jj-1) then
1209             flag=.true.
1210             if (iproc.ne.itask(1).and.iproc.ne.itask(2)
1211      &        .and.iproc.ne.itask(3).and.iproc.ne.itask(4)) then
1212               isent=isent+1
1213               itask(isent)=iproc
1214               call add_task(iproc,ntask_cont_to,itask_cont_to)
1215             endif
1216           endif
1217           if (ielstart_all(ii-1,iproc).le.jj+1.and.
1218      &        ielend_all(ii-1,iproc).ge.jj+1) then
1219             flag=.true.
1220             if (iproc.ne.itask(1).and.iproc.ne.itask(2)
1221      &        .and.iproc.ne.itask(3).and.iproc.ne.itask(4)) then
1222               isent=isent+1
1223               itask(isent)=iproc
1224               call add_task(iproc,ntask_cont_to,itask_cont_to)
1225             endif
1226           endif
1227         endif
1228       enddo
1229       return
1230       end
1231 c---------------------------------------------------------------------------
1232       subroutine add_int_from(ii,jj,ntask_cont_from,itask_cont_from)
1233       implicit none
1234       include "DIMENSIONS"
1235       include "COMMON.INTERACT"
1236       include "COMMON.SETUP"
1237       include "COMMON.IOUNITS"
1238       integer ii,jj,itask(2),ntask_cont_from,
1239      & itask_cont_from(0:MaxProcs-1)
1240       logical flag
1241       integer iturn3_start_all,iturn3_end_all,iturn4_start_all,
1242      & iturn4_end_all,iatel_s_all,iatel_e_all,ielstart_all,ielend_all
1243       common /przechowalnia/ iturn3_start_all(0:MaxProcs),
1244      & iturn3_end_all(0:MaxProcs),iturn4_start_all(0:MaxProcs),
1245      & iturn4_end_all(0:MaxProcs),iatel_s_all(0:MaxProcs),
1246      & iatel_e_all(0:MaxProcs),ielstart_all(maxres,0:MaxProcs-1),
1247      & ielend_all(maxres,0:MaxProcs-1)
1248       integer iproc,k,l
1249       do iproc=fg_rank+1,nfgtasks-1
1250         do k=iturn3_start_all(iproc),iturn3_end_all(iproc)
1251           l=k+2
1252           if (k.eq.ii+1 .and. l.eq.jj+1 .or. k.eq.ii+1.and.l.eq.jj-1 
1253      &   .or. k.eq.ii-1 .and. l.eq.jj-1 .or. k.eq.ii-1 .and. l.eq.jj+1) 
1254      &    then
1255 c            write (iout,*)"turn3 from iproc",iproc," ij",ii,jj," kl",k,l
1256             call add_task(iproc,ntask_cont_from,itask_cont_from)
1257           endif
1258         enddo 
1259         do k=iturn4_start_all(iproc),iturn4_end_all(iproc)
1260           l=k+3
1261           if (k.eq.ii+1 .and. l.eq.jj+1 .or. k.eq.ii+1.and.l.eq.jj-1 
1262      &   .or. k.eq.ii-1 .and. l.eq.jj-1 .or. k.eq.ii-1 .and. l.eq.jj+1) 
1263      &    then
1264 c            write (iout,*)"turn4 from iproc",iproc," ij",ii,jj," kl",k,l
1265             call add_task(iproc,ntask_cont_from,itask_cont_from)
1266           endif
1267         enddo 
1268         if (iatel_s_all(iproc).gt.0 .and. iatel_e_all(iproc).gt.0) then
1269           if (ii+1.ge.iatel_s_all(iproc).and.ii+1.le.iatel_e_all(iproc))
1270      &    then
1271             if (jj+1.ge.ielstart_all(ii+1,iproc).and.
1272      &          jj+1.le.ielend_all(ii+1,iproc)) then
1273               call add_task(iproc,ntask_cont_from,itask_cont_from)
1274             endif            
1275             if (jj-1.ge.ielstart_all(ii+1,iproc).and.
1276      &          jj-1.le.ielend_all(ii+1,iproc)) then
1277               call add_task(iproc,ntask_cont_from,itask_cont_from)
1278             endif
1279           endif
1280           if (ii-1.ge.iatel_s_all(iproc).and.ii-1.le.iatel_e_all(iproc))
1281      &    then
1282             if (jj-1.ge.ielstart_all(ii-1,iproc).and.
1283      &          jj-1.le.ielend_all(ii-1,iproc)) then
1284               call add_task(iproc,ntask_cont_from,itask_cont_from)
1285             endif
1286             if (jj+1.ge.ielstart_all(ii-1,iproc).and.
1287      &          jj+1.le.ielend_all(ii-1,iproc)) then
1288                call add_task(iproc,ntask_cont_from,itask_cont_from)
1289             endif
1290           endif
1291         endif
1292       enddo
1293       return
1294       end
1295 c---------------------------------------------------------------------------
1296       subroutine add_task(iproc,ntask_cont,itask_cont)
1297       implicit none
1298       include "DIMENSIONS"
1299       integer iproc,ntask_cont,itask_cont(0:MaxProcs-1)
1300       integer ii
1301       do ii=1,ntask_cont
1302         if (itask_cont(ii).eq.iproc) return
1303       enddo
1304       ntask_cont=ntask_cont+1
1305       itask_cont(ntask_cont)=iproc
1306       return
1307       end
1308 c---------------------------------------------------------------------------
1309       subroutine int_bounds(total_ints,lower_bound,upper_bound)
1310       implicit real*8 (a-h,o-z)
1311       include 'DIMENSIONS'
1312       include 'mpif.h'
1313       include 'COMMON.SETUP'
1314       integer total_ints,lower_bound,upper_bound
1315       integer int4proc(0:max_fg_procs),sint4proc(0:max_fg_procs)
1316       nint=total_ints/nfgtasks
1317       do i=1,nfgtasks
1318         int4proc(i-1)=nint
1319       enddo
1320       nexcess=total_ints-nint*nfgtasks
1321       do i=1,nexcess
1322         int4proc(nfgtasks-i)=int4proc(nfgtasks-i)+1
1323       enddo
1324       lower_bound=0
1325       do i=0,fg_rank-1
1326         lower_bound=lower_bound+int4proc(i)
1327       enddo 
1328       upper_bound=lower_bound+int4proc(fg_rank)
1329       lower_bound=lower_bound+1
1330       return
1331       end
1332 c---------------------------------------------------------------------------
1333       subroutine int_bounds1(total_ints,lower_bound,upper_bound)
1334       implicit real*8 (a-h,o-z)
1335       include 'DIMENSIONS'
1336       include 'mpif.h'
1337       include 'COMMON.SETUP'
1338       integer total_ints,lower_bound,upper_bound
1339       integer int4proc(0:max_fg_procs),sint4proc(0:max_fg_procs)
1340       nint=total_ints/nfgtasks1
1341       do i=1,nfgtasks1
1342         int4proc(i-1)=nint
1343       enddo
1344       nexcess=total_ints-nint*nfgtasks1
1345       do i=1,nexcess
1346         int4proc(nfgtasks1-i)=int4proc(nfgtasks1-i)+1
1347       enddo
1348       lower_bound=0
1349       do i=0,fg_rank1-1
1350         lower_bound=lower_bound+int4proc(i)
1351       enddo 
1352       upper_bound=lower_bound+int4proc(fg_rank1)
1353       lower_bound=lower_bound+1
1354       return
1355       end
1356 c---------------------------------------------------------------------------
1357       subroutine int_partition(int_index,lower_index,upper_index,atom,
1358      & at_start,at_end,first_atom,last_atom,int_gr,jat_start,jat_end,*)
1359       implicit real*8 (a-h,o-z)
1360       include 'DIMENSIONS'
1361       include 'COMMON.IOUNITS'
1362       integer int_index,lower_index,upper_index,atom,at_start,at_end,
1363      & first_atom,last_atom,int_gr,jat_start,jat_end
1364       logical lprn
1365       lprn=.false.
1366       if (lprn) write (iout,*) 'int_index=',int_index
1367       int_index_old=int_index
1368       int_index=int_index+last_atom-first_atom+1
1369       if (lprn) 
1370      &   write (iout,*) 'int_index=',int_index,
1371      &               ' int_index_old',int_index_old,
1372      &               ' lower_index=',lower_index,
1373      &               ' upper_index=',upper_index,
1374      &               ' atom=',atom,' first_atom=',first_atom,
1375      &               ' last_atom=',last_atom
1376       if (int_index.ge.lower_index) then
1377         int_gr=int_gr+1
1378         if (at_start.eq.0) then
1379           at_start=atom
1380           jat_start=first_atom-1+lower_index-int_index_old
1381         else
1382           jat_start=first_atom
1383         endif
1384         if (lprn) write (iout,*) 'jat_start',jat_start
1385         if (int_index.ge.upper_index) then
1386           at_end=atom
1387           jat_end=first_atom-1+upper_index-int_index_old
1388           return1
1389         else
1390           jat_end=last_atom
1391         endif
1392         if (lprn) write (iout,*) 'jat_end',jat_end
1393       endif
1394       return
1395       end
1396 #endif
1397 c------------------------------------------------------------------------------
1398       subroutine hpb_partition
1399       implicit real*8 (a-h,o-z)
1400       include 'DIMENSIONS'
1401 #ifdef MPI
1402       include 'mpif.h'
1403 #endif
1404       include 'COMMON.SBRIDGE'
1405       include 'COMMON.IOUNITS'
1406       include 'COMMON.SETUP'
1407       include 'COMMON.CONTROL'
1408 #ifdef MPI
1409       call int_bounds(nhpb,link_start,link_end)
1410       if (.not. out1file) 
1411      &  write (iout,*) 'Processor',fg_rank,' CG group',kolor,
1412      &  ' absolute rank',MyRank,
1413      &  ' nhpb',nhpb,' link_start=',link_start,
1414      &  ' link_end',link_end
1415 #else
1416       link_start=1
1417       link_end=nhpb
1418 #endif
1419       return
1420       end