2 implicit real*8 (a-h,o-z)
7 & /'pool','chain regrow','multi-bond','phi','theta','side chain',
9 c Conversion from poises to molecular unit and the gas constant
10 data cPoise /2.9361d0/, Rb /0.001986d0/
12 c--------------------------------------------------------------------------
15 C Define constants and zero out tables.
17 implicit real*8 (a-h,o-z)
25 cMS$ATTRIBUTES C :: proc_proc
28 include 'COMMON.IOUNITS'
29 include 'COMMON.CHAIN'
30 include 'COMMON.INTERACT'
32 include 'COMMON.LOCAL'
33 include 'COMMON.TORSION'
34 include 'COMMON.FFIELD'
35 include 'COMMON.SBRIDGE'
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
44 c real*8 text1 /'initial_i'/
62 C The following is just to define auxiliary variables used in angle conversion
99 crc for write_rmsbank1
101 cdr include secondary structure prediction bias
104 C CSA I/O units (separated from others especially for Jooyoung)
115 icsa_bank_reminimized=38
118 crc for ifc error 118
121 C Set default weights of the energy terms.
132 c print '(a,$)','Inside initialize'
133 c call memmon_print_usage()
183 gaussc(l,k,j,i)=0.0D0
204 C Initialize the bridge arrays
223 C Initialize variables used in minimization.
232 C Initialize the variables responsible for the mode of gradient storage.
237 C Initialize constants used to split the energy into long- and short-range
243 nprint_ene=nprint_ene-1
247 c-------------------------------------------------------------------------
249 implicit real*8 (a-h,o-z)
251 include 'COMMON.NAMES'
252 include 'COMMON.FFIELD'
254 &'CYS','MET','PHE','ILE','LEU','VAL','TRP','TYR','ALA','GLY','THR',
255 &'SER','GLN','ASN','GLU','ASP','HIS','ARG','LYS','PRO','D'/
257 &'C','M','F','I','L','V','W','Y','A','G','T',
258 &'S','Q','N','E','D','H','R','K','P','X'/
259 data potname /'LJ','LJK','BP','GB','GBV'/
261 & "EVDW SC-SC","EVDW2 SC-p","EES p-p","ECORR4 ","ECORR5 ",
262 & "ECORR6 ","EELLO ","ETURN3 ","ETURN4 ","ETURN6 ",
263 & "EBE bend","ESC SCloc","ETORS ","ETORSD ","EHPB ","EVDWPP ",
264 & "ESTR ","EVDW2_14 ","UCONST ", " ","ESCCOR"/
266 & "WSC","WSCP","WELEC","WCORR","WCORR5","WCORR6","WEL_LOC",
267 & "WTURN3","WTURN4","WTURN6","WANG","WSCLOC","WTOR","WTORD",
268 & "WSTRAIN","WVDWPP","WBOND","SCAL14"," "," ","WSCCOR"/
270 data print_order/1,2,3,11,12,13,14,4,5,6,7,8,9,10,19,18,15,17,16,
273 c---------------------------------------------------------------------------
274 subroutine init_int_table
275 implicit real*8 (a-h,o-z)
279 integer blocklengths(15),displs(15)
281 include 'COMMON.CONTROL'
282 include 'COMMON.SETUP'
283 include 'COMMON.CHAIN'
284 include 'COMMON.INTERACT'
285 include 'COMMON.LOCAL'
286 include 'COMMON.SBRIDGE'
287 include 'COMMON.TORCNSTR'
288 include 'COMMON.IOUNITS'
289 include 'COMMON.DERIV'
290 include 'COMMON.CONTACTS'
291 common /przechowalnia/ iturn3_start_all(0:max_fg_procs),
292 & iturn3_end_all(0:max_fg_procs),iturn4_start_all(0:max_fg_procs),
293 & iturn4_end_all(0:max_fg_procs),iatel_s_all(0:max_fg_procs),
294 &iatel_e_all(0:max_fg_procs),ielstart_all(maxres,0:max_fg_procs-1),
295 & ielend_all(maxres,0:max_fg_procs-1),
296 & ntask_cont_from_all(0:max_fg_procs-1),
297 & itask_cont_from_all(0:max_fg_procs-1,0:max_fg_procs-1),
298 & ntask_cont_to_all(0:max_fg_procs-1),
299 & itask_cont_to_all(0:max_fg_procs-1,0:max_fg_procs-1)
300 integer FG_GROUP,CONT_FROM_GROUP,CONT_TO_GROUP
301 logical scheck,lprint,flag
303 integer my_sc_int(0:max_fg_Procs-1),my_sc_intt(0:max_fg_Procs),
304 & my_ele_int(0:max_fg_Procs-1),my_ele_intt(0:max_fg_Procs)
305 C... Determine the numbers of start and end SC-SC interaction
306 C... to deal with by current processor.
308 itask_cont_from(i)=fg_rank
309 itask_cont_to(i)=fg_rank
313 &write (iout,*) 'INIT_INT_TABLE nres=',nres,' nnt=',nnt,' nct=',nct
314 n_sc_int_tot=(nct-nnt+1)*(nct-nnt)/2-nss
315 call int_bounds(n_sc_int_tot,my_sc_inds,my_sc_inde)
317 & write (iout,*) 'Processor',fg_rank,' CG group',kolor,
318 & ' absolute rank',MyRank,
319 & ' n_sc_int_tot',n_sc_int_tot,' my_sc_inds=',my_sc_inds,
320 & ' my_sc_inde',my_sc_inde
340 cd write (iout,*) 'ns=',ns,' nss=',nss,' ihpb,jhpb',
341 cd & (ihpb(i),jhpb(i),i=1,nss)
346 if (ihpb(ii).eq.i+nres) then
353 cd write (iout,*) 'i=',i,' scheck=',scheck,' jj=',jj
357 c write (iout,*) 'jj=i+1'
358 call int_partition(ind_scint,my_sc_inds,my_sc_inde,i,
359 & iatsc_s,iatsc_e,i+2,nct,nint_gr(i),istart(i,1),iend(i,1),*12)
365 else if (jj.eq.nct) then
367 c write (iout,*) 'jj=nct'
368 call int_partition(ind_scint,my_sc_inds,my_sc_inde,i,
369 & iatsc_s,iatsc_e,i+1,nct-1,nint_gr(i),istart(i,1),iend(i,1),*12)
377 call int_partition(ind_scint,my_sc_inds,my_sc_inde,i,
378 & iatsc_s,iatsc_e,i+1,jj-1,nint_gr(i),istart(i,1),iend(i,1),*12)
380 call int_partition(ind_scint,my_sc_inds,my_sc_inde,i,
381 & iatsc_s,iatsc_e,jj+1,nct,nint_gr(i),istart(i,ii),iend(i,ii),*12)
392 call int_partition(ind_scint,my_sc_inds,my_sc_inde,i,
393 & iatsc_s,iatsc_e,i+1,nct,nint_gr(i),istart(i,1),iend(i,1),*12)
398 ind_scint=ind_scint+nct-i
402 ind_scint_old=ind_scint
411 if (lprint) write (*,*) 'Processor',fg_rank,' CG Group',kolor,
412 & ' absolute rank',myrank,' iatsc_s=',iatsc_s,' iatsc_e=',iatsc_e
415 write (iout,'(a)') 'Interaction array:'
417 write (iout,'(i3,2(2x,2i3))')
418 & i,(istart(i,iint),iend(i,iint),iint=1,nint_gr(i))
423 C Now partition the electrostatic-interaction array
425 nele_int_tot=(npept-ispp)*(npept-ispp+1)/2
426 call int_bounds(nele_int_tot,my_ele_inds,my_ele_inde)
428 & write (*,*) 'Processor',fg_rank,' CG group',kolor,
429 & ' absolute rank',MyRank,
430 & ' nele_int_tot',nele_int_tot,' my_ele_inds=',my_ele_inds,
431 & ' my_ele_inde',my_ele_inde
438 call int_partition(ind_eleint,my_ele_inds,my_ele_inde,i,
439 & iatel_s,iatel_e,i+ispp,nct-1,ijunk,ielstart(i),ielend(i),*13)
442 if (iatel_s.eq.0) iatel_s=1
443 nele_int_tot_vdw=(npept-2)*(npept-2+1)/2
444 c write (iout,*) "nele_int_tot_vdw",nele_int_tot_vdw
445 call int_bounds(nele_int_tot_vdw,my_ele_inds_vdw,my_ele_inde_vdw)
446 c write (iout,*) "my_ele_inds_vdw",my_ele_inds_vdw,
447 c & " my_ele_inde_vdw",my_ele_inde_vdw
454 call int_partition(ind_eleint_vdw,my_ele_inds_vdw,
456 & iatel_s_vdw,iatel_e_vdw,i+2,nct-1,ijunk,ielstart_vdw(i),
458 c write (iout,*) i," ielstart_vdw",ielstart_vdw(i),
459 c & " ielend_vdw",ielend_vdw(i)
461 if (iatel_s_vdw.eq.0) iatel_s_vdw=1
472 do i=iatel_s_vdw,iatel_e_vdw
478 write (*,'(a)') 'Processor',fg_rank,' CG group',kolor,
479 & ' absolute rank',MyRank
480 write (iout,*) 'Electrostatic interaction array:'
482 write (iout,'(i3,2(2x,2i3))') i,ielstart(i),ielend(i)
487 C Partition the SC-p interaction array
489 nscp_int_tot=(npept-iscp+1)*(npept-iscp+1)
490 call int_bounds(nscp_int_tot,my_scp_inds,my_scp_inde)
491 if (lprint) write (iout,*) 'Processor',fg_rank,' CG group',kolor,
492 & ' absolute rank',myrank,
493 & ' nscp_int_tot',nscp_int_tot,' my_scp_inds=',my_scp_inds,
494 & ' my_scp_inde',my_scp_inde
500 if (i.lt.nnt+iscp) then
501 cd write (iout,*) 'i.le.nnt+iscp'
502 call int_partition(ind_scpint,my_scp_inds,my_scp_inde,i,
503 & iatscp_s,iatscp_e,i+iscp,nct,nscp_gr(i),iscpstart(i,1),
505 else if (i.gt.nct-iscp) then
506 cd write (iout,*) 'i.gt.nct-iscp'
507 call int_partition(ind_scpint,my_scp_inds,my_scp_inde,i,
508 & iatscp_s,iatscp_e,nnt,i-iscp,nscp_gr(i),iscpstart(i,1),
511 call int_partition(ind_scpint,my_scp_inds,my_scp_inde,i,
512 & iatscp_s,iatscp_e,nnt,i-iscp,nscp_gr(i),iscpstart(i,1),
515 call int_partition(ind_scpint,my_scp_inds,my_scp_inde,i,
516 & iatscp_s,iatscp_e,i+iscp,nct,nscp_gr(i),iscpstart(i,ii),
525 if (i.lt.nnt+iscp) then
527 iscpstart(i,1)=i+iscp
529 elseif (i.gt.nct-iscp) then
537 iscpstart(i,2)=i+iscp
543 write (iout,'(a)') 'SC-p interaction array:'
544 do i=iatscp_s,iatscp_e
545 write (iout,'(i3,2(2x,2i3))')
546 & i,(iscpstart(i,j),iscpend(i,j),j=1,nscp_gr(i))
549 C Partition local interactions
551 call int_bounds(nres-2,loc_start,loc_end)
552 loc_start=loc_start+1
554 call int_bounds(nres-2,ithet_start,ithet_end)
555 ithet_start=ithet_start+2
556 ithet_end=ithet_end+2
557 call int_bounds(nct-nnt-2,iturn3_start,iturn3_end)
558 iturn3_start=iturn3_start+nnt
559 iphi_start=iturn3_start+2
560 iturn3_end=iturn3_end+nnt
561 iphi_end=iturn3_end+2
562 iturn3_start=iturn3_start-1
563 iturn3_end=iturn3_end-1
564 call int_bounds(nres-3,iphi1_start,iphi1_end)
565 iphi1_start=iphi1_start+3
566 iphi1_end=iphi1_end+3
567 call int_bounds(nct-nnt-3,iturn4_start,iturn4_end)
568 iturn4_start=iturn4_start+nnt
569 iphid_start=iturn4_start+2
570 iturn4_end=iturn4_end+nnt
571 iphid_end=iturn4_end+2
572 iturn4_start=iturn4_start-1
573 iturn4_end=iturn4_end-1
574 call int_bounds(nres-2,ibond_start,ibond_end)
575 ibond_start=ibond_start+1
576 ibond_end=ibond_end+1
577 call int_bounds(nct-nnt,ibondp_start,ibondp_end)
578 ibondp_start=ibondp_start+nnt
579 ibondp_end=ibondp_end+nnt
580 call int_bounds1(nres-1,ivec_start,ivec_end)
581 c print *,"Processor",myrank,fg_rank,fg_rank1,
582 c & " ivec_start",ivec_start," ivec_end",ivec_end
583 iset_start=loc_start+2
585 if (ndih_constr.eq.0) then
589 call int_bounds(ndih_constr,idihconstr_start,idihconstr_end)
591 c nsumgrad=(nres-nnt)*(nres-nnt+1)/2
593 nsumgrad=(nres-nnt)*(nres-nnt+1)/2
595 call int_bounds(nsumgrad,ngrad_start,ngrad_end)
596 igrad_start=((2*nlen+1)
597 & -sqrt(float((2*nlen-1)**2-8*(ngrad_start-1))))/2
598 jgrad_start(igrad_start)=
599 & ngrad_start-(2*nlen-igrad_start)*(igrad_start-1)/2
601 jgrad_end(igrad_start)=nres
602 igrad_end=((2*nlen+1)
603 & -sqrt(float((2*nlen-1)**2-8*(ngrad_end-1))))/2
604 if (igrad_end.gt.igrad_start) jgrad_start(igrad_end)=igrad_end+1
605 jgrad_end(igrad_end)=ngrad_end-(2*nlen-igrad_end)*(igrad_end-1)/2
607 do i=igrad_start+1,igrad_end-1
612 write (*,*) 'Processor:',fg_rank,' CG group',kolor,
613 & ' absolute rank',myrank,
614 & ' loc_start',loc_start,' loc_end',loc_end,
615 & ' ithet_start',ithet_start,' ithet_end',ithet_end,
616 & ' iphi_start',iphi_start,' iphi_end',iphi_end,
617 & ' iphid_start',iphid_start,' iphid_end',iphid_end,
618 & ' ibond_start',ibond_start,' ibond_end',ibond_end,
619 & ' ibondp_start',ibondp_start,' ibondp_end',ibondp_end,
620 & ' iturn3_start',iturn3_start,' iturn3_end',iturn3_end,
621 & ' iturn4_start',iturn4_start,' iturn4_end',iturn4_end,
622 & ' ivec_start',ivec_start,' ivec_end',ivec_end,
623 & ' iset_start',iset_start,' iset_end',iset_end,
624 & ' idihconstr_start',idihconstr_start,' idihconstr_end',
626 write (*,*) 'Processor:',fg_rank,myrank,' igrad_start',
627 & igrad_start,' igrad_end',igrad_end,' ngrad_start',ngrad_start,
628 & ' ngrad_end',ngrad_end
629 do i=igrad_start,igrad_end
630 write(*,*) 'Processor:',fg_rank,myrank,i,
631 & jgrad_start(i),jgrad_end(i)
634 if (nfgtasks.gt.1) then
635 call MPI_Allgather(ivec_start,1,MPI_INTEGER,ivec_displ(0),1,
636 & MPI_INTEGER,FG_COMM1,IERROR)
637 iaux=ivec_end-ivec_start+1
638 call MPI_Allgather(iaux,1,MPI_INTEGER,ivec_count(0),1,
639 & MPI_INTEGER,FG_COMM1,IERROR)
640 call MPI_Allgather(iset_start-2,1,MPI_INTEGER,iset_displ(0),1,
641 & MPI_INTEGER,FG_COMM,IERROR)
642 iaux=iset_end-iset_start+1
643 call MPI_Allgather(iaux,1,MPI_INTEGER,iset_count(0),1,
644 & MPI_INTEGER,FG_COMM,IERROR)
645 call MPI_Allgather(ibond_start,1,MPI_INTEGER,ibond_displ(0),1,
646 & MPI_INTEGER,FG_COMM,IERROR)
647 iaux=ibond_end-ibond_start+1
648 call MPI_Allgather(iaux,1,MPI_INTEGER,ibond_count(0),1,
649 & MPI_INTEGER,FG_COMM,IERROR)
650 call MPI_Allgather(ithet_start,1,MPI_INTEGER,ithet_displ(0),1,
651 & MPI_INTEGER,FG_COMM,IERROR)
652 iaux=ithet_end-ithet_start+1
653 call MPI_Allgather(iaux,1,MPI_INTEGER,ithet_count(0),1,
654 & MPI_INTEGER,FG_COMM,IERROR)
655 call MPI_Allgather(iphi_start,1,MPI_INTEGER,iphi_displ(0),1,
656 & MPI_INTEGER,FG_COMM,IERROR)
657 iaux=iphi_end-iphi_start+1
658 call MPI_Allgather(iaux,1,MPI_INTEGER,iphi_count(0),1,
659 & MPI_INTEGER,FG_COMM,IERROR)
660 call MPI_Allgather(iphi1_start,1,MPI_INTEGER,iphi1_displ(0),1,
661 & MPI_INTEGER,FG_COMM,IERROR)
662 iaux=iphi1_end-iphi1_start+1
663 call MPI_Allgather(iaux,1,MPI_INTEGER,iphi1_count(0),1,
664 & MPI_INTEGER,FG_COMM,IERROR)
671 call MPI_Allgather(iturn3_start,1,MPI_INTEGER,
672 & iturn3_start_all(0),1,MPI_INTEGER,FG_COMM,IERROR)
673 call MPI_Allgather(iturn4_start,1,MPI_INTEGER,
674 & iturn4_start_all(0),1,MPI_INTEGER,FG_COMM,IERROR)
675 call MPI_Allgather(iturn3_end,1,MPI_INTEGER,
676 & iturn3_end_all(0),1,MPI_INTEGER,FG_COMM,IERROR)
677 call MPI_Allgather(iturn4_end,1,MPI_INTEGER,
678 & iturn4_end_all(0),1,MPI_INTEGER,FG_COMM,IERROR)
679 call MPI_Allgather(iatel_s,1,MPI_INTEGER,
680 & iatel_s_all(0),1,MPI_INTEGER,FG_COMM,IERROR)
681 call MPI_Allgather(iatel_e,1,MPI_INTEGER,
682 & iatel_e_all(0),1,MPI_INTEGER,FG_COMM,IERROR)
683 call MPI_Allgather(ielstart(1),maxres,MPI_INTEGER,
684 & ielstart_all(1,0),maxres,MPI_INTEGER,FG_COMM,IERROR)
685 call MPI_Allgather(ielend(1),maxres,MPI_INTEGER,
686 & ielend_all(1,0),maxres,MPI_INTEGER,FG_COMM,IERROR)
688 write (iout,*) "iatel_s_all",(iatel_s_all(i),i=0,nfgtasks)
689 write (iout,*) "iatel_e_all",(iatel_e_all(i),i=0,nfgtasks)
690 write (iout,*) "iturn3_start_all",
691 & (iturn3_start_all(i),i=0,nfgtasks-1)
692 write (iout,*) "iturn3_end_all",
693 & (iturn3_end_all(i),i=0,nfgtasks-1)
694 write (iout,*) "iturn4_start_all",
695 & (iturn4_start_all(i),i=0,nfgtasks-1)
696 write (iout,*) "iturn4_end_all",
697 & (iturn4_end_all(i),i=0,nfgtasks-1)
698 write (iout,*) "The ielstart_all array"
700 write (iout,'(20i4)') i,(ielstart_all(i,j),j=0,nfgtasks-1)
702 write (iout,*) "The ielend_all array"
704 write (iout,'(20i4)') i,(ielend_all(i,j),j=0,nfgtasks-1)
710 itask_cont_from(0)=fg_rank
711 itask_cont_to(0)=fg_rank
713 do ii=iturn3_start,iturn3_end
714 call add_int(ii,ii+2,iturn3_sent(1,ii),
715 & ntask_cont_to,itask_cont_to,flag)
717 do ii=iturn4_start,iturn4_end
718 call add_int(ii,ii+3,iturn4_sent(1,ii),
719 & ntask_cont_to,itask_cont_to,flag)
721 do ii=iturn3_start,iturn3_end
722 call add_int_from(ii,ii+2,ntask_cont_from,itask_cont_from)
724 do ii=iturn4_start,iturn4_end
725 call add_int_from(ii,ii+3,ntask_cont_from,itask_cont_from)
728 write (iout,*) "After turn3 ntask_cont_from",ntask_cont_from,
729 & " ntask_cont_to",ntask_cont_to
730 write (iout,*) "itask_cont_from",
731 & (itask_cont_from(i),i=1,ntask_cont_from)
732 write (iout,*) "itask_cont_to",
733 & (itask_cont_to(i),i=1,ntask_cont_to)
736 c write (iout,*) "Loop forward"
739 c write (iout,*) "from loop i=",i
741 do j=ielstart(i),ielend(i)
742 call add_int_from(i,j,ntask_cont_from,itask_cont_from)
745 c write (iout,*) "Loop backward iatel_e-1",iatel_e-1,
746 c & " iatel_e",iatel_e
750 c write (iout,*) "i",i," ielstart",ielstart(i),
751 c & " ielend",ielend(i)
754 do j=ielstart(i),ielend(i)
755 call add_int(i,j,iint_sent(1,j,nat_sent+1),ntask_cont_to,
756 & itask_cont_to,flag)
764 write (iout,*)"After longrange ntask_cont_from",ntask_cont_from,
765 & " ntask_cont_to",ntask_cont_to
766 write (iout,*) "itask_cont_from",
767 & (itask_cont_from(i),i=1,ntask_cont_from)
768 write (iout,*) "itask_cont_to",
769 & (itask_cont_to(i),i=1,ntask_cont_to)
771 write (iout,*) "iint_sent"
774 write (iout,'(20i4)') ii,(j,(iint_sent(k,j,i),k=1,4),
775 & j=ielstart(ii),ielend(ii))
777 write (iout,*) "iturn3_sent iturn3_start",iturn3_start,
778 & " iturn3_end",iturn3_end
779 write (iout,'(20i4)') (i,(iturn3_sent(j,i),j=1,4),
780 & i=iturn3_start,iturn3_end)
781 write (iout,*) "iturn4_sent iturn4_start",iturn4_start,
782 & " iturn4_end",iturn4_end
783 write (iout,'(20i4)') (i,(iturn4_sent(j,i),j=1,4),
784 & i=iturn4_start,iturn4_end)
787 call MPI_Gather(ntask_cont_from,1,MPI_INTEGER,
788 & ntask_cont_from_all,1,MPI_INTEGER,king,FG_COMM,IERR)
789 c write (iout,*) "Gather ntask_cont_from ended"
791 call MPI_Gather(itask_cont_from(0),max_fg_procs,MPI_INTEGER,
792 & itask_cont_from_all(0,0),max_fg_procs,MPI_INTEGER,king,
794 c write (iout,*) "Gather itask_cont_from ended"
796 call MPI_Gather(ntask_cont_to,1,MPI_INTEGER,ntask_cont_to_all,
797 & 1,MPI_INTEGER,king,FG_COMM,IERR)
798 c write (iout,*) "Gather ntask_cont_to ended"
800 call MPI_Gather(itask_cont_to,max_fg_procs,MPI_INTEGER,
801 & itask_cont_to_all,max_fg_procs,MPI_INTEGER,king,FG_COMM,IERR)
802 c write (iout,*) "Gather itask_cont_to ended"
804 if (fg_rank.eq.king) then
805 write (iout,*)"Contact receive task map (proc, #tasks, tasks)"
807 write (iout,'(20i4)') i,ntask_cont_from_all(i),
808 & (itask_cont_from_all(j,i),j=1,ntask_cont_from_all(i))
812 write (iout,*) "Contact send task map (proc, #tasks, tasks)"
814 write (iout,'(20i4)') i,ntask_cont_to_all(i),
815 & (itask_cont_to_all(j,i),j=1,ntask_cont_to_all(i))
819 C Check if every send will have a matching receive
823 ncheck_to=ncheck_to+ntask_cont_to_all(i)
824 ncheck_from=ncheck_from+ntask_cont_from_all(i)
826 write (iout,*) "Control sums",ncheck_from,ncheck_to
827 if (ncheck_from.ne.ncheck_to) then
828 write (iout,*) "Error: #receive differs from #send."
829 write (iout,*) "Terminating program...!"
835 do j=1,ntask_cont_to_all(i)
836 ii=itask_cont_to_all(j,i)
837 do k=1,ntask_cont_from_all(ii)
838 if (itask_cont_from_all(k,ii).eq.i) then
839 if(lprint)write(iout,*)"Matching send/receive",i,ii
843 if (k.eq.ntask_cont_from_all(ii)+1) then
845 write (iout,*) "Error: send by",j," to",ii,
846 & " would have no matching receive"
852 write (iout,*) "Unmatched sends; terminating program"
856 call MPI_Bcast(flag,1,MPI_LOGICAL,king,FG_COMM,IERROR)
857 c write (iout,*) "flag broadcast ended flag=",flag
860 call MPI_Finalize(IERROR)
861 stop "Error in INIT_INT_TABLE: unmatched send/receive."
863 call MPI_Comm_group(FG_COMM,fg_group,IERR)
864 c write (iout,*) "MPI_Comm_group ended"
866 call MPI_Group_incl(fg_group,ntask_cont_from+1,
867 & itask_cont_from(0),CONT_FROM_GROUP,IERR)
868 call MPI_Group_incl(fg_group,ntask_cont_to+1,itask_cont_to(0),
869 & CONT_TO_GROUP,IERR)
872 iaux=4*(ielend(ii)-ielstart(ii)+1)
873 call MPI_Group_translate_ranks(fg_group,iaux,
874 & iint_sent(1,ielstart(ii),i),CONT_TO_GROUP,
875 & iint_sent_local(1,ielstart(ii),i),IERR )
876 c write (iout,*) "Ranks translated i=",i
879 iaux=4*(iturn3_end-iturn3_start+1)
880 call MPI_Group_translate_ranks(fg_group,iaux,
881 & iturn3_sent(1,iturn3_start),CONT_TO_GROUP,
882 & iturn3_sent_local(1,iturn3_start),IERR)
883 iaux=4*(iturn4_end-iturn4_start+1)
884 call MPI_Group_translate_ranks(fg_group,iaux,
885 & iturn4_sent(1,iturn4_start),CONT_TO_GROUP,
886 & iturn4_sent_local(1,iturn4_start),IERR)
888 write (iout,*) "iint_sent_local"
891 write (iout,'(20i4)') ii,(j,(iint_sent_local(k,j,i),k=1,4),
892 & j=ielstart(ii),ielend(ii))
895 write (iout,*) "iturn3_sent_local iturn3_start",iturn3_start,
896 & " iturn3_end",iturn3_end
897 write (iout,'(20i4)') (i,(iturn3_sent_local(j,i),j=1,4),
898 & i=iturn3_start,iturn3_end)
899 write (iout,*) "iturn4_sent_local iturn4_start",iturn4_start,
900 & " iturn4_end",iturn4_end
901 write (iout,'(20i4)') (i,(iturn4_sent_local(j,i),j=1,4),
902 & i=iturn4_start,iturn4_end)
905 call MPI_Group_free(fg_group,ierr)
906 call MPI_Group_free(cont_from_group,ierr)
907 call MPI_Group_free(cont_to_group,ierr)
908 call MPI_Type_contiguous(3,MPI_DOUBLE_PRECISION,MPI_UYZ,IERROR)
909 call MPI_Type_commit(MPI_UYZ,IERROR)
910 call MPI_Type_contiguous(18,MPI_DOUBLE_PRECISION,MPI_UYZGRAD,
912 call MPI_Type_commit(MPI_UYZGRAD,IERROR)
913 call MPI_Type_contiguous(2,MPI_DOUBLE_PRECISION,MPI_MU,IERROR)
914 call MPI_Type_commit(MPI_MU,IERROR)
915 call MPI_Type_contiguous(4,MPI_DOUBLE_PRECISION,MPI_MAT1,IERROR)
916 call MPI_Type_commit(MPI_MAT1,IERROR)
917 call MPI_Type_contiguous(8,MPI_DOUBLE_PRECISION,MPI_MAT2,IERROR)
918 call MPI_Type_commit(MPI_MAT2,IERROR)
919 call MPI_Type_contiguous(6,MPI_DOUBLE_PRECISION,MPI_THET,IERROR)
920 call MPI_Type_commit(MPI_THET,IERROR)
921 call MPI_Type_contiguous(9,MPI_DOUBLE_PRECISION,MPI_GAM,IERROR)
922 call MPI_Type_commit(MPI_GAM,IERROR)
924 c 9/22/08 Derived types to send matrices which appear in correlation terms
926 if (ivec_count(i).eq.ivec_count(0)) then
932 do ind_typ=lentyp(0),lentyp(nfgtasks-1)
933 if (ind_typ.eq.0) then
943 c displs(i)=displs(i-1)+blocklengths(i-1)*maxres
946 c blocklengths(i)=blocklengths(i)*ichunk
948 c write (iout,*) "blocklengths and displs"
950 c write (iout,*) i,blocklengths(i),displs(i)
953 c call MPI_Type_indexed(4,blocklengths(1),displs(1),
954 c & MPI_DOUBLE_PRECISION,MPI_ROTAT1(ind_typ),IERROR)
955 c call MPI_Type_commit(MPI_ROTAT1(ind_typ),IERROR)
956 c write (iout,*) "MPI_ROTAT1",MPI_ROTAT1
962 c displs(i)=displs(i-1)+blocklengths(i-1)*maxres
965 c blocklengths(i)=blocklengths(i)*ichunk
967 c write (iout,*) "blocklengths and displs"
969 c write (iout,*) i,blocklengths(i),displs(i)
972 c call MPI_Type_indexed(4,blocklengths(1),displs(1),
973 c & MPI_DOUBLE_PRECISION,MPI_ROTAT2(ind_typ),IERROR)
974 c call MPI_Type_commit(MPI_ROTAT2(ind_typ),IERROR)
975 c write (iout,*) "MPI_ROTAT2",MPI_ROTAT2
981 displs(i)=displs(i-1)+blocklengths(i-1)*maxres
984 blocklengths(i)=blocklengths(i)*ichunk
986 call MPI_Type_indexed(8,blocklengths,displs,
987 & MPI_DOUBLE_PRECISION,MPI_PRECOMP11(ind_typ),IERROR)
988 call MPI_Type_commit(MPI_PRECOMP11(ind_typ),IERROR)
994 displs(i)=displs(i-1)+blocklengths(i-1)*maxres
997 blocklengths(i)=blocklengths(i)*ichunk
999 call MPI_Type_indexed(8,blocklengths,displs,
1000 & MPI_DOUBLE_PRECISION,MPI_PRECOMP12(ind_typ),IERROR)
1001 call MPI_Type_commit(MPI_PRECOMP12(ind_typ),IERROR)
1007 displs(i)=displs(i-1)+blocklengths(i-1)*maxres
1010 blocklengths(i)=blocklengths(i)*ichunk
1012 call MPI_Type_indexed(6,blocklengths,displs,
1013 & MPI_DOUBLE_PRECISION,MPI_PRECOMP22(ind_typ),IERROR)
1014 call MPI_Type_commit(MPI_PRECOMP22(ind_typ),IERROR)
1020 displs(i)=displs(i-1)+blocklengths(i-1)*maxres
1023 blocklengths(i)=blocklengths(i)*ichunk
1025 call MPI_Type_indexed(2,blocklengths,displs,
1026 & MPI_DOUBLE_PRECISION,MPI_PRECOMP23(ind_typ),IERROR)
1027 call MPI_Type_commit(MPI_PRECOMP23(ind_typ),IERROR)
1033 displs(i)=displs(i-1)+blocklengths(i-1)*maxres
1036 blocklengths(i)=blocklengths(i)*ichunk
1038 call MPI_Type_indexed(4,blocklengths,displs,
1039 & MPI_DOUBLE_PRECISION,MPI_ROTAT_OLD(ind_typ),IERROR)
1040 call MPI_Type_commit(MPI_ROTAT_OLD(ind_typ),IERROR)
1044 iint_start=ivec_start+1
1047 iint_count(i)=ivec_count(i)
1048 iint_displ(i)=ivec_displ(i)
1049 ivec_displ(i)=ivec_displ(i)-1
1050 iset_displ(i)=iset_displ(i)-1
1051 ithet_displ(i)=ithet_displ(i)-1
1052 iphi_displ(i)=iphi_displ(i)-1
1053 iphi1_displ(i)=iphi1_displ(i)-1
1054 ibond_displ(i)=ibond_displ(i)-1
1056 if (nfgtasks.gt.1 .and. fg_rank.eq.king
1057 & .and. (me.eq.0 .or. .not. out1file)) then
1058 write (iout,*) "IVEC_DISPL, IVEC_COUNT, ISET_START, ISET_COUNT"
1060 write (iout,*) i,ivec_displ(i),ivec_count(i),iset_displ(i),
1063 write (iout,*) "iphi_start",iphi_start," iphi_end",iphi_end,
1064 & " iphi1_start",iphi1_start," iphi1_end",iphi1_end
1065 write (iout,*)"IPHI_COUNT, IPHI_DISPL, IPHI1_COUNT, IPHI1_DISPL"
1067 write (iout,*) i,iphi_count(i),iphi_displ(i),iphi1_count(i),
1070 write(iout,'(i10,a,i10,a,i10,a/a,i3,a)') n_sc_int_tot,' SC-SC ',
1071 & nele_int_tot,' electrostatic and ',nscp_int_tot,
1072 & ' SC-p interactions','were distributed among',nfgtasks,
1073 & ' fine-grain processors.'
1089 idihconstr_end=ndih_constr
1090 iphid_start=iphi_start
1091 iphid_end=iphi_end-1
1106 c---------------------------------------------------------------------------
1107 subroutine add_int(ii,jj,itask,ntask_cont_to,itask_cont_to,flag)
1109 include "DIMENSIONS"
1110 include "COMMON.INTERACT"
1111 include "COMMON.SETUP"
1112 include "COMMON.IOUNITS"
1113 integer ii,jj,itask(4),ntask_cont_to,
1114 &itask_cont_to(0:max_fg_procs-1)
1116 integer iturn3_start_all,iturn3_end_all,iturn4_start_all,
1117 & iturn4_end_all,iatel_s_all,iatel_e_all,ielstart_all,ielend_all
1118 common /przechowalnia/ iturn3_start_all(0:max_fg_procs),
1119 & iturn3_end_all(0:max_fg_procs),iturn4_start_all(0:max_fg_procs),
1120 & iturn4_end_all(0:max_fg_procs),iatel_s_all(0:max_fg_procs),
1121 &iatel_e_all(0:max_fg_procs),ielstart_all(maxres,0:max_fg_procs-1),
1122 & ielend_all(maxres,0:max_fg_procs-1)
1123 integer iproc,isent,k,l
1124 c Determines whether to send interaction ii,jj to other processors; a given
1125 c interaction can be sent to at most 2 processors.
1126 c Sets flag=.true. if interaction ii,jj needs to be sent to at least
1127 c one processor, otherwise flag is unchanged from the input value.
1133 c write (iout,*) "ii",ii," jj",jj
1134 c Loop over processors to check if anybody could need interaction ii,jj
1135 do iproc=0,fg_rank-1
1136 c Check if the interaction matches any turn3 at iproc
1137 do k=iturn3_start_all(iproc),iturn3_end_all(iproc)
1139 if (k.eq.ii-1 .and. l.eq.jj-1 .or. k.eq.ii-1 .and. l.eq.jj+1
1140 & .or. k.eq.ii+1 .and. l.eq.jj+1 .or. k.eq.ii+1 .and. l.eq.jj-1)
1142 c write (iout,*) "turn3 to iproc",iproc," ij",ii,jj,"kl",k,l
1145 if (iproc.ne.itask(1).and.iproc.ne.itask(2)
1146 & .and.iproc.ne.itask(3).and.iproc.ne.itask(4)) then
1149 call add_task(iproc,ntask_cont_to,itask_cont_to)
1153 C Check if the interaction matches any turn4 at iproc
1154 do k=iturn4_start_all(iproc),iturn4_end_all(iproc)
1156 if (k.eq.ii-1 .and. l.eq.jj-1 .or. k.eq.ii-1 .and. l.eq.jj+1
1157 & .or. k.eq.ii+1 .and. l.eq.jj+1 .or. k.eq.ii+1 .and. l.eq.jj-1)
1159 c write (iout,*) "turn3 to iproc",iproc," ij",ii,jj," kl",k,l
1162 if (iproc.ne.itask(1).and.iproc.ne.itask(2)
1163 & .and.iproc.ne.itask(3).and.iproc.ne.itask(4)) then
1166 call add_task(iproc,ntask_cont_to,itask_cont_to)
1170 if (iatel_s_all(iproc).gt.0 .and. iatel_e_all(iproc).gt.0 .and.
1171 & iatel_s_all(iproc).le.ii-1 .and. iatel_e_all(iproc).ge.ii-1)then
1172 if (ielstart_all(ii-1,iproc).le.jj-1.and.
1173 & ielend_all(ii-1,iproc).ge.jj-1) then
1175 if (iproc.ne.itask(1).and.iproc.ne.itask(2)
1176 & .and.iproc.ne.itask(3).and.iproc.ne.itask(4)) then
1179 call add_task(iproc,ntask_cont_to,itask_cont_to)
1182 if (ielstart_all(ii-1,iproc).le.jj+1.and.
1183 & ielend_all(ii-1,iproc).ge.jj+1) then
1185 if (iproc.ne.itask(1).and.iproc.ne.itask(2)
1186 & .and.iproc.ne.itask(3).and.iproc.ne.itask(4)) then
1189 call add_task(iproc,ntask_cont_to,itask_cont_to)
1196 c---------------------------------------------------------------------------
1197 subroutine add_int_from(ii,jj,ntask_cont_from,itask_cont_from)
1199 include "DIMENSIONS"
1200 include "COMMON.INTERACT"
1201 include "COMMON.SETUP"
1202 include "COMMON.IOUNITS"
1203 integer ii,jj,itask(2),ntask_cont_from,
1204 & itask_cont_from(0:max_fg_procs-1)
1206 integer iturn3_start_all,iturn3_end_all,iturn4_start_all,
1207 & iturn4_end_all,iatel_s_all,iatel_e_all,ielstart_all,ielend_all
1208 common /przechowalnia/ iturn3_start_all(0:max_fg_procs),
1209 & iturn3_end_all(0:max_fg_procs),iturn4_start_all(0:max_fg_procs),
1210 & iturn4_end_all(0:max_fg_procs),iatel_s_all(0:max_fg_procs),
1211 &iatel_e_all(0:max_fg_procs),ielstart_all(maxres,0:max_fg_procs-1),
1212 & ielend_all(maxres,0:max_fg_procs-1)
1214 do iproc=fg_rank+1,nfgtasks-1
1215 do k=iturn3_start_all(iproc),iturn3_end_all(iproc)
1217 if (k.eq.ii+1 .and. l.eq.jj+1 .or. k.eq.ii+1.and.l.eq.jj-1
1218 & .or. k.eq.ii-1 .and. l.eq.jj-1 .or. k.eq.ii-1 .and. l.eq.jj+1)
1220 c write (iout,*)"turn3 from iproc",iproc," ij",ii,jj," kl",k,l
1221 call add_task(iproc,ntask_cont_from,itask_cont_from)
1224 do k=iturn4_start_all(iproc),iturn4_end_all(iproc)
1226 if (k.eq.ii+1 .and. l.eq.jj+1 .or. k.eq.ii+1.and.l.eq.jj-1
1227 & .or. k.eq.ii-1 .and. l.eq.jj-1 .or. k.eq.ii-1 .and. l.eq.jj+1)
1229 c write (iout,*)"turn4 from iproc",iproc," ij",ii,jj," kl",k,l
1230 call add_task(iproc,ntask_cont_from,itask_cont_from)
1233 if (iatel_s_all(iproc).gt.0 .and. iatel_e_all(iproc).gt.0) then
1234 if (ii+1.ge.iatel_s_all(iproc).and.ii+1.le.iatel_e_all(iproc))
1236 if (jj+1.ge.ielstart_all(ii+1,iproc).and.
1237 & jj+1.le.ielend_all(ii+1,iproc)) then
1238 call add_task(iproc,ntask_cont_from,itask_cont_from)
1240 if (jj-1.ge.ielstart_all(ii+1,iproc).and.
1241 & jj-1.le.ielend_all(ii+1,iproc)) then
1242 call add_task(iproc,ntask_cont_from,itask_cont_from)
1245 if (ii-1.ge.iatel_s_all(iproc).and.ii-1.le.iatel_e_all(iproc))
1247 if (jj-1.ge.ielstart_all(ii-1,iproc).and.
1248 & jj-1.le.ielend_all(ii-1,iproc)) then
1249 call add_task(iproc,ntask_cont_from,itask_cont_from)
1251 if (jj+1.ge.ielstart_all(ii-1,iproc).and.
1252 & jj+1.le.ielend_all(ii-1,iproc)) then
1253 call add_task(iproc,ntask_cont_from,itask_cont_from)
1260 c---------------------------------------------------------------------------
1261 subroutine add_task(iproc,ntask_cont,itask_cont)
1263 include "DIMENSIONS"
1264 integer iproc,ntask_cont,itask_cont(0:max_fg_procs-1)
1267 if (itask_cont(ii).eq.iproc) return
1269 ntask_cont=ntask_cont+1
1270 itask_cont(ntask_cont)=iproc
1273 c---------------------------------------------------------------------------
1274 subroutine int_bounds(total_ints,lower_bound,upper_bound)
1275 implicit real*8 (a-h,o-z)
1276 include 'DIMENSIONS'
1278 include 'COMMON.SETUP'
1279 integer total_ints,lower_bound,upper_bound
1280 integer int4proc(0:max_fg_procs),sint4proc(0:max_fg_procs)
1281 nint=total_ints/nfgtasks
1285 nexcess=total_ints-nint*nfgtasks
1287 int4proc(nfgtasks-i)=int4proc(nfgtasks-i)+1
1291 lower_bound=lower_bound+int4proc(i)
1293 upper_bound=lower_bound+int4proc(fg_rank)
1294 lower_bound=lower_bound+1
1297 c---------------------------------------------------------------------------
1298 subroutine int_bounds1(total_ints,lower_bound,upper_bound)
1299 implicit real*8 (a-h,o-z)
1300 include 'DIMENSIONS'
1302 include 'COMMON.SETUP'
1303 integer total_ints,lower_bound,upper_bound
1304 integer int4proc(0:max_fg_procs),sint4proc(0:max_fg_procs)
1305 nint=total_ints/nfgtasks1
1309 nexcess=total_ints-nint*nfgtasks1
1311 int4proc(nfgtasks1-i)=int4proc(nfgtasks1-i)+1
1315 lower_bound=lower_bound+int4proc(i)
1317 upper_bound=lower_bound+int4proc(fg_rank1)
1318 lower_bound=lower_bound+1
1321 c---------------------------------------------------------------------------
1322 subroutine int_partition(int_index,lower_index,upper_index,atom,
1323 & at_start,at_end,first_atom,last_atom,int_gr,jat_start,jat_end,*)
1324 implicit real*8 (a-h,o-z)
1325 include 'DIMENSIONS'
1326 include 'COMMON.IOUNITS'
1327 integer int_index,lower_index,upper_index,atom,at_start,at_end,
1328 & first_atom,last_atom,int_gr,jat_start,jat_end
1331 if (lprn) write (iout,*) 'int_index=',int_index
1332 int_index_old=int_index
1333 int_index=int_index+last_atom-first_atom+1
1335 & write (iout,*) 'int_index=',int_index,
1336 & ' int_index_old',int_index_old,
1337 & ' lower_index=',lower_index,
1338 & ' upper_index=',upper_index,
1339 & ' atom=',atom,' first_atom=',first_atom,
1340 & ' last_atom=',last_atom
1341 if (int_index.ge.lower_index) then
1343 if (at_start.eq.0) then
1345 jat_start=first_atom-1+lower_index-int_index_old
1347 jat_start=first_atom
1349 if (lprn) write (iout,*) 'jat_start',jat_start
1350 if (int_index.ge.upper_index) then
1352 jat_end=first_atom-1+upper_index-int_index_old
1357 if (lprn) write (iout,*) 'jat_end',jat_end
1362 c------------------------------------------------------------------------------
1363 subroutine hpb_partition
1364 implicit real*8 (a-h,o-z)
1365 include 'DIMENSIONS'
1369 include 'COMMON.SBRIDGE'
1370 include 'COMMON.IOUNITS'
1371 include 'COMMON.SETUP'
1373 call int_bounds(nhpb,link_start,link_end)
1374 write (iout,*) 'Processor',fg_rank,' CG group',kolor,
1375 & ' absolute rank',MyRank,
1376 & ' nhpb',nhpb,' link_start=',link_start,
1377 & ' link_end',link_end