2 ! ---principal wrf input routine (called from routines in module_io_domain )
4 SUBROUTINE input_wrf ( fid , grid , config_flags , switch , ierr )
6 USE module_state_description
11 USE module_bc_time_utilities
14 #include <wrf_io_flags.h>
15 #include <wrf_status_codes.h>
17 TYPE(grid_config_rec_type), INTENT(INOUT) :: config_flags
18 INTEGER, INTENT(IN) :: fid
19 INTEGER, INTENT(IN) :: switch
20 INTEGER, INTENT(INOUT) :: ierr
23 INTEGER ids , ide , jds , jde , kds , kde , &
24 ims , ime , jms , jme , kms , kme , &
25 ips , ipe , jps , jpe , kps , kpe
29 INTEGER icurrent_date(24)
34 INTEGER , DIMENSION(3) :: domain_start , domain_end
35 INTEGER , DIMENSION(3) :: memory_start , memory_end
36 INTEGER , DIMENSION(3) :: patch_start , patch_end
37 CHARACTER*256 errmess, currtimestr
38 CHARACTER*40 :: this_datestr, next_datestr
41 LOGICAL wrf_dm_on_monitor
42 EXTERNAL wrf_dm_on_monitor
43 Type(WRFU_Time) time, currtime
45 CHARACTER*24 base_date
50 INTEGER filestate, ierr3
51 INTEGER :: ide_compare , jde_compare , kde_compare
52 CHARACTER (len=19) simulation_start_date
53 INTEGER simulation_start_year , &
54 simulation_start_month , &
55 simulation_start_day , &
56 simulation_start_hour , &
57 simulation_start_minute , &
58 simulation_start_second
59 LOGICAL reset_simulation_start
60 REAL dx_compare , dy_compare , dum
64 ! Core wrf input routine for all input data streams. Part of mediation layer.
66 ! Note that WRF IOAPI routines wrf_get_dom_ti_*() do not return values during
67 ! training reads (dryrun).
71 WRITE(wrf_err_message,*)'input_wrf: begin, fid = ',fid
72 CALL wrf_debug( 300 , wrf_err_message )
76 CALL get_ijk_from_grid ( grid , &
77 ids, ide, jds, jde, kds, kde, &
78 ims, ime, jms, jme, kms, kme, &
79 ips, ipe, jps, jpe, kps, kpe )
81 ! simulation start time is a Singleton maintained by head_grid
82 IF ( ( switch .EQ. model_input_only ) .OR. &
83 ( switch .EQ. restart_only ) ) THEN
84 CALL wrf_get_dom_ti_char ( fid , 'SIMULATION_START_DATE' , simulation_start_date , ierr )
85 CALL nl_get_reset_simulation_start ( 1, reset_simulation_start )
86 IF ( ( ierr .EQ. 0 ) .AND. ( .NOT. reset_simulation_start ) ) THEN
87 ! Overwrite simulation start date with metadata.
89 READ ( simulation_start_date , fmt = '(I4,1x,I5,1x,I2,1x,I2,1x,I2)' ) &
90 simulation_start_year, &
91 simulation_start_day, simulation_start_hour, &
92 simulation_start_minute, simulation_start_second
93 simulation_start_month = 0
95 READ ( simulation_start_date , fmt = '(I4,1x,I2,1x,I2,1x,I2,1x,I2,1x,I2)' ) &
96 simulation_start_year, simulation_start_month, &
97 simulation_start_day, simulation_start_hour, &
98 simulation_start_minute, simulation_start_second
100 CALL nl_set_simulation_start_year ( 1 , simulation_start_year )
101 CALL nl_set_simulation_start_month ( 1 , simulation_start_month )
102 CALL nl_set_simulation_start_day ( 1 , simulation_start_day )
103 CALL nl_set_simulation_start_hour ( 1 , simulation_start_hour )
104 CALL nl_set_simulation_start_minute ( 1 , simulation_start_minute )
105 CALL nl_set_simulation_start_second ( 1 , simulation_start_second )
106 IF ( switch .EQ. model_input_only ) THEN
107 WRITE(wrf_err_message,*)fid,' input_wrf, model_input_only: SIMULATION_START_DATE = ', &
108 simulation_start_date(1:19)
109 CALL wrf_debug ( 300 , TRIM(wrf_err_message ) )
110 ELSE IF ( switch .EQ. restart_only ) THEN
111 WRITE(wrf_err_message,*)fid,' input_wrf, restart_only: SIMULATION_START_DATE = ', &
112 simulation_start_date(1:19)
113 CALL wrf_debug ( 300 , TRIM(wrf_err_message ) )
116 CALL nl_get_start_year ( 1 , simulation_start_year )
117 CALL nl_get_start_month ( 1 , simulation_start_month )
118 CALL nl_get_start_day ( 1 , simulation_start_day )
119 CALL nl_get_start_hour ( 1 , simulation_start_hour )
120 CALL nl_get_start_minute ( 1 , simulation_start_minute )
121 CALL nl_get_start_second ( 1 , simulation_start_second )
122 CALL nl_set_simulation_start_year ( 1 , simulation_start_year )
123 CALL nl_set_simulation_start_month ( 1 , simulation_start_month )
124 CALL nl_set_simulation_start_day ( 1 , simulation_start_day )
125 CALL nl_set_simulation_start_hour ( 1 , simulation_start_hour )
126 CALL nl_set_simulation_start_minute ( 1 , simulation_start_minute )
127 CALL nl_set_simulation_start_second ( 1 , simulation_start_second )
128 IF ( reset_simulation_start ) THEN
129 CALL wrf_message('input_wrf: forcing SIMULATION_START_DATE = head_grid start time')
130 CALL wrf_message(' due to namelist variable reset_simulation_start')
132 CALL wrf_message('input_wrf: SIMULATION_START_DATE not available in input')
133 CALL wrf_message('will use head_grid start time from namelist')
136 ! Initialize derived time quantity in grid%xtime.
137 ! Note that this call is also made in setup_timekeeping().
138 ! Ugh, what a hack. Simplify all this later...
139 CALL domain_clock_get( grid, minutesSinceSimulationStart=grid%xtime )
140 ! Note that it is NOT necessary to reset grid%julian here.
141 WRITE(wrf_err_message,*) 'input_wrf: set xtime to ',grid%xtime
142 CALL wrf_debug ( 100, TRIM(wrf_err_message) )
146 ! Test to make sure that the input data is the right size. Do this for input from real/ideal into
147 ! WRF, and from the standard initialization into real.
149 IF ( ( switch .EQ. model_input_only ) .OR. &
150 ( switch .EQ. aux_model_input1_only ) ) THEN
152 CALL wrf_get_dom_ti_integer ( fid , 'WEST-EAST_GRID_DIMENSION' , ide_compare , 1 , icnt , ierr3 )
153 ierr = max( ierr, ierr3 )
154 CALL wrf_get_dom_ti_integer ( fid , 'SOUTH-NORTH_GRID_DIMENSION' , jde_compare , 1 , icnt , ierr3 )
155 ierr = max( ierr, ierr3 )
156 CALL wrf_get_dom_ti_integer ( fid , 'BOTTOM-TOP_GRID_DIMENSION' , kde_compare , 1 , icnt , ierr3 )
157 ierr = max( ierr, ierr3 )
158 ! IF ( ierr3 .NE. 0 ) CALL wrf_error_fatal( 'wrf_get_dom_ti_integer getting dimension information from dataset' )
159 IF ( ierr3 .NE. 0 ) CALL wrf_debug( 'wrf_get_dom_ti_integer getting dimension information from dataset' )
162 ! Test to make sure that the grid distances are the right size.
164 CALL wrf_get_dom_ti_real ( fid , 'DX' , dx_compare , 1 , icnt , ierr )
165 CALL wrf_get_dom_ti_real ( fid , 'DY' , dy_compare , 1 , icnt , ierr )
166 IF ( ( ABS ( dx_compare - config_flags%dx ) .GT. 1.E-5 * dx_compare ) .OR. &
167 ( ABS ( dy_compare - config_flags%dy ) .GT. 1.E-5 * dy_compare ) ) THEN
168 IF ( ( config_flags%polar ) .AND. ( config_flags%grid_id .EQ. 1 ) ) THEN
169 WRITE(wrf_err_message,*)'input_wrf: DX and DY from input file expected to be wrong'
170 CALL wrf_debug ( 1 , wrf_err_message )
172 print *,'dx_compare,dy_compare = ',dx_compare,dy_compare
173 CALL wrf_error_fatal( 'DX and DY do not match from the namelist and the input file' )
179 ! do the check later (see check_if_dryrun below)
181 ! We do not want the CEN_LAT LON values from the boundary file. For 1-way nests
182 ! with ndown, this ends up being the data from the previous coarse domain.
184 IF ( switch .NE. boundary_only ) THEN
185 CALL wrf_get_dom_ti_real ( fid , 'CEN_LAT' , config_flags%cen_lat , 1 , icnt , ierr )
186 WRITE(wrf_err_message,*)'input_wrf: wrf_get_dom_ti_real for CEN_LAT returns ',config_flags%cen_lat
187 CALL wrf_debug ( 300 , wrf_err_message )
188 CALL nl_set_cen_lat ( grid%id , config_flags%cen_lat )
190 CALL wrf_get_dom_ti_real ( fid , 'CEN_LON' , config_flags%cen_lon , 1 , icnt , ierr )
191 WRITE(wrf_err_message,*)'input_wrf: wrf_get_dom_ti_real for CEN_LON returns ',config_flags%cen_lon
192 CALL wrf_debug ( 300 , wrf_err_message )
193 CALL nl_set_cen_lon ( grid%id , config_flags%cen_lon )
195 CALL wrf_get_dom_ti_real ( fid , 'CEN_LAT' , dum , 1 , icnt , ierr )
196 WRITE(wrf_err_message,*)'input_wrf: wrf_get_dom_ti_real for CEN_LAT returns ',dum
197 CALL wrf_debug ( 300 , wrf_err_message )
199 CALL wrf_get_dom_ti_real ( fid , 'CEN_LON' , dum , 1 , icnt , ierr )
200 WRITE(wrf_err_message,*)'input_wrf: wrf_get_dom_ti_real for CEN_LON returns ',dum
201 CALL wrf_debug ( 300 , wrf_err_message )
204 CALL wrf_get_dom_ti_real ( fid , 'TRUELAT1' , config_flags%truelat1 , 1 , icnt , ierr )
205 WRITE(wrf_err_message,*)'input_wrf: wrf_get_dom_ti_real for TRUELAT1 returns ',config_flags%truelat1
206 CALL wrf_debug ( 300 , wrf_err_message )
207 CALL nl_set_truelat1 ( grid%id , config_flags%truelat1 )
209 CALL wrf_get_dom_ti_real ( fid , 'TRUELAT2' , config_flags%truelat2 , 1 , icnt , ierr )
210 WRITE(wrf_err_message,*)'input_wrf: wrf_get_dom_ti_real for TRUELAT2 returns ',config_flags%truelat2
211 CALL wrf_debug ( 300 , wrf_err_message )
212 CALL nl_set_truelat2 ( grid%id , config_flags%truelat2 )
214 CALL wrf_get_dom_ti_real ( fid , 'MOAD_CEN_LAT' , config_flags%moad_cen_lat , 1 , icnt , ierr )
215 WRITE(wrf_err_message,*)'input_wrf: wrf_get_dom_ti_real for MOAD_CEN_LAT returns ',config_flags%moad_cen_lat
216 CALL wrf_debug ( 300 , wrf_err_message )
217 CALL nl_set_moad_cen_lat ( grid%id , config_flags%moad_cen_lat )
219 CALL wrf_get_dom_ti_real ( fid , 'STAND_LON' , config_flags%stand_lon , 1 , icnt , ierr )
220 WRITE(wrf_err_message,*)'input_wrf: wrf_get_dom_ti_real for STAND_LON returns ',config_flags%stand_lon
221 CALL wrf_debug ( 300 , wrf_err_message )
222 CALL nl_set_stand_lon ( grid%id , config_flags%stand_lon )
224 #if ( NMM_CORE != 1 )
225 ! program_name is defined in module_domain and set in the main program for whatever application
226 ! is using subroutine input_wrf (that is, the subroutine you are looking at here). Data files
227 ! written by SI have P_TOP as a metadata item; the real program and wrf model have it as a
228 ! state variable. This test is to supress non-fatal but confusing messages from the model complaining
229 ! that P_TOP cannot be read from the metadata for this dataset. JM 20040905
231 ! Note, P_TOP is not defined in the NMM core.
233 IF ( program_name(1:7) .EQ. "REAL_EM" ) THEN
234 CALL wrf_get_dom_ti_real ( fid , 'P_TOP' , grid%p_top , 1 , icnt , ierr )
235 WRITE(wrf_err_message,*)'input_wrf: wrf_get_dom_ti_real for P_TOP returns ',grid%p_top
236 CALL wrf_debug ( 300 , wrf_err_message )
240 IF ( switch .NE. boundary_only ) THEN
241 CALL wrf_get_dom_ti_real ( fid , 'GMT' , config_flags%gmt , 1 , icnt , ierr )
242 WRITE(wrf_err_message,*)'input_wrf: wrf_get_dom_ti_real for GMT returns ',config_flags%gmt
243 CALL wrf_debug ( 300 , wrf_err_message )
244 CALL nl_set_gmt ( grid%id , config_flags%gmt )
246 CALL wrf_get_dom_ti_integer ( fid , 'JULYR' , config_flags%julyr , 1 , icnt , ierr )
247 WRITE(wrf_err_message,*)'input_wrf: wrf_get_dom_ti_integer for JULYR returns ',config_flags%julyr
248 CALL wrf_debug ( 300 , wrf_err_message )
249 CALL nl_set_julyr ( grid%id , config_flags%julyr )
251 CALL wrf_get_dom_ti_integer ( fid , 'JULDAY' , config_flags%julday , 1 , icnt , ierr )
252 WRITE(wrf_err_message,*)'input_wrf: wrf_get_dom_ti_integer for JULDAY returns ',config_flags%julday
253 CALL wrf_debug ( 300 , wrf_err_message )
254 CALL nl_set_julday ( grid%id , config_flags%julday )
257 CALL wrf_get_dom_ti_integer ( fid , 'MAP_PROJ' , config_flags%map_proj , 1 , icnt , ierr )
258 WRITE(wrf_err_message,*)'input_wrf: wrf_get_dom_ti_integer for MAP_PROJ returns ',config_flags%map_proj
259 CALL wrf_debug ( 300 , wrf_err_message )
260 CALL nl_set_map_proj ( grid%id , config_flags%map_proj )
262 CALL wrf_get_dom_ti_char ( fid , 'MMINLU', mminlu , ierr )
263 WRITE(wrf_err_message,*)'input_wrf: wrf_get_dom_ti_char for MMINLU returns ',mminlu(1:4)
264 CALL wrf_debug ( 300 , wrf_err_message )
265 CALL nl_set_mminlu ( 1, mminlu(1:4) )
267 CALL wrf_get_dom_ti_integer ( fid , 'ISWATER' , config_flags%iswater , 1 , icnt , ierr )
268 WRITE(wrf_err_message,*)'input_wrf: wrf_get_dom_ti_integer for ISWATER returns ',config_flags%iswater
269 CALL wrf_debug ( 300 , wrf_err_message )
270 IF ( ierr .NE. 0 ) THEN
271 IF (mminlu == 'UMD') THEN
272 config_flags%iswater = 14
274 config_flags%iswater = 16
277 CALL nl_set_iswater ( grid%id , config_flags%iswater )
279 CALL wrf_get_dom_ti_integer ( fid , 'ISICE' , config_flags%isice , 1 , icnt , ierr )
280 WRITE(wrf_err_message,*)'input_wrf: wrf_get_dom_ti_integer for ISICE returns ',config_flags%isice
281 CALL wrf_debug ( 300 , wrf_err_message )
282 IF ( ierr .NE. 0 ) THEN
283 IF (mminlu == 'UMD') THEN
284 config_flags%isice = 14
286 config_flags%isice = 24
289 CALL nl_set_isice ( grid%id , config_flags%isice )
291 CALL wrf_get_dom_ti_integer ( fid , 'ISURBAN' , config_flags%isurban , 1 , icnt , ierr )
292 WRITE(wrf_err_message,*)'input_wrf: wrf_get_dom_ti_integer for ISURBAN returns ',config_flags%isurban
293 CALL wrf_debug ( 300 , wrf_err_message )
294 IF ( ierr .NE. 0 ) THEN
295 IF (mminlu == 'UMD') THEN
296 config_flags%isurban = 13
298 config_flags%isurban = 1
301 CALL nl_set_isurban ( grid%id , config_flags%isurban )
303 CALL wrf_get_dom_ti_integer ( fid , 'ISOILWATER' , config_flags%isoilwater , 1 , icnt , ierr )
304 WRITE(wrf_err_message,*)'input_wrf: wrf_get_dom_ti_integer for ISOILWATER returns ',config_flags%isoilwater
305 CALL wrf_debug ( 300 , wrf_err_message )
306 IF ( ierr .NE. 0 ) THEN
307 config_flags%isoilwater = 14
309 CALL nl_set_isoilwater ( grid%id , config_flags%isoilwater )
312 ! Added these fields for restarting of moving nests, JM
314 ! It is very important that these be set correctly if they are set at all in here.
315 ! Garbage values will produce unpredictable results, possibly segfaults, in the nesting
316 ! code. Need some integrity checking here or elsewhere in the code to at least check to
317 ! make sure that the istart and jstart values make sense with respect to the nest dimensions
318 ! and the position in the parent domain.
319 CALL wrf_get_dom_ti_integer ( fid , 'I_PARENT_START' , itmp , 1 , icnt, ierr )
320 IF ( ierr .EQ. 0 .AND. switch .EQ. restart_only ) THEN
321 config_flags%i_parent_start = itmp
322 CALL nl_set_i_parent_start ( grid%id , config_flags%i_parent_start )
324 CALL wrf_get_dom_ti_integer ( fid , 'J_PARENT_START' , itmp , 1 , icnt, ierr )
325 IF ( ierr .EQ. 0 .AND. switch .EQ. restart_only ) THEN
326 config_flags%j_parent_start = itmp
327 CALL nl_set_j_parent_start ( grid%id , config_flags%j_parent_start )
331 ! If this was not a training read (dry run) check for erroneous values.
332 CALL wrf_inquire_filename ( fid , fname , filestate , ierr )
333 IF ( ierr /= 0 ) THEN
334 WRITE(wrf_err_message,*)'module_io_wrf: input_wrf: wrf_inquire_filename Status = ',ierr
335 CALL wrf_error_fatal( wrf_err_message )
338 WRITE(wrf_err_message,*)'input_wrf: fid,filestate = ',fid,filestate
339 CALL wrf_debug( 300 , wrf_err_message )
341 dryrun = ( filestate .EQ. WRF_FILE_OPENED_NOT_COMMITTED )
343 WRITE(wrf_err_message,*)'input_wrf: dryrun = ',dryrun
344 CALL wrf_debug( 300 , wrf_err_message )
346 check_if_dryrun : IF ( .NOT. dryrun ) THEN
350 !KLUDGE - is there a more elegant way to determine "old si" input
351 IF ( ( switch .EQ. model_input_only ) .OR. &
352 ( ( switch .EQ. aux_model_input1_only ) .AND. &
353 ( config_flags%auxinput1_inname(1:8) .EQ. 'wrf_real' ) ) ) THEN
355 ! Test to make sure that the input data is the right size.
357 IF ( ( ide .NE. ide_compare ) .OR. &
358 ( kde .NE. kde_compare ) .OR. &
359 ( jde .NE. jde_compare ) ) THEN
360 WRITE(wrf_err_message,*)'input_wrf.F: SIZE MISMATCH: namelist ide,jde,kde=',ide,jde,kde,&
361 '; input data ide,jde,kde=',ide_compare , jde_compare , kde_compare
362 CALL wrf_error_fatal( wrf_err_message )
365 ELSE IF ( switch .EQ. aux_model_input1_only ) THEN
367 ! Test to make sure that the input data is the right size.
369 IF ( ( ide .NE. ide_compare ) .OR. &
370 ( config_flags%num_metgrid_levels .NE. kde_compare ) .OR. &
371 ( jde .NE. jde_compare ) ) THEN
372 WRITE(wrf_err_message,*)'input_wrf.F: SIZE MISMATCH: ',&
373 'namelist ide,jde,num_metgrid_levels=',ide,jde,config_flags%num_metgrid_levels,&
374 '; input data ide,jde,num_metgrid_levels=',ide_compare , jde_compare , kde_compare
375 CALL wrf_error_fatal( wrf_err_message )
383 IF ( ( switch .EQ. aux_model_input1_only ) .AND. &
384 ( config_flags%auxinput1_inname(1:8) .EQ. 'wrf_real' ) ) THEN
386 CALL wrf_get_dom_ti_integer ( fid , 'BOTTOM-TOP_GRID_DIMSNSION' , kde_compare , 1 , icnt , ierr3 )
388 ! Test to make sure that the input data is the right size.
390 IF ( ( ide-1 .NE. ide_compare ) .OR. &
391 ( kde .NE. kde_compare ) .OR. &
392 ( jde-1 .NE. jde_compare ) .AND. ierr3 .EQ. 0 ) THEN
393 WRITE(wrf_err_message,*)'input_wrf.F: SIZE MISMATCH: namelist ide-1,jde-1,kde=',ide-1,jde-1,kde,&
394 '; input data ide,jde,kde=',ide_compare , jde_compare , kde_compare
395 CALL wrf_debug( 100, wrf_err_message )
398 ELSEIF ( switch .EQ. aux_model_input1_only ) THEN ! assume just WPS in this branch
399 IF ( ( ide-1 .NE. ide_compare ) .OR. &
400 ( config_flags%num_metgrid_levels .NE. kde_compare ) .OR. &
401 ( jde-1 .NE. jde_compare ) .AND. ierr3 .EQ. 0 ) THEN
402 WRITE(wrf_err_message,*)'input_wrf.F: SIZE MISMATCH: ',&
403 'namelist ide-1,jde-1,num_metgrid_levels=',ide-1,jde-1,config_flags%num_metgrid_levels,&
404 '; input data ide,jde,num_metgrid_levels=',ide_compare , jde_compare , kde_compare
405 IF (ide-1 .eq. ide_compare .AND. jde-1 .EQ. jde_compare) THEN
406 CALL wrf_message(wrf_err_message)
407 CALL wrf_error_fatal( "appears that the vertical dimension is wrong - quitting" )
409 CALL wrf_message(wrf_err_message)
410 CALL wrf_error_fatal( "appears that I or J dimensions are wrong - quitting" )
417 ENDIF check_if_dryrun
420 ! This call to wrf_get_next_time will position the dataset over the next time-frame
421 ! in the file and return the current_date, which is used as an argument to the
422 ! read_field routines in the blocks of code included below. Note that we read the
423 ! next time *after* all the meta data has been read. This is only important for the
424 ! WRF internal I/O format because it is order-dependent. Other formats shouldn't care
430 CALL wrf_get_next_time(fid, current_date , ierr)
431 WRITE(wrf_err_message,*)fid,' input_wrf: wrf_get_next_time current_date: ',current_date(1:19),' Status = ',ierr
432 CALL wrf_debug ( 300 , TRIM(wrf_err_message ) )
433 IF ( ierr .NE. 0 .AND. ierr .NE. WRF_WARN_NOTSUPPORTED .AND. ierr .NE. WRF_WARN_DRYRUN_READ ) THEN
434 CALL wrf_message ( TRIM(wrf_err_message ) )
435 IF ( switch .EQ. boundary_only ) THEN
436 WRITE(wrf_err_message,*) ' ... May have run out of valid boundary conditions in file ',TRIM(fname)
437 CALL wrf_error_fatal( TRIM(wrf_err_message) )
439 #if ( NMM_CORE != 1 )
440 WRITE(wrf_err_message,*) '... Could not find matching time in input file ',TRIM(fname)
441 CALL wrf_error_fatal( TRIM(wrf_err_message) )
444 ELSE IF ( ierr .NE. WRF_WARN_NOTSUPPORTED .AND. ierr .NE. WRF_WARN_DRYRUN_READ) THEN
446 ! check input time against domain time (which will be start time at beginning, see share/set_timekeeping.F)
449 SELECT CASE ( switch )
450 CASE ( model_input_only, aux_model_input1_only, aux_model_input2_only, &
451 aux_model_input3_only, aux_model_input4_only, aux_model_input5_only, aux_model_input10_only )
453 IF( (config_flags%io_style_emissions .eq. 1) .and. &
454 ((switch.eq.aux_model_input4_only) .or. (switch.eq.aux_model_input5_only)) )then
455 CALL wrf_message( "**WARNING** Time in input file not being checked **WARNING**" )
458 CALL wrf_atotime( current_date(1:19), time )
459 CALL domain_clock_get( grid, current_time=currtime, &
460 current_timestr=currtimestr )
462 ! Don't perform the check for WRFVAR, as we're not passing the right dates
464 CALL domain_clockprint(150, grid, &
465 'DEBUG input_wrf(): get CurrTime from clock,')
466 IF ( time .NE. currtime ) THEN
467 WRITE( wrf_err_message , * )'Time in file: ',trim( current_date(1:19) )
468 CALL wrf_message ( trim(wrf_err_message) )
469 WRITE( wrf_err_message , * )'Time on domain: ',trim( currtimestr )
470 CALL wrf_message ( trim(wrf_err_message) )
471 CALL wrf_message( "**WARNING** Time in input file not equal to time on domain **WARNING**" )
472 WRITE(wrf_err_message,*) "**WARNING** Trying next time in file ",TRIM(fname)," ..."
473 CALL wrf_message( TRIM(wrf_err_message) )
484 ! set the lbc time interval fields in the domain data structure
485 ! these time values are checked as stopping condition for the while loop in
486 ! latbound_in() defined in share/medation_integrate.F, which is used to
487 ! iterate forward to the correct interval in the input LBC file
489 IF ( switch .EQ. boundary_only ) THEN
490 CALL wrf_get_dom_td_char ( fid , 'THISBDYTIME' , current_date(1:19), this_datestr , ierr )
491 CALL wrf_atotime( this_datestr(1:19), grid%this_bdy_time )
492 CALL wrf_get_dom_td_char ( fid , 'NEXTBDYTIME' , current_date(1:19), next_datestr , ierr )
493 CALL wrf_atotime( next_datestr(1:19), grid%next_bdy_time )
497 IF ( switch .EQ. model_input_only ) THEN
498 CALL wrf_inputin( fid , grid , config_flags , switch , ierr )
499 ELSE IF ( switch .EQ. history_only ) THEN
500 CALL wrf_histin( fid , grid , config_flags , switch , ierr )
501 ELSE IF ( switch .EQ. aux_model_input1_only ) THEN
502 CALL wrf_auxinput1in( fid , grid , config_flags , switch , ierr )
503 ELSE IF ( switch .EQ. aux_model_input2_only ) THEN
504 CALL wrf_auxinput2in( fid , grid , config_flags , switch , ierr )
505 ELSE IF ( switch .EQ. aux_model_input3_only ) THEN
506 CALL wrf_auxinput3in( fid , grid , config_flags , switch , ierr )
507 ELSE IF ( switch .EQ. aux_model_input4_only ) THEN
508 CALL wrf_auxinput4in( fid , grid , config_flags , switch , ierr )
509 ELSE IF ( switch .EQ. aux_model_input5_only ) THEN
510 CALL wrf_auxinput5in( fid , grid , config_flags , switch , ierr )
511 ELSE IF ( switch .EQ. aux_model_input6_only ) THEN
512 CALL wrf_auxinput6in( fid , grid , config_flags , switch , ierr )
513 ELSE IF ( switch .EQ. aux_model_input7_only ) THEN
514 CALL wrf_auxinput7in( fid , grid , config_flags , switch , ierr )
515 ELSE IF ( switch .EQ. aux_model_input8_only ) THEN
516 CALL wrf_auxinput8in( fid , grid , config_flags , switch , ierr )
517 ELSE IF ( switch .EQ. aux_model_input9_only ) THEN
518 CALL wrf_auxinput9in( fid , grid , config_flags , switch , ierr )
519 ELSE IF ( switch .EQ. aux_model_input10_only ) THEN
520 CALL wrf_auxinput10in( fid , grid , config_flags , switch , ierr )
521 ELSE IF ( switch .EQ. aux_model_input11_only ) THEN
522 CALL wrf_auxinput11in( fid , grid , config_flags , switch , ierr )
525 ELSE IF ( switch .EQ. aux_hist1_only ) THEN
526 CALL wrf_auxhist1in( fid , grid , config_flags , switch , ierr )
527 ELSE IF ( switch .EQ. aux_hist2_only ) THEN
528 CALL wrf_auxhist2in( fid , grid , config_flags , switch , ierr )
529 ELSE IF ( switch .EQ. aux_hist3_only ) THEN
530 CALL wrf_auxhist3in( fid , grid , config_flags , switch , ierr )
531 ELSE IF ( switch .EQ. aux_hist4_only ) THEN
532 CALL wrf_auxhist4in( fid , grid , config_flags , switch , ierr )
533 ELSE IF ( switch .EQ. aux_hist5_only ) THEN
534 CALL wrf_auxhist5in( fid , grid , config_flags , switch , ierr )
535 ELSE IF ( switch .EQ. aux_hist6_only ) THEN
536 CALL wrf_auxhist6in( fid , grid , config_flags , switch , ierr )
537 ELSE IF ( switch .EQ. aux_hist7_only ) THEN
538 CALL wrf_auxhist7in( fid , grid , config_flags , switch , ierr )
539 ELSE IF ( switch .EQ. aux_hist8_only ) THEN
540 CALL wrf_auxhist8in( fid , grid , config_flags , switch , ierr )
541 ELSE IF ( switch .EQ. aux_hist9_only ) THEN
542 CALL wrf_auxhist9in( fid , grid , config_flags , switch , ierr )
543 ELSE IF ( switch .EQ. aux_hist10_only ) THEN
544 CALL wrf_auxhist10in( fid , grid , config_flags , switch , ierr )
545 ELSE IF ( switch .EQ. aux_hist11_only ) THEN
546 CALL wrf_auxhist11in( fid , grid , config_flags , switch , ierr )
548 ELSE IF ( switch .EQ. restart_only ) THEN
549 CALL wrf_restartin( fid , grid , config_flags , switch , ierr )
550 ELSE IF ( switch .EQ. boundary_only ) THEN
551 CALL wrf_bdyin( fid , grid , config_flags , switch , ierr )
554 CALL wrf_tsin( grid , ierr )
556 CALL wrf_message ( "ALL I/O DISABLED IN share/module_io_wrf.F")
559 WRITE(wrf_err_message,*)'input_wrf: end, fid = ',fid
560 CALL wrf_debug( 300 , wrf_err_message )
563 END SUBROUTINE input_wrf