/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

Large files are truncated click here to view the full file

  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 invento