out of bounds array access in thorn ADM

Issue #938 closed
Roland Haas created an issue

I just ran the Lovelace test with an executable build via sim build --debug. I get failing testsuites that did not fails with a normal build. One is ADM/test_ADM_2 which fails with (tow threads per process, two processes):

INFO (IDAnalyticBH): setting up Schwarzschild initial
INFO (IOBasic): Periodic scalar output requested for 'ADMANALYSIS::grr', 'ADMBASE::gxx', 'ADMBASE::kxx', 'ADMBASE::alp', 'ADMCONSTRAINTS::ham', 'ADMCONSTRAINTS::momx', 'ADMCONSTRAINTS::momy', 'ADMCONSTRAINTS::momz'
INFO (ADM): 1+log slicing
INFO (ADM):   in the kleing style
INFO (ADM):   but not using the initial lapse coeff
INFO (ADM): flat space diffusion .2000000E-04
INFO (ADM):   and no curved space diffusion
INFO (ADM): Initializing Leapfrog with FTCS Step
 Using a corrector step
At line 23 of file /mnt/data/rhaas/postdoc/gr/ET_Lovelace/arrangements/CactusArchive/ADM/src/DoubleLeap.F
Fortran runtime error: Index '0' of dimension 1 of array 'betax' below lower bound of 1

The line number is completely wrong since line 23 is not even inside a function yet but recompiling without F_LINE_DIRECTIVES gives line 4553 of file /mnt/data/rhaas/postdoc/gr/ET_Lovelace/configs/sim-debug/build/ADM/DoubleLeap.f (after preprocessing). The code is

            do k=1,nz
               do j=1,ny
                  do i=1,nx
c     The right-hand-side for the (conformal) metric evolution equation
      cdgdt_cdgxxdt = - 2*alp(i,j,k)*kxx(i,j,k)
      cdgdt_cdgxydt = - 2*alp(i,j,k)*kxy(i,j,k)
      cdgdt_cdgxzdt = - 2*alp(i,j,k)*kxz(i,j,k)
      cdgdt_cdgyydt = - 2*alp(i,j,k)*kyy(i,j,k)
      cdgdt_cdgyzdt = - 2*alp(i,j,k)*kyz(i,j,k)
      cdgdt_cdgzzdt = - 2*alp(i,j,k)*kzz(i,j,k)
      IF (conformal_state .gt. 0) THEN
        cdgdt_ipsi4 = 1D0/(psi(i,j,k)**4)
        cdgdt_cdgxxdt = cdgdt_cdgxxdt*cdgdt_ipsi4
        cdgdt_cdgxydt = cdgdt_cdgxydt*cdgdt_ipsi4
        cdgdt_cdgxzdt = cdgdt_cdgxzdt*cdgdt_ipsi4
        cdgdt_cdgyydt = cdgdt_cdgyydt*cdgdt_ipsi4
        cdgdt_cdgyzdt = cdgdt_cdgyzdt*cdgdt_ipsi4
        cdgdt_cdgzzdt = cdgdt_cdgzzdt*cdgdt_ipsi4
      END IF
      IF (shift_state .ne. 0) THEN
      if (local_spatial_order.eq.2) then
        dxdb_dxdbx = I2DX*(betax(i+1,j,k) - betax(i-1,j,k))
        dxdb_dxdby = I2DX*(betay(i+1,j,k) - betay(i-1,j,k))
        dxdb_dxdbz = I2DX*(betaz(i+1,j,k) - betaz(i-1,j,k))
      else

which comes from line 300 of the unprocessed file. Clearly the limits of the loop should be

               do k=2,nz-1
                  do j=2,ny-1
                     do i=2,nx-1

instead of k=1,nz etc.

ok to apply (given that we want to deprecate ADM anyway)? The change has (surprisingly) no affect on the actual generated test output.

Keyword: ADM

Comments (4)

  1. Log in to comment