PageRenderTime 34ms CodeModel.GetById 24ms RepoModel.GetById 0ms app.codeStats 0ms

/wrfv2_fire/dyn_em/module_wps_io_arw.F

http://github.com/jbeezley/wrf-fire
FORTRAN Legacy | 1944 lines | 1092 code | 300 blank | 552 comment | 68 complexity | 100ac757f26606a7119c8b03b77f8dce MD5 | raw file
Possible License(s): AGPL-1.0
  1. MODULE module_wps_io_arw
  2. USE module_optional_input
  3. IMPLICIT NONE
  4. !! FROM MODULE_KINDS
  5. ! The numerical data types defined in this module are:
  6. ! i_byte - specification kind for byte (1-byte) integer variable
  7. ! i_short - specification kind for short (2-byte) integer variable
  8. ! i_long - specification kind for long (4-byte) integer variable
  9. ! i_llong - specification kind for double long (8-byte) integer variable
  10. ! r_single - specification kind for single precision (4-byte) real variable
  11. ! r_double - specification kind for double precision (8-byte) real variable
  12. ! r_quad - specification kind for quad precision (16-byte) real variable
  13. !
  14. ! i_kind - generic specification kind for default integer
  15. ! r_kind - generic specification kind for default floating point
  16. !
  17. !
  18. ! Integer type definitions below
  19. ! Integer types
  20. integer, parameter, public :: i_byte = selected_int_kind(1) ! byte integer
  21. integer, parameter, public :: i_short = selected_int_kind(4) ! short integer
  22. integer, parameter, public :: i_long = selected_int_kind(8) ! long integer
  23. integer, parameter, private :: llong_t = selected_int_kind(16) ! llong integer
  24. integer, parameter, public :: i_llong = max( llong_t, i_long )
  25. ! Expected 8-bit byte sizes of the integer kinds
  26. integer, parameter, public :: num_bytes_for_i_byte = 1
  27. integer, parameter, public :: num_bytes_for_i_short = 2
  28. integer, parameter, public :: num_bytes_for_i_long = 4
  29. integer, parameter, public :: num_bytes_for_i_llong = 8
  30. ! Define arrays for default definition
  31. integer, parameter, private :: num_i_kinds = 4
  32. integer, parameter, dimension( num_i_kinds ), private :: integer_types = (/ &
  33. i_byte, i_short, i_long, i_llong /)
  34. integer, parameter, dimension( num_i_kinds ), private :: integer_byte_sizes = (/ &
  35. num_bytes_for_i_byte, num_bytes_for_i_short, &
  36. num_bytes_for_i_long, num_bytes_for_i_llong /)
  37. ! Default values
  38. ! **** CHANGE THE FOLLOWING TO CHANGE THE DEFAULT INTEGER TYPE KIND ***
  39. integer, parameter, private :: default_integer = 2 ! 1=byte,
  40. ! 2=short,
  41. ! 3=long,
  42. ! 4=llong
  43. integer, parameter, public :: i_kind = integer_types( default_integer )
  44. integer, parameter, public :: num_bytes_for_i_kind = &
  45. integer_byte_sizes( default_integer )
  46. ! Real definitions below
  47. ! Real types
  48. integer, parameter, public :: r_single = selected_real_kind(6) ! single precision
  49. integer, parameter, public :: r_double = selected_real_kind(15) ! double precision
  50. integer, parameter, private :: quad_t = selected_real_kind(20) ! quad precision
  51. integer, parameter, public :: r_quad = max( quad_t, r_double )
  52. ! Expected 8-bit byte sizes of the real kinds
  53. integer, parameter, public :: num_bytes_for_r_single = 4
  54. integer, parameter, public :: num_bytes_for_r_double = 8
  55. integer, parameter, public :: num_bytes_for_r_quad = 16
  56. ! Define arrays for default definition
  57. integer, parameter, private :: num_r_kinds = 3
  58. integer, parameter, dimension( num_r_kinds ), private :: real_kinds = (/ &
  59. r_single, r_double, r_quad /)
  60. integer, parameter, dimension( num_r_kinds ), private :: real_byte_sizes = (/ &
  61. num_bytes_for_r_single, num_bytes_for_r_double, &
  62. num_bytes_for_r_quad /)
  63. ! Default values
  64. ! **** CHANGE THE FOLLOWING TO CHANGE THE DEFAULT REAL TYPE KIND ***
  65. integer, parameter, private :: default_real = 2 ! 1=single,
  66. ! 2=double,
  67. !! END FROM MODULE_KINDS
  68. ! Input 3D meteorological fields.
  69. REAL , DIMENSION(:,:,:) , ALLOCATABLE :: landuse_frac_input , &
  70. soil_top_cat_input , &
  71. soil_bot_cat_input
  72. ! Input 2D surface fields.
  73. REAL , DIMENSION(:,:) , ALLOCATABLE :: soilt010_input , soilt040_input , &
  74. soilt100_input , soilt200_input , &
  75. soilm010_input , soilm040_input , &
  76. soilm100_input , soilm200_input , &
  77. psfc_in,pmsl
  78. REAL , DIMENSION(:,:) , ALLOCATABLE :: lat_wind, lon_wind
  79. ! Local input arrays
  80. REAL,DIMENSION(:,:),ALLOCATABLE :: dum2d
  81. INTEGER,DIMENSION(:,:),ALLOCATABLE :: idum2d
  82. REAL,DIMENSION(:,:,:),ALLOCATABLE :: dum3d
  83. LOGICAL , SAVE :: first_time_in = .TRUE.
  84. INTEGER :: flag_soilt010 , flag_soilt100 , flag_soilt200 , &
  85. flag_soilm010 , flag_soilm100 , flag_soilm200
  86. ! Some constants to allow simple dimensions in the defined types
  87. ! given below.
  88. CONTAINS
  89. SUBROUTINE read_wps ( grid, filename, file_date_string, num_metgrid_levels )
  90. USE module_soil_pre
  91. USE module_domain
  92. IMPLICIT NONE
  93. TYPE(domain) , INTENT(INOUT) :: grid
  94. CHARACTER (LEN=19) , INTENT(IN) :: file_date_string
  95. CHARACTER (LEN=4) :: dummychar
  96. CHARACTER (LEN=132) :: VarName
  97. CHARACTER (LEN=150) :: chartemp
  98. CHARACTER (*) , INTENT(IN) :: filename
  99. INTEGER :: ids,ide,jds,jde,kds,kde &
  100. ,ims,ime,jms,jme,kms,kme &
  101. ,its,ite,jts,jte,kts,kte
  102. INTEGER :: i , j , k , loop, IMAX, JMAX
  103. INTEGER :: DATAHANDLE, num_metgrid_levels
  104. INTEGER :: Sysdepinfo, Status
  105. INTEGER :: istatus,ioutcount,iret,index,ierr
  106. integer :: nrecs,iunit, L,hor_size,hor_size_u,hor_size_v
  107. !!
  108. character*132, allocatable :: datestr_all(:)
  109. character*132, allocatable :: varname_all(:)
  110. integer, allocatable :: domainend_all(:,:)
  111. integer, allocatable :: start_block(:)
  112. integer, allocatable :: end_block(:)
  113. integer, allocatable :: start_byte(:)
  114. integer, allocatable :: end_byte(:)
  115. integer(kind=i_llong), allocatable :: file_offset(:)
  116. !!
  117. REAL :: dummy,tmp,garb
  118. REAL, ALLOCATABLE:: dumdata(:,:,:)
  119. REAL, ALLOCATABLE:: dumdata_u(:,:,:)
  120. REAL, ALLOCATABLE:: dumdata_v(:,:,:)
  121. REAL :: lats16(16),lons16(16)
  122. CHARACTER (LEN= 8) :: dummy_char
  123. INTEGER :: ok , map_proj , ok_open, igarb,igarb2, N
  124. REAL :: pt
  125. INTEGER :: num_veg_cat , num_soil_top_cat , num_soil_bot_cat
  126. #if defined(DM_PARALLEL) && !defined(STUBMPI)
  127. INCLUDE "mpif.h"
  128. SELECT CASE ( model_data_order )
  129. CASE ( DATA_ORDER_ZXY )
  130. kds = grid%sd31 ; kde = grid%ed31 ;
  131. ids = grid%sd32 ; ide = grid%ed32 ;
  132. jds = grid%sd33 ; jde = grid%ed33 ;
  133. kms = grid%sm31 ; kme = grid%em31 ;
  134. ims = grid%sm32 ; ime = grid%em32 ;
  135. jms = grid%sm33 ; jme = grid%em33 ;
  136. kts = grid%sp31 ; kte = grid%ep31 ; ! tile is entire patch
  137. its = grid%sp32 ; ite = grid%ep32 ; ! tile is entire patch
  138. jts = grid%sp33 ; jte = grid%ep33 ; ! tile is entire patch
  139. CASE ( DATA_ORDER_XYZ )
  140. ids = grid%sd31 ; ide = grid%ed31 ;
  141. jds = grid%sd32 ; jde = grid%ed32 ;
  142. kds = grid%sd33 ; kde = grid%ed33 ;
  143. ims = grid%sm31 ; ime = grid%em31 ;
  144. jms = grid%sm32 ; jme = grid%em32 ;
  145. kms = grid%sm33 ; kme = grid%em33 ;
  146. its = grid%sp31 ; ite = grid%ep31 ; ! tile is entire patch
  147. jts = grid%sp32 ; jte = grid%ep32 ; ! tile is entire patch
  148. kts = grid%sp33 ; kte = grid%ep33 ; ! tile is entire patch
  149. CASE ( DATA_ORDER_XZY )
  150. ids = grid%sd31 ; ide = grid%ed31 ;
  151. kds = grid%sd32 ; kde = grid%ed32 ;
  152. jds = grid%sd33 ; jde = grid%ed33 ;
  153. ims = grid%sm31 ; ime = grid%em31 ;
  154. kms = grid%sm32 ; kme = grid%em32 ;
  155. jms = grid%sm33 ; jme = grid%em33 ;
  156. its = grid%sp31 ; ite = grid%ep31 ; ! tile is entire patch
  157. kts = grid%sp32 ; kte = grid%ep32 ; ! tile is entire patch
  158. jts = grid%sp33 ; jte = grid%ep33 ; ! tile is entire patch
  159. END SELECT
  160. ! Initialize what soil temperature and moisture is available.
  161. flag_st000010 = 0
  162. flag_st010040 = 0
  163. flag_st040100 = 0
  164. flag_st100200 = 0
  165. flag_sm000010 = 0
  166. flag_sm010040 = 0
  167. flag_sm040100 = 0
  168. flag_sm100200 = 0
  169. flag_st010200 = 0
  170. flag_sm010200 = 0
  171. flag_soilt010 = 0
  172. flag_soilt040 = 0
  173. flag_soilt100 = 0
  174. flag_soilt200 = 0
  175. flag_soilm010 = 0
  176. flag_soilm040 = 0
  177. flag_soilm100 = 0
  178. flag_soilm200 = 0
  179. flag_sst = 0
  180. flag_toposoil = 0
  181. ! How many soil levels have we found? Well, right now, none.
  182. num_st_levels_input = 0
  183. num_sm_levels_input = 0
  184. st_levels_input = -1
  185. sm_levels_input = -1
  186. ! Get the space for the data if this is the first time here.
  187. IF (.NOT. ALLOCATED (pmsl) ) ALLOCATE ( pmsl(its:ite,jts:jte) )
  188. IF (.NOT. ALLOCATED (psfc_in) ) ALLOCATE ( psfc_in(its:ite,jts:jte) )
  189. !!! MPI IO
  190. iunit=33
  191. call count_recs_wrf_binary_file(iunit, trim(fileName), nrecs)
  192. allocate (datestr_all(nrecs))
  193. allocate (varname_all(nrecs))
  194. allocate (domainend_all(3,nrecs))
  195. allocate (start_block(nrecs))
  196. allocate (end_block(nrecs))
  197. allocate (start_byte(nrecs))
  198. allocate (end_byte(nrecs))
  199. allocate (file_offset(nrecs))
  200. call inventory_wrf_binary_file(iunit, trim(filename), nrecs, &
  201. datestr_all,varname_all,domainend_all, &
  202. start_block,end_block,start_byte,end_byte,file_offset)
  203. call mpi_file_open(mpi_comm_world, trim(filename), &
  204. mpi_mode_rdonly,mpi_info_null, iunit, ierr)
  205. if (ierr /= 0) then
  206. call wrf_error_fatal("Error opening file with mpi io")
  207. end if
  208. VarName='CEN_LAT'
  209. call retrieve_index(index,VarName,varname_all,nrecs,iret)
  210. if (iret /= 0) then
  211. print*,VarName," not found in file"
  212. else
  213. call mpi_file_read_at(iunit,file_offset(index)+5*4, &
  214. garb,1,mpi_real4, &
  215. mpi_status_ignore, ierr)
  216. if (ierr /= 0) then
  217. print*,"Error reading ", VarName," using MPIIO"
  218. else
  219. print*,VarName, ' from MPIIO READ= ',garb
  220. CALL nl_set_cen_lat ( grid%id , garb )
  221. end if
  222. end if
  223. VarName='CEN_LON'
  224. call retrieve_index(index,VarName,varname_all,nrecs,iret)
  225. call mpi_file_read_at(iunit,file_offset(index)+5*4, &
  226. garb,1,mpi_real4, &
  227. mpi_status_ignore, ierr)
  228. CALL nl_set_cen_lon ( grid%id , garb )
  229. CALL nl_set_stand_lon ( grid%id , garb )
  230. VarName='POLE_LAT'
  231. call retrieve_index(index,VarName,varname_all,nrecs,iret)
  232. call mpi_file_read_at(iunit,file_offset(index)+5*4, &
  233. garb,1,mpi_real4, &
  234. mpi_status_ignore, ierr)
  235. CALL nl_set_pole_lat ( grid%id , garb )
  236. VarName='TRUELAT1'
  237. call retrieve_index(index,VarName,varname_all,nrecs,iret)
  238. call mpi_file_read_at(iunit,file_offset(index)+5*4, &
  239. garb,1,mpi_real4, &
  240. mpi_status_ignore, ierr)
  241. CALL nl_set_truelat1 ( grid%id , garb )
  242. VarName='TRUELAT2'
  243. call retrieve_index(index,VarName,varname_all,nrecs,iret)
  244. call mpi_file_read_at(iunit,file_offset(index)+5*4, &
  245. garb,1,mpi_real4, &
  246. mpi_status_ignore, ierr)
  247. CALL nl_set_truelat2 ( grid%id , garb )
  248. VarName='MAP_PROJ'
  249. call retrieve_index(index,VarName,varname_all,nrecs,iret)
  250. call mpi_file_read_at(iunit,file_offset(index)+5*4, &
  251. igarb,1,mpi_integer4, &
  252. mpi_status_ignore, ierr)
  253. CALL nl_set_map_proj( grid%id, igarb)
  254. VarName='ISURBAN'
  255. call retrieve_index(index,VarName,varname_all,nrecs,iret)
  256. call mpi_file_read_at(iunit,file_offset(index)+5*4, &
  257. igarb,1,mpi_integer4, &
  258. mpi_status_ignore, ierr)
  259. CALL nl_set_isurban ( grid%id, igarb)
  260. VarName='ISWATER'
  261. call retrieve_index(index,VarName,varname_all,nrecs,iret)
  262. call mpi_file_read_at(iunit,file_offset(index)+5*4, &
  263. igarb,1,mpi_integer4, &
  264. mpi_status_ignore, ierr)
  265. write(0,*) 'setting iswater to be: ', igarb
  266. CALL nl_set_iswater (grid%id, igarb )
  267. VarName='ISICE'
  268. call retrieve_index(index,VarName,varname_all,nrecs,iret)
  269. call mpi_file_read_at(iunit,file_offset(index)+5*4, &
  270. igarb2,1,mpi_integer4, &
  271. mpi_status_ignore, ierr)
  272. write(0,*) 'setting isice to be: ', igarb2
  273. CALL nl_set_isice (grid%id, igarb2 )
  274. IF ( igarb .eq. 16 .and. igarb2 .eq. 24 ) THEN
  275. CALL nl_set_mminlu ( grid%id, 'USGS')
  276. ENDIF
  277. IF ( igarb .eq. 17 .and. igarb2 .eq. 15 ) THEN
  278. ! ambiguous
  279. CALL nl_set_mminlu ( grid%id, 'MODIFIED_IGBP_MODIS_NOAH')
  280. ! CALL nl_set_mminlu ( grid%id, 'MODIS')
  281. ENDIF
  282. IF ( igarb .eq. 15 .and. igarb2 .eq. 16 ) THEN
  283. CALL nl_set_mminlu ( grid%id, 'SiB')
  284. ENDIF
  285. VarName='FLAG_SNOWH'
  286. call retrieve_index(index,VarName,varname_all,nrecs,iret)
  287. call mpi_file_read_at(iunit,file_offset(index)+5*4, &
  288. igarb,1,mpi_integer4, &
  289. mpi_status_ignore, ierr)
  290. flag_snowh=igarb
  291. VarName='FLAG_SNOW'
  292. call retrieve_index(index,VarName,varname_all,nrecs,iret)
  293. call mpi_file_read_at(iunit,file_offset(index)+5*4, &
  294. igarb,1,mpi_integer4, &
  295. mpi_status_ignore, ierr)
  296. flag_snow=igarb
  297. VarName='FLAG_METGRID'
  298. call retrieve_index(index,VarName,varname_all,nrecs,iret)
  299. if (iret .eq. 0) then
  300. call mpi_file_read_at(iunit,file_offset(index)+5*4, &
  301. igarb,1,mpi_integer4, &
  302. mpi_status_ignore, ierr)
  303. flag_metgrid=igarb
  304. endif
  305. VarName='FLAG_SOILHGT'
  306. call retrieve_index(index,VarName,varname_all,nrecs,iret)
  307. if (iret .eq. 0) then
  308. call mpi_file_read_at(iunit,file_offset(index)+5*4, &
  309. igarb,1,mpi_integer4, &
  310. mpi_status_ignore, ierr)
  311. flag_soilhgt=igarb
  312. endif
  313. VarName='FLAG_PSFC'
  314. call retrieve_index(index,VarName,varname_all,nrecs,iret)
  315. if (iret .eq. 0) then
  316. call mpi_file_read_at(iunit,file_offset(index)+5*4, &
  317. igarb,1,mpi_integer4, &
  318. mpi_status_ignore, ierr)
  319. flag_psfc=igarb
  320. endif
  321. VarName='FLAG_SLP'
  322. call retrieve_index(index,VarName,varname_all,nrecs,iret)
  323. if (iret .eq. 0) then
  324. call mpi_file_read_at(iunit,file_offset(index)+5*4, &
  325. igarb,1,mpi_integer4, &
  326. mpi_status_ignore, ierr)
  327. flag_slp=igarb
  328. endif
  329. VarName='NUM_METGRID_SOIL_LEVELS'
  330. call retrieve_index(index,VarName,varname_all,nrecs,iret)
  331. call mpi_file_read_at(iunit,file_offset(index)+5*4, &
  332. igarb,1,mpi_integer4, &
  333. mpi_status_ignore, ierr)
  334. CALL nl_set_num_metgrid_soil_levels(grid%id, igarb)
  335. num_sw_levels_input=igarb
  336. VarName='FLAG_SOIL_LEVELS'
  337. call retrieve_index(index,VarName,varname_all,nrecs,iret)
  338. if (iret .eq. 0) then
  339. call mpi_file_read_at(iunit,file_offset(index)+5*4, &
  340. igarb,1,mpi_integer4, &
  341. mpi_status_ignore, ierr)
  342. flag_soil_levels=igarb
  343. endif
  344. VarName='FLAG_SOIL_LAYERS'
  345. call retrieve_index(index,VarName,varname_all,nrecs,iret)
  346. call mpi_file_read_at(iunit,file_offset(index)+5*4, &
  347. igarb,1,mpi_integer4, &
  348. mpi_status_ignore, ierr)
  349. flag_soil_layers=igarb
  350. VarName='ISLAKE'
  351. call retrieve_index(index,VarName,varname_all,nrecs,iret)
  352. call mpi_file_read_at(iunit,file_offset(index)+5*4, &
  353. igarb,1,mpi_integer4, &
  354. mpi_status_ignore, ierr)
  355. CALL nl_set_islake ( grid%id, igarb)
  356. VarName='ISOILWATER'
  357. call retrieve_index(index,VarName,varname_all,nrecs,iret)
  358. call mpi_file_read_at(iunit,file_offset(index)+5*4, &
  359. igarb,1,mpi_integer4, &
  360. mpi_status_ignore, ierr)
  361. CALL nl_set_isoilwater ( grid%id, igarb)
  362. VarName='MOAD_CEN_LAT'
  363. call retrieve_index(index,VarName,varname_all,nrecs,iret)
  364. call mpi_file_read_at(iunit,file_offset(index)+5*4, &
  365. garb,1,mpi_real4, &
  366. mpi_status_ignore, ierr)
  367. CALL nl_set_moad_cen_lat ( grid%id,garb)
  368. VarName='corner_lats'
  369. call retrieve_index(index,VarName,varname_all,nrecs,iret)
  370. call mpi_file_read_at(iunit,file_offset(index)+5*4, &
  371. lats16,16,mpi_real4, &
  372. mpi_status_ignore, ierr)
  373. VarName='corner_lons'
  374. call retrieve_index(index,VarName,varname_all,nrecs,iret)
  375. call mpi_file_read_at(iunit,file_offset(index)+5*4, &
  376. lons16,16,mpi_real4, &
  377. mpi_status_ignore, ierr)
  378. ! VarName='MMINLU'
  379. ! call retrieve_index(index,VarName,varname_all,nrecs,iret)
  380. ! if (iret .eq. 0) then
  381. ! call mpi_file_read_at(iunit,file_offset(index)+5*4, &
  382. ! dummychar,1,mpi_char, &
  383. ! mpi_status_ignore, ierr)
  384. ! endif
  385. hor_size=(IDE-IDS)*(JDE-JDS)
  386. hor_size_u=(IDE+1-IDS)*(JDE-JDS)
  387. hor_size_v=(IDE-IDS)*(JDE+1-JDS)
  388. varName='PRES'
  389. allocate(dumdata(IDS:IDE-1,JDS:JDE-1,num_metgrid_levels))
  390. allocate(dumdata_u(IDS:IDE,JDS:JDE-1,num_metgrid_levels))
  391. allocate(dumdata_v(IDS:IDE-1,JDS:JDE,num_metgrid_levels))
  392. CALL retrieve_index(index,VarName,varname_all,nrecs,iret)
  393. CALL mpi_file_read_at(iunit,file_offset(index+1), &
  394. dumdata,hor_size*num_metgrid_levels,mpi_real4, &
  395. mpi_status_ignore, ierr)
  396. DO K=1,num_metgrid_levels
  397. DO J=JTS,min(JTE,JDE-1)
  398. DO I=ITS,min(ITE,IDE-1)
  399. grid%p_gc(I,K,J)=dumdata(I,J,K)
  400. ENDDO
  401. ENDDO
  402. ENDDO
  403. varName='GHT'
  404. CALL retrieve_index(index,VarName,varname_all,nrecs,iret)
  405. CALL mpi_file_read_at(iunit,file_offset(index+1), &
  406. dumdata,hor_size*num_metgrid_levels,mpi_real4, &
  407. mpi_status_ignore, ierr)
  408. DO K=1,num_metgrid_levels
  409. DO J=JTS,min(JTE,JDE-1)
  410. DO I=ITS,min(ITE,IDE-1)
  411. grid%ght_gc(I,K,J)=dumdata(I,J,K)
  412. ENDDO
  413. ENDDO
  414. ENDDO
  415. varName='VEGCAT'
  416. CALL retrieve_index(index,VarName,varname_all,nrecs,iret)
  417. CALL mpi_file_read_at(iunit,file_offset(index+1), &
  418. dumdata,hor_size,mpi_real4, &
  419. mpi_status_ignore, ierr)
  420. DO J=JTS,min(JTE,JDE-1)
  421. DO I=ITS,min(ITE,IDE-1)
  422. grid%vegcat(I,J)=dumdata(I,J,1)
  423. ENDDO
  424. ENDDO
  425. ! varName='SOIL_CAT'
  426. ! CALL retrieve_index(index,VarName,varname_all,nrecs,iret)
  427. ! CALL mpi_file_read_at(iunit,file_offset(index+1), &
  428. ! dumdata,hor_size,mpi_real4, &
  429. ! mpi_status_ignore, ierr)
  430. ! DO J=JTS,min(JTE,JDE-1)
  431. ! DO I=ITS,min(ITE,IDE-1)
  432. ! grid%input_soil_cat(I,J)=dumdata(I,J,1)
  433. ! ENDDO
  434. ! ENDDO
  435. varName='CANWAT'
  436. CALL retrieve_index(index,VarName,varname_all,nrecs,iret)
  437. CALL mpi_file_read_at(iunit,file_offset(index+1), &
  438. dumdata,hor_size,mpi_real4, &
  439. mpi_status_ignore, ierr)
  440. DO J=JTS,min(JTE,JDE-1)
  441. DO I=ITS,min(ITE,IDE-1)
  442. grid%canwat(I,J)=dumdata(I,J,1)
  443. ENDDO
  444. ENDDO
  445. varName='SNOW'
  446. CALL retrieve_index(index,VarName,varname_all,nrecs,iret)
  447. CALL mpi_file_read_at(iunit,file_offset(index+1), &
  448. dumdata,hor_size,mpi_real4, &
  449. mpi_status_ignore, ierr)
  450. DO J=JTS,min(JTE,JDE-1)
  451. DO I=ITS,min(ITE,IDE-1)
  452. grid%snow(I,J)=dumdata(I,J,1)
  453. ENDDO
  454. ENDDO
  455. varName='SNOWH'
  456. CALL retrieve_index(index,VarName,varname_all,nrecs,iret)
  457. CALL mpi_file_read_at(iunit,file_offset(index+1), &
  458. dumdata,hor_size,mpi_real4, &
  459. mpi_status_ignore, ierr)
  460. DO J=JTS,min(JTE,JDE-1)
  461. DO I=ITS,min(ITE,IDE-1)
  462. grid%snowh(I,J)=dumdata(I,J,1)
  463. ENDDO
  464. ENDDO
  465. varName='SKINTEMP'
  466. CALL retrieve_index(index,VarName,varname_all,nrecs,iret)
  467. CALL mpi_file_read_at(iunit,file_offset(index+1), &
  468. dumdata,hor_size,mpi_real4, &
  469. mpi_status_ignore, ierr)
  470. DO J=JTS,min(JTE,JDE-1)
  471. DO I=ITS,min(ITE,IDE-1)
  472. grid%tsk_gc(I,J)=dumdata(I,J,1)
  473. ENDDO
  474. ENDDO
  475. varName='SOILHGT'
  476. CALL retrieve_index(index,VarName,varname_all,nrecs,iret)
  477. CALL mpi_file_read_at(iunit,file_offset(index+1), &
  478. dumdata,hor_size,mpi_real4, &
  479. mpi_status_ignore, ierr)
  480. DO J=JTS,min(JTE,JDE-1)
  481. DO I=ITS,min(ITE,IDE-1)
  482. grid%toposoil(I,J)=dumdata(I,J,1)
  483. ENDDO
  484. ENDDO
  485. ! varName='SEAICE'
  486. ! CALL retrieve_index(index,VarName,varname_all,nrecs,iret)
  487. ! CALL mpi_file_read_at(iunit,file_offset(index+1), &
  488. ! dumdata,hor_size,mpi_real4, &
  489. ! mpi_status_ignore, ierr)
  490. ! DO J=JTS,min(JTE,JDE-1)
  491. ! DO I=ITS,min(ITE,IDE-1)
  492. ! grid%xice_gc(I,J)=dumdata(I,J,1)
  493. ! ENDDO
  494. ! ENDDO
  495. varName='ST100200'
  496. CALL retrieve_index(index,VarName,varname_all,nrecs,iret)
  497. CALL mpi_file_read_at(iunit,file_offset(index+1), &
  498. dumdata,hor_size,mpi_real4, &
  499. mpi_status_ignore, ierr)
  500. DO J=JTS,min(JTE,JDE-1)
  501. DO I=ITS,min(ITE,IDE-1)
  502. grid%st100200(I,J)=dumdata(I,J,1)
  503. ENDDO
  504. ENDDO
  505. varName='ST040100'
  506. CALL retrieve_index(index,VarName,varname_all,nrecs,iret)
  507. CALL mpi_file_read_at(iunit,file_offset(index+1), &
  508. dumdata,hor_size,mpi_real4, &
  509. mpi_status_ignore, ierr)
  510. DO J=JTS,min(JTE,JDE-1)
  511. DO I=ITS,min(ITE,IDE-1)
  512. grid%st040100(I,J)=dumdata(I,J,1)
  513. ENDDO
  514. ENDDO
  515. varName='ST010040'
  516. CALL retrieve_index(index,VarName,varname_all,nrecs,iret)
  517. CALL mpi_file_read_at(iunit,file_offset(index+1), &
  518. dumdata,hor_size,mpi_real4, &
  519. mpi_status_ignore, ierr)
  520. DO J=JTS,min(JTE,JDE-1)
  521. DO I=ITS,min(ITE,IDE-1)
  522. grid%st010040(I,J)=dumdata(I,J,1)
  523. ENDDO
  524. ENDDO
  525. varName='ST000010'
  526. CALL retrieve_index(index,VarName,varname_all,nrecs,iret)
  527. CALL mpi_file_read_at(iunit,file_offset(index+1), &
  528. dumdata,hor_size,mpi_real4, &
  529. mpi_status_ignore, ierr)
  530. DO J=JTS,min(JTE,JDE-1)
  531. DO I=ITS,min(ITE,IDE-1)
  532. grid%st000010(I,J)=dumdata(I,J,1)
  533. ENDDO
  534. ENDDO
  535. varName='SM100200'
  536. CALL retrieve_index(index,VarName,varname_all,nrecs,iret)
  537. CALL mpi_file_read_at(iunit,file_offset(index+1), &
  538. dumdata,hor_size,mpi_real4, &
  539. mpi_status_ignore, ierr)
  540. DO J=JTS,min(JTE,JDE-1)
  541. DO I=ITS,min(ITE,IDE-1)
  542. grid%sm100200(I,J)=dumdata(I,J,1)
  543. ENDDO
  544. ENDDO
  545. varName='SM040100'
  546. CALL retrieve_index(index,VarName,varname_all,nrecs,iret)
  547. CALL mpi_file_read_at(iunit,file_offset(index+1), &
  548. dumdata,hor_size,mpi_real4, &
  549. mpi_status_ignore, ierr)
  550. DO J=JTS,min(JTE,JDE-1)
  551. DO I=ITS,min(ITE,IDE-1)
  552. grid%sm040100(I,J)=dumdata(I,J,1)
  553. ENDDO
  554. ENDDO
  555. varName='SM010040'
  556. CALL retrieve_index(index,VarName,varname_all,nrecs,iret)
  557. CALL mpi_file_read_at(iunit,file_offset(index+1), &
  558. dumdata,hor_size,mpi_real4, &
  559. mpi_status_ignore, ierr)
  560. DO J=JTS,min(JTE,JDE-1)
  561. DO I=ITS,min(ITE,IDE-1)
  562. grid%sm010040(I,J)=dumdata(I,J,1)
  563. ENDDO
  564. ENDDO
  565. varName='SM000010'
  566. CALL retrieve_index(index,VarName,varname_all,nrecs,iret)
  567. CALL mpi_file_read_at(iunit,file_offset(index+1), &
  568. dumdata,hor_size,mpi_real4, &
  569. mpi_status_ignore, ierr)
  570. DO J=JTS,min(JTE,JDE-1)
  571. DO I=ITS,min(ITE,IDE-1)
  572. grid%sm000010(I,J)=dumdata(I,J,1)
  573. ENDDO
  574. ENDDO
  575. varName='PSFC'
  576. CALL retrieve_index(index,VarName,varname_all,nrecs,iret)
  577. CALL mpi_file_read_at(iunit,file_offset(index+1), &
  578. dumdata,hor_size,mpi_real4, &
  579. mpi_status_ignore, ierr)
  580. if ( ierr .eq. 0 ) flag_psfc=1
  581. DO J=JTS,min(JTE,JDE-1)
  582. DO I=ITS,min(ITE,IDE-1)
  583. grid%psfc(I,J)=dumdata(I,J,1)
  584. ENDDO
  585. ENDDO
  586. varName='RH'
  587. CALL retrieve_index(index,VarName,varname_all,nrecs,iret)
  588. CALL mpi_file_read_at(iunit,file_offset(index+1), &
  589. dumdata,hor_size*num_metgrid_levels,mpi_real4, &
  590. mpi_status_ignore, ierr)
  591. DO K=1,num_metgrid_levels
  592. DO J=JTS,min(JTE,JDE-1)
  593. DO I=ITS,min(ITE,IDE-1)
  594. grid%rh_gc(I,K,J)=dumdata(I,J,K)
  595. ENDDO
  596. ENDDO
  597. ENDDO
  598. varName='VV'
  599. CALL retrieve_index(index,VarName,varname_all,nrecs,iret)
  600. CALL mpi_file_read_at(iunit,file_offset(index+1), &
  601. dumdata_v,hor_size_v*num_metgrid_levels,mpi_real4, &
  602. mpi_status_ignore, ierr)
  603. DO K=1,num_metgrid_levels
  604. DO J=JTS,min(JTE,JDE)
  605. DO I=ITS,min(ITE,IDE-1)
  606. grid%v_gc(I,K,J)=dumdata_v(I,J,K)
  607. if (grid%v_gc(I,K,J) .ne. grid%v_gc(I,K,J) .or. abs(grid%v_gc(I,K,J)) .gt. 100.) then
  608. write(0,*) 'bad v_gc defined: ', I,K,J,grid%v_gc(I,K,J)
  609. call wrf_error_fatal(" bad v_gc")
  610. endif
  611. ENDDO
  612. ENDDO
  613. ENDDO
  614. varName='UU'
  615. CALL retrieve_index(index,VarName,varname_all,nrecs,iret)
  616. CALL mpi_file_read_at(iunit,file_offset(index+1), &
  617. dumdata_u,hor_size_u*num_metgrid_levels,mpi_real4, &
  618. mpi_status_ignore, ierr)
  619. DO K=1,num_metgrid_levels
  620. DO J=JTS,min(JTE,JDE-1)
  621. DO I=ITS,min(ITE,IDE)
  622. grid%u_gc(I,K,J)=dumdata_u(I,J,K)
  623. if (grid%u_gc(I,K,J) .ne. grid%u_gc(I,K,J) .or. abs(grid%u_gc(I,K,J)) .gt. 100.) then
  624. write(0,*) 'bad u_gc defined: ', I,K,J,grid%u_gc(I,K,J)
  625. call wrf_error_fatal(" bad u_gc")
  626. endif
  627. ENDDO
  628. ENDDO
  629. ENDDO
  630. varName='TT'
  631. CALL retrieve_index(index,VarName,varname_all,nrecs,iret)
  632. CALL mpi_file_read_at(iunit,file_offset(index+1), &
  633. dumdata,hor_size*num_metgrid_levels,mpi_real4, &
  634. mpi_status_ignore, ierr)
  635. DO K=1,num_metgrid_levels
  636. DO J=JTS,min(JTE,JDE-1)
  637. DO I=ITS,min(ITE,IDE-1)
  638. grid%t_gc(I,K,J)=dumdata(I,J,K)
  639. if (grid%t_gc(I,K,J) .ne. grid%t_gc(I,K,J) .or. abs(grid%t_gc(I,K,J)) .gt. 350.) then
  640. write(0,*) 'bad t_gc defined: ', I,K,J,grid%t_gc(I,K,J)
  641. call wrf_error_fatal(" bad t_gc")
  642. endif
  643. ENDDO
  644. ENDDO
  645. ENDDO
  646. ! varName='RWMR'
  647. ! CALL retrieve_index(index,VarName,varname_all,nrecs,iret)
  648. ! CALL mpi_file_read_at(iunit,file_offset(index+1), &
  649. ! dumdata,hor_size*num_metgrid_levels,mpi_real4, &
  650. ! mpi_status_ignore, ierr)
  651. ! DO K=1,num_metgrid_levels
  652. ! DO J=JTS,min(JTE,JDE-1)
  653. ! DO I=ITS,min(ITE,IDE-1)
  654. ! grid%nmm_rwmr_gc(I,J,K)=dumdata(I,J,K)
  655. ! ENDDO
  656. ! ENDDO
  657. ! ENDDO
  658. ! varName='SNMR'
  659. ! CALL retrieve_index(index,VarName,varname_all,nrecs,iret)
  660. ! CALL mpi_file_read_at(iunit,file_offset(index+1), &
  661. ! dumdata,hor_size*num_metgrid_levels,mpi_real4, &
  662. ! mpi_status_ignore, ierr)
  663. ! DO K=1,num_metgrid_levels
  664. ! DO J=JTS,min(JTE,JDE-1)
  665. ! DO I=ITS,min(ITE,IDE-1)
  666. ! grid%nmm_snmr_gc(I,J,K)=dumdata(I,J,K)
  667. ! ENDDO
  668. ! ENDDO
  669. ! ENDDO
  670. ! varName='CLWMR'
  671. ! CALL retrieve_index(index,VarName,varname_all,nrecs,iret)
  672. ! CALL mpi_file_read_at(iunit,file_offset(index+1), &
  673. ! dumdata,hor_size*num_metgrid_levels,mpi_real4, &
  674. ! mpi_status_ignore, ierr)
  675. ! DO K=1,num_metgrid_levels
  676. ! DO J=JTS,min(JTE,JDE-1)
  677. ! DO I=ITS,min(ITE,IDE-1)
  678. ! grid%nmm_clwmr_gc(I,J,K)=dumdata(I,J,K)
  679. ! ENDDO
  680. ! ENDDO
  681. ! ENDDO
  682. ! varName='CICE'
  683. ! CALL retrieve_index(index,VarName,varname_all,nrecs,iret)
  684. ! CALL mpi_file_read_at(iunit,file_offset(index+1), &
  685. ! dumdata,hor_size*num_metgrid_levels,mpi_real4, &
  686. ! mpi_status_ignore, ierr)
  687. ! DO K=1,num_metgrid_levels
  688. ! DO J=JTS,min(JTE,JDE-1)
  689. ! DO I=ITS,min(ITE,IDE-1)
  690. ! grid%nmm_cice_gc(I,J,K)=dumdata(I,J,K)
  691. ! ENDDO
  692. ! ENDDO
  693. ! ENDDO
  694. ! varName='FRIMEF'
  695. ! CALL retrieve_index(index,VarName,varname_all,nrecs,iret)
  696. ! CALL mpi_file_read_at(iunit,file_offset(index+1), &
  697. ! dumdata,hor_size*num_metgrid_levels,mpi_real4, &
  698. ! mpi_status_ignore, ierr)
  699. ! DO K=1,num_metgrid_levels
  700. ! DO J=JTS,min(JTE,JDE-1)
  701. ! DO I=ITS,min(ITE,IDE-1)
  702. ! grid%nmm_rimef_gc(I,J,K)=dumdata(I,J,K)
  703. ! ENDDO
  704. ! ENDDO
  705. ! ENDDO
  706. varName='PMSL'
  707. CALL retrieve_index(index,VarName,varname_all,nrecs,iret)
  708. CALL mpi_file_read_at(iunit,file_offset(index+1), &
  709. dumdata,hor_size,mpi_real4, &
  710. mpi_status_ignore, ierr)
  711. DO J=JTS,min(JTE,JDE-1)
  712. DO I=ITS,min(ITE,IDE-1)
  713. grid%pslv_gc(I,J)=dumdata(I,J,1)
  714. ENDDO
  715. ENDDO
  716. varName='SLOPECAT'
  717. CALL retrieve_index(index,VarName,varname_all,nrecs,iret)
  718. CALL mpi_file_read_at(iunit,file_offset(index+1), &
  719. dumdata,hor_size,mpi_real4, &
  720. mpi_status_ignore, ierr)
  721. DO J=JTS,min(JTE,JDE-1)
  722. DO I=ITS,min(ITE,IDE-1)
  723. grid%slopecat(I,J)=dumdata(I,J,1)
  724. ENDDO
  725. ENDDO
  726. varName='SNOALB'
  727. CALL retrieve_index(index,VarName,varname_all,nrecs,iret)
  728. CALL mpi_file_read_at(iunit,file_offset(index+1), &
  729. dumdata,hor_size,mpi_real4, &
  730. mpi_status_ignore, ierr)
  731. DO J=JTS,min(JTE,JDE-1)
  732. DO I=ITS,min(ITE,IDE-1)
  733. grid%snoalb(I,J)=dumdata(I,J,1)
  734. ENDDO
  735. ENDDO
  736. num_veg_cat = SIZE ( grid%landusef , DIM=2 )
  737. num_soil_top_cat = SIZE ( grid%soilctop , DIM=2 )
  738. num_soil_bot_cat = SIZE ( grid%soilcbot , DIM=2 )
  739. varName='GREENFRAC'
  740. CALL retrieve_index(index,VarName,varname_all,nrecs,iret)
  741. CALL mpi_file_read_at(iunit,file_offset(index+1), &
  742. dumdata,hor_size*12,mpi_real4, &
  743. mpi_status_ignore, ierr)
  744. DO K=1,12
  745. DO J=JTS,min(JTE,JDE-1)
  746. DO I=ITS,min(ITE,IDE-1)
  747. grid%greenfrac(I,K,J)=dumdata(I,J,K)
  748. ENDDO
  749. ENDDO
  750. ENDDO
  751. varName='ALBEDO12M'
  752. CALL retrieve_index(index,VarName,varname_all,nrecs,iret)
  753. CALL mpi_file_read_at(iunit,file_offset(index+1), &
  754. dumdata,hor_size*12,mpi_real4, &
  755. mpi_status_ignore, ierr)
  756. DO K=1,12
  757. DO J=JTS,min(JTE,JDE-1)
  758. DO I=ITS,min(ITE,IDE-1)
  759. grid%albedo12m(I,K,J)=dumdata(I,J,K)
  760. ENDDO
  761. ENDDO
  762. ENDDO
  763. varName='SOILCBOT'
  764. CALL retrieve_index(index,VarName,varname_all,nrecs,iret)
  765. CALL mpi_file_read_at(iunit,file_offset(index+1), &
  766. dumdata,hor_size*num_soil_bot_cat,mpi_real4, &
  767. mpi_status_ignore, ierr)
  768. DO K=1,num_soil_bot_cat
  769. DO J=JTS,min(JTE,JDE-1)
  770. DO I=ITS,min(ITE,IDE-1)
  771. grid%soilcbot(I,K,J)=dumdata(I,J,K)
  772. ENDDO
  773. ENDDO
  774. ENDDO
  775. varName='SOILCAT'
  776. CALL retrieve_index(index,VarName,varname_all,nrecs,iret)
  777. CALL mpi_file_read_at(iunit,file_offset(index+1), &
  778. dumdata,hor_size,mpi_real4, &
  779. mpi_status_ignore, ierr)
  780. DO J=JTS,min(JTE,JDE-1)
  781. DO I=ITS,min(ITE,IDE-1)
  782. grid%soilcat(I,J)=dumdata(I,J,1)
  783. ENDDO
  784. ENDDO
  785. write(0,*) 'veg_cat and soil_cat sizes:::: ', num_veg_cat , num_soil_top_cat
  786. varName='SOILCTOP'
  787. CALL retrieve_index(index,VarName,varname_all,nrecs,iret)
  788. CALL mpi_file_read_at(iunit,file_offset(index+1), &
  789. dumdata,hor_size*num_soil_top_cat,mpi_real4, &
  790. mpi_status_ignore, ierr)
  791. DO K=1,num_soil_top_cat
  792. DO J=JTS,min(JTE,JDE-1)
  793. DO I=ITS,min(ITE,IDE-1)
  794. grid%soilctop(I,K,J)=dumdata(I,J,K)
  795. ENDDO
  796. ENDDO
  797. ENDDO
  798. varName='SOILTEMP'
  799. CALL retrieve_index(index,VarName,varname_all,nrecs,iret)
  800. CALL mpi_file_read_at(iunit,file_offset(index+1), &
  801. dumdata,hor_size,mpi_real4, &
  802. mpi_status_ignore, ierr)
  803. DO J=JTS,min(JTE,JDE-1)
  804. DO I=ITS,min(ITE,IDE-1)
  805. grid%tmn_gc(I,J)=dumdata(I,J,1)
  806. ENDDO
  807. ENDDO
  808. ! varName='HGT_V'
  809. ! CALL retrieve_index(index,VarName,varname_all,nrecs,iret)
  810. ! CALL mpi_file_read_at(iunit,file_offset(index+1), &
  811. ! dumdata,hor_size,mpi_real4, &
  812. ! mpi_status_ignore, ierr)
  813. !
  814. ! DO J=JTS,min(JTE,JDE-1)
  815. ! DO I=ITS,min(ITE,IDE-1)
  816. ! grid%nmm_htv_gc(I,J)=dumdata(I,J,1)
  817. ! ENDDO
  818. ! ENDDO
  819. varName='HGT_M'
  820. CALL retrieve_index(index,VarName,varname_all,nrecs,iret)
  821. CALL mpi_file_read_at(iunit,file_offset(index+1), &
  822. dumdata,hor_size,mpi_real4, &
  823. mpi_status_ignore, ierr)
  824. DO J=JTS,min(JTE,JDE-1)
  825. DO I=ITS,min(ITE,IDE-1)
  826. grid%ht_gc(I,J)=dumdata(I,J,1)
  827. ENDDO
  828. ENDDO
  829. varName='LU_INDEX'
  830. CALL retrieve_index(index,VarName,varname_all,nrecs,iret)
  831. CALL mpi_file_read_at(iunit,file_offset(index+1), &
  832. dumdata,hor_size,mpi_real4, &
  833. mpi_status_ignore, ierr)
  834. DO J=JTS,min(JTE,JDE-1)
  835. DO I=ITS,min(ITE,IDE-1)
  836. grid%lu_index(I,J)=dumdata(I,J,1)
  837. ENDDO
  838. ENDDO
  839. varName='LANDUSEF'
  840. CALL retrieve_index(index,VarName,varname_all,nrecs,iret)
  841. CALL mpi_file_read_at(iunit,file_offset(index+1), &
  842. dumdata,hor_size*num_veg_cat,mpi_real4, &
  843. mpi_status_ignore, ierr)
  844. DO K=1,num_veg_cat
  845. DO J=JTS,min(JTE,JDE-1)
  846. DO I=ITS,min(ITE,IDE-1)
  847. grid%landusef(I,K,J)=dumdata(I,J,K)
  848. ENDDO
  849. ENDDO
  850. ENDDO
  851. varName='LANDMASK'
  852. CALL retrieve_index(index,VarName,varname_all,nrecs,iret)
  853. CALL mpi_file_read_at(iunit,file_offset(index+1), &
  854. dumdata,hor_size,mpi_real4, &
  855. mpi_status_ignore, ierr)
  856. DO J=JTS,min(JTE,JDE-1)
  857. DO I=ITS,min(ITE,IDE-1)
  858. grid%landmask(I,J)=dumdata(I,J,1)
  859. ENDDO
  860. ENDDO
  861. varName='F'
  862. CALL retrieve_index(index,VarName,varname_all,nrecs,iret)
  863. CALL mpi_file_read_at(iunit,file_offset(index+1), &
  864. dumdata,hor_size,mpi_real4, &
  865. mpi_status_ignore, ierr)
  866. DO J=JTS,min(JTE,JDE-1)
  867. DO I=ITS,min(ITE,IDE-1)
  868. grid%f(I,J)=dumdata(I,J,1)
  869. ENDDO
  870. ENDDO
  871. varName='E'
  872. CALL retrieve_index(index,VarName,varname_all,nrecs,iret)
  873. CALL mpi_file_read_at(iunit,file_offset(index+1), &
  874. dumdata,hor_size,mpi_real4, &
  875. mpi_status_ignore, ierr)
  876. DO J=JTS,min(JTE,JDE-1)
  877. DO I=ITS,min(ITE,IDE-1)
  878. grid%e(I,J)=dumdata(I,J,1)
  879. ENDDO
  880. ENDDO
  881. varName='COSALPHA'
  882. CALL retrieve_index(index,VarName,varname_all,nrecs,iret)
  883. CALL mpi_file_read_at(iunit,file_offset(index+1), &
  884. dumdata,hor_size,mpi_real4, &
  885. mpi_status_ignore, ierr)
  886. DO J=JTS,min(JTE,JDE-1)
  887. DO I=ITS,min(ITE,IDE-1)
  888. grid%cosa(I,J)=dumdata(I,J,1)
  889. ENDDO
  890. ENDDO
  891. varName='SINALPHA'
  892. CALL retrieve_index(index,VarName,varname_all,nrecs,iret)
  893. CALL mpi_file_read_at(iunit,file_offset(index+1), &
  894. dumdata,hor_size,mpi_real4, &
  895. mpi_status_ignore, ierr)
  896. DO J=JTS,min(JTE,JDE-1)
  897. DO I=ITS,min(ITE,IDE-1)
  898. grid%sina(I,J)=dumdata(I,J,1)
  899. ENDDO
  900. ENDDO
  901. varName='MAPFAC_U'
  902. CALL retrieve_index(index,VarName,varname_all,nrecs,iret)
  903. CALL mpi_file_read_at(iunit,file_offset(index+1), &
  904. dumdata_u,hor_size_u,mpi_real4, &
  905. mpi_status_ignore, ierr)
  906. DO J=JTS,min(JTE,JDE-1)
  907. DO I=ITS,min(ITE,IDE)
  908. grid%msfu(I,J)=dumdata_u(I,J,1)
  909. !! bandaid for newly created WPS geogrid static files
  910. if (grid%msfu(I,J) .lt. 0.7) then
  911. write(0,*) 'weird msfu at I,J: ', I,J,grid%msfu(I,J)
  912. if(J .eq. min(JTE,JDE-1)) then
  913. grid%msfu(I,J)=dumdata_u(I,J-1,1)
  914. write(0,*) 'changing msfu to: ',I,J, grid%msfu(I,J)
  915. endif
  916. endif
  917. !! end bandaid
  918. ENDDO
  919. ENDDO
  920. varName='MAPFAC_V'
  921. CALL retrieve_index(index,VarName,varname_all,nrecs,iret)
  922. CALL mpi_file_read_at(iunit,file_offset(index+1), &
  923. dumdata_v,hor_size_v,mpi_real4, &
  924. mpi_status_ignore, ierr)
  925. DO J=JTS,min(JTE,JDE)
  926. DO I=ITS,min(ITE,IDE-1)
  927. grid%msfv(I,J)=dumdata_v(I,J,1)
  928. if (grid%msfv(I,J) .lt. 0.7 ) then
  929. write(0,*) 'weird msfv at I,J: ', I,J,grid%msfv(I,J)
  930. grid%msfv(I,J)=dumdata_v(I,J-1,1)
  931. if( J .eq. min(JTE,JDE)) then
  932. write(0,*) 'changing msfv to: ',I,J, grid%msfv(I,J)
  933. endif
  934. endif
  935. ENDDO
  936. ENDDO
  937. varName='MAPFAC_M'
  938. CALL retrieve_index(index,VarName,varname_all,nrecs,iret)
  939. CALL mpi_file_read_at(iunit,file_offset(index+1), &
  940. dumdata,hor_size,mpi_real4, &
  941. mpi_status_ignore, ierr)
  942. DO J=JTS,min(JTE,JDE-1)
  943. DO I=ITS,min(ITE,IDE-1)
  944. grid%msft(I,J)=dumdata(I,J,1)
  945. ENDDO
  946. ENDDO
  947. varName='CLAT'
  948. CALL retrieve_index(index,VarName,varname_all,nrecs,iret)
  949. CALL mpi_file_read_at(iunit,file_offset(index+1), &
  950. dumdata,hor_size,mpi_real4, &
  951. mpi_status_ignore, ierr)
  952. DO J=JTS,min(JTE,JDE-1)
  953. DO I=ITS,min(ITE,IDE-1)
  954. grid%clat(I,J)=dumdata(I,J,1)
  955. ENDDO
  956. ENDDO
  957. varName='XLONG_U'
  958. CALL retrieve_index(index,VarName,varname_all,nrecs,iret)
  959. CALL mpi_file_read_at(iunit,file_offset(index+1), &
  960. dumdata_u,hor_size_u,mpi_real4, &
  961. mpi_status_ignore, ierr)
  962. DO J=JTS,min(JTE,JDE-1)
  963. DO I=ITS,min(ITE,IDE)
  964. grid%xlong_u(I,J)=dumdata_u(I,J,1)
  965. ENDDO
  966. ENDDO
  967. varName='XLAT_U'
  968. CALL retrieve_index(index,VarName,varname_all,nrecs,iret)
  969. CALL mpi_file_read_at(iunit,file_offset(index+1), &
  970. dumdata_u,hor_size_u,mpi_real4, &
  971. mpi_status_ignore, ierr)
  972. DO J=JTS,min(JTE,JDE-1)
  973. DO I=ITS,min(ITE,IDE)
  974. grid%xlat_u(I,J)=dumdata_u(I,J,1)
  975. ENDDO
  976. ENDDO
  977. varName='XLONG_V'
  978. CALL retrieve_index(index,VarName,varname_all,nrecs,iret)
  979. CALL mpi_file_read_at(iunit,file_offset(index+1), &
  980. dumdata_v,hor_size_v,mpi_real4, &
  981. mpi_status_ignore, ierr)
  982. DO J=JTS,min(JTE,JDE)
  983. DO I=ITS,min(ITE,IDE-1)
  984. grid%xlong_v(I,J)=dumdata_v(I,J,1)
  985. ENDDO
  986. ENDDO
  987. varName='XLAT_V'
  988. CALL retrieve_index(index,VarName,varname_all,nrecs,iret)
  989. CALL mpi_file_read_at(iunit,file_offset(index+1), &
  990. dumdata_v,hor_size_v,mpi_real4, &
  991. mpi_status_ignore, ierr)
  992. DO J=JTS,min(JTE,JDE)
  993. DO I=ITS,min(ITE,IDE-1)
  994. grid%xlat_v(I,J)=dumdata_v(I,J,1)
  995. ENDDO
  996. ENDDO
  997. varName='XLONG_M'
  998. CALL retrieve_index(index,VarName,varname_all,nrecs,iret)
  999. CALL mpi_file_read_at(iunit,file_offset(index+1), &
  1000. dumdata,hor_size,mpi_real4, &
  1001. mpi_status_ignore, ierr)
  1002. DO J=JTS,min(JTE,JDE-1)
  1003. DO I=ITS,min(ITE,IDE-1)
  1004. grid%xlong_gc(I,J)=dumdata(I,J,1)
  1005. ENDDO
  1006. ENDDO
  1007. write(0,*) 'reading XLAT_M'
  1008. varName='XLAT_M'
  1009. CALL retrieve_index(index,VarName,varname_all,nrecs,iret)
  1010. CALL mpi_file_read_at(iunit,file_offset(index+1), &
  1011. dumdata,hor_size,mpi_real4, &
  1012. mpi_status_ignore, ierr)
  1013. DO J=JTS,min(JTE,JDE-1)
  1014. DO I=ITS,min(ITE,IDE-1)
  1015. grid%xlat_gc(I,J)=dumdata(I,J,1)
  1016. ENDDO
  1017. ENDDO
  1018. write(0,*) 'xlat_gc defined'
  1019. call mpi_file_close(mpi_comm_world, ierr)
  1020. write(0,*) 'to ST000010 def'
  1021. varName='ST000010'
  1022. flag_st000010 = 1
  1023. num_st_levels_input = num_st_levels_input + 1
  1024. st_levels_input(num_st_levels_input) = char2int2(varName(3:8))
  1025. DO J=JTS,min(JTE,JDE-1)
  1026. DO I=ITS,min(ITE,IDE-1)
  1027. st_input(I,num_st_levels_input + 1,J) = grid%st000010(i,j)
  1028. ENDDO
  1029. ENDDO
  1030. write(0,*) 'past ST000010 def'
  1031. varName='ST010040'
  1032. flag_st010040 = 1
  1033. num_st_levels_input = num_st_levels_input + 1
  1034. st_levels_input(num_st_levels_input) = char2int2(varName(3:8))
  1035. DO J=JTS,min(JTE,JDE-1)
  1036. DO I=ITS,min(ITE,IDE-1)
  1037. st_input(I,num_st_levels_input + 1,J) = grid%st010040(i,j)
  1038. ENDDO
  1039. ENDDO
  1040. varName='ST040100'
  1041. flag_st040100 = 1
  1042. num_st_levels_input = num_st_levels_input + 1
  1043. st_levels_input(num_st_levels_input) = char2int2(varName(3:8))
  1044. DO J=JTS,min(JTE,JDE-1)
  1045. DO I=ITS,min(ITE,IDE-1)
  1046. st_input(I,num_st_levels_input + 1,J) = grid%st040100(i,j)
  1047. ENDDO
  1048. ENDDO
  1049. varName='ST100200'
  1050. flag_st100200 = 1
  1051. num_st_levels_input = num_st_levels_input + 1
  1052. st_levels_input(num_st_levels_input) = char2int2(varName(3:8))
  1053. DO J=JTS,min(JTE,JDE-1)
  1054. DO I=ITS,min(ITE,IDE-1)
  1055. st_input(I,num_st_levels_input + 1,J) = grid%st100200(i,j)
  1056. ENDDO
  1057. ENDDO
  1058. varName='SM000010'
  1059. flag_sm000010 = 1
  1060. num_sm_levels_input = num_sm_levels_input + 1
  1061. sm_levels_input(num_sm_levels_input) = char2int2(varName(3:8))
  1062. DO J=JTS,min(JTE,JDE-1)
  1063. DO I=ITS,min(ITE,IDE-1)
  1064. sm_input(I,num_sm_levels_input + 1,J) = grid%sm000010(i,j)
  1065. ENDDO
  1066. ENDDO
  1067. varName='SM010040'
  1068. flag_sm010040 = 1
  1069. num_sm_levels_input = num_sm_levels_input + 1
  1070. sm_levels_input(num_sm_levels_input) = char2int2(varName(3:8))
  1071. DO J=JTS,min(JTE,JDE-1)
  1072. DO I=ITS,min(ITE,IDE-1)
  1073. sm_input(I,num_sm_levels_input + 1,J) = grid%sm010040(i,j)
  1074. ENDDO
  1075. ENDDO
  1076. varName='SM040100'
  1077. flag_sm040100 = 1
  1078. num_sm_levels_input = num_sm_levels_input + 1
  1079. sm_levels_input(num_sm_levels_input) = char2int2(varName(3:8))
  1080. DO J=JTS,min(JTE,JDE-1)
  1081. DO I=ITS,min(ITE,IDE-1)
  1082. sm_input(I,num_sm_levels_input + 1,J) = grid%sm040100(i,j)
  1083. ENDDO
  1084. ENDDO
  1085. varName='SM100200'
  1086. flag_sm100200 = 1
  1087. num_sm_levels_input = num_sm_levels_input + 1
  1088. sm_levels_input(num_sm_levels_input) = char2int2(varName(3:8))
  1089. DO J=JTS,min(JTE,JDE-1)
  1090. DO I=ITS,min(ITE,IDE-1)
  1091. sm_input(I,num_sm_levels_input + 1,J) = grid%sm100200(i,j)
  1092. ENDDO
  1093. ENDDO
  1094. ! flag_sst = 1
  1095. write(0,*) 'maxval st_input(1): ', maxval(st_input(:,1,:))
  1096. write(0,*) 'maxval st_input(2): ', maxval(st_input(:,2,:))
  1097. write(0,*) 'maxval st_input(3): ', maxval(st_input(:,3,:))
  1098. write(0,*) 'maxval st_input(4): ', maxval(st_input(:,4,:))
  1099. DEALLOCATE(pmsl)
  1100. DEALLOCATE(psfc_in)
  1101. DEALLOCATE(dumdata)
  1102. DEALLOCATE(dumdata_u)
  1103. DEALLOCATE(dumdata_v)
  1104. #endif
  1105. end subroutine read_wps
  1106. ! -------------------------------------------------------------------------
  1107. ! -------------------------------------------------------------------------
  1108. !!!! MPI-IO pieces
  1109. subroutine retrieve_index(index,string,varname_all,nrecs,iret)
  1110. !$$$ subprogram documentation block
  1111. ! . . . .
  1112. ! subprogram: retrieve_index get record number of desired variable
  1113. ! prgmmr: parrish org: np22 date: 2004-11-29
  1114. !
  1115. ! abstract: by examining previously generated inventory of wrf binary restart file,
  1116. ! find record number that contains the header record for variable
  1117. ! identified by input character variable "string".
  1118. !
  1119. ! program history log:
  1120. ! 2004-11-29 parrish
  1121. !
  1122. ! input argument list:
  1123. ! string - mnemonic for variable desired
  1124. ! varname_all - list of all mnemonics obtained from inventory of file
  1125. ! nrecs - total number of sequential records counted in wrf
  1126. ! binary restart file
  1127. !
  1128. ! output argument list:
  1129. ! index - desired record number
  1130. ! iret - return status, set to 0 if variable was found,
  1131. ! non-zero if not.
  1132. !
  1133. ! attributes:
  1134. ! language: f90
  1135. ! machine: ibm RS/6000 SP
  1136. !
  1137. !$$$
  1138. implicit none
  1139. integer,intent(out)::iret
  1140. integer,intent(in)::nrecs
  1141. integer,intent(out):: index
  1142. character(*), intent(in):: string
  1143. character(132),intent(in)::varname_all(nrecs)
  1144. integer i
  1145. iret=0
  1146. do i=1,nrecs
  1147. if(trim(string) == trim(varname_all(i))) then
  1148. index=i
  1149. return
  1150. end if
  1151. end do
  1152. write(6,*)' problem reading wrf nmm binary file, rec id "',trim(string),'" not found'
  1153. iret=-1
  1154. end subroutine retrieve_index
  1155. subroutine next_buf(in_unit,buf,nextbyte,locbyte,thisblock,lrecl,nreads,lastbuf)
  1156. !$$$ subprogram documentation block
  1157. ! . . . .
  1158. ! subprogram: next_buf bring in next direct access block
  1159. ! prgmmr: parrish org: np22 date: 2004-11-29
  1160. !
  1161. ! abstract: bring in next direct access block when needed, as the file is scanned
  1162. ! from beginning to end during counting and inventory of records.
  1163. ! (subroutines count_recs_wrf_binary_file and inventory_wrf_binary_file)
  1164. !
  1165. ! program history log:
  1166. ! 2004-11-29 parrish
  1167. !
  1168. ! input argument list:
  1169. ! in_unit - fortran unit number where input file is opened through.
  1170. ! nextbyte - byte number from beginning of file that is desired
  1171. ! locbyte - byte number from beginning of last block read for desired byt
  1172. ! lrecl - direct access block length
  1173. ! nreads - number of blocks read before now (for diagnostic information
  1174. ! lastbuf - logical, if true, then no more blocks, so return
  1175. !
  1176. ! output argument list:
  1177. ! buf - output array containing contents of next block
  1178. ! locbyte - byte number from beginning of new block read for desired byte
  1179. ! thisblock - number of new block being read by this routine
  1180. ! nreads - number of blocks read now (for diagnostic information only)
  1181. ! lastbuf - logical, if true, then at end of file.
  1182. !
  1183. ! attributes:
  1184. ! language: f90
  1185. ! machine: ibm RS/6000 SP
  1186. !
  1187. !$$$
  1188. ! use kinds, only: i_byte,i_llong
  1189. implicit none
  1190. integer(i_llong) lrecl
  1191. integer in_unit,nreads
  1192. integer(i_byte) buf(lrecl)
  1193. integer(i_llong) nextbyte,locbyte,thisblock
  1194. logical lastbuf
  1195. integer ierr
  1196. if(lastbuf) return
  1197. ierr=0
  1198. nreads=nreads+1
  1199. ! compute thisblock:
  1200. thisblock = 1_i_llong + (nextbyte-1_i_llong)/lrecl
  1201. locbyte = 1_i_llong+mod(locbyte-1_i_llong,lrecl)
  1202. read(in_unit,rec=thisblock,iostat=ierr)buf
  1203. lastbuf = ierr /= 0
  1204. end subroutine next_buf
  1205. subroutine inventory_wrf_binary_file(in_unit,wrf_ges_filename,nrecs, &
  1206. datestr_all,varname_all,domainend_all, &
  1207. start_block,end_block,start_byte,end_byte,file_offset)
  1208. !$$$ subprogram documentation block
  1209. ! . . . .
  1210. ! subprogram: inventory_wrf_binary_file get contents of wrf binary file
  1211. ! prgmmr: parrish org: np22 date: 2004-11-29
  1212. !
  1213. ! abstract: generate list of contents and map of wrf binary file which can be
  1214. ! used for reading and writing with mpi io routines.
  1215. ! same basic routine as count_recs_wrf_binary_file, except
  1216. ! now wrf unpacking routines are used to decode wrf header
  1217. ! records, and send back lists of variable mnemonics, dates,
  1218. ! grid dimensions, and byte addresses relative to start of
  1219. ! file for each field (this is used by mpi io routines).
  1220. !
  1221. ! program history log:
  1222. ! 2004-11-29 parrish
  1223. !
  1224. !
  1225. ! input argument list:
  1226. ! in_unit - fortran unit number where input file is opened through.
  1227. ! wrf_ges_filename - filename of input wrf binary restart file
  1228. ! nrecs - number of sequential records found on input wrf binary restart file.
  1229. ! (obtained by a previous call to count_recs_wrf_binary_file)
  1230. !
  1231. ! output argument list: (all following dimensioned nrecs)
  1232. ! datestr_all - date character string for each field, where applicable (or else blanks)
  1233. ! varname_all - wrf mnemonic for each variable, where applicable (or blank)
  1234. ! domainend_all - dimensions of each field, where applicable (up to 3 dimensions)
  1235. ! start_block - direct access block number containing 1st byte of record
  1236. ! (after 4 byte record mark)
  1237. ! end_block - direct access block number containing last byte of record
  1238. ! (before 4 byte record mark)
  1239. ! start_byte - relative byte address in direct access block of 1st byte of record
  1240. ! end_byte - relative byte address in direct access block of last byte of record
  1241. ! file_offset - absolute address of byte before 1st byte of record (used by mpi io)
  1242. !
  1243. ! attributes:
  1244. ! language: f90
  1245. ! machine: ibm RS/6000 SP
  1246. !
  1247. !$$$
  1248. ! use kinds, only: r_single,i_byte,i_long,i_llong
  1249. use module_internal_header_util
  1250. implicit none
  1251. integer,intent(in)::in_unit,nrecs
  1252. character(*),intent(in)::wrf_ges_filename
  1253. character(132),intent(out)::datestr_all(nrecs),varname_all(nrecs)
  1254. integer,intent(out)::domainend_all(3,nrecs)
  1255. integer,intent(out)::start_block(nrecs),end_block(nrecs)
  1256. integer,intent(out)::start_byte(nrecs),end_byte(nrecs)
  1257. integer(i_llong),intent(out)::file_offset(nrecs)
  1258. integer irecs
  1259. integer(i_llong) nextbyte,locbyte,thisblock
  1260. integer(i_byte) lenrec4(4)
  1261. integer(i_long) lenrec,lensave
  1262. equivalence (lenrec4(1),lenrec)
  1263. integer(i_byte) missing4(4)
  1264. integer(i_long) missing
  1265. equivalence (missing,missing4(1))
  1266. integer(i_llong),parameter:: lrecl=2**20
  1267. integer(i_byte) buf(lrecl)
  1268. integer i,loc_count,nreads
  1269. logical lastbuf
  1270. integer(i_byte) hdrbuf4(2048)
  1271. integer(i_long) hdrbuf(512)
  1272. equivalence(hdrbuf(1),hdrbuf4(1))
  1273. integer,parameter:: int_field = 530
  1274. integer,parameter:: int_dom_ti_char = 220
  1275. integer,parameter:: int_dom_ti_real = 140
  1276. integer,parameter:: int_dom_ti_integer = 180
  1277. integer hdrbufsize
  1278. integer inttypesize
  1279. integer datahandle,count
  1280. character(128) element,dumstr,strdata
  1281. integer loccode
  1282. character(132) blanks
  1283. integer typesize
  1284. integer fieldtype,comm,iocomm
  1285. integer domaindesc
  1286. character(132) memoryorder,stagger,dimnames(3)
  1287. integer domainstart(3),domainend(3)
  1288. integer memorystart(3),memoryend(3)
  1289. integer patchstart(3),patchend(3)
  1290. character(132) datestr,varname
  1291. real dummy_field(1)
  1292. ! real(r_single) dummy_field(1)
  1293. ! integer dummy_field
  1294. ! real dummy_field
  1295. integer itypesize
  1296. integer idata(1)
  1297. real rdata(1)
  1298. call wrf_sizeof_integer(itypesize)
  1299. inttypesize=itypesize
  1300. blanks=trim(' ')
  1301. write(0,*) 'inventory subroutine'
  1302. write(0,*) 'opening file : ', trim(wrf_ges_filename)
  1303. open(in_unit,file=trim(wrf_ges_filename),access='direct',recl=lrecl)
  1304. irecs=0
  1305. missing=-9999
  1306. nextbyte=0_i_llong
  1307. locbyte=lrecl
  1308. nreads=0
  1309. lastbuf=.false.
  1310. do
  1311. ! get length of next record
  1312. do i=1,4
  1313. nextbyte=nextbyte+1_i_llong
  1314. locbyte=locbyte+1_i_llong
  1315. if(locbyte > lrecl .and. lastbuf) go to 900
  1316. if(locbyte > lrecl) call next_buf(in_unit,buf,nextbyte,locbyte,thisblock,lrecl,nreads,lastbuf)
  1317. lenrec4(i)=buf(locbyte)
  1318. end do
  1319. if(lenrec <= 0 .and. lastbuf) go to 900
  1320. if(lenrec <= 0 .and. .not. lastbuf) go to 885
  1321. nextbyte=nextbyte+1_i_llong
  1322. locbyte=locbyte+1_i_llong
  1323. if(locbyte > lrecl .and. lastbuf) go to 900
  1324. if(locbyte > lrecl) call next_buf(in_unit,buf,nextbyte,locbyte,thisblock,lrecl,nreads,lastbuf)
  1325. irecs=irecs+1
  1326. start_block(irecs)=thisblock
  1327. start_byte(irecs)=locbyte
  1328. file_offset(irecs)=nextbyte-1_i_llong
  1329. hdrbuf4(1)=buf(locbyte)
  1330. hdrbuf4(2:4)=missing4(2:4)
  1331. hdrbuf4(5:8)=missing4(1:4)
  1332. datestr_all(irecs)=blanks
  1333. varname_all(irecs)=blanks
  1334. domainend_all(1:3,irecs)=0
  1335. loc_count=1
  1336. ! write(0,*) '1, hdrbuf4(1): 1', hdrbuf4(1)
  1337. do i=2,8
  1338. if(loc_count.ge.lenrec) exit
  1339. loc_count=loc_count+1
  1340. nextbyte=nextbyte+1_i_llong
  1341. locbyte=locbyte+1_i_llong
  1342. if(locbyte > lrecl .and. lastbuf) go to 900
  1343. if(locbyte > lrecl) call next_buf(in_unit,buf,nextbyte,locbyte,thisblock,lrecl,nreads,lastbuf)
  1344. hdrbuf4(i)=buf(locbyte)
  1345. ! write(0,*) 'I, hdrbuf4(I): ', I, hdrbuf4(I)
  1346. end do
  1347. ! if(lenrec==2048) write(0,*)' irecs,hdrbuf(2),int_dom_ti_char,int_field=', &
  1348. ! irecs,hdrbuf(2),int_dom_ti_char,int_field, int_dom_ti_real, int_dom_ti_integer
  1349. if(lenrec==2048.and.(hdrbuf(2) == int_dom_ti_char .or. hdrbuf(2) == int_field &
  1350. .or. hdrbuf(2) == int_dom_ti_real .or. hdrbuf(2) == int_dom_ti_integer)) then
  1351. ! bring in next full record, so we can unpack datestr, varname, and domainend
  1352. do i=9,lenrec
  1353. loc_count=loc_count+1
  1354. nextbyte=nextbyte+1_i_llong
  1355. locbyte=locbyte+1_i_llong
  1356. if(locbyte > lrecl .and. lastbuf) go to 900
  1357. if(locbyte > lrecl) call next_buf(in_unit,buf,nextbyte,locbyte,thisblock,lrecl,nreads,lastbuf)
  1358. hdrbuf4(i)=buf(locbyte)
  1359. ! write(0,*) 'I, hdrbuf4(I): ', I, hdrbuf4(I)
  1360. end do
  1361. ! write(0,*) 'past 9,lenrec loop'
  1362. ! write(0,*) 'hdrbuf(2): ', hdrbuf(2)
  1363. if(hdrbuf(2) == int_dom_ti_char) then
  1364. call int_get_ti_header_char(hdrbuf,hdrbufsize,inttypesize, &
  1365. datahandle,element,dumstr,strdata,loccode)
  1366. varname_all(irecs)=trim(element)
  1367. datestr_all(irecs)=trim(strdata)
  1368. write(0,*)'(1) irecs,varname,datestr = ',irecs,trim(varname_all(irecs)),trim(datestr_all(irecs))
  1369. else if(hdrbuf(2) == int_dom_ti_real) then
  1370. ! write(0,*) 'call int_get_ti_header_real'
  1371. ! write(0,*) 'hdrbuf(1:10): ', hdrbuf(1:10)
  1372. ! write(0,*) 'call with inttypesize typesize: ', inttypesize,typesize
  1373. call int_get_ti_header_real(hdrbuf,hdrbufsize,inttypesize,typesize, &
  1374. datahandle,element,rdata,count,loccode)
  1375. ! write(0,*) 'return int_get_ti_header_real'
  1376. varname_all(irecs)=trim(element)
  1377. ! write(0,*) 'varname_all(irecs): ', varname_all(irecs)
  1378. ! datestr_all(irecs)=trim(strdata)
  1379. write(0,*)'(2) irecs,varname,datestr = ',irecs,trim(varname_all(irecs)),rdata(1)
  1380. ! write(0,*) ' --------------------------- '
  1381. else if(hdrbuf(2) == int_dom_ti_integer) then
  1382. call int_get_ti_header_integer(hdrbuf,hdrbufsize,inttypesize,typesize, &
  1383. datahandle,element,idata,count,loccode)
  1384. varname_all(irecs)=trim(element)
  1385. ! datestr_all(irecs)=trim(strdata)
  1386. write(0,*)'(3) irecs,varname,datestr = ',irecs,trim(varname_all(irecs)),idata(1:count)
  1387. else
  1388. ! write(0,*) 'call int_get_write_field_header'
  1389. call int_get_write_field_header(hdrbuf,hdrbufsize,inttypesize,typesize, &
  1390. datahandle,datestr,varname,dummy_field,fieldtype,comm,iocomm, &
  1391. domaindesc,memoryorder,stagger,dimnames, &
  1392. domainstart,domainend,memorystart,memoryend,patchstart,patchend)
  1393. varname_all(irecs)=trim(varname)
  1394. datestr_all(irecs)=trim(datestr)
  1395. domainend_all(1:3,irecs)=domainend(1:3)
  1396. ! write(0,*)'(4) irecs,datestr,domend,varname = ', &
  1397. ! irecs,trim(datestr_all(irecs)),domainend_all(1:3,irecs),trim(varname_all(irecs))
  1398. end if
  1399. end if
  1400. nextbyte=nextbyte-loc_count+lenrec
  1401. locbyte=locbyte-loc_count+lenrec
  1402. if(locbyte > lrecl .and. lastbuf) go to 900
  1403. if(locbyte > lrecl) call next_buf(in_unit,buf,nextbyte,locbyte,thisblock,lrecl,nreads,lastbuf)
  1404. end_block(irecs)=thisblock
  1405. end_byte(irecs)=locbyte
  1406. lensave=lenrec
  1407. do i=1,4
  1408. nextbyte=nextbyte+1_i_llong
  1409. locbyte=locbyte+1_i_llong
  1410. if(locbyte > lrecl .and. lastbuf) go to 900
  1411. if(locbyte > lrecl) call next_buf(in_unit,buf,nextbyte,locbyte,thisblock,lrecl,nreads,lastbuf)
  1412. lenrec4(i)=buf(locbyte)
  1413. end do
  1414. if(lenrec /= lensave) go to 890
  1415. end do
  1416. 880 continue
  1417. write(6,*)' reached impossible place in inventory_wrf_binary_file'
  1418. close(in_unit)
  1419. return
  1420. 885 continue
  1421. write(0,*)' problem in inventory_wrf_binary_file, lenrec has bad value before end of file'
  1422. write(0,*)' lenrec =',lenrec
  1423. close(in_unit)
  1424. return
  1425. 890 continue
  1426. write(0,*)' problem in inventory_wrf_binary_file, beginning and ending rec len words unequal'
  1427. write(0,*)' begining reclen =',lensave
  1428. write(0,*)' ending reclen =',lenrec
  1429. write(0,*)' irecs =',irecs
  1430. write(0,*)' nrecs =',nrecs
  1431. call wrf_error_fatal("curious reclen discrepancy")
  1432. close(in_unit)
  1433. return
  1434. 900 continue
  1435. write(0,*)' normal end of file reached in inventory_wrf_binary_file'
  1436. write(0,*)' nblocks=',thisblock
  1437. write(0,*)' irecs,nrecs=',irecs,nrecs
  1438. write(0,*)' nreads=',nreads
  1439. close(in_unit)
  1440. end subroutine inventory_wrf_binary_file
  1441. SUBROUTINE wrf_sizeof_integer( retval )
  1442. IMPLICIT NONE
  1443. INTEGER retval
  1444. ! 4 is defined by CPP
  1445. retval = 4
  1446. RETURN
  1447. END SUBROUTINE wrf_sizeof_integer
  1448. SUBROUTINE wrf_sizeof_real( retval )
  1449. IMPLICIT NONE
  1450. INTEGER retval
  1451. ! 4 is defined by CPP
  1452. retval = 4
  1453. RETURN
  1454. END SUBROUTINE wrf_sizeof_real
  1455. !!!
  1456. !!!
  1457. !!!
  1458. subroutine count_recs_wrf_binary_file(in_unit,wrf_ges_filename,nrecs)
  1459. !$$$ subprogram documentation block
  1460. ! . . . .
  1461. ! subprogram: count_recs_binary_file count # recs on wrf binary file
  1462. ! prgmmr: parrish org: np22 date: 2004-11-29
  1463. !
  1464. ! abstract: count number of sequential records contained in wrf binary
  1465. ! file. this is done by opening the file in direct access
  1466. ! mode with block length of 2**20, the size of the physical
  1467. ! blocks on ibm "blue" and "white" machines. for optimal
  1468. ! performance, change block length to correspond to the
  1469. ! physical block length of host machine disk space.
  1470. ! records are counted by looking for the 4 byte starting
  1471. ! and ending sequential record markers, which contain the
  1472. ! record size in bytes. only blocks are read which are known
  1473. ! by simple calculation to contain these record markers.
  1474. ! even though this is done on one processor, it is still
  1475. ! very fast, and the time will always scale by the number of
  1476. ! sequential records, not their size. this step and the
  1477. ! following inventory step consistently take less than 0.1 seconds
  1478. ! to complete.
  1479. !
  1480. ! program history log:
  1481. ! 2004-11-29 parrish
  1482. !
  1483. ! input argument list:
  1484. ! in_unit - fortran unit number where input file is opened through.
  1485. ! wrf_ges_filename - filename of input wrf binary restart file
  1486. !
  1487. ! output argument list:
  1488. ! nrecs - number of sequential records found on input wrf binary restart fil
  1489. !
  1490. ! attributes:
  1491. ! language: f90
  1492. ! machine: ibm RS/6000 SP
  1493. !
  1494. !$$$
  1495. ! do an initial read through of a wrf binary file, and get total number of sequential fil
  1496. ! use kinds, only: r_single,i_byte,i_long,i_llong
  1497. implicit none
  1498. integer,intent(in)::in_unit
  1499. character(*),intent(in)::wrf_ges_filename
  1500. integer,intent(out)::nrecs
  1501. integer(i_llong) nextbyte,locbyte,thisblock
  1502. integer(i_byte) lenrec4(4)
  1503. integer(i_long) lenrec,lensave
  1504. equivalence (lenrec4(1),lenrec)
  1505. integer(i_byte) missing4(4)
  1506. integer(i_long) missing
  1507. equivalence (missing,missing4(1))
  1508. integer(i_llong),parameter:: lrecl=2**20
  1509. integer(i_byte) buf(lrecl)
  1510. integer i,loc_count,nreads
  1511. logical lastbuf
  1512. open(in_unit,file=trim(wrf_ges_filename),access='direct',recl=lrecl)
  1513. nrecs=0
  1514. missing=-9999
  1515. nextbyte=0_i_llong
  1516. locbyte=lrecl
  1517. nreads=0
  1518. lastbuf=.false.
  1519. do
  1520. ! get length of next record
  1521. do i=1,4
  1522. nextbyte=nextbyte+1_i_llong
  1523. locbyte=locbyte+1_i_llong
  1524. if(locbyte > lrecl .and. lastbuf) go to 900
  1525. if(locbyte > lrecl) call next_buf(in_unit,buf,nextbyte,locbyte,thisblock,lrecl,nreads,lastbuf)
  1526. lenrec4(i)=buf(locbyte)
  1527. end do
  1528. if(lenrec <= 0 .and. lastbuf) go to 900
  1529. if(lenrec <= 0 .and. .not.lastbuf) go to 885
  1530. nextbyte=nextbyte+1_i_llong
  1531. locbyte=locbyte+1_i_llong
  1532. if(locbyte > lrecl .and. lastbuf) go to 900
  1533. if(locbyte > lrecl) call next_buf(in_unit,buf,nextbyte,locbyte,thisblock,lrecl,nreads,lastbuf)
  1534. nrecs=nrecs+1
  1535. loc_count=1
  1536. do i=2,4
  1537. if(loc_count.ge.lenrec) exit
  1538. loc_count=loc_count+1
  1539. nextbyte=nextbyte+1_i_llong
  1540. locbyte=locbyte+1_i_llong
  1541. if(locbyte > lrecl .and. lastbuf) go to 900
  1542. if(locbyte > lrecl) call next_buf(in_unit,buf,nextbyte,locbyte,thisblock,lrecl,nreads,lastbuf)
  1543. end do
  1544. do i=1,4
  1545. if(loc_count.ge.lenrec) exit
  1546. loc_count=loc_count+1
  1547. nextbyte=nextbyte+1_i_llong
  1548. locbyte=locbyte+1_i_llong
  1549. if(locbyte > lrecl .and. lastbuf) go to 900
  1550. if(locbyte > lrecl) call next_buf(in_unit,buf,nextbyte,locbyte,thisblock,lrecl,nreads,lastbuf)
  1551. end do
  1552. nextbyte=nextbyte-loc_count+lenrec
  1553. locbyte=locbyte-loc_count+lenrec
  1554. if(locbyte > lrecl .and. lastbuf) go to 900
  1555. if(locbyte > lrecl) call next_buf(in_unit,buf,nextbyte,locbyte,thisblock,lrecl,nreads,lastbuf)
  1556. lensave=lenrec
  1557. do i=1,4
  1558. nextbyte=nextbyte+1_i_llong
  1559. locbyte=locbyte+1_i_llong
  1560. if(locbyte > lrecl .and. lastbuf) go to 900
  1561. if(locbyte > lrecl) call next_buf(in_unit,buf,nextbyte,locbyte,thisblock,lrecl,nreads,lastbuf)
  1562. lenrec4(i)=buf(locbyte)
  1563. end do
  1564. if(lenrec /= lensave) go to 890
  1565. end do
  1566. 880 continue
  1567. write(6,*)' reached impossible place in count_recs_wrf_binary_file'
  1568. close(in_unit)
  1569. return
  1570. 885 continue
  1571. write(6,*)' problem in count_recs_wrf_binary_file, lenrec has bad value before end of file'
  1572. write(6,*)' lenrec =',lenrec
  1573. close(in_unit)
  1574. return
  1575. 890 continue
  1576. write(6,*)' problem in count_recs_wrf_binary_file, beginning and ending rec len words unequal'
  1577. write(6,*)' begining reclen =',lensave
  1578. write(6,*)' ending reclen =',lenrec
  1579. close(in_unit)
  1580. call wrf_error_fatal("bad reclen stuff")
  1581. return
  1582. 900 continue
  1583. write(6,*)' normal end of file reached in count_recs_wrf_binary_file'
  1584. write(6,*)' nblocks=',thisblock
  1585. write(6,*)' nrecs=',nrecs
  1586. write(6,*)' nreads=',nreads
  1587. close(in_unit)
  1588. end subroutine count_recs_wrf_binary_file
  1589. subroutine retrieve_field(in_unit,wrfges,out,start_block,end_block,start_byte,end_byte)
  1590. !$$$ subprogram documentation block
  1591. ! . . . .
  1592. ! subprogram: retrieve_field retrieve field from wrf binary file
  1593. ! prgmmr: parrish org: np22 date: 2004-11-29
  1594. !
  1595. ! abstract: still using direct access, retrieve a field from the wrf binary restart file.
  1596. !
  1597. ! program history log:
  1598. ! 2004-11-29 parrish
  1599. !
  1600. ! input argument list:
  1601. ! in_unit - fortran unit number where input file is opened through.
  1602. ! wrfges - filename of input wrf binary restart file
  1603. ! start_block - direct access block number containing 1st byte of record
  1604. ! (after 4 byte record mark)
  1605. ! end_block - direct access block number containing last byte of record
  1606. ! (before 4 byte record mark)
  1607. ! start_byte - relative byte address in direct access block of 1st byte of record
  1608. ! end_byte - relative byte address in direct access block of last byte of record
  1609. !
  1610. ! output argument list:
  1611. ! out - output buffer where desired field is deposited
  1612. !
  1613. ! attributes:
  1614. ! language: f90
  1615. ! machine: ibm RS/6000 SP
  1616. !
  1617. !$$$
  1618. ! use kinds, only: i_byte,i_kind
  1619. implicit none
  1620. integer(i_kind),intent(in)::in_unit
  1621. character(50),intent(in)::wrfges
  1622. integer(i_kind),intent(in)::start_block,end_block,start_byte,end_byte
  1623. integer(i_byte),intent(out)::out(*)
  1624. integer(i_llong),parameter:: lrecl=2**20
  1625. integer(i_byte) buf(lrecl)
  1626. integer(i_kind) i,ii,k
  1627. integer(i_llong) ibegin,iend,ierr
  1628. open(in_unit,file=trim(wrfges),access='direct',recl=lrecl)
  1629. write(6,*)' in retrieve_field, start_block,end_block=',start_block,end_block
  1630. write(6,*)' in retrieve_field, start_byte,end_byte=',start_byte,end_byte
  1631. ii=0
  1632. do k=start_block,end_block
  1633. read(in_unit,rec=k,iostat=ierr)buf
  1634. ibegin=1 ; iend=lrecl
  1635. if(k == start_block) ibegin=start_byte
  1636. if(k == end_block) iend=end_byte
  1637. do i=ibegin,iend
  1638. ii=ii+1
  1639. out(ii)=buf(i)
  1640. end do
  1641. end do
  1642. close(in_unit)
  1643. end subroutine retrieve_field
  1644. END MODULE module_wps_io_arw