!*----------------------------------------------------------------------------- !* !* Todd Hutchinson !* WSI !* 400 Minuteman Road !* Andover, MA 01810 !* thutchinson@wsi.com !* !*----------------------------------------------------------------------------- !* !* This io_grib1 API is designed to read WRF input and write WRF output data !* in grib version 1 format. !* module gr1_data_info 70 !* !* This module will hold data internal to this I/O implementation. !* The variables will be accessible by all functions (provided they have a !* "USE gr1_data_info" line). !* integer , parameter :: FATAL = 1 integer , parameter :: DEBUG = 100 integer , parameter :: DateStrLen = 19 integer , parameter :: firstFileHandle = 8 integer , parameter :: maxFileHandles = 30 integer , parameter :: maxLevels = 1000 integer , parameter :: maxSoilLevels = 100 integer , parameter :: maxDomains = 500 logical , dimension(maxFileHandles) :: committed, opened, used character*128, dimension(maxFileHandles) :: DataFile integer, dimension(maxFileHandles) :: FileFd integer, dimension(maxFileHandles) :: FileStatus REAL, dimension(maxLevels) :: half_eta, full_eta REAL, dimension(maxSoilLevels) :: soil_depth, soil_thickness character*24 :: StartDate = '' character*24 :: InputProgramName = '' integer :: projection integer :: wg_grid_id real :: dx,dy real :: truelat1, truelat2 real :: center_lat, center_lon real :: proj_central_lon real :: timestep character, dimension(:), pointer :: grib_tables logical :: table_filled = .FALSE. character, dimension(:), pointer :: grid_info integer :: full_xsize, full_ysize integer, dimension(maxDomains) :: domains = -1 integer :: this_domain = 0 integer :: max_domain = 0 TYPE :: HandleVar character, dimension(:), pointer :: fileindex(:) integer :: CurrentTime integer :: NumberTimes character (DateStrLen), dimension(:),pointer :: Times(:) ENDTYPE TYPE (HandleVar), dimension(maxFileHandles) :: fileinfo TYPE :: prevdata integer :: fcst_secs_rainc integer :: fcst_secs_rainnc real, dimension(:,:), pointer :: rainc, rainnc END TYPE prevdata TYPE (prevdata), DIMENSION(500) :: lastdata TYPE :: initdata real, dimension(:,:), pointer :: snod END TYPE initdata TYPE (initdata), dimension(maxDomains) :: firstdata TYPE :: prestype real, dimension(:,:,:), pointer :: vals logical :: newtime character*120 :: lastDateStr END TYPE prestype character*120, dimension(maxDomains) :: lastDateStr TYPE (prestype), dimension(maxDomains) :: pressure TYPE (prestype), dimension(maxDomains) :: geopotential integer :: center, subcenter, parmtbl character(len=15000), dimension(firstFileHandle:maxFileHandles) :: td_output character(len=15000), dimension(firstFileHandle:maxFileHandles) :: ti_output logical :: WrfIOnotInitialized = .true. end module gr1_data_info subroutine ext_gr1_ioinit(SysDepInfo,Status) 4,3 USE gr1_data_info implicit none #include "wrf_status_codes.h" #include "wrf_io_flags.h" CHARACTER*(*), INTENT(IN) :: SysDepInfo integer ,intent(out) :: Status integer :: i integer :: size, istat CHARACTER (LEN=300) :: wrf_err_message call wrf_debug ( DEBUG , 'Entering ext_gr1_ioinit') do i=firstFileHandle, maxFileHandles d(i) = .false. committed(i) = .false. opened(i) = .false. td_output(i) = '' ti_output(i) = '' enddo domains(:) = -1 do i = 1, maxDomains pressure(i)%newtime = .false. pressure(i)%lastDateStr = '' geopotential(i)%newtime = .false. geopotential(i)%lastDateStr = '' lastDateStr(i) = '' enddo lastdata%fcst_secs_rainc = 0 lastdata%fcst_secs_rainnc = 0 FileStatus(1:maxFileHandles) = WRF_FILE_NOT_OPENED WrfIOnotInitialized = .false. Status = WRF_NO_ERR return end subroutine ext_gr1_ioinit !***************************************************************************** subroutine ext_gr1_ioexit(Status) 4,2 USE gr1_data_info implicit none #include "wrf_status_codes.h" integer istat integer ,intent(out) :: Status call wrf_debug ( DEBUG , 'Entering ext_gr1_ioexit') if (table_filled) then CALL free_gribmap(grib_tables) DEALLOCATE(grib_tables, stat=istat) table_filled = .FALSE. endif IF ( ASSOCIATED ( grid_info ) ) THEN DEALLOCATE(grid_info, stat=istat) ENDIF NULLIFY(grid_info) Status = WRF_NO_ERR return end subroutine ext_gr1_ioexit !***************************************************************************** SUBROUTINE ext_gr1_open_for_read_begin ( FileName , Comm_compute, Comm_io, & 2,9 SysDepInfo, DataHandle , Status ) USE gr1_data_info IMPLICIT NONE #include "wrf_status_codes.h" #include "wrf_io_flags.h" CHARACTER*(*) :: FileName INTEGER , INTENT(IN) :: Comm_compute , Comm_io CHARACTER*(*) :: SysDepInfo INTEGER , INTENT(OUT) :: DataHandle INTEGER , INTENT(OUT) :: Status integer :: ierr integer :: size integer :: idx integer :: parmid integer :: dpth_parmid integer :: thk_parmid integer :: leveltype integer , DIMENSION(1000) :: indices integer :: numindices real , DIMENSION(1000) :: levels real :: tmp integer :: swapped integer :: etaidx integer :: grb_index integer :: level1, level2 integer :: tablenum integer :: stat integer :: endchar integer :: last_grb_index CHARACTER (LEN=300) :: wrf_err_message call wrf_debug ( DEBUG , 'Entering ext_gr1_open_for_read_begin') CALL gr1_get_new_handle(DataHandle) if (DataHandle .GT. 0) then CALL open_file(TRIM(FileName), 'r', FileFd(DataHandle), ierr) if (ierr .ne. 0) then Status = WRF_ERR_FATAL_BAD_FILE_STATUS else opened(DataHandle) = .true. DataFile(DataHandle) = TRIM(FileName) FileStatus(DataHandle) = WRF_FILE_OPENED_NOT_COMMITTED endif else Status = WRF_WARN_TOO_MANY_FILES return endif ! Read the grib index file first if (.NOT. table_filled) then table_filled = .TRUE. CALL GET_GRIB1_TABLES_SIZE(size) ALLOCATE(grib_tables(1:size), STAT=ierr) CALL LOAD_GRIB1_TABLES ("gribmap.txt", grib_tables, ierr) if (ierr .ne. 0) then DEALLOCATE(grib_tables) WRITE( wrf_err_message , * ) & 'Could not open file gribmap.txt ' CALL wrf_error_fatal ( TRIM ( wrf_err_message ) ) Status = WRF_ERR_FATAL_BAD_FILE_STATUS return endif endif ! Begin by indexing file and reading metadata into structure. CALL GET_FILEINDEX_SIZE(size) ALLOCATE(fileinfo(DataHandle)%fileindex(1:size), STAT=ierr) CALL ALLOC_INDEX_FILE(fileinfo(DataHandle)%fileindex(:)) CALL INDEX_FILE(FileFd(DataHandle),fileinfo(DataHandle)%fileindex(:)) ! Get times into Times variable CALL GET_NUM_TIMES(fileinfo(DataHandle)%fileindex(:), & fileinfo(DataHandle)%NumberTimes); ALLOCATE(fileinfo(DataHandle)%Times(1:fileinfo(DataHandle)%NumberTimes), STAT=ierr) do idx = 1,fileinfo(DataHandle)%NumberTimes CALL GET_TIME(fileinfo(DataHandle)%fileindex(:),idx, & fileinfo(DataHandle)%Times(idx)) enddo ! CurrentTime starts as 0. The first time in the file is 1. So, ! until set_time or get_next_time is called, the current time ! is not set. fileinfo(DataHandle)%CurrentTime = 0 CALL gr1_fill_eta_levels(fileinfo(DataHandle)%fileindex(:), & FileFd(DataHandle), & grib_tables, "ZNW", full_eta) CALL gr1_fill_eta_levels(fileinfo(DataHandle)%fileindex(:), FileFd(DataHandle), & grib_tables, "ZNU", half_eta) ! ! Now, get the soil levels ! CALL GET_GRIB_PARAM(grib_tables, "ZS", center, subcenter, parmtbl, & tablenum, dpth_parmid) CALL GET_GRIB_PARAM(grib_tables,"DZS", center, subcenter, parmtbl, & tablenum, thk_parmid) if (dpth_parmid == -1) then call wrf_message ('Error getting grib parameter') endif leveltype = 112 CALL GET_GRIB_INDICES(fileinfo(DataHandle)%fileindex(:),center, subcenter, parmtbl, & dpth_parmid,"*",leveltype, & -HUGE(1),-HUGE(1), -HUGE(1),-HUGE(1),indices,numindices) last_grb_index = -1; do idx = 1,numindices CALL READ_GRIB(fileinfo(DataHandle)%fileindex(:), FileFd(DataHandle), & indices(idx), soil_depth(idx)) ! ! Now read the soil thickenesses ! CALL GET_LEVEL1(fileinfo(DataHandle)%fileindex(:),indices(idx),level1) CALL GET_LEVEL2(fileinfo(DataHandle)%fileindex(:),indices(idx),level2) CALL GET_GRIB_INDEX_GUESS(fileinfo(DataHandle)%fileindex(:), & center, subcenter, parmtbl, thk_parmid,"*",leveltype, & level1,level2,-HUGE(1),-HUGE(1), last_grb_index+1, grb_index) CALL READ_GRIB(fileinfo(DataHandle)%fileindex(:),FileFd(DataHandle),grb_index, & soil_thickness(idx)) last_grb_index = grb_index enddo ! ! Fill up any variables that need to be retrieved from Metadata ! CALL GET_METADATA_VALUE(fileinfo(DataHandle)%fileindex(:), 'PROGRAM_NAME', "none", & "none", InputProgramName, stat) if (stat /= 0) then CALL wrf_debug (DEBUG , "PROGRAM_NAME not found in input METADATA") else endchar = SCAN(InputProgramName," ") InputProgramName = InputProgramName(1:endchar) endif call wrf_debug ( DEBUG , 'Exiting ext_gr1_open_for_read_begin') RETURN END SUBROUTINE ext_gr1_open_for_read_begin !***************************************************************************** SUBROUTINE ext_gr1_open_for_read_commit( DataHandle , Status ) 2,3 USE gr1_data_info IMPLICIT NONE #include "wrf_status_codes.h" #include "wrf_io_flags.h" character(len=1000) :: msg INTEGER , INTENT(IN ) :: DataHandle INTEGER , INTENT(OUT) :: Status call wrf_debug ( DEBUG , 'Entering ext_gr1_open_for_read_commit') Status = WRF_NO_ERR if(WrfIOnotInitialized) then Status = WRF_IO_NOT_INITIALIZED write(msg,*) 'ext_gr1_ioinit was not called ',__FILE__,', line', __LINE__ call wrf_debug ( FATAL , msg) return endif committed(DataHandle) = .true. FileStatus(DataHandle) = WRF_FILE_OPENED_FOR_READ Status = WRF_NO_ERR RETURN END SUBROUTINE ext_gr1_open_for_read_commit !***************************************************************************** SUBROUTINE ext_gr1_open_for_read ( FileName , Comm_compute, Comm_io, & 1,4 SysDepInfo, DataHandle , Status ) USE gr1_data_info IMPLICIT NONE #include "wrf_status_codes.h" #include "wrf_io_flags.h" CHARACTER*(*) :: FileName INTEGER , INTENT(IN) :: Comm_compute , Comm_io CHARACTER*(*) :: SysDepInfo INTEGER , INTENT(OUT) :: DataHandle INTEGER , INTENT(OUT) :: Status call wrf_debug ( DEBUG , 'Entering ext_gr1_open_for_read') DataHandle = 0 ! dummy setting to quiet warning message CALL ext_gr1_open_for_read_begin( FileName, Comm_compute, Comm_io, & SysDepInfo, DataHandle, Status ) IF ( Status .EQ. WRF_NO_ERR ) THEN FileStatus(DataHandle) = WRF_FILE_OPENED_NOT_COMMITTED CALL ext_gr1_open_for_read_commit( DataHandle, Status ) ENDIF return RETURN END SUBROUTINE ext_gr1_open_for_read !***************************************************************************** SUBROUTINE ext_gr1_open_for_write_begin(FileName, Comm, IOComm, SysDepInfo, & 4,4 DataHandle, Status) USE gr1_data_info implicit none #include "wrf_status_codes.h" #include "wrf_io_flags.h" character*(*) ,intent(in) :: FileName integer ,intent(in) :: Comm integer ,intent(in) :: IOComm character*(*) ,intent(in) :: SysDepInfo integer ,intent(out) :: DataHandle integer ,intent(out) :: Status integer :: ierr CHARACTER (LEN=300) :: wrf_err_message integer :: size call wrf_debug ( DEBUG , 'Entering ext_gr1_open_for_write_begin') if (.NOT. table_filled) then table_filled = .TRUE. CALL GET_GRIB1_TABLES_SIZE(size) ALLOCATE(grib_tables(1:size), STAT=ierr) CALL LOAD_GRIB1_TABLES ("gribmap.txt", grib_tables, ierr) if (ierr .ne. 0) then DEALLOCATE(grib_tables) WRITE( wrf_err_message , * ) & 'Could not open file gribmap.txt ' CALL wrf_error_fatal ( TRIM ( wrf_err_message ) ) Status = WRF_ERR_FATAL_BAD_FILE_STATUS return endif endif Status = WRF_NO_ERR CALL gr1_get_new_handle(DataHandle) if (DataHandle .GT. 0) then CALL open_file(TRIM(FileName), 'w', FileFd(DataHandle), ierr) if (ierr .ne. 0) then Status = WRF_WARN_WRITE_RONLY_FILE else opened(DataHandle) = .true. DataFile(DataHandle) = TRIM(FileName) FileStatus(DataHandle) = WRF_FILE_OPENED_NOT_COMMITTED endif committed(DataHandle) = .false. td_output(DataHandle) = '' else Status = WRF_WARN_TOO_MANY_FILES endif RETURN END SUBROUTINE ext_gr1_open_for_write_begin !***************************************************************************** SUBROUTINE ext_gr1_open_for_write_commit( DataHandle , Status ) 4,2 USE gr1_data_info IMPLICIT NONE #include "wrf_status_codes.h" #include "wrf_io_flags.h" INTEGER , INTENT(IN ) :: DataHandle INTEGER , INTENT(OUT) :: Status call wrf_debug ( DEBUG , 'Entering ext_gr1_open_for_write_commit') IF ( opened( DataHandle ) ) THEN IF ( used( DataHandle ) ) THEN committed(DataHandle) = .true. FileStatus(DataHandle) = WRF_FILE_OPENED_FOR_WRITE ENDIF ENDIF Status = WRF_NO_ERR RETURN END SUBROUTINE ext_gr1_open_for_write_commit !***************************************************************************** subroutine ext_gr1_inquiry (Inquiry, Result, Status),1 use gr1_data_info implicit none #include "wrf_status_codes.h" character *(*), INTENT(IN) :: Inquiry character *(*), INTENT(OUT) :: Result integer ,INTENT(INOUT) :: Status SELECT CASE (Inquiry) CASE ("RANDOM_WRITE","RANDOM_READ") Result='ALLOW' CASE ("SEQUENTIAL_WRITE","SEQUENTIAL_READ") Result='NO' CASE ("OPEN_READ", "OPEN_WRITE", "OPEN_COMMIT_WRITE") Result='REQUIRE' CASE ("OPEN_COMMIT_READ","PARALLEL_IO") Result='NO' CASE ("SELF_DESCRIBING","SUPPORT_METADATA","SUPPORT_3D_FIELDS") Result='YES' CASE ("MEDIUM") Result ='FILE' CASE DEFAULT Result = 'No Result for that inquiry!' END SELECT Status=WRF_NO_ERR return end subroutine ext_gr1_inquiry !***************************************************************************** SUBROUTINE ext_gr1_inquire_opened ( DataHandle, FileName , FileStat, Status ) 2,2 USE gr1_data_info IMPLICIT NONE #include "wrf_status_codes.h" #include "wrf_io_flags.h" INTEGER , INTENT(IN) :: DataHandle CHARACTER*(*) :: FileName INTEGER , INTENT(OUT) :: FileStat INTEGER , INTENT(OUT) :: Status call wrf_debug ( DEBUG , 'Entering ext_gr1_inquire_opened') FileStat = WRF_NO_ERR if ((DataHandle .ge. firstFileHandle) .and. & (DataHandle .le. maxFileHandles)) then FileStat = FileStatus(DataHandle) else FileStat = WRF_FILE_NOT_OPENED endif Status = FileStat RETURN END SUBROUTINE ext_gr1_inquire_opened !***************************************************************************** SUBROUTINE ext_gr1_ioclose ( DataHandle, Status ) 5,3 USE gr1_data_info IMPLICIT NONE #include "wrf_status_codes.h" INTEGER DataHandle, Status INTEGER istat INTEGER ierr character(len=1000) :: outstring character :: lf lf=char(10) call wrf_debug ( DEBUG , 'Entering ext_gr1_ioclose') Status = WRF_NO_ERR CALL write_file(FileFd(DataHandle), lf//'<METADATA>'//lf,ierr) outstring = & '<!-- The following are fields that were supplied to the WRF I/O API.'//lf//& 'Many variables (but not all) are redundant with the variables within '//lf//& 'the grib headers. They are stored here, as METADATA, so that the '//lf//& 'WRF I/O API has simple access to these variables.-->' CALL write_file(FileFd(DataHandle), trim(outstring), ierr) if (trim(ti_output(DataHandle)) /= '') then CALL write_file(FileFd(DataHandle), trim(ti_output(DataHandle)), ierr) CALL write_file(FileFd(DataHandle), lf, ierr) endif if (trim(td_output(DataHandle)) /= '') then CALL write_file(FileFd(DataHandle), trim(td_output(DataHandle)), ierr) CALL write_file(FileFd(DataHandle), lf, ierr) endif CALL write_file(FileFd(DataHandle), '</METADATA>'//lf,ierr) ti_output(DataHandle) = '' td_output(DataHandle) = '' if (ierr .ne. 0) then Status = WRF_WARN_WRITE_RONLY_FILE endif CALL close_file(FileFd(DataHandle)) d(DataHandle) = .false. RETURN END SUBROUTINE ext_gr1_ioclose !***************************************************************************** SUBROUTINE ext_gr1_write_field( DataHandle , DateStrIn , VarName , & 3,12 Field , FieldType , Comm , IOComm, & DomainDesc , MemoryOrder , Stagger , & DimNames , & DomainStart , DomainEnd , & MemoryStart , MemoryEnd , & PatchStart , PatchEnd , & Status ) USE gr1_data_info IMPLICIT NONE #include "wrf_status_codes.h" #include "wrf_io_flags.h" #include "wrf_projection.h" INTEGER , INTENT(IN) :: DataHandle CHARACTER*(*) :: DateStrIn CHARACTER(DateStrLen) :: DateStr CHARACTER*(*) :: VarName CHARACTER*120 :: OutName CHARACTER(120) :: TmpVarName integer ,intent(in) :: FieldType integer ,intent(inout) :: Comm integer ,intent(inout) :: IOComm integer ,intent(in) :: DomainDesc character*(*) ,intent(in) :: MemoryOrder character*(*) ,intent(in) :: Stagger character*(*) , dimension (*) ,intent(in) :: DimNames integer ,dimension(*) ,intent(in) :: DomainStart, DomainEnd integer ,dimension(*) ,intent(in) :: MemoryStart, MemoryEnd integer ,dimension(*) ,intent(in) :: PatchStart, PatchEnd integer ,intent(out) :: Status integer :: ierror character (120) :: msg integer :: xsize, ysize, zsize integer :: x, y, z integer :: x_start,x_end,y_start,y_end,z_start,z_end,ndim integer :: idx integer :: proj_center_flag logical :: vert_stag = .false. integer :: levelnum real, DIMENSION(:,:), POINTER :: data,tmpdata integer, DIMENSION(:), POINTER :: mold integer :: istat integer :: accum_period integer :: size integer, dimension(1000) :: level1, level2 real, DIMENSION( 1:1,MemoryStart(1):MemoryEnd(1), & MemoryStart(2):MemoryEnd(2), & MemoryStart(3):MemoryEnd(3) ) :: Field real :: fcst_secs logical :: soil_layers, fraction integer :: vert_unit integer :: abc(2,2,2) integer :: def(8) logical :: output = .true. integer :: idx1, idx2, idx3 logical :: new_domain real :: region_center_lat, region_center_lon integer :: dom_xsize, dom_ysize; integer :: ierr logical :: already_have_domain call wrf_debug ( DEBUG , 'Entering ext_gr1_write_field for parameter'//VarName) ! ! If DateStr is all 0's, we reset it to StartDate (if StartDate exists). ! For some reason, ! in idealized simulations, StartDate is 0001-01-01_00:00:00 while ! the first DateStr is 0000-00-00_00:00:00. ! if (DateStrIn .eq. '0000-00-00_00:00:00') then if (StartDate .ne. '') then DateStr = TRIM(StartDate) else DateStr = '0001-01-01_00:00:00' endif else DateStr = DateStrIn endif ! ! Check if this is a domain that we haven't seen yet. If so, add it to ! the list of domains. ! new_domain = .false. already_have_domain = .false. do idx = 1, max_domain if (this_domain .eq. domains(idx)) then already_have_domain = .true. endif enddo if (.NOT. already_have_domain) then max_domain = max_domain + 1 domains(max_domain) = this_domain new_domain = .true. endif ! ! If the time has changed, we open a new file. This is a kludge to get ! around slowness in WRF that occurs when opening a new data file the ! standard way. ! #ifdef GRIB_ONE_TIME_PER_FILE if (lastDateStr(this_domain) .ne. DateStr) then write(DataFile(DataHandle),'(A8,i2.2,A1,A19)') 'wrfout_d',this_domain,'_',DateStr call ext_gr1_ioclose ( DataHandle, Status ) CALL open_file(TRIM(DataFile(DataHandle)), 'w', FileFd(DataHandle), ierr) if (ierr .ne. 0) then print *,'Could not open new file: ',DataFile(DataHandle) print *,' Appending to old file.' else ! Just set used back to .true. here, since ioclose set it to false. d(DataHandle) = .true. endif td_output(DataHandle) = '' endif lastDateStr(this_domain) = DateStr #endif output = .true. zsize = 1 xsize = 1 ysize = 1 OutName = VarName soil_layers = .false. fraction = .false. ! First, handle then special cases for the boundary data. CALL get_dims(MemoryOrder, PatchStart, PatchEnd, ndim, x_start, x_end, & y_start, y_end,z_start,z_end) xsize = x_end - x_start + 1 ysize = y_end - y_start + 1 zsize = z_end - z_start + 1 do idx = 1, len(MemoryOrder) if ((MemoryOrder(idx:idx) .eq. 'Z') .and. & (DimNames(idx) .eq. 'soil_layers_stag')) then soil_layers = .true. else if ((OutName .eq. 'LANDUSEF') .or. (OutName .eq. 'SOILCBOT') .or. & (OutName .eq. 'SOILCTOP')) then fraction = .true. endif enddo if (.not. ASSOCIATED(grid_info)) then CALL get_grid_info_size(size) ALLOCATE(grid_info(1:size), STAT=istat) if (istat .eq. -1) then DEALLOCATE(grid_info) Status = WRF_ERR_FATAL_BAD_FILE_STATUS return endif endif if (new_domain) then ALLOCATE(firstdata(this_domain)%snod(xsize,ysize)) firstdata(this_domain)%snod(:,:) = 0.0 ALLOCATE(lastdata(this_domain)%rainc(xsize,ysize)) lastdata(this_domain)%rainc(:,:) = 0.0 ALLOCATE(lastdata(this_domain)%rainnc(xsize,ysize)) lastdata(this_domain)%rainnc(:,:) = 0.0 endif if (zsize .eq. 0) then zsize = 1 endif ALLOCATE(data(1:xsize,1:ysize), STAT=istat) ALLOCATE(mold(1:ysize), STAT=istat) ALLOCATE(tmpdata(1:xsize,1:ysize), STAT=istat) if (OutName .eq. 'ZNU') then do idx = 1, zsize half_eta(idx) = Field(1,idx,1,1) enddo endif if (OutName .eq. 'ZNW') then do idx = 1, zsize full_eta(idx) = Field(1,idx,1,1) enddo endif if (OutName .eq. 'ZS') then do idx = 1, zsize soil_depth(idx) = Field(1,idx,1,1) enddo endif if (OutName .eq. 'DZS') then do idx = 1, zsize soil_thickness(idx) = Field(1,idx,1,1) enddo endif if ((xsize .lt. 1) .or. (ysize .lt. 1)) then write(msg,*) 'Cannot output field with memory order: ', & MemoryOrder,Varname call wrf_message(msg) return endif call get_vert_stag(OutName,Stagger,vert_stag) do idx = 1, zsize call gr1_get_levels(OutName, idx, zsize, soil_layers, vert_stag, fraction, & vert_unit, level1(idx), level2(idx)) enddo ! ! Get the center lat/lon for the area being output. For some cases (such ! as for boundary areas, the center of the area is different from the ! center of the model grid. ! if (index(Stagger,'X') .le. 0) then dom_xsize = full_xsize - 1 else dom_xsize = full_xsize endif if (index(Stagger,'Y') .le. 0) then dom_ysize = full_ysize - 1 else dom_ysize = full_ysize endif ! ! Handle case of polare stereographic centered on pole. In that case, ! always set center lon to be the projection central longitude. ! if ((projection .eq. WRF_POLAR_STEREO) .AND. & (abs(center_lat - 90.0) < 0.01)) then center_lon = proj_central_lon endif CALL get_region_center(MemoryOrder, projection, center_lat, center_lon, & dom_xsize, dom_ysize, dx, dy, proj_central_lon, proj_center_flag, & truelat1, truelat2, xsize, ysize, region_center_lat, region_center_lon) if ( .not. opened(DataHandle)) then Status = WRF_WARN_FILE_NOT_OPENED return endif if (opened(DataHandle) .and. committed(DataHandle)) then #ifdef OUTPUT_FULL_PRESSURE ! ! The following is a kludge to output full pressure instead of the two ! fields of base-state pressure and pressure perturbation. ! ! This code can be turned on by adding -DOUTPUT_FULL_PRESSURE to the ! compile line ! if ((OutName .eq. 'P') .or. (OutName.eq.'PB')) then do idx = 1, len(MemoryOrder) if (MemoryOrder(idx:idx) .eq. 'X') then idx1=idx endif if (MemoryOrder(idx:idx) .eq. 'Y') then idx2=idx endif if (MemoryOrder(idx:idx) .eq. 'Z') then idx3=idx endif enddo ! ! Allocate space for pressure values (this variable holds ! base-state pressure or pressure perturbation to be used ! later to sum base-state and perturbation pressure to get full ! pressure). ! if (.not. ASSOCIATED(pressure(this_domain)%vals)) then ALLOCATE(pressure(this_domain)%vals(MemoryStart(1):MemoryEnd(1), & MemoryStart(2):MemoryEnd(2),MemoryStart(3):MemoryEnd(3))) endif if (DateStr .NE. & pressure(this_domain)%lastDateStr) then pressure(this_domain)%newtime = .true. endif if (pressure(this_domain)%newtime) then pressure(this_domain)%vals = Field(1,:,:,:) pressure(this_domain)%newtime = .false. output = .false. else output = .true. endif pressure(this_domain)%lastDateStr=DateStr endif #endif #ifdef OUTPUT_FULL_GEOPOTENTIAL ! ! The following is a kludge to output full geopotential height instead ! of the two fields of base-state geopotential and perturbation ! geopotential. ! ! This code can be turned on by adding -DOUTPUT_FULL_GEOPOTENTIAL to the ! compile line ! if ((OutName .eq. 'PHB') .or. (OutName.eq.'PH')) then do idx = 1, len(MemoryOrder) if (MemoryOrder(idx:idx) .eq. 'X') then idx1=idx endif if (MemoryOrder(idx:idx) .eq. 'Y') then idx2=idx endif if (MemoryOrder(idx:idx) .eq. 'Z') then idx3=idx endif enddo ! ! Allocate space for geopotential values (this variable holds ! geopotential to be used ! later to sum base-state and perturbation to get full ! geopotential). ! if (.not. ASSOCIATED(geopotential(this_domain)%vals)) then ALLOCATE(geopotential(this_domain)%vals(MemoryStart(1):MemoryEnd(1), & MemoryStart(2):MemoryEnd(2),MemoryStart(3):MemoryEnd(3))) endif if (DateStr .NE. & geopotential(this_domain)%lastDateStr) then geopotential(this_domain)%newtime = .true. endif if (geopotential(this_domain)%newtime) then geopotential(this_domain)%vals = Field(1,:,:,:) geopotential(this_domain)%newtime = .false. output = .false. else output = .true. endif geopotential(this_domain)%lastDateStr=DateStr endif #endif if (output) then if (StartDate == '') then StartDate = DateStr endif CALL geth_idts(DateStr,StartDate,fcst_secs) if (center_lat .lt. 0) then proj_center_flag = 2 else proj_center_flag = 1 endif do z = 1, zsize SELECT CASE (MemoryOrder) CASE ('XYZ') data = Field(1,1:xsize,1:ysize,z) CASE ('XZY') data = Field(1,1:xsize,z,1:ysize) CASE ('YXZ') do x = 1,xsize do y = 1,ysize data(x,y) = Field(1,y,x,z) enddo enddo CASE ('YZX') do x = 1,xsize do y = 1,ysize data(x,y) = Field(1,y,z,x) enddo enddo CASE ('ZXY') data = Field(1,z,1:xsize,1:ysize) CASE ('ZYX') do x = 1,xsize do y = 1,ysize data(x,y) = Field(1,z,y,x) enddo enddo CASE ('XY') data = Field(1,1:xsize,1:ysize,1) CASE ('YX') do x = 1,xsize do y = 1,ysize data(x,y) = Field(1,y,x,1) enddo enddo CASE ('XSZ') do x = 1,xsize do y = 1,ysize data(x,y) = Field(1,y,z,x) enddo enddo CASE ('XEZ') do x = 1,xsize do y = 1,ysize data(x,y) = Field(1,y,z,x) enddo enddo CASE ('YSZ') do x = 1,xsize do y = 1,ysize data(x,y) = Field(1,x,z,y) enddo enddo CASE ('YEZ') do x = 1,xsize do y = 1,ysize data(x,y) = Field(1,x,z,y) enddo enddo CASE ('XS') do x = 1,xsize do y = 1,ysize data(x,y) = Field(1,y,x,1) enddo enddo CASE ('XE') do x = 1,xsize do y = 1,ysize data(x,y) = Field(1,y,x,1) enddo enddo CASE ('YS') do x = 1,xsize do y = 1,ysize data(x,y) = Field(1,x,y,1) enddo enddo CASE ('YE') do x = 1,xsize do y = 1,ysize data(x,y) = Field(1,x,y,1) enddo enddo CASE ('Z') data(1,1) = Field(1,z,1,1) CASE ('z') data(1,1) = Field(1,z,1,1) CASE ('C') data = Field(1,1:xsize,1:ysize,z) CASE ('c') data = Field(1,1:xsize,1:ysize,z) CASE ('0') data(1,1) = Field(1,1,1,1) END SELECT ! ! Here, we convert any integer fields to real ! if (FieldType == WRF_INTEGER) then mold = 0 do idx=1,xsize ! ! The parentheses around data(idx,:) are needed in order ! to fix a bug with transfer with the xlf compiler on NCAR's ! IBM (bluesky). ! data(idx,:)=transfer((data(idx,:)),mold) enddo endif ! ! Here, we do any necessary conversions to the data. ! ! Potential temperature is sometimes passed in as perturbation ! potential temperature (i.e., POT-300). Other times (i.e., from ! WRF SI), it is passed in as full potential temperature. ! Here, we convert to full potential temperature by adding 300 ! only if POT < 200 K. ! if (OutName == 'T') then if (data(1,1) < 200) then data = data + 300 endif endif ! ! For precip, we setup the accumulation period, and output a precip ! rate for time-step precip. ! if (OutName .eq. 'RAINNCV') then ! Convert time-step precip to precip rate. data = data/timestep accum_period = 0 else accum_period = 0 endif #ifdef OUTPUT_FULL_PRESSURE ! ! Computation of full-pressure off by default since there are ! uses for base-state and perturbation (i.e., restarts ! if ((OutName .eq. 'P') .or. (OutName.eq.'PB')) then if (idx3 .eq. 1) then data = data + & pressure(this_domain)%vals(z, & patchstart(2):patchend(2),patchstart(3):patchend(3)) elseif (idx3 .eq. 2) then data = data + & pressure(this_domain)%vals(patchstart(1):patchend(1), & z,patchstart(3):patchend(3)) elseif (idx3 .eq. 3) then data = data + & pressure(this_domain)%vals(patchstart(1):patchend(1), & patchstart(2):patchend(2),z) else call wrf_message ('error in idx3, continuing') endif OutName = 'P' endif #endif #ifdef OUTPUT_FULL_GEOPOTENTIAL ! ! Computation of full-geopotential off by default since there are ! uses for base-state and perturbation (i.e., restarts ! if ((OutName .eq. 'PHB') .or. (OutName.eq.'PH')) then if (idx3 .eq. 1) then data = data + & geopotential(this_domain)%vals(z, & patchstart(2):patchend(2),patchstart(3):patchend(3)) elseif (idx3 .eq. 2) then data = data + & geopotential(this_domain)%vals(patchstart(1):patchend(1), & z,patchstart(3):patchend(3)) elseif (idx3 .eq. 3) then data = data + & geopotential(this_domain)%vals(patchstart(1):patchend(1), & patchstart(2):patchend(2),z) else call wrf_message ('error in idx3, continuing') endif OutName = 'PHP' endif #endif ! ! Output current level ! CALL load_grid_info(OutName, StartDate, vert_unit, level1(z), & level2(z), fcst_secs, accum_period, wg_grid_id, projection, & xsize, ysize, region_center_lat, region_center_lon, dx, dy, & proj_central_lon, proj_center_flag, truelat1, truelat2, & grib_tables, grid_info) ! ! Here, we copy data to a temporary array. After write_grib, ! we copy back from the temporary array to the permanent ! array. write_grib modifies data. For certain fields that ! we use below, we want the original (unmodified) data ! values. This kludge assures that we have the original ! values. ! if ((OutName .eq. 'RAINC') .or. (OutName .eq. 'RAINNC') .or. & (OutName .eq. 'SNOWH')) then tmpdata(:,:) = data(:,:) endif CALL write_grib(grid_info, FileFd(DataHandle), data) if ((OutName .eq. 'RAINC') .or. (OutName .eq. 'RAINNC') .or. & (OutName .eq. 'SNOWH')) then data(:,:) = tmpdata(:,:) endif CALL free_grid_info(grid_info) ! ! If this is the total accumulated rain, call write_grib again ! to output the accumulation since the last output time as well. ! This is somewhat of a kludge to meet the requirements of PF. ! if ((OutName .eq. 'RAINC') .or. (OutName .eq. 'RAINNC') .or. & (OutName .eq. 'SNOWH')) then if (OutName .eq. 'RAINC') then data(:,:) = data(:,:) - lastdata(this_domain)%rainc(:,:) lastdata(this_domain)%rainc(:,:) = tmpdata(:,:) accum_period = fcst_secs - & lastdata(this_domain)%fcst_secs_rainc lastdata(this_domain)%fcst_secs_rainc = fcst_secs TmpVarName = 'ACPCP' else if (OutName .eq. 'RAINNC') then tmpdata(:,:) = data(:,:) data(:,:) = data(:,:) - lastdata(this_domain)%rainnc(:,:) lastdata(this_domain)%rainnc(:,:) = tmpdata(:,:) accum_period = fcst_secs - & lastdata(this_domain)%fcst_secs_rainnc lastdata(this_domain)%fcst_secs_rainnc = fcst_secs TmpVarName = 'NCPCP' else if (OutName .eq. 'SNOWH') then if (fcst_secs .eq. 0) then firstdata(this_domain)%snod(:,:) = data(:,:) endif data(:,:) = data(:,:) - firstdata(this_domain)%snod(:,:) TmpVarName = 'SNOWCU' endif CALL load_grid_info(TmpVarName, StartDate, vert_unit, level1(z),& level2(z), fcst_secs, accum_period, wg_grid_id, & projection, xsize, ysize, region_center_lat, & region_center_lon, dx, dy, proj_central_lon, & proj_center_flag, truelat1, truelat2, grib_tables, & grid_info) CALL write_grib(grid_info, FileFd(DataHandle), data) CALL free_grid_info(grid_info) endif enddo endif endif deallocate(data, STAT = istat) deallocate(mold, STAT = istat) deallocate(tmpdata, STAT = istat) Status = WRF_NO_ERR call wrf_debug ( DEBUG , 'Leaving ext_gr1_write_field') RETURN END SUBROUTINE ext_gr1_write_field !***************************************************************************** SUBROUTINE ext_gr1_read_field ( DataHandle , DateStr , VarName , Field , &,10 FieldType , Comm , IOComm, DomainDesc , MemoryOrder , Stagger , & DimNames , DomainStart , DomainEnd , MemoryStart , MemoryEnd , & PatchStart , PatchEnd , Status ) USE gr1_data_info IMPLICIT NONE #include "wrf_status_codes.h" #include "wrf_io_flags.h" INTEGER , INTENT(IN) :: DataHandle CHARACTER*(*) :: DateStr CHARACTER*(*) :: VarName CHARACTER (len=400) :: msg integer ,intent(inout) :: FieldType integer ,intent(inout) :: Comm integer ,intent(inout) :: IOComm integer ,intent(inout) :: DomainDesc character*(*) ,intent(inout) :: MemoryOrder character*(*) ,intent(inout) :: Stagger character*(*) , dimension (*) ,intent(inout) :: DimNames integer ,dimension(*) ,intent(inout) :: DomainStart, DomainEnd integer ,dimension(*) ,intent(inout) :: MemoryStart, MemoryEnd integer ,dimension(*) ,intent(inout) :: PatchStart, PatchEnd integer ,intent(out) :: Status INTEGER ,intent(out) :: Field(*) integer :: ndim,x_start,x_end,y_start,y_end,z_start,z_end integer :: zidx REAL, DIMENSION(:,:), POINTER :: data logical :: vert_stag logical :: soil_layers integer :: level1,level2 integer :: parmid integer :: vert_unit integer :: grb_index integer :: numcols, numrows integer :: data_allocated integer :: istat integer :: tablenum integer :: di integer :: last_grb_index call wrf_debug ( DEBUG , 'Entering ext_gr1_read_field') ! ! Get dimensions of data. ! Assume that the domain size in the input data is the same as the Domain ! Size from the input arguments. ! CALL get_dims(MemoryOrder,DomainStart,DomainEnd,ndim,x_start,x_end,y_start, & y_end,z_start,z_end) ! ! Get grib parameter id ! CALL GET_GRIB_PARAM(grib_tables, VarName, center, subcenter, parmtbl, & tablenum, parmid) ! ! Setup the vertical unit and levels ! CALL get_vert_stag(VarName,Stagger,vert_stag) CALL get_soil_layers(VarName,soil_layers) ! ! Loop over levels, grabbing data from each level, then assembling into a ! 3D array. ! data_allocated = 0 last_grb_index = -1 do zidx = z_start,z_end CALL gr1_get_levels(VarName,zidx,z_end-z_start,soil_layers,vert_stag, & .false., vert_unit,level1,level2) CALL GET_GRIB_INDEX_VALIDTIME_GUESS(fileinfo(DataHandle)%fileindex(:), center, & subcenter, parmtbl, parmid,DateStr,vert_unit,level1, & level2, last_grb_index + 1, grb_index) if (grb_index < 0) then write(msg,*)'Field not found: parmid: ',VarName,parmid,DateStr, & vert_unit,level1,level2 call wrf_debug (DEBUG , msg) cycle endif if (data_allocated .eq. 0) then CALL GET_SIZEOF_GRID(fileinfo(DataHandle)%fileindex(:),grb_index,numcols,numrows) allocate(data(z_start:z_end,1:numcols*numrows),stat=istat) data_allocated = 1 endif CALL READ_GRIB(fileinfo(DataHandle)%fileindex(:), FileFd(DataHandle), grb_index, & data(zidx,:)) ! ! Transpose data into the order specified by MemoryOrder, setting only ! entries within the memory dimensions ! CALL get_dims(MemoryOrder, MemoryStart, MemoryEnd, ndim, x_start, x_end, & y_start, y_end,z_start,z_end) if(FieldType == WRF_DOUBLE) then di = 2 else di = 1 endif ! ! Here, we do any necessary conversions to the data. ! ! The WRF executable (wrf.exe) expects perturbation potential ! temperature. However, real.exe expects full potential T. ! So, if the program is WRF, subtract 300 from Potential Temperature ! to get perturbation potential temperature. ! if (VarName == 'T') then if ( & (InputProgramName .eq. 'REAL_EM') .or. & (InputProgramName .eq. 'IDEAL') .or. & (InputProgramName .eq. 'NDOWN_EM')) then data(zidx,:) = data(zidx,:) - 300 endif endif CALL Transpose_grib(MemoryOrder, di, FieldType, Field, & MemoryStart(1), MemoryEnd(1), MemoryStart(2), MemoryEnd(2), & MemoryStart(3), MemoryEnd(3), & data(zidx,:), zidx, numrows, numcols) if (zidx .eq. z_end) then data_allocated = 0 deallocate(data) endif last_grb_index = grb_index enddo Status = WRF_NO_ERR if (grb_index < 0) Status = WRF_WARN_VAR_NF call wrf_debug ( DEBUG , 'Leaving ext_gr1_read_field') RETURN END SUBROUTINE ext_gr1_read_field !***************************************************************************** SUBROUTINE ext_gr1_get_next_var ( DataHandle, VarName, Status ) 1,3 USE gr1_data_info IMPLICIT NONE #include "wrf_status_codes.h" INTEGER , INTENT(IN) :: DataHandle CHARACTER*(*) :: VarName INTEGER , INTENT(OUT) :: Status call wrf_debug ( DEBUG , 'Entering ext_gr1_get_next_var') call wrf_message ( 'WARNING: ext_gr1_get_next_var is not supported.') Status = WRF_WARN_NOOP RETURN END SUBROUTINE ext_gr1_get_next_var !***************************************************************************** subroutine ext_gr1_end_of_frame(DataHandle, Status),2 USE gr1_data_info implicit none #include "wrf_status_codes.h" integer ,intent(in) :: DataHandle integer ,intent(out) :: Status call wrf_debug ( DEBUG , 'Entering ext_gr1_end_of_frame') Status = WRF_WARN_NOOP return end subroutine ext_gr1_end_of_frame !***************************************************************************** SUBROUTINE ext_gr1_iosync ( DataHandle, Status ) 2,2 USE gr1_data_info IMPLICIT NONE #include "wrf_status_codes.h" INTEGER , INTENT(IN) :: DataHandle INTEGER , INTENT(OUT) :: Status call wrf_debug ( DEBUG , 'Entering ext_gr1_iosync') Status = WRF_NO_ERR if (DataHandle .GT. 0) then CALL flush_file(FileFd(DataHandle)) else Status = WRF_WARN_TOO_MANY_FILES endif RETURN END SUBROUTINE ext_gr1_iosync !***************************************************************************** SUBROUTINE ext_gr1_inquire_filename ( DataHandle, FileName , FileStat, & 5,2 Status ) USE gr1_data_info IMPLICIT NONE #include "wrf_status_codes.h" #include "wrf_io_flags.h" INTEGER , INTENT(IN) :: DataHandle CHARACTER*(*) :: FileName INTEGER , INTENT(OUT) :: FileStat INTEGER , INTENT(OUT) :: Status CHARACTER *80 SysDepInfo call wrf_debug ( DEBUG , 'Entering ext_gr1_inquire_filename') FileName = DataFile(DataHandle) if ((DataHandle .ge. firstFileHandle) .and. & (DataHandle .le. maxFileHandles)) then FileStat = FileStatus(DataHandle) else FileStat = WRF_FILE_NOT_OPENED endif Status = WRF_NO_ERR RETURN END SUBROUTINE ext_gr1_inquire_filename !***************************************************************************** SUBROUTINE ext_gr1_get_var_info ( DataHandle , VarName , NDim , & 1,3 MemoryOrder , Stagger , DomainStart , DomainEnd , WrfType, Status ) USE gr1_data_info IMPLICIT NONE #include "wrf_status_codes.h" integer ,intent(in) :: DataHandle character*(*) ,intent(in) :: VarName integer ,intent(out) :: NDim character*(*) ,intent(out) :: MemoryOrder character*(*) ,intent(out) :: Stagger integer ,dimension(*) ,intent(out) :: DomainStart, DomainEnd integer ,intent(out) :: WrfType integer ,intent(out) :: Status call wrf_debug ( DEBUG , 'Entering ext_gr1_get_var_info') CALL wrf_message('ext_gr1_get_var_info not supported for grib version1 data') Status = WRF_NO_ERR RETURN END SUBROUTINE ext_gr1_get_var_info !***************************************************************************** SUBROUTINE ext_gr1_set_time ( DataHandle, DateStr, Status ) 1,2 USE gr1_data_info IMPLICIT NONE #include "wrf_status_codes.h" INTEGER , INTENT(IN) :: DataHandle CHARACTER*(*) :: DateStr INTEGER , INTENT(OUT) :: Status integer :: found_time integer :: idx call wrf_debug ( DEBUG , 'Entering ext_gr1_set_time') found_time = 0 do idx = 1,fileinfo(DataHandle)%NumberTimes if (fileinfo(DataHandle)%Times(idx) == DateStr) then found_time = 1 fileinfo(DataHandle)%CurrentTime = idx endif enddo if (found_time == 0) then Status = WRF_WARN_TIME_NF else Status = WRF_NO_ERR endif RETURN END SUBROUTINE ext_gr1_set_time !***************************************************************************** SUBROUTINE ext_gr1_get_next_time ( DataHandle, DateStr, Status ) 1,2 USE gr1_data_info IMPLICIT NONE #include "wrf_status_codes.h" INTEGER , INTENT(IN) :: DataHandle CHARACTER*(*) , INTENT(OUT) :: DateStr INTEGER , INTENT(OUT) :: Status call wrf_debug ( DEBUG , 'Entering ext_gr1_get_next_time') if (fileinfo(DataHandle)%CurrentTime == fileinfo(DataHandle)%NumberTimes) then Status = WRF_WARN_TIME_EOF else fileinfo(DataHandle)%CurrentTime = fileinfo(DataHandle)%CurrentTime + 1 DateStr = fileinfo(DataHandle)%Times(fileinfo(DataHandle)%CurrentTime) Status = WRF_NO_ERR endif RETURN END SUBROUTINE ext_gr1_get_next_time !***************************************************************************** SUBROUTINE ext_gr1_get_previous_time ( DataHandle, DateStr, Status ) 1,2 USE gr1_data_info IMPLICIT NONE #include "wrf_status_codes.h" INTEGER , INTENT(IN) :: DataHandle CHARACTER*(*) :: DateStr INTEGER , INTENT(OUT) :: Status call wrf_debug ( DEBUG , 'Entering ext_gr1_get_previous_time') if (fileinfo(DataHandle)%CurrentTime <= 0) then Status = WRF_WARN_TIME_EOF else fileinfo(DataHandle)%CurrentTime = fileinfo(DataHandle)%CurrentTime - 1 DateStr = fileinfo(DataHandle)%Times(fileinfo(DataHandle)%CurrentTime) Status = WRF_NO_ERR endif RETURN END SUBROUTINE ext_gr1_get_previous_time !****************************************************************************** !* Start of get_var_ti_* routines !****************************************************************************** SUBROUTINE ext_gr1_get_var_ti_real ( DataHandle,Element, Varname, Data, &,4 Count, Outcount, Status ) USE gr1_data_info IMPLICIT NONE #include "wrf_status_codes.h" INTEGER , INTENT(IN) :: DataHandle CHARACTER*(*) :: Element CHARACTER*(*) :: VarName real , INTENT(OUT) :: Data(*) INTEGER , INTENT(IN) :: Count INTEGER , INTENT(OUT) :: OutCount INTEGER , INTENT(OUT) :: Status INTEGER :: idx INTEGER :: stat CHARACTER*(1000) :: VALUE call wrf_debug ( DEBUG , 'Entering ext_gr1_get_var_ti_real') Status = WRF_NO_ERR CALL GET_METADATA_VALUE(fileinfo(DataHandle)%fileindex(:), TRIM(Element), "none", & Varname, Value, stat) if (stat /= 0) then CALL wrf_debug ( DEBUG , "GET_METADATA_VALUE failed for "//Element) Status = WRF_WARN_VAR_NF RETURN endif READ(Value,*,IOSTAT=stat)(Data(idx),idx=1,Count) if (stat .ne. 0) then CALL wrf_message("Reading data from"//Value//"failed") Status = WRF_WARN_COUNT_TOO_LONG RETURN endif Outcount = idx RETURN END SUBROUTINE ext_gr1_get_var_ti_real !***************************************************************************** SUBROUTINE ext_gr1_get_var_ti_real8 ( DataHandle,Element, Varname, Data, &,4 Count, Outcount, Status ) USE gr1_data_info IMPLICIT NONE #include "wrf_status_codes.h" INTEGER , INTENT(IN) :: DataHandle CHARACTER*(*) :: Element CHARACTER*(*) :: VarName real*8 , INTENT(OUT) :: Data(*) INTEGER , INTENT(IN) :: Count INTEGER , INTENT(OUT) :: OutCount INTEGER , INTENT(OUT) :: Status INTEGER :: idx INTEGER :: stat CHARACTER*(1000) :: VALUE call wrf_debug ( DEBUG , 'Entering ext_gr1_get_var_ti_real8') Status = WRF_NO_ERR CALL GET_METADATA_VALUE(fileinfo(DataHandle)%fileindex(:),TRIM(Element),& "none",Varname,Value,stat) if (stat /= 0) then CALL wrf_debug ( DEBUG , "GET_METADATA_VALUE failed for "//Element) Status = WRF_WARN_VAR_NF RETURN endif READ(Value,*,IOSTAT=stat)(Data(idx),idx=1,Count) if (stat .ne. 0) then CALL wrf_message("Reading data from"//Value//"failed") Status = WRF_WARN_COUNT_TOO_LONG RETURN endif Outcount = idx RETURN END SUBROUTINE ext_gr1_get_var_ti_real8 !***************************************************************************** SUBROUTINE ext_gr1_get_var_ti_double ( DataHandle,Element, Varname, Data, &,4 Count, Outcount, Status ) USE gr1_data_info IMPLICIT NONE #include "wrf_status_codes.h" INTEGER , INTENT(IN) :: DataHandle CHARACTER*(*) , INTENT(IN) :: Element CHARACTER*(*) , INTENT(IN) :: VarName real*8 , INTENT(OUT) :: Data(*) INTEGER , INTENT(IN) :: Count INTEGER , INTENT(OUT) :: OutCount INTEGER , INTENT(OUT) :: Status INTEGER :: idx INTEGER :: stat CHARACTER*(1000) :: VALUE call wrf_debug ( DEBUG , 'Entering ext_gr1_get_var_ti_double') Status = WRF_NO_ERR CALL GET_METADATA_VALUE(fileinfo(DataHandle)%fileindex(:), TRIM(Element), & "none", Varname, & Value,stat) if (stat /= 0) then CALL wrf_debug ( DEBUG , "GET_METADATA_VALUE failed for "//Element) Status = WRF_WARN_VAR_NF RETURN endif READ(Value,*,IOSTAT=stat)(Data(idx),idx=1,Count) if (stat .ne. 0) then CALL wrf_message("Reading data from"//Value//"failed") Status = WRF_WARN_COUNT_TOO_LONG RETURN endif Outcount = idx RETURN END SUBROUTINE ext_gr1_get_var_ti_double !***************************************************************************** SUBROUTINE ext_gr1_get_var_ti_integer ( DataHandle,Element, Varname, Data, &,4 Count, Outcount, Status ) USE gr1_data_info IMPLICIT NONE #include "wrf_status_codes.h" INTEGER , INTENT(IN) :: DataHandle CHARACTER*(*) :: Element CHARACTER*(*) :: VarName integer , INTENT(OUT) :: Data(*) INTEGER , INTENT(IN) :: Count INTEGER , INTENT(OUT) :: OutCount INTEGER , INTENT(OUT) :: Status INTEGER :: idx INTEGER :: stat CHARACTER*(1000) :: VALUE call wrf_debug ( DEBUG , 'Entering ext_gr1_get_var_ti_integer') Status = WRF_NO_ERR CALL GET_METADATA_VALUE(fileinfo(DataHandle)%fileindex(:), TRIM(Element), & "none", Varname, Value, stat) if (stat /= 0) then CALL wrf_debug ( DEBUG , "GET_METADATA_VALUE failed for "//Element) Status = WRF_WARN_VAR_NF RETURN endif READ(Value,*,IOSTAT=stat)(Data(idx),idx=1,Count) if (stat .ne. 0) then CALL wrf_message("Reading data from"//Value//"failed") Status = WRF_WARN_COUNT_TOO_LONG RETURN endif Outcount = idx RETURN END SUBROUTINE ext_gr1_get_var_ti_integer !***************************************************************************** SUBROUTINE ext_gr1_get_var_ti_logical ( DataHandle,Element, Varname, Data, &,4 Count, Outcount, Status ) USE gr1_data_info IMPLICIT NONE #include "wrf_status_codes.h" INTEGER , INTENT(IN) :: DataHandle CHARACTER*(*) :: Element CHARACTER*(*) :: VarName logical , INTENT(OUT) :: Data(*) INTEGER , INTENT(IN) :: Count INTEGER , INTENT(OUT) :: OutCount INTEGER , INTENT(OUT) :: Status INTEGER :: idx INTEGER :: stat CHARACTER*(1000) :: VALUE call wrf_debug ( DEBUG , 'Entering ext_gr1_get_var_ti_logical') Status = WRF_NO_ERR CALL GET_METADATA_VALUE(fileinfo(DataHandle)%fileindex(:), TRIM(Element), & "none", Varname, Value,stat) if (stat /= 0) then CALL wrf_debug ( DEBUG , "GET_METADATA_VALUE failed for "//Element) Status = WRF_WARN_VAR_NF RETURN endif READ(Value,*,IOSTAT=stat)(Data(idx),idx=1,Count) if (stat .ne. 0) then CALL wrf_message("Reading data from"//Value//"failed") Status = WRF_WARN_COUNT_TOO_LONG RETURN endif Outcount = idx RETURN END SUBROUTINE ext_gr1_get_var_ti_logical !***************************************************************************** SUBROUTINE ext_gr1_get_var_ti_char ( DataHandle,Element, Varname, Data, &,3 Status ) USE gr1_data_info IMPLICIT NONE #include "wrf_status_codes.h" INTEGER , INTENT(IN) :: DataHandle CHARACTER*(*) :: Element CHARACTER*(*) :: VarName CHARACTER*(*) :: Data INTEGER , INTENT(OUT) :: Status INTEGER :: stat Status = WRF_NO_ERR call wrf_debug ( DEBUG , 'Entering ext_gr1_get_var_ti_char') CALL GET_METADATA_VALUE(fileinfo(DataHandle)%fileindex(:), TRIM(Element), & "none", Varname, Data,stat) if (stat /= 0) then CALL wrf_debug ( DEBUG , "GET_METADATA_VALUE failed for "//Element) Status = WRF_WARN_VAR_NF RETURN endif RETURN END SUBROUTINE ext_gr1_get_var_ti_char !****************************************************************************** !* End of get_var_ti_* routines !****************************************************************************** !****************************************************************************** !* Start of put_var_ti_* routines !****************************************************************************** SUBROUTINE ext_gr1_put_var_ti_real ( DataHandle,Element, Varname, Data, &,3 Count, Status ) USE gr1_data_info IMPLICIT NONE #include "wrf_status_codes.h" INTEGER , INTENT(IN) :: DataHandle CHARACTER*(*) :: Element CHARACTER*(*) :: VarName real , INTENT(IN) :: Data(*) INTEGER , INTENT(IN) :: Count INTEGER , INTENT(OUT) :: Status CHARACTER(len=1000) :: tmpstr(1000) INTEGER :: idx call wrf_debug ( DEBUG , 'Entering ext_gr1_put_var_ti_real') if (committed(DataHandle)) then do idx = 1,Count write(tmpstr(idx),'(G17.10)')Data(idx) enddo CALL gr1_build_string (ti_output(DataHandle), Element, tmpstr, Count, Status) endif RETURN END SUBROUTINE ext_gr1_put_var_ti_real !***************************************************************************** SUBROUTINE ext_gr1_put_var_ti_double ( DataHandle,Element, Varname, Data, &,3 Count, Status ) USE gr1_data_info IMPLICIT NONE #include "wrf_status_codes.h" INTEGER , INTENT(IN) :: DataHandle CHARACTER*(*) , INTENT(IN) :: Element CHARACTER*(*) , INTENT(IN) :: VarName real*8 , INTENT(IN) :: Data(*) INTEGER , INTENT(IN) :: Count INTEGER , INTENT(OUT) :: Status CHARACTER(len=1000) :: tmpstr(1000) INTEGER :: idx call wrf_debug ( DEBUG , 'Entering ext_gr1_put_var_ti_double') if (committed(DataHandle)) then do idx = 1,Count write(tmpstr(idx),'(G17.10)')Data(idx) enddo CALL gr1_build_string (ti_output(DataHandle), Element, tmpstr, Count, Status) endif RETURN END SUBROUTINE ext_gr1_put_var_ti_double !***************************************************************************** SUBROUTINE ext_gr1_put_var_ti_real8 ( DataHandle,Element, Varname, Data, &,3 Count, Status ) USE gr1_data_info IMPLICIT NONE #include "wrf_status_codes.h" INTEGER , INTENT(IN) :: DataHandle CHARACTER*(*) :: Element CHARACTER*(*) :: VarName real*8 , INTENT(IN) :: Data(*) INTEGER , INTENT(IN) :: Count INTEGER , INTENT(OUT) :: Status CHARACTER(len=1000) :: tmpstr(1000) INTEGER :: idx call wrf_debug ( DEBUG , 'Entering ext_gr1_put_var_ti_real8') if (committed(DataHandle)) then do idx = 1,Count write(tmpstr(idx),'(G17.10)')Data(idx) enddo CALL gr1_build_string (ti_output(DataHandle), Element, tmpstr, Count, Status) endif RETURN END SUBROUTINE ext_gr1_put_var_ti_real8 !***************************************************************************** SUBROUTINE ext_gr1_put_var_ti_integer ( DataHandle,Element, Varname, Data, &,3 Count, Status ) USE gr1_data_info IMPLICIT NONE #include "wrf_status_codes.h" INTEGER , INTENT(IN) :: DataHandle CHARACTER*(*) :: Element CHARACTER*(*) :: VarName integer , INTENT(IN) :: Data(*) INTEGER , INTENT(IN) :: Count INTEGER , INTENT(OUT) :: Status CHARACTER(len=1000) :: tmpstr(1000) INTEGER :: idx call wrf_debug ( DEBUG , 'Entering ext_gr1_put_var_ti_integer') if (committed(DataHandle)) then do idx = 1,Count write(tmpstr(idx),'(G17.10)')Data(idx) enddo CALL gr1_build_string (ti_output(DataHandle), Element, tmpstr, Count, Status) endif RETURN END SUBROUTINE ext_gr1_put_var_ti_integer !***************************************************************************** SUBROUTINE ext_gr1_put_var_ti_logical ( DataHandle,Element, Varname, Data, &,3 Count, Status ) USE gr1_data_info IMPLICIT NONE #include "wrf_status_codes.h" INTEGER , INTENT(IN) :: DataHandle CHARACTER*(*) :: Element CHARACTER*(*) :: VarName logical , INTENT(IN) :: Data(*) INTEGER , INTENT(IN) :: Count INTEGER , INTENT(OUT) :: Status CHARACTER(len=1000) :: tmpstr(1000) INTEGER :: idx call wrf_debug ( DEBUG , 'Entering ext_gr1_put_var_ti_logical') if (committed(DataHandle)) then do idx = 1,Count write(tmpstr(idx),'(G17.10)')Data(idx) enddo CALL gr1_build_string (ti_output(DataHandle), Element, tmpstr, Count, Status) endif RETURN END SUBROUTINE ext_gr1_put_var_ti_logical !***************************************************************************** SUBROUTINE ext_gr1_put_var_ti_char ( DataHandle,Element, Varname, Data, & 2,3 Status ) USE gr1_data_info IMPLICIT NONE #include "wrf_status_codes.h" INTEGER , INTENT(IN) :: DataHandle CHARACTER(len=*) :: Element CHARACTER(len=*) :: VarName CHARACTER(len=*) :: Data INTEGER , INTENT(OUT) :: Status REAL dummy INTEGER :: Count CHARACTER(len=1000) :: tmpstr(1) INTEGER :: idx call wrf_debug ( DEBUG , 'Entering ext_gr1_put_var_ti_char') if (committed(DataHandle)) then write(tmpstr(1),*)trim(Data) CALL gr1_build_string (ti_output(DataHandle), Element, tmpstr, 1, Status) endif RETURN END SUBROUTINE ext_gr1_put_var_ti_char !****************************************************************************** !* End of put_var_ti_* routines !****************************************************************************** !****************************************************************************** !* Start of get_var_td_* routines !****************************************************************************** SUBROUTINE ext_gr1_get_var_td_double ( DataHandle,Element, DateStr, &,4 Varname, Data, Count, Outcount, Status ) USE gr1_data_info IMPLICIT NONE #include "wrf_status_codes.h" INTEGER , INTENT(IN) :: DataHandle CHARACTER*(*) , INTENT(IN) :: Element CHARACTER*(*) , INTENT(IN) :: DateStr CHARACTER*(*) , INTENT(IN) :: VarName real*8 , INTENT(OUT) :: Data(*) INTEGER , INTENT(IN) :: Count INTEGER , INTENT(OUT) :: OutCount INTEGER , INTENT(OUT) :: Status INTEGER :: idx INTEGER :: stat CHARACTER*(1000) :: VALUE call wrf_debug ( DEBUG , 'Entering ext_gr1_get_var_td_double') Status = WRF_NO_ERR CALL GET_METADATA_VALUE(fileinfo(DataHandle)%fileindex(:),TRIM(Element),DateStr,& Varname,Value,stat) if (stat /= 0) then CALL wrf_debug ( DEBUG , "GET_METADATA_VALUE failed for "//Element) Status = WRF_WARN_VAR_NF RETURN endif READ(Value,*,IOSTAT=stat)(Data(idx),idx=1,Count) if (stat .ne. 0) then CALL wrf_message("Reading data from"//Value//"failed") Status = WRF_WARN_COUNT_TOO_LONG RETURN endif Outcount = idx RETURN END SUBROUTINE ext_gr1_get_var_td_double !***************************************************************************** SUBROUTINE ext_gr1_get_var_td_real ( DataHandle,Element, DateStr,Varname, &,4 Data, Count, Outcount, Status ) USE gr1_data_info IMPLICIT NONE #include "wrf_status_codes.h" INTEGER , INTENT(IN) :: DataHandle CHARACTER*(*) :: Element CHARACTER*(*) :: DateStr CHARACTER*(*) :: VarName real , INTENT(OUT) :: Data(*) INTEGER , INTENT(IN) :: Count INTEGER , INTENT(OUT) :: OutCount INTEGER , INTENT(OUT) :: Status INTEGER :: idx INTEGER :: stat CHARACTER*(1000) :: VALUE call wrf_debug ( DEBUG , 'Entering ext_gr1_get_var_td_real') Status = WRF_NO_ERR CALL GET_METADATA_VALUE(fileinfo(DataHandle)%fileindex(:), TRIM(Element), DateStr, & Varname, Value, stat) if (stat /= 0) then CALL wrf_debug ( DEBUG , "GET_METADATA_VALUE failed for "//Element) Status = WRF_WARN_VAR_NF RETURN endif READ(Value,*,IOSTAT=stat)(Data(idx),idx=1,Count) if (stat .ne. 0) then CALL wrf_message("Reading data from"//Value//"failed") Status = WRF_WARN_COUNT_TOO_LONG RETURN endif Outcount = idx RETURN END SUBROUTINE ext_gr1_get_var_td_real !***************************************************************************** SUBROUTINE ext_gr1_get_var_td_real8 ( DataHandle,Element, DateStr,Varname, &,4 Data, Count, Outcount, Status ) USE gr1_data_info IMPLICIT NONE #include "wrf_status_codes.h" INTEGER , INTENT(IN) :: DataHandle CHARACTER*(*) :: Element CHARACTER*(*) :: DateStr CHARACTER*(*) :: VarName real*8 , INTENT(OUT) :: Data(*) INTEGER , INTENT(IN) :: Count INTEGER , INTENT(OUT) :: OutCount INTEGER , INTENT(OUT) :: Status INTEGER :: idx INTEGER :: stat CHARACTER*(1000) :: VALUE call wrf_debug ( DEBUG , 'Entering ext_gr1_get_var_td_real8') Status = WRF_NO_ERR CALL GET_METADATA_VALUE(fileinfo(DataHandle)%fileindex(:),TRIM(Element),DateStr,& Varname,Value,stat) if (stat /= 0) then CALL wrf_debug ( DEBUG , "GET_METADATA_VALUE failed for "//Element) Status = WRF_WARN_VAR_NF RETURN endif READ(Value,*,IOSTAT=stat)(Data(idx),idx=1,Count) if (stat .ne. 0) then CALL wrf_message("Reading data from"//Value//"failed") Status = WRF_WARN_COUNT_TOO_LONG RETURN endif Outcount = idx RETURN END SUBROUTINE ext_gr1_get_var_td_real8 !***************************************************************************** SUBROUTINE ext_gr1_get_var_td_integer ( DataHandle,Element, DateStr,Varname, &,4 Data, Count, Outcount, Status ) USE gr1_data_info IMPLICIT NONE #include "wrf_status_codes.h" INTEGER , INTENT(IN) :: DataHandle CHARACTER*(*) :: Element CHARACTER*(*) :: DateStr CHARACTER*(*) :: VarName integer , INTENT(OUT) :: Data(*) INTEGER , INTENT(IN) :: Count INTEGER , INTENT(OUT) :: OutCount INTEGER , INTENT(OUT) :: Status INTEGER :: idx INTEGER :: stat CHARACTER*(1000) :: VALUE call wrf_debug ( DEBUG , 'Entering ext_gr1_get_var_td_integer') Status = WRF_NO_ERR CALL GET_METADATA_VALUE(fileinfo(DataHandle)%fileindex(:), TRIM(Element), DateStr, & Varname, Value,stat) if (stat /= 0) then CALL wrf_debug ( DEBUG , "GET_METADATA_VALUE failed for "//Element) Status = WRF_WARN_VAR_NF RETURN endif READ(Value,*,IOSTAT=stat)(Data(idx),idx=1,Count) if (stat .ne. 0) then CALL wrf_message("Reading data from"//Value//"failed") Status = WRF_WARN_COUNT_TOO_LONG RETURN endif Outcount = idx RETURN END SUBROUTINE ext_gr1_get_var_td_integer !***************************************************************************** SUBROUTINE ext_gr1_get_var_td_logical ( DataHandle,Element, DateStr,Varname, &,4 Data, Count, Outcount, Status ) USE gr1_data_info IMPLICIT NONE #include "wrf_status_codes.h" INTEGER , INTENT(IN) :: DataHandle CHARACTER*(*) :: Element CHARACTER*(*) :: DateStr CHARACTER*(*) :: VarName logical , INTENT(OUT) :: Data(*) INTEGER , INTENT(IN) :: Count INTEGER , INTENT(OUT) :: OutCount INTEGER , INTENT(OUT) :: Status INTEGER :: idx INTEGER :: stat CHARACTER*(1000) :: VALUE call wrf_debug ( DEBUG , 'Entering ext_gr1_get_var_td_logical') Status = WRF_NO_ERR CALL GET_METADATA_VALUE(fileinfo(DataHandle)%fileindex(:), TRIM(Element), DateStr, & Varname, Value,stat) if (stat /= 0) then CALL wrf_debug ( DEBUG , "GET_METADATA_VALUE failed for "//Element) Status = WRF_WARN_VAR_NF RETURN endif READ(Value,*,IOSTAT=stat)(Data(idx),idx=1,Count) if (stat .ne. 0) then CALL wrf_message("Reading data from"//Value//"failed") Status = WRF_WARN_COUNT_TOO_LONG RETURN endif Outcount = idx RETURN END SUBROUTINE ext_gr1_get_var_td_logical !***************************************************************************** SUBROUTINE ext_gr1_get_var_td_char ( DataHandle,Element, DateStr,Varname, &,3 Data, Status ) USE gr1_data_info IMPLICIT NONE #include "wrf_status_codes.h" INTEGER , INTENT(IN) :: DataHandle CHARACTER*(*) :: Element CHARACTER*(*) :: DateStr CHARACTER*(*) :: VarName CHARACTER*(*) :: Data INTEGER , INTENT(OUT) :: Status INTEGER :: stat Status = WRF_NO_ERR call wrf_debug ( DEBUG , 'Entering ext_gr1_get_var_td_char') CALL GET_METADATA_VALUE(fileinfo(DataHandle)%fileindex(:), TRIM(Element), DateStr, & Varname, Data,stat) if (stat /= 0) then CALL wrf_debug ( DEBUG , "GET_METADATA_VALUE failed for "//Element) Status = WRF_WARN_VAR_NF RETURN endif RETURN END SUBROUTINE ext_gr1_get_var_td_char !****************************************************************************** !* End of get_var_td_* routines !****************************************************************************** !****************************************************************************** !* Start of put_var_td_* routines !****************************************************************************** SUBROUTINE ext_gr1_put_var_td_double ( DataHandle, Element, DateStr, Varname, &,3 Data, Count, Status ) USE gr1_data_info IMPLICIT NONE #include "wrf_status_codes.h" INTEGER , INTENT(IN) :: DataHandle CHARACTER*(*) , INTENT(IN) :: Element CHARACTER*(*) , INTENT(IN) :: DateStr CHARACTER*(*) , INTENT(IN) :: VarName real*8 , INTENT(IN) :: Data(*) INTEGER , INTENT(IN) :: Count INTEGER , INTENT(OUT) :: Status CHARACTER(len=1000) :: tmpstr(1000) INTEGER :: idx call wrf_debug ( DEBUG , 'Entering ext_gr1_put_var_td_double') if (committed(DataHandle)) then do idx = 1,Count write(tmpstr(idx),'(G17.10)')Data(idx) enddo CALL gr1_build_string (td_output(DataHandle), & Varname//';'//DateStr//';'//Element, tmpstr, Count, Status) endif RETURN END SUBROUTINE ext_gr1_put_var_td_double !***************************************************************************** SUBROUTINE ext_gr1_put_var_td_integer ( DataHandle,Element, DateStr, &,3 Varname, Data, Count, Status ) USE gr1_data_info IMPLICIT NONE #include "wrf_status_codes.h" INTEGER , INTENT(IN) :: DataHandle CHARACTER*(*) :: Element CHARACTER*(*) :: DateStr CHARACTER*(*) :: VarName integer , INTENT(IN) :: Data(*) INTEGER , INTENT(IN) :: Count INTEGER , INTENT(OUT) :: Status CHARACTER(len=1000) :: tmpstr(1000) INTEGER :: idx call wrf_debug ( DEBUG , 'Entering ext_gr1_put_var_td_integer') if (committed(DataHandle)) then do idx = 1,Count write(tmpstr(idx),'(G17.10)')Data(idx) enddo CALL gr1_build_string (td_output(DataHandle), & Varname//';'//DateStr//';'//Element, tmpstr, Count, Status) endif RETURN END SUBROUTINE ext_gr1_put_var_td_integer !***************************************************************************** SUBROUTINE ext_gr1_put_var_td_real ( DataHandle,Element, DateStr,Varname, &,3 Data, Count, Status ) USE gr1_data_info IMPLICIT NONE #include "wrf_status_codes.h" INTEGER , INTENT(IN) :: DataHandle CHARACTER*(*) :: Element CHARACTER*(*) :: DateStr CHARACTER*(*) :: VarName real , INTENT(IN) :: Data(*) INTEGER , INTENT(IN) :: Count INTEGER , INTENT(OUT) :: Status CHARACTER(len=1000) :: tmpstr(1000) INTEGER :: idx call wrf_debug ( DEBUG , 'Entering ext_gr1_put_var_td_real') if (committed(DataHandle)) then do idx = 1,Count write(tmpstr(idx),'(G17.10)')Data(idx) enddo CALL gr1_build_string (td_output(DataHandle), & Varname//';'//DateStr//';'//Element, tmpstr, Count, Status) endif RETURN END SUBROUTINE ext_gr1_put_var_td_real !***************************************************************************** SUBROUTINE ext_gr1_put_var_td_real8 ( DataHandle,Element, DateStr,Varname, &,3 Data, Count, Status ) USE gr1_data_info IMPLICIT NONE #include "wrf_status_codes.h" INTEGER , INTENT(IN) :: DataHandle CHARACTER*(*) :: Element CHARACTER*(*) :: DateStr CHARACTER*(*) :: VarName real*8 , INTENT(IN) :: Data(*) INTEGER , INTENT(IN) :: Count INTEGER , INTENT(OUT) :: Status CHARACTER(len=1000) :: tmpstr(1000) INTEGER :: idx call wrf_debug ( DEBUG , 'Entering ext_gr1_put_var_td_real8') if (committed(DataHandle)) then do idx = 1,Count write(tmpstr(idx),'(G17.10)')Data(idx) enddo CALL gr1_build_string (td_output(DataHandle), & Varname//';'//DateStr//';'//Element, tmpstr, Count, Status) endif RETURN END SUBROUTINE ext_gr1_put_var_td_real8 !***************************************************************************** SUBROUTINE ext_gr1_put_var_td_logical ( DataHandle,Element, DateStr, &,3 Varname, Data, Count, Status ) USE gr1_data_info IMPLICIT NONE #include "wrf_status_codes.h" INTEGER , INTENT(IN) :: DataHandle CHARACTER*(*) :: Element CHARACTER*(*) :: DateStr CHARACTER*(*) :: VarName logical , INTENT(IN) :: Data(*) INTEGER , INTENT(IN) :: Count INTEGER , INTENT(OUT) :: Status CHARACTER(len=1000) :: tmpstr(1000) INTEGER :: idx call wrf_debug ( DEBUG , 'Entering ext_gr1_put_var_td_logical') if (committed(DataHandle)) then do idx = 1,Count write(tmpstr(idx),'(G17.10)')Data(idx) enddo CALL gr1_build_string (td_output(DataHandle), & Varname//';'//DateStr//';'//Element, tmpstr, Count, Status) endif RETURN END SUBROUTINE ext_gr1_put_var_td_logical !***************************************************************************** SUBROUTINE ext_gr1_put_var_td_char ( DataHandle,Element, DateStr,Varname, &,3 Data, Status ) USE gr1_data_info IMPLICIT NONE #include "wrf_status_codes.h" INTEGER , INTENT(IN) :: DataHandle CHARACTER*(*) :: Element CHARACTER*(*) :: DateStr CHARACTER*(*) :: VarName CHARACTER*(*) :: Data INTEGER , INTENT(OUT) :: Status CHARACTER(len=1000) :: tmpstr INTEGER :: idx call wrf_debug ( DEBUG , 'Entering ext_gr1_put_var_td_char') if (committed(DataHandle)) then DO idx=1,LEN(Data) tmpstr(idx:idx)=Data(idx:idx) END DO DO idx=LEN(Data)+1,1000 tmpstr(idx:idx)=' ' END DO CALL gr1_build_string (td_output(DataHandle), & Varname//';'//DateStr//';'//Element, tmpstr, 1, Status) endif RETURN END SUBROUTINE ext_gr1_put_var_td_char !****************************************************************************** !* End of put_var_td_* routines !****************************************************************************** !****************************************************************************** !* Start of get_dom_ti_* routines !****************************************************************************** SUBROUTINE ext_gr1_get_dom_ti_real ( DataHandle,Element, Data, Count, &,4 Outcount, Status ) USE gr1_data_info IMPLICIT NONE #include "wrf_status_codes.h" INTEGER , INTENT(IN) :: DataHandle CHARACTER*(*) :: Element real , INTENT(OUT) :: Data(*) INTEGER , INTENT(IN) :: Count INTEGER , INTENT(OUT) :: Outcount INTEGER , INTENT(OUT) :: Status INTEGER :: idx INTEGER :: stat CHARACTER*(1000) :: VALUE call wrf_debug ( DEBUG , 'Entering ext_gr1_get_dom_ti_real') Status = WRF_NO_ERR CALL GET_METADATA_VALUE(fileinfo(DataHandle)%fileindex(:), TRIM(Element), "none", & "none", Value,stat) if (stat /= 0) then CALL wrf_debug ( DEBUG , "GET_METADATA_VALUE failed for "//Element) Status = WRF_WARN_VAR_NF RETURN endif READ(Value,*,IOSTAT=stat)(Data(idx),idx=1,Count) if (stat .ne. 0) then CALL wrf_message("Reading data from"//Value//"failed") Status = WRF_WARN_COUNT_TOO_LONG RETURN endif Outcount = idx RETURN END SUBROUTINE ext_gr1_get_dom_ti_real !***************************************************************************** SUBROUTINE ext_gr1_get_dom_ti_real8 ( DataHandle,Element, Data, Count, &,4 Outcount, Status ) USE gr1_data_info IMPLICIT NONE #include "wrf_status_codes.h" INTEGER , INTENT(IN) :: DataHandle CHARACTER*(*) :: Element real*8 , INTENT(OUT) :: Data(*) INTEGER , INTENT(IN) :: Count INTEGER , INTENT(OUT) :: OutCount INTEGER , INTENT(OUT) :: Status INTEGER :: idx INTEGER :: stat CHARACTER*(1000) :: VALUE call wrf_debug ( DEBUG , 'Entering ext_gr1_get_dom_ti_real8') Status = WRF_NO_ERR CALL GET_METADATA_VALUE(fileinfo(DataHandle)%fileindex(:), TRIM(Element), "none", & "none", Value,stat) if (stat /= 0) then CALL wrf_debug ( DEBUG , "GET_METADATA_VALUE failed for "//Element) Status = WRF_WARN_VAR_NF RETURN endif READ(Value,*,IOSTAT=stat)(Data(idx),idx=1,Count) if (stat .ne. 0) then CALL wrf_message("Reading data from"//Value//"failed") Status = WRF_WARN_COUNT_TOO_LONG RETURN endif Outcount = idx RETURN END SUBROUTINE ext_gr1_get_dom_ti_real8 !***************************************************************************** SUBROUTINE ext_gr1_get_dom_ti_integer ( DataHandle,Element, Data, Count, &,4 Outcount, Status ) USE gr1_data_info IMPLICIT NONE #include "wrf_status_codes.h" INTEGER , INTENT(IN) :: DataHandle CHARACTER*(*) :: Element integer , INTENT(OUT) :: Data(*) INTEGER , INTENT(IN) :: Count INTEGER , INTENT(OUT) :: OutCount INTEGER , INTENT(OUT) :: Status INTEGER :: idx INTEGER :: stat CHARACTER*(1000) :: VALUE call wrf_debug ( DEBUG , 'Entering ext_gr1_get_dom_ti_integer Element: '//Element) CALL GET_METADATA_VALUE(fileinfo(DataHandle)%fileindex(:), TRIM(Element), "none", & "none", Value,stat) if (stat /= 0) then CALL wrf_debug ( DEBUG , "GET_METADATA_VALUE failed for "//Element) Status = WRF_WARN_VAR_NF RETURN endif READ(Value,*,IOSTAT=stat)(Data(idx),idx=1,Count) if (stat .ne. 0) then CALL wrf_message("Reading data from"//Value//"failed") Status = WRF_WARN_COUNT_TOO_LONG RETURN endif Outcount = Count RETURN END SUBROUTINE ext_gr1_get_dom_ti_integer !***************************************************************************** SUBROUTINE ext_gr1_get_dom_ti_logical ( DataHandle,Element, Data, Count, &,4 Outcount, Status ) USE gr1_data_info IMPLICIT NONE #include "wrf_status_codes.h" INTEGER , INTENT(IN) :: DataHandle CHARACTER*(*) :: Element logical , INTENT(OUT) :: Data(*) INTEGER , INTENT(IN) :: Count INTEGER , INTENT(OUT) :: OutCount INTEGER , INTENT(OUT) :: Status INTEGER :: idx INTEGER :: stat CHARACTER*(1000) :: VALUE call wrf_debug ( DEBUG , 'Entering ext_gr1_get_dom_ti_logical') Status = WRF_NO_ERR CALL GET_METADATA_VALUE(fileinfo(DataHandle)%fileindex(:), TRIM(Element), "none", & "none", Value,stat) if (stat /= 0) then CALL wrf_debug ( DEBUG , "GET_METADATA_VALUE failed for "//Element) Status = WRF_WARN_VAR_NF RETURN endif READ(Value,*,IOSTAT=stat)(Data(idx),idx=1,Count) if (stat .ne. 0) then CALL wrf_message("Reading data from"//Value//"failed") Status = WRF_WARN_COUNT_TOO_LONG RETURN endif Outcount = idx RETURN END SUBROUTINE ext_gr1_get_dom_ti_logical !***************************************************************************** SUBROUTINE ext_gr1_get_dom_ti_char ( DataHandle,Element, Data, Status ),3 USE gr1_data_info IMPLICIT NONE #include "wrf_status_codes.h" INTEGER , INTENT(IN) :: DataHandle CHARACTER*(*) :: Element CHARACTER*(*) :: Data INTEGER , INTENT(OUT) :: Status INTEGER :: stat INTEGER :: endchar Status = WRF_NO_ERR call wrf_debug ( DEBUG , 'Entering ext_gr1_get_dom_ti_char') CALL GET_METADATA_VALUE(fileinfo(DataHandle)%fileindex(:), TRIM(Element), "none", & "none", Data, stat) if (stat /= 0) then CALL wrf_debug ( DEBUG , "GET_METADATA_VALUE failed for "//Element) Status = WRF_WARN_VAR_NF RETURN endif RETURN END SUBROUTINE ext_gr1_get_dom_ti_char !***************************************************************************** SUBROUTINE ext_gr1_get_dom_ti_double ( DataHandle,Element, Data, Count, &,4 Outcount, Status ) USE gr1_data_info IMPLICIT NONE #include "wrf_status_codes.h" INTEGER , INTENT(IN) :: DataHandle CHARACTER*(*) , INTENT(IN) :: Element real*8 , INTENT(OUT) :: Data(*) INTEGER , INTENT(IN) :: Count INTEGER , INTENT(OUT) :: OutCount INTEGER , INTENT(OUT) :: Status INTEGER :: idx INTEGER :: stat CHARACTER*(1000) :: VALUE call wrf_debug ( DEBUG , 'Entering ext_gr1_get_dom_ti_double') Status = WRF_NO_ERR CALL GET_METADATA_VALUE(fileinfo(DataHandle)%fileindex(:), TRIM(Element), "none", & "none", Value, stat) if (stat /= 0) then CALL wrf_debug ( DEBUG , "GET_METADATA_VALUE failed for "//Element) Status = WRF_WARN_VAR_NF RETURN endif READ(Value,*,IOSTAT=stat)(Data(idx),idx=1,Count) if (stat .ne. 0) then CALL wrf_message("Reading data from"//Value//"failed") Status = WRF_WARN_COUNT_TOO_LONG RETURN endif Outcount = idx RETURN END SUBROUTINE ext_gr1_get_dom_ti_double !****************************************************************************** !* End of get_dom_ti_* routines !****************************************************************************** !****************************************************************************** !* Start of put_dom_ti_* routines !****************************************************************************** SUBROUTINE ext_gr1_put_dom_ti_real ( DataHandle,Element, Data, Count, & 2,3 Status ) USE gr1_data_info IMPLICIT NONE #include "wrf_status_codes.h" INTEGER , INTENT(IN) :: DataHandle CHARACTER*(*) :: Element real , INTENT(IN) :: Data(*) INTEGER , INTENT(IN) :: Count INTEGER , INTENT(OUT) :: Status REAL dummy CHARACTER(len=1000) :: tmpstr(1000) character(len=2) :: lf integer :: idx call wrf_debug ( DEBUG , 'Entering ext_gr1_put_dom_ti_real') if (Element .eq. 'DX') then dx = Data(1)/1000. endif if (Element .eq. 'DY') then dy = Data(1)/1000. endif if (Element .eq. 'CEN_LAT') then center_lat = Data(1) endif if (Element .eq. 'CEN_LON') then center_lon = Data(1) endif if (Element .eq. 'TRUELAT1') then truelat1 = Data(1) endif if (Element .eq. 'TRUELAT2') then truelat2 = Data(1) endif if (Element == 'STAND_LON') then proj_central_lon = Data(1) endif if (Element == 'DT') then timestep = Data(1) endif if (committed(DataHandle)) then do idx = 1,Count write(tmpstr(idx),'(G17.10)')Data(idx) enddo CALL gr1_build_string (ti_output(DataHandle), Element, tmpstr, Count, Status) endif RETURN END SUBROUTINE ext_gr1_put_dom_ti_real !***************************************************************************** SUBROUTINE ext_gr1_put_dom_ti_real8 ( DataHandle,Element, Data, Count, &,3 Status ) USE gr1_data_info IMPLICIT NONE #include "wrf_status_codes.h" INTEGER , INTENT(IN) :: DataHandle CHARACTER*(*) :: Element real*8 , INTENT(IN) :: Data(*) INTEGER , INTENT(IN) :: Count INTEGER , INTENT(OUT) :: Status CHARACTER(len=1000) :: tmpstr(1000) INTEGER :: idx call wrf_debug ( DEBUG , 'Entering ext_gr1_put_dom_ti_real8') if (committed(DataHandle)) then do idx = 1,Count write(tmpstr(idx),'(G17.10)')Data(idx) enddo CALL gr1_build_string (ti_output(DataHandle), Element, tmpstr, Count, Status) endif RETURN END SUBROUTINE ext_gr1_put_dom_ti_real8 !***************************************************************************** SUBROUTINE ext_gr1_put_dom_ti_integer ( DataHandle,Element, Data, Count, & 2,4 Status ) USE gr1_data_info IMPLICIT NONE #include "wrf_status_codes.h" INTEGER , INTENT(IN) :: DataHandle CHARACTER*(*) :: Element INTEGER , INTENT(IN) :: Data(*) INTEGER , INTENT(IN) :: Count INTEGER , INTENT(OUT) :: Status REAL dummy CHARACTER(len=1000) :: tmpstr(1000) INTEGER :: idx call wrf_debug ( DEBUG , 'Entering ext_gr1_put_dom_ti_integer') if (Element == 'WEST-EAST_GRID_DIMENSION') then full_xsize = Data(1) else if (Element == 'SOUTH-NORTH_GRID_DIMENSION') then full_ysize = Data(1) else if (Element == 'MAP_PROJ') then projection = Data(1) else if (Element == 'WG_GRID_ID') then wg_grid_id = Data(1) else if (Element == 'GRID_ID') then this_domain = Data(1) endif if (committed(DataHandle)) then do idx = 1,Count write(tmpstr(idx),'(G17.10)')Data(idx) enddo CALL gr1_build_string (ti_output(DataHandle), Element, tmpstr, Count, Status) endif call wrf_debug ( DEBUG , 'Leaving ext_gr1_put_dom_ti_integer') RETURN END SUBROUTINE ext_gr1_put_dom_ti_integer !***************************************************************************** SUBROUTINE ext_gr1_put_dom_ti_logical ( DataHandle,Element, Data, Count, &,3 Status ) USE gr1_data_info IMPLICIT NONE #include "wrf_status_codes.h" INTEGER , INTENT(IN) :: DataHandle CHARACTER*(*) :: Element logical , INTENT(IN) :: Data(*) INTEGER , INTENT(IN) :: Count INTEGER , INTENT(OUT) :: Status CHARACTER(len=1000) :: tmpstr(1000) INTEGER :: idx call wrf_debug ( DEBUG , 'Entering ext_gr1_put_dom_ti_logical') if (committed(DataHandle)) then do idx = 1,Count write(tmpstr(idx),'(G17.10)')Data(idx) enddo CALL gr1_build_string (ti_output(DataHandle), Element, tmpstr, Count, Status) endif RETURN END SUBROUTINE ext_gr1_put_dom_ti_logical !***************************************************************************** SUBROUTINE ext_gr1_put_dom_ti_char ( DataHandle,Element, Data, & 2,3 Status ) USE gr1_data_info IMPLICIT NONE #include "wrf_status_codes.h" INTEGER , INTENT(IN) :: DataHandle CHARACTER*(*) :: Element CHARACTER*(*), INTENT(IN) :: Data INTEGER , INTENT(OUT) :: Status REAL dummy CHARACTER(len=1000) :: tmpstr(1000) call wrf_debug ( DEBUG , 'Entering ext_gr1_put_dom_ti_char') if (Element .eq. 'START_DATE') then StartDate = Data endif if (committed(DataHandle)) then write(tmpstr(1),*)trim(Data) CALL gr1_build_string (ti_output(DataHandle), Element, tmpstr, 1, Status) endif RETURN END SUBROUTINE ext_gr1_put_dom_ti_char !***************************************************************************** SUBROUTINE ext_gr1_put_dom_ti_double ( DataHandle,Element, Data, Count, &,3 Status ) USE gr1_data_info IMPLICIT NONE #include "wrf_status_codes.h" INTEGER , INTENT(IN) :: DataHandle CHARACTER*(*) , INTENT(IN) :: Element real*8 , INTENT(IN) :: Data(*) INTEGER , INTENT(IN) :: Count INTEGER , INTENT(OUT) :: Status CHARACTER(len=1000) :: tmpstr(1000) INTEGER :: idx call wrf_debug ( DEBUG , 'Entering ext_gr1_put_dom_ti_double') if (committed(DataHandle)) then do idx = 1,Count write(tmpstr(idx),'(G17.10)')Data(idx) enddo CALL gr1_build_string (ti_output(DataHandle), Element, tmpstr, Count, Status) endif RETURN END SUBROUTINE ext_gr1_put_dom_ti_double !****************************************************************************** !* End of put_dom_ti_* routines !****************************************************************************** !****************************************************************************** !* Start of get_dom_td_* routines !****************************************************************************** SUBROUTINE ext_gr1_get_dom_td_real ( DataHandle,Element, DateStr, Data, &,4 Count, Outcount, Status ) USE gr1_data_info IMPLICIT NONE #include "wrf_status_codes.h" INTEGER , INTENT(IN) :: DataHandle CHARACTER*(*) :: Element CHARACTER*(*) :: DateStr real , INTENT(OUT) :: Data(*) INTEGER , INTENT(IN) :: Count INTEGER , INTENT(OUT) :: OutCount INTEGER , INTENT(OUT) :: Status INTEGER :: idx INTEGER :: stat CHARACTER*(1000) :: VALUE call wrf_debug ( DEBUG , 'Entering ext_gr1_get_dom_td_real') Status = WRF_NO_ERR CALL GET_METADATA_VALUE(fileinfo(DataHandle)%fileindex(:), TRIM(Element), DateStr, & "none", Value, stat) if (stat /= 0) then CALL wrf_debug ( DEBUG , "GET_METADATA_VALUE failed for "//Element) Status = WRF_WARN_VAR_NF RETURN endif READ(Value,*,IOSTAT=stat)(Data(idx),idx=1,Count) if (stat .ne. 0) then CALL wrf_message("Reading data from"//Value//"failed") Status = WRF_WARN_COUNT_TOO_LONG RETURN endif Outcount = idx RETURN END SUBROUTINE ext_gr1_get_dom_td_real !***************************************************************************** SUBROUTINE ext_gr1_get_dom_td_real8 ( DataHandle,Element, DateStr, Data, &,4 Count, Outcount, Status ) USE gr1_data_info IMPLICIT NONE #include "wrf_status_codes.h" INTEGER , INTENT(IN) :: DataHandle CHARACTER*(*) :: Element CHARACTER*(*) :: DateStr real*8 , INTENT(OUT) :: Data(*) INTEGER , INTENT(IN) :: Count INTEGER , INTENT(OUT) :: OutCount INTEGER , INTENT(OUT) :: Status INTEGER :: idx INTEGER :: stat CHARACTER*(1000) :: VALUE call wrf_debug ( DEBUG , 'Entering ext_gr1_get_dom_td_real8') Status = WRF_NO_ERR CALL GET_METADATA_VALUE(fileinfo(DataHandle)%fileindex(:), TRIM(Element), DateStr, & "none", Value, stat) if (stat /= 0) then CALL wrf_debug ( DEBUG , "GET_METADATA_VALUE failed for "//Element) Status = WRF_WARN_VAR_NF RETURN endif READ(Value,*,IOSTAT=stat)(Data(idx),idx=1,Count) if (stat .ne. 0) then CALL wrf_message("Reading data from"//Value//"failed") Status = WRF_WARN_COUNT_TOO_LONG RETURN endif Outcount = idx RETURN END SUBROUTINE ext_gr1_get_dom_td_real8 !***************************************************************************** SUBROUTINE ext_gr1_get_dom_td_integer ( DataHandle,Element, DateStr, Data, &,4 Count, Outcount, Status ) USE gr1_data_info IMPLICIT NONE #include "wrf_status_codes.h" INTEGER , INTENT(IN) :: DataHandle CHARACTER*(*) :: Element CHARACTER*(*) :: DateStr integer , INTENT(OUT) :: Data(*) INTEGER , INTENT(IN) :: Count INTEGER , INTENT(OUT) :: OutCount INTEGER , INTENT(OUT) :: Status INTEGER :: idx INTEGER :: stat CHARACTER*(1000) :: VALUE call wrf_debug ( DEBUG , 'Entering ext_gr1_get_dom_td_integer') Status = WRF_NO_ERR CALL GET_METADATA_VALUE(fileinfo(DataHandle)%fileindex(:), TRIM(Element), DateStr, & "none", Value,stat) if (stat /= 0) then CALL wrf_debug ( DEBUG , "GET_METADATA_VALUE failed for "//Element) Status = WRF_WARN_VAR_NF RETURN endif READ(Value,*,IOSTAT=stat)(Data(idx),idx=1,Count) if (stat .ne. 0) then CALL wrf_message("Reading data from"//Value//"failed") Status = WRF_WARN_COUNT_TOO_LONG RETURN endif Outcount = idx RETURN END SUBROUTINE ext_gr1_get_dom_td_integer !***************************************************************************** SUBROUTINE ext_gr1_get_dom_td_logical ( DataHandle,Element, DateStr, Data, &,4 Count, Outcount, Status ) USE gr1_data_info IMPLICIT NONE #include "wrf_status_codes.h" INTEGER , INTENT(IN) :: DataHandle CHARACTER*(*) :: Element CHARACTER*(*) :: DateStr logical , INTENT(OUT) :: Data(*) INTEGER , INTENT(IN) :: Count INTEGER , INTENT(OUT) :: OutCount INTEGER , INTENT(OUT) :: Status INTEGER :: idx INTEGER :: stat CHARACTER*(1000) :: VALUE call wrf_debug ( DEBUG , 'Entering ext_gr1_get_dom_td_logical') Status = WRF_NO_ERR CALL GET_METADATA_VALUE(fileinfo(DataHandle)%fileindex(:), TRIM(Element), DateStr, & "none", Value, stat) if (stat /= 0) then CALL wrf_debug ( DEBUG , "GET_METADATA_VALUE failed for "//Element) Status = WRF_WARN_VAR_NF RETURN endif READ(Value,*,IOSTAT=stat)(Data(idx),idx=1,Count) if (stat .ne. 0) then CALL wrf_message("Reading data from"//Value//"failed") Status = WRF_WARN_COUNT_TOO_LONG RETURN endif Outcount = idx RETURN END SUBROUTINE ext_gr1_get_dom_td_logical !***************************************************************************** SUBROUTINE ext_gr1_get_dom_td_char ( DataHandle,Element, DateStr, Data, &,3 Status ) USE gr1_data_info IMPLICIT NONE #include "wrf_status_codes.h" INTEGER , INTENT(IN) :: DataHandle CHARACTER*(*) :: Element CHARACTER*(*) :: DateStr CHARACTER*(*) :: Data INTEGER , INTENT(OUT) :: Status INTEGER :: stat Status = WRF_NO_ERR call wrf_debug ( DEBUG , 'Entering ext_gr1_get_dom_td_char') CALL GET_METADATA_VALUE(fileinfo(DataHandle)%fileindex(:), TRIM(Element), DateStr, & "none", Data, stat) if (stat /= 0) then CALL wrf_debug ( DEBUG , "GET_METADATA_VALUE failed for "//Element) Status = WRF_WARN_VAR_NF RETURN endif RETURN END SUBROUTINE ext_gr1_get_dom_td_char !***************************************************************************** SUBROUTINE ext_gr1_get_dom_td_double ( DataHandle,Element, DateStr, Data, &,4 Count, Outcount, Status ) USE gr1_data_info IMPLICIT NONE #include "wrf_status_codes.h" INTEGER , INTENT(IN) :: DataHandle CHARACTER*(*) , INTENT(IN) :: Element CHARACTER*(*) , INTENT(IN) :: DateStr real*8 , INTENT(OUT) :: Data(*) INTEGER , INTENT(IN) :: Count INTEGER , INTENT(OUT) :: OutCount INTEGER , INTENT(OUT) :: Status INTEGER :: idx INTEGER :: stat CHARACTER*(1000) :: VALUE call wrf_debug ( DEBUG , 'Entering ext_gr1_get_dom_td_double') Status = WRF_NO_ERR CALL GET_METADATA_VALUE(fileinfo(DataHandle)%fileindex(:), TRIM(Element), DateStr, & "none", Value, stat) if (stat /= 0) then CALL wrf_debug ( DEBUG , "GET_METADATA_VALUE failed for "//Element) Status = WRF_WARN_VAR_NF RETURN endif READ(Value,*,IOSTAT=stat)(Data(idx),idx=1,Count) if (stat .ne. 0) then CALL wrf_message("Reading data from"//Value//"failed") Status = WRF_WARN_COUNT_TOO_LONG RETURN endif Outcount = idx RETURN END SUBROUTINE ext_gr1_get_dom_td_double !****************************************************************************** !* End of get_dom_td_* routines !****************************************************************************** !****************************************************************************** !* Start of put_dom_td_* routines !****************************************************************************** SUBROUTINE ext_gr1_put_dom_td_real8 ( DataHandle,Element, DateStr, Data, &,3 Count, Status ) USE gr1_data_info IMPLICIT NONE #include "wrf_status_codes.h" INTEGER , INTENT(IN) :: DataHandle CHARACTER*(*) :: Element CHARACTER*(*) :: DateStr real*8 , INTENT(IN) :: Data(*) INTEGER , INTENT(IN) :: Count INTEGER , INTENT(OUT) :: Status CHARACTER(len=1000) :: tmpstr(1000) INTEGER :: idx call wrf_debug ( DEBUG , 'Entering ext_gr1_put_dom_td_real8') if (committed(DataHandle)) then do idx = 1,Count write(tmpstr(idx),'(G17.10)')Data(idx) enddo CALL gr1_build_string (td_output(DataHandle), DateStr//';'//Element, tmpstr, & Count, Status) endif RETURN END SUBROUTINE ext_gr1_put_dom_td_real8 !***************************************************************************** SUBROUTINE ext_gr1_put_dom_td_integer ( DataHandle,Element, DateStr, Data, & 2,3 Count, Status ) USE gr1_data_info IMPLICIT NONE #include "wrf_status_codes.h" INTEGER , INTENT(IN) :: DataHandle CHARACTER*(*) :: Element CHARACTER*(*) :: DateStr integer , INTENT(IN) :: Data(*) INTEGER , INTENT(IN) :: Count INTEGER , INTENT(OUT) :: Status CHARACTER(len=1000) :: tmpstr(1000) INTEGER :: idx call wrf_debug ( DEBUG , 'Entering ext_gr1_put_dom_td_integer') if (committed(DataHandle)) then do idx = 1,Count write(tmpstr(idx),'(G17.10)')Data(idx) enddo CALL gr1_build_string (td_output(DataHandle), DateStr//';'//Element, tmpstr, & Count, Status) endif RETURN END SUBROUTINE ext_gr1_put_dom_td_integer !***************************************************************************** SUBROUTINE ext_gr1_put_dom_td_logical ( DataHandle,Element, DateStr, Data, &,3 Count, Status ) USE gr1_data_info IMPLICIT NONE #include "wrf_status_codes.h" INTEGER , INTENT(IN) :: DataHandle CHARACTER*(*) :: Element CHARACTER*(*) :: DateStr logical , INTENT(IN) :: Data(*) INTEGER , INTENT(IN) :: Count INTEGER , INTENT(OUT) :: Status CHARACTER(len=1000) :: tmpstr(1000) INTEGER :: idx call wrf_debug ( DEBUG , 'Entering ext_gr1_put_dom_td_logical') if (committed(DataHandle)) then do idx = 1,Count write(tmpstr(idx),'(G17.10)')Data(idx) enddo CALL gr1_build_string (td_output(DataHandle), DateStr//';'//Element, tmpstr, & Count, Status) endif RETURN END SUBROUTINE ext_gr1_put_dom_td_logical !***************************************************************************** SUBROUTINE ext_gr1_put_dom_td_char ( DataHandle,Element, DateStr, Data, &,3 Status ) USE gr1_data_info IMPLICIT NONE #include "wrf_status_codes.h" INTEGER , INTENT(IN) :: DataHandle CHARACTER*(*) :: Element CHARACTER*(*) :: DateStr CHARACTER(len=*), INTENT(IN) :: Data INTEGER , INTENT(OUT) :: Status CHARACTER(len=1000) :: tmpstr(1) call wrf_debug ( DEBUG , 'Entering ext_gr1_put_dom_td_char') if (committed(DataHandle)) then write(tmpstr(1),*)Data CALL gr1_build_string (td_output(DataHandle), DateStr//';'//Element, tmpstr, & 1, Status) endif RETURN END SUBROUTINE ext_gr1_put_dom_td_char !***************************************************************************** SUBROUTINE ext_gr1_put_dom_td_double ( DataHandle,Element, DateStr, Data, &,3 Count, Status ) USE gr1_data_info IMPLICIT NONE #include "wrf_status_codes.h" INTEGER , INTENT(IN) :: DataHandle CHARACTER*(*) , INTENT(IN) :: Element CHARACTER*(*) , INTENT(IN) :: DateStr real*8 , INTENT(IN) :: Data(*) INTEGER , INTENT(IN) :: Count INTEGER , INTENT(OUT) :: Status CHARACTER(len=1000) :: tmpstr(1000) INTEGER :: idx call wrf_debug ( DEBUG , 'Entering ext_gr1_put_dom_td_double') if (committed(DataHandle)) then do idx = 1,Count write(tmpstr(idx),'(G17.10)')Data(idx) enddo CALL gr1_build_string (td_output(DataHandle), DateStr//';'//Element, tmpstr, & Count, Status) endif RETURN END SUBROUTINE ext_gr1_put_dom_td_double !***************************************************************************** SUBROUTINE ext_gr1_put_dom_td_real ( DataHandle,Element, DateStr, Data, & 2,3 Count, Status ) USE gr1_data_info IMPLICIT NONE #include "wrf_status_codes.h" INTEGER , INTENT(IN) :: DataHandle CHARACTER*(*) :: Element CHARACTER*(*) :: DateStr real , INTENT(IN) :: Data(*) INTEGER , INTENT(IN) :: Count INTEGER , INTENT(OUT) :: Status CHARACTER(len=1000) :: tmpstr(1000) INTEGER :: idx call wrf_debug ( DEBUG , 'Entering ext_gr1_put_dom_td_real') if (committed(DataHandle)) then do idx = 1,Count write(tmpstr(idx),'(G17.10)')Data(idx) enddo CALL gr1_build_string (td_output(DataHandle), DateStr//';'//Element, tmpstr, & Count, Status) endif RETURN END SUBROUTINE ext_gr1_put_dom_td_real !****************************************************************************** !* End of put_dom_td_* routines !****************************************************************************** !***************************************************************************** SUBROUTINE gr1_build_string (string, Element, Value, Count, Status) 24 IMPLICIT NONE #include "wrf_status_codes.h" CHARACTER (LEN=*) , INTENT(INOUT) :: string CHARACTER (LEN=*) , INTENT(IN) :: Element CHARACTER (LEN=*) , INTENT(IN) :: Value(*) INTEGER , INTENT(IN) :: Count INTEGER , INTENT(OUT) :: Status CHARACTER (LEN=2) :: lf INTEGER :: IDX lf=char(10)//' ' if (len_trim(string) == 0) then string = lf//Element//' = ' else string = trim(string)//lf//Element//' = ' endif do idx = 1,Count if (idx > 1) then string = trim(string)//',' endif string = trim(string)//' '//trim(adjustl(Value(idx))) enddo Status = WRF_NO_ERR END SUBROUTINE gr1_build_string !***************************************************************************** SUBROUTINE gr1_get_new_handle(DataHandle) 2,2 USE gr1_data_info IMPLICIT NONE INTEGER , INTENT(OUT) :: DataHandle INTEGER :: i DataHandle = -1 do i=firstFileHandle, maxFileHandles if (.NOT. used(i)) then DataHandle = i d(i) = .true. exit endif enddo RETURN END SUBROUTINE gr1_get_new_handle !****************************************************************************** SUBROUTINE gr1_get_levels(VarName, zidx, zsize, soil_layers, vert_stag, fraction, & 2,1 vert_unit, level1, level2) use gr1_data_info IMPLICIT NONE integer :: zidx integer :: zsize logical :: soil_layers logical :: vert_stag logical :: fraction integer :: vert_unit integer :: level1 integer :: level2 character (LEN=*) :: VarName ! Setup vert_unit, and vertical levels in grib units if ((VarName .eq. 'LANDUSEF') .or. (VarName .eq. 'SOILCTOP') & .or. (VarName .eq. 'SOILCBOT')) then vert_unit = 109; level1 = zidx level2 = 0 else if ((zsize .gt. 1) .and. (.not. soil_layers) .and. (.not. fraction)) & then vert_unit = 119; if (vert_stag) then level1 = (10000*full_eta(zidx)+0.5) else level1 = (10000*half_eta(zidx)+0.5) endif level2 = 0 else ! Set the vertical coordinate and level for soil and 2D fields if (fraction) then vert_unit = 109 level1 = zidx level2 = 0 else if (soil_layers) then vert_unit = 112 level1 = 100*(soil_depth(zidx) - 0.5*soil_thickness(zidx))+0.5 level2 = 100*(soil_depth(zidx) + 0.5*soil_thickness(zidx))+0.5 else if (VarName .eq. 'mu') then vert_unit = 200 level1 = 0 level2 = 0 else if ((VarName .eq. 'Q2') .or. (VarName .eq. 'TH2') .or. & (VarName .eq. 'T2')) then vert_unit = 105 level1 = 2 level2 = 0 else if ((VarName .eq. 'Q10') .or. (VarName .eq. 'TH10') .or. & (VarName .eq. 'U10') .or. (VarName .eq. 'V10')) then vert_unit = 105 level1 = 10 level2 = 0 else vert_unit = 1 level1 = 0 level2 = 0 endif endif end SUBROUTINE gr1_get_levels !***************************************************************************** SUBROUTINE gr1_fill_eta_levels(fileindex, FileFd, grib_tables, VarName, eta_levels) 2,1 IMPLICIT NONE CHARACTER (len=*) :: fileindex INTEGER :: FileFd CHARACTER (len=*) :: grib_tables character (len=*) :: VarName REAL,DIMENSION(*) :: eta_levels INTEGER :: center, subcenter, parmtbl INTEGER :: swapped INTEGER :: leveltype INTEGER :: idx INTEGER :: parmid INTEGER :: tablenum REAL :: tmp INTEGER :: numindices integer , DIMENSION(1000) :: indices ! ! Read the levels from the grib file ! CALL GET_GRIB_PARAM(grib_tables, VarName, center, subcenter, parmtbl, & tablenum, parmid) if (parmid == -1) then call wrf_message ('Error getting grib parameter') endif leveltype = 119 CALL GET_GRIB_INDICES(fileindex(:), center, subcenter, parmtbl, & parmid, "*", leveltype, & -HUGE(1), -HUGE(1), -HUGE(1), -HUGE(1), indices, numindices) do idx = 1,numindices CALL READ_GRIB(fileindex(:),FileFd,indices(idx),eta_levels(idx)) enddo ! ! Sort the levels--from highest (bottom) to lowest (top) ! swapped = 1 sortloop : do if (swapped /= 1) exit sortloop swapped = 0 do idx=2, numindices ! ! Remove duplicate levels, caused by multiple time periods in a ! single file. ! if (eta_levels(idx) == eta_levels(idx-1)) eta_levels(idx) = 0.0 if (eta_levels(idx) > eta_levels(idx-1)) then tmp = eta_levels(idx) eta_levels(idx) = eta_levels(idx - 1) eta_levels(idx - 1) = tmp swapped = 1 endif enddo enddo sortloop end subroutine gr1_fill_eta_levels