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()
166 athet(j,i,ichir1,ichir2)=0.0D0
167 bthet(j,i,ichir1,ichir2)=0.0D0
187 gaussc(l,k,j,i)=0.0D0
200 v1(k,j,i,iblock)=0.0D0
201 v2(k,j,i,iblock)=0.0D0
211 v1c(1,l,i,j,k,iblock)=0.0D0
212 v1s(1,l,i,j,k,iblock)=0.0D0
213 v1c(2,l,i,j,k,iblock)=0.0D0
214 v1s(2,l,i,j,k,iblock)=0.0D0
218 v2c(m,l,i,j,k,iblock)=0.0D0
219 v2s(m,l,i,j,k,iblock)=0.0D0
231 C Initialize the bridge arrays
250 C Initialize variables used in minimization.
259 C Initialize the variables responsible for the mode of gradient storage.
264 C Initialize constants used to split the energy into long- and short-range
270 nprint_ene=nprint_ene-1
274 c-------------------------------------------------------------------------
276 implicit real*8 (a-h,o-z)
278 include 'COMMON.NAMES'
279 include 'COMMON.FFIELD'
281 &'DD' ,'DPR','DLY','DAR','DHI','DAS','DGL','DSG','DGN','DSN','DTH',
282 &'DYY','DAL','DTY','DTR','DVA','DLE','DIL','DPN','MED','DCY','ZER',
283 &'CYS','MET','PHE','ILE','LEU','VAL','TRP','TYR','ALA','GLY','THR',
284 &'SER','GLN','ASN','GLU','ASP','HIS','ARG','LYS','PRO','D'/
286 &'z','p','k','r','h','d','e','n','q','s','t','g',
287 &'a','y','w','v','l','i','f','m','c','x',
288 &'C','M','F','I','L','V','W','Y','A','G','T',
289 &'S','Q','N','E','D','H','R','K','P','X'/
290 data potname /'LJ','LJK','BP','GB','GBV'/
292 & "EVDW SC-SC","EVDW2 SC-p","EES p-p","ECORR4 ","ECORR5 ",
293 & "ECORR6 ","EELLO ","ETURN3 ","ETURN4 ","ETURN6 ",
294 & "EBE bend","ESC SCloc","ETORS ","ETORSD ","EHPB ","EVDWPP ",
295 & "ESTR ","EVDW2_14 ","UCONST ", " ","ESCCOR"/
297 & "WSC","WSCP","WELEC","WCORR","WCORR5","WCORR6","WEL_LOC",
298 & "WTURN3","WTURN4","WTURN6","WANG","WSCLOC","WTOR","WTORD",
299 & "WSTRAIN","WVDWPP","WBOND","SCAL14"," "," ","WSCCOR"/
301 data print_order/1,2,3,11,12,13,14,4,5,6,7,8,9,10,19,18,15,17,16,
304 c---------------------------------------------------------------------------
305 subroutine init_int_table
306 implicit real*8 (a-h,o-z)
310 integer blocklengths(15),displs(15)
312 include 'COMMON.CONTROL'
313 include 'COMMON.SETUP'
314 include 'COMMON.CHAIN'
315 include 'COMMON.INTERACT'
316 include 'COMMON.LOCAL'
317 include 'COMMON.SBRIDGE'
318 include 'COMMON.TORCNSTR'
319 include 'COMMON.IOUNITS'
320 include 'COMMON.DERIV'
321 include 'COMMON.CONTACTS'
322 common /przechowalnia/ iturn3_start_all(0:MaxProcs),
323 & iturn3_end_all(0:MaxProcs),iturn4_start_all(0:MaxProcs),
324 & iturn4_end_all(0:MaxProcs),iatel_s_all(0:MaxProcs),
325 & iatel_e_all(0:MaxProcs),ielstart_all(maxres,0:MaxProcs-1),
326 & ielend_all(maxres,0:MaxProcs-1),
327 & ntask_cont_from_all(0:max_fg_procs-1),
328 & itask_cont_from_all(0:max_fg_procs-1,0:max_fg_procs-1),
329 & ntask_cont_to_all(0:max_fg_procs-1),
330 & itask_cont_to_all(0:max_fg_procs-1,0:max_fg_procs-1)
331 integer FG_GROUP,CONT_FROM_GROUP,CONT_TO_GROUP
332 logical scheck,lprint,flag
334 integer my_sc_int(0:max_fg_Procs-1),my_sc_intt(0:max_fg_Procs),
335 & my_ele_int(0:max_fg_Procs-1),my_ele_intt(0:max_fg_Procs)
336 C... Determine the numbers of start and end SC-SC interaction
337 C... to deal with by current processor.
339 itask_cont_from(i)=fg_rank
340 itask_cont_to(i)=fg_rank
344 &write (iout,*) 'INIT_INT_TABLE nres=',nres,' nnt=',nnt,' nct=',nct
345 n_sc_int_tot=(nct-nnt+1)*(nct-nnt)/2-nss
346 call int_bounds(n_sc_int_tot,my_sc_inds,my_sc_inde)
348 & write (iout,*) 'Processor',fg_rank,' CG group',kolor,
349 & ' absolute rank',MyRank,
350 & ' n_sc_int_tot',n_sc_int_tot,' my_sc_inds=',my_sc_inds,
351 & ' my_sc_inde',my_sc_inde
371 cd write (iout,*) 'ns=',ns,' nss=',nss,' ihpb,jhpb',
372 cd & (ihpb(i),jhpb(i),i=1,nss)
376 if (ihpb(ii).eq.i+nres) then
383 cd write (iout,*) 'i=',i,' scheck=',scheck,' jj=',jj
387 c write (iout,*) 'jj=i+1'
388 call int_partition(ind_scint,my_sc_inds,my_sc_inde,i,
389 & iatsc_s,iatsc_e,i+2,nct,nint_gr(i),istart(i,1),iend(i,1),*12)
395 else if (jj.eq.nct) then
397 c write (iout,*) 'jj=nct'
398 call int_partition(ind_scint,my_sc_inds,my_sc_inde,i,
399 & iatsc_s,iatsc_e,i+1,nct-1,nint_gr(i),istart(i,1),iend(i,1),*12)
407 call int_partition(ind_scint,my_sc_inds,my_sc_inde,i,
408 & iatsc_s,iatsc_e,i+1,jj-1,nint_gr(i),istart(i,1),iend(i,1),*12)
410 call int_partition(ind_scint,my_sc_inds,my_sc_inde,i,
411 & iatsc_s,iatsc_e,jj+1,nct,nint_gr(i),istart(i,ii),iend(i,ii),*12)
422 call int_partition(ind_scint,my_sc_inds,my_sc_inde,i,
423 & iatsc_s,iatsc_e,i+1,nct,nint_gr(i),istart(i,1),iend(i,1),*12)
428 ind_scint=ind_scint+nct-i
432 ind_scint_old=ind_scint
441 if (lprint) write (*,*) 'Processor',fg_rank,' CG Group',kolor,
442 & ' absolute rank',myrank,' iatsc_s=',iatsc_s,' iatsc_e=',iatsc_e
445 write (iout,'(a)') 'Interaction array:'
447 write (iout,'(i3,2(2x,2i3))')
448 & i,(istart(i,iint),iend(i,iint),iint=1,nint_gr(i))
453 C Now partition the electrostatic-interaction array
455 nele_int_tot=(npept-ispp)*(npept-ispp+1)/2
456 call int_bounds(nele_int_tot,my_ele_inds,my_ele_inde)
458 & write (*,*) 'Processor',fg_rank,' CG group',kolor,
459 & ' absolute rank',MyRank,
460 & ' nele_int_tot',nele_int_tot,' my_ele_inds=',my_ele_inds,
461 & ' my_ele_inde',my_ele_inde
468 call int_partition(ind_eleint,my_ele_inds,my_ele_inde,i,
469 & iatel_s,iatel_e,i+ispp,nct-1,ijunk,ielstart(i),ielend(i),*13)
472 if (iatel_s.eq.0) iatel_s=1
473 nele_int_tot_vdw=(npept-2)*(npept-2+1)/2
474 c write (iout,*) "nele_int_tot_vdw",nele_int_tot_vdw
475 call int_bounds(nele_int_tot_vdw,my_ele_inds_vdw,my_ele_inde_vdw)
476 c write (iout,*) "my_ele_inds_vdw",my_ele_inds_vdw,
477 c & " my_ele_inde_vdw",my_ele_inde_vdw
484 call int_partition(ind_eleint_vdw,my_ele_inds_vdw,
486 & iatel_s_vdw,iatel_e_vdw,i+2,nct-1,ijunk,ielstart_vdw(i),
488 c write (iout,*) i," ielstart_vdw",ielstart_vdw(i),
489 c & " ielend_vdw",ielend_vdw(i)
491 if (iatel_s_vdw.eq.0) iatel_s_vdw=1
502 do i=iatel_s_vdw,iatel_e_vdw
508 write (*,'(a)') 'Processor',fg_rank,' CG group',kolor,
509 & ' absolute rank',MyRank
510 write (iout,*) 'Electrostatic interaction array:'
512 write (iout,'(i3,2(2x,2i3))') i,ielstart(i),ielend(i)
517 C Partition the SC-p interaction array
519 nscp_int_tot=(npept-iscp+1)*(npept-iscp+1)
520 call int_bounds(nscp_int_tot,my_scp_inds,my_scp_inde)
521 if (lprint) write (iout,*) 'Processor',fg_rank,' CG group',kolor,
522 & ' absolute rank',myrank,
523 & ' nscp_int_tot',nscp_int_tot,' my_scp_inds=',my_scp_inds,
524 & ' my_scp_inde',my_scp_inde
530 if (i.lt.nnt+iscp) then
531 cd write (iout,*) 'i.le.nnt+iscp'
532 call int_partition(ind_scpint,my_scp_inds,my_scp_inde,i,
533 & iatscp_s,iatscp_e,i+iscp,nct,nscp_gr(i),iscpstart(i,1),
535 else if (i.gt.nct-iscp) then
536 cd write (iout,*) 'i.gt.nct-iscp'
537 call int_partition(ind_scpint,my_scp_inds,my_scp_inde,i,
538 & iatscp_s,iatscp_e,nnt,i-iscp,nscp_gr(i),iscpstart(i,1),
541 call int_partition(ind_scpint,my_scp_inds,my_scp_inde,i,
542 & iatscp_s,iatscp_e,nnt,i-iscp,nscp_gr(i),iscpstart(i,1),
545 call int_partition(ind_scpint,my_scp_inds,my_scp_inde,i,
546 & iatscp_s,iatscp_e,i+iscp,nct,nscp_gr(i),iscpstart(i,ii),
555 if (i.lt.nnt+iscp) then
557 iscpstart(i,1)=i+iscp
559 elseif (i.gt.nct-iscp) then
567 iscpstart(i,2)=i+iscp
573 write (iout,'(a)') 'SC-p interaction array:'
574 do i=iatscp_s,iatscp_e
575 write (iout,'(i3,2(2x,2i3))')
576 & i,(iscpstart(i,j),iscpend(i,j),j=1,nscp_gr(i))
579 C Partition local interactions
581 call int_bounds(nres-2,loc_start,loc_end)
582 loc_start=loc_start+1
584 call int_bounds(nres-2,ithet_start,ithet_end)
585 ithet_start=ithet_start+2
586 ithet_end=ithet_end+2
587 call int_bounds(nct-nnt-2,iturn3_start,iturn3_end)
588 iturn3_start=iturn3_start+nnt
589 iphi_start=iturn3_start+2
590 iturn3_end=iturn3_end+nnt
591 iphi_end=iturn3_end+2
592 iturn3_start=iturn3_start-1
593 iturn3_end=iturn3_end-1
594 call int_bounds(nres-3,itau_start,itau_end)
595 itau_start=itau_start+3
597 call int_bounds(nres-3,iphi1_start,iphi1_end)
598 iphi1_start=iphi1_start+3
599 iphi1_end=iphi1_end+3
600 call int_bounds(nct-nnt-3,iturn4_start,iturn4_end)
601 iturn4_start=iturn4_start+nnt
602 iphid_start=iturn4_start+2
603 iturn4_end=iturn4_end+nnt
604 iphid_end=iturn4_end+2
605 iturn4_start=iturn4_start-1
606 iturn4_end=iturn4_end-1
607 call int_bounds(nres-2,ibond_start,ibond_end)
608 ibond_start=ibond_start+1
609 ibond_end=ibond_end+1
610 call int_bounds(nct-nnt,ibondp_start,ibondp_end)
611 ibondp_start=ibondp_start+nnt
612 ibondp_end=ibondp_end+nnt
613 call int_bounds1(nres-1,ivec_start,ivec_end)
614 c print *,"Processor",myrank,fg_rank,fg_rank1,
615 c & " ivec_start",ivec_start," ivec_end",ivec_end
616 iset_start=loc_start+2
618 if (ndih_constr.eq.0) then
622 call int_bounds(ndih_constr,idihconstr_start,idihconstr_end)
624 c nsumgrad=(nres-nnt)*(nres-nnt+1)/2
626 nsumgrad=(nres-nnt)*(nres-nnt+1)/2
628 call int_bounds(nsumgrad,ngrad_start,ngrad_end)
629 igrad_start=((2*nlen+1)
630 & -sqrt(float((2*nlen-1)**2-8*(ngrad_start-1))))/2
631 jgrad_start(igrad_start)=
632 & ngrad_start-(2*nlen-igrad_start)*(igrad_start-1)/2
634 jgrad_end(igrad_start)=nres
635 igrad_end=((2*nlen+1)
636 & -sqrt(float((2*nlen-1)**2-8*(ngrad_end-1))))/2
637 if (igrad_end.gt.igrad_start) jgrad_start(igrad_end)=igrad_end+1
638 jgrad_end(igrad_end)=ngrad_end-(2*nlen-igrad_end)*(igrad_end-1)/2
640 do i=igrad_start+1,igrad_end-1
645 write (*,*) 'Processor:',fg_rank,' CG group',kolor,
646 & ' absolute rank',myrank,
647 & ' loc_start',loc_start,' loc_end',loc_end,
648 & ' ithet_start',ithet_start,' ithet_end',ithet_end,
649 & ' iphi_start',iphi_start,' iphi_end',iphi_end,
650 & ' iphid_start',iphid_start,' iphid_end',iphid_end,
651 & ' ibond_start',ibond_start,' ibond_end',ibond_end,
652 & ' ibondp_start',ibondp_start,' ibondp_end',ibondp_end,
653 & ' iturn3_start',iturn3_start,' iturn3_end',iturn3_end,
654 & ' iturn4_start',iturn4_start,' iturn4_end',iturn4_end,
655 & ' ivec_start',ivec_start,' ivec_end',ivec_end,
656 & ' iset_start',iset_start,' iset_end',iset_end,
657 & ' idihconstr_start',idihconstr_start,' idihconstr_end',
659 write (*,*) 'Processor:',fg_rank,myrank,' igrad_start',
660 & igrad_start,' igrad_end',igrad_end,' ngrad_start',ngrad_start,
661 & ' ngrad_end',ngrad_end
662 do i=igrad_start,igrad_end
663 write(*,*) 'Processor:',fg_rank,myrank,i,
664 & jgrad_start(i),jgrad_end(i)
667 if (nfgtasks.gt.1) then
668 call MPI_Allgather(ivec_start,1,MPI_INTEGER,ivec_displ(0),1,
669 & MPI_INTEGER,FG_COMM1,IERROR)
670 iaux=ivec_end-ivec_start+1
671 call MPI_Allgather(iaux,1,MPI_INTEGER,ivec_count(0),1,
672 & MPI_INTEGER,FG_COMM1,IERROR)
673 call MPI_Allgather(iset_start-2,1,MPI_INTEGER,iset_displ(0),1,
674 & MPI_INTEGER,FG_COMM,IERROR)
675 iaux=iset_end-iset_start+1
676 call MPI_Allgather(iaux,1,MPI_INTEGER,iset_count(0),1,
677 & MPI_INTEGER,FG_COMM,IERROR)
678 call MPI_Allgather(ibond_start,1,MPI_INTEGER,ibond_displ(0),1,
679 & MPI_INTEGER,FG_COMM,IERROR)
680 iaux=ibond_end-ibond_start+1
681 call MPI_Allgather(iaux,1,MPI_INTEGER,ibond_count(0),1,
682 & MPI_INTEGER,FG_COMM,IERROR)
683 call MPI_Allgather(ithet_start,1,MPI_INTEGER,ithet_displ(0),1,
684 & MPI_INTEGER,FG_COMM,IERROR)
685 iaux=ithet_end-ithet_start+1
686 call MPI_Allgather(iaux,1,MPI_INTEGER,ithet_count(0),1,
687 & MPI_INTEGER,FG_COMM,IERROR)
688 call MPI_Allgather(iphi_start,1,MPI_INTEGER,iphi_displ(0),1,
689 & MPI_INTEGER,FG_COMM,IERROR)
690 iaux=iphi_end-iphi_start+1
691 call MPI_Allgather(iaux,1,MPI_INTEGER,iphi_count(0),1,
692 & MPI_INTEGER,FG_COMM,IERROR)
693 call MPI_Allgather(iphi1_start,1,MPI_INTEGER,iphi1_displ(0),1,
694 & MPI_INTEGER,FG_COMM,IERROR)
695 iaux=iphi1_end-iphi1_start+1
696 call MPI_Allgather(iaux,1,MPI_INTEGER,iphi1_count(0),1,
697 & MPI_INTEGER,FG_COMM,IERROR)
704 call MPI_Allgather(iturn3_start,1,MPI_INTEGER,
705 & iturn3_start_all(0),1,MPI_INTEGER,FG_COMM,IERROR)
706 call MPI_Allgather(iturn4_start,1,MPI_INTEGER,
707 & iturn4_start_all(0),1,MPI_INTEGER,FG_COMM,IERROR)
708 call MPI_Allgather(iturn3_end,1,MPI_INTEGER,
709 & iturn3_end_all(0),1,MPI_INTEGER,FG_COMM,IERROR)
710 call MPI_Allgather(iturn4_end,1,MPI_INTEGER,
711 & iturn4_end_all(0),1,MPI_INTEGER,FG_COMM,IERROR)
712 call MPI_Allgather(iatel_s,1,MPI_INTEGER,
713 & iatel_s_all(0),1,MPI_INTEGER,FG_COMM,IERROR)
714 call MPI_Allgather(iatel_e,1,MPI_INTEGER,
715 & iatel_e_all(0),1,MPI_INTEGER,FG_COMM,IERROR)
716 call MPI_Allgather(ielstart(1),maxres,MPI_INTEGER,
717 & ielstart_all(1,0),maxres,MPI_INTEGER,FG_COMM,IERROR)
718 call MPI_Allgather(ielend(1),maxres,MPI_INTEGER,
719 & ielend_all(1,0),maxres,MPI_INTEGER,FG_COMM,IERROR)
721 write (iout,*) "iatel_s_all",(iatel_s_all(i),i=0,nfgtasks)
722 write (iout,*) "iatel_e_all",(iatel_e_all(i),i=0,nfgtasks)
723 write (iout,*) "iturn3_start_all",
724 & (iturn3_start_all(i),i=0,nfgtasks-1)
725 write (iout,*) "iturn3_end_all",
726 & (iturn3_end_all(i),i=0,nfgtasks-1)
727 write (iout,*) "iturn4_start_all",
728 & (iturn4_start_all(i),i=0,nfgtasks-1)
729 write (iout,*) "iturn4_end_all",
730 & (iturn4_end_all(i),i=0,nfgtasks-1)
731 write (iout,*) "The ielstart_all array"
733 write (iout,'(20i4)') i,(ielstart_all(i,j),j=0,nfgtasks-1)
735 write (iout,*) "The ielend_all array"
737 write (iout,'(20i4)') i,(ielend_all(i,j),j=0,nfgtasks-1)
743 itask_cont_from(0)=fg_rank
744 itask_cont_to(0)=fg_rank
746 do ii=iturn3_start,iturn3_end
747 call add_int(ii,ii+2,iturn3_sent(1,ii),
748 & ntask_cont_to,itask_cont_to,flag)
750 do ii=iturn4_start,iturn4_end
751 call add_int(ii,ii+3,iturn4_sent(1,ii),
752 & ntask_cont_to,itask_cont_to,flag)
754 do ii=iturn3_start,iturn3_end
755 call add_int_from(ii,ii+2,ntask_cont_from,itask_cont_from)
757 do ii=iturn4_start,iturn4_end
758 call add_int_from(ii,ii+3,ntask_cont_from,itask_cont_from)
761 write (iout,*) "After turn3 ntask_cont_from",ntask_cont_from,
762 & " ntask_cont_to",ntask_cont_to
763 write (iout,*) "itask_cont_from",
764 & (itask_cont_from(i),i=1,ntask_cont_from)
765 write (iout,*) "itask_cont_to",
766 & (itask_cont_to(i),i=1,ntask_cont_to)
769 c write (iout,*) "Loop forward"
772 c write (iout,*) "from loop i=",i
774 do j=ielstart(i),ielend(i)
775 call add_int_from(i,j,ntask_cont_from,itask_cont_from)
778 c write (iout,*) "Loop backward iatel_e-1",iatel_e-1,
779 c & " iatel_e",iatel_e
783 c write (iout,*) "i",i," ielstart",ielstart(i),
784 c & " ielend",ielend(i)
787 do j=ielstart(i),ielend(i)
788 call add_int(i,j,iint_sent(1,j,nat_sent+1),ntask_cont_to,
789 & itask_cont_to,flag)
797 write (iout,*)"After longrange ntask_cont_from",ntask_cont_from,
798 & " ntask_cont_to",ntask_cont_to
799 write (iout,*) "itask_cont_from",
800 & (itask_cont_from(i),i=1,ntask_cont_from)
801 write (iout,*) "itask_cont_to",
802 & (itask_cont_to(i),i=1,ntask_cont_to)
804 write (iout,*) "iint_sent"
807 write (iout,'(20i4)') ii,(j,(iint_sent(k,j,i),k=1,4),
808 & j=ielstart(ii),ielend(ii))
810 write (iout,*) "iturn3_sent iturn3_start",iturn3_start,
811 & " iturn3_end",iturn3_end
812 write (iout,'(20i4)') (i,(iturn3_sent(j,i),j=1,4),
813 & i=iturn3_start,iturn3_end)
814 write (iout,*) "iturn4_sent iturn4_start",iturn4_start,
815 & " iturn4_end",iturn4_end
816 write (iout,'(20i4)') (i,(iturn4_sent(j,i),j=1,4),
817 & i=iturn4_start,iturn4_end)
820 call MPI_Gather(ntask_cont_from,1,MPI_INTEGER,
821 & ntask_cont_from_all,1,MPI_INTEGER,king,FG_COMM,IERR)
822 c write (iout,*) "Gather ntask_cont_from ended"
824 call MPI_Gather(itask_cont_from(0),max_fg_procs,MPI_INTEGER,
825 & itask_cont_from_all(0,0),max_fg_procs,MPI_INTEGER,king,
827 c write (iout,*) "Gather itask_cont_from ended"
829 call MPI_Gather(ntask_cont_to,1,MPI_INTEGER,ntask_cont_to_all,
830 & 1,MPI_INTEGER,king,FG_COMM,IERR)
831 c write (iout,*) "Gather ntask_cont_to ended"
833 call MPI_Gather(itask_cont_to,max_fg_procs,MPI_INTEGER,
834 & itask_cont_to_all,max_fg_procs,MPI_INTEGER,king,FG_COMM,IERR)
835 c write (iout,*) "Gather itask_cont_to ended"
837 if (fg_rank.eq.king) then
838 write (iout,*)"Contact receive task map (proc, #tasks, tasks)"
840 write (iout,'(20i4)') i,ntask_cont_from_all(i),
841 & (itask_cont_from_all(j,i),j=1,ntask_cont_from_all(i))
845 write (iout,*) "Contact send task map (proc, #tasks, tasks)"
847 write (iout,'(20i4)') i,ntask_cont_to_all(i),
848 & (itask_cont_to_all(j,i),j=1,ntask_cont_to_all(i))
852 C Check if every send will have a matching receive
856 ncheck_to=ncheck_to+ntask_cont_to_all(i)
857 ncheck_from=ncheck_from+ntask_cont_from_all(i)
859 write (iout,*) "Control sums",ncheck_from,ncheck_to
860 if (ncheck_from.ne.ncheck_to) then
861 write (iout,*) "Error: #receive differs from #send."
862 write (iout,*) "Terminating program...!"
868 do j=1,ntask_cont_to_all(i)
869 ii=itask_cont_to_all(j,i)
870 do k=1,ntask_cont_from_all(ii)
871 if (itask_cont_from_all(k,ii).eq.i) then
872 if(lprint)write(iout,*)"Matching send/receive",i,ii
876 if (k.eq.ntask_cont_from_all(ii)+1) then
878 write (iout,*) "Error: send by",j," to",ii,
879 & " would have no matching receive"
885 write (iout,*) "Unmatched sends; terminating program"
889 call MPI_Bcast(flag,1,MPI_LOGICAL,king,FG_COMM,IERROR)
890 c write (iout,*) "flag broadcast ended flag=",flag
893 call MPI_Finalize(IERROR)
894 stop "Error in INIT_INT_TABLE: unmatched send/receive."
896 call MPI_Comm_group(FG_COMM,fg_group,IERR)
897 c write (iout,*) "MPI_Comm_group ended"
899 call MPI_Group_incl(fg_group,ntask_cont_from+1,
900 & itask_cont_from(0),CONT_FROM_GROUP,IERR)
901 call MPI_Group_incl(fg_group,ntask_cont_to+1,itask_cont_to(0),
902 & CONT_TO_GROUP,IERR)
905 iaux=4*(ielend(ii)-ielstart(ii)+1)
906 call MPI_Group_translate_ranks(fg_group,iaux,
907 & iint_sent(1,ielstart(ii),i),CONT_TO_GROUP,
908 & iint_sent_local(1,ielstart(ii),i),IERR )
909 c write (iout,*) "Ranks translated i=",i
912 iaux=4*(iturn3_end-iturn3_start+1)
913 call MPI_Group_translate_ranks(fg_group,iaux,
914 & iturn3_sent(1,iturn3_start),CONT_TO_GROUP,
915 & iturn3_sent_local(1,iturn3_start),IERR)
916 iaux=4*(iturn4_end-iturn4_start+1)
917 call MPI_Group_translate_ranks(fg_group,iaux,
918 & iturn4_sent(1,iturn4_start),CONT_TO_GROUP,
919 & iturn4_sent_local(1,iturn4_start),IERR)
921 write (iout,*) "iint_sent_local"
924 write (iout,'(20i4)') ii,(j,(iint_sent_local(k,j,i),k=1,4),
925 & j=ielstart(ii),ielend(ii))
928 write (iout,*) "iturn3_sent_local iturn3_start",iturn3_start,
929 & " iturn3_end",iturn3_end
930 write (iout,'(20i4)') (i,(iturn3_sent_local(j,i),j=1,4),
931 & i=iturn3_start,iturn3_end)
932 write (iout,*) "iturn4_sent_local iturn4_start",iturn4_start,
933 & " iturn4_end",iturn4_end
934 write (iout,'(20i4)') (i,(iturn4_sent_local(j,i),j=1,4),
935 & i=iturn4_start,iturn4_end)
938 call MPI_Group_free(fg_group,ierr)
939 call MPI_Group_free(cont_from_group,ierr)
940 call MPI_Group_free(cont_to_group,ierr)
941 call MPI_Type_contiguous(3,MPI_DOUBLE_PRECISION,MPI_UYZ,IERROR)
942 call MPI_Type_commit(MPI_UYZ,IERROR)
943 call MPI_Type_contiguous(18,MPI_DOUBLE_PRECISION,MPI_UYZGRAD,
945 call MPI_Type_commit(MPI_UYZGRAD,IERROR)
946 call MPI_Type_contiguous(2,MPI_DOUBLE_PRECISION,MPI_MU,IERROR)
947 call MPI_Type_commit(MPI_MU,IERROR)
948 call MPI_Type_contiguous(4,MPI_DOUBLE_PRECISION,MPI_MAT1,IERROR)
949 call MPI_Type_commit(MPI_MAT1,IERROR)
950 call MPI_Type_contiguous(8,MPI_DOUBLE_PRECISION,MPI_MAT2,IERROR)
951 call MPI_Type_commit(MPI_MAT2,IERROR)
952 call MPI_Type_contiguous(6,MPI_DOUBLE_PRECISION,MPI_THET,IERROR)
953 call MPI_Type_commit(MPI_THET,IERROR)
954 call MPI_Type_contiguous(9,MPI_DOUBLE_PRECISION,MPI_GAM,IERROR)
955 call MPI_Type_commit(MPI_GAM,IERROR)
957 c 9/22/08 Derived types to send matrices which appear in correlation terms
959 if (ivec_count(i).eq.ivec_count(0)) then
965 do ind_typ=lentyp(0),lentyp(nfgtasks-1)
966 if (ind_typ.eq.0) then
976 c displs(i)=displs(i-1)+blocklengths(i-1)*maxres
979 c blocklengths(i)=blocklengths(i)*ichunk
981 c write (iout,*) "blocklengths and displs"
983 c write (iout,*) i,blocklengths(i),displs(i)
986 c call MPI_Type_indexed(4,blocklengths(1),displs(1),
987 c & MPI_DOUBLE_PRECISION,MPI_ROTAT1(ind_typ),IERROR)
988 c call MPI_Type_commit(MPI_ROTAT1(ind_typ),IERROR)
989 c write (iout,*) "MPI_ROTAT1",MPI_ROTAT1
995 c displs(i)=displs(i-1)+blocklengths(i-1)*maxres
998 c blocklengths(i)=blocklengths(i)*ichunk
1000 c write (iout,*) "blocklengths and displs"
1002 c write (iout,*) i,blocklengths(i),displs(i)
1005 c call MPI_Type_indexed(4,blocklengths(1),displs(1),
1006 c & MPI_DOUBLE_PRECISION,MPI_ROTAT2(ind_typ),IERROR)
1007 c call MPI_Type_commit(MPI_ROTAT2(ind_typ),IERROR)
1008 c write (iout,*) "MPI_ROTAT2",MPI_ROTAT2
1014 displs(i)=displs(i-1)+blocklengths(i-1)*maxres
1017 blocklengths(i)=blocklengths(i)*ichunk
1019 call MPI_Type_indexed(8,blocklengths,displs,
1020 & MPI_DOUBLE_PRECISION,MPI_PRECOMP11(ind_typ),IERROR)
1021 call MPI_Type_commit(MPI_PRECOMP11(ind_typ),IERROR)
1027 displs(i)=displs(i-1)+blocklengths(i-1)*maxres
1030 blocklengths(i)=blocklengths(i)*ichunk
1032 call MPI_Type_indexed(8,blocklengths,displs,
1033 & MPI_DOUBLE_PRECISION,MPI_PRECOMP12(ind_typ),IERROR)
1034 call MPI_Type_commit(MPI_PRECOMP12(ind_typ),IERROR)
1040 displs(i)=displs(i-1)+blocklengths(i-1)*maxres
1043 blocklengths(i)=blocklengths(i)*ichunk
1045 call MPI_Type_indexed(6,blocklengths,displs,
1046 & MPI_DOUBLE_PRECISION,MPI_PRECOMP22(ind_typ),IERROR)
1047 call MPI_Type_commit(MPI_PRECOMP22(ind_typ),IERROR)
1053 displs(i)=displs(i-1)+blocklengths(i-1)*maxres
1056 blocklengths(i)=blocklengths(i)*ichunk
1058 call MPI_Type_indexed(2,blocklengths,displs,
1059 & MPI_DOUBLE_PRECISION,MPI_PRECOMP23(ind_typ),IERROR)
1060 call MPI_Type_commit(MPI_PRECOMP23(ind_typ),IERROR)
1066 displs(i)=displs(i-1)+blocklengths(i-1)*maxres
1069 blocklengths(i)=blocklengths(i)*ichunk
1071 call MPI_Type_indexed(4,blocklengths,displs,
1072 & MPI_DOUBLE_PRECISION,MPI_ROTAT_OLD(ind_typ),IERROR)
1073 call MPI_Type_commit(MPI_ROTAT_OLD(ind_typ),IERROR)
1077 iint_start=ivec_start+1
1080 iint_count(i)=ivec_count(i)
1081 iint_displ(i)=ivec_displ(i)
1082 ivec_displ(i)=ivec_displ(i)-1
1083 iset_displ(i)=iset_displ(i)-1
1084 ithet_displ(i)=ithet_displ(i)-1
1085 iphi_displ(i)=iphi_displ(i)-1
1086 iphi1_displ(i)=iphi1_displ(i)-1
1087 ibond_displ(i)=ibond_displ(i)-1
1089 if (nfgtasks.gt.1 .and. fg_rank.eq.king
1090 & .and. (me.eq.0 .or. .not. out1file)) then
1091 write (iout,*) "IVEC_DISPL, IVEC_COUNT, ISET_START, ISET_COUNT"
1093 write (iout,*) i,ivec_displ(i),ivec_count(i),iset_displ(i),
1096 write (iout,*) "iphi_start",iphi_start," iphi_end",iphi_end,
1097 & " iphi1_start",iphi1_start," iphi1_end",iphi1_end
1098 write (iout,*)"IPHI_COUNT, IPHI_DISPL, IPHI1_COUNT, IPHI1_DISPL"
1100 write (iout,*) i,iphi_count(i),iphi_displ(i),iphi1_count(i),
1103 write(iout,'(i10,a,i10,a,i10,a/a,i3,a)') n_sc_int_tot,' SC-SC ',
1104 & nele_int_tot,' electrostatic and ',nscp_int_tot,
1105 & ' SC-p interactions','were distributed among',nfgtasks,
1106 & ' fine-grain processors.'
1122 idihconstr_end=ndih_constr
1123 iphid_start=iphi_start
1124 iphid_end=iphi_end-1
1141 c---------------------------------------------------------------------------
1142 subroutine add_int(ii,jj,itask,ntask_cont_to,itask_cont_to,flag)
1144 include "DIMENSIONS"
1145 include "COMMON.INTERACT"
1146 include "COMMON.SETUP"
1147 include "COMMON.IOUNITS"
1148 integer ii,jj,itask(4),ntask_cont_to,itask_cont_to(0:MaxProcs-1)
1150 integer iturn3_start_all,iturn3_end_all,iturn4_start_all,
1151 & iturn4_end_all,iatel_s_all,iatel_e_all,ielstart_all,ielend_all
1152 common /przechowalnia/ iturn3_start_all(0:MaxProcs),
1153 & iturn3_end_all(0:MaxProcs),iturn4_start_all(0:MaxProcs),
1154 & iturn4_end_all(0:MaxProcs),iatel_s_all(0:MaxProcs),
1155 & iatel_e_all(0:MaxProcs),ielstart_all(maxres,0:MaxProcs-1),
1156 & ielend_all(maxres,0:MaxProcs-1)
1157 integer iproc,isent,k,l
1158 c Determines whether to send interaction ii,jj to other processors; a given
1159 c interaction can be sent to at most 2 processors.
1160 c Sets flag=.true. if interaction ii,jj needs to be sent to at least
1161 c one processor, otherwise flag is unchanged from the input value.
1167 c write (iout,*) "ii",ii," jj",jj
1168 c Loop over processors to check if anybody could need interaction ii,jj
1169 do iproc=0,fg_rank-1
1170 c Check if the interaction matches any turn3 at iproc
1171 do k=iturn3_start_all(iproc),iturn3_end_all(iproc)
1173 if (k.eq.ii-1 .and. l.eq.jj-1 .or. k.eq.ii-1 .and. l.eq.jj+1
1174 & .or. k.eq.ii+1 .and. l.eq.jj+1 .or. k.eq.ii+1 .and. l.eq.jj-1)
1176 c write (iout,*) "turn3 to iproc",iproc," ij",ii,jj,"kl",k,l
1179 if (iproc.ne.itask(1).and.iproc.ne.itask(2)
1180 & .and.iproc.ne.itask(3).and.iproc.ne.itask(4)) then
1183 call add_task(iproc,ntask_cont_to,itask_cont_to)
1187 C Check if the interaction matches any turn4 at iproc
1188 do k=iturn4_start_all(iproc),iturn4_end_all(iproc)
1190 if (k.eq.ii-1 .and. l.eq.jj-1 .or. k.eq.ii-1 .and. l.eq.jj+1
1191 & .or. k.eq.ii+1 .and. l.eq.jj+1 .or. k.eq.ii+1 .and. l.eq.jj-1)
1193 c write (iout,*) "turn3 to iproc",iproc," ij",ii,jj," kl",k,l
1196 if (iproc.ne.itask(1).and.iproc.ne.itask(2)
1197 & .and.iproc.ne.itask(3).and.iproc.ne.itask(4)) then
1200 call add_task(iproc,ntask_cont_to,itask_cont_to)
1204 if (iatel_s_all(iproc).gt.0 .and. iatel_e_all(iproc).gt.0 .and.
1205 & iatel_s_all(iproc).le.ii-1 .and. iatel_e_all(iproc).ge.ii-1)then
1206 if (ielstart_all(ii-1,iproc).le.jj-1.and.
1207 & ielend_all(ii-1,iproc).ge.jj-1) then
1209 if (iproc.ne.itask(1).and.iproc.ne.itask(2)
1210 & .and.iproc.ne.itask(3).and.iproc.ne.itask(4)) then
1213 call add_task(iproc,ntask_cont_to,itask_cont_to)
1216 if (ielstart_all(ii-1,iproc).le.jj+1.and.
1217 & ielend_all(ii-1,iproc).ge.jj+1) then
1219 if (iproc.ne.itask(1).and.iproc.ne.itask(2)
1220 & .and.iproc.ne.itask(3).and.iproc.ne.itask(4)) then
1223 call add_task(iproc,ntask_cont_to,itask_cont_to)
1230 c---------------------------------------------------------------------------
1231 subroutine add_int_from(ii,jj,ntask_cont_from,itask_cont_from)
1233 include "DIMENSIONS"
1234 include "COMMON.INTERACT"
1235 include "COMMON.SETUP"
1236 include "COMMON.IOUNITS"
1237 integer ii,jj,itask(2),ntask_cont_from,
1238 & itask_cont_from(0:MaxProcs-1)
1240 integer iturn3_start_all,iturn3_end_all,iturn4_start_all,
1241 & iturn4_end_all,iatel_s_all,iatel_e_all,ielstart_all,ielend_all
1242 common /przechowalnia/ iturn3_start_all(0:MaxProcs),
1243 & iturn3_end_all(0:MaxProcs),iturn4_start_all(0:MaxProcs),
1244 & iturn4_end_all(0:MaxProcs),iatel_s_all(0:MaxProcs),
1245 & iatel_e_all(0:MaxProcs),ielstart_all(maxres,0:MaxProcs-1),
1246 & ielend_all(maxres,0:MaxProcs-1)
1248 do iproc=fg_rank+1,nfgtasks-1
1249 do k=iturn3_start_all(iproc),iturn3_end_all(iproc)
1251 if (k.eq.ii+1 .and. l.eq.jj+1 .or. k.eq.ii+1.and.l.eq.jj-1
1252 & .or. k.eq.ii-1 .and. l.eq.jj-1 .or. k.eq.ii-1 .and. l.eq.jj+1)
1254 c write (iout,*)"turn3 from iproc",iproc," ij",ii,jj," kl",k,l
1255 call add_task(iproc,ntask_cont_from,itask_cont_from)
1258 do k=iturn4_start_all(iproc),iturn4_end_all(iproc)
1260 if (k.eq.ii+1 .and. l.eq.jj+1 .or. k.eq.ii+1.and.l.eq.jj-1
1261 & .or. k.eq.ii-1 .and. l.eq.jj-1 .or. k.eq.ii-1 .and. l.eq.jj+1)
1263 c write (iout,*)"turn4 from iproc",iproc," ij",ii,jj," kl",k,l
1264 call add_task(iproc,ntask_cont_from,itask_cont_from)
1267 if (iatel_s_all(iproc).gt.0 .and. iatel_e_all(iproc).gt.0) then
1268 if (ii+1.ge.iatel_s_all(iproc).and.ii+1.le.iatel_e_all(iproc))
1270 if (jj+1.ge.ielstart_all(ii+1,iproc).and.
1271 & jj+1.le.ielend_all(ii+1,iproc)) then
1272 call add_task(iproc,ntask_cont_from,itask_cont_from)
1274 if (jj-1.ge.ielstart_all(ii+1,iproc).and.
1275 & jj-1.le.ielend_all(ii+1,iproc)) then
1276 call add_task(iproc,ntask_cont_from,itask_cont_from)
1279 if (ii-1.ge.iatel_s_all(iproc).and.ii-1.le.iatel_e_all(iproc))
1281 if (jj-1.ge.ielstart_all(ii-1,iproc).and.
1282 & jj-1.le.ielend_all(ii-1,iproc)) then
1283 call add_task(iproc,ntask_cont_from,itask_cont_from)
1285 if (jj+1.ge.ielstart_all(ii-1,iproc).and.
1286 & jj+1.le.ielend_all(ii-1,iproc)) then
1287 call add_task(iproc,ntask_cont_from,itask_cont_from)
1294 c---------------------------------------------------------------------------
1295 subroutine add_task(iproc,ntask_cont,itask_cont)
1297 include "DIMENSIONS"
1298 integer iproc,ntask_cont,itask_cont(0:MaxProcs-1)
1301 if (itask_cont(ii).eq.iproc) return
1303 ntask_cont=ntask_cont+1
1304 itask_cont(ntask_cont)=iproc
1307 c---------------------------------------------------------------------------
1308 subroutine int_bounds(total_ints,lower_bound,upper_bound)
1309 implicit real*8 (a-h,o-z)
1310 include 'DIMENSIONS'
1312 include 'COMMON.SETUP'
1313 integer total_ints,lower_bound,upper_bound
1314 integer int4proc(0:max_fg_procs),sint4proc(0:max_fg_procs)
1315 nint=total_ints/nfgtasks
1319 nexcess=total_ints-nint*nfgtasks
1321 int4proc(nfgtasks-i)=int4proc(nfgtasks-i)+1
1325 lower_bound=lower_bound+int4proc(i)
1327 upper_bound=lower_bound+int4proc(fg_rank)
1328 lower_bound=lower_bound+1
1331 c---------------------------------------------------------------------------
1332 subroutine int_bounds1(total_ints,lower_bound,upper_bound)
1333 implicit real*8 (a-h,o-z)
1334 include 'DIMENSIONS'
1336 include 'COMMON.SETUP'
1337 integer total_ints,lower_bound,upper_bound
1338 integer int4proc(0:max_fg_procs),sint4proc(0:max_fg_procs)
1339 nint=total_ints/nfgtasks1
1343 nexcess=total_ints-nint*nfgtasks1
1345 int4proc(nfgtasks1-i)=int4proc(nfgtasks1-i)+1
1349 lower_bound=lower_bound+int4proc(i)
1351 upper_bound=lower_bound+int4proc(fg_rank1)
1352 lower_bound=lower_bound+1
1355 c---------------------------------------------------------------------------
1356 subroutine int_partition(int_index,lower_index,upper_index,atom,
1357 & at_start,at_end,first_atom,last_atom,int_gr,jat_start,jat_end,*)
1358 implicit real*8 (a-h,o-z)
1359 include 'DIMENSIONS'
1360 include 'COMMON.IOUNITS'
1361 integer int_index,lower_index,upper_index,atom,at_start,at_end,
1362 & first_atom,last_atom,int_gr,jat_start,jat_end
1365 if (lprn) write (iout,*) 'int_index=',int_index
1366 int_index_old=int_index
1367 int_index=int_index+last_atom-first_atom+1
1369 & write (iout,*) 'int_index=',int_index,
1370 & ' int_index_old',int_index_old,
1371 & ' lower_index=',lower_index,
1372 & ' upper_index=',upper_index,
1373 & ' atom=',atom,' first_atom=',first_atom,
1374 & ' last_atom=',last_atom
1375 if (int_index.ge.lower_index) then
1377 if (at_start.eq.0) then
1379 jat_start=first_atom-1+lower_index-int_index_old
1381 jat_start=first_atom
1383 if (lprn) write (iout,*) 'jat_start',jat_start
1384 if (int_index.ge.upper_index) then
1386 jat_end=first_atom-1+upper_index-int_index_old
1391 if (lprn) write (iout,*) 'jat_end',jat_end
1396 c------------------------------------------------------------------------------
1397 subroutine hpb_partition
1398 implicit real*8 (a-h,o-z)
1399 include 'DIMENSIONS'
1403 include 'COMMON.SBRIDGE'
1404 include 'COMMON.IOUNITS'
1405 include 'COMMON.SETUP'
1407 call int_bounds(nhpb,link_start,link_end)
1408 write (iout,*) 'Processor',fg_rank,' CG group',kolor,
1409 & ' absolute rank',MyRank,
1410 & ' nhpb',nhpb,' link_start=',link_start,
1411 & ' link_end',link_end