module ncdr_vars_fetch use ncd_kinds, only: i_byte, i_short, i_long, r_single, r_double use ncdr_state, only: ncdr_files, current_ncdr_id use ncdr_check, only: ncdr_nc_check, ncdr_check_ncdr_id, & ncdr_check_current_ncdr_id, ncdr_check_ncid use ncdr_alloc_assert, only: nc_diag_read_id_assert_var, & nc_diag_read_assert_var_type, nc_diag_read_assert_var_ndims, & nc_diag_read_assert_dims use netcdf, only: nf90_get_var, NF90_BYTE, NF90_SHORT, NF90_INT, & NF90_FLOAT, NF90_DOUBLE, NF90_CHAR implicit none interface nc_diag_read_get_var module procedure & nc_diag_read_id_get_var_1d_byte, & nc_diag_read_id_get_var_1d_short, & nc_diag_read_id_get_var_1d_long, & nc_diag_read_id_get_var_1d_float, & nc_diag_read_id_get_var_1d_double, & nc_diag_read_id_get_var_1d_string, & nc_diag_read_noid_get_var_1d_byte, & nc_diag_read_noid_get_var_1d_short, & nc_diag_read_noid_get_var_1d_long, & nc_diag_read_noid_get_var_1d_float, & nc_diag_read_noid_get_var_1d_double, & nc_diag_read_noid_get_var_1d_string, & nc_diag_read_id_get_var_2d_byte, & nc_diag_read_id_get_var_2d_short, & nc_diag_read_id_get_var_2d_long, & nc_diag_read_id_get_var_2d_float, & nc_diag_read_id_get_var_2d_double, & nc_diag_read_id_get_var_2d_string, & nc_diag_read_noid_get_var_2d_byte, & nc_diag_read_noid_get_var_2d_short, & nc_diag_read_noid_get_var_2d_long, & nc_diag_read_noid_get_var_2d_float, & nc_diag_read_noid_get_var_2d_double, & nc_diag_read_noid_get_var_2d_string end interface nc_diag_read_get_var contains subroutine nc_diag_read_id_get_var_1d_byte(file_ncdr_id, var_name, var_stor) integer(i_long), intent(in) :: file_ncdr_id character(len=*), intent(in) :: var_name integer(i_byte), dimension(:), allocatable, intent(inout) :: var_stor integer(i_long) :: var_index, var_type, file_ncid call ncdr_check_ncdr_id(file_ncdr_id) file_ncid = ncdr_files(file_ncdr_id)%ncid call ncdr_check_ncdr_id(file_ncdr_id) var_index = nc_diag_read_id_assert_var(file_ncdr_id, var_name) var_type = ncdr_files(file_ncdr_id)%vars(var_index)%var_type call nc_diag_read_assert_var_type(var_type, NF90_BYTE) call nc_diag_read_assert_var_ndims(size( & ncdr_files(file_ncdr_id)%vars(var_index)%var_dim_sizes), 1) call nc_diag_read_assert_dims(var_stor, & ncdr_files(file_ncdr_id)%vars(var_index)%var_dim_sizes) call ncdr_nc_check(nf90_get_var(file_ncid, var_index, & var_stor, & start = (/ 1 /), & count = (/ ncdr_files(file_ncdr_id)%vars(var_index)%var_dim_sizes(1) /) )) end subroutine nc_diag_read_id_get_var_1d_byte subroutine nc_diag_read_noid_get_var_1d_byte(var_name, var_stor) character(len=*), intent(in) :: var_name integer(i_byte), dimension(:), allocatable, intent(inout) :: var_stor call ncdr_check_current_ncdr_id call nc_diag_read_id_get_var_1d_byte(current_ncdr_id, var_name, var_stor) end subroutine nc_diag_read_noid_get_var_1d_byte subroutine nc_diag_read_id_get_var_1d_short(file_ncdr_id, var_name, var_stor) integer(i_long), intent(in) :: file_ncdr_id character(len=*), intent(in) :: var_name integer(i_short), dimension(:), allocatable, intent(inout) :: var_stor integer(i_long) :: var_index, var_type, file_ncid call ncdr_check_ncdr_id(file_ncdr_id) file_ncid = ncdr_files(file_ncdr_id)%ncid call ncdr_check_ncid(file_ncid) var_index = nc_diag_read_id_assert_var(file_ncdr_id, var_name) var_type = ncdr_files(file_ncdr_id)%vars(var_index)%var_type call nc_diag_read_assert_var_type(var_type, NF90_SHORT) call nc_diag_read_assert_var_ndims(size( & ncdr_files(file_ncdr_id)%vars(var_index)%var_dim_sizes), 1) call nc_diag_read_assert_dims(var_stor, & ncdr_files(file_ncdr_id)%vars(var_index)%var_dim_sizes) call ncdr_nc_check(nf90_get_var(file_ncid, var_index, & var_stor, & start = (/ 1 /), & count = (/ ncdr_files(file_ncdr_id)%vars(var_index)%var_dim_sizes(1) /) )) end subroutine nc_diag_read_id_get_var_1d_short subroutine nc_diag_read_noid_get_var_1d_short(var_name, var_stor) character(len=*), intent(in) :: var_name integer(i_short), dimension(:), allocatable, intent(inout) :: var_stor call ncdr_check_current_ncdr_id call nc_diag_read_id_get_var_1d_short(current_ncdr_id, var_name, var_stor) end subroutine nc_diag_read_noid_get_var_1d_short subroutine nc_diag_read_id_get_var_1d_long(file_ncdr_id, var_name, var_stor) integer(i_long), intent(in) :: file_ncdr_id character(len=*), intent(in) :: var_name integer(i_long), dimension(:), allocatable, intent(inout) :: var_stor integer(i_long) :: var_index, var_type, file_ncid call ncdr_check_ncdr_id(file_ncdr_id) file_ncid = ncdr_files(file_ncdr_id)%ncid call ncdr_check_ncid(file_ncid) var_index = nc_diag_read_id_assert_var(file_ncdr_id, var_name) var_type = ncdr_files(file_ncdr_id)%vars(var_index)%var_type call nc_diag_read_assert_var_type(var_type, NF90_INT) call nc_diag_read_assert_var_ndims(size( & ncdr_files(file_ncdr_id)%vars(var_index)%var_dim_sizes), 1) call nc_diag_read_assert_dims(var_stor, & ncdr_files(file_ncdr_id)%vars(var_index)%var_dim_sizes) call ncdr_nc_check(nf90_get_var(file_ncid, var_index, & var_stor, & start = (/ 1 /), & count = (/ ncdr_files(file_ncdr_id)%vars(var_index)%var_dim_sizes(1) /) )) end subroutine nc_diag_read_id_get_var_1d_long subroutine nc_diag_read_noid_get_var_1d_long(var_name, var_stor) character(len=*), intent(in) :: var_name integer(i_long), dimension(:), allocatable, intent(inout) :: var_stor call ncdr_check_current_ncdr_id call nc_diag_read_id_get_var_1d_long(current_ncdr_id, var_name, var_stor) end subroutine nc_diag_read_noid_get_var_1d_long subroutine nc_diag_read_id_get_var_1d_float(file_ncdr_id, var_name, var_stor) integer(i_long), intent(in) :: file_ncdr_id character(len=*), intent(in) :: var_name real(r_single), dimension(:), allocatable, intent(inout) :: var_stor integer(i_long) :: var_index, var_type, file_ncid call ncdr_check_ncdr_id(file_ncdr_id) file_ncid = ncdr_files(file_ncdr_id)%ncid call ncdr_check_ncid(file_ncid) var_index = nc_diag_read_id_assert_var(file_ncdr_id, var_name) var_type = ncdr_files(file_ncdr_id)%vars(var_index)%var_type call nc_diag_read_assert_var_type(var_type, NF90_FLOAT) call nc_diag_read_assert_var_ndims(size( & ncdr_files(file_ncdr_id)%vars(var_index)%var_dim_sizes), 1) call nc_diag_read_assert_dims(var_stor, & ncdr_files(file_ncdr_id)%vars(var_index)%var_dim_sizes) call ncdr_nc_check(nf90_get_var(file_ncid, var_index, & var_stor, & start = (/ 1 /), & count = (/ ncdr_files(file_ncdr_id)%vars(var_index)%var_dim_sizes(1) /) )) end subroutine nc_diag_read_id_get_var_1d_float subroutine nc_diag_read_noid_get_var_1d_float(var_name, var_stor) character(len=*), intent(in) :: var_name real(r_single), dimension(:), allocatable, intent(inout) :: var_stor call ncdr_check_current_ncdr_id call nc_diag_read_id_get_var_1d_float(current_ncdr_id, var_name, var_stor) end subroutine nc_diag_read_noid_get_var_1d_float subroutine nc_diag_read_id_get_var_1d_double(file_ncdr_id, var_name, var_stor) integer(i_long), intent(in) :: file_ncdr_id character(len=*), intent(in) :: var_name real(r_double), dimension(:), allocatable, intent(inout) :: var_stor integer(i_long) :: var_index, var_type, file_ncid call ncdr_check_ncdr_id(file_ncdr_id) file_ncid = ncdr_files(file_ncdr_id)%ncid call ncdr_check_ncid(file_ncid) var_index = nc_diag_read_id_assert_var(file_ncdr_id, var_name) var_type = ncdr_files(file_ncdr_id)%vars(var_index)%var_type call nc_diag_read_assert_var_type(var_type, NF90_DOUBLE) call nc_diag_read_assert_var_ndims(size( & ncdr_files(file_ncdr_id)%vars(var_index)%var_dim_sizes), 1) call nc_diag_read_assert_dims(var_stor, & ncdr_files(file_ncdr_id)%vars(var_index)%var_dim_sizes) call ncdr_nc_check(nf90_get_var(file_ncid, var_index, & var_stor, & start = (/ 1 /), & count = (/ ncdr_files(file_ncdr_id)%vars(var_index)%var_dim_sizes(1) /) )) end subroutine nc_diag_read_id_get_var_1d_double subroutine nc_diag_read_noid_get_var_1d_double(var_name, var_stor) character(len=*), intent(in) :: var_name real(r_double), dimension(:), allocatable, intent(inout) :: var_stor call ncdr_check_current_ncdr_id call nc_diag_read_id_get_var_1d_double(current_ncdr_id, var_name, var_stor) end subroutine nc_diag_read_noid_get_var_1d_double subroutine nc_diag_read_id_get_var_1d_string(file_ncdr_id, var_name, var_stor) integer(i_long), intent(in) :: file_ncdr_id character(len=*), intent(in) :: var_name character(len=:), dimension(:), allocatable, intent(inout) :: var_stor integer(i_long) :: var_index, var_type, file_ncid call ncdr_check_ncdr_id(file_ncdr_id) file_ncid = ncdr_files(file_ncdr_id)%ncid call ncdr_check_ncid(file_ncid) var_index = nc_diag_read_id_assert_var(file_ncdr_id, var_name) var_type = ncdr_files(file_ncdr_id)%vars(var_index)%var_type call nc_diag_read_assert_var_type(var_type, NF90_CHAR) call nc_diag_read_assert_var_ndims(size( & ncdr_files(file_ncdr_id)%vars(var_index)%var_dim_sizes), 2) call nc_diag_read_assert_dims(var_stor, & ncdr_files(file_ncdr_id)%vars(var_index)%var_dim_sizes) call ncdr_nc_check(nf90_get_var(file_ncid, var_index, & var_stor, & start = (/ 1, 1 /), & count = (/ ncdr_files(file_ncdr_id)%vars(var_index)%var_dim_sizes(1), & ncdr_files(file_ncdr_id)%vars(var_index)%var_dim_sizes(2) /) )) end subroutine nc_diag_read_id_get_var_1d_string subroutine nc_diag_read_noid_get_var_1d_string(var_name, var_stor) character(len=*), intent(in) :: var_name character(len=:), dimension(:), allocatable, intent(inout) :: var_stor call ncdr_check_current_ncdr_id call nc_diag_read_id_get_var_1d_string(current_ncdr_id, var_name, var_stor) end subroutine nc_diag_read_noid_get_var_1d_string subroutine nc_diag_read_id_get_var_2d_byte(file_ncdr_id, var_name, var_stor) integer(i_long), intent(in) :: file_ncdr_id character(len=*), intent(in) :: var_name integer(i_byte), dimension(:,:),allocatable,intent(inout) :: var_stor integer(i_long) :: var_index, var_type, file_ncid call ncdr_check_ncdr_id(file_ncdr_id) file_ncid = ncdr_files(file_ncdr_id)%ncid call ncdr_check_ncid(file_ncid) var_index = nc_diag_read_id_assert_var(file_ncdr_id, var_name) var_type = ncdr_files(file_ncdr_id)%vars(var_index)%var_type call nc_diag_read_assert_var_type(var_type, NF90_BYTE) call nc_diag_read_assert_var_ndims(size( & ncdr_files(file_ncdr_id)%vars(var_index)%var_dim_sizes), 2) call nc_diag_read_assert_dims(var_stor, & ncdr_files(file_ncdr_id)%vars(var_index)%var_dim_sizes) call ncdr_nc_check(nf90_get_var(file_ncid, var_index, & var_stor, & start = (/ 1 /), & count = (/ ncdr_files(file_ncdr_id)%vars(var_index)%var_dim_sizes(1), & ncdr_files(file_ncdr_id)%vars(var_index)%var_dim_sizes(2) /) )) end subroutine nc_diag_read_id_get_var_2d_byte subroutine nc_diag_read_noid_get_var_2d_byte(var_name, var_stor) character(len=*), intent(in) :: var_name integer(i_byte), dimension(:,:),allocatable,intent(inout) :: var_stor call ncdr_check_current_ncdr_id call nc_diag_read_id_get_var_2d_byte(current_ncdr_id, var_name, var_stor) end subroutine nc_diag_read_noid_get_var_2d_byte subroutine nc_diag_read_id_get_var_2d_short(file_ncdr_id, var_name, var_stor) integer(i_long), intent(in) :: file_ncdr_id character(len=*), intent(in) :: var_name integer(i_short), dimension(:,:),allocatable,intent(inout) :: var_stor integer(i_long) :: var_index, var_type, file_ncid call ncdr_check_ncdr_id(file_ncdr_id) file_ncid = ncdr_files(file_ncdr_id)%ncid call ncdr_check_ncid(file_ncid) var_index = nc_diag_read_id_assert_var(file_ncdr_id, var_name) var_type = ncdr_files(file_ncdr_id)%vars(var_index)%var_type call nc_diag_read_assert_var_type(var_type, NF90_SHORT) call nc_diag_read_assert_var_ndims(size( & ncdr_files(file_ncdr_id)%vars(var_index)%var_dim_sizes), 2) call nc_diag_read_assert_dims(var_stor, & ncdr_files(file_ncdr_id)%vars(var_index)%var_dim_sizes) call ncdr_nc_check(nf90_get_var(file_ncid, var_index, & var_stor, & start = (/ 1 /), & count = (/ ncdr_files(file_ncdr_id)%vars(var_index)%var_dim_sizes(1), & ncdr_files(file_ncdr_id)%vars(var_index)%var_dim_sizes(2) /) )) end subroutine nc_diag_read_id_get_var_2d_short subroutine nc_diag_read_noid_get_var_2d_short(var_name, var_stor) character(len=*), intent(in) :: var_name integer(i_short), dimension(:,:),allocatable,intent(inout) :: var_stor call ncdr_check_current_ncdr_id call nc_diag_read_id_get_var_2d_short(current_ncdr_id, var_name, var_stor) end subroutine nc_diag_read_noid_get_var_2d_short subroutine nc_diag_read_id_get_var_2d_long(file_ncdr_id, var_name, var_stor) integer(i_long), intent(in) :: file_ncdr_id character(len=*), intent(in) :: var_name integer(i_long), dimension(:,:),allocatable,intent(inout) :: var_stor integer(i_long) :: var_index, var_type, file_ncid call ncdr_check_ncdr_id(file_ncdr_id) file_ncid = ncdr_files(file_ncdr_id)%ncid call ncdr_check_ncid(file_ncid) var_index = nc_diag_read_id_assert_var(file_ncdr_id, var_name) var_type = ncdr_files(file_ncdr_id)%vars(var_index)%var_type call nc_diag_read_assert_var_type(var_type, NF90_INT) call nc_diag_read_assert_var_ndims(size( & ncdr_files(file_ncdr_id)%vars(var_index)%var_dim_sizes), 2) call nc_diag_read_assert_dims(var_stor, & ncdr_files(file_ncdr_id)%vars(var_index)%var_dim_sizes) call ncdr_nc_check(nf90_get_var(file_ncid, var_index, & var_stor, & start = (/ 1 /), & count = (/ ncdr_files(file_ncdr_id)%vars(var_index)%var_dim_sizes(1), & ncdr_files(file_ncdr_id)%vars(var_index)%var_dim_sizes(2) /) )) end subroutine nc_diag_read_id_get_var_2d_long subroutine nc_diag_read_noid_get_var_2d_long(var_name, var_stor) character(len=*), intent(in) :: var_name integer(i_long), dimension(:,:),allocatable,intent(inout) :: var_stor call ncdr_check_current_ncdr_id call nc_diag_read_id_get_var_2d_long(current_ncdr_id, var_name, var_stor) end subroutine nc_diag_read_noid_get_var_2d_long subroutine nc_diag_read_id_get_var_2d_float(file_ncdr_id, var_name, var_stor) integer(i_long), intent(in) :: file_ncdr_id character(len=*), intent(in) :: var_name real(r_single), dimension(:,:),allocatable,intent(inout) :: var_stor integer(i_long) :: var_index, var_type, file_ncid call ncdr_check_ncdr_id(file_ncdr_id) file_ncid = ncdr_files(file_ncdr_id)%ncid call ncdr_check_ncid(file_ncid) var_index = nc_diag_read_id_assert_var(file_ncdr_id, var_name) var_type = ncdr_files(file_ncdr_id)%vars(var_index)%var_type call nc_diag_read_assert_var_type(var_type, NF90_FLOAT) call nc_diag_read_assert_var_ndims(size( & ncdr_files(file_ncdr_id)%vars(var_index)%var_dim_sizes), 2) call nc_diag_read_assert_dims(var_stor, & ncdr_files(file_ncdr_id)%vars(var_index)%var_dim_sizes) call ncdr_nc_check(nf90_get_var(file_ncid, var_index, & var_stor, & start = (/ 1 /), & count = (/ ncdr_files(file_ncdr_id)%vars(var_index)%var_dim_sizes(1), & ncdr_files(file_ncdr_id)%vars(var_index)%var_dim_sizes(2) /) )) end subroutine nc_diag_read_id_get_var_2d_float subroutine nc_diag_read_noid_get_var_2d_float(var_name, var_stor) character(len=*), intent(in) :: var_name real(r_single), dimension(:,:),allocatable,intent(inout) :: var_stor call ncdr_check_current_ncdr_id call nc_diag_read_id_get_var_2d_float(current_ncdr_id, var_name, var_stor) end subroutine nc_diag_read_noid_get_var_2d_float subroutine nc_diag_read_id_get_var_2d_double(file_ncdr_id, var_name, var_stor) integer(i_long), intent(in) :: file_ncdr_id character(len=*), intent(in) :: var_name real(r_double), dimension(:,:),allocatable,intent(inout) :: var_stor integer(i_long) :: var_index, var_type, file_ncid call ncdr_check_ncdr_id(file_ncdr_id) file_ncid = ncdr_files(file_ncdr_id)%ncid call ncdr_check_ncid(file_ncid) var_index = nc_diag_read_id_assert_var(file_ncdr_id, var_name) var_type = ncdr_files(file_ncdr_id)%vars(var_index)%var_type call nc_diag_read_assert_var_type(var_type, NF90_DOUBLE) call nc_diag_read_assert_var_ndims(size( & ncdr_files(file_ncdr_id)%vars(var_index)%var_dim_sizes), 2) call nc_diag_read_assert_dims(var_stor, & ncdr_files(file_ncdr_id)%vars(var_index)%var_dim_sizes) call ncdr_nc_check(nf90_get_var(file_ncid, var_index, & var_stor, & start = (/ 1 /), & count = (/ ncdr_files(file_ncdr_id)%vars(var_index)%var_dim_sizes(1), & ncdr_files(file_ncdr_id)%vars(var_index)%var_dim_sizes(2) /) )) end subroutine nc_diag_read_id_get_var_2d_double subroutine nc_diag_read_noid_get_var_2d_double(var_name, var_stor) character(len=*), intent(in) :: var_name real(r_double), dimension(:,:),allocatable,intent(inout) :: var_stor call ncdr_check_current_ncdr_id call nc_diag_read_id_get_var_2d_double(current_ncdr_id, var_name, var_stor) end subroutine nc_diag_read_noid_get_var_2d_double subroutine nc_diag_read_id_get_var_2d_string(file_ncdr_id, var_name, var_stor) integer(i_long), intent(in) :: file_ncdr_id character(len=*), intent(in) :: var_name character(len=:), dimension(:,:),allocatable,intent(inout) :: var_stor integer(i_long) :: var_index, var_type, file_ncid call ncdr_check_ncdr_id(file_ncdr_id) file_ncid = ncdr_files(file_ncdr_id)%ncid call ncdr_check_ncid(file_ncid) var_index = nc_diag_read_id_assert_var(file_ncdr_id, var_name) var_type = ncdr_files(file_ncdr_id)%vars(var_index)%var_type call nc_diag_read_assert_var_type(var_type, NF90_CHAR) call nc_diag_read_assert_var_ndims(size( & ncdr_files(file_ncdr_id)%vars(var_index)%var_dim_sizes), 3) call nc_diag_read_assert_dims(var_stor, & ncdr_files(file_ncdr_id)%vars(var_index)%var_dim_sizes) call ncdr_nc_check(nf90_get_var(file_ncid, var_index, & var_stor, & start = (/ 1, 1, 1 /), & count = (/ ncdr_files(file_ncdr_id)%vars(var_index)%var_dim_sizes(1), & ncdr_files(file_ncdr_id)%vars(var_index)%var_dim_sizes(2), & ncdr_files(file_ncdr_id)%vars(var_index)%var_dim_sizes(3) /) )) end subroutine nc_diag_read_id_get_var_2d_string subroutine nc_diag_read_noid_get_var_2d_string(var_name, var_stor) character(len=*), intent(in) :: var_name character(len=:), dimension(:,:),allocatable,intent(inout) :: var_stor call ncdr_check_current_ncdr_id call nc_diag_read_id_get_var_2d_string(current_ncdr_id, var_name, var_stor) end subroutine nc_diag_read_noid_get_var_2d_string end module ncdr_vars_fetch