Skip to content

Commit 67cf139

Browse files
authored
NaN Debug failures when reading files (#1045)
This PR address #1044 Resolve issues with nans / accessing arrays out of range There are a couple of spots in the code when loading files which fail when building with checks for floating point exceptions (-fpe0 in intel land). This addresses those issues This change max sure that CICE is not trying to use array indeces which don't have values associated with them, and puts a value in _FillValue when it's not set (to avoid a nan). When creating ULAT, don't create the work_mom array on tasks other than master task because it is not used. When loading _FillValue, reset the value to spval_dbl if _FillValue is a nan.
1 parent 997835d commit 67cf139

File tree

2 files changed

+56
-31
lines changed

2 files changed

+56
-31
lines changed

cicecore/cicedyn/infrastructure/ice_grid.F90

Lines changed: 18 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -369,27 +369,26 @@ subroutine init_grid1
369369

370370
if (my_task == master_task) then
371371
allocate(work_mom(nx_global*2+1, ny_global*2+1), stat=ierr)
372-
else
373-
allocate(work_mom(1, 1), stat=ierr)
374-
endif
375-
if (ierr/=0) call abort_ice(subname//' ERROR: Out of memory', file=__FILE__, line=__LINE__)
376-
377-
fieldname='y' ! use mom y field to fill cice ULAT
378-
call ice_open_nc(grid_file,fid_grid)
379-
call ice_read_global_nc(fid_grid,1,fieldname,work_mom,.true.)
380-
call ice_close_nc(fid_grid)
381-
im = 3
382-
do i = 1, nx_global
383-
jm = 3
384-
do j = 1, ny_global
385-
work_g1(i,j) = work_mom(im, jm)
386-
jm = jm + 2
372+
if (ierr/=0) call abort_ice(subname//' ERROR: Out of memory', file=__FILE__, line=__LINE__)
373+
374+
fieldname='y' ! use mom y field to fill cice ULAT
375+
call ice_open_nc(grid_file,fid_grid)
376+
call ice_read_global_nc(fid_grid,1,fieldname,work_mom,.true.)
377+
call ice_close_nc(fid_grid)
378+
im = 3
379+
do i = 1, nx_global
380+
jm = 3
381+
do j = 1, ny_global
382+
work_g1(i,j) = work_mom(im, jm)
383+
jm = jm + 2
384+
enddo
385+
im = im + 2
387386
enddo
388-
im = im + 2
389-
enddo
390387

391-
deallocate(work_mom, stat=ierr)
392-
if (ierr/=0) call abort_ice(subname//' ERROR: Dealloc error', file=__FILE__, line=__LINE__)
388+
deallocate(work_mom, stat=ierr)
389+
if (ierr/=0) call abort_ice(subname//' ERROR: Dealloc error', file=__FILE__, line=__LINE__)
390+
391+
endif
393392

394393
case('pop_nc', 'geosnc')
395394

cicecore/cicedyn/infrastructure/ice_read_write.F90

Lines changed: 38 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
module ice_read_write
1515

16+
use,intrinsic :: ieee_arithmetic
1617
use ice_kinds_mod
1718
use ice_constants, only: c0, spval_dbl, &
1819
field_loc_noupdate, field_type_noupdate
@@ -1139,6 +1140,8 @@ subroutine ice_read_nc_xy(fid, nrec, varname, work, diag, &
11391140
real (kind=dbl_kind), dimension(:,:), allocatable :: &
11401141
work_g1
11411142

1143+
logical, dimension(:,:), allocatable :: mask
1144+
11421145
integer (kind=int_kind) :: nx, ny
11431146

11441147
integer (kind=int_kind) :: lnrec ! local value of nrec
@@ -1222,10 +1225,17 @@ subroutine ice_read_nc_xy(fid, nrec, varname, work, diag, &
12221225
! call ice_check_nc(status, subname//' ERROR: Missing _FillValue', &
12231226
! file=__FILE__, line=__LINE__)
12241227
! write(nu_diag,*) subname,' missingvalue= ',missingvalue
1225-
amin = minval(work_g1)
1226-
amax = maxval(work_g1, mask = work_g1 /= missingvalue)
1227-
asum = sum (work_g1, mask = work_g1 /= missingvalue)
1228+
allocate(mask(nx,ny))
1229+
if ( ieee_is_nan(missingvalue) ) then
1230+
mask = ieee_is_nan(work_g1)
1231+
else
1232+
mask = work_g1 /= missingvalue
1233+
endif
1234+
amin = minval(work_g1, mask = mask )
1235+
amax = maxval(work_g1, mask = mask )
1236+
asum = sum (work_g1, mask = mask )
12281237
write(nu_diag,*) subname,' min, max, sum =', amin, amax, asum, trim(varname)
1238+
deallocate(mask)
12291239
endif
12301240

12311241
!-------------------------------------------------------------------
@@ -1320,6 +1330,8 @@ subroutine ice_read_nc_xyz(fid, nrec, varname, work, diag, &
13201330
real (kind=dbl_kind), dimension(:,:,:), allocatable :: &
13211331
work_g1
13221332

1333+
logical, dimension(:,:), allocatable :: mask
1334+
13231335
integer (kind=int_kind) :: nx, ny
13241336

13251337
integer (kind=int_kind) :: lnrec ! local value of nrec
@@ -1400,13 +1412,19 @@ subroutine ice_read_nc_xyz(fid, nrec, varname, work, diag, &
14001412
status = nf90_get_att(fid, varid, "_FillValue", missingvalue)
14011413
! call ice_check_nc(status, subname//' ERROR: Missing _FillValue', &
14021414
! file=__FILE__, line=__LINE__)
1403-
! write(nu_diag,*) subname,' missingvalue= ',missingvalue
1415+
allocate(mask(nx,ny))
14041416
do n=1,ncat
1405-
amin = minval(work_g1(:,:,n))
1406-
amax = maxval(work_g1(:,:,n), mask = work_g1(:,:,n) /= missingvalue)
1407-
asum = sum (work_g1(:,:,n), mask = work_g1(:,:,n) /= missingvalue)
1417+
if ( ieee_is_nan(missingvalue) ) then
1418+
mask = ieee_is_nan(work_g1(:,:,n))
1419+
else
1420+
mask = work_g1(:,:,n) /= missingvalue
1421+
endif
1422+
amin = minval(work_g1(:,:,n), mask = mask )
1423+
amax = maxval(work_g1(:,:,n), mask = mask )
1424+
asum = sum (work_g1(:,:,n), mask = mask )
14081425
write(nu_diag,*) subname,' min, max, sum =', amin, amax, asum, trim(varname)
14091426
enddo
1427+
deallocate(mask)
14101428
endif
14111429

14121430
!-------------------------------------------------------------------
@@ -1508,6 +1526,8 @@ subroutine ice_read_nc_xyf(fid, nrec, varname, work, diag, &
15081526
real (kind=dbl_kind), dimension(:,:,:), allocatable :: &
15091527
work_g1
15101528

1529+
logical, dimension(:,:), allocatable :: mask
1530+
15111531
integer (kind=int_kind) :: nx, ny
15121532

15131533
integer (kind=int_kind) :: lnrec ! local value of nrec
@@ -1592,13 +1612,19 @@ subroutine ice_read_nc_xyf(fid, nrec, varname, work, diag, &
15921612
status = nf90_get_att(fid, varid, "_FillValue", missingvalue)
15931613
! call ice_check_nc(status, subname//' ERROR: Missing _FillValue', &
15941614
! file=__FILE__, line=__LINE__)
1595-
! write(nu_diag,*) subname,' missingvalue= ',missingvalue
1596-
do n = 1, nfreq
1597-
amin = minval(work_g1(:,:,n))
1598-
amax = maxval(work_g1(:,:,n), mask = work_g1(:,:,n) /= missingvalue)
1599-
asum = sum (work_g1(:,:,n), mask = work_g1(:,:,n) /= missingvalue)
1615+
allocate(mask(nx,ny))
1616+
do n=1,ncat
1617+
if ( ieee_is_nan(missingvalue) ) then
1618+
mask = ieee_is_nan(work_g1(:,:,n))
1619+
else
1620+
mask = work_g1(:,:,n) /= missingvalue
1621+
endif
1622+
amin = minval(work_g1(:,:,n), mask = mask )
1623+
amax = maxval(work_g1(:,:,n), mask = mask )
1624+
asum = sum (work_g1(:,:,n), mask = mask )
16001625
write(nu_diag,*) subname,' min, max, sum =', amin, amax, asum, trim(varname)
16011626
enddo
1627+
deallocate(mask)
16021628
endif
16031629

16041630
!-------------------------------------------------------------------

0 commit comments

Comments
 (0)