Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions fms/fms_io.F90
Original file line number Diff line number Diff line change
Expand Up @@ -196,7 +196,7 @@ module fms_io_mod
character(len=128) :: calendar = ''
integer :: sense !Orientation of z axis definition
integer :: dimlen !max dim of elements across global domain
real :: min !valid min for real axis data
real :: valid_min !valid min for real axis data
integer :: imin !valid min for integer axis data
integer,allocatable :: idx(:) !compressed io-domain index vector
integer,allocatable :: nelems(:) !num elements for each rank in io domain
Expand Down Expand Up @@ -1237,14 +1237,14 @@ end subroutine write_data_3d_new
! This routine will register an integer restart file axis
!
!-------------------------------------------------------------------------------
subroutine register_restart_axis_r1d(fileObj,filename,fieldname,data,cartesian,units,longname,sense,min,calendar)
subroutine register_restart_axis_r1d(fileObj,filename,fieldname,data,cartesian,units,longname,sense,valid_min,calendar)
type(restart_file_type), intent(inout) :: fileObj
character(len=*), intent(in) :: filename, fieldname
real, intent(in), target :: data(:)
character(len=*), intent(in) :: cartesian
character(len=*), optional, intent(in) :: units, longname
integer, optional, intent(in) :: sense
real, optional, intent(in) :: min !valid min for real axis data
real, optional, intent(in) :: valid_min !valid min for real axis data
character(len=*), optional, intent(in) :: calendar

integer :: idx
Expand Down Expand Up @@ -1280,7 +1280,7 @@ subroutine register_restart_axis_r1d(fileObj,filename,fieldname,data,cartesian,u
fileObj%axes(idx)%dimlen = -1 ! This is not a compressed axis
if(PRESENT(units)) fileObj%axes(idx)%units = units
if(PRESENT(longname)) fileObj%axes(idx)%longname = longname
if(PRESENT(min)) fileObj%axes(idx)%min = min
Comment thread
manodeep marked this conversation as resolved.
if(PRESENT(valid_min)) fileObj%axes(idx)%valid_min = valid_min
if(idx == TIDX) then
if(PRESENT(calendar)) fileObj%axes(idx)%calendar = trim(calendar)
endif
Expand Down Expand Up @@ -2669,7 +2669,7 @@ subroutine save_compressed_restart(fileObj,restartpath,append,time_level)
if(ALLOCATED(axis%idx)) then
call mpp_def_dim(unit,trim(axis%dimlen_name),axis%dimlen,trim(axis%dimlen_lname), (/(i,i=1,axis%dimlen)/))
call mpp_write_meta(unit,c_axis,axis%name,axis%units,axis%longname, &
data=axis%idx,compressed=axis%compressed,min=axis%imin)
data=axis%idx,compressed=axis%compressed,valid_min=axis%imin)
c_axis_defined = .TRUE.
else
c_axis_defined = .FALSE.
Expand All @@ -2679,7 +2679,7 @@ subroutine save_compressed_restart(fileObj,restartpath,append,time_level)
if (ALLOCATED(axis%idx)) then
call mpp_def_dim(unit,trim(axis%dimlen_name),axis%dimlen,trim(axis%dimlen_lname), (/(i,i=1,axis%dimlen)/))
call mpp_write_meta(unit,h_axis,axis%name,axis%units,axis%longname, &
data=axis%idx,compressed=axis%compressed,min=axis%imin)
data=axis%idx,compressed=axis%compressed,valid_min=axis%imin)
h_axis_defined = .TRUE.
else
h_axis_defined = .FALSE.
Expand Down
4 changes: 2 additions & 2 deletions fms/fms_io_unstructured_register_restart_axis.inc
Original file line number Diff line number Diff line change
Expand Up @@ -221,9 +221,9 @@ subroutine fms_io_unstructured_register_restart_axis_r1D(fileObj, &

!Store the minimum value allowed for the axis.
if (present(fmin)) then
fileObj%axes(axis_index)%min = fmin
fileObj%axes(axis_index)%valid_min = fmin
else
fileObj%axes(axis_index)%min = 0
fileObj%axes(axis_index)%valid_min = 0
endif

!Store the calendar for the axis. This is only done for the time dimension.
Expand Down
4 changes: 2 additions & 2 deletions fms/fms_io_unstructured_save_restart.inc
Original file line number Diff line number Diff line change
Expand Up @@ -350,7 +350,7 @@ subroutine fms_io_unstructured_save_restart(fileObj, &
axis%longname, &
data=axis%idx, &
compressed=axis%compressed, &
min=axis%imin)
valid_min=axis%imin)
axis => null()
c_axis_defined = .true.
else
Expand All @@ -373,7 +373,7 @@ subroutine fms_io_unstructured_save_restart(fileObj, &
axis%longname, &
data=axis%idx, &
compressed=axis%compressed, &
min=axis%imin)
valid_min=axis%imin)
axis => null()
h_axis_defined = .true.
else
Expand Down
4 changes: 2 additions & 2 deletions mpp/include/mpp_io_misc.inc
Original file line number Diff line number Diff line change
Expand Up @@ -115,8 +115,8 @@
default_field%ndim = -1
default_field%checksum = 0
!largest possible 4-byte reals
default_field%min = -huge(1._4)
default_field%max = huge(1._4)
default_field%valid_min = -huge(1._4)
default_field%valid_max = huge(1._4)
default_field%missing = MPP_FILL_DOUBLE ! now using netcdf:NF_FILL_DOUBLE instead of -1e36
default_field%fill = MPP_FILL_DOUBLE ! now using netcdf:NF_FILL_DOUBLE instead of -1e36
default_field%scale = 1.0
Expand Down
4 changes: 2 additions & 2 deletions mpp/include/mpp_io_read.inc
Original file line number Diff line number Diff line change
Expand Up @@ -1048,8 +1048,8 @@
case('packing')
mpp_file(unit)%Var(nv)%pack=mpp_file(unit)%Var(nv)%Att(j)%fatt(1)
case('valid_range')
mpp_file(unit)%Var(nv)%min=mpp_file(unit)%Var(nv)%Att(j)%fatt(1)
mpp_file(unit)%Var(nv)%max=mpp_file(unit)%Var(nv)%Att(j)%fatt(2)
mpp_file(unit)%Var(nv)%valid_min=mpp_file(unit)%Var(nv)%Att(j)%fatt(1)
mpp_file(unit)%Var(nv)%valid_max=mpp_file(unit)%Var(nv)%Att(j)%fatt(2)
case('checksum')
checksum_char = mpp_file(unit)%Var(nv)%Att(j)%catt
! Scan checksum attribute for , delimiter. If found implies multiple time levels.
Expand Down
48 changes: 24 additions & 24 deletions mpp/include/mpp_io_util.inc
Original file line number Diff line number Diff line change
Expand Up @@ -92,13 +92,13 @@
end subroutine mpp_get_global_atts

!#####################################################################
subroutine mpp_get_field_atts(field, name, units, longname, min, max, missing, ndim, siz, axes, atts, &
subroutine mpp_get_field_atts(field, name, units, longname, valid_min, valid_max, missing, ndim, siz, axes, atts, &
valid, scale, add, checksum)

type(fieldtype), intent(in) :: field
character(len=*), intent(out), optional :: name, units
character(len=*), intent(out), optional :: longname
real, intent(out), optional :: min,max,missing
real, intent(out), optional :: valid_min,valid_max,missing
integer, intent(out), optional :: ndim
integer, intent(out), dimension(:), optional :: siz
type(validtype), intent(out), optional :: valid
Expand All @@ -114,8 +114,8 @@
if (PRESENT(name)) name = field%name
if (PRESENT(units)) units = field%units
if (PRESENT(longname)) longname = field%longname
if (PRESENT(min)) min = field%min
if (PRESENT(max)) max = field%max
if (PRESENT(valid_min)) valid_min = field%valid_min
if (PRESENT(valid_max)) valid_max = field%valid_max
if (PRESENT(missing)) missing = field%missing
if (PRESENT(ndim)) ndim = field%ndim
if (PRESENT(atts)) then
Expand Down Expand Up @@ -615,7 +615,7 @@
integer :: valid_T, scale_T ! types of attributes

v%is_range = .true.
v%min = -HUGE(v%min); v%max = HUGE(v%max)
v%valid_min = -HUGE(v%valid_min); v%valid_max = HUGE(v%valid_max)
if (f%natt == 0) return
! find indices of relevant attributes
irange = mpp_find_att(f%att,'valid_range')
Expand All @@ -637,55 +637,55 @@
! examine possible range attributes
valid_T = 0
if (irange>0) then
v%min = f%att(irange)%fatt(1)
v%max = f%att(irange)%fatt(2)
v%valid_min = f%att(irange)%fatt(1)
v%valid_max = f%att(irange)%fatt(2)
valid_T = f%att(irange)%type
else if (imax>0.or.imin>0) then
if(imax>0) then
v%max = f%att(imax)%fatt(1)
v%valid_max = f%att(imax)%fatt(1)
valid_T = max(valid_T,f%att(imax)%type)
endif
if(imin>0) then
v%min = f%att(imin)%fatt(1)
v%valid_min = f%att(imin)%fatt(1)
valid_T = max(valid_T,f%att(imin)%type)
endif
else if (imissing > 0) then
v%is_range = .false.
! here we always scale, since missing_value is supposed to be in
! external representation
v%min = f%att(imissing)%fatt(1)*f%scale + f%add
v%valid_min = f%att(imissing)%fatt(1)*f%scale + f%add
else if (ifill>0) then
!z1l ifdef is added in to be able to compile without using use_netCDF.
#ifdef use_netCDF
! define min and max according to _FillValue
if(f%att(ifill)%fatt(1)>0) then
! if _FillValue is positive, then it defines valid maximum
v%max = f%att(ifill)%fatt(1)
v%valid_max = f%att(ifill)%fatt(1)
select case(f%type)
case (NF_BYTE,NF_SHORT,NF_INT)
v%max = v%max-1
v%valid_max = v%valid_max-1
case (NF_FLOAT)
v%max = nearest(nearest(real(v%max,4),-1.0),-1.0)
v%valid_max = nearest(nearest(real(v%valid_max,4),-1.0),-1.0)
case (NF_DOUBLE)
v%max = nearest(nearest(real(v%max,8),-1.0),-1.0)
v%valid_max = nearest(nearest(real(v%valid_max,8),-1.0),-1.0)
end select
! always do the scaling, as the _FillValue is in external
! representation
v%max = v%max*f%scale + f%add
v%valid_max = v%valid_max*f%scale + f%add
else
! if _FillValue is negative or zero, then it defines valid minimum
v%min = f%att(ifill)%fatt(1)
v%valid_min = f%att(ifill)%fatt(1)
select case(f%type)
case (NF_BYTE,NF_SHORT,NF_INT)
v%min = v%min+1
v%valid_min = v%valid_min+1
case (NF_FLOAT)
v%min = nearest(nearest(real(v%min,4),+1.0),+1.0)
v%valid_min = nearest(nearest(real(v%valid_min,4),+1.0),+1.0)
case (NF_DOUBLE)
v%min = nearest(nearest(real(v%min,8),+1.0),+1.0)
v%valid_min = nearest(nearest(real(v%valid_min,8),+1.0),+1.0)
end select
! always do the scaling, as the _FillValue is in external
! representation
v%min = v%min*f%scale + f%add
v%valid_min = v%valid_min*f%scale + f%add
endif
#endif
endif
Expand All @@ -697,10 +697,10 @@
! brances, because in this case all irange, imin, and imax are less then 0
if(.not.((valid_T == scale_T).and.(scale_T>f%type))) then
if(irange>0 .or. imin>0) then
v%min = v%min*f%scale + f%add
v%valid_min = v%valid_min*f%scale + f%add
endif
if(irange>0 .or. imax>0) then
v%max = v%max*f%scale + f%add
v%valid_max = v%valid_max*f%scale + f%add
endif
endif

Expand All @@ -712,9 +712,9 @@
type(validtype), intent(in) :: v ! validator

if (v%is_range) then
mpp_is_valid = (v%min<=x).and.(x<=v%max)
mpp_is_valid = (v%valid_min<=x).and.(x<=v%valid_max)
else
mpp_is_valid = x/=v%min
mpp_is_valid = x/=v%valid_min
endif
end function mpp_is_valid

Expand Down
Loading
Loading