1320 lines
58 KiB
Fortran
1320 lines
58 KiB
Fortran
#include "dtypes.h"
|
|
!===================================================
|
|
! DO NOT EDIT THIS FILE, it was generated using ../../../../../tools/cprnc/genf90/genf90.pl
|
|
! Any changes you make to this file may be lost
|
|
!===================================================
|
|
module restUtilMod
|
|
|
|
!-----------------------------------------------------------------------
|
|
! provies generic routines and types for use with restart files
|
|
!
|
|
use shr_kind_mod, only: r8=>shr_kind_r8, r4 => shr_kind_r4, i4=>shr_kind_i4
|
|
use shr_sys_mod, only: shr_sys_abort
|
|
use spmdMod, only: masterproc
|
|
use clm_varctl, only: iulog
|
|
use clm_varcon, only: spval, ispval
|
|
use ncdio_pio
|
|
use pio
|
|
!
|
|
implicit none
|
|
save
|
|
private
|
|
! save
|
|
!
|
|
!-----------------------------------------------------------------------
|
|
|
|
# 21 "restUtilMod.F90.in"
|
|
interface restartvar
|
|
!TYPE text,int,double
|
|
!DIMS 0,1,2
|
|
module procedure restartvar_0d_text
|
|
!TYPE text,int,double
|
|
!DIMS 0,1,2
|
|
module procedure restartvar_1d_text
|
|
!TYPE text,int,double
|
|
!DIMS 0,1,2
|
|
module procedure restartvar_2d_text
|
|
!TYPE text,int,double
|
|
!DIMS 0,1,2
|
|
module procedure restartvar_0d_int
|
|
!TYPE text,int,double
|
|
!DIMS 0,1,2
|
|
module procedure restartvar_1d_int
|
|
!TYPE text,int,double
|
|
!DIMS 0,1,2
|
|
module procedure restartvar_2d_int
|
|
!TYPE text,int,double
|
|
!DIMS 0,1,2
|
|
module procedure restartvar_0d_double
|
|
!TYPE text,int,double
|
|
!DIMS 0,1,2
|
|
module procedure restartvar_1d_double
|
|
!TYPE text,int,double
|
|
!DIMS 0,1,2
|
|
module procedure restartvar_2d_double
|
|
module procedure restartvar_2d_double_bounds
|
|
end interface restartvar
|
|
|
|
integer,parameter, public :: iflag_interp = 1
|
|
integer,parameter, public :: iflag_copy = 2
|
|
integer,parameter, public :: iflag_skip = 3
|
|
integer,parameter, public :: iflag_noswitchdim = 0
|
|
integer,parameter, public :: iflag_switchdim = 1
|
|
|
|
public :: restartvar
|
|
|
|
private :: is_restart
|
|
|
|
# 38 "restUtilMod.F90.in"
|
|
contains
|
|
|
|
!-----------------------------------------------------------------------
|
|
!DIMS 0
|
|
!TYPE text,int,double
|
|
# 43 "restUtilMod.F90.in"
|
|
subroutine restartvar_0d_text(&
|
|
ncid, flag, varname, xtype, &
|
|
long_name, units, interpinic_flag, data, readvar, &
|
|
comment, flag_meanings, missing_value, fill_value, &
|
|
imissing_value, ifill_value, flag_values, nvalid_range )
|
|
|
|
!----------------------------------------------------
|
|
! Arguments
|
|
type(file_desc_t) , intent(inout) :: ncid ! netcdf file id
|
|
character(len=*) , intent(in) :: flag ! 'read' or 'write'
|
|
character(len=*) , intent(in) :: varname ! variable name
|
|
integer , intent(in) :: xtype ! netcdf data type
|
|
character(len=*) , intent(in) :: long_name ! long name for variable
|
|
character(len=*) , intent(in) :: interpinic_flag ! interpolate variable using interpinic
|
|
character(len=*) , intent(inout) :: data
|
|
logical , intent(out) :: readvar ! was var read?
|
|
character(len=*) , intent(in), optional :: units ! long name for variable
|
|
character(len=*) , intent(in), optional :: comment ! attribute
|
|
character(len=*) , intent(in), optional :: flag_meanings(:) ! attribute
|
|
real(r8) , intent(in), optional :: missing_value ! attribute for real
|
|
real(r8) , intent(in), optional :: fill_value ! attribute for real
|
|
integer , intent(in), optional :: imissing_value ! attribute for int
|
|
integer , intent(in), optional :: ifill_value ! attribute for int
|
|
integer , intent(in), optional :: flag_values(:) ! attribute for int
|
|
integer , intent(in), optional :: nvalid_range(2) ! attribute for int
|
|
!
|
|
! Local variables
|
|
integer :: ivalue
|
|
type(var_desc_t) :: vardesc ! local vardesc
|
|
integer :: status ! return error code
|
|
integer :: varid
|
|
integer :: lxtype ! local external type (in case logical variable)
|
|
!----------------------------------------------------
|
|
|
|
if (flag == 'define') then
|
|
|
|
if ( xtype == ncd_log )then
|
|
lxtype = ncd_int
|
|
else
|
|
lxtype = xtype
|
|
end if
|
|
|
|
call ncd_defvar(ncid=ncid, varname=trim(varname), xtype=lxtype, &
|
|
long_name=trim(long_name), units=units)
|
|
|
|
status = PIO_inq_varid(ncid, trim(varname), vardesc)
|
|
varid = vardesc%varid
|
|
|
|
if (trim(interpinic_flag) == 'interp') then
|
|
status = PIO_put_att(ncid, varid, 'interpinic_flag', iflag_interp)
|
|
else if (trim(interpinic_flag) == 'copy') then
|
|
status = PIO_put_att(ncid, varid, 'interpinic_flag', iflag_copy)
|
|
else if (trim(interpinic_flag) == 'skip') then
|
|
status = PIO_put_att(ncid, varid, 'interpinic_flag', iflag_skip)
|
|
end if
|
|
status = PIO_put_att(ncid, varid, 'interpinic_flag_meanings', &
|
|
"1=nearest neighbor, 2=copy directly, 3=skip")
|
|
|
|
if (present(comment)) then
|
|
call ncd_putatt(ncid, varid, 'comment', trim(comment))
|
|
end if
|
|
if (present(units)) then
|
|
call ncd_putatt(ncid, varid, 'units', trim(units))
|
|
end if
|
|
if (present(fill_value)) then
|
|
call ncd_putatt(ncid, varid, '_FillValue', fill_value, lxtype)
|
|
else if (lxtype == ncd_double) then
|
|
call ncd_putatt(ncid, varid, '_FillValue', spval, lxtype)
|
|
end if
|
|
if (present(missing_value)) then
|
|
call ncd_putatt(ncid, varid, 'missing_value', missing_value, lxtype)
|
|
else if (lxtype == ncd_double) then
|
|
call ncd_putatt(ncid, varid, 'missing_value', spval, lxtype)
|
|
end if
|
|
if (present(ifill_value)) then
|
|
call ncd_putatt(ncid, varid, '_FillValue', ifill_value, lxtype)
|
|
else if (lxtype == ncd_int) then
|
|
call ncd_putatt(ncid, varid, '_FillValue', ispval, lxtype)
|
|
end if
|
|
if (present(imissing_value)) then
|
|
call ncd_putatt(ncid, varid, 'missing_value', imissing_value, lxtype)
|
|
else if (lxtype == ncd_int) then
|
|
call ncd_putatt(ncid, varid, 'missing_value', ispval, lxtype)
|
|
end if
|
|
if ( xtype == ncd_log )then
|
|
status = PIO_put_att(ncid,varid,'flag_values', (/0, 1/) )
|
|
status = PIO_put_att(ncid,varid,'flag_meanings', "FALSE TRUE" )
|
|
status = PIO_put_att(ncid,varid,'valid_range', (/0, 1/) )
|
|
end if
|
|
|
|
else if (flag == 'read' .or. flag == 'write') then
|
|
|
|
#if (100!=TYPETEXT)
|
|
call ncd_io(varname=trim(varname), data=data, &
|
|
ncid=ncid, flag=flag, readvar=readvar)
|
|
#endif
|
|
end if
|
|
|
|
if (flag == 'read') then
|
|
if (.not. readvar .and. is_restart()) call shr_sys_abort()
|
|
end if
|
|
|
|
# 145 "restUtilMod.F90.in"
|
|
end subroutine restartvar_0d_text
|
|
!DIMS 0
|
|
!TYPE text,int,double
|
|
# 43 "restUtilMod.F90.in"
|
|
subroutine restartvar_0d_int(&
|
|
ncid, flag, varname, xtype, &
|
|
long_name, units, interpinic_flag, data, readvar, &
|
|
comment, flag_meanings, missing_value, fill_value, &
|
|
imissing_value, ifill_value, flag_values, nvalid_range )
|
|
|
|
!----------------------------------------------------
|
|
! Arguments
|
|
type(file_desc_t) , intent(inout) :: ncid ! netcdf file id
|
|
character(len=*) , intent(in) :: flag ! 'read' or 'write'
|
|
character(len=*) , intent(in) :: varname ! variable name
|
|
integer , intent(in) :: xtype ! netcdf data type
|
|
character(len=*) , intent(in) :: long_name ! long name for variable
|
|
character(len=*) , intent(in) :: interpinic_flag ! interpolate variable using interpinic
|
|
integer(i4) , intent(inout) :: data
|
|
logical , intent(out) :: readvar ! was var read?
|
|
character(len=*) , intent(in), optional :: units ! long name for variable
|
|
character(len=*) , intent(in), optional :: comment ! attribute
|
|
character(len=*) , intent(in), optional :: flag_meanings(:) ! attribute
|
|
real(r8) , intent(in), optional :: missing_value ! attribute for real
|
|
real(r8) , intent(in), optional :: fill_value ! attribute for real
|
|
integer , intent(in), optional :: imissing_value ! attribute for int
|
|
integer , intent(in), optional :: ifill_value ! attribute for int
|
|
integer , intent(in), optional :: flag_values(:) ! attribute for int
|
|
integer , intent(in), optional :: nvalid_range(2) ! attribute for int
|
|
!
|
|
! Local variables
|
|
integer :: ivalue
|
|
type(var_desc_t) :: vardesc ! local vardesc
|
|
integer :: status ! return error code
|
|
integer :: varid
|
|
integer :: lxtype ! local external type (in case logical variable)
|
|
!----------------------------------------------------
|
|
|
|
if (flag == 'define') then
|
|
|
|
if ( xtype == ncd_log )then
|
|
lxtype = ncd_int
|
|
else
|
|
lxtype = xtype
|
|
end if
|
|
|
|
call ncd_defvar(ncid=ncid, varname=trim(varname), xtype=lxtype, &
|
|
long_name=trim(long_name), units=units)
|
|
|
|
status = PIO_inq_varid(ncid, trim(varname), vardesc)
|
|
varid = vardesc%varid
|
|
|
|
if (trim(interpinic_flag) == 'interp') then
|
|
status = PIO_put_att(ncid, varid, 'interpinic_flag', iflag_interp)
|
|
else if (trim(interpinic_flag) == 'copy') then
|
|
status = PIO_put_att(ncid, varid, 'interpinic_flag', iflag_copy)
|
|
else if (trim(interpinic_flag) == 'skip') then
|
|
status = PIO_put_att(ncid, varid, 'interpinic_flag', iflag_skip)
|
|
end if
|
|
status = PIO_put_att(ncid, varid, 'interpinic_flag_meanings', &
|
|
"1=nearest neighbor, 2=copy directly, 3=skip")
|
|
|
|
if (present(comment)) then
|
|
call ncd_putatt(ncid, varid, 'comment', trim(comment))
|
|
end if
|
|
if (present(units)) then
|
|
call ncd_putatt(ncid, varid, 'units', trim(units))
|
|
end if
|
|
if (present(fill_value)) then
|
|
call ncd_putatt(ncid, varid, '_FillValue', fill_value, lxtype)
|
|
else if (lxtype == ncd_double) then
|
|
call ncd_putatt(ncid, varid, '_FillValue', spval, lxtype)
|
|
end if
|
|
if (present(missing_value)) then
|
|
call ncd_putatt(ncid, varid, 'missing_value', missing_value, lxtype)
|
|
else if (lxtype == ncd_double) then
|
|
call ncd_putatt(ncid, varid, 'missing_value', spval, lxtype)
|
|
end if
|
|
if (present(ifill_value)) then
|
|
call ncd_putatt(ncid, varid, '_FillValue', ifill_value, lxtype)
|
|
else if (lxtype == ncd_int) then
|
|
call ncd_putatt(ncid, varid, '_FillValue', ispval, lxtype)
|
|
end if
|
|
if (present(imissing_value)) then
|
|
call ncd_putatt(ncid, varid, 'missing_value', imissing_value, lxtype)
|
|
else if (lxtype == ncd_int) then
|
|
call ncd_putatt(ncid, varid, 'missing_value', ispval, lxtype)
|
|
end if
|
|
if ( xtype == ncd_log )then
|
|
status = PIO_put_att(ncid,varid,'flag_values', (/0, 1/) )
|
|
status = PIO_put_att(ncid,varid,'flag_meanings', "FALSE TRUE" )
|
|
status = PIO_put_att(ncid,varid,'valid_range', (/0, 1/) )
|
|
end if
|
|
|
|
else if (flag == 'read' .or. flag == 'write') then
|
|
|
|
#if (103!=TYPETEXT)
|
|
call ncd_io(varname=trim(varname), data=data, &
|
|
ncid=ncid, flag=flag, readvar=readvar)
|
|
#endif
|
|
end if
|
|
|
|
if (flag == 'read') then
|
|
if (.not. readvar .and. is_restart()) call shr_sys_abort()
|
|
end if
|
|
|
|
# 145 "restUtilMod.F90.in"
|
|
end subroutine restartvar_0d_int
|
|
!DIMS 0
|
|
!TYPE text,int,double
|
|
# 43 "restUtilMod.F90.in"
|
|
subroutine restartvar_0d_double(&
|
|
ncid, flag, varname, xtype, &
|
|
long_name, units, interpinic_flag, data, readvar, &
|
|
comment, flag_meanings, missing_value, fill_value, &
|
|
imissing_value, ifill_value, flag_values, nvalid_range )
|
|
|
|
!----------------------------------------------------
|
|
! Arguments
|
|
type(file_desc_t) , intent(inout) :: ncid ! netcdf file id
|
|
character(len=*) , intent(in) :: flag ! 'read' or 'write'
|
|
character(len=*) , intent(in) :: varname ! variable name
|
|
integer , intent(in) :: xtype ! netcdf data type
|
|
character(len=*) , intent(in) :: long_name ! long name for variable
|
|
character(len=*) , intent(in) :: interpinic_flag ! interpolate variable using interpinic
|
|
real(r8) , intent(inout) :: data
|
|
logical , intent(out) :: readvar ! was var read?
|
|
character(len=*) , intent(in), optional :: units ! long name for variable
|
|
character(len=*) , intent(in), optional :: comment ! attribute
|
|
character(len=*) , intent(in), optional :: flag_meanings(:) ! attribute
|
|
real(r8) , intent(in), optional :: missing_value ! attribute for real
|
|
real(r8) , intent(in), optional :: fill_value ! attribute for real
|
|
integer , intent(in), optional :: imissing_value ! attribute for int
|
|
integer , intent(in), optional :: ifill_value ! attribute for int
|
|
integer , intent(in), optional :: flag_values(:) ! attribute for int
|
|
integer , intent(in), optional :: nvalid_range(2) ! attribute for int
|
|
!
|
|
! Local variables
|
|
integer :: ivalue
|
|
type(var_desc_t) :: vardesc ! local vardesc
|
|
integer :: status ! return error code
|
|
integer :: varid
|
|
integer :: lxtype ! local external type (in case logical variable)
|
|
!----------------------------------------------------
|
|
|
|
if (flag == 'define') then
|
|
|
|
if ( xtype == ncd_log )then
|
|
lxtype = ncd_int
|
|
else
|
|
lxtype = xtype
|
|
end if
|
|
|
|
call ncd_defvar(ncid=ncid, varname=trim(varname), xtype=lxtype, &
|
|
long_name=trim(long_name), units=units)
|
|
|
|
status = PIO_inq_varid(ncid, trim(varname), vardesc)
|
|
varid = vardesc%varid
|
|
|
|
if (trim(interpinic_flag) == 'interp') then
|
|
status = PIO_put_att(ncid, varid, 'interpinic_flag', iflag_interp)
|
|
else if (trim(interpinic_flag) == 'copy') then
|
|
status = PIO_put_att(ncid, varid, 'interpinic_flag', iflag_copy)
|
|
else if (trim(interpinic_flag) == 'skip') then
|
|
status = PIO_put_att(ncid, varid, 'interpinic_flag', iflag_skip)
|
|
end if
|
|
status = PIO_put_att(ncid, varid, 'interpinic_flag_meanings', &
|
|
"1=nearest neighbor, 2=copy directly, 3=skip")
|
|
|
|
if (present(comment)) then
|
|
call ncd_putatt(ncid, varid, 'comment', trim(comment))
|
|
end if
|
|
if (present(units)) then
|
|
call ncd_putatt(ncid, varid, 'units', trim(units))
|
|
end if
|
|
if (present(fill_value)) then
|
|
call ncd_putatt(ncid, varid, '_FillValue', fill_value, lxtype)
|
|
else if (lxtype == ncd_double) then
|
|
call ncd_putatt(ncid, varid, '_FillValue', spval, lxtype)
|
|
end if
|
|
if (present(missing_value)) then
|
|
call ncd_putatt(ncid, varid, 'missing_value', missing_value, lxtype)
|
|
else if (lxtype == ncd_double) then
|
|
call ncd_putatt(ncid, varid, 'missing_value', spval, lxtype)
|
|
end if
|
|
if (present(ifill_value)) then
|
|
call ncd_putatt(ncid, varid, '_FillValue', ifill_value, lxtype)
|
|
else if (lxtype == ncd_int) then
|
|
call ncd_putatt(ncid, varid, '_FillValue', ispval, lxtype)
|
|
end if
|
|
if (present(imissing_value)) then
|
|
call ncd_putatt(ncid, varid, 'missing_value', imissing_value, lxtype)
|
|
else if (lxtype == ncd_int) then
|
|
call ncd_putatt(ncid, varid, 'missing_value', ispval, lxtype)
|
|
end if
|
|
if ( xtype == ncd_log )then
|
|
status = PIO_put_att(ncid,varid,'flag_values', (/0, 1/) )
|
|
status = PIO_put_att(ncid,varid,'flag_meanings', "FALSE TRUE" )
|
|
status = PIO_put_att(ncid,varid,'valid_range', (/0, 1/) )
|
|
end if
|
|
|
|
else if (flag == 'read' .or. flag == 'write') then
|
|
|
|
#if (102!=TYPETEXT)
|
|
call ncd_io(varname=trim(varname), data=data, &
|
|
ncid=ncid, flag=flag, readvar=readvar)
|
|
#endif
|
|
end if
|
|
|
|
if (flag == 'read') then
|
|
if (.not. readvar .and. is_restart()) call shr_sys_abort()
|
|
end if
|
|
|
|
# 145 "restUtilMod.F90.in"
|
|
end subroutine restartvar_0d_double
|
|
|
|
!-----------------------------------------------------------------------
|
|
!DIMS 1,2
|
|
!TYPE text,int,double
|
|
# 150 "restUtilMod.F90.in"
|
|
subroutine restartvar_1d_text(&
|
|
ncid, flag, varname, xtype, dim1name, dim2name, &
|
|
long_name, units, interpinic_flag, data, readvar, &
|
|
comment, flag_meanings, missing_value, fill_value, &
|
|
imissing_value, ifill_value, flag_values, nvalid_range )
|
|
|
|
!----------------------------------------------------
|
|
! Arguments
|
|
type(file_desc_t) , intent(inout) :: ncid ! netcdf file id
|
|
character(len=*) , intent(in) :: flag ! 'read' or 'write'
|
|
character(len=*) , intent(in) :: varname ! variable name
|
|
integer , intent(in) :: xtype ! netcdf data type
|
|
character(len=*) , intent(in) :: long_name ! long name for variable
|
|
character(len=*) , intent(in) :: interpinic_flag ! interpolate variable using interpinic
|
|
character(len=*) , pointer :: data(:)
|
|
logical , intent(inout) :: readvar ! was var read?
|
|
character(len=*) , intent(in), optional :: dim1name ! dimension name
|
|
character(len=*) , intent(in), optional :: dim2name ! dimension name
|
|
character(len=*) , intent(in), optional :: units ! long name for variable
|
|
character(len=*) , intent(in), optional :: comment ! attribute
|
|
character(len=*) , intent(in), optional :: flag_meanings(:) ! attribute
|
|
real(r8) , intent(in), optional :: missing_value ! attribute for real
|
|
real(r8) , intent(in), optional :: fill_value ! attribute for real
|
|
integer , intent(in), optional :: imissing_value ! attribute for int
|
|
integer , intent(in), optional :: ifill_value ! attribute for int
|
|
integer , intent(in), optional :: flag_values(:) ! attribute for int
|
|
integer , intent(in), optional :: nvalid_range(2) ! attribute for int
|
|
!
|
|
! Local variables
|
|
integer :: ivalue
|
|
type(var_desc_t) :: vardesc ! local vardesc
|
|
integer :: status ! return error code
|
|
integer :: varid
|
|
integer :: lxtype ! local external type (in case logical variable)
|
|
!----------------------------------------------------
|
|
|
|
if (flag == 'define') then
|
|
|
|
if ( xtype == ncd_log )then
|
|
lxtype = ncd_int
|
|
else
|
|
lxtype = xtype
|
|
end if
|
|
|
|
if (.not. present(dim1name)) then
|
|
call ncd_defvar(ncid=ncid, varname=trim(varname), xtype=lxtype, &
|
|
long_name=trim(long_name), units=units)
|
|
else if (.not. present(dim2name)) then
|
|
call ncd_defvar(ncid=ncid, varname=trim(varname), xtype=lxtype, &
|
|
dim1name=trim(dim1name), &
|
|
long_name=trim(long_name), units=units)
|
|
else if (present(dim2name)) then
|
|
call ncd_defvar(ncid=ncid, varname=trim(varname), xtype=lxtype, &
|
|
dim1name=trim(dim1name), dim2name=trim(dim2name), &
|
|
long_name=trim(long_name), units=units)
|
|
end if
|
|
|
|
status = PIO_inq_varid(ncid, trim(varname), vardesc)
|
|
varid = vardesc%varid
|
|
|
|
if (trim(interpinic_flag) == 'interp') then
|
|
status = PIO_put_att(ncid, varid, 'interpinic_flag', iflag_interp)
|
|
else if (trim(interpinic_flag) == 'copy') then
|
|
status = PIO_put_att(ncid, varid, 'interpinic_flag', iflag_copy)
|
|
else if (trim(interpinic_flag) == 'skip') then
|
|
status = PIO_put_att(ncid, varid, 'interpinic_flag', iflag_skip)
|
|
end if
|
|
status = PIO_put_att(ncid, varid, 'interpinic_flag_meanings', &
|
|
"1=nearest neighbor, 2=copy directly, 3=skip")
|
|
|
|
if (present(comment)) then
|
|
call ncd_putatt(ncid, varid, 'comment', trim(comment))
|
|
end if
|
|
if (present(units)) then
|
|
call ncd_putatt(ncid, varid, 'units', trim(units))
|
|
end if
|
|
|
|
if (present(fill_value)) then
|
|
call ncd_putatt(ncid, varid, '_FillValue', fill_value, lxtype)
|
|
else if (lxtype == ncd_double) then
|
|
call ncd_putatt(ncid, varid, '_FillValue', spval, lxtype)
|
|
end if
|
|
if (present(missing_value)) then
|
|
call ncd_putatt(ncid, varid, 'missing_value', missing_value, lxtype)
|
|
else if (lxtype == ncd_double) then
|
|
call ncd_putatt(ncid, varid, 'missing_value', spval, lxtype)
|
|
end if
|
|
if (present(ifill_value)) then
|
|
call ncd_putatt(ncid, varid, '_FillValue', ifill_value, lxtype)
|
|
else if (lxtype == ncd_int) then
|
|
call ncd_putatt(ncid, varid, '_FillValue', ispval, lxtype)
|
|
end if
|
|
if (present(imissing_value)) then
|
|
call ncd_putatt(ncid, varid, 'missing_value', imissing_value, lxtype)
|
|
else if (lxtype == ncd_int) then
|
|
call ncd_putatt(ncid, varid, 'missing_value', ispval, lxtype)
|
|
end if
|
|
if (present(nvalid_range)) then
|
|
status = PIO_put_att(ncid,varid,'valid_range', nvalid_range )
|
|
end if
|
|
if ( xtype == ncd_log )then
|
|
status = PIO_put_att(ncid,varid,'flag_values', (/0, 1/) )
|
|
status = PIO_put_att(ncid,varid,'flag_meanings', "FALSE TRUE" )
|
|
status = PIO_put_att(ncid,varid,'valid_range', (/0, 1/) )
|
|
end if
|
|
|
|
else if (flag == 'read' .or. flag == 'write') then
|
|
|
|
#if (100!=TYPETEXT)
|
|
if (.not. present(dim1name)) then
|
|
call ncd_io(varname=trim(varname), data=data, &
|
|
ncid=ncid, flag=flag, readvar=readvar)
|
|
else
|
|
call ncd_io(varname=trim(varname), data=data, &
|
|
dim1name=trim(dim1name), ncid=ncid, flag=flag, readvar=readvar)
|
|
end if
|
|
#endif
|
|
end if
|
|
|
|
if (flag == 'read') then
|
|
if (.not. readvar .and. is_restart()) call shr_sys_abort()
|
|
end if
|
|
|
|
# 273 "restUtilMod.F90.in"
|
|
end subroutine restartvar_1d_text
|
|
!DIMS 1,2
|
|
!TYPE text,int,double
|
|
# 150 "restUtilMod.F90.in"
|
|
subroutine restartvar_2d_text(&
|
|
ncid, flag, varname, xtype, dim1name, dim2name, &
|
|
long_name, units, interpinic_flag, data, readvar, &
|
|
comment, flag_meanings, missing_value, fill_value, &
|
|
imissing_value, ifill_value, flag_values, nvalid_range )
|
|
|
|
!----------------------------------------------------
|
|
! Arguments
|
|
type(file_desc_t) , intent(inout) :: ncid ! netcdf file id
|
|
character(len=*) , intent(in) :: flag ! 'read' or 'write'
|
|
character(len=*) , intent(in) :: varname ! variable name
|
|
integer , intent(in) :: xtype ! netcdf data type
|
|
character(len=*) , intent(in) :: long_name ! long name for variable
|
|
character(len=*) , intent(in) :: interpinic_flag ! interpolate variable using interpinic
|
|
character(len=*) , pointer :: data(:,:)
|
|
logical , intent(inout) :: readvar ! was var read?
|
|
character(len=*) , intent(in), optional :: dim1name ! dimension name
|
|
character(len=*) , intent(in), optional :: dim2name ! dimension name
|
|
character(len=*) , intent(in), optional :: units ! long name for variable
|
|
character(len=*) , intent(in), optional :: comment ! attribute
|
|
character(len=*) , intent(in), optional :: flag_meanings(:) ! attribute
|
|
real(r8) , intent(in), optional :: missing_value ! attribute for real
|
|
real(r8) , intent(in), optional :: fill_value ! attribute for real
|
|
integer , intent(in), optional :: imissing_value ! attribute for int
|
|
integer , intent(in), optional :: ifill_value ! attribute for int
|
|
integer , intent(in), optional :: flag_values(:) ! attribute for int
|
|
integer , intent(in), optional :: nvalid_range(2) ! attribute for int
|
|
!
|
|
! Local variables
|
|
integer :: ivalue
|
|
type(var_desc_t) :: vardesc ! local vardesc
|
|
integer :: status ! return error code
|
|
integer :: varid
|
|
integer :: lxtype ! local external type (in case logical variable)
|
|
!----------------------------------------------------
|
|
|
|
if (flag == 'define') then
|
|
|
|
if ( xtype == ncd_log )then
|
|
lxtype = ncd_int
|
|
else
|
|
lxtype = xtype
|
|
end if
|
|
|
|
if (.not. present(dim1name)) then
|
|
call ncd_defvar(ncid=ncid, varname=trim(varname), xtype=lxtype, &
|
|
long_name=trim(long_name), units=units)
|
|
else if (.not. present(dim2name)) then
|
|
call ncd_defvar(ncid=ncid, varname=trim(varname), xtype=lxtype, &
|
|
dim1name=trim(dim1name), &
|
|
long_name=trim(long_name), units=units)
|
|
else if (present(dim2name)) then
|
|
call ncd_defvar(ncid=ncid, varname=trim(varname), xtype=lxtype, &
|
|
dim1name=trim(dim1name), dim2name=trim(dim2name), &
|
|
long_name=trim(long_name), units=units)
|
|
end if
|
|
|
|
status = PIO_inq_varid(ncid, trim(varname), vardesc)
|
|
varid = vardesc%varid
|
|
|
|
if (trim(interpinic_flag) == 'interp') then
|
|
status = PIO_put_att(ncid, varid, 'interpinic_flag', iflag_interp)
|
|
else if (trim(interpinic_flag) == 'copy') then
|
|
status = PIO_put_att(ncid, varid, 'interpinic_flag', iflag_copy)
|
|
else if (trim(interpinic_flag) == 'skip') then
|
|
status = PIO_put_att(ncid, varid, 'interpinic_flag', iflag_skip)
|
|
end if
|
|
status = PIO_put_att(ncid, varid, 'interpinic_flag_meanings', &
|
|
"1=nearest neighbor, 2=copy directly, 3=skip")
|
|
|
|
if (present(comment)) then
|
|
call ncd_putatt(ncid, varid, 'comment', trim(comment))
|
|
end if
|
|
if (present(units)) then
|
|
call ncd_putatt(ncid, varid, 'units', trim(units))
|
|
end if
|
|
|
|
if (present(fill_value)) then
|
|
call ncd_putatt(ncid, varid, '_FillValue', fill_value, lxtype)
|
|
else if (lxtype == ncd_double) then
|
|
call ncd_putatt(ncid, varid, '_FillValue', spval, lxtype)
|
|
end if
|
|
if (present(missing_value)) then
|
|
call ncd_putatt(ncid, varid, 'missing_value', missing_value, lxtype)
|
|
else if (lxtype == ncd_double) then
|
|
call ncd_putatt(ncid, varid, 'missing_value', spval, lxtype)
|
|
end if
|
|
if (present(ifill_value)) then
|
|
call ncd_putatt(ncid, varid, '_FillValue', ifill_value, lxtype)
|
|
else if (lxtype == ncd_int) then
|
|
call ncd_putatt(ncid, varid, '_FillValue', ispval, lxtype)
|
|
end if
|
|
if (present(imissing_value)) then
|
|
call ncd_putatt(ncid, varid, 'missing_value', imissing_value, lxtype)
|
|
else if (lxtype == ncd_int) then
|
|
call ncd_putatt(ncid, varid, 'missing_value', ispval, lxtype)
|
|
end if
|
|
if (present(nvalid_range)) then
|
|
status = PIO_put_att(ncid,varid,'valid_range', nvalid_range )
|
|
end if
|
|
if ( xtype == ncd_log )then
|
|
status = PIO_put_att(ncid,varid,'flag_values', (/0, 1/) )
|
|
status = PIO_put_att(ncid,varid,'flag_meanings', "FALSE TRUE" )
|
|
status = PIO_put_att(ncid,varid,'valid_range', (/0, 1/) )
|
|
end if
|
|
|
|
else if (flag == 'read' .or. flag == 'write') then
|
|
|
|
#if (100!=TYPETEXT)
|
|
if (.not. present(dim1name)) then
|
|
call ncd_io(varname=trim(varname), data=data, &
|
|
ncid=ncid, flag=flag, readvar=readvar)
|
|
else
|
|
call ncd_io(varname=trim(varname), data=data, &
|
|
dim1name=trim(dim1name), ncid=ncid, flag=flag, readvar=readvar)
|
|
end if
|
|
#endif
|
|
end if
|
|
|
|
if (flag == 'read') then
|
|
if (.not. readvar .and. is_restart()) call shr_sys_abort()
|
|
end if
|
|
|
|
# 273 "restUtilMod.F90.in"
|
|
end subroutine restartvar_2d_text
|
|
!DIMS 1,2
|
|
!TYPE text,int,double
|
|
# 150 "restUtilMod.F90.in"
|
|
subroutine restartvar_1d_int(&
|
|
ncid, flag, varname, xtype, dim1name, dim2name, &
|
|
long_name, units, interpinic_flag, data, readvar, &
|
|
comment, flag_meanings, missing_value, fill_value, &
|
|
imissing_value, ifill_value, flag_values, nvalid_range )
|
|
|
|
!----------------------------------------------------
|
|
! Arguments
|
|
type(file_desc_t) , intent(inout) :: ncid ! netcdf file id
|
|
character(len=*) , intent(in) :: flag ! 'read' or 'write'
|
|
character(len=*) , intent(in) :: varname ! variable name
|
|
integer , intent(in) :: xtype ! netcdf data type
|
|
character(len=*) , intent(in) :: long_name ! long name for variable
|
|
character(len=*) , intent(in) :: interpinic_flag ! interpolate variable using interpinic
|
|
integer(i4) , pointer :: data(:)
|
|
logical , intent(inout) :: readvar ! was var read?
|
|
character(len=*) , intent(in), optional :: dim1name ! dimension name
|
|
character(len=*) , intent(in), optional :: dim2name ! dimension name
|
|
character(len=*) , intent(in), optional :: units ! long name for variable
|
|
character(len=*) , intent(in), optional :: comment ! attribute
|
|
character(len=*) , intent(in), optional :: flag_meanings(:) ! attribute
|
|
real(r8) , intent(in), optional :: missing_value ! attribute for real
|
|
real(r8) , intent(in), optional :: fill_value ! attribute for real
|
|
integer , intent(in), optional :: imissing_value ! attribute for int
|
|
integer , intent(in), optional :: ifill_value ! attribute for int
|
|
integer , intent(in), optional :: flag_values(:) ! attribute for int
|
|
integer , intent(in), optional :: nvalid_range(2) ! attribute for int
|
|
!
|
|
! Local variables
|
|
integer :: ivalue
|
|
type(var_desc_t) :: vardesc ! local vardesc
|
|
integer :: status ! return error code
|
|
integer :: varid
|
|
integer :: lxtype ! local external type (in case logical variable)
|
|
!----------------------------------------------------
|
|
|
|
if (flag == 'define') then
|
|
|
|
if ( xtype == ncd_log )then
|
|
lxtype = ncd_int
|
|
else
|
|
lxtype = xtype
|
|
end if
|
|
|
|
if (.not. present(dim1name)) then
|
|
call ncd_defvar(ncid=ncid, varname=trim(varname), xtype=lxtype, &
|
|
long_name=trim(long_name), units=units)
|
|
else if (.not. present(dim2name)) then
|
|
call ncd_defvar(ncid=ncid, varname=trim(varname), xtype=lxtype, &
|
|
dim1name=trim(dim1name), &
|
|
long_name=trim(long_name), units=units)
|
|
else if (present(dim2name)) then
|
|
call ncd_defvar(ncid=ncid, varname=trim(varname), xtype=lxtype, &
|
|
dim1name=trim(dim1name), dim2name=trim(dim2name), &
|
|
long_name=trim(long_name), units=units)
|
|
end if
|
|
|
|
status = PIO_inq_varid(ncid, trim(varname), vardesc)
|
|
varid = vardesc%varid
|
|
|
|
if (trim(interpinic_flag) == 'interp') then
|
|
status = PIO_put_att(ncid, varid, 'interpinic_flag', iflag_interp)
|
|
else if (trim(interpinic_flag) == 'copy') then
|
|
status = PIO_put_att(ncid, varid, 'interpinic_flag', iflag_copy)
|
|
else if (trim(interpinic_flag) == 'skip') then
|
|
status = PIO_put_att(ncid, varid, 'interpinic_flag', iflag_skip)
|
|
end if
|
|
status = PIO_put_att(ncid, varid, 'interpinic_flag_meanings', &
|
|
"1=nearest neighbor, 2=copy directly, 3=skip")
|
|
|
|
if (present(comment)) then
|
|
call ncd_putatt(ncid, varid, 'comment', trim(comment))
|
|
end if
|
|
if (present(units)) then
|
|
call ncd_putatt(ncid, varid, 'units', trim(units))
|
|
end if
|
|
|
|
if (present(fill_value)) then
|
|
call ncd_putatt(ncid, varid, '_FillValue', fill_value, lxtype)
|
|
else if (lxtype == ncd_double) then
|
|
call ncd_putatt(ncid, varid, '_FillValue', spval, lxtype)
|
|
end if
|
|
if (present(missing_value)) then
|
|
call ncd_putatt(ncid, varid, 'missing_value', missing_value, lxtype)
|
|
else if (lxtype == ncd_double) then
|
|
call ncd_putatt(ncid, varid, 'missing_value', spval, lxtype)
|
|
end if
|
|
if (present(ifill_value)) then
|
|
call ncd_putatt(ncid, varid, '_FillValue', ifill_value, lxtype)
|
|
else if (lxtype == ncd_int) then
|
|
call ncd_putatt(ncid, varid, '_FillValue', ispval, lxtype)
|
|
end if
|
|
if (present(imissing_value)) then
|
|
call ncd_putatt(ncid, varid, 'missing_value', imissing_value, lxtype)
|
|
else if (lxtype == ncd_int) then
|
|
call ncd_putatt(ncid, varid, 'missing_value', ispval, lxtype)
|
|
end if
|
|
if (present(nvalid_range)) then
|
|
status = PIO_put_att(ncid,varid,'valid_range', nvalid_range )
|
|
end if
|
|
if ( xtype == ncd_log )then
|
|
status = PIO_put_att(ncid,varid,'flag_values', (/0, 1/) )
|
|
status = PIO_put_att(ncid,varid,'flag_meanings', "FALSE TRUE" )
|
|
status = PIO_put_att(ncid,varid,'valid_range', (/0, 1/) )
|
|
end if
|
|
|
|
else if (flag == 'read' .or. flag == 'write') then
|
|
|
|
#if (103!=TYPETEXT)
|
|
if (.not. present(dim1name)) then
|
|
call ncd_io(varname=trim(varname), data=data, &
|
|
ncid=ncid, flag=flag, readvar=readvar)
|
|
else
|
|
call ncd_io(varname=trim(varname), data=data, &
|
|
dim1name=trim(dim1name), ncid=ncid, flag=flag, readvar=readvar)
|
|
end if
|
|
#endif
|
|
end if
|
|
|
|
if (flag == 'read') then
|
|
if (.not. readvar .and. is_restart()) call shr_sys_abort()
|
|
end if
|
|
|
|
# 273 "restUtilMod.F90.in"
|
|
end subroutine restartvar_1d_int
|
|
!DIMS 1,2
|
|
!TYPE text,int,double
|
|
# 150 "restUtilMod.F90.in"
|
|
subroutine restartvar_2d_int(&
|
|
ncid, flag, varname, xtype, dim1name, dim2name, &
|
|
long_name, units, interpinic_flag, data, readvar, &
|
|
comment, flag_meanings, missing_value, fill_value, &
|
|
imissing_value, ifill_value, flag_values, nvalid_range )
|
|
|
|
!----------------------------------------------------
|
|
! Arguments
|
|
type(file_desc_t) , intent(inout) :: ncid ! netcdf file id
|
|
character(len=*) , intent(in) :: flag ! 'read' or 'write'
|
|
character(len=*) , intent(in) :: varname ! variable name
|
|
integer , intent(in) :: xtype ! netcdf data type
|
|
character(len=*) , intent(in) :: long_name ! long name for variable
|
|
character(len=*) , intent(in) :: interpinic_flag ! interpolate variable using interpinic
|
|
integer(i4) , pointer :: data(:,:)
|
|
logical , intent(inout) :: readvar ! was var read?
|
|
character(len=*) , intent(in), optional :: dim1name ! dimension name
|
|
character(len=*) , intent(in), optional :: dim2name ! dimension name
|
|
character(len=*) , intent(in), optional :: units ! long name for variable
|
|
character(len=*) , intent(in), optional :: comment ! attribute
|
|
character(len=*) , intent(in), optional :: flag_meanings(:) ! attribute
|
|
real(r8) , intent(in), optional :: missing_value ! attribute for real
|
|
real(r8) , intent(in), optional :: fill_value ! attribute for real
|
|
integer , intent(in), optional :: imissing_value ! attribute for int
|
|
integer , intent(in), optional :: ifill_value ! attribute for int
|
|
integer , intent(in), optional :: flag_values(:) ! attribute for int
|
|
integer , intent(in), optional :: nvalid_range(2) ! attribute for int
|
|
!
|
|
! Local variables
|
|
integer :: ivalue
|
|
type(var_desc_t) :: vardesc ! local vardesc
|
|
integer :: status ! return error code
|
|
integer :: varid
|
|
integer :: lxtype ! local external type (in case logical variable)
|
|
!----------------------------------------------------
|
|
|
|
if (flag == 'define') then
|
|
|
|
if ( xtype == ncd_log )then
|
|
lxtype = ncd_int
|
|
else
|
|
lxtype = xtype
|
|
end if
|
|
|
|
if (.not. present(dim1name)) then
|
|
call ncd_defvar(ncid=ncid, varname=trim(varname), xtype=lxtype, &
|
|
long_name=trim(long_name), units=units)
|
|
else if (.not. present(dim2name)) then
|
|
call ncd_defvar(ncid=ncid, varname=trim(varname), xtype=lxtype, &
|
|
dim1name=trim(dim1name), &
|
|
long_name=trim(long_name), units=units)
|
|
else if (present(dim2name)) then
|
|
call ncd_defvar(ncid=ncid, varname=trim(varname), xtype=lxtype, &
|
|
dim1name=trim(dim1name), dim2name=trim(dim2name), &
|
|
long_name=trim(long_name), units=units)
|
|
end if
|
|
|
|
status = PIO_inq_varid(ncid, trim(varname), vardesc)
|
|
varid = vardesc%varid
|
|
|
|
if (trim(interpinic_flag) == 'interp') then
|
|
status = PIO_put_att(ncid, varid, 'interpinic_flag', iflag_interp)
|
|
else if (trim(interpinic_flag) == 'copy') then
|
|
status = PIO_put_att(ncid, varid, 'interpinic_flag', iflag_copy)
|
|
else if (trim(interpinic_flag) == 'skip') then
|
|
status = PIO_put_att(ncid, varid, 'interpinic_flag', iflag_skip)
|
|
end if
|
|
status = PIO_put_att(ncid, varid, 'interpinic_flag_meanings', &
|
|
"1=nearest neighbor, 2=copy directly, 3=skip")
|
|
|
|
if (present(comment)) then
|
|
call ncd_putatt(ncid, varid, 'comment', trim(comment))
|
|
end if
|
|
if (present(units)) then
|
|
call ncd_putatt(ncid, varid, 'units', trim(units))
|
|
end if
|
|
|
|
if (present(fill_value)) then
|
|
call ncd_putatt(ncid, varid, '_FillValue', fill_value, lxtype)
|
|
else if (lxtype == ncd_double) then
|
|
call ncd_putatt(ncid, varid, '_FillValue', spval, lxtype)
|
|
end if
|
|
if (present(missing_value)) then
|
|
call ncd_putatt(ncid, varid, 'missing_value', missing_value, lxtype)
|
|
else if (lxtype == ncd_double) then
|
|
call ncd_putatt(ncid, varid, 'missing_value', spval, lxtype)
|
|
end if
|
|
if (present(ifill_value)) then
|
|
call ncd_putatt(ncid, varid, '_FillValue', ifill_value, lxtype)
|
|
else if (lxtype == ncd_int) then
|
|
call ncd_putatt(ncid, varid, '_FillValue', ispval, lxtype)
|
|
end if
|
|
if (present(imissing_value)) then
|
|
call ncd_putatt(ncid, varid, 'missing_value', imissing_value, lxtype)
|
|
else if (lxtype == ncd_int) then
|
|
call ncd_putatt(ncid, varid, 'missing_value', ispval, lxtype)
|
|
end if
|
|
if (present(nvalid_range)) then
|
|
status = PIO_put_att(ncid,varid,'valid_range', nvalid_range )
|
|
end if
|
|
if ( xtype == ncd_log )then
|
|
status = PIO_put_att(ncid,varid,'flag_values', (/0, 1/) )
|
|
status = PIO_put_att(ncid,varid,'flag_meanings', "FALSE TRUE" )
|
|
status = PIO_put_att(ncid,varid,'valid_range', (/0, 1/) )
|
|
end if
|
|
|
|
else if (flag == 'read' .or. flag == 'write') then
|
|
|
|
#if (103!=TYPETEXT)
|
|
if (.not. present(dim1name)) then
|
|
call ncd_io(varname=trim(varname), data=data, &
|
|
ncid=ncid, flag=flag, readvar=readvar)
|
|
else
|
|
call ncd_io(varname=trim(varname), data=data, &
|
|
dim1name=trim(dim1name), ncid=ncid, flag=flag, readvar=readvar)
|
|
end if
|
|
#endif
|
|
end if
|
|
|
|
if (flag == 'read') then
|
|
if (.not. readvar .and. is_restart()) call shr_sys_abort()
|
|
end if
|
|
|
|
# 273 "restUtilMod.F90.in"
|
|
end subroutine restartvar_2d_int
|
|
!DIMS 1,2
|
|
!TYPE text,int,double
|
|
# 150 "restUtilMod.F90.in"
|
|
subroutine restartvar_1d_double(&
|
|
ncid, flag, varname, xtype, dim1name, dim2name, &
|
|
long_name, units, interpinic_flag, data, readvar, &
|
|
comment, flag_meanings, missing_value, fill_value, &
|
|
imissing_value, ifill_value, flag_values, nvalid_range )
|
|
|
|
!----------------------------------------------------
|
|
! Arguments
|
|
type(file_desc_t) , intent(inout) :: ncid ! netcdf file id
|
|
character(len=*) , intent(in) :: flag ! 'read' or 'write'
|
|
character(len=*) , intent(in) :: varname ! variable name
|
|
integer , intent(in) :: xtype ! netcdf data type
|
|
character(len=*) , intent(in) :: long_name ! long name for variable
|
|
character(len=*) , intent(in) :: interpinic_flag ! interpolate variable using interpinic
|
|
real(r8) , pointer :: data(:)
|
|
logical , intent(inout) :: readvar ! was var read?
|
|
character(len=*) , intent(in), optional :: dim1name ! dimension name
|
|
character(len=*) , intent(in), optional :: dim2name ! dimension name
|
|
character(len=*) , intent(in), optional :: units ! long name for variable
|
|
character(len=*) , intent(in), optional :: comment ! attribute
|
|
character(len=*) , intent(in), optional :: flag_meanings(:) ! attribute
|
|
real(r8) , intent(in), optional :: missing_value ! attribute for real
|
|
real(r8) , intent(in), optional :: fill_value ! attribute for real
|
|
integer , intent(in), optional :: imissing_value ! attribute for int
|
|
integer , intent(in), optional :: ifill_value ! attribute for int
|
|
integer , intent(in), optional :: flag_values(:) ! attribute for int
|
|
integer , intent(in), optional :: nvalid_range(2) ! attribute for int
|
|
!
|
|
! Local variables
|
|
integer :: ivalue
|
|
type(var_desc_t) :: vardesc ! local vardesc
|
|
integer :: status ! return error code
|
|
integer :: varid
|
|
integer :: lxtype ! local external type (in case logical variable)
|
|
!----------------------------------------------------
|
|
|
|
if (flag == 'define') then
|
|
|
|
if ( xtype == ncd_log )then
|
|
lxtype = ncd_int
|
|
else
|
|
lxtype = xtype
|
|
end if
|
|
|
|
if (.not. present(dim1name)) then
|
|
call ncd_defvar(ncid=ncid, varname=trim(varname), xtype=lxtype, &
|
|
long_name=trim(long_name), units=units)
|
|
else if (.not. present(dim2name)) then
|
|
call ncd_defvar(ncid=ncid, varname=trim(varname), xtype=lxtype, &
|
|
dim1name=trim(dim1name), &
|
|
long_name=trim(long_name), units=units)
|
|
else if (present(dim2name)) then
|
|
call ncd_defvar(ncid=ncid, varname=trim(varname), xtype=lxtype, &
|
|
dim1name=trim(dim1name), dim2name=trim(dim2name), &
|
|
long_name=trim(long_name), units=units)
|
|
end if
|
|
|
|
status = PIO_inq_varid(ncid, trim(varname), vardesc)
|
|
varid = vardesc%varid
|
|
|
|
if (trim(interpinic_flag) == 'interp') then
|
|
status = PIO_put_att(ncid, varid, 'interpinic_flag', iflag_interp)
|
|
else if (trim(interpinic_flag) == 'copy') then
|
|
status = PIO_put_att(ncid, varid, 'interpinic_flag', iflag_copy)
|
|
else if (trim(interpinic_flag) == 'skip') then
|
|
status = PIO_put_att(ncid, varid, 'interpinic_flag', iflag_skip)
|
|
end if
|
|
status = PIO_put_att(ncid, varid, 'interpinic_flag_meanings', &
|
|
"1=nearest neighbor, 2=copy directly, 3=skip")
|
|
|
|
if (present(comment)) then
|
|
call ncd_putatt(ncid, varid, 'comment', trim(comment))
|
|
end if
|
|
if (present(units)) then
|
|
call ncd_putatt(ncid, varid, 'units', trim(units))
|
|
end if
|
|
|
|
if (present(fill_value)) then
|
|
call ncd_putatt(ncid, varid, '_FillValue', fill_value, lxtype)
|
|
else if (lxtype == ncd_double) then
|
|
call ncd_putatt(ncid, varid, '_FillValue', spval, lxtype)
|
|
end if
|
|
if (present(missing_value)) then
|
|
call ncd_putatt(ncid, varid, 'missing_value', missing_value, lxtype)
|
|
else if (lxtype == ncd_double) then
|
|
call ncd_putatt(ncid, varid, 'missing_value', spval, lxtype)
|
|
end if
|
|
if (present(ifill_value)) then
|
|
call ncd_putatt(ncid, varid, '_FillValue', ifill_value, lxtype)
|
|
else if (lxtype == ncd_int) then
|
|
call ncd_putatt(ncid, varid, '_FillValue', ispval, lxtype)
|
|
end if
|
|
if (present(imissing_value)) then
|
|
call ncd_putatt(ncid, varid, 'missing_value', imissing_value, lxtype)
|
|
else if (lxtype == ncd_int) then
|
|
call ncd_putatt(ncid, varid, 'missing_value', ispval, lxtype)
|
|
end if
|
|
if (present(nvalid_range)) then
|
|
status = PIO_put_att(ncid,varid,'valid_range', nvalid_range )
|
|
end if
|
|
if ( xtype == ncd_log )then
|
|
status = PIO_put_att(ncid,varid,'flag_values', (/0, 1/) )
|
|
status = PIO_put_att(ncid,varid,'flag_meanings', "FALSE TRUE" )
|
|
status = PIO_put_att(ncid,varid,'valid_range', (/0, 1/) )
|
|
end if
|
|
|
|
else if (flag == 'read' .or. flag == 'write') then
|
|
|
|
#if (102!=TYPETEXT)
|
|
if (.not. present(dim1name)) then
|
|
call ncd_io(varname=trim(varname), data=data, &
|
|
ncid=ncid, flag=flag, readvar=readvar)
|
|
else
|
|
call ncd_io(varname=trim(varname), data=data, &
|
|
dim1name=trim(dim1name), ncid=ncid, flag=flag, readvar=readvar)
|
|
end if
|
|
#endif
|
|
end if
|
|
|
|
if (flag == 'read') then
|
|
if (.not. readvar .and. is_restart()) call shr_sys_abort()
|
|
end if
|
|
|
|
# 273 "restUtilMod.F90.in"
|
|
end subroutine restartvar_1d_double
|
|
!DIMS 1,2
|
|
!TYPE text,int,double
|
|
# 150 "restUtilMod.F90.in"
|
|
subroutine restartvar_2d_double(&
|
|
ncid, flag, varname, xtype, dim1name, dim2name, &
|
|
long_name, units, interpinic_flag, data, readvar, &
|
|
comment, flag_meanings, missing_value, fill_value, &
|
|
imissing_value, ifill_value, flag_values, nvalid_range )
|
|
|
|
!----------------------------------------------------
|
|
! Arguments
|
|
type(file_desc_t) , intent(inout) :: ncid ! netcdf file id
|
|
character(len=*) , intent(in) :: flag ! 'read' or 'write'
|
|
character(len=*) , intent(in) :: varname ! variable name
|
|
integer , intent(in) :: xtype ! netcdf data type
|
|
character(len=*) , intent(in) :: long_name ! long name for variable
|
|
character(len=*) , intent(in) :: interpinic_flag ! interpolate variable using interpinic
|
|
real(r8) , pointer :: data(:,:)
|
|
logical , intent(inout) :: readvar ! was var read?
|
|
character(len=*) , intent(in), optional :: dim1name ! dimension name
|
|
character(len=*) , intent(in), optional :: dim2name ! dimension name
|
|
character(len=*) , intent(in), optional :: units ! long name for variable
|
|
character(len=*) , intent(in), optional :: comment ! attribute
|
|
character(len=*) , intent(in), optional :: flag_meanings(:) ! attribute
|
|
real(r8) , intent(in), optional :: missing_value ! attribute for real
|
|
real(r8) , intent(in), optional :: fill_value ! attribute for real
|
|
integer , intent(in), optional :: imissing_value ! attribute for int
|
|
integer , intent(in), optional :: ifill_value ! attribute for int
|
|
integer , intent(in), optional :: flag_values(:) ! attribute for int
|
|
integer , intent(in), optional :: nvalid_range(2) ! attribute for int
|
|
!
|
|
! Local variables
|
|
integer :: ivalue
|
|
type(var_desc_t) :: vardesc ! local vardesc
|
|
integer :: status ! return error code
|
|
integer :: varid
|
|
integer :: lxtype ! local external type (in case logical variable)
|
|
!----------------------------------------------------
|
|
|
|
if (flag == 'define') then
|
|
|
|
if ( xtype == ncd_log )then
|
|
lxtype = ncd_int
|
|
else
|
|
lxtype = xtype
|
|
end if
|
|
|
|
if (.not. present(dim1name)) then
|
|
call ncd_defvar(ncid=ncid, varname=trim(varname), xtype=lxtype, &
|
|
long_name=trim(long_name), units=units)
|
|
else if (.not. present(dim2name)) then
|
|
call ncd_defvar(ncid=ncid, varname=trim(varname), xtype=lxtype, &
|
|
dim1name=trim(dim1name), &
|
|
long_name=trim(long_name), units=units)
|
|
else if (present(dim2name)) then
|
|
call ncd_defvar(ncid=ncid, varname=trim(varname), xtype=lxtype, &
|
|
dim1name=trim(dim1name), dim2name=trim(dim2name), &
|
|
long_name=trim(long_name), units=units)
|
|
end if
|
|
|
|
status = PIO_inq_varid(ncid, trim(varname), vardesc)
|
|
varid = vardesc%varid
|
|
|
|
if (trim(interpinic_flag) == 'interp') then
|
|
status = PIO_put_att(ncid, varid, 'interpinic_flag', iflag_interp)
|
|
else if (trim(interpinic_flag) == 'copy') then
|
|
status = PIO_put_att(ncid, varid, 'interpinic_flag', iflag_copy)
|
|
else if (trim(interpinic_flag) == 'skip') then
|
|
status = PIO_put_att(ncid, varid, 'interpinic_flag', iflag_skip)
|
|
end if
|
|
status = PIO_put_att(ncid, varid, 'interpinic_flag_meanings', &
|
|
"1=nearest neighbor, 2=copy directly, 3=skip")
|
|
|
|
if (present(comment)) then
|
|
call ncd_putatt(ncid, varid, 'comment', trim(comment))
|
|
end if
|
|
if (present(units)) then
|
|
call ncd_putatt(ncid, varid, 'units', trim(units))
|
|
end if
|
|
|
|
if (present(fill_value)) then
|
|
call ncd_putatt(ncid, varid, '_FillValue', fill_value, lxtype)
|
|
else if (lxtype == ncd_double) then
|
|
call ncd_putatt(ncid, varid, '_FillValue', spval, lxtype)
|
|
end if
|
|
if (present(missing_value)) then
|
|
call ncd_putatt(ncid, varid, 'missing_value', missing_value, lxtype)
|
|
else if (lxtype == ncd_double) then
|
|
call ncd_putatt(ncid, varid, 'missing_value', spval, lxtype)
|
|
end if
|
|
if (present(ifill_value)) then
|
|
call ncd_putatt(ncid, varid, '_FillValue', ifill_value, lxtype)
|
|
else if (lxtype == ncd_int) then
|
|
call ncd_putatt(ncid, varid, '_FillValue', ispval, lxtype)
|
|
end if
|
|
if (present(imissing_value)) then
|
|
call ncd_putatt(ncid, varid, 'missing_value', imissing_value, lxtype)
|
|
else if (lxtype == ncd_int) then
|
|
call ncd_putatt(ncid, varid, 'missing_value', ispval, lxtype)
|
|
end if
|
|
if (present(nvalid_range)) then
|
|
status = PIO_put_att(ncid,varid,'valid_range', nvalid_range )
|
|
end if
|
|
if ( xtype == ncd_log )then
|
|
status = PIO_put_att(ncid,varid,'flag_values', (/0, 1/) )
|
|
status = PIO_put_att(ncid,varid,'flag_meanings', "FALSE TRUE" )
|
|
status = PIO_put_att(ncid,varid,'valid_range', (/0, 1/) )
|
|
end if
|
|
|
|
else if (flag == 'read' .or. flag == 'write') then
|
|
|
|
#if (102!=TYPETEXT)
|
|
if (.not. present(dim1name)) then
|
|
call ncd_io(varname=trim(varname), data=data, &
|
|
ncid=ncid, flag=flag, readvar=readvar)
|
|
else
|
|
call ncd_io(varname=trim(varname), data=data, &
|
|
dim1name=trim(dim1name), ncid=ncid, flag=flag, readvar=readvar)
|
|
end if
|
|
#endif
|
|
end if
|
|
|
|
if (flag == 'read') then
|
|
if (.not. readvar .and. is_restart()) call shr_sys_abort()
|
|
end if
|
|
|
|
# 273 "restUtilMod.F90.in"
|
|
end subroutine restartvar_2d_double
|
|
|
|
!-----------------------------------------------------------------------
|
|
|
|
# 277 "restUtilMod.F90.in"
|
|
subroutine restartvar_2d_double_bounds(ncid, flag, varname, xtype, &
|
|
dim1name, dim2name, switchdim, lowerb2, upperb2, &
|
|
long_name, units, interpinic_flag, data, readvar, &
|
|
comment, flag_meanings, missing_value, fill_value, &
|
|
imissing_value, ifill_value, flag_values, nvalid_range )
|
|
|
|
!----------------------------------------------------
|
|
! Arguments
|
|
type(file_desc_t), intent(inout) :: ncid ! netcdf file id
|
|
character(len=*) , intent(in) :: flag ! 'read' or 'write'
|
|
character(len=*) , intent(in) :: varname ! variable name
|
|
integer , intent(in) :: xtype ! netcdf data type
|
|
character(len=*) , intent(in) :: dim1name ! dimension name
|
|
character(len=*) , intent(in) :: dim2name ! dimension name
|
|
logical , intent(in) :: switchdim
|
|
character(len=*) , intent(in) :: long_name ! long name for variable
|
|
character(len=*) , intent(in) :: interpinic_flag ! interpolate variable using interpinic
|
|
real(r8) , pointer :: data(:,:) ! raw data
|
|
logical , intent(out) :: readvar ! was var read?
|
|
integer , intent(in), optional :: lowerb2
|
|
integer , intent(in), optional :: upperb2
|
|
character(len=*) , intent(in), optional :: units ! long name for variable
|
|
character(len=*) , intent(in), optional :: comment ! attribute
|
|
character(len=*) , intent(in), optional :: flag_meanings(:) ! attribute
|
|
real(r8) , intent(in), optional :: missing_value ! attribute for real
|
|
real(r8) , intent(in), optional :: fill_value ! attribute for real
|
|
integer , intent(in), optional :: imissing_value ! attribute for int
|
|
integer , intent(in), optional :: ifill_value ! attribute for int
|
|
integer , intent(in), optional :: flag_values(:) ! attribute for int
|
|
integer , intent(in), optional :: nvalid_range(2) ! attribute for int
|
|
!
|
|
! Local variables
|
|
integer :: ivalue
|
|
type(var_desc_t) :: vardesc ! local vardesc
|
|
integer :: status ! return error code
|
|
integer :: varid ! returned var id
|
|
integer :: lxtype ! local external type (in case logical variable)
|
|
!----------------------------------------------------
|
|
|
|
if (flag == 'define') then
|
|
|
|
if ( xtype == ncd_log )then
|
|
lxtype = ncd_int
|
|
else
|
|
lxtype = xtype
|
|
end if
|
|
|
|
if (switchdim) then
|
|
call ncd_defvar(ncid=ncid, varname=trim(varname), xtype=lxtype, &
|
|
dim1name=trim(dim2name), dim2name=trim(dim1name), &
|
|
long_name=trim(long_name), units=units)
|
|
else
|
|
call ncd_defvar(ncid=ncid, varname=trim(varname), xtype=lxtype, &
|
|
dim1name=trim(dim1name), dim2name=trim(dim2name), &
|
|
long_name=trim(long_name), units=units)
|
|
end if
|
|
status = PIO_inq_varid(ncid, trim(varname), vardesc)
|
|
|
|
varid = vardesc%varid
|
|
|
|
if (trim(interpinic_flag) == 'interp') then
|
|
status = PIO_put_att(ncid, varid, 'interpinic_flag', iflag_interp)
|
|
else if (trim(interpinic_flag) == 'copy') then
|
|
status = PIO_put_att(ncid, varid, 'interpinic_flag', iflag_copy)
|
|
else if (trim(interpinic_flag) == 'skip') then
|
|
status = PIO_put_att(ncid, varid, 'interpinic_flag', iflag_skip)
|
|
end if
|
|
status = PIO_put_att(ncid, varid, 'interpinic_flag_meanings', &
|
|
"1=>nearest_neighbor 2=>copy 3=>skip")
|
|
|
|
if (switchdim) then
|
|
status = PIO_put_att(ncid, vardesc%varid, 'switchdim_flag', 1)
|
|
else
|
|
status = PIO_put_att(ncid, vardesc%varid, 'switchdim_flag', 0)
|
|
end if
|
|
status = PIO_put_att(ncid, vardesc%varid, 'switchdim_flag_values', (/0,1/))
|
|
status = PIO_put_att(ncid, vardesc%varid, 'switchdim_flag_is_0', &
|
|
"1st and 2nd dims are same as model representation")
|
|
status = PIO_put_att(ncid, vardesc%varid, 'switchdim_flag_is_1', &
|
|
"1st and 2nd dims are switched from model representation")
|
|
|
|
if (present(comment)) then
|
|
call ncd_putatt(ncid, varid, 'comment', trim(comment))
|
|
end if
|
|
if (present(units)) then
|
|
call ncd_putatt(ncid, varid, 'units', trim(units))
|
|
end if
|
|
if (present(fill_value)) then
|
|
call ncd_putatt(ncid, varid, '_FillValue', fill_value, lxtype)
|
|
else if (lxtype == ncd_double) then
|
|
call ncd_putatt(ncid, varid, '_FillValue', spval, lxtype)
|
|
end if
|
|
if (present(missing_value)) then
|
|
call ncd_putatt(ncid, varid, 'missing_value', missing_value, lxtype)
|
|
else if (lxtype == ncd_double) then
|
|
call ncd_putatt(ncid, varid, 'missing_value', spval, lxtype)
|
|
end if
|
|
if (present(ifill_value)) then
|
|
call ncd_putatt(ncid, varid, '_FillValue', ifill_value, lxtype)
|
|
else if (lxtype == ncd_int) then
|
|
call ncd_putatt(ncid, varid, '_FillValue', ispval, lxtype)
|
|
end if
|
|
if (present(imissing_value)) then
|
|
call ncd_putatt(ncid, varid, 'missing_value', imissing_value, lxtype)
|
|
else if (lxtype == ncd_int) then
|
|
call ncd_putatt(ncid, varid, 'missing_value', ispval, lxtype)
|
|
end if
|
|
if (present(nvalid_range)) then
|
|
status = PIO_put_att(ncid,varid,'valid_range', nvalid_range )
|
|
end if
|
|
if ( xtype == ncd_log )then
|
|
status = PIO_put_att(ncid,varid,'flag_values', (/0, 1/) )
|
|
status = PIO_put_att(ncid,varid,'flag_meanings', "FALSE TRUE" )
|
|
status = PIO_put_att(ncid,varid,'valid_range', (/0, 1/) )
|
|
end if
|
|
|
|
else
|
|
|
|
if (present(lowerb2) .and. present(upperb2)) then
|
|
call ncd_io(varname=trim(varname), data=data, &
|
|
dim1name=trim(dim1name), switchdim=switchdim, &
|
|
lowerb2=lowerb2, upperb2=upperb2, &
|
|
ncid=ncid, flag=flag, readvar=readvar)
|
|
else
|
|
call ncd_io(varname=trim(varname), data=data, &
|
|
dim1name=trim(dim1name), switchdim=switchdim, &
|
|
ncid=ncid, flag=flag, readvar=readvar)
|
|
end if
|
|
|
|
end if
|
|
|
|
if (flag == 'read') then
|
|
if (.not. readvar .and. is_restart()) call shr_sys_abort()
|
|
end if
|
|
|
|
# 412 "restUtilMod.F90.in"
|
|
end subroutine restartvar_2d_double_bounds
|
|
|
|
|
|
!-----------------------------------------------------------------------
|
|
# 416 "restUtilMod.F90.in"
|
|
logical function is_restart( )
|
|
! Determine if restart run
|
|
use clm_varctl, only : nsrest, nsrContinue
|
|
if (nsrest == nsrContinue) then
|
|
is_restart = .true.
|
|
else
|
|
is_restart = .false.
|
|
end if
|
|
# 424 "restUtilMod.F90.in"
|
|
end function is_restart
|
|
|
|
end module restUtilMod
|