PageRenderTime 48ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/WPS/geogrid/util/plotgrid/src/input_module.F

http://github.com/jbeezley/wrf-fire
FORTRAN Legacy | 819 lines | 451 code | 123 blank | 245 comment | 142 complexity | 47b64d062de08f593910f1ef487bf256 MD5 | raw file
Possible License(s): AGPL-1.0
  1. module input_module
  2. use gridinfo_module
  3. use misc_definitions_module
  4. use module_debug
  5. #ifdef IO_BINARY
  6. use module_internal_header_util
  7. #endif
  8. use parallel_module
  9. use queue_module
  10. type (queue) :: unit_desc
  11. ! WRF I/O API related variables
  12. integer :: handle
  13. integer :: num_calls
  14. character (len=1) :: internal_gridtype
  15. contains
  16. subroutine input_init(nest_number, istatus)
  17. implicit none
  18. ! Arguments
  19. integer, intent(in) :: nest_number
  20. integer, intent(out) :: istatus
  21. #include "wrf_io_flags.h"
  22. #include "wrf_status_codes.h"
  23. ! Local variables
  24. integer :: i
  25. integer :: comm_1, comm_2
  26. character (len=MAX_FILENAME_LEN) :: input_fname
  27. istatus = 0
  28. if (my_proc_id == IO_NODE .or. do_tiled_input) then
  29. #ifdef IO_BINARY
  30. if (io_form_input == BINARY) call ext_int_ioinit('sysdep info', istatus)
  31. #endif
  32. #ifdef IO_NETCDF
  33. if (io_form_input == NETCDF) call ext_ncd_ioinit('sysdep info', istatus)
  34. #endif
  35. #ifdef IO_GRIB1
  36. if (io_form_input == GRIB1) call ext_gr1_ioinit('sysdep info', istatus)
  37. #endif
  38. call mprintf((istatus /= 0),ERROR,'Error in ext_pkg_ioinit')
  39. comm_1 = 1
  40. comm_2 = 1
  41. input_fname = ' '
  42. if (gridtype == 'C') then
  43. #ifdef IO_BINARY
  44. if (io_form_input == BINARY) input_fname = trim(opt_output_from_geogrid_path)//'geo_em.d .int'
  45. #endif
  46. #ifdef IO_NETCDF
  47. if (io_form_input == NETCDF) input_fname = trim(opt_output_from_geogrid_path)//'geo_em.d .nc'
  48. #endif
  49. #ifdef IO_GRIB1
  50. if (io_form_input == GRIB1) input_fname = trim(opt_output_from_geogrid_path)//'geo_em.d .grib'
  51. #endif
  52. i = len_trim(opt_output_from_geogrid_path)
  53. write(input_fname(i+9:i+10),'(i2.2)') nest_number
  54. else if (gridtype == 'E') then
  55. #ifdef IO_BINARY
  56. if (io_form_input == BINARY) input_fname = trim(opt_output_from_geogrid_path)//'geo_nmm.d .int'
  57. #endif
  58. #ifdef IO_NETCDF
  59. if (io_form_input == NETCDF) input_fname = trim(opt_output_from_geogrid_path)//'geo_nmm.d .nc'
  60. #endif
  61. #ifdef IO_GRIB1
  62. if (io_form_input == GRIB1) input_fname = trim(opt_output_from_geogrid_path)//'geo_nmm.d .grib'
  63. #endif
  64. i = len_trim(opt_output_from_geogrid_path)
  65. write(input_fname(i+10:i+11),'(i2.2)') nest_number
  66. end if
  67. if (nprocs > 1 .and. do_tiled_input) then
  68. write(input_fname(len_trim(input_fname)+1:len_trim(input_fname)+5), '(a1,i4.4)') &
  69. '_', my_proc_id
  70. end if
  71. istatus = 0
  72. #ifdef IO_BINARY
  73. if (io_form_input == BINARY) &
  74. call ext_int_open_for_read(trim(input_fname), comm_1, comm_2, 'sysdep info', handle, istatus)
  75. #endif
  76. #ifdef IO_NETCDF
  77. if (io_form_input == NETCDF) &
  78. call ext_ncd_open_for_read(trim(input_fname), comm_1, comm_2, 'sysdep info', handle, istatus)
  79. #endif
  80. #ifdef IO_GRIB1
  81. if (io_form_input == GRIB1) &
  82. call ext_gr1_open_for_read(trim(input_fname), comm_1, comm_2, 'sysdep info', handle, istatus)
  83. #endif
  84. call mprintf((istatus /= 0),ERROR,'Couldn''t open file %s for input.',s1=input_fname)
  85. call q_init(unit_desc)
  86. end if ! (my_proc_id == IO_NODE .or. do_tiled_input)
  87. num_calls = 0
  88. end subroutine input_init
  89. subroutine read_next_field(start_patch_i, end_patch_i, &
  90. start_patch_j, end_patch_j, &
  91. start_patch_k, end_patch_k, &
  92. cname, cunits, cdesc, memorder, stagger, &
  93. dimnames, is_subgrid, real_array, istatus)
  94. implicit none
  95. ! Arguments
  96. integer, intent(out) :: start_patch_i, end_patch_i, &
  97. start_patch_j, end_patch_j, &
  98. start_patch_k, end_patch_k
  99. real, pointer, dimension(:,:,:) :: real_array
  100. character (len=*), intent(out) :: cname, memorder, stagger, cunits, cdesc
  101. character (len=128), dimension(3), intent(inout) :: dimnames
  102. logical, intent(out) :: is_subgrid
  103. integer, intent(inout) :: istatus
  104. #include "wrf_io_flags.h"
  105. #include "wrf_status_codes.h"
  106. ! Local variables
  107. integer :: ndim, wrftype
  108. integer :: sm1, em1, sm2, em2, sm3, em3, sp1, ep1, sp2, ep2, sp3, ep3
  109. integer, dimension(3) :: domain_start, domain_end, temp
  110. real, pointer, dimension(:,:,:) :: real_domain
  111. character (len=20) :: datestr
  112. type (q_data) :: qd
  113. integer :: sr_x, sr_y
  114. if (my_proc_id == IO_NODE .or. do_tiled_input) then
  115. if (num_calls == 0) then
  116. #ifdef IO_BINARY
  117. if (io_form_input == BINARY) call ext_int_get_next_time(handle, datestr, istatus)
  118. #endif
  119. #ifdef IO_NETCDF
  120. if (io_form_input == NETCDF) call ext_ncd_get_next_time(handle, datestr, istatus)
  121. #endif
  122. #ifdef IO_GRIB1
  123. if (io_form_input == GRIB1) call ext_gr1_get_next_time(handle, datestr, istatus)
  124. #endif
  125. end if
  126. num_calls = num_calls + 1
  127. #ifdef IO_BINARY
  128. if (io_form_input == BINARY) call ext_int_get_next_var(handle, cname, istatus)
  129. #endif
  130. #ifdef IO_NETCDF
  131. if (io_form_input == NETCDF) call ext_ncd_get_next_var(handle, cname, istatus)
  132. #endif
  133. #ifdef IO_GRIB1
  134. if (io_form_input == GRIB1) call ext_gr1_get_next_var(handle, cname, istatus)
  135. #endif
  136. end if
  137. if (nprocs > 1 .and. .not. do_tiled_input) call parallel_bcast_int(istatus)
  138. if (istatus /= 0) return
  139. if (my_proc_id == IO_NODE .or. do_tiled_input) then
  140. istatus = 0
  141. #ifdef IO_BINARY
  142. if (io_form_input == BINARY) then
  143. call ext_int_get_var_info(handle, cname, ndim, memorder, stagger, domain_start, domain_end, wrftype, istatus)
  144. call ext_int_get_var_ti_integer(handle, 'subgrid', &
  145. trim(cname), temp(1), 1, temp(3), istatus)
  146. end if
  147. #endif
  148. #ifdef IO_NETCDF
  149. if (io_form_input == NETCDF) then
  150. call ext_ncd_get_var_info(handle, cname, ndim, memorder, stagger, domain_start, domain_end, wrftype, istatus)
  151. call ext_ncd_get_var_ti_integer(handle, 'subgrid', &
  152. trim(cname), temp(1), 1, temp(3), istatus)
  153. end if
  154. #endif
  155. #ifdef IO_GRIB1
  156. if (io_form_input == GRIB1) then
  157. call ext_gr1_get_var_info(handle, cname, ndim, memorder, stagger, domain_start, domain_end, wrftype, istatus)
  158. call ext_gr1_get_var_ti_integer(handle, 'subgrid', &
  159. trim(cname), temp(1), 1, temp(3), istatus)
  160. end if
  161. #endif
  162. call ext_get_dom_ti_integer_scalar('sr_x', sr_x)
  163. call ext_get_dom_ti_integer_scalar('sr_y', sr_y)
  164. if (temp(1) .eq. 1) then
  165. is_subgrid=.true.
  166. else
  167. is_subgrid=.false.
  168. end if
  169. call mprintf((istatus /= 0),ERROR,'In read_next_field(), problems with ext_pkg_get_var_info()')
  170. start_patch_i = domain_start(1)
  171. start_patch_j = domain_start(2)
  172. end_patch_i = domain_end(1)
  173. end_patch_j = domain_end(2)
  174. if (ndim == 3) then
  175. start_patch_k = domain_start(3)
  176. end_patch_k = domain_end(3)
  177. else
  178. domain_start(3) = 1
  179. domain_end(3) = 1
  180. start_patch_k = 1
  181. end_patch_k = 1
  182. end if
  183. nullify(real_domain)
  184. allocate(real_domain(start_patch_i:end_patch_i, start_patch_j:end_patch_j, start_patch_k:end_patch_k))
  185. #ifdef IO_BINARY
  186. if (io_form_input == BINARY) then
  187. call ext_int_read_field(handle, '0000-00-00_00:00:00', cname, real_domain, WRF_REAL, &
  188. 1, 1, 0, memorder, stagger, &
  189. dimnames, domain_start, domain_end, domain_start, domain_end, &
  190. domain_start, domain_end, istatus)
  191. end if
  192. #endif
  193. #ifdef IO_NETCDF
  194. if (io_form_input == NETCDF) then
  195. call ext_ncd_read_field(handle, '0000-00-00_00:00:00', cname, real_domain, WRF_REAL, &
  196. 1, 1, 0, memorder, stagger, &
  197. dimnames, domain_start, domain_end, domain_start, domain_end, &
  198. domain_start, domain_end, istatus)
  199. end if
  200. #endif
  201. #ifdef IO_GRIB1
  202. if (io_form_input == GRIB1) then
  203. call ext_gr1_read_field(handle, '0000-00-00_00:00:00', cname, real_domain, WRF_REAL, &
  204. 1, 1, 0, memorder, stagger, &
  205. dimnames, domain_start, domain_end, domain_start, domain_end, &
  206. domain_start, domain_end, istatus)
  207. end if
  208. #endif
  209. call mprintf((istatus /= 0),ERROR,'In read_next_field(), got error code %i.', i1=istatus)
  210. if (io_form_input == BINARY) then
  211. qd = q_remove(unit_desc)
  212. cunits = qd%units
  213. cdesc = qd%description
  214. stagger = qd%stagger
  215. else
  216. cunits = ' '
  217. cdesc = ' '
  218. stagger = ' '
  219. #ifdef IO_NETCDF
  220. if (io_form_input == NETCDF) then
  221. call ext_ncd_get_var_ti_char(handle, 'units', cname, cunits, istatus)
  222. call ext_ncd_get_var_ti_char(handle, 'description', cname, cdesc, istatus)
  223. call ext_ncd_get_var_ti_char(handle, 'stagger', cname, stagger, istatus)
  224. end if
  225. #endif
  226. #ifdef IO_GRIB1
  227. if (io_form_input == GRIB1) then
  228. call ext_gr1_get_var_ti_char(handle, 'units', cname, cunits, istatus)
  229. call ext_gr1_get_var_ti_char(handle, 'description', cname, cdesc, istatus)
  230. call ext_gr1_get_var_ti_char(handle, 'stagger', cname, stagger, istatus)
  231. end if
  232. #endif
  233. end if
  234. end if ! (my_proc_id == IO_NODE .or. do_tiled_input)
  235. if (nprocs > 1 .and. .not. do_tiled_input) then
  236. call parallel_bcast_char(cname, len(cname))
  237. call parallel_bcast_char(cunits, len(cunits))
  238. call parallel_bcast_char(cdesc, len(cdesc))
  239. call parallel_bcast_char(memorder, len(memorder))
  240. call parallel_bcast_char(stagger, len(stagger))
  241. call parallel_bcast_char(dimnames(1), 128)
  242. call parallel_bcast_char(dimnames(2), 128)
  243. call parallel_bcast_char(dimnames(3), 128)
  244. call parallel_bcast_int(domain_start(3))
  245. call parallel_bcast_int(domain_end(3))
  246. call parallel_bcast_logical(is_subgrid)
  247. sp1 = my_minx
  248. ep1 = my_maxx - 1
  249. sp2 = my_miny
  250. ep2 = my_maxy - 1
  251. sp3 = domain_start(3)
  252. ep3 = domain_end(3)
  253. if (internal_gridtype == 'C') then
  254. if (my_x /= nproc_x - 1 .or. stagger == 'U' .or. is_subgrid) then
  255. ep1 = ep1 + 1
  256. end if
  257. if (my_y /= nproc_y - 1 .or. stagger == 'V' .or. is_subgrid) then
  258. ep2 = ep2 + 1
  259. end if
  260. else if (internal_gridtype == 'E') then
  261. ep1 = ep1 + 1
  262. ep2 = ep2 + 1
  263. end if
  264. if (sr_x > 1) then
  265. sp1 = (sp1-1)*sr_x+1
  266. ep1 = ep1 *sr_x
  267. end if
  268. if (sr_y > 1) then
  269. sp2 = (sp2-1)*sr_y+1
  270. ep2 = ep2 *sr_y
  271. end if
  272. sm1 = sp1
  273. em1 = ep1
  274. sm2 = sp2
  275. em2 = ep2
  276. sm3 = sp3
  277. em3 = ep3
  278. start_patch_i = sp1
  279. end_patch_i = ep1
  280. start_patch_j = sp2
  281. end_patch_j = ep2
  282. start_patch_k = sp3
  283. end_patch_k = ep3
  284. allocate(real_array(sm1:em1,sm2:em2,sm3:em3))
  285. if (my_proc_id /= IO_NODE) then
  286. allocate(real_domain(1,1,1))
  287. domain_start(1) = 1
  288. domain_start(2) = 1
  289. domain_start(3) = 1
  290. domain_end(1) = 1
  291. domain_end(2) = 1
  292. domain_end(3) = 1
  293. end if
  294. call scatter_whole_field_r(real_array, &
  295. sm1, em1, sm2, em2, sm3, em3, &
  296. sp1, ep1, sp2, ep2, sp3, ep3, &
  297. real_domain, &
  298. domain_start(1), domain_end(1), &
  299. domain_start(2), domain_end(2), &
  300. domain_start(3), domain_end(3))
  301. deallocate(real_domain)
  302. else
  303. real_array => real_domain
  304. end if
  305. end subroutine read_next_field
  306. subroutine read_global_attrs(title, start_date, grid_type, dyn_opt, &
  307. west_east_dim, south_north_dim, bottom_top_dim, &
  308. we_patch_s, we_patch_e, we_patch_s_stag, we_patch_e_stag, &
  309. sn_patch_s, sn_patch_e, sn_patch_s_stag, sn_patch_e_stag, &
  310. map_proj, mminlu, num_land_cat, is_water, is_lake, is_ice, is_urban, &
  311. isoilwater, grid_id, parent_id, i_parent_start, j_parent_start, &
  312. i_parent_end, j_parent_end, dx, dy, cen_lat, moad_cen_lat, cen_lon, &
  313. stand_lon, truelat1, truelat2, pole_lat, pole_lon, parent_grid_ratio, &
  314. corner_lats, corner_lons, sr_x, sr_y)
  315. implicit none
  316. ! Arguments
  317. integer, intent(out) :: dyn_opt, west_east_dim, south_north_dim, bottom_top_dim, map_proj, &
  318. is_water, is_lake, we_patch_s, we_patch_e, we_patch_s_stag, we_patch_e_stag, &
  319. sn_patch_s, sn_patch_e, sn_patch_s_stag, sn_patch_e_stag, &
  320. is_ice, is_urban, isoilwater, grid_id, parent_id, i_parent_start, j_parent_start, &
  321. i_parent_end, j_parent_end, parent_grid_ratio, sr_x, sr_y, num_land_cat
  322. real, intent(out) :: dx, dy, cen_lat, moad_cen_lat, cen_lon, stand_lon, truelat1, truelat2, &
  323. pole_lat, pole_lon
  324. real, dimension(16), intent(out) :: corner_lats, corner_lons
  325. character (len=128), intent(out) :: title, start_date, grid_type, mminlu
  326. ! Local variables
  327. integer :: istatus, i
  328. real :: wps_version
  329. character (len=128) :: cunits, cdesc, cstagger
  330. type (q_data) :: qd
  331. if (my_proc_id == IO_NODE .or. do_tiled_input) then
  332. #ifdef IO_BINARY
  333. if (io_form_input == BINARY) then
  334. istatus = 0
  335. do while (istatus == 0)
  336. cunits = ' '
  337. cdesc = ' '
  338. cstagger = ' '
  339. call ext_int_get_var_ti_char(handle, 'units', 'VAR', cunits, istatus)
  340. if (istatus == 0) then
  341. call ext_int_get_var_ti_char(handle, 'description', 'VAR', cdesc, istatus)
  342. if (istatus == 0) then
  343. call ext_int_get_var_ti_char(handle, 'stagger', 'VAR', cstagger, istatus)
  344. qd%units = cunits
  345. qd%description = cdesc
  346. qd%stagger = cstagger
  347. call q_insert(unit_desc, qd)
  348. end if
  349. end if
  350. end do
  351. end if
  352. #endif
  353. call ext_get_dom_ti_char ('TITLE', title)
  354. if (index(title,'GEOGRID V3.3') /= 0) then
  355. wps_version = 3.3
  356. else if (index(title,'GEOGRID V3.2.1') /= 0) then
  357. wps_version = 3.21
  358. else if (index(title,'GEOGRID V3.2') /= 0) then
  359. wps_version = 3.2
  360. else if (index(title,'GEOGRID V3.1.1') /= 0) then
  361. wps_version = 3.11
  362. else if (index(title,'GEOGRID V3.1') /= 0) then
  363. wps_version = 3.1
  364. else if (index(title,'GEOGRID V3.0.1') /= 0) then
  365. wps_version = 3.01
  366. else
  367. wps_version = 3.0
  368. end if
  369. call mprintf(.true.,DEBUG,'Reading static data from WPS version %f', f1=wps_version)
  370. call ext_get_dom_ti_char ('SIMULATION_START_DATE', start_date)
  371. call ext_get_dom_ti_integer_scalar('WEST-EAST_GRID_DIMENSION', west_east_dim)
  372. call ext_get_dom_ti_integer_scalar('SOUTH-NORTH_GRID_DIMENSION', south_north_dim)
  373. call ext_get_dom_ti_integer_scalar('BOTTOM-TOP_GRID_DIMENSION', bottom_top_dim)
  374. call ext_get_dom_ti_integer_scalar('WEST-EAST_PATCH_START_UNSTAG', we_patch_s)
  375. call ext_get_dom_ti_integer_scalar('WEST-EAST_PATCH_END_UNSTAG', we_patch_e)
  376. call ext_get_dom_ti_integer_scalar('WEST-EAST_PATCH_START_STAG', we_patch_s_stag)
  377. call ext_get_dom_ti_integer_scalar('WEST-EAST_PATCH_END_STAG', we_patch_e_stag)
  378. call ext_get_dom_ti_integer_scalar('SOUTH-NORTH_PATCH_START_UNSTAG', sn_patch_s)
  379. call ext_get_dom_ti_integer_scalar('SOUTH-NORTH_PATCH_END_UNSTAG', sn_patch_e)
  380. call ext_get_dom_ti_integer_scalar('SOUTH-NORTH_PATCH_START_STAG', sn_patch_s_stag)
  381. call ext_get_dom_ti_integer_scalar('SOUTH-NORTH_PATCH_END_STAG', sn_patch_e_stag)
  382. call ext_get_dom_ti_char ('GRIDTYPE', grid_type)
  383. call ext_get_dom_ti_real_scalar ('DX', dx)
  384. call ext_get_dom_ti_real_scalar ('DY', dy)
  385. call ext_get_dom_ti_integer_scalar('DYN_OPT', dyn_opt)
  386. call ext_get_dom_ti_real_scalar ('CEN_LAT', cen_lat)
  387. call ext_get_dom_ti_real_scalar ('CEN_LON', cen_lon)
  388. call ext_get_dom_ti_real_scalar ('TRUELAT1', truelat1)
  389. call ext_get_dom_ti_real_scalar ('TRUELAT2', truelat2)
  390. call ext_get_dom_ti_real_scalar ('MOAD_CEN_LAT', moad_cen_lat)
  391. call ext_get_dom_ti_real_scalar ('STAND_LON', stand_lon)
  392. call ext_get_dom_ti_real_scalar ('POLE_LAT', pole_lat)
  393. call ext_get_dom_ti_real_scalar ('POLE_LON', pole_lon)
  394. call ext_get_dom_ti_real_vector ('corner_lats', corner_lats, 16)
  395. call ext_get_dom_ti_real_vector ('corner_lons', corner_lons, 16)
  396. call ext_get_dom_ti_integer_scalar('MAP_PROJ', map_proj)
  397. call ext_get_dom_ti_char ('MMINLU', mminlu)
  398. if ( wps_version >= 3.01 ) then
  399. call ext_get_dom_ti_integer_scalar('NUM_LAND_CAT', num_land_cat)
  400. else
  401. num_land_cat = 24
  402. end if
  403. call ext_get_dom_ti_integer_scalar('ISWATER', is_water)
  404. if ( wps_version >= 3.01 ) then
  405. call ext_get_dom_ti_integer_scalar('ISLAKE', is_lake)
  406. else
  407. is_lake = -1
  408. end if
  409. call ext_get_dom_ti_integer_scalar('ISICE', is_ice)
  410. call ext_get_dom_ti_integer_scalar('ISURBAN', is_urban)
  411. call ext_get_dom_ti_integer_scalar('ISOILWATER', isoilwater)
  412. call ext_get_dom_ti_integer_scalar('grid_id', grid_id)
  413. call ext_get_dom_ti_integer_scalar('parent_id', parent_id)
  414. call ext_get_dom_ti_integer_scalar('i_parent_start', i_parent_start)
  415. call ext_get_dom_ti_integer_scalar('j_parent_start', j_parent_start)
  416. call ext_get_dom_ti_integer_scalar('i_parent_end', i_parent_end)
  417. call ext_get_dom_ti_integer_scalar('j_parent_end', j_parent_end)
  418. call ext_get_dom_ti_integer_scalar('parent_grid_ratio', parent_grid_ratio)
  419. call ext_get_dom_ti_integer_scalar('sr_x', sr_x)
  420. call ext_get_dom_ti_integer_scalar('sr_y', sr_y)
  421. end if
  422. if (nprocs > 1 .and. .not. do_tiled_input) then
  423. call parallel_bcast_char(title, len(title))
  424. call parallel_bcast_char(start_date, len(start_date))
  425. call parallel_bcast_char(grid_type, len(grid_type))
  426. call parallel_bcast_int(west_east_dim)
  427. call parallel_bcast_int(south_north_dim)
  428. call parallel_bcast_int(bottom_top_dim)
  429. call parallel_bcast_int(we_patch_s)
  430. call parallel_bcast_int(we_patch_e)
  431. call parallel_bcast_int(we_patch_s_stag)
  432. call parallel_bcast_int(we_patch_e_stag)
  433. call parallel_bcast_int(sn_patch_s)
  434. call parallel_bcast_int(sn_patch_e)
  435. call parallel_bcast_int(sn_patch_s_stag)
  436. call parallel_bcast_int(sn_patch_e_stag)
  437. call parallel_bcast_int(sr_x)
  438. call parallel_bcast_int(sr_y)
  439. ! Must figure out patch dimensions from info in parallel module
  440. ! we_patch_s = my_minx
  441. ! we_patch_s_stag = my_minx
  442. ! we_patch_e = my_maxx - 1
  443. ! sn_patch_s = my_miny
  444. ! sn_patch_s_stag = my_miny
  445. ! sn_patch_e = my_maxy - 1
  446. !
  447. ! if (trim(grid_type) == 'C') then
  448. ! if (my_x /= nproc_x - 1) then
  449. ! we_patch_e_stag = we_patch_e + 1
  450. ! end if
  451. ! if (my_y /= nproc_y - 1) then
  452. ! sn_patch_e_stag = sn_patch_e + 1
  453. ! end if
  454. ! else if (trim(grid_type) == 'E') then
  455. ! we_patch_e = we_patch_e + 1
  456. ! sn_patch_e = sn_patch_e + 1
  457. ! we_patch_e_stag = we_patch_e
  458. ! sn_patch_e_stag = sn_patch_e
  459. ! end if
  460. call parallel_bcast_real(dx)
  461. call parallel_bcast_real(dy)
  462. call parallel_bcast_int(dyn_opt)
  463. call parallel_bcast_real(cen_lat)
  464. call parallel_bcast_real(cen_lon)
  465. call parallel_bcast_real(truelat1)
  466. call parallel_bcast_real(truelat2)
  467. call parallel_bcast_real(pole_lat)
  468. call parallel_bcast_real(pole_lon)
  469. call parallel_bcast_real(moad_cen_lat)
  470. call parallel_bcast_real(stand_lon)
  471. do i=1,16
  472. call parallel_bcast_real(corner_lats(i))
  473. call parallel_bcast_real(corner_lons(i))
  474. end do
  475. call parallel_bcast_int(map_proj)
  476. call parallel_bcast_char(mminlu, len(mminlu))
  477. call parallel_bcast_int(is_water)
  478. call parallel_bcast_int(is_lake)
  479. call parallel_bcast_int(is_ice)
  480. call parallel_bcast_int(is_urban)
  481. call parallel_bcast_int(isoilwater)
  482. call parallel_bcast_int(grid_id)
  483. call parallel_bcast_int(parent_id)
  484. call parallel_bcast_int(i_parent_start)
  485. call parallel_bcast_int(i_parent_end)
  486. call parallel_bcast_int(j_parent_start)
  487. call parallel_bcast_int(j_parent_end)
  488. call parallel_bcast_int(parent_grid_ratio)
  489. end if
  490. internal_gridtype = grid_type
  491. end subroutine read_global_attrs
  492. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  493. ! Name: ext_get_dom_ti_integer
  494. !
  495. ! Purpose: Read a domain time-independent integer attribute from input.
  496. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  497. subroutine ext_get_dom_ti_integer_scalar(var_name, var_value)
  498. implicit none
  499. ! Arguments
  500. integer, intent(out) :: var_value
  501. character (len=*), intent(in) :: var_name
  502. ! Local variables
  503. integer :: istatus, outcount
  504. #ifdef IO_BINARY
  505. if (io_form_input == BINARY) then
  506. call ext_int_get_dom_ti_integer(handle, trim(var_name), &
  507. var_value, &
  508. 1, outcount, istatus)
  509. end if
  510. #endif
  511. #ifdef IO_NETCDF
  512. if (io_form_input == NETCDF) then
  513. call ext_ncd_get_dom_ti_integer(handle, trim(var_name), &
  514. var_value, &
  515. 1, outcount, istatus)
  516. end if
  517. #endif
  518. #ifdef IO_GRIB1
  519. if (io_form_input == GRIB1) then
  520. call ext_gr1_get_dom_ti_integer(handle, trim(var_name), &
  521. var_value, &
  522. 1, outcount, istatus)
  523. end if
  524. #endif
  525. call mprintf((istatus /= 0),ERROR,'Error while reading domain time-independent attribute.')
  526. end subroutine ext_get_dom_ti_integer_scalar
  527. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  528. ! Name: ext_get_dom_ti_integer
  529. !
  530. ! Purpose: Read a domain time-independent integer attribute from input.
  531. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  532. subroutine ext_get_dom_ti_integer_vector(var_name, var_value, n)
  533. implicit none
  534. ! Arguments
  535. integer, intent(in) :: n
  536. integer, dimension(n), intent(out) :: var_value
  537. character (len=*), intent(in) :: var_name
  538. ! Local variables
  539. integer :: istatus, outcount
  540. #ifdef IO_BINARY
  541. if (io_form_input == BINARY) then
  542. call ext_int_get_dom_ti_integer(handle, trim(var_name), &
  543. var_value, &
  544. n, outcount, istatus)
  545. end if
  546. #endif
  547. #ifdef IO_NETCDF
  548. if (io_form_input == NETCDF) then
  549. call ext_ncd_get_dom_ti_integer(handle, trim(var_name), &
  550. var_value, &
  551. n, outcount, istatus)
  552. end if
  553. #endif
  554. #ifdef IO_GRIB1
  555. if (io_form_input == GRIB1) then
  556. call ext_gr1_get_dom_ti_integer(handle, trim(var_name), &
  557. var_value, &
  558. n, outcount, istatus)
  559. end if
  560. #endif
  561. call mprintf((istatus /= 0),ERROR,'Error while reading domain time-independent attribute.')
  562. end subroutine ext_get_dom_ti_integer_vector
  563. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  564. ! Name: ext_get_dom_ti_real
  565. !
  566. ! Purpose: Read a domain time-independent real attribute from input.
  567. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  568. subroutine ext_get_dom_ti_real_scalar(var_name, var_value)
  569. implicit none
  570. ! Arguments
  571. real, intent(out) :: var_value
  572. character (len=*), intent(in) :: var_name
  573. ! Local variables
  574. integer :: istatus, outcount
  575. #ifdef IO_BINARY
  576. if (io_form_input == BINARY) then
  577. call ext_int_get_dom_ti_real(handle, trim(var_name), &
  578. var_value, &
  579. 1, outcount, istatus)
  580. end if
  581. #endif
  582. #ifdef IO_NETCDF
  583. if (io_form_input == NETCDF) then
  584. call ext_ncd_get_dom_ti_real(handle, trim(var_name), &
  585. var_value, &
  586. 1, outcount, istatus)
  587. end if
  588. #endif
  589. #ifdef IO_GRIB1
  590. if (io_form_input == GRIB1) then
  591. call ext_gr1_get_dom_ti_real(handle, trim(var_name), &
  592. var_value, &
  593. 1, outcount, istatus)
  594. end if
  595. #endif
  596. call mprintf((istatus /= 0),ERROR,'Error while reading domain time-independent attribute.')
  597. end subroutine ext_get_dom_ti_real_scalar
  598. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  599. ! Name: ext_get_dom_ti_real
  600. !
  601. ! Purpose: Read a domain time-independent real attribute from input.
  602. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  603. subroutine ext_get_dom_ti_real_vector(var_name, var_value, n)
  604. implicit none
  605. ! Arguments
  606. integer, intent(in) :: n
  607. real, dimension(n), intent(out) :: var_value
  608. character (len=*), intent(in) :: var_name
  609. ! Local variables
  610. integer :: istatus, outcount
  611. #ifdef IO_BINARY
  612. if (io_form_input == BINARY) then
  613. call ext_int_get_dom_ti_real(handle, trim(var_name), &
  614. var_value, &
  615. n, outcount, istatus)
  616. end if
  617. #endif
  618. #ifdef IO_NETCDF
  619. if (io_form_input == NETCDF) then
  620. call ext_ncd_get_dom_ti_real(handle, trim(var_name), &
  621. var_value, &
  622. n, outcount, istatus)
  623. end if
  624. #endif
  625. #ifdef IO_GRIB1
  626. if (io_form_input == GRIB1) then
  627. call ext_gr1_get_dom_ti_real(handle, trim(var_name), &
  628. var_value, &
  629. n, outcount, istatus)
  630. end if
  631. #endif
  632. call mprintf((istatus /= 0),ERROR,'Error while reading domain time-independent attribute.')
  633. end subroutine ext_get_dom_ti_real_vector
  634. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  635. ! Name: ext_get_dom_ti_char
  636. !
  637. ! Purpose: Read a domain time-independent character attribute from input.
  638. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  639. subroutine ext_get_dom_ti_char(var_name, var_value)
  640. implicit none
  641. ! Arguments
  642. character (len=*), intent(in) :: var_name
  643. character (len=128), intent(out) :: var_value
  644. ! Local variables
  645. integer :: istatus
  646. #ifdef IO_BINARY
  647. if (io_form_input == BINARY) then
  648. call ext_int_get_dom_ti_char(handle, trim(var_name), &
  649. var_value, &
  650. istatus)
  651. end if
  652. #endif
  653. #ifdef IO_NETCDF
  654. if (io_form_input == NETCDF) then
  655. call ext_ncd_get_dom_ti_char(handle, trim(var_name), &
  656. var_value, &
  657. istatus)
  658. end if
  659. #endif
  660. #ifdef IO_GRIB1
  661. if (io_form_input == GRIB1) then
  662. call ext_gr1_get_dom_ti_char(handle, trim(var_name), &
  663. var_value, &
  664. istatus)
  665. end if
  666. #endif
  667. call mprintf((istatus /= 0),ERROR,'Error in reading domain time-independent attribute')
  668. end subroutine ext_get_dom_ti_char
  669. subroutine input_close()
  670. implicit none
  671. ! Local variables
  672. integer :: istatus
  673. istatus = 0
  674. if (my_proc_id == IO_NODE .or. do_tiled_input) then
  675. #ifdef IO_BINARY
  676. if (io_form_input == BINARY) then
  677. call ext_int_ioclose(handle, istatus)
  678. call ext_int_ioexit(istatus)
  679. end if
  680. #endif
  681. #ifdef IO_NETCDF
  682. if (io_form_input == NETCDF) then
  683. call ext_ncd_ioclose(handle, istatus)
  684. call ext_ncd_ioexit(istatus)
  685. end if
  686. #endif
  687. #ifdef IO_GRIB1
  688. if (io_form_input == GRIB1) then
  689. call ext_gr1_ioclose(handle, istatus)
  690. call ext_gr1_ioexit(istatus)
  691. end if
  692. #endif
  693. end if
  694. call q_destroy(unit_desc)
  695. end subroutine input_close
  696. end module input_module