corrections of max... ranges of arrays
[unres4.git] / source / unres / MD.f90
index 15fdf68..36124aa 100644 (file)
 !el      integer maxamino,maxnuc,maxbnd
 !el      integer maxang,maxtors,maxpi
 !el      integer maxpib,maxpit
-      integer :: maxatm        !=2*nres        !maxres2 maxres2=2*maxres
-      integer,parameter :: maxval=8
-      integer,parameter :: maxgrp=1000
-      integer,parameter :: maxtyp=3000
-      integer,parameter :: maxclass=500
-      integer,parameter :: maxkey=10000
-      integer,parameter :: maxrot=1000
-      integer,parameter :: maxopt=1000
-      integer,parameter :: maxhess=1000000
-      integer :: maxlight      !=8*maxatm
-      integer,parameter :: maxvib=1000
-      integer,parameter :: maxgeo=1000
-      integer,parameter :: maxcell=10000
-      integer,parameter :: maxring=10000
-      integer,parameter :: maxfix=10000
-      integer,parameter :: maxbio=10000
-      integer,parameter :: maxamino=31
-      integer,parameter :: maxnuc=12
-      integer :: maxbnd                !=2*maxatm
-      integer :: maxang                !=3*maxatm
-      integer :: maxtors       !=4*maxatm
-      integer,parameter :: maxpi=100
-      integer,parameter :: maxpib=2*maxpi
-      integer,parameter :: maxpit=4*maxpi
+!      integer :: maxatm       !=2*nres        !maxres2 maxres2=2*maxres
+!      integer,parameter :: maxval=8
+!      integer,parameter :: maxgrp=1000
+!      integer,parameter :: maxtyp=3000
+!      integer,parameter :: maxclass=500
+!      integer,parameter :: maxkey=10000
+!      integer,parameter :: maxrot=1000
+!      integer,parameter :: maxopt=1000
+!      integer,parameter :: maxhess=1000000
+!      integer :: maxlight     !=8*maxatm
+!      integer,parameter :: maxvib=1000
+!      integer,parameter :: maxgeo=1000
+!      integer,parameter :: maxcell=10000
+!      integer,parameter :: maxring=10000
+!      integer,parameter :: maxfix=10000
+!      integer,parameter :: maxbio=10000
+!      integer,parameter :: maxamino=31
+!      integer,parameter :: maxnuc=12
+!      integer :: maxbnd               !=2*maxatm
+!      integer :: maxang               !=3*maxatm
+!      integer :: maxtors      !=4*maxatm
+!      integer,parameter :: maxpi=100
+!      integer,parameter :: maxpib=2*maxpi
+!      integer,parameter :: maxpit=4*maxpi
 !-----------------------------------------------------------------------------
 ! Maximum number of seed
-      integer,parameter :: max_seed=1
+!      integer,parameter :: max_seed=1
 !-----------------------------------------------------------------------------
       real(kind=8),dimension(:),allocatable :: stochforcvec !(MAXRES6) maxres6=6*maxres
 !      common /stochcalc/ stochforcvec
 ! Calculate energy and forces
         call zerograd
         call etotal(potEcomp)
+! AL 4/17/17: Reduce the steps if NaNs occurred.
+        if (potEcomp(0).gt.0.99e20 .or. isnan(potEcomp(0)).gt.0) then
+          d_time=d_time/2
+          cycle
+        endif
+! end change
         if (large.and. mod(itime,ntwe).eq.0) &
           call enerprint(potEcomp)
 #ifdef TIMING_ENE
 ! Calculate energy and forces
         call zerograd
         call etotal_short(energia_short)
+! AL 4/17/17: Exit itime_split loop when energy goes infinite
+        if (energia_short(0).gt.0.99e20 .or. isnan(energia_short(0)) ) then
+          if (PRINT_AMTS_MSG) &
+          write (iout,*) "Infinities/NaNs in energia_short",energia_short(0),"; increasing ntime_split to",ntime_split
+          ntime_split=ntime_split*2
+          if (ntime_split.gt.maxtime_split) then
+#ifdef MPI
+          write (iout,*) &
+     "Cannot rescue the run; aborting job. Retry with a smaller time step"
+          call flush(iout)
+          call MPI_Abort(MPI_COMM_WORLD,IERROR,ERRCODE)
+#else
+          write (iout,*) &
+     "Cannot rescue the run; terminating. Retry with a smaller time step"
+#endif
+          endif
+          exit
+        endif
+! End change
         if (large.and. mod(itime,ntwe).eq.0) &
           call enerprint(energia_short)
 #ifdef TIMING_ENE
           if (ntime_split.lt.maxtime_split) then
             scale=.true.
             ntime_split=ntime_split*2
+! AL 4/17/17: We should exit the itime_split loop when acceleration change is too big
+            exit
             do i=0,2*nres
               do j=1,3
                 dc_old(j,i)=dc_old0(j,i)
 #endif
       call zerograd
       call etotal_long(energia_long)
+      if (energia_long(0).gt.0.99e20 .or. isnan(energia_long(0))) then
+#ifdef MPI
+        write (iout,*) &
+              "Infinitied/NaNs in energia_long, Aborting MPI job."
+        call flush(iout)
+        call MPI_Abort(MPI_COMM_WORLD,IERROR,ERRCODE)
+#else
+        write (iout,*) "Infinitied/NaNs in energia_long, terminating."
+        stop
+#endif
+      endif
       if (large.and. mod(itime,ntwe).eq.0) &
           call enerprint(energia_long)
 #ifdef TIMING_ENE
       logical :: omit(maxarc)
 !
 !      include 'sizes.i'
-      maxatm = 2*nres  !maxres2 maxres2=2*maxres
-      maxlight = 8*maxatm
-      maxbnd = 2*maxatm
-      maxang = 3*maxatm
-      maxtors = 4*maxatm
+!      maxatm = 2*nres !maxres2 maxres2=2*maxres
+!      maxlight = 8*maxatm
+!      maxbnd = 2*maxatm
+!      maxang = 3*maxatm
+!      maxtors = 4*maxatm
 !
 !     zero out the surface area for the sphere of interest
 !