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