MODULE module_wps_io_arw 1
USE module_optional_input
IMPLICIT NONE
!! FROM MODULE_KINDS
! The numerical data types defined in this module are:
! i_byte - specification kind for byte (1-byte) integer variable
! i_short - specification kind for short (2-byte) integer variable
! i_long - specification kind for long (4-byte) integer variable
! i_llong - specification kind for double long (8-byte) integer variable
! r_single - specification kind for single precision (4-byte) real variable
! r_double - specification kind for double precision (8-byte) real variable
! r_quad - specification kind for quad precision (16-byte) real variable
!
! i_kind - generic specification kind for default integer
! r_kind - generic specification kind for default floating point
!
!
! Integer type definitions below
! Integer types
integer, parameter, public :: i_byte = selected_int_kind(1) ! byte integer
integer, parameter, public :: i_short = selected_int_kind(4) ! short integer
! integer, parameter, public :: i_long = selected_int_kind(8) ! long integer
integer, parameter, public :: i_long = kind(1) ! long integer
integer, parameter, private :: llong_t = selected_int_kind(16) ! llong integer
integer, parameter, public :: i_llong = max( llong_t, i_long )
! Expected 8-bit byte sizes of the integer kinds
integer, parameter, public :: num_bytes_for_i_byte = 1
integer, parameter, public :: num_bytes_for_i_short = 2
integer, parameter, public :: num_bytes_for_i_long = 4
integer, parameter, public :: num_bytes_for_i_llong = 8
! Define arrays for default definition
integer, parameter, private :: num_i_kinds = 4
integer, parameter, dimension( num_i_kinds ), private :: integer_types = (/ &
i_byte, i_short, i_long, i_llong /)
integer, parameter, dimension( num_i_kinds ), private :: integer_byte_sizes = (/ &
num_bytes_for_i_byte, num_bytes_for_i_short, &
num_bytes_for_i_long, num_bytes_for_i_llong /)
! Default values
! **** CHANGE THE FOLLOWING TO CHANGE THE DEFAULT INTEGER TYPE KIND ***
integer, parameter, private :: default_integer = 2 ! 1=byte,
! 2=short,
! 3=long,
! 4=llong
integer, parameter, public :: i_kind = integer_types( default_integer )
integer, parameter, public :: num_bytes_for_i_kind = &
integer_byte_sizes( default_integer )
! Real definitions below
! Real types
integer, parameter, public :: r_single = selected_real_kind(6) ! single precision
integer, parameter, public :: r_double = selected_real_kind(15) ! double precision
integer, parameter, private :: quad_t = selected_real_kind(20) ! quad precision
integer, parameter, public :: r_quad = max( quad_t, r_double )
! Expected 8-bit byte sizes of the real kinds
integer, parameter, public :: num_bytes_for_r_single = 4
integer, parameter, public :: num_bytes_for_r_double = 8
integer, parameter, public :: num_bytes_for_r_quad = 16
! Define arrays for default definition
integer, parameter, private :: num_r_kinds = 3
integer, parameter, dimension( num_r_kinds ), private :: real_kinds = (/ &
r_single, r_double, r_quad /)
integer, parameter, dimension( num_r_kinds ), private :: real_byte_sizes = (/ &
num_bytes_for_r_single, num_bytes_for_r_double, &
num_bytes_for_r_quad /)
! Default values
! **** CHANGE THE FOLLOWING TO CHANGE THE DEFAULT REAL TYPE KIND ***
integer, parameter, private :: default_real = 2 ! 1=single,
! 2=double,
!! END FROM MODULE_KINDS
! Input 3D meteorological fields.
REAL , DIMENSION(:,:,:) , ALLOCATABLE :: landuse_frac_input , &
soil_top_cat_input , &
soil_bot_cat_input
! Input 2D surface fields.
REAL , DIMENSION(:,:) , ALLOCATABLE :: soilt010_input , soilt040_input , &
soilt100_input , soilt200_input , &
soilm010_input , soilm040_input , &
soilm100_input , soilm200_input , &
psfc_in,pmsl
REAL , DIMENSION(:,:) , ALLOCATABLE :: lat_wind, lon_wind
! Local input arrays
REAL,DIMENSION(:,:),ALLOCATABLE :: dum2d
INTEGER,DIMENSION(:,:),ALLOCATABLE :: idum2d
REAL,DIMENSION(:,:,:),ALLOCATABLE :: dum3d
LOGICAL , SAVE :: first_time_in = .TRUE.
INTEGER :: flag_soilt010 , flag_soilt100 , flag_soilt200 , &
flag_soilm010 , flag_soilm100 , flag_soilm200
! Some constants to allow simple dimensions in the defined types
! given below.
CONTAINS
SUBROUTINE read_wps ( grid, filename, file_date_string, num_metgrid_levels ) 3,101
USE module_soil_pre
USE module_domain
IMPLICIT NONE
TYPE(domain) , INTENT(INOUT) :: grid
CHARACTER (LEN=19) , INTENT(IN) :: file_date_string
CHARACTER (LEN=4) :: dummychar
CHARACTER (LEN=132) :: VarName
CHARACTER (LEN=150) :: chartemp
CHARACTER (*) , INTENT(IN) :: filename
INTEGER :: ids,ide,jds,jde,kds,kde &
,ims,ime,jms,jme,kms,kme &
,its,ite,jts,jte,kts,kte
INTEGER :: i , j , k , loop, IMAX, JMAX
INTEGER :: DATAHANDLE, num_metgrid_levels
INTEGER :: Sysdepinfo, Status
INTEGER :: istatus,ioutcount,iret,index,ierr
integer :: nrecs,iunit, L,hor_size,hor_size_u,hor_size_v
!!
character*132, allocatable :: datestr_all(:)
character*132, allocatable :: varname_all(:)
integer, allocatable :: domainend_all(:,:)
integer, allocatable :: start_block(:)
integer, allocatable :: end_block(:)
integer, allocatable :: start_byte(:)
integer, allocatable :: end_byte(:)
integer(kind=i_llong), allocatable :: file_offset(:)
!!
REAL :: dummy,tmp,garb
REAL, ALLOCATABLE:: dumdata(:,:,:)
REAL, ALLOCATABLE:: dumdata_u(:,:,:)
REAL, ALLOCATABLE:: dumdata_v(:,:,:)
REAL :: lats16(16),lons16(16)
CHARACTER (LEN= 8) :: dummy_char
INTEGER :: ok , map_proj , ok_open, igarb,igarb2, N
REAL :: pt
INTEGER :: num_veg_cat , num_soil_top_cat , num_soil_bot_cat
#if defined(DM_PARALLEL) && !defined(STUBMPI)
INCLUDE "mpif.h"
SELECT CASE ( model_data_order )
CASE ( DATA_ORDER_ZXY )
kds = grid%sd31 ; kde = grid%ed31 ;
ids = grid%sd32 ; ide = grid%ed32 ;
jds = grid%sd33 ; jde = grid%ed33 ;
kms = grid%sm31 ; kme = grid%em31 ;
ims = grid%sm32 ; ime = grid%em32 ;
jms = grid%sm33 ; jme = grid%em33 ;
kts = grid%sp31 ; kte = grid%ep31 ; ! tile is entire patch
its = grid%sp32 ; ite = grid%ep32 ; ! tile is entire patch
jts = grid%sp33 ; jte = grid%ep33 ; ! tile is entire patch
CASE ( DATA_ORDER_XYZ )
ids = grid%sd31 ; ide = grid%ed31 ;
jds = grid%sd32 ; jde = grid%ed32 ;
kds = grid%sd33 ; kde = grid%ed33 ;
ims = grid%sm31 ; ime = grid%em31 ;
jms = grid%sm32 ; jme = grid%em32 ;
kms = grid%sm33 ; kme = grid%em33 ;
its = grid%sp31 ; ite = grid%ep31 ; ! tile is entire patch
jts = grid%sp32 ; jte = grid%ep32 ; ! tile is entire patch
kts = grid%sp33 ; kte = grid%ep33 ; ! tile is entire patch
CASE ( DATA_ORDER_XZY )
ids = grid%sd31 ; ide = grid%ed31 ;
kds = grid%sd32 ; kde = grid%ed32 ;
jds = grid%sd33 ; jde = grid%ed33 ;
ims = grid%sm31 ; ime = grid%em31 ;
kms = grid%sm32 ; kme = grid%em32 ;
jms = grid%sm33 ; jme = grid%em33 ;
its = grid%sp31 ; ite = grid%ep31 ; ! tile is entire patch
kts = grid%sp32 ; kte = grid%ep32 ; ! tile is entire patch
jts = grid%sp33 ; jte = grid%ep33 ; ! tile is entire patch
END SELECT
! Initialize what soil temperature and moisture is available.
flag_st000010 = 0
flag_st010040 = 0
flag_st040100 = 0
flag_st100200 = 0
flag_sm000010 = 0
flag_sm010040 = 0
flag_sm040100 = 0
flag_sm100200 = 0
flag_st010200 = 0
flag_sm010200 = 0
flag_soilt010 = 0
flag_soilt040 = 0
flag_soilt100 = 0
flag_soilt200 = 0
flag_soilm010 = 0
flag_soilm040 = 0
flag_soilm100 = 0
flag_soilm200 = 0
flag_sst = 0
flag_toposoil = 0
! How many soil levels have we found? Well, right now, none.
num_st_levels_input = 0
num_sm_levels_input = 0
st_levels_input = -1
sm_levels_input = -1
! Get the space for the data if this is the first time here.
IF (.NOT. ALLOCATED (pmsl) ) ALLOCATE ( pmsl(its:ite,jts:jte) )
IF (.NOT. ALLOCATED (psfc_in) ) ALLOCATE ( psfc_in(its:ite,jts:jte) )
!!! MPI IO
iunit=33
call count_recs_wrf_binary_file
(iunit, trim(fileName), nrecs)
allocate (datestr_all(nrecs))
allocate (varname_all(nrecs))
allocate (domainend_all(3,nrecs))
allocate (start_block(nrecs))
allocate (end_block(nrecs))
allocate (start_byte(nrecs))
allocate (end_byte(nrecs))
allocate (file_offset(nrecs))
call inventory_wrf_binary_file
(iunit, trim(filename), nrecs, &
datestr_all,varname_all,domainend_all, &
start_block,end_block,start_byte,end_byte,file_offset)
call mpi_file_open(mpi_comm_world, trim(filename), &
mpi_mode_rdonly,mpi_info_null, iunit, ierr)
if (ierr /= 0) then
call wrf_error_fatal
("Error opening file with mpi io")
end if
VarName='CEN_LAT'
call retrieve_index
(index,VarName,varname_all,nrecs,iret)
if (iret /= 0) then
print*,VarName," not found in file"
else
call mpi_file_read_at(iunit,file_offset(index)+5*4, &
garb,1,mpi_real4, &
mpi_status_ignore, ierr)
if (ierr /= 0) then
print*,"Error reading ", VarName," using MPIIO"
else
print*,VarName, ' from MPIIO READ= ',garb
CALL nl_set_cen_lat ( grid%id , garb )
end if
end if
VarName='CEN_LON'
call retrieve_index
(index,VarName,varname_all,nrecs,iret)
call mpi_file_read_at(iunit,file_offset(index)+5*4, &
garb,1,mpi_real4, &
mpi_status_ignore, ierr)
CALL nl_set_cen_lon ( grid%id , garb )
CALL nl_set_stand_lon ( grid%id , garb )
VarName='POLE_LAT'
call retrieve_index
(index,VarName,varname_all,nrecs,iret)
call mpi_file_read_at(iunit,file_offset(index)+5*4, &
garb,1,mpi_real4, &
mpi_status_ignore, ierr)
CALL nl_set_pole_lat ( grid%id , garb )
VarName='TRUELAT1'
call retrieve_index
(index,VarName,varname_all,nrecs,iret)
call mpi_file_read_at(iunit,file_offset(index)+5*4, &
garb,1,mpi_real4, &
mpi_status_ignore, ierr)
CALL nl_set_truelat1 ( grid%id , garb )
VarName='TRUELAT2'
call retrieve_index
(index,VarName,varname_all,nrecs,iret)
call mpi_file_read_at(iunit,file_offset(index)+5*4, &
garb,1,mpi_real4, &
mpi_status_ignore, ierr)
CALL nl_set_truelat2 ( grid%id , garb )
VarName='MAP_PROJ'
call retrieve_index
(index,VarName,varname_all,nrecs,iret)
call mpi_file_read_at(iunit,file_offset(index)+5*4, &
igarb,1,mpi_integer4, &
mpi_status_ignore, ierr)
CALL nl_set_map_proj( grid%id, igarb)
VarName='ISURBAN'
call retrieve_index
(index,VarName,varname_all,nrecs,iret)
call mpi_file_read_at(iunit,file_offset(index)+5*4, &
igarb,1,mpi_integer4, &
mpi_status_ignore, ierr)
CALL nl_set_isurban ( grid%id, igarb)
VarName='ISWATER'
call retrieve_index
(index,VarName,varname_all,nrecs,iret)
call mpi_file_read_at(iunit,file_offset(index)+5*4, &
igarb,1,mpi_integer4, &
mpi_status_ignore, ierr)
write(0,*) 'setting iswater to be: ', igarb
CALL nl_set_iswater (grid%id, igarb )
VarName='ISICE'
call retrieve_index
(index,VarName,varname_all,nrecs,iret)
call mpi_file_read_at(iunit,file_offset(index)+5*4, &
igarb2,1,mpi_integer4, &
mpi_status_ignore, ierr)
write(0,*) 'setting isice to be: ', igarb2
CALL nl_set_isice (grid%id, igarb2 )
IF ( igarb .eq. 16 .and. igarb2 .eq. 24 ) THEN
CALL nl_set_mminlu ( grid%id, 'USGS')
ENDIF
IF ( igarb .eq. 17 .and. igarb2 .eq. 15 ) THEN
! ambiguous
CALL nl_set_mminlu ( grid%id, 'MODIFIED_IGBP_MODIS_NOAH')
! CALL nl_set_mminlu ( grid%id, 'MODIS')
ENDIF
IF ( igarb .eq. 15 .and. igarb2 .eq. 16 ) THEN
CALL nl_set_mminlu ( grid%id, 'SiB')
ENDIF
VarName='FLAG_SNOWH'
call retrieve_index
(index,VarName,varname_all,nrecs,iret)
call mpi_file_read_at(iunit,file_offset(index)+5*4, &
igarb,1,mpi_integer4, &
mpi_status_ignore, ierr)
flag_snowh=igarb
VarName='FLAG_SNOW'
call retrieve_index
(index,VarName,varname_all,nrecs,iret)
call mpi_file_read_at(iunit,file_offset(index)+5*4, &
igarb,1,mpi_integer4, &
mpi_status_ignore, ierr)
flag_snow=igarb
VarName='FLAG_METGRID'
call retrieve_index
(index,VarName,varname_all,nrecs,iret)
if (iret .eq. 0) then
call mpi_file_read_at(iunit,file_offset(index)+5*4, &
igarb,1,mpi_integer4, &
mpi_status_ignore, ierr)
flag_metgrid=igarb
endif
VarName='FLAG_SOILHGT'
call retrieve_index
(index,VarName,varname_all,nrecs,iret)
if (iret .eq. 0) then
call mpi_file_read_at(iunit,file_offset(index)+5*4, &
igarb,1,mpi_integer4, &
mpi_status_ignore, ierr)
flag_soilhgt=igarb
endif
VarName='FLAG_PSFC'
call retrieve_index
(index,VarName,varname_all,nrecs,iret)
if (iret .eq. 0) then
call mpi_file_read_at(iunit,file_offset(index)+5*4, &
igarb,1,mpi_integer4, &
mpi_status_ignore, ierr)
flag_psfc=igarb
endif
VarName='FLAG_SLP'
call retrieve_index
(index,VarName,varname_all,nrecs,iret)
if (iret .eq. 0) then
call mpi_file_read_at(iunit,file_offset(index)+5*4, &
igarb,1,mpi_integer4, &
mpi_status_ignore, ierr)
flag_slp=igarb
endif
VarName='NUM_METGRID_SOIL_LEVELS'
call retrieve_index
(index,VarName,varname_all,nrecs,iret)
call mpi_file_read_at(iunit,file_offset(index)+5*4, &
igarb,1,mpi_integer4, &
mpi_status_ignore, ierr)
CALL nl_set_num_metgrid_soil_levels(grid%id, igarb)
num_sw_levels_input=igarb
VarName='FLAG_SOIL_LEVELS'
call retrieve_index
(index,VarName,varname_all,nrecs,iret)
if (iret .eq. 0) then
call mpi_file_read_at(iunit,file_offset(index)+5*4, &
igarb,1,mpi_integer4, &
mpi_status_ignore, ierr)
flag_soil_levels=igarb
endif
VarName='FLAG_SOIL_LAYERS'
call retrieve_index
(index,VarName,varname_all,nrecs,iret)
call mpi_file_read_at(iunit,file_offset(index)+5*4, &
igarb,1,mpi_integer4, &
mpi_status_ignore, ierr)
flag_soil_layers=igarb
VarName='ISLAKE'
call retrieve_index
(index,VarName,varname_all,nrecs,iret)
call mpi_file_read_at(iunit,file_offset(index)+5*4, &
igarb,1,mpi_integer4, &
mpi_status_ignore, ierr)
CALL nl_set_islake ( grid%id, igarb)
VarName='ISOILWATER'
call retrieve_index
(index,VarName,varname_all,nrecs,iret)
call mpi_file_read_at(iunit,file_offset(index)+5*4, &
igarb,1,mpi_integer4, &
mpi_status_ignore, ierr)
CALL nl_set_isoilwater ( grid%id, igarb)
VarName='MOAD_CEN_LAT'
call retrieve_index
(index,VarName,varname_all,nrecs,iret)
call mpi_file_read_at(iunit,file_offset(index)+5*4, &
garb,1,mpi_real4, &
mpi_status_ignore, ierr)
CALL nl_set_moad_cen_lat ( grid%id,garb)
VarName='corner_lats'
call retrieve_index
(index,VarName,varname_all,nrecs,iret)
call mpi_file_read_at(iunit,file_offset(index)+5*4, &
lats16,16,mpi_real4, &
mpi_status_ignore, ierr)
VarName='corner_lons'
call retrieve_index
(index,VarName,varname_all,nrecs,iret)
call mpi_file_read_at(iunit,file_offset(index)+5*4, &
lons16,16,mpi_real4, &
mpi_status_ignore, ierr)
! VarName='MMINLU'
! call retrieve_index(index,VarName,varname_all,nrecs,iret)
! if (iret .eq. 0) then
! call mpi_file_read_at(iunit,file_offset(index)+5*4, &
! dummychar,1,mpi_char, &
! mpi_status_ignore, ierr)
! endif
hor_size=(IDE-IDS)*(JDE-JDS)
hor_size_u=(IDE+1-IDS)*(JDE-JDS)
hor_size_v=(IDE-IDS)*(JDE+1-JDS)
varName='PRES'
allocate(dumdata(IDS:IDE-1,JDS:JDE-1,num_metgrid_levels))
allocate(dumdata_u(IDS:IDE,JDS:JDE-1,num_metgrid_levels))
allocate(dumdata_v(IDS:IDE-1,JDS:JDE,num_metgrid_levels))
CALL retrieve_index
(index,VarName,varname_all,nrecs,iret)
CALL mpi_file_read_at(iunit,file_offset(index+1), &
dumdata,hor_size*num_metgrid_levels,mpi_real4, &
mpi_status_ignore, ierr)
DO K=1,num_metgrid_levels
DO J=JTS,min(JTE,JDE-1)
DO I=ITS,min(ITE,IDE-1)
grid%p_gc(I,K,J)=dumdata(I,J,K)
ENDDO
ENDDO
ENDDO
varName='GHT'
CALL retrieve_index
(index,VarName,varname_all,nrecs,iret)
CALL mpi_file_read_at(iunit,file_offset(index+1), &
dumdata,hor_size*num_metgrid_levels,mpi_real4, &
mpi_status_ignore, ierr)
DO K=1,num_metgrid_levels
DO J=JTS,min(JTE,JDE-1)
DO I=ITS,min(ITE,IDE-1)
grid%ght_gc(I,K,J)=dumdata(I,J,K)
ENDDO
ENDDO
ENDDO
varName='VEGCAT'
CALL retrieve_index
(index,VarName,varname_all,nrecs,iret)
CALL mpi_file_read_at(iunit,file_offset(index+1), &
dumdata,hor_size,mpi_real4, &
mpi_status_ignore, ierr)
DO J=JTS,min(JTE,JDE-1)
DO I=ITS,min(ITE,IDE-1)
grid%vegcat(I,J)=dumdata(I,J,1)
ENDDO
ENDDO
! varName='SOIL_CAT'
! CALL retrieve_index(index,VarName,varname_all,nrecs,iret)
! CALL mpi_file_read_at(iunit,file_offset(index+1), &
! dumdata,hor_size,mpi_real4, &
! mpi_status_ignore, ierr)
! DO J=JTS,min(JTE,JDE-1)
! DO I=ITS,min(ITE,IDE-1)
! grid%input_soil_cat(I,J)=dumdata(I,J,1)
! ENDDO
! ENDDO
varName='CANWAT'
CALL retrieve_index
(index,VarName,varname_all,nrecs,iret)
CALL mpi_file_read_at(iunit,file_offset(index+1), &
dumdata,hor_size,mpi_real4, &
mpi_status_ignore, ierr)
DO J=JTS,min(JTE,JDE-1)
DO I=ITS,min(ITE,IDE-1)
grid%canwat(I,J)=dumdata(I,J,1)
ENDDO
ENDDO
varName='SNOW'
CALL retrieve_index
(index,VarName,varname_all,nrecs,iret)
CALL mpi_file_read_at(iunit,file_offset(index+1), &
dumdata,hor_size,mpi_real4, &
mpi_status_ignore, ierr)
DO J=JTS,min(JTE,JDE-1)
DO I=ITS,min(ITE,IDE-1)
grid%snow(I,J)=dumdata(I,J,1)
ENDDO
ENDDO
varName='SNOWH'
CALL retrieve_index
(index,VarName,varname_all,nrecs,iret)
CALL mpi_file_read_at(iunit,file_offset(index+1), &
dumdata,hor_size,mpi_real4, &
mpi_status_ignore, ierr)
DO J=JTS,min(JTE,JDE-1)
DO I=ITS,min(ITE,IDE-1)
grid%snowh(I,J)=dumdata(I,J,1)
ENDDO
ENDDO
varName='SKINTEMP'
CALL retrieve_index
(index,VarName,varname_all,nrecs,iret)
CALL mpi_file_read_at(iunit,file_offset(index+1), &
dumdata,hor_size,mpi_real4, &
mpi_status_ignore, ierr)
DO J=JTS,min(JTE,JDE-1)
DO I=ITS,min(ITE,IDE-1)
grid%tsk_gc(I,J)=dumdata(I,J,1)
ENDDO
ENDDO
varName='SOILHGT'
CALL retrieve_index
(index,VarName,varname_all,nrecs,iret)
CALL mpi_file_read_at(iunit,file_offset(index+1), &
dumdata,hor_size,mpi_real4, &
mpi_status_ignore, ierr)
DO J=JTS,min(JTE,JDE-1)
DO I=ITS,min(ITE,IDE-1)
grid%toposoil(I,J)=dumdata(I,J,1)
ENDDO
ENDDO
! varName='SEAICE'
! CALL retrieve_index(index,VarName,varname_all,nrecs,iret)
! CALL mpi_file_read_at(iunit,file_offset(index+1), &
! dumdata,hor_size,mpi_real4, &
! mpi_status_ignore, ierr)
! DO J=JTS,min(JTE,JDE-1)
! DO I=ITS,min(ITE,IDE-1)
! grid%xice_gc(I,J)=dumdata(I,J,1)
! ENDDO
! ENDDO
varName='ST100200'
CALL retrieve_index
(index,VarName,varname_all,nrecs,iret)
CALL mpi_file_read_at(iunit,file_offset(index+1), &
dumdata,hor_size,mpi_real4, &
mpi_status_ignore, ierr)
DO J=JTS,min(JTE,JDE-1)
DO I=ITS,min(ITE,IDE-1)
grid%st100200(I,J)=dumdata(I,J,1)
ENDDO
ENDDO
varName='ST040100'
CALL retrieve_index
(index,VarName,varname_all,nrecs,iret)
CALL mpi_file_read_at(iunit,file_offset(index+1), &
dumdata,hor_size,mpi_real4, &
mpi_status_ignore, ierr)
DO J=JTS,min(JTE,JDE-1)
DO I=ITS,min(ITE,IDE-1)
grid%st040100(I,J)=dumdata(I,J,1)
ENDDO
ENDDO
varName='ST010040'
CALL retrieve_index
(index,VarName,varname_all,nrecs,iret)
CALL mpi_file_read_at(iunit,file_offset(index+1), &
dumdata,hor_size,mpi_real4, &
mpi_status_ignore, ierr)
DO J=JTS,min(JTE,JDE-1)
DO I=ITS,min(ITE,IDE-1)
grid%st010040(I,J)=dumdata(I,J,1)
ENDDO
ENDDO
varName='ST000010'
CALL retrieve_index
(index,VarName,varname_all,nrecs,iret)
CALL mpi_file_read_at(iunit,file_offset(index+1), &
dumdata,hor_size,mpi_real4, &
mpi_status_ignore, ierr)
DO J=JTS,min(JTE,JDE-1)
DO I=ITS,min(ITE,IDE-1)
grid%st000010(I,J)=dumdata(I,J,1)
ENDDO
ENDDO
varName='SM100200'
CALL retrieve_index
(index,VarName,varname_all,nrecs,iret)
CALL mpi_file_read_at(iunit,file_offset(index+1), &
dumdata,hor_size,mpi_real4, &
mpi_status_ignore, ierr)
DO J=JTS,min(JTE,JDE-1)
DO I=ITS,min(ITE,IDE-1)
grid%sm100200(I,J)=dumdata(I,J,1)
ENDDO
ENDDO
varName='SM040100'
CALL retrieve_index
(index,VarName,varname_all,nrecs,iret)
CALL mpi_file_read_at(iunit,file_offset(index+1), &
dumdata,hor_size,mpi_real4, &
mpi_status_ignore, ierr)
DO J=JTS,min(JTE,JDE-1)
DO I=ITS,min(ITE,IDE-1)
grid%sm040100(I,J)=dumdata(I,J,1)
ENDDO
ENDDO
varName='SM010040'
CALL retrieve_index
(index,VarName,varname_all,nrecs,iret)
CALL mpi_file_read_at(iunit,file_offset(index+1), &
dumdata,hor_size,mpi_real4, &
mpi_status_ignore, ierr)
DO J=JTS,min(JTE,JDE-1)
DO I=ITS,min(ITE,IDE-1)
grid%sm010040(I,J)=dumdata(I,J,1)
ENDDO
ENDDO
varName='SM000010'
CALL retrieve_index
(index,VarName,varname_all,nrecs,iret)
CALL mpi_file_read_at(iunit,file_offset(index+1), &
dumdata,hor_size,mpi_real4, &
mpi_status_ignore, ierr)
DO J=JTS,min(JTE,JDE-1)
DO I=ITS,min(ITE,IDE-1)
grid%sm000010(I,J)=dumdata(I,J,1)
ENDDO
ENDDO
varName='PSFC'
CALL retrieve_index
(index,VarName,varname_all,nrecs,iret)
CALL mpi_file_read_at(iunit,file_offset(index+1), &
dumdata,hor_size,mpi_real4, &
mpi_status_ignore, ierr)
if ( ierr .eq. 0 ) flag_psfc=1
DO J=JTS,min(JTE,JDE-1)
DO I=ITS,min(ITE,IDE-1)
grid%psfc(I,J)=dumdata(I,J,1)
ENDDO
ENDDO
varName='RH'
CALL retrieve_index
(index,VarName,varname_all,nrecs,iret)
CALL mpi_file_read_at(iunit,file_offset(index+1), &
dumdata,hor_size*num_metgrid_levels,mpi_real4, &
mpi_status_ignore, ierr)
DO K=1,num_metgrid_levels
DO J=JTS,min(JTE,JDE-1)
DO I=ITS,min(ITE,IDE-1)
grid%rh_gc(I,K,J)=dumdata(I,J,K)
ENDDO
ENDDO
ENDDO
varName='VV'
CALL retrieve_index
(index,VarName,varname_all,nrecs,iret)
CALL mpi_file_read_at(iunit,file_offset(index+1), &
dumdata_v,hor_size_v*num_metgrid_levels,mpi_real4, &
mpi_status_ignore, ierr)
DO K=1,num_metgrid_levels
DO J=JTS,min(JTE,JDE)
DO I=ITS,min(ITE,IDE-1)
grid%v_gc(I,K,J)=dumdata_v(I,J,K)
if (grid%v_gc(I,K,J) .ne. grid%v_gc(I,K,J) .or. abs(grid%v_gc(I,K,J)) .gt. 100.) then
write(0,*) 'bad v_gc defined: ', I,K,J,grid%v_gc(I,K,J)
call wrf_error_fatal
(" bad v_gc")
endif
ENDDO
ENDDO
ENDDO
varName='UU'
CALL retrieve_index
(index,VarName,varname_all,nrecs,iret)
CALL mpi_file_read_at(iunit,file_offset(index+1), &
dumdata_u,hor_size_u*num_metgrid_levels,mpi_real4, &
mpi_status_ignore, ierr)
DO K=1,num_metgrid_levels
DO J=JTS,min(JTE,JDE-1)
DO I=ITS,min(ITE,IDE)
grid%u_gc(I,K,J)=dumdata_u(I,J,K)
if (grid%u_gc(I,K,J) .ne. grid%u_gc(I,K,J) .or. abs(grid%u_gc(I,K,J)) .gt. 100.) then
write(0,*) 'bad u_gc defined: ', I,K,J,grid%u_gc(I,K,J)
call wrf_error_fatal
(" bad u_gc")
endif
ENDDO
ENDDO
ENDDO
varName='TT'
CALL retrieve_index
(index,VarName,varname_all,nrecs,iret)
CALL mpi_file_read_at(iunit,file_offset(index+1), &
dumdata,hor_size*num_metgrid_levels,mpi_real4, &
mpi_status_ignore, ierr)
DO K=1,num_metgrid_levels
DO J=JTS,min(JTE,JDE-1)
DO I=ITS,min(ITE,IDE-1)
grid%t_gc(I,K,J)=dumdata(I,J,K)
if (grid%t_gc(I,K,J) .ne. grid%t_gc(I,K,J) .or. abs(grid%t_gc(I,K,J)) .gt. 350.) then
write(0,*) 'bad t_gc defined: ', I,K,J,grid%t_gc(I,K,J)
call wrf_error_fatal
(" bad t_gc")
endif
ENDDO
ENDDO
ENDDO
! varName='RWMR'
! CALL retrieve_index(index,VarName,varname_all,nrecs,iret)
! CALL mpi_file_read_at(iunit,file_offset(index+1), &
! dumdata,hor_size*num_metgrid_levels,mpi_real4, &
! mpi_status_ignore, ierr)
! DO K=1,num_metgrid_levels
! DO J=JTS,min(JTE,JDE-1)
! DO I=ITS,min(ITE,IDE-1)
! grid%nmm_rwmr_gc(I,J,K)=dumdata(I,J,K)
! ENDDO
! ENDDO
! ENDDO
! varName='SNMR'
! CALL retrieve_index(index,VarName,varname_all,nrecs,iret)
! CALL mpi_file_read_at(iunit,file_offset(index+1), &
! dumdata,hor_size*num_metgrid_levels,mpi_real4, &
! mpi_status_ignore, ierr)
! DO K=1,num_metgrid_levels
! DO J=JTS,min(JTE,JDE-1)
! DO I=ITS,min(ITE,IDE-1)
! grid%nmm_snmr_gc(I,J,K)=dumdata(I,J,K)
! ENDDO
! ENDDO
! ENDDO
! varName='CLWMR'
! CALL retrieve_index(index,VarName,varname_all,nrecs,iret)
! CALL mpi_file_read_at(iunit,file_offset(index+1), &
! dumdata,hor_size*num_metgrid_levels,mpi_real4, &
! mpi_status_ignore, ierr)
! DO K=1,num_metgrid_levels
! DO J=JTS,min(JTE,JDE-1)
! DO I=ITS,min(ITE,IDE-1)
! grid%nmm_clwmr_gc(I,J,K)=dumdata(I,J,K)
! ENDDO
! ENDDO
! ENDDO
! varName='CICE'
! CALL retrieve_index(index,VarName,varname_all,nrecs,iret)
! CALL mpi_file_read_at(iunit,file_offset(index+1), &
! dumdata,hor_size*num_metgrid_levels,mpi_real4, &
! mpi_status_ignore, ierr)
! DO K=1,num_metgrid_levels
! DO J=JTS,min(JTE,JDE-1)
! DO I=ITS,min(ITE,IDE-1)
! grid%nmm_cice_gc(I,J,K)=dumdata(I,J,K)
! ENDDO
! ENDDO
! ENDDO
! varName='FRIMEF'
! CALL retrieve_index(index,VarName,varname_all,nrecs,iret)
! CALL mpi_file_read_at(iunit,file_offset(index+1), &
! dumdata,hor_size*num_metgrid_levels,mpi_real4, &
! mpi_status_ignore, ierr)
! DO K=1,num_metgrid_levels
! DO J=JTS,min(JTE,JDE-1)
! DO I=ITS,min(ITE,IDE-1)
! grid%nmm_rimef_gc(I,J,K)=dumdata(I,J,K)
! ENDDO
! ENDDO
! ENDDO
varName='PMSL'
CALL retrieve_index
(index,VarName,varname_all,nrecs,iret)
CALL mpi_file_read_at(iunit,file_offset(index+1), &
dumdata,hor_size,mpi_real4, &
mpi_status_ignore, ierr)
DO J=JTS,min(JTE,JDE-1)
DO I=ITS,min(ITE,IDE-1)
grid%pslv_gc(I,J)=dumdata(I,J,1)
ENDDO
ENDDO
varName='SLOPECAT'
CALL retrieve_index
(index,VarName,varname_all,nrecs,iret)
CALL mpi_file_read_at(iunit,file_offset(index+1), &
dumdata,hor_size,mpi_real4, &
mpi_status_ignore, ierr)
DO J=JTS,min(JTE,JDE-1)
DO I=ITS,min(ITE,IDE-1)
grid%slopecat(I,J)=dumdata(I,J,1)
ENDDO
ENDDO
varName='SNOALB'
CALL retrieve_index
(index,VarName,varname_all,nrecs,iret)
CALL mpi_file_read_at(iunit,file_offset(index+1), &
dumdata,hor_size,mpi_real4, &
mpi_status_ignore, ierr)
DO J=JTS,min(JTE,JDE-1)
DO I=ITS,min(ITE,IDE-1)
grid%snoalb(I,J)=dumdata(I,J,1)
ENDDO
ENDDO
num_veg_cat = SIZE ( grid%landusef , DIM=2 )
num_soil_top_cat = SIZE ( grid%soilctop , DIM=2 )
num_soil_bot_cat = SIZE ( grid%soilcbot , DIM=2 )
varName='GREENFRAC'
CALL retrieve_index
(index,VarName,varname_all,nrecs,iret)
CALL mpi_file_read_at(iunit,file_offset(index+1), &
dumdata,hor_size*12,mpi_real4, &
mpi_status_ignore, ierr)
DO K=1,12
DO J=JTS,min(JTE,JDE-1)
DO I=ITS,min(ITE,IDE-1)
grid%greenfrac(I,K,J)=dumdata(I,J,K)
ENDDO
ENDDO
ENDDO
varName='ALBEDO12M'
CALL retrieve_index
(index,VarName,varname_all,nrecs,iret)
CALL mpi_file_read_at(iunit,file_offset(index+1), &
dumdata,hor_size*12,mpi_real4, &
mpi_status_ignore, ierr)
DO K=1,12
DO J=JTS,min(JTE,JDE-1)
DO I=ITS,min(ITE,IDE-1)
grid%albedo12m(I,K,J)=dumdata(I,J,K)
ENDDO
ENDDO
ENDDO
varName='SOILCBOT'
CALL retrieve_index
(index,VarName,varname_all,nrecs,iret)
CALL mpi_file_read_at(iunit,file_offset(index+1), &
dumdata,hor_size*num_soil_bot_cat,mpi_real4, &
mpi_status_ignore, ierr)
DO K=1,num_soil_bot_cat
DO J=JTS,min(JTE,JDE-1)
DO I=ITS,min(ITE,IDE-1)
grid%soilcbot(I,K,J)=dumdata(I,J,K)
ENDDO
ENDDO
ENDDO
varName='SOILCAT'
CALL retrieve_index
(index,VarName,varname_all,nrecs,iret)
CALL mpi_file_read_at(iunit,file_offset(index+1), &
dumdata,hor_size,mpi_real4, &
mpi_status_ignore, ierr)
DO J=JTS,min(JTE,JDE-1)
DO I=ITS,min(ITE,IDE-1)
grid%soilcat(I,J)=dumdata(I,J,1)
ENDDO
ENDDO
write(0,*) 'veg_cat and soil_cat sizes:::: ', num_veg_cat , num_soil_top_cat
varName='SOILCTOP'
CALL retrieve_index
(index,VarName,varname_all,nrecs,iret)
CALL mpi_file_read_at(iunit,file_offset(index+1), &
dumdata,hor_size*num_soil_top_cat,mpi_real4, &
mpi_status_ignore, ierr)
DO K=1,num_soil_top_cat
DO J=JTS,min(JTE,JDE-1)
DO I=ITS,min(ITE,IDE-1)
grid%soilctop(I,K,J)=dumdata(I,J,K)
ENDDO
ENDDO
ENDDO
varName='SOILTEMP'
CALL retrieve_index
(index,VarName,varname_all,nrecs,iret)
CALL mpi_file_read_at(iunit,file_offset(index+1), &
dumdata,hor_size,mpi_real4, &
mpi_status_ignore, ierr)
DO J=JTS,min(JTE,JDE-1)
DO I=ITS,min(ITE,IDE-1)
grid%tmn_gc(I,J)=dumdata(I,J,1)
ENDDO
ENDDO
! varName='HGT_V'
! CALL retrieve_index(index,VarName,varname_all,nrecs,iret)
! CALL mpi_file_read_at(iunit,file_offset(index+1), &
! dumdata,hor_size,mpi_real4, &
! mpi_status_ignore, ierr)
!
! DO J=JTS,min(JTE,JDE-1)
! DO I=ITS,min(ITE,IDE-1)
! grid%nmm_htv_gc(I,J)=dumdata(I,J,1)
! ENDDO
! ENDDO
varName='HGT_M'
CALL retrieve_index
(index,VarName,varname_all,nrecs,iret)
CALL mpi_file_read_at(iunit,file_offset(index+1), &
dumdata,hor_size,mpi_real4, &
mpi_status_ignore, ierr)
DO J=JTS,min(JTE,JDE-1)
DO I=ITS,min(ITE,IDE-1)
grid%ht_gc(I,J)=dumdata(I,J,1)
ENDDO
ENDDO
varName='LU_INDEX'
CALL retrieve_index
(index,VarName,varname_all,nrecs,iret)
CALL mpi_file_read_at(iunit,file_offset(index+1), &
dumdata,hor_size,mpi_real4, &
mpi_status_ignore, ierr)
DO J=JTS,min(JTE,JDE-1)
DO I=ITS,min(ITE,IDE-1)
grid%lu_index(I,J)=dumdata(I,J,1)
ENDDO
ENDDO
varName='LANDUSEF'
CALL retrieve_index
(index,VarName,varname_all,nrecs,iret)
CALL mpi_file_read_at(iunit,file_offset(index+1), &
dumdata,hor_size*num_veg_cat,mpi_real4, &
mpi_status_ignore, ierr)
DO K=1,num_veg_cat
DO J=JTS,min(JTE,JDE-1)
DO I=ITS,min(ITE,IDE-1)
grid%landusef(I,K,J)=dumdata(I,J,K)
ENDDO
ENDDO
ENDDO
varName='LANDMASK'
CALL retrieve_index
(index,VarName,varname_all,nrecs,iret)
CALL mpi_file_read_at(iunit,file_offset(index+1), &
dumdata,hor_size,mpi_real4, &
mpi_status_ignore, ierr)
DO J=JTS,min(JTE,JDE-1)
DO I=ITS,min(ITE,IDE-1)
grid%landmask(I,J)=dumdata(I,J,1)
ENDDO
ENDDO
varName='F'
CALL retrieve_index
(index,VarName,varname_all,nrecs,iret)
CALL mpi_file_read_at(iunit,file_offset(index+1), &
dumdata,hor_size,mpi_real4, &
mpi_status_ignore, ierr)
DO J=JTS,min(JTE,JDE-1)
DO I=ITS,min(ITE,IDE-1)
grid%f(I,J)=dumdata(I,J,1)
ENDDO
ENDDO
varName='E'
CALL retrieve_index
(index,VarName,varname_all,nrecs,iret)
CALL mpi_file_read_at(iunit,file_offset(index+1), &
dumdata,hor_size,mpi_real4, &
mpi_status_ignore, ierr)
DO J=JTS,min(JTE,JDE-1)
DO I=ITS,min(ITE,IDE-1)
grid%e(I,J)=dumdata(I,J,1)
ENDDO
ENDDO
varName='COSALPHA'
CALL retrieve_index
(index,VarName,varname_all,nrecs,iret)
CALL mpi_file_read_at(iunit,file_offset(index+1), &
dumdata,hor_size,mpi_real4, &
mpi_status_ignore, ierr)
DO J=JTS,min(JTE,JDE-1)
DO I=ITS,min(ITE,IDE-1)
grid%cosa(I,J)=dumdata(I,J,1)
ENDDO
ENDDO
varName='SINALPHA'
CALL retrieve_index
(index,VarName,varname_all,nrecs,iret)
CALL mpi_file_read_at(iunit,file_offset(index+1), &
dumdata,hor_size,mpi_real4, &
mpi_status_ignore, ierr)
DO J=JTS,min(JTE,JDE-1)
DO I=ITS,min(ITE,IDE-1)
grid%sina(I,J)=dumdata(I,J,1)
ENDDO
ENDDO
varName='MAPFAC_U'
CALL retrieve_index
(index,VarName,varname_all,nrecs,iret)
CALL mpi_file_read_at(iunit,file_offset(index+1), &
dumdata_u,hor_size_u,mpi_real4, &
mpi_status_ignore, ierr)
DO J=JTS,min(JTE,JDE-1)
DO I=ITS,min(ITE,IDE)
grid%msfu(I,J)=dumdata_u(I,J,1)
!! bandaid for newly created WPS geogrid static files
if (grid%msfu(I,J) .lt. 0.7) then
write(0,*) 'weird msfu at I,J: ', I,J,grid%msfu(I,J)
if(J .eq. min(JTE,JDE-1)) then
grid%msfu(I,J)=dumdata_u(I,J-1,1)
write(0,*) 'changing msfu to: ',I,J, grid%msfu(I,J)
endif
endif
!! end bandaid
ENDDO
ENDDO
varName='MAPFAC_V'
CALL retrieve_index
(index,VarName,varname_all,nrecs,iret)
CALL mpi_file_read_at(iunit,file_offset(index+1), &
dumdata_v,hor_size_v,mpi_real4, &
mpi_status_ignore, ierr)
DO J=JTS,min(JTE,JDE)
DO I=ITS,min(ITE,IDE-1)
grid%msfv(I,J)=dumdata_v(I,J,1)
if (grid%msfv(I,J) .lt. 0.7 ) then
write(0,*) 'weird msfv at I,J: ', I,J,grid%msfv(I,J)
grid%msfv(I,J)=dumdata_v(I,J-1,1)
if( J .eq. min(JTE,JDE)) then
write(0,*) 'changing msfv to: ',I,J, grid%msfv(I,J)
endif
endif
ENDDO
ENDDO
varName='MAPFAC_M'
CALL retrieve_index
(index,VarName,varname_all,nrecs,iret)
CALL mpi_file_read_at(iunit,file_offset(index+1), &
dumdata,hor_size,mpi_real4, &
mpi_status_ignore, ierr)
DO J=JTS,min(JTE,JDE-1)
DO I=ITS,min(ITE,IDE-1)
grid%msft(I,J)=dumdata(I,J,1)
ENDDO
ENDDO
varName='CLAT'
CALL retrieve_index
(index,VarName,varname_all,nrecs,iret)
CALL mpi_file_read_at(iunit,file_offset(index+1), &
dumdata,hor_size,mpi_real4, &
mpi_status_ignore, ierr)
DO J=JTS,min(JTE,JDE-1)
DO I=ITS,min(ITE,IDE-1)
grid%clat(I,J)=dumdata(I,J,1)
ENDDO
ENDDO
varName='XLONG_U'
CALL retrieve_index
(index,VarName,varname_all,nrecs,iret)
CALL mpi_file_read_at(iunit,file_offset(index+1), &
dumdata_u,hor_size_u,mpi_real4, &
mpi_status_ignore, ierr)
DO J=JTS,min(JTE,JDE-1)
DO I=ITS,min(ITE,IDE)
grid%xlong_u(I,J)=dumdata_u(I,J,1)
ENDDO
ENDDO
varName='XLAT_U'
CALL retrieve_index
(index,VarName,varname_all,nrecs,iret)
CALL mpi_file_read_at(iunit,file_offset(index+1), &
dumdata_u,hor_size_u,mpi_real4, &
mpi_status_ignore, ierr)
DO J=JTS,min(JTE,JDE-1)
DO I=ITS,min(ITE,IDE)
grid%xlat_u(I,J)=dumdata_u(I,J,1)
ENDDO
ENDDO
varName='XLONG_V'
CALL retrieve_index
(index,VarName,varname_all,nrecs,iret)
CALL mpi_file_read_at(iunit,file_offset(index+1), &
dumdata_v,hor_size_v,mpi_real4, &
mpi_status_ignore, ierr)
DO J=JTS,min(JTE,JDE)
DO I=ITS,min(ITE,IDE-1)
grid%xlong_v(I,J)=dumdata_v(I,J,1)
ENDDO
ENDDO
varName='XLAT_V'
CALL retrieve_index
(index,VarName,varname_all,nrecs,iret)
CALL mpi_file_read_at(iunit,file_offset(index+1), &
dumdata_v,hor_size_v,mpi_real4, &
mpi_status_ignore, ierr)
DO J=JTS,min(JTE,JDE)
DO I=ITS,min(ITE,IDE-1)
grid%xlat_v(I,J)=dumdata_v(I,J,1)
ENDDO
ENDDO
varName='XLONG_M'
CALL retrieve_index
(index,VarName,varname_all,nrecs,iret)
CALL mpi_file_read_at(iunit,file_offset(index+1), &
dumdata,hor_size,mpi_real4, &
mpi_status_ignore, ierr)
DO J=JTS,min(JTE,JDE-1)
DO I=ITS,min(ITE,IDE-1)
grid%xlong_gc(I,J)=dumdata(I,J,1)
ENDDO
ENDDO
write(0,*) 'reading XLAT_M'
varName='XLAT_M'
CALL retrieve_index
(index,VarName,varname_all,nrecs,iret)
CALL mpi_file_read_at(iunit,file_offset(index+1), &
dumdata,hor_size,mpi_real4, &
mpi_status_ignore, ierr)
DO J=JTS,min(JTE,JDE-1)
DO I=ITS,min(ITE,IDE-1)
grid%xlat_gc(I,J)=dumdata(I,J,1)
ENDDO
ENDDO
write(0,*) 'xlat_gc defined'
call mpi_file_close(mpi_comm_world, ierr)
write(0,*) 'to ST000010 def'
varName='ST000010'
flag_st000010 = 1
num_st_levels_input = num_st_levels_input + 1
st_levels_input(num_st_levels_input) = char2int2
(varName(3:8))
DO J=JTS,min(JTE,JDE-1)
DO I=ITS,min(ITE,IDE-1)
st_input(I,num_st_levels_input + 1,J) = grid%st000010(i,j)
ENDDO
ENDDO
write(0,*) 'past ST000010 def'
varName='ST010040'
flag_st010040 = 1
num_st_levels_input = num_st_levels_input + 1
st_levels_input(num_st_levels_input) = char2int2
(varName(3:8))
DO J=JTS,min(JTE,JDE-1)
DO I=ITS,min(ITE,IDE-1)
st_input(I,num_st_levels_input + 1,J) = grid%st010040(i,j)
ENDDO
ENDDO
varName='ST040100'
flag_st040100 = 1
num_st_levels_input = num_st_levels_input + 1
st_levels_input(num_st_levels_input) = char2int2
(varName(3:8))
DO J=JTS,min(JTE,JDE-1)
DO I=ITS,min(ITE,IDE-1)
st_input(I,num_st_levels_input + 1,J) = grid%st040100(i,j)
ENDDO
ENDDO
varName='ST100200'
flag_st100200 = 1
num_st_levels_input = num_st_levels_input + 1
st_levels_input(num_st_levels_input) = char2int2
(varName(3:8))
DO J=JTS,min(JTE,JDE-1)
DO I=ITS,min(ITE,IDE-1)
st_input(I,num_st_levels_input + 1,J) = grid%st100200(i,j)
ENDDO
ENDDO
varName='SM000010'
flag_sm000010 = 1
num_sm_levels_input = num_sm_levels_input + 1
sm_levels_input(num_sm_levels_input) = char2int2
(varName(3:8))
DO J=JTS,min(JTE,JDE-1)
DO I=ITS,min(ITE,IDE-1)
sm_input(I,num_sm_levels_input + 1,J) = grid%sm000010(i,j)
ENDDO
ENDDO
varName='SM010040'
flag_sm010040 = 1
num_sm_levels_input = num_sm_levels_input + 1
sm_levels_input(num_sm_levels_input) = char2int2
(varName(3:8))
DO J=JTS,min(JTE,JDE-1)
DO I=ITS,min(ITE,IDE-1)
sm_input(I,num_sm_levels_input + 1,J) = grid%sm010040(i,j)
ENDDO
ENDDO
varName='SM040100'
flag_sm040100 = 1
num_sm_levels_input = num_sm_levels_input + 1
sm_levels_input(num_sm_levels_input) = char2int2
(varName(3:8))
DO J=JTS,min(JTE,JDE-1)
DO I=ITS,min(ITE,IDE-1)
sm_input(I,num_sm_levels_input + 1,J) = grid%sm040100(i,j)
ENDDO
ENDDO
varName='SM100200'
flag_sm100200 = 1
num_sm_levels_input = num_sm_levels_input + 1
sm_levels_input(num_sm_levels_input) = char2int2
(varName(3:8))
DO J=JTS,min(JTE,JDE-1)
DO I=ITS,min(ITE,IDE-1)
sm_input(I,num_sm_levels_input + 1,J) = grid%sm100200(i,j)
ENDDO
ENDDO
! flag_sst = 1
write(0,*) 'maxval st_input(1): ', maxval(st_input(:,1,:))
write(0,*) 'maxval st_input(2): ', maxval(st_input(:,2,:))
write(0,*) 'maxval st_input(3): ', maxval(st_input(:,3,:))
write(0,*) 'maxval st_input(4): ', maxval(st_input(:,4,:))
DEALLOCATE(pmsl)
DEALLOCATE(psfc_in)
DEALLOCATE(dumdata)
DEALLOCATE(dumdata_u)
DEALLOCATE(dumdata_v)
#endif
end subroutine read_wps
! -------------------------------------------------------------------------
! -------------------------------------------------------------------------
!!!! MPI-IO pieces
subroutine retrieve_index(index,string,varname_all,nrecs,iret) 71
!$$$ subprogram documentation block
! . . . .
! subprogram: retrieve_index get record number of desired variable
! prgmmr: parrish org: np22 date: 2004-11-29
!
! abstract: by examining previously generated inventory of wrf binary restart file,
! find record number that contains the header record for variable
! identified by input character variable "string".
!
! program history log:
! 2004-11-29 parrish
!
! input argument list:
! string - mnemonic for variable desired
! varname_all - list of all mnemonics obtained from inventory of file
! nrecs - total number of sequential records counted in wrf
! binary restart file
!
! output argument list:
! index - desired record number
! iret - return status, set to 0 if variable was found,
! non-zero if not.
!
! attributes:
! language: f90
! machine: ibm RS/6000 SP
!
!$$$
implicit none
integer,intent(out)::iret
integer,intent(in)::nrecs
integer,intent(out):: index
character(*), intent(in):: string
character(132),intent(in)::varname_all(nrecs)
integer i
iret=0
do i=1,nrecs
if(trim(string) == trim(varname_all(i))) then
index=i
return
end if
end do
write(6,*)' problem reading wrf nmm binary file, rec id "',trim(string),'" not found'
iret=-1
end subroutine retrieve_index
subroutine next_buf(in_unit,buf,nextbyte,locbyte,thisblock,lrecl,nreads,lastbuf) 12
!$$$ subprogram documentation block
! . . . .
! subprogram: next_buf bring in next direct access block
! prgmmr: parrish org: np22 date: 2004-11-29
!
! abstract: bring in next direct access block when needed, as the file is scanned
! from beginning to end during counting and inventory of records.
! (subroutines count_recs_wrf_binary_file and inventory_wrf_binary_file)
!
! program history log:
! 2004-11-29 parrish
!
! input argument list:
! in_unit - fortran unit number where input file is opened through.
! nextbyte - byte number from beginning of file that is desired
! locbyte - byte number from beginning of last block read for desired byt
! lrecl - direct access block length
! nreads - number of blocks read before now (for diagnostic information
! lastbuf - logical, if true, then no more blocks, so return
!
! output argument list:
! buf - output array containing contents of next block
! locbyte - byte number from beginning of new block read for desired byte
! thisblock - number of new block being read by this routine
! nreads - number of blocks read now (for diagnostic information only)
! lastbuf - logical, if true, then at end of file.
!
! attributes:
! language: f90
! machine: ibm RS/6000 SP
!
!$$$
! use kinds, only: i_byte,i_llong
implicit none
integer(i_llong) lrecl
integer in_unit,nreads
integer(i_byte) buf(lrecl)
integer(i_llong) nextbyte,locbyte,thisblock
logical lastbuf
integer ierr
if(lastbuf) return
ierr=0
nreads=nreads+1
! compute thisblock:
thisblock = 1_i_llong + (nextbyte-1_i_llong)/lrecl
locbyte = 1_i_llong+mod(locbyte-1_i_llong,lrecl)
read(in_unit,rec=thisblock,iostat=ierr)buf
lastbuf = ierr /= 0
end subroutine next_buf
subroutine inventory_wrf_binary_file(in_unit,wrf_ges_filename,nrecs, & 1,13
datestr_all,varname_all,domainend_all, &
start_block,end_block,start_byte,end_byte,file_offset)
!$$$ subprogram documentation block
! . . . .
! subprogram: inventory_wrf_binary_file get contents of wrf binary file
! prgmmr: parrish org: np22 date: 2004-11-29
!
! abstract: generate list of contents and map of wrf binary file which can be
! used for reading and writing with mpi io routines.
! same basic routine as count_recs_wrf_binary_file, except
! now wrf unpacking routines are used to decode wrf header
! records, and send back lists of variable mnemonics, dates,
! grid dimensions, and byte addresses relative to start of
! file for each field (this is used by mpi io routines).
!
! program history log:
! 2004-11-29 parrish
!
!
! input argument list:
! in_unit - fortran unit number where input file is opened through.
! wrf_ges_filename - filename of input wrf binary restart file
! nrecs - number of sequential records found on input wrf binary restart file.
! (obtained by a previous call to count_recs_wrf_binary_file)
!
! output argument list: (all following dimensioned nrecs)
! datestr_all - date character string for each field, where applicable (or else blanks)
! varname_all - wrf mnemonic for each variable, where applicable (or blank)
! domainend_all - dimensions of each field, where applicable (up to 3 dimensions)
! start_block - direct access block number containing 1st byte of record
! (after 4 byte record mark)
! end_block - direct access block number containing last byte of record
! (before 4 byte record mark)
! start_byte - relative byte address in direct access block of 1st byte of record
! end_byte - relative byte address in direct access block of last byte of record
! file_offset - absolute address of byte before 1st byte of record (used by mpi io)
!
! attributes:
! language: f90
! machine: ibm RS/6000 SP
!
!$$$
! use kinds, only: r_single,i_byte,i_long,i_llong
use module_internal_header_util
implicit none
integer,intent(in)::in_unit,nrecs
character(*),intent(in)::wrf_ges_filename
character(132),intent(out)::datestr_all(nrecs),varname_all(nrecs)
integer,intent(out)::domainend_all(3,nrecs)
integer,intent(out)::start_block(nrecs),end_block(nrecs)
integer,intent(out)::start_byte(nrecs),end_byte(nrecs)
integer(i_llong),intent(out)::file_offset(nrecs)
integer irecs
integer(i_llong) nextbyte,locbyte,thisblock
integer(i_byte) lenrec4(4)
integer(i_long) lenrec,lensave
equivalence (lenrec4(1),lenrec)
integer(i_byte) missing4(4)
integer(i_long) missing
equivalence (missing,missing4(1))
integer(i_llong),parameter:: lrecl=2**20
integer(i_byte) buf(lrecl)
integer i,loc_count,nreads
logical lastbuf
integer(i_byte) hdrbuf4(2048)
integer(i_long) hdrbuf(512)
equivalence(hdrbuf(1),hdrbuf4(1))
integer,parameter:: int_field = 530
integer,parameter:: int_dom_ti_char = 220
integer,parameter:: int_dom_ti_real = 140
integer,parameter:: int_dom_ti_integer = 180
integer hdrbufsize
integer inttypesize
integer datahandle,count
character(128) element,dumstr,strdata
integer loccode
character(132) blanks
integer typesize
integer fieldtype,comm,iocomm
integer domaindesc
character(132) memoryorder,stagger,dimnames(3)
integer domainstart(3),domainend(3)
integer memorystart(3),memoryend(3)
integer patchstart(3),patchend(3)
character(132) datestr,varname
real dummy_field(1)
! real(r_single) dummy_field(1)
! integer dummy_field
! real dummy_field
integer itypesize
integer idata(1)
real rdata(1)
call wrf_sizeof_integer
(itypesize)
inttypesize=itypesize
blanks=trim(' ')
write(0,*) 'inventory subroutine'
write(0,*) 'opening file : ', trim(wrf_ges_filename)
open(in_unit,file=trim(wrf_ges_filename),access='direct',recl=lrecl)
irecs=0
missing=-9999
nextbyte=0_i_llong
locbyte=lrecl
nreads=0
lastbuf=.false.
do
! get length of next record
do i=1,4
nextbyte=nextbyte+1_i_llong
locbyte=locbyte+1_i_llong
if(locbyte > lrecl .and. lastbuf) go to 900
if(locbyte > lrecl) call next_buf
(in_unit,buf,nextbyte,locbyte,thisblock,lrecl,nreads,lastbuf)
lenrec4(i)=buf(locbyte)
end do
if(lenrec <= 0 .and. lastbuf) go to 900
if(lenrec <= 0 .and. .not. lastbuf) go to 885
nextbyte=nextbyte+1_i_llong
locbyte=locbyte+1_i_llong
if(locbyte > lrecl .and. lastbuf) go to 900
if(locbyte > lrecl) call next_buf
(in_unit,buf,nextbyte,locbyte,thisblock,lrecl,nreads,lastbuf)
irecs=irecs+1
start_block(irecs)=thisblock
start_byte(irecs)=locbyte
file_offset(irecs)=nextbyte-1_i_llong
hdrbuf4(1)=buf(locbyte)
hdrbuf4(2:4)=missing4(2:4)
hdrbuf4(5:8)=missing4(1:4)
datestr_all(irecs)=blanks
varname_all(irecs)=blanks
domainend_all(1:3,irecs)=0
loc_count=1
! write(0,*) '1, hdrbuf4(1): 1', hdrbuf4(1)
do i=2,8
if(loc_count.ge.lenrec) exit
loc_count=loc_count+1
nextbyte=nextbyte+1_i_llong
locbyte=locbyte+1_i_llong
if(locbyte > lrecl .and. lastbuf) go to 900
if(locbyte > lrecl) call next_buf
(in_unit,buf,nextbyte,locbyte,thisblock,lrecl,nreads,lastbuf)
hdrbuf4(i)=buf(locbyte)
! write(0,*) 'I, hdrbuf4(I): ', I, hdrbuf4(I)
end do
! if(lenrec==2048) write(0,*)' irecs,hdrbuf(2),int_dom_ti_char,int_field=', &
! irecs,hdrbuf(2),int_dom_ti_char,int_field, int_dom_ti_real, int_dom_ti_integer
if(lenrec==2048.and.(hdrbuf(2) == int_dom_ti_char .or. hdrbuf(2) == int_field &
.or. hdrbuf(2) == int_dom_ti_real .or. hdrbuf(2) == int_dom_ti_integer)) then
! bring in next full record, so we can unpack datestr, varname, and domainend
do i=9,lenrec
loc_count=loc_count+1
nextbyte=nextbyte+1_i_llong
locbyte=locbyte+1_i_llong
if(locbyte > lrecl .and. lastbuf) go to 900
if(locbyte > lrecl) call next_buf
(in_unit,buf,nextbyte,locbyte,thisblock,lrecl,nreads,lastbuf)
hdrbuf4(i)=buf(locbyte)
! write(0,*) 'I, hdrbuf4(I): ', I, hdrbuf4(I)
end do
! write(0,*) 'past 9,lenrec loop'
! write(0,*) 'hdrbuf(2): ', hdrbuf(2)
if(hdrbuf(2) == int_dom_ti_char) then
call int_get_ti_header_char
(hdrbuf,hdrbufsize,inttypesize, &
datahandle,element,dumstr,strdata,loccode)
varname_all(irecs)=trim(element)
datestr_all(irecs)=trim(strdata)
write(0,*)'(1) irecs,varname,datestr = ',irecs,trim(varname_all(irecs)),trim(datestr_all(irecs))
else if(hdrbuf(2) == int_dom_ti_real) then
! write(0,*) 'call int_get_ti_header_real'
! write(0,*) 'hdrbuf(1:10): ', hdrbuf(1:10)
! write(0,*) 'call with inttypesize typesize: ', inttypesize,typesize
call int_get_ti_header_real
(hdrbuf,hdrbufsize,inttypesize,typesize, &
datahandle,element,rdata,count,loccode)
! write(0,*) 'return int_get_ti_header_real'
varname_all(irecs)=trim(element)
! write(0,*) 'varname_all(irecs): ', varname_all(irecs)
! datestr_all(irecs)=trim(strdata)
write(0,*)'(2) irecs,varname,datestr = ',irecs,trim(varname_all(irecs)),rdata(1)
! write(0,*) ' --------------------------- '
else if(hdrbuf(2) == int_dom_ti_integer) then
call int_get_ti_header_integer
(hdrbuf,hdrbufsize,inttypesize,typesize, &
datahandle,element,idata,count,loccode)
varname_all(irecs)=trim(element)
! datestr_all(irecs)=trim(strdata)
write(0,*)'(3) irecs,varname,datestr = ',irecs,trim(varname_all(irecs)),idata(1:count)
else
! write(0,*) 'call int_get_write_field_header'
call int_get_write_field_header
(hdrbuf,hdrbufsize,inttypesize,typesize, &
datahandle,datestr,varname,dummy_field,fieldtype,comm,iocomm, &
domaindesc,memoryorder,stagger,dimnames, &
domainstart,domainend,memorystart,memoryend,patchstart,patchend)
varname_all(irecs)=trim(varname)
datestr_all(irecs)=trim(datestr)
domainend_all(1:3,irecs)=domainend(1:3)
! write(0,*)'(4) irecs,datestr,domend,varname = ', &
! irecs,trim(datestr_all(irecs)),domainend_all(1:3,irecs),trim(varname_all(irecs))
end if
end if
nextbyte=nextbyte-loc_count+lenrec
locbyte=locbyte-loc_count+lenrec
if(locbyte > lrecl .and. lastbuf) go to 900
if(locbyte > lrecl) call next_buf
(in_unit,buf,nextbyte,locbyte,thisblock,lrecl,nreads,lastbuf)
end_block(irecs)=thisblock
end_byte(irecs)=locbyte
lensave=lenrec
do i=1,4
nextbyte=nextbyte+1_i_llong
locbyte=locbyte+1_i_llong
if(locbyte > lrecl .and. lastbuf) go to 900
if(locbyte > lrecl) call next_buf
(in_unit,buf,nextbyte,locbyte,thisblock,lrecl,nreads,lastbuf)
lenrec4(i)=buf(locbyte)
end do
if(lenrec /= lensave) go to 890
end do
880 continue
write(6,*)' reached impossible place in inventory_wrf_binary_file'
close(in_unit)
return
885 continue
write(0,*)' problem in inventory_wrf_binary_file, lenrec has bad value before end of file'
write(0,*)' lenrec =',lenrec
close(in_unit)
return
890 continue
write(0,*)' problem in inventory_wrf_binary_file, beginning and ending rec len words unequal'
write(0,*)' begining reclen =',lensave
write(0,*)' ending reclen =',lenrec
write(0,*)' irecs =',irecs
write(0,*)' nrecs =',nrecs
call wrf_error_fatal
("curious reclen discrepancy")
close(in_unit)
return
900 continue
write(0,*)' normal end of file reached in inventory_wrf_binary_file'
write(0,*)' nblocks=',thisblock
write(0,*)' irecs,nrecs=',irecs,nrecs
write(0,*)' nreads=',nreads
close(in_unit)
end subroutine inventory_wrf_binary_file
SUBROUTINE wrf_sizeof_integer( retval ) 1
IMPLICIT NONE
INTEGER retval
! 4 is defined by CPP
retval = 4
RETURN
END SUBROUTINE wrf_sizeof_integer
SUBROUTINE wrf_sizeof_real( retval )
IMPLICIT NONE
INTEGER retval
! 4 is defined by CPP
retval = 4
RETURN
END SUBROUTINE wrf_sizeof_real
!!!
!!!
!!!
subroutine count_recs_wrf_binary_file(in_unit,wrf_ges_filename,nrecs) 1,7
!$$$ subprogram documentation block
! . . . .
! subprogram: count_recs_binary_file count # recs on wrf binary file
! prgmmr: parrish org: np22 date: 2004-11-29
!
! abstract: count number of sequential records contained in wrf binary
! file. this is done by opening the file in direct access
! mode with block length of 2**20, the size of the physical
! blocks on ibm "blue" and "white" machines. for optimal
! performance, change block length to correspond to the
! physical block length of host machine disk space.
! records are counted by looking for the 4 byte starting
! and ending sequential record markers, which contain the
! record size in bytes. only blocks are read which are known
! by simple calculation to contain these record markers.
! even though this is done on one processor, it is still
! very fast, and the time will always scale by the number of
! sequential records, not their size. this step and the
! following inventory step consistently take less than 0.1 seconds
! to complete.
!
! program history log:
! 2004-11-29 parrish
!
! input argument list:
! in_unit - fortran unit number where input file is opened through.
! wrf_ges_filename - filename of input wrf binary restart file
!
! output argument list:
! nrecs - number of sequential records found on input wrf binary restart fil
!
! attributes:
! language: f90
! machine: ibm RS/6000 SP
!
!$$$
! do an initial read through of a wrf binary file, and get total number of sequential fil
! use kinds, only: r_single,i_byte,i_long,i_llong
implicit none
integer,intent(in)::in_unit
character(*),intent(in)::wrf_ges_filename
integer,intent(out)::nrecs
integer(i_llong) nextbyte,locbyte,thisblock
integer(i_byte) lenrec4(4)
integer(i_long) lenrec,lensave
equivalence (lenrec4(1),lenrec)
integer(i_byte) missing4(4)
integer(i_long) missing
equivalence (missing,missing4(1))
integer(i_llong),parameter:: lrecl=2**20
integer(i_byte) buf(lrecl)
integer i,loc_count,nreads
logical lastbuf
open(in_unit,file=trim(wrf_ges_filename),access='direct',recl=lrecl)
nrecs=0
missing=-9999
nextbyte=0_i_llong
locbyte=lrecl
nreads=0
lastbuf=.false.
do
! get length of next record
do i=1,4
nextbyte=nextbyte+1_i_llong
locbyte=locbyte+1_i_llong
if(locbyte > lrecl .and. lastbuf) go to 900
if(locbyte > lrecl) call next_buf
(in_unit,buf,nextbyte,locbyte,thisblock,lrecl,nreads,lastbuf)
lenrec4(i)=buf(locbyte)
end do
if(lenrec <= 0 .and. lastbuf) go to 900
if(lenrec <= 0 .and. .not.lastbuf) go to 885
nextbyte=nextbyte+1_i_llong
locbyte=locbyte+1_i_llong
if(locbyte > lrecl .and. lastbuf) go to 900
if(locbyte > lrecl) call next_buf
(in_unit,buf,nextbyte,locbyte,thisblock,lrecl,nreads,lastbuf)
nrecs=nrecs+1
loc_count=1
do i=2,4
if(loc_count.ge.lenrec) exit
loc_count=loc_count+1
nextbyte=nextbyte+1_i_llong
locbyte=locbyte+1_i_llong
if(locbyte > lrecl .and. lastbuf) go to 900
if(locbyte > lrecl) call next_buf
(in_unit,buf,nextbyte,locbyte,thisblock,lrecl,nreads,lastbuf)
end do
do i=1,4
if(loc_count.ge.lenrec) exit
loc_count=loc_count+1
nextbyte=nextbyte+1_i_llong
locbyte=locbyte+1_i_llong
if(locbyte > lrecl .and. lastbuf) go to 900
if(locbyte > lrecl) call next_buf
(in_unit,buf,nextbyte,locbyte,thisblock,lrecl,nreads,lastbuf)
end do
nextbyte=nextbyte-loc_count+lenrec
locbyte=locbyte-loc_count+lenrec
if(locbyte > lrecl .and. lastbuf) go to 900
if(locbyte > lrecl) call next_buf
(in_unit,buf,nextbyte,locbyte,thisblock,lrecl,nreads,lastbuf)
lensave=lenrec
do i=1,4
nextbyte=nextbyte+1_i_llong
locbyte=locbyte+1_i_llong
if(locbyte > lrecl .and. lastbuf) go to 900
if(locbyte > lrecl) call next_buf
(in_unit,buf,nextbyte,locbyte,thisblock,lrecl,nreads,lastbuf)
lenrec4(i)=buf(locbyte)
end do
if(lenrec /= lensave) go to 890
end do
880 continue
write(6,*)' reached impossible place in count_recs_wrf_binary_file'
close(in_unit)
return
885 continue
write(6,*)' problem in count_recs_wrf_binary_file, lenrec has bad value before end of file'
write(6,*)' lenrec =',lenrec
close(in_unit)
return
890 continue
write(6,*)' problem in count_recs_wrf_binary_file, beginning and ending rec len words unequal'
write(6,*)' begining reclen =',lensave
write(6,*)' ending reclen =',lenrec
close(in_unit)
call wrf_error_fatal
("bad reclen stuff")
return
900 continue
write(6,*)' normal end of file reached in count_recs_wrf_binary_file'
write(6,*)' nblocks=',thisblock
write(6,*)' nrecs=',nrecs
write(6,*)' nreads=',nreads
close(in_unit)
end subroutine count_recs_wrf_binary_file
subroutine retrieve_field(in_unit,wrfges,out,start_block,end_block,start_byte,end_byte)
!$$$ subprogram documentation block
! . . . .
! subprogram: retrieve_field retrieve field from wrf binary file
! prgmmr: parrish org: np22 date: 2004-11-29
!
! abstract: still using direct access, retrieve a field from the wrf binary restart file.
!
! program history log:
! 2004-11-29 parrish
!
! input argument list:
! in_unit - fortran unit number where input file is opened through.
! wrfges - filename of input wrf binary restart file
! start_block - direct access block number containing 1st byte of record
! (after 4 byte record mark)
! end_block - direct access block number containing last byte of record
! (before 4 byte record mark)
! start_byte - relative byte address in direct access block of 1st byte of record
! end_byte - relative byte address in direct access block of last byte of record
!
! output argument list:
! out - output buffer where desired field is deposited
!
! attributes:
! language: f90
! machine: ibm RS/6000 SP
!
!$$$
! use kinds, only: i_byte,i_kind
implicit none
integer(i_kind),intent(in)::in_unit
character(50),intent(in)::wrfges
integer(i_kind),intent(in)::start_block,end_block,start_byte,end_byte
integer(i_byte),intent(out)::out(*)
integer(i_llong),parameter:: lrecl=2**20
integer(i_byte) buf(lrecl)
integer(i_kind) i,ii,k
integer(i_llong) ibegin,iend,ierr
open(in_unit,file=trim(wrfges),access='direct',recl=lrecl)
write(6,*)' in retrieve_field, start_block,end_block=',start_block,end_block
write(6,*)' in retrieve_field, start_byte,end_byte=',start_byte,end_byte
ii=0
do k=start_block,end_block
read(in_unit,rec=k,iostat=ierr)buf
ibegin=1 ; iend=lrecl
if(k == start_block) ibegin=start_byte
if(k == end_block) iend=end_byte
do i=ibegin,iend
ii=ii+1
out(ii)=buf(i)
end do
end do
close(in_unit)
end subroutine retrieve_field
END MODULE module_wps_io_arw