Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

read_variable_2d in horizontal remapping #14

Closed
Closed
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
9 changes: 4 additions & 5 deletions src/framework/MOM_horizontal_regridding.F90
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ module MOM_horizontal_regridding
use MOM_interp_infra, only : axistype, get_external_field_info, get_axis_data
use MOM_time_manager, only : time_type
use MOM_io, only : axis_info, get_axis_info, get_var_axes_info, MOM_read_data
use MOM_io, only : read_attribute
use MOM_io, only : read_attribute, read_variable

implicit none ; private

Expand Down Expand Up @@ -448,12 +448,11 @@ subroutine horiz_interp_and_extrap_tracer_record(filename, varnam, conversion,
endif
enddo
enddo

else
start(:) = 1 ; start(3) = k
count(:) = 1 ; count(1) = id ; count(2) = jd
call read_variable(trim(filename), trim(varnam), tr_in, start=start, nread=count)
if (is_root_pe()) then
start = 1 ; start(3) = k ; count(:) = 1 ; count(1) = id ; count(2) = jd
start(4) = 1; count(4) = 1
call MOM_read_data(trim(filename), trim(varnam), tr_in, start, count, no_domain=.true.)
if (add_np) then
pole = 0.0 ; npole = 0.0
do i=1,id
Expand Down
56 changes: 56 additions & 0 deletions src/framework/MOM_io.F90
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,7 @@ module MOM_io
interface read_variable
module procedure read_variable_0d, read_variable_0d_int
module procedure read_variable_1d, read_variable_1d_int
module procedure read_variable_2d
end interface read_variable

!> Read a global or variable attribute from a named netCDF file using netCDF calls
Expand Down Expand Up @@ -887,6 +888,61 @@ subroutine read_variable_1d_int(filename, varname, var, ncid_in)
call broadcast(var, size(var), blocking=.true.)
end subroutine read_variable_1d_int

!> Read a 2d array from a netCDF input file and save to a variable.
!!
!! Start and nread ranks may exceed var, but must match the rank of the
!! variable in the netCDF file. This allows for reading slices of larger
!! arrays.
!!
!! I/O occurs only on the root PE, and data is broadcast to other ranks.
!! Due to potentially large memory communication and storage, this subroutine
!! should only be used when domain-decomposition is unavaialable.
subroutine read_variable_2d(filename, varname, var, start, nread, ncid_in)
character(len=*), intent(in) :: filename !< Name of file to be read
character(len=*), intent(in) :: varname !< Name of variable to be read
real, intent(out) :: var(:,:) !< Output array of variable
integer, optional, intent(in) :: start(:) !< Starting index on each axis.
integer, optional, intent(in) :: nread(:) !< Number of values to be read along each axis
integer, optional, intent(in) :: ncid_in !< netCDF ID of an opened file.
!! If absent, the file is opened and closed within this routine.

integer :: ncid, varid, ndims, rc
character(len=*), parameter :: hdr = "read_variable_2d"
character(len=128) :: msg

if (is_root_pe()) then
if (present(ncid_in)) then
ncid = ncid_in
else
call open_file_to_Read(filename, ncid)
endif

call get_varid(varname, ncid, filename, varid, match_case=.false.)
if (varid < 0) call MOM_error(FATAL, "Unable to get netCDF varid for "//trim(varname)//&
" in "//trim(filename))
! Verify that start(:) and nread(:) ranks match variable's dimension count
rc = nf90_inquire_variable(ncid, varid, ndims=ndims)
if (rc /= NF90_NOERR) call MOM_error(FATAL, hdr // trim(nf90_strerror(rc)) //&
" Difficulties reading "//trim(varname)//" from "//trim(filename))

! NOTE: We could check additional information here (type, size, ...)

rc = nf90_get_var(ncid, varid, var)
if (rc /= NF90_NOERR) call MOM_error(FATAL, hdr // trim(nf90_strerror(rc)) //&
" Difficulties reading "//trim(varname)//" from "//trim(filename))

if (size(start) /= ndims .or. size(nread) /= ndims) then
write (msg, '("'// hdr //': size(start) ", i0, " and/or size(nread) ", &
i0, " do not match ndims ", i0)') size(start), size(nread), ndims
call MOM_error(FATAL, trim(msg))
endif

if (.not.present(ncid_in)) call close_file_to_read(ncid, filename)
endif

call broadcast(var, size(var), blocking=.true.)
end subroutine read_variable_2d

!> Read a character-string global or variable attribute
subroutine read_attribute_str(filename, attname, att_val, varname, found, all_read, ncid_in)
character(len=*), intent(in) :: filename !< Name of the file to read
Expand Down