********>Bugfix 21 Author: Ross Walker Date: 10/20/2006 Programs: sander (idc>0) and divcon Description: This is a workaround for a bug identified in the Intel 9.1 fortran compiler. The Intel compiler generates incorrect machine code (that leads to segfaults at runtime) for loops of the form: do i=1,imax array(i) = 0.0D0 if(do_extra) array2(i) = 0.0d0 enddo Fix: This patch fixes multiple files so copy it to $AMBERHOME and then apply it with patch -p0 < bugfix.21 ------------------------------------------------------------------------------ *** src/dcqtp/src/scf/fock.F90 2006-04-03 16:34:28.000000000 -0700 --- src/dcqtp/src/scf/fock.F90 2006-10-20 08:39:00.000000000 -0700 *************** *** 54,67 **** IIMAX = IIMAT(NATOMS+1)-1 IPMAX = IP1(NATOMS+1) IJMAX = IJMAT(IPMAX)-1 ! DO 10 II=1,IIMAX ! FDIAG(II) = 0.0D0 ! if(donmr) FIDIAG(II) = 0.0d0 ! 10 ENDDO ! DO 20 IJ=1,IJMAX ! FDIAT(IJ) = 0.0D0 ! if(donmr) FIDIAT(IJ) = 0.0d0 ! 20 ENDDO #ifdef MPI_NOMC IF ( .NOT. STAND) THEN --- 54,66 ---- IIMAX = IIMAT(NATOMS+1)-1 IPMAX = IP1(NATOMS+1) IJMAX = IJMAT(IPMAX)-1 ! ! FDIAG(1:IIMAX) = 0.0d0 ! FDIAT(1:IJMAX) = 0.0d0 ! if (donmr) then ! FIDIAG(1:IIMAX) = 0.0d0 ! FIDIAT(1:IJMAX) = 0.0d0 ! end if #ifdef MPI_NOMC IF ( .NOT. STAND) THEN *************** *** 87,102 **** ! JV First init everything to zero, then go back and do diagonal of hdiag ! Can leave this in serial version, but done this way for parallel version ! do II=1,IIMAX ! HDIAG(II) = 0.0D0 ! if(donmr) HIDIAG(II) = 0.0d0 ! ! enddo ! do IJ=1,IJMAX ! HDIAT(IJ) = 0.0D0 ! if(donmr) HIDIAT(IJ) = 0.0d0 ! ! enddo ! JV Must set whole arrays to zero before doing any of this in parallel ! because after first cycle arrays will have garabage all over the place --- 86,97 ---- ! JV First init everything to zero, then go back and do diagonal of hdiag ! Can leave this in serial version, but done this way for parallel version ! HDIAG(1:iimax) = 0.0d0 ! HDIAT(1:ijmax) = 0.0d0 ! if(donmr) then ! HIDIAG(1:iimax) = 0.0d0 ! HIDIAT(1:ijmax) = 0.0d0 ! endif ! JV Must set whole arrays to zero before doing any of this in parallel ! because after first cycle arrays will have garabage all over the place *************** *** 823,840 **** ! ADD IN 1-ELECTRON MATRIX. ! ! !c write(*,*) "%% ============================" ! DO 1010 II=1,IIMAX ! FDIAG(II) = FDIAG(II) + HDIAG(II) ! if(donmr) FIDIAG(II) = FIDIAG(II) + HIDIAG(II) ! 1010 ENDDO ! !c write(*,*) "%% ============================" ! ! DO 1020 IJ=1,IJMAX ! FDIAT(IJ) = FDIAT(IJ) + HDIAT(IJ) ! if(donmr) FIDIAT(IJ) = FIDIAT(IJ) + HIDIAT(IJ) ! 1020 ENDDO RETURN end SUBROUTINE FOCK --- 818,829 ---- ! ADD IN 1-ELECTRON MATRIX. ! FDIAG(1:IIMAX) = FDIAG(1:IIMAX) + HDIAG(1:IIMAX) ! FDIAT(1:IJMAX) = FDIAT(1:IJMAX) + HDIAT(1:IJMAX) ! if (donmr) then ! FIDIAG(1:IIMAX) = FIDIAG(1:IIMAX) + HIDIAG(1:IIMAX) ! FIDIAT(1:IJMAX) = FIDIAT(1:IJMAX) + HIDIAT(1:IJMAX) ! endif RETURN end SUBROUTINE FOCK *** src/dcqtp/src/scf/fockqmmm.F90 2006-04-03 16:34:28.000000000 -0700 --- src/dcqtp/src/scf/fockqmmm.F90 2006-10-20 08:39:18.000000000 -0700 *************** *** 55,68 **** IIMAX = IIMAT(NATOMS+1)-1 IPMAX = IP1(NATOMS+1) IJMAX = IJMAT(IPMAX)-1 ! DO 10 II=1,IIMAX ! FDIAG(II) = 0.0D0 ! if(donmr) FIDIAG(II) = 0.0d0 ! 10 ENDDO ! DO 20 IJ=1,IJMAX ! FDIAT(IJ) = 0.0D0 ! if(donmr) FIDIAT(IJ) = 0.0d0 ! 20 ENDDO #ifdef MPI_NOMC IF ( .NOT. STAND) THEN --- 55,67 ---- IIMAX = IIMAT(NATOMS+1)-1 IPMAX = IP1(NATOMS+1) IJMAX = IJMAT(IPMAX)-1 ! ! FDIAG(1:IIMAX) = 0.0d0 ! FDIAT(1:IJMAX) = 0.0d0 ! if (donmr) then ! FIDIAG(1:IIMAX) = 0.0d0 ! FIDIAT(1:IJMAX) = 0.0d0 ! end if #ifdef MPI_NOMC IF ( .NOT. STAND) THEN *************** *** 88,103 **** ! JV First init everything to zero, then go back and do diagonal of hdiag ! Can leave this in serial version, but done this way for parallel version ! do II=1,IIMAX ! HDIAG(II) = 0.0D0 ! if(donmr) HIDIAG(II) = 0.0d0 ! ! enddo ! do IJ=1,IJMAX ! HDIAT(IJ) = 0.0D0 ! if(donmr) HIDIAT(IJ) = 0.0d0 ! ! enddo ! JV Must set whole arrays to zero before doing any of this in parallel ! because after first cycle arrays will have garabage all over the place --- 87,98 ---- ! JV First init everything to zero, then go back and do diagonal of hdiag ! Can leave this in serial version, but done this way for parallel version ! HDIAG(1:iimax) = 0.0d0 ! HDIAT(1:ijmax) = 0.0d0 ! if(donmr) then ! HIDIAG(1:iimax) = 0.0d0 ! HIDIAT(1:ijmax) = 0.0d0 ! endif ! JV Must set whole arrays to zero before doing any of this in parallel ! because after first cycle arrays will have garabage all over the place *************** *** 573,579 **** 160 ENDDO 170 ENDDO ENDIF - ! INTEGRAL COMPUTATION ! -------------------- --- 568,573 ---- *************** *** 828,845 **** ! ADD IN 1-ELECTRON MATRIX. ! ! !c write(*,*) "%% ============================" ! DO 1010 II=1,IIMAX ! FDIAG(II) = FDIAG(II) + HDIAG(II) ! if(donmr) FIDIAG(II) = FIDIAG(II) + HIDIAG(II) ! 1010 ENDDO ! !c write(*,*) "%% ============================" ! ! DO 1020 IJ=1,IJMAX ! FDIAT(IJ) = FDIAT(IJ) + HDIAT(IJ) ! if(donmr) FIDIAT(IJ) = FIDIAT(IJ) + HIDIAT(IJ) ! 1020 ENDDO RETURN end SUBROUTINE FOCK --- 822,833 ---- ! ADD IN 1-ELECTRON MATRIX. ! FDIAG(1:IIMAX) = FDIAG(1:IIMAX) + HDIAG(1:IIMAX) ! FDIAT(1:IJMAX) = FDIAT(1:IJMAX) + HDIAT(1:IJMAX) ! if (donmr) then ! FIDIAG(1:IIMAX) = FIDIAG(1:IIMAX) + HIDIAG(1:IIMAX) ! FIDIAT(1:IJMAX) = FIDIAT(1:IJMAX) + HIDIAT(1:IJMAX) ! endif RETURN end SUBROUTINE FOCK *** src/dcqtp/src/io/rdnmr.F90 2006-04-03 16:34:27.000000000 -0700 --- src/dcqtp/src/io/rdnmr.F90 2006-10-20 08:28:37.000000000 -0700 *************** *** 81,92 **** j2 = irpnt(k+1)-1 endif do j=j1,j2 nat = nat + 1 - if ( .not. calcMemRequirements) then inmratm(nat) = j - endif enddo enddo nnmrATM = nat endif --- 81,96 ---- j2 = irpnt(k+1)-1 endif + if (calcMemRequirements) then + do j=j1,j2 + nat = nat + 1 + enddo + else do j=j1,j2 nat = nat + 1 inmratm(nat) = j enddo + endif enddo nnmrATM = nat endif *************** *** 227,238 **** ierror = 1 return endif do j=ibeg+1,inum nnmratm = nnmratm + 1 - if ( .not. calcMemRequirements) then inmratm(nnmratm) = j endif - enddo range = .false. goto 233 else --- 231,246 ---- ierror = 1 return endif + if (calcMemRequirements) then + do j=ibeg+1,inum + nnmratm = nnmratm + 1 + end do + else do j=ibeg+1,inum nnmratm = nnmratm + 1 inmratm(nnmratm) = j + end do endif range = .false. goto 233 else ------------------------------------------------------------------------------ Temporary workarounds: Use Intel compiler versions <9.1 or use a different compiler.