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
101 crc for write_rmsbank1
103 cdr include secondary structure prediction bias
106 C CSA I/O units (separated from others especially for Jooyoung)
117 icsa_bank_reminimized=38
120 crc for ifc error 118
122 C Lipidic input file for parameters range 60-79
124 C input file for transfer sidechain and peptide group inside the
125 C lipidic environment if lipid is implicite
127 C DNA input files for parameters range 80-99
128 C Suger input files for parameters range 100-119
129 C All-atom input files for parameters range 120-149
131 C Set default weights of the energy terms.
142 c print '(a,$)','Inside initialize'
143 c call memmon_print_usage()
176 athet(j,i,ichir1,ichir2)=0.0D0
177 bthet(j,i,ichir1,ichir2)=0.0D0
197 gaussc(l,k,j,i)=0.0D0
207 cc write (iout,*) "TU DOCHODZE",i,itortyp(i)
211 v1(k,j,i,iblock)=0.0D0
212 v2(k,j,i,iblock)=0.0D0
222 v1c(1,l,i,j,k,iblock)=0.0D0
223 v1s(1,l,i,j,k,iblock)=0.0D0
224 v1c(2,l,i,j,k,iblock)=0.0D0
225 v1s(2,l,i,j,k,iblock)=0.0D0
229 v2c(m,l,i,j,k,iblock)=0.0D0
230 v2s(m,l,i,j,k,iblock)=0.0D0
242 C Initialize the bridge arrays
256 C Initialize correlation arrays
277 C Initialize variables used in minimization.
286 C Initialize the variables responsible for the mode of gradient storage.
291 C Initialize constants used to split the energy into long- and short-range
297 nprint_ene=nprint_ene-1
301 c-------------------------------------------------------------------------
303 implicit real*8 (a-h,o-z)
305 include 'COMMON.NAMES'
306 include 'COMMON.FFIELD'
308 &'DD','DAU','DAI','DDB','DSM','DPR','DLY','DAR','DHI','DAS','DGL',
309 & 'DSG','DGN','DSN','DTH',
310 &'DYY','DAL','DTY','DTR','DVA','DLE','DIL','DPN','MED','DCY','ZER',
311 &'CYS','MET','PHE','ILE','LEU','VAL','TRP','TYR','ALA','GLY','THR',
312 &'SER','GLN','ASN','GLU','ASP','HIS','ARG','LYS','PRO','SME','DBZ',
315 &'z','z','z','z','z','p','k','r','h','d','e','n','q','s','t','g',
316 &'a','y','w','v','l','i','f','m','c','x',
317 &'C','M','F','I','L','V','W','Y','A','G','T',
318 &'S','Q','N','E','D','H','R','K','P','z','z','z','z','X'/
319 data potname /'LJ','LJK','BP','GB','GBV'/
321 & "EVDW SC-SC","EVDW2 SC-p","EES p-p","ECORR4 ","ECORR5 ",
322 & "ECORR6 ","EELLO ","ETURN3 ","ETURN4 ","ETURN6 ",
323 & "EBE bend","ESC SCloc","ETORS ","ETORSD ","EHPB ","EVDWPP ",
324 & "ESTR ","EVDW2_14 ","UCONST ", " ","ESCCOR"/
326 & "WSC","WSCP","WELEC","WCORR","WCORR5","WCORR6","WEL_LOC",
327 & "WTURN3","WTURN4","WTURN6","WANG","WSCLOC","WTOR","WTORD",
328 & "WSTRAIN","WVDWPP","WBOND","SCAL14"," "," ","WSCCOR"/
330 data print_order/1,2,3,11,12,13,14,4,5,6,7,8,9,10,19,18,15,17,16,
333 c---------------------------------------------------------------------------
334 subroutine init_int_table
335 implicit real*8 (a-h,o-z)
339 integer blocklengths(15),displs(15)
341 include 'COMMON.CONTROL'
342 include 'COMMON.SETUP'
343 include 'COMMON.CHAIN'
344 include 'COMMON.INTERACT'
345 include 'COMMON.LOCAL'
346 include 'COMMON.SBRIDGE'
347 include 'COMMON.TORCNSTR'
348 include 'COMMON.IOUNITS'
349 include 'COMMON.DERIV'
350 include 'COMMON.CONTACTS'
351 common /przechowalnia/ iturn3_start_all(0:max_fg_procs),
352 & iturn3_end_all(0:max_fg_procs),iturn4_start_all(0:max_fg_procs),
353 & iturn4_end_all(0:max_fg_procs),iatel_s_all(0:max_fg_procs),
354 &iatel_e_all(0:max_fg_procs),ielstart_all(maxres,0:max_fg_procs-1),
355 & ielend_all(maxres,0:max_fg_procs-1),
356 & ntask_cont_from_all(0:max_fg_procs-1),
357 & itask_cont_from_all(0:max_fg_procs-1,0:max_fg_procs-1),
358 & ntask_cont_to_all(0:max_fg_procs-1),
359 & itask_cont_to_all(0:max_fg_procs-1,0:max_fg_procs-1)
360 integer FG_GROUP,CONT_FROM_GROUP,CONT_TO_GROUP
361 logical scheck,lprint,flag
363 integer my_sc_int(0:max_fg_Procs-1),my_sc_intt(0:max_fg_Procs),
364 & my_ele_int(0:max_fg_Procs-1),my_ele_intt(0:max_fg_Procs)
365 C... Determine the numbers of start and end SC-SC interaction
366 C... to deal with by current processor.
368 itask_cont_from(i)=fg_rank
369 itask_cont_to(i)=fg_rank
373 &write (iout,*) 'INIT_INT_TABLE nres=',nres,' nnt=',nnt,' nct=',nct
374 n_sc_int_tot=(nct-nnt+1)*(nct-nnt)/2-nss
375 call int_bounds(n_sc_int_tot,my_sc_inds,my_sc_inde)
377 & write (iout,*) 'Processor',fg_rank,' CG group',kolor,
378 & ' absolute rank',MyRank,
379 & ' n_sc_int_tot',n_sc_int_tot,' my_sc_inds=',my_sc_inds,
380 & ' my_sc_inde',my_sc_inde
400 cd write (iout,*) 'ns=',ns,' nss=',nss,' ihpb,jhpb',
401 cd & (ihpb(i),jhpb(i),i=1,nss)
406 if (ihpb(ii).eq.i+nres) then
413 cd write (iout,*) 'i=',i,' scheck=',scheck,' jj=',jj
417 c write (iout,*) 'jj=i+1'
418 call int_partition(ind_scint,my_sc_inds,my_sc_inde,i,
419 & iatsc_s,iatsc_e,i+2,nct,nint_gr(i),istart(i,1),iend(i,1),*12)
425 else if (jj.eq.nct) then
427 c write (iout,*) 'jj=nct'
428 call int_partition(ind_scint,my_sc_inds,my_sc_inde,i,
429 & iatsc_s,iatsc_e,i+1,nct-1,nint_gr(i),istart(i,1),iend(i,1),*12)
437 call int_partition(ind_scint,my_sc_inds,my_sc_inde,i,
438 & iatsc_s,iatsc_e,i+1,jj-1,nint_gr(i),istart(i,1),iend(i,1),*12)
440 call int_partition(ind_scint,my_sc_inds,my_sc_inde,i,
441 & iatsc_s,iatsc_e,jj+1,nct,nint_gr(i),istart(i,ii),iend(i,ii),*12)
452 call int_partition(ind_scint,my_sc_inds,my_sc_inde,i,
453 & iatsc_s,iatsc_e,i+1,nct,nint_gr(i),istart(i,1),iend(i,1),*12)
458 ind_scint=ind_scint+nct-i
462 ind_scint_old=ind_scint
471 if (lprint) write (*,*) 'Processor',fg_rank,' CG Group',kolor,
472 & ' absolute rank',myrank,' iatsc_s=',iatsc_s,' iatsc_e=',iatsc_e
475 write (iout,'(a)') 'Interaction array:'
477 write (iout,'(i3,2(2x,2i3))')
478 & i,(istart(i,iint),iend(i,iint),iint=1,nint_gr(i))
483 C Now partition the electrostatic-interaction array
485 nele_int_tot=(npept-ispp)*(npept-ispp+1)/2
486 call int_bounds(nele_int_tot,my_ele_inds,my_ele_inde)
488 & write (*,*) 'Processor',fg_rank,' CG group',kolor,
489 & ' absolute rank',MyRank,
490 & ' nele_int_tot',nele_int_tot,' my_ele_inds=',my_ele_inds,
491 & ' my_ele_inde',my_ele_inde
498 call int_partition(ind_eleint,my_ele_inds,my_ele_inde,i,
499 & iatel_s,iatel_e,i+ispp,nct-1,ijunk,ielstart(i),ielend(i),*13)
502 if (iatel_s.eq.0) iatel_s=1
503 nele_int_tot_vdw=(npept-2)*(npept-2+1)/2
504 c write (iout,*) "nele_int_tot_vdw",nele_int_tot_vdw
505 call int_bounds(nele_int_tot_vdw,my_ele_inds_vdw,my_ele_inde_vdw)
506 c write (iout,*) "my_ele_inds_vdw",my_ele_inds_vdw,
507 c & " my_ele_inde_vdw",my_ele_inde_vdw
514 call int_partition(ind_eleint_vdw,my_ele_inds_vdw,
516 & iatel_s_vdw,iatel_e_vdw,i+2,nct-1,ijunk,ielstart_vdw(i),
518 c write (iout,*) i," ielstart_vdw",ielstart_vdw(i),
519 c & " ielend_vdw",ielend_vdw(i)
521 if (iatel_s_vdw.eq.0) iatel_s_vdw=1
532 do i=iatel_s_vdw,iatel_e_vdw
538 write (*,'(a)') 'Processor',fg_rank,' CG group',kolor,
539 & ' absolute rank',MyRank
540 write (iout,*) 'Electrostatic interaction array:'
542 write (iout,'(i3,2(2x,2i3))') i,ielstart(i),ielend(i)
547 C Partition the SC-p interaction array
549 nscp_int_tot=(npept-iscp+1)*(npept-iscp+1)
550 call int_bounds(nscp_int_tot,my_scp_inds,my_scp_inde)
551 if (lprint) write (iout,*) 'Processor',fg_rank,' CG group',kolor,
552 & ' absolute rank',myrank,
553 & ' nscp_int_tot',nscp_int_tot,' my_scp_inds=',my_scp_inds,
554 & ' my_scp_inde',my_scp_inde
560 if (i.lt.nnt+iscp) then
561 cd write (iout,*) 'i.le.nnt+iscp'
562 call int_partition(ind_scpint,my_scp_inds,my_scp_inde,i,
563 & iatscp_s,iatscp_e,i+iscp,nct,nscp_gr(i),iscpstart(i,1),
565 else if (i.gt.nct-iscp) then
566 cd write (iout,*) 'i.gt.nct-iscp'
567 call int_partition(ind_scpint,my_scp_inds,my_scp_inde,i,
568 & iatscp_s,iatscp_e,nnt,i-iscp,nscp_gr(i),iscpstart(i,1),
571 call int_partition(ind_scpint,my_scp_inds,my_scp_inde,i,
572 & iatscp_s,iatscp_e,nnt,i-iscp,nscp_gr(i),iscpstart(i,1),
575 call int_partition(ind_scpint,my_scp_inds,my_scp_inde,i,
576 & iatscp_s,iatscp_e,i+iscp,nct,nscp_gr(i),iscpstart(i,ii),
585 if (i.lt.nnt+iscp) then
587 iscpstart(i,1)=i+iscp
589 elseif (i.gt.nct-iscp) then
597 iscpstart(i,2)=i+iscp
603 write (iout,'(a)') 'SC-p interaction array:'
604 do i=iatscp_s,iatscp_e
605 write (iout,'(i3,2(2x,2i3))')
606 & i,(iscpstart(i,j),iscpend(i,j),j=1,nscp_gr(i))
609 C Partition local interactions
611 call int_bounds(nres-2,loc_start,loc_end)
612 loc_start=loc_start+1
614 call int_bounds(nres-2,ithet_start,ithet_end)
615 ithet_start=ithet_start+2
616 ithet_end=ithet_end+2
617 call int_bounds(nct-nnt-2,iturn3_start,iturn3_end)
618 iturn3_start=iturn3_start+nnt
619 iphi_start=iturn3_start+2
620 iturn3_end=iturn3_end+nnt
621 iphi_end=iturn3_end+2
622 iturn3_start=iturn3_start-1
623 iturn3_end=iturn3_end-1
624 call int_bounds(nres-3,itau_start,itau_end)
625 itau_start=itau_start+3
627 call int_bounds(nres-3,iphi1_start,iphi1_end)
628 iphi1_start=iphi1_start+3
629 iphi1_end=iphi1_end+3
630 call int_bounds(nct-nnt-3,iturn4_start,iturn4_end)
631 iturn4_start=iturn4_start+nnt
632 iphid_start=iturn4_start+2
633 iturn4_end=iturn4_end+nnt
634 iphid_end=iturn4_end+2
635 iturn4_start=iturn4_start-1
636 iturn4_end=iturn4_end-1
637 call int_bounds(nres-2,ibond_start,ibond_end)
638 ibond_start=ibond_start+1
639 ibond_end=ibond_end+1
640 call int_bounds(nct-nnt,ibondp_start,ibondp_end)
641 ibondp_start=ibondp_start+nnt
642 ibondp_end=ibondp_end+nnt
643 call int_bounds(nres,ilip_start,ilip_end)
644 ilip_start=ilip_start
645 call int_bounds1(nres-1,ivec_start,ivec_end)
646 c print *,"Processor",myrank,fg_rank,fg_rank1,
647 c & " ivec_start",ivec_start," ivec_end",ivec_end
648 iset_start=loc_start+2
650 if (ndih_constr.eq.0) then
654 call int_bounds(ndih_constr,idihconstr_start,idihconstr_end)
656 c nsumgrad=(nres-nnt)*(nres-nnt+1)/2
658 nsumgrad=(nres-nnt)*(nres-nnt+1)/2
660 call int_bounds(nsumgrad,ngrad_start,ngrad_end)
661 igrad_start=((2*nlen+1)
662 & -sqrt(float((2*nlen-1)**2-8*(ngrad_start-1))))/2
663 jgrad_start(igrad_start)=
664 & ngrad_start-(2*nlen-igrad_start)*(igrad_start-1)/2
666 jgrad_end(igrad_start)=nres
667 igrad_end=((2*nlen+1)
668 & -sqrt(float((2*nlen-1)**2-8*(ngrad_end-1))))/2
669 if (igrad_end.gt.igrad_start) jgrad_start(igrad_end)=igrad_end+1
670 jgrad_end(igrad_end)=ngrad_end-(2*nlen-igrad_end)*(igrad_end-1)/2
672 do i=igrad_start+1,igrad_end-1
677 write (*,*) 'Processor:',fg_rank,' CG group',kolor,
678 & ' absolute rank',myrank,
679 & ' loc_start',loc_start,' loc_end',loc_end,
680 & ' ithet_start',ithet_start,' ithet_end',ithet_end,
681 & ' iphi_start',iphi_start,' iphi_end',iphi_end,
682 & ' iphid_start',iphid_start,' iphid_end',iphid_end,
683 & ' ibond_start',ibond_start,' ibond_end',ibond_end,
684 & ' ibondp_start',ibondp_start,' ibondp_end',ibondp_end,
685 & ' iturn3_start',iturn3_start,' iturn3_end',iturn3_end,
686 & ' iturn4_start',iturn4_start,' iturn4_end',iturn4_end,
687 & ' ivec_start',ivec_start,' ivec_end',ivec_end,
688 & ' iset_start',iset_start,' iset_end',iset_end,
689 & ' idihconstr_start',idihconstr_start,' idihconstr_end',
691 write (*,*) 'Processor:',fg_rank,myrank,' igrad_start',
692 & igrad_start,' igrad_end',igrad_end,' ngrad_start',ngrad_start,
693 & ' ngrad_end',ngrad_end
694 do i=igrad_start,igrad_end
695 write(*,*) 'Processor:',fg_rank,myrank,i,
696 & jgrad_start(i),jgrad_end(i)
699 if (nfgtasks.gt.1) then
700 call MPI_Allgather(ivec_start,1,MPI_INTEGER,ivec_displ(0),1,
701 & MPI_INTEGER,FG_COMM1,IERROR)
702 iaux=ivec_end-ivec_start+1
703 call MPI_Allgather(iaux,1,MPI_INTEGER,ivec_count(0),1,
704 & MPI_INTEGER,FG_COMM1,IERROR)
705 call MPI_Allgather(iset_start-2,1,MPI_INTEGER,iset_displ(0),1,
706 & MPI_INTEGER,FG_COMM,IERROR)
707 iaux=iset_end-iset_start+1
708 call MPI_Allgather(iaux,1,MPI_INTEGER,iset_count(0),1,
709 & MPI_INTEGER,FG_COMM,IERROR)
710 call MPI_Allgather(ibond_start,1,MPI_INTEGER,ibond_displ(0),1,
711 & MPI_INTEGER,FG_COMM,IERROR)
712 iaux=ibond_end-ibond_start+1
713 call MPI_Allgather(iaux,1,MPI_INTEGER,ibond_count(0),1,
714 & MPI_INTEGER,FG_COMM,IERROR)
715 call MPI_Allgather(ithet_start,1,MPI_INTEGER,ithet_displ(0),1,
716 & MPI_INTEGER,FG_COMM,IERROR)
717 iaux=ithet_end-ithet_start+1
718 call MPI_Allgather(iaux,1,MPI_INTEGER,ithet_count(0),1,
719 & MPI_INTEGER,FG_COMM,IERROR)
720 call MPI_Allgather(iphi_start,1,MPI_INTEGER,iphi_displ(0),1,
721 & MPI_INTEGER,FG_COMM,IERROR)
722 iaux=iphi_end-iphi_start+1
723 call MPI_Allgather(iaux,1,MPI_INTEGER,iphi_count(0),1,
724 & MPI_INTEGER,FG_COMM,IERROR)
725 call MPI_Allgather(iphi1_start,1,MPI_INTEGER,iphi1_displ(0),1,
726 & MPI_INTEGER,FG_COMM,IERROR)
727 iaux=iphi1_end-iphi1_start+1
728 call MPI_Allgather(iaux,1,MPI_INTEGER,iphi1_count(0),1,
729 & MPI_INTEGER,FG_COMM,IERROR)
736 call MPI_Allgather(iturn3_start,1,MPI_INTEGER,
737 & iturn3_start_all(0),1,MPI_INTEGER,FG_COMM,IERROR)
738 call MPI_Allgather(iturn4_start,1,MPI_INTEGER,
739 & iturn4_start_all(0),1,MPI_INTEGER,FG_COMM,IERROR)
740 call MPI_Allgather(iturn3_end,1,MPI_INTEGER,
741 & iturn3_end_all(0),1,MPI_INTEGER,FG_COMM,IERROR)
742 call MPI_Allgather(iturn4_end,1,MPI_INTEGER,
743 & iturn4_end_all(0),1,MPI_INTEGER,FG_COMM,IERROR)
744 call MPI_Allgather(iatel_s,1,MPI_INTEGER,
745 & iatel_s_all(0),1,MPI_INTEGER,FG_COMM,IERROR)
746 call MPI_Allgather(iatel_e,1,MPI_INTEGER,
747 & iatel_e_all(0),1,MPI_INTEGER,FG_COMM,IERROR)
748 call MPI_Allgather(ielstart(1),maxres,MPI_INTEGER,
749 & ielstart_all(1,0),maxres,MPI_INTEGER,FG_COMM,IERROR)
750 call MPI_Allgather(ielend(1),maxres,MPI_INTEGER,
751 & ielend_all(1,0),maxres,MPI_INTEGER,FG_COMM,IERROR)
753 write (iout,*) "iatel_s_all",(iatel_s_all(i),i=0,nfgtasks)
754 write (iout,*) "iatel_e_all",(iatel_e_all(i),i=0,nfgtasks)
755 write (iout,*) "iturn3_start_all",
756 & (iturn3_start_all(i),i=0,nfgtasks-1)
757 write (iout,*) "iturn3_end_all",
758 & (iturn3_end_all(i),i=0,nfgtasks-1)
759 write (iout,*) "iturn4_start_all",
760 & (iturn4_start_all(i),i=0,nfgtasks-1)
761 write (iout,*) "iturn4_end_all",
762 & (iturn4_end_all(i),i=0,nfgtasks-1)
763 write (iout,*) "The ielstart_all array"
765 write (iout,'(20i4)') i,(ielstart_all(i,j),j=0,nfgtasks-1)
767 write (iout,*) "The ielend_all array"
769 write (iout,'(20i4)') i,(ielend_all(i,j),j=0,nfgtasks-1)
775 itask_cont_from(0)=fg_rank
776 itask_cont_to(0)=fg_rank
778 do ii=iturn3_start,iturn3_end
779 call add_int(ii,ii+2,iturn3_sent(1,ii),
780 & ntask_cont_to,itask_cont_to,flag)
782 do ii=iturn4_start,iturn4_end
783 call add_int(ii,ii+3,iturn4_sent(1,ii),
784 & ntask_cont_to,itask_cont_to,flag)
786 do ii=iturn3_start,iturn3_end
787 call add_int_from(ii,ii+2,ntask_cont_from,itask_cont_from)
789 do ii=iturn4_start,iturn4_end
790 call add_int_from(ii,ii+3,ntask_cont_from,itask_cont_from)
793 write (iout,*) "After turn3 ntask_cont_from",ntask_cont_from,
794 & " ntask_cont_to",ntask_cont_to
795 write (iout,*) "itask_cont_from",
796 & (itask_cont_from(i),i=1,ntask_cont_from)
797 write (iout,*) "itask_cont_to",
798 & (itask_cont_to(i),i=1,ntask_cont_to)
801 c write (iout,*) "Loop forward"
804 c write (iout,*) "from loop i=",i
806 do j=ielstart(i),ielend(i)
807 call add_int_from(i,j,ntask_cont_from,itask_cont_from)
810 c write (iout,*) "Loop backward iatel_e-1",iatel_e-1,
811 c & " iatel_e",iatel_e
815 c write (iout,*) "i",i," ielstart",ielstart(i),
816 c & " ielend",ielend(i)
819 do j=ielstart(i),ielend(i)
820 call add_int(i,j,iint_sent(1,j,nat_sent+1),ntask_cont_to,
821 & itask_cont_to,flag)
829 write (iout,*)"After longrange ntask_cont_from",ntask_cont_from,
830 & " ntask_cont_to",ntask_cont_to
831 write (iout,*) "itask_cont_from",
832 & (itask_cont_from(i),i=1,ntask_cont_from)
833 write (iout,*) "itask_cont_to",
834 & (itask_cont_to(i),i=1,ntask_cont_to)
836 write (iout,*) "iint_sent"
839 write (iout,'(20i4)') ii,(j,(iint_sent(k,j,i),k=1,4),
840 & j=ielstart(ii),ielend(ii))
842 write (iout,*) "iturn3_sent iturn3_start",iturn3_start,
843 & " iturn3_end",iturn3_end
844 write (iout,'(20i4)') (i,(iturn3_sent(j,i),j=1,4),
845 & i=iturn3_start,iturn3_end)
846 write (iout,*) "iturn4_sent iturn4_start",iturn4_start,
847 & " iturn4_end",iturn4_end
848 write (iout,'(20i4)') (i,(iturn4_sent(j,i),j=1,4),
849 & i=iturn4_start,iturn4_end)
852 call MPI_Gather(ntask_cont_from,1,MPI_INTEGER,
853 & ntask_cont_from_all,1,MPI_INTEGER,king,FG_COMM,IERR)
854 c write (iout,*) "Gather ntask_cont_from ended"
856 call MPI_Gather(itask_cont_from(0),max_fg_procs,MPI_INTEGER,
857 & itask_cont_from_all(0,0),max_fg_procs,MPI_INTEGER,king,
859 c write (iout,*) "Gather itask_cont_from ended"
861 call MPI_Gather(ntask_cont_to,1,MPI_INTEGER,ntask_cont_to_all,
862 & 1,MPI_INTEGER,king,FG_COMM,IERR)
863 c write (iout,*) "Gather ntask_cont_to ended"
865 call MPI_Gather(itask_cont_to,max_fg_procs,MPI_INTEGER,
866 & itask_cont_to_all,max_fg_procs,MPI_INTEGER,king,FG_COMM,IERR)
867 c write (iout,*) "Gather itask_cont_to ended"
869 if (fg_rank.eq.king) then
870 write (iout,*)"Contact receive task map (proc, #tasks, tasks)"
872 write (iout,'(20i4)') i,ntask_cont_from_all(i),
873 & (itask_cont_from_all(j,i),j=1,ntask_cont_from_all(i))
877 write (iout,*) "Contact send task map (proc, #tasks, tasks)"
879 write (iout,'(20i4)') i,ntask_cont_to_all(i),
880 & (itask_cont_to_all(j,i),j=1,ntask_cont_to_all(i))
884 C Check if every send will have a matching receive
888 ncheck_to=ncheck_to+ntask_cont_to_all(i)
889 ncheck_from=ncheck_from+ntask_cont_from_all(i)
891 write (iout,*) "Control sums",ncheck_from,ncheck_to
892 if (ncheck_from.ne.ncheck_to) then
893 write (iout,*) "Error: #receive differs from #send."
894 write (iout,*) "Terminating program...!"
900 do j=1,ntask_cont_to_all(i)
901 ii=itask_cont_to_all(j,i)
902 do k=1,ntask_cont_from_all(ii)
903 if (itask_cont_from_all(k,ii).eq.i) then
904 if(lprint)write(iout,*)"Matching send/receive",i,ii
908 if (k.eq.ntask_cont_from_all(ii)+1) then
910 write (iout,*) "Error: send by",j," to",ii,
911 & " would have no matching receive"
917 write (iout,*) "Unmatched sends; terminating program"
921 call MPI_Bcast(flag,1,MPI_LOGICAL,king,FG_COMM,IERROR)
922 c write (iout,*) "flag broadcast ended flag=",flag
925 call MPI_Finalize(IERROR)
926 stop "Error in INIT_INT_TABLE: unmatched send/receive."
928 call MPI_Comm_group(FG_COMM,fg_group,IERR)
929 c write (iout,*) "MPI_Comm_group ended"
931 call MPI_Group_incl(fg_group,ntask_cont_from+1,
932 & itask_cont_from(0),CONT_FROM_GROUP,IERR)
933 call MPI_Group_incl(fg_group,ntask_cont_to+1,itask_cont_to(0),
934 & CONT_TO_GROUP,IERR)
937 iaux=4*(ielend(ii)-ielstart(ii)+1)
938 call MPI_Group_translate_ranks(fg_group,iaux,
939 & iint_sent(1,ielstart(ii),i),CONT_TO_GROUP,
940 & iint_sent_local(1,ielstart(ii),i),IERR )
941 c write (iout,*) "Ranks translated i=",i
944 iaux=4*(iturn3_end-iturn3_start+1)
945 call MPI_Group_translate_ranks(fg_group,iaux,
946 & iturn3_sent(1,iturn3_start),CONT_TO_GROUP,
947 & iturn3_sent_local(1,iturn3_start),IERR)
948 iaux=4*(iturn4_end-iturn4_start+1)
949 call MPI_Group_translate_ranks(fg_group,iaux,
950 & iturn4_sent(1,iturn4_start),CONT_TO_GROUP,
951 & iturn4_sent_local(1,iturn4_start),IERR)
953 write (iout,*) "iint_sent_local"
956 write (iout,'(20i4)') ii,(j,(iint_sent_local(k,j,i),k=1,4),
957 & j=ielstart(ii),ielend(ii))
960 write (iout,*) "iturn3_sent_local iturn3_start",iturn3_start,
961 & " iturn3_end",iturn3_end
962 write (iout,'(20i4)') (i,(iturn3_sent_local(j,i),j=1,4),
963 & i=iturn3_start,iturn3_end)
964 write (iout,*) "iturn4_sent_local iturn4_start",iturn4_start,
965 & " iturn4_end",iturn4_end
966 write (iout,'(20i4)') (i,(iturn4_sent_local(j,i),j=1,4),
967 & i=iturn4_start,iturn4_end)
970 call MPI_Group_free(fg_group,ierr)
971 call MPI_Group_free(cont_from_group,ierr)
972 call MPI_Group_free(cont_to_group,ierr)
973 call MPI_Type_contiguous(3,MPI_DOUBLE_PRECISION,MPI_UYZ,IERROR)
974 call MPI_Type_commit(MPI_UYZ,IERROR)
975 call MPI_Type_contiguous(18,MPI_DOUBLE_PRECISION,MPI_UYZGRAD,
977 call MPI_Type_commit(MPI_UYZGRAD,IERROR)
978 call MPI_Type_contiguous(2,MPI_DOUBLE_PRECISION,MPI_MU,IERROR)
979 call MPI_Type_commit(MPI_MU,IERROR)
980 call MPI_Type_contiguous(4,MPI_DOUBLE_PRECISION,MPI_MAT1,IERROR)
981 call MPI_Type_commit(MPI_MAT1,IERROR)
982 call MPI_Type_contiguous(8,MPI_DOUBLE_PRECISION,MPI_MAT2,IERROR)
983 call MPI_Type_commit(MPI_MAT2,IERROR)
984 call MPI_Type_contiguous(6,MPI_DOUBLE_PRECISION,MPI_THET,IERROR)
985 call MPI_Type_commit(MPI_THET,IERROR)
986 call MPI_Type_contiguous(9,MPI_DOUBLE_PRECISION,MPI_GAM,IERROR)
987 call MPI_Type_commit(MPI_GAM,IERROR)
989 c 9/22/08 Derived types to send matrices which appear in correlation terms
991 if (ivec_count(i).eq.ivec_count(0)) then
997 do ind_typ=lentyp(0),lentyp(nfgtasks-1)
998 if (ind_typ.eq.0) then
1001 ichunk=ivec_count(1)
1008 c displs(i)=displs(i-1)+blocklengths(i-1)*maxres
1011 c blocklengths(i)=blocklengths(i)*ichunk
1013 c write (iout,*) "blocklengths and displs"
1015 c write (iout,*) i,blocklengths(i),displs(i)
1018 c call MPI_Type_indexed(4,blocklengths(1),displs(1),
1019 c & MPI_DOUBLE_PRECISION,MPI_ROTAT1(ind_typ),IERROR)
1020 c call MPI_Type_commit(MPI_ROTAT1(ind_typ),IERROR)
1021 c write (iout,*) "MPI_ROTAT1",MPI_ROTAT1
1027 c displs(i)=displs(i-1)+blocklengths(i-1)*maxres
1030 c blocklengths(i)=blocklengths(i)*ichunk
1032 c write (iout,*) "blocklengths and displs"
1034 c write (iout,*) i,blocklengths(i),displs(i)
1037 c call MPI_Type_indexed(4,blocklengths(1),displs(1),
1038 c & MPI_DOUBLE_PRECISION,MPI_ROTAT2(ind_typ),IERROR)
1039 c call MPI_Type_commit(MPI_ROTAT2(ind_typ),IERROR)
1040 c write (iout,*) "MPI_ROTAT2",MPI_ROTAT2
1046 displs(i)=displs(i-1)+blocklengths(i-1)*maxres
1049 blocklengths(i)=blocklengths(i)*ichunk
1051 call MPI_Type_indexed(8,blocklengths,displs,
1052 & MPI_DOUBLE_PRECISION,MPI_PRECOMP11(ind_typ),IERROR)
1053 call MPI_Type_commit(MPI_PRECOMP11(ind_typ),IERROR)
1059 displs(i)=displs(i-1)+blocklengths(i-1)*maxres
1062 blocklengths(i)=blocklengths(i)*ichunk
1064 call MPI_Type_indexed(8,blocklengths,displs,
1065 & MPI_DOUBLE_PRECISION,MPI_PRECOMP12(ind_typ),IERROR)
1066 call MPI_Type_commit(MPI_PRECOMP12(ind_typ),IERROR)
1072 displs(i)=displs(i-1)+blocklengths(i-1)*maxres
1075 blocklengths(i)=blocklengths(i)*ichunk
1077 call MPI_Type_indexed(6,blocklengths,displs,
1078 & MPI_DOUBLE_PRECISION,MPI_PRECOMP22(ind_typ),IERROR)
1079 call MPI_Type_commit(MPI_PRECOMP22(ind_typ),IERROR)
1085 displs(i)=displs(i-1)+blocklengths(i-1)*maxres
1088 blocklengths(i)=blocklengths(i)*ichunk
1090 call MPI_Type_indexed(2,blocklengths,displs,
1091 & MPI_DOUBLE_PRECISION,MPI_PRECOMP23(ind_typ),IERROR)
1092 call MPI_Type_commit(MPI_PRECOMP23(ind_typ),IERROR)
1098 displs(i)=displs(i-1)+blocklengths(i-1)*maxres
1101 blocklengths(i)=blocklengths(i)*ichunk
1103 call MPI_Type_indexed(4,blocklengths,displs,
1104 & MPI_DOUBLE_PRECISION,MPI_ROTAT_OLD(ind_typ),IERROR)
1105 call MPI_Type_commit(MPI_ROTAT_OLD(ind_typ),IERROR)
1109 iint_start=ivec_start+1
1112 iint_count(i)=ivec_count(i)
1113 iint_displ(i)=ivec_displ(i)
1114 ivec_displ(i)=ivec_displ(i)-1
1115 iset_displ(i)=iset_displ(i)-1
1116 ithet_displ(i)=ithet_displ(i)-1
1117 iphi_displ(i)=iphi_displ(i)-1
1118 iphi1_displ(i)=iphi1_displ(i)-1
1119 ibond_displ(i)=ibond_displ(i)-1
1121 if (nfgtasks.gt.1 .and. fg_rank.eq.king
1122 & .and. (me.eq.0 .or. .not. out1file)) then
1123 write (iout,*) "IVEC_DISPL, IVEC_COUNT, ISET_START, ISET_COUNT"
1125 write (iout,*) i,ivec_displ(i),ivec_count(i),iset_displ(i),
1128 write (iout,*) "iphi_start",iphi_start," iphi_end",iphi_end,
1129 & " iphi1_start",iphi1_start," iphi1_end",iphi1_end
1130 write (iout,*)"IPHI_COUNT, IPHI_DISPL, IPHI1_COUNT, IPHI1_DISPL"
1132 write (iout,*) i,iphi_count(i),iphi_displ(i),iphi1_count(i),
1135 write(iout,'(i10,a,i10,a,i10,a/a,i3,a)') n_sc_int_tot,' SC-SC ',
1136 & nele_int_tot,' electrostatic and ',nscp_int_tot,
1137 & ' SC-p interactions','were distributed among',nfgtasks,
1138 & ' fine-grain processors.'
1154 idihconstr_end=ndih_constr
1155 iphid_start=iphi_start
1156 iphid_end=iphi_end-1
1175 c---------------------------------------------------------------------------
1176 subroutine add_int(ii,jj,itask,ntask_cont_to,itask_cont_to,flag)
1178 include "DIMENSIONS"
1179 include "COMMON.INTERACT"
1180 include "COMMON.SETUP"
1181 include "COMMON.IOUNITS"
1182 integer ii,jj,itask(4),ntask_cont_to,
1183 &itask_cont_to(0:max_fg_procs-1)
1185 integer iturn3_start_all,iturn3_end_all,iturn4_start_all,
1186 & iturn4_end_all,iatel_s_all,iatel_e_all,ielstart_all,ielend_all
1187 common /przechowalnia/ iturn3_start_all(0:max_fg_procs),
1188 & iturn3_end_all(0:max_fg_procs),iturn4_start_all(0:max_fg_procs),
1189 & iturn4_end_all(0:max_fg_procs),iatel_s_all(0:max_fg_procs),
1190 &iatel_e_all(0:max_fg_procs),ielstart_all(maxres,0:max_fg_procs-1),
1191 & ielend_all(maxres,0:max_fg_procs-1)
1192 integer iproc,isent,k,l
1193 c Determines whether to send interaction ii,jj to other processors; a given
1194 c interaction can be sent to at most 2 processors.
1195 c Sets flag=.true. if interaction ii,jj needs to be sent to at least
1196 c one processor, otherwise flag is unchanged from the input value.
1202 c write (iout,*) "ii",ii," jj",jj
1203 c Loop over processors to check if anybody could need interaction ii,jj
1204 do iproc=0,fg_rank-1
1205 c Check if the interaction matches any turn3 at iproc
1206 do k=iturn3_start_all(iproc),iturn3_end_all(iproc)
1208 if (k.eq.ii-1 .and. l.eq.jj-1 .or. k.eq.ii-1 .and. l.eq.jj+1
1209 & .or. k.eq.ii+1 .and. l.eq.jj+1 .or. k.eq.ii+1 .and. l.eq.jj-1)
1211 c write (iout,*) "turn3 to iproc",iproc," ij",ii,jj,"kl",k,l
1214 if (iproc.ne.itask(1).and.iproc.ne.itask(2)
1215 & .and.iproc.ne.itask(3).and.iproc.ne.itask(4)) then
1218 call add_task(iproc,ntask_cont_to,itask_cont_to)
1222 C Check if the interaction matches any turn4 at iproc
1223 do k=iturn4_start_all(iproc),iturn4_end_all(iproc)
1225 if (k.eq.ii-1 .and. l.eq.jj-1 .or. k.eq.ii-1 .and. l.eq.jj+1
1226 & .or. k.eq.ii+1 .and. l.eq.jj+1 .or. k.eq.ii+1 .and. l.eq.jj-1)
1228 c write (iout,*) "turn3 to iproc",iproc," ij",ii,jj," kl",k,l
1231 if (iproc.ne.itask(1).and.iproc.ne.itask(2)
1232 & .and.iproc.ne.itask(3).and.iproc.ne.itask(4)) then
1235 call add_task(iproc,ntask_cont_to,itask_cont_to)
1239 if (iatel_s_all(iproc).gt.0 .and. iatel_e_all(iproc).gt.0 .and.
1240 & iatel_s_all(iproc).le.ii-1 .and. iatel_e_all(iproc).ge.ii-1)then
1241 if (ielstart_all(ii-1,iproc).le.jj-1.and.
1242 & ielend_all(ii-1,iproc).ge.jj-1) then
1244 if (iproc.ne.itask(1).and.iproc.ne.itask(2)
1245 & .and.iproc.ne.itask(3).and.iproc.ne.itask(4)) then
1248 call add_task(iproc,ntask_cont_to,itask_cont_to)
1251 if (ielstart_all(ii-1,iproc).le.jj+1.and.
1252 & ielend_all(ii-1,iproc).ge.jj+1) then
1254 if (iproc.ne.itask(1).and.iproc.ne.itask(2)
1255 & .and.iproc.ne.itask(3).and.iproc.ne.itask(4)) then
1258 call add_task(iproc,ntask_cont_to,itask_cont_to)
1265 c---------------------------------------------------------------------------
1266 subroutine add_int_from(ii,jj,ntask_cont_from,itask_cont_from)
1268 include "DIMENSIONS"
1269 include "COMMON.INTERACT"
1270 include "COMMON.SETUP"
1271 include "COMMON.IOUNITS"
1272 integer ii,jj,itask(2),ntask_cont_from,
1273 & itask_cont_from(0:max_fg_procs-1)
1275 integer iturn3_start_all,iturn3_end_all,iturn4_start_all,
1276 & iturn4_end_all,iatel_s_all,iatel_e_all,ielstart_all,ielend_all
1277 common /przechowalnia/ iturn3_start_all(0:max_fg_procs),
1278 & iturn3_end_all(0:max_fg_procs),iturn4_start_all(0:max_fg_procs),
1279 & iturn4_end_all(0:max_fg_procs),iatel_s_all(0:max_fg_procs),
1280 &iatel_e_all(0:max_fg_procs),ielstart_all(maxres,0:max_fg_procs-1),
1281 & ielend_all(maxres,0:max_fg_procs-1)
1283 do iproc=fg_rank+1,nfgtasks-1
1284 do k=iturn3_start_all(iproc),iturn3_end_all(iproc)
1286 if (k.eq.ii+1 .and. l.eq.jj+1 .or. k.eq.ii+1.and.l.eq.jj-1
1287 & .or. k.eq.ii-1 .and. l.eq.jj-1 .or. k.eq.ii-1 .and. l.eq.jj+1)
1289 c write (iout,*)"turn3 from iproc",iproc," ij",ii,jj," kl",k,l
1290 call add_task(iproc,ntask_cont_from,itask_cont_from)
1293 do k=iturn4_start_all(iproc),iturn4_end_all(iproc)
1295 if (k.eq.ii+1 .and. l.eq.jj+1 .or. k.eq.ii+1.and.l.eq.jj-1
1296 & .or. k.eq.ii-1 .and. l.eq.jj-1 .or. k.eq.ii-1 .and. l.eq.jj+1)
1298 c write (iout,*)"turn4 from iproc",iproc," ij",ii,jj," kl",k,l
1299 call add_task(iproc,ntask_cont_from,itask_cont_from)
1302 if (iatel_s_all(iproc).gt.0 .and. iatel_e_all(iproc).gt.0) then
1303 if (ii+1.ge.iatel_s_all(iproc).and.ii+1.le.iatel_e_all(iproc))
1305 if (jj+1.ge.ielstart_all(ii+1,iproc).and.
1306 & jj+1.le.ielend_all(ii+1,iproc)) then
1307 call add_task(iproc,ntask_cont_from,itask_cont_from)
1309 if (jj-1.ge.ielstart_all(ii+1,iproc).and.
1310 & jj-1.le.ielend_all(ii+1,iproc)) then
1311 call add_task(iproc,ntask_cont_from,itask_cont_from)
1314 if (ii-1.ge.iatel_s_all(iproc).and.ii-1.le.iatel_e_all(iproc))
1316 if (jj-1.ge.ielstart_all(ii-1,iproc).and.
1317 & jj-1.le.ielend_all(ii-1,iproc)) then
1318 call add_task(iproc,ntask_cont_from,itask_cont_from)
1320 if (jj+1.ge.ielstart_all(ii-1,iproc).and.
1321 & jj+1.le.ielend_all(ii-1,iproc)) then
1322 call add_task(iproc,ntask_cont_from,itask_cont_from)
1329 c---------------------------------------------------------------------------
1330 subroutine add_task(iproc,ntask_cont,itask_cont)
1332 include "DIMENSIONS"
1333 integer iproc,ntask_cont,itask_cont(0:max_fg_procs-1)
1336 if (itask_cont(ii).eq.iproc) return
1338 ntask_cont=ntask_cont+1
1339 itask_cont(ntask_cont)=iproc
1342 c---------------------------------------------------------------------------
1343 subroutine int_bounds(total_ints,lower_bound,upper_bound)
1344 implicit real*8 (a-h,o-z)
1345 include 'DIMENSIONS'
1347 include 'COMMON.SETUP'
1348 integer total_ints,lower_bound,upper_bound
1349 integer int4proc(0:max_fg_procs),sint4proc(0:max_fg_procs)
1350 nint=total_ints/nfgtasks
1354 nexcess=total_ints-nint*nfgtasks
1356 int4proc(nfgtasks-i)=int4proc(nfgtasks-i)+1
1360 lower_bound=lower_bound+int4proc(i)
1362 upper_bound=lower_bound+int4proc(fg_rank)
1363 lower_bound=lower_bound+1
1366 c---------------------------------------------------------------------------
1367 subroutine int_bounds1(total_ints,lower_bound,upper_bound)
1368 implicit real*8 (a-h,o-z)
1369 include 'DIMENSIONS'
1371 include 'COMMON.SETUP'
1372 integer total_ints,lower_bound,upper_bound
1373 integer int4proc(0:max_fg_procs),sint4proc(0:max_fg_procs)
1374 nint=total_ints/nfgtasks1
1378 nexcess=total_ints-nint*nfgtasks1
1380 int4proc(nfgtasks1-i)=int4proc(nfgtasks1-i)+1
1384 lower_bound=lower_bound+int4proc(i)
1386 upper_bound=lower_bound+int4proc(fg_rank1)
1387 lower_bound=lower_bound+1
1390 c---------------------------------------------------------------------------
1391 subroutine int_partition(int_index,lower_index,upper_index,atom,
1392 & at_start,at_end,first_atom,last_atom,int_gr,jat_start,jat_end,*)
1393 implicit real*8 (a-h,o-z)
1394 include 'DIMENSIONS'
1395 include 'COMMON.IOUNITS'
1396 integer int_index,lower_index,upper_index,atom,at_start,at_end,
1397 & first_atom,last_atom,int_gr,jat_start,jat_end
1400 if (lprn) write (iout,*) 'int_index=',int_index
1401 int_index_old=int_index
1402 int_index=int_index+last_atom-first_atom+1
1404 & write (iout,*) 'int_index=',int_index,
1405 & ' int_index_old',int_index_old,
1406 & ' lower_index=',lower_index,
1407 & ' upper_index=',upper_index,
1408 & ' atom=',atom,' first_atom=',first_atom,
1409 & ' last_atom=',last_atom
1410 if (int_index.ge.lower_index) then
1412 if (at_start.eq.0) then
1414 jat_start=first_atom-1+lower_index-int_index_old
1416 jat_start=first_atom
1418 if (lprn) write (iout,*) 'jat_start',jat_start
1419 if (int_index.ge.upper_index) then
1421 jat_end=first_atom-1+upper_index-int_index_old
1426 if (lprn) write (iout,*) 'jat_end',jat_end
1431 c------------------------------------------------------------------------------
1432 subroutine hpb_partition
1433 implicit real*8 (a-h,o-z)
1434 include 'DIMENSIONS'
1438 include 'COMMON.SBRIDGE'
1439 include 'COMMON.IOUNITS'
1440 include 'COMMON.SETUP'
1442 call int_bounds(nhpb,link_start,link_end)
1443 write (iout,*) 'Processor',fg_rank,' CG group',kolor,
1444 & ' absolute rank',MyRank,
1445 & ' nhpb',nhpb,' link_start=',link_start,
1446 & ' link_end',link_end