4 use misc_definitions_module
7 use module_internal_header_util
12 type (queue) :: unit_desc
14 ! WRF I/O API related variables
19 character (len=1) :: internal_gridtype
24 subroutine input_init(nest_number, istatus)
29 integer, intent(in) :: nest_number
30 integer, intent(out) :: istatus
32 #include "wrf_io_flags.h"
33 #include "wrf_status_codes.h"
37 integer :: comm_1, comm_2
38 character (len=MAX_FILENAME_LEN) :: input_fname
42 if (my_proc_id == IO_NODE .or. do_tiled_input) then
45 if (io_form_input == BINARY) call ext_int_ioinit('sysdep info', istatus)
48 if (io_form_input == NETCDF) call ext_ncd_ioinit('sysdep info', istatus)
51 if (io_form_input == GRIB1) call ext_gr1_ioinit('sysdep info', istatus)
53 call mprintf((istatus /= 0),ERROR,'Error in ext_pkg_ioinit')
58 if (gridtype == 'C') then
60 if (io_form_input == BINARY) input_fname = trim(opt_output_from_geogrid_path)//'geo_em.d .int'
63 if (io_form_input == NETCDF) input_fname = trim(opt_output_from_geogrid_path)//'geo_em.d .nc'
66 if (io_form_input == GRIB1) input_fname = trim(opt_output_from_geogrid_path)//'geo_em.d .grib'
68 i = len_trim(opt_output_from_geogrid_path)
69 write(input_fname(i+9:i+10),'(i2.2)') nest_number
70 else if (gridtype == 'E') then
72 if (io_form_input == BINARY) input_fname = trim(opt_output_from_geogrid_path)//'geo_nmm.d .int'
75 if (io_form_input == NETCDF) input_fname = trim(opt_output_from_geogrid_path)//'geo_nmm.d .nc'
78 if (io_form_input == GRIB1) input_fname = trim(opt_output_from_geogrid_path)//'geo_nmm.d .grib'
80 i = len_trim(opt_output_from_geogrid_path)
81 write(input_fname(i+10:i+11),'(i2.2)') nest_number
84 if (nprocs > 1 .and. do_tiled_input) then
85 write(input_fname(len_trim(input_fname)+1:len_trim(input_fname)+5), '(a1,i4.4)') &
91 if (io_form_input == BINARY) &
92 call ext_int_open_for_read(trim(input_fname), comm_1, comm_2, 'sysdep info', handle, istatus)
95 if (io_form_input == NETCDF) &
96 call ext_ncd_open_for_read(trim(input_fname), comm_1, comm_2, 'sysdep info', handle, istatus)
99 if (io_form_input == GRIB1) &
100 call ext_gr1_open_for_read(trim(input_fname), comm_1, comm_2, 'sysdep info', handle, istatus)
102 call mprintf((istatus /= 0),ERROR,'Couldn''t open file %s for input.',s1=input_fname)
104 call q_init(unit_desc)
106 end if ! (my_proc_id == IO_NODE .or. do_tiled_input)
110 end subroutine input_init
113 subroutine read_next_field(start_patch_i, end_patch_i, &
114 start_patch_j, end_patch_j, &
115 start_patch_k, end_patch_k, &
116 cname, cunits, cdesc, memorder, stagger, &
117 dimnames, sr_x, sr_y, real_array, istatus)
122 integer, intent(out) :: start_patch_i, end_patch_i, &
123 start_patch_j, end_patch_j, &
124 start_patch_k, end_patch_k, &
126 real, pointer, dimension(:,:,:) :: real_array
127 character (len=*), intent(out) :: cname, memorder, stagger, cunits, cdesc
128 character (len=128), dimension(3), intent(inout) :: dimnames
129 integer, intent(inout) :: istatus
131 #include "wrf_io_flags.h"
132 #include "wrf_status_codes.h"
135 integer :: ndim, wrftype
136 integer :: sm1, em1, sm2, em2, sm3, em3, sp1, ep1, sp2, ep2, sp3, ep3
137 integer, dimension(3) :: domain_start, domain_end, temp
138 real, pointer, dimension(:,:,:) :: real_domain
139 character (len=20) :: datestr
142 if (my_proc_id == IO_NODE .or. do_tiled_input) then
144 if (num_calls == 0) then
146 if (io_form_input == BINARY) call ext_int_get_next_time(handle, datestr, istatus)
149 if (io_form_input == NETCDF) call ext_ncd_get_next_time(handle, datestr, istatus)
152 if (io_form_input == GRIB1) call ext_gr1_get_next_time(handle, datestr, istatus)
156 num_calls = num_calls + 1
159 if (io_form_input == BINARY) call ext_int_get_next_var(handle, cname, istatus)
162 if (io_form_input == NETCDF) call ext_ncd_get_next_var(handle, cname, istatus)
165 if (io_form_input == GRIB1) call ext_gr1_get_next_var(handle, cname, istatus)
169 if (nprocs > 1 .and. .not. do_tiled_input) call parallel_bcast_int(istatus)
170 if (istatus /= 0) return
172 if (my_proc_id == IO_NODE .or. do_tiled_input) then
176 if (io_form_input == BINARY) then
177 call ext_int_get_var_info(handle, cname, ndim, memorder, stagger, domain_start, domain_end, wrftype, istatus)
181 if (io_form_input == NETCDF) then
182 call ext_ncd_get_var_info(handle, cname, ndim, memorder, stagger, domain_start, domain_end, wrftype, istatus)
183 call ext_ncd_get_var_ti_integer(handle, 'sr_x', &
184 trim(cname), temp(1), 1, temp(3), istatus)
185 call ext_ncd_get_var_ti_integer(handle, 'sr_y', &
186 trim(cname), temp(2), 1, temp(3), istatus)
190 if (io_form_input == GRIB1) then
191 call ext_gr1_get_var_info(handle, cname, ndim, memorder, stagger, domain_start, domain_end, wrftype, istatus)
192 call ext_gr1_get_var_ti_integer(handle, 'sr_x', &
193 trim(cname), temp(1), 1, temp(3), istatus)
194 call ext_gr1_get_var_ti_integer(handle, 'sr_y', &
195 trim(cname), temp(2), 1, temp(3), istatus)
199 call mprintf((istatus /= 0),ERROR,'In read_next_field(), problems with ext_pkg_get_var_info()')
201 start_patch_i = domain_start(1)
202 start_patch_j = domain_start(2)
203 end_patch_i = domain_end(1)
204 end_patch_j = domain_end(2)
206 start_patch_k = domain_start(3)
207 end_patch_k = domain_end(3)
217 allocate(real_domain(start_patch_i:end_patch_i, start_patch_j:end_patch_j, start_patch_k:end_patch_k))
219 if (io_form_input == BINARY) then
220 call ext_int_read_field(handle, '0000-00-00_00:00:00', cname, real_domain, WRF_REAL, &
221 1, 1, 0, memorder, stagger, &
222 dimnames, domain_start, domain_end, domain_start, domain_end, &
223 domain_start, domain_end, istatus)
227 if (io_form_input == NETCDF) then
228 call ext_ncd_read_field(handle, '0000-00-00_00:00:00', cname, real_domain, WRF_REAL, &
229 1, 1, 0, memorder, stagger, &
230 dimnames, domain_start, domain_end, domain_start, domain_end, &
231 domain_start, domain_end, istatus)
235 if (io_form_input == GRIB1) then
236 call ext_gr1_read_field(handle, '0000-00-00_00:00:00', cname, real_domain, WRF_REAL, &
237 1, 1, 0, memorder, stagger, &
238 dimnames, domain_start, domain_end, domain_start, domain_end, &
239 domain_start, domain_end, istatus)
243 call mprintf((istatus /= 0),ERROR,'In read_next_field(), got error code %i.', i1=istatus)
245 if (io_form_input == BINARY) then
246 qd = q_remove(unit_desc)
248 cdesc = qd%description
260 if (io_form_input == NETCDF) then
261 call ext_ncd_get_var_ti_char(handle, 'units', cname, cunits, istatus)
262 call ext_ncd_get_var_ti_char(handle, 'description', cname, cdesc, istatus)
263 call ext_ncd_get_var_ti_char(handle, 'stagger', cname, stagger, istatus)
267 if (io_form_input == GRIB1) then
268 call ext_gr1_get_var_ti_char(handle, 'units', cname, cunits, istatus)
269 call ext_gr1_get_var_ti_char(handle, 'description', cname, cdesc, istatus)
270 call ext_gr1_get_var_ti_char(handle, 'stagger', cname, stagger, istatus)
275 end if ! (my_proc_id == IO_NODE .or. do_tiled_input)
277 if (nprocs > 1 .and. .not. do_tiled_input) then
278 call parallel_bcast_char(cname, len(cname))
279 call parallel_bcast_char(cunits, len(cunits))
280 call parallel_bcast_char(cdesc, len(cdesc))
281 call parallel_bcast_char(memorder, len(memorder))
282 call parallel_bcast_char(stagger, len(stagger))
283 call parallel_bcast_char(dimnames(1), 128)
284 call parallel_bcast_char(dimnames(2), 128)
285 call parallel_bcast_char(dimnames(3), 128)
286 call parallel_bcast_int(domain_start(3))
287 call parallel_bcast_int(domain_end(3))
288 call parallel_bcast_int(sr_x)
289 call parallel_bcast_int(sr_y)
295 sp3 = domain_start(3)
298 if (internal_gridtype == 'C') then
299 if (my_x /= nproc_x - 1 .or. stagger == 'U' .or. stagger == 'CORNER' .or. sr_x > 1) then
302 if (my_y /= nproc_y - 1 .or. stagger == 'V' .or. stagger == 'CORNER' .or. sr_y > 1) then
305 else if (internal_gridtype == 'E') then
333 allocate(real_array(sm1:em1,sm2:em2,sm3:em3))
334 if (my_proc_id /= IO_NODE) then
335 allocate(real_domain(1,1,1))
343 call scatter_whole_field_r(real_array, &
344 sm1, em1, sm2, em2, sm3, em3, &
345 sp1, ep1, sp2, ep2, sp3, ep3, &
347 domain_start(1), domain_end(1), &
348 domain_start(2), domain_end(2), &
349 domain_start(3), domain_end(3))
350 deallocate(real_domain)
354 real_array => real_domain
358 end subroutine read_next_field
360 subroutine read_global_attrs(title, start_date, grid_type, dyn_opt, &
361 west_east_dim, south_north_dim, bottom_top_dim, &
362 we_patch_s, we_patch_e, we_patch_s_stag, we_patch_e_stag, &
363 sn_patch_s, sn_patch_e, sn_patch_s_stag, sn_patch_e_stag, &
364 map_proj, mminlu, num_land_cat, is_water, is_lake, is_ice, is_urban, &
365 isoilwater, grid_id, parent_id, i_parent_start, j_parent_start, &
366 i_parent_end, j_parent_end, dx, dy, cen_lat, moad_cen_lat, cen_lon, &
367 stand_lon, truelat1, truelat2, pole_lat, pole_lon, parent_grid_ratio, &
368 corner_lats, corner_lons, sr_x, sr_y)
373 integer, intent(out) :: dyn_opt, west_east_dim, south_north_dim, bottom_top_dim, map_proj, &
374 is_water, is_lake, we_patch_s, we_patch_e, we_patch_s_stag, we_patch_e_stag, &
375 sn_patch_s, sn_patch_e, sn_patch_s_stag, sn_patch_e_stag, &
376 is_ice, is_urban, isoilwater, grid_id, parent_id, i_parent_start, j_parent_start, &
377 i_parent_end, j_parent_end, parent_grid_ratio, sr_x, sr_y, num_land_cat
378 real, intent(out) :: dx, dy, cen_lat, moad_cen_lat, cen_lon, stand_lon, truelat1, truelat2, &
380 real, dimension(16), intent(out) :: corner_lats, corner_lons
381 character (len=128), intent(out) :: title, start_date, grid_type, mminlu
384 integer :: istatus, i
386 character (len=128) :: cunits, cdesc, cstagger
387 integer, dimension(3) :: sr
390 if (my_proc_id == IO_NODE .or. do_tiled_input) then
393 if (io_form_input == BINARY) then
395 do while (istatus == 0)
400 call ext_int_get_var_ti_char(handle, 'units', 'VAR', cunits, istatus)
402 if (istatus == 0) then
403 call ext_int_get_var_ti_char(handle, 'description', 'VAR', cdesc, istatus)
405 if (istatus == 0) then
406 call ext_int_get_var_ti_char(handle, 'stagger', 'VAR', cstagger, istatus)
408 if (istatus == 0) then
409 call ext_int_get_var_ti_integer(handle, 'sr_x', 'VAR', sr(1), 1, sr(3), istatus)
411 if (istatus == 0) then
412 call ext_int_get_var_ti_integer(handle, 'sr_y', 'VAR', sr(2), 1, sr(3), istatus)
415 qd%description = cdesc
416 qd%stagger = cstagger
419 call q_insert(unit_desc, qd)
429 call ext_get_dom_ti_char('TITLE', title)
430 if (index(title,'GEOGRID V4.4') /= 0) then
432 else if (index(title,'GEOGRID V4.3.1') /= 0) then
434 else if (index(title,'GEOGRID V4.3') /= 0) then
436 else if (index(title,'GEOGRID V4.2') /= 0) then
438 else if (index(title,'GEOGRID V4.1') /= 0) then
440 else if (index(title,'GEOGRID V4.0.3') /= 0) then
442 else if (index(title,'GEOGRID V4.0.2') /= 0) then
444 else if (index(title,'GEOGRID V4.0.1') /= 0) then
446 else if (index(title,'GEOGRID V4.0') /= 0) then
448 else if (index(title,'GEOGRID V3.9.1') /= 0) then
450 else if (index(title,'GEOGRID V3.9.0.1') /= 0) then
452 else if (index(title,'GEOGRID V3.9') /= 0) then
454 else if (index(title,'GEOGRID V3.8.1') /= 0) then
456 else if (index(title,'GEOGRID V3.8') /= 0) then
458 else if (index(title,'GEOGRID V3.7.1') /= 0) then
460 else if (index(title,'GEOGRID V3.7') /= 0) then
462 else if (index(title,'GEOGRID V3.6.1') /= 0) then
464 else if (index(title,'GEOGRID V3.6') /= 0) then
466 else if (index(title,'GEOGRID V3.5.1') /= 0) then
468 else if (index(title,'GEOGRID V3.5') /= 0) then
470 else if (index(title,'GEOGRID V3.4.1') /= 0) then
472 else if (index(title,'GEOGRID V3.4') /= 0) then
474 else if (index(title,'GEOGRID V3.3.1') /= 0) then
476 else if (index(title,'GEOGRID V3.3') /= 0) then
478 else if (index(title,'GEOGRID V3.2.1') /= 0) then
480 else if (index(title,'GEOGRID V3.2') /= 0) then
482 else if (index(title,'GEOGRID V3.1.1') /= 0) then
484 else if (index(title,'GEOGRID V3.1') /= 0) then
486 else if (index(title,'GEOGRID V3.0.1') /= 0) then
491 call mprintf(.true.,DEBUG,'Reading static data from WPS version %f', f1=wps_version)
492 call ext_get_dom_ti_char ('SIMULATION_START_DATE', start_date)
493 call ext_get_dom_ti_integer_scalar('WEST-EAST_GRID_DIMENSION', west_east_dim)
494 call ext_get_dom_ti_integer_scalar('SOUTH-NORTH_GRID_DIMENSION', south_north_dim)
495 call ext_get_dom_ti_integer_scalar('BOTTOM-TOP_GRID_DIMENSION', bottom_top_dim)
496 call ext_get_dom_ti_integer_scalar('WEST-EAST_PATCH_START_UNSTAG', we_patch_s)
497 call ext_get_dom_ti_integer_scalar('WEST-EAST_PATCH_END_UNSTAG', we_patch_e)
498 call ext_get_dom_ti_integer_scalar('WEST-EAST_PATCH_START_STAG', we_patch_s_stag)
499 call ext_get_dom_ti_integer_scalar('WEST-EAST_PATCH_END_STAG', we_patch_e_stag)
500 call ext_get_dom_ti_integer_scalar('SOUTH-NORTH_PATCH_START_UNSTAG', sn_patch_s)
501 call ext_get_dom_ti_integer_scalar('SOUTH-NORTH_PATCH_END_UNSTAG', sn_patch_e)
502 call ext_get_dom_ti_integer_scalar('SOUTH-NORTH_PATCH_START_STAG', sn_patch_s_stag)
503 call ext_get_dom_ti_integer_scalar('SOUTH-NORTH_PATCH_END_STAG', sn_patch_e_stag)
504 call ext_get_dom_ti_char ('GRIDTYPE', grid_type)
505 call ext_get_dom_ti_real_scalar ('DX', dx)
506 call ext_get_dom_ti_real_scalar ('DY', dy)
507 call ext_get_dom_ti_integer_scalar('DYN_OPT', dyn_opt)
508 call ext_get_dom_ti_real_scalar ('CEN_LAT', cen_lat)
509 call ext_get_dom_ti_real_scalar ('CEN_LON', cen_lon)
510 call ext_get_dom_ti_real_scalar ('TRUELAT1', truelat1)
511 call ext_get_dom_ti_real_scalar ('TRUELAT2', truelat2)
512 call ext_get_dom_ti_real_scalar ('MOAD_CEN_LAT', moad_cen_lat)
513 call ext_get_dom_ti_real_scalar ('STAND_LON', stand_lon)
514 call ext_get_dom_ti_real_scalar ('POLE_LAT', pole_lat)
515 call ext_get_dom_ti_real_scalar ('POLE_LON', pole_lon)
516 call ext_get_dom_ti_real_vector ('corner_lats', corner_lats, 16)
517 call ext_get_dom_ti_real_vector ('corner_lons', corner_lons, 16)
518 call ext_get_dom_ti_integer_scalar('MAP_PROJ', map_proj)
519 call ext_get_dom_ti_char ('MMINLU', mminlu)
520 if ( wps_version >= 3.01 ) then
521 call ext_get_dom_ti_integer_scalar('NUM_LAND_CAT', num_land_cat)
525 call ext_get_dom_ti_integer_scalar('ISWATER', is_water)
526 if ( wps_version >= 3.01 ) then
527 call ext_get_dom_ti_integer_scalar('ISLAKE', is_lake)
531 call ext_get_dom_ti_integer_scalar('ISICE', is_ice)
532 call ext_get_dom_ti_integer_scalar('ISURBAN', is_urban)
533 call ext_get_dom_ti_integer_scalar('ISOILWATER', isoilwater)
534 call ext_get_dom_ti_integer_scalar('grid_id', grid_id)
535 call ext_get_dom_ti_integer_scalar('parent_id', parent_id)
536 call ext_get_dom_ti_integer_scalar('i_parent_start', i_parent_start)
537 call ext_get_dom_ti_integer_scalar('j_parent_start', j_parent_start)
538 call ext_get_dom_ti_integer_scalar('i_parent_end', i_parent_end)
539 call ext_get_dom_ti_integer_scalar('j_parent_end', j_parent_end)
540 call ext_get_dom_ti_integer_scalar('parent_grid_ratio', parent_grid_ratio)
541 call ext_get_dom_ti_integer_scalar('sr_x', sr_x)
542 call ext_get_dom_ti_integer_scalar('sr_y', sr_y)
547 if (nprocs > 1 .and. .not. do_tiled_input) then
549 call parallel_bcast_char(title, len(title))
550 call parallel_bcast_char(start_date, len(start_date))
551 call parallel_bcast_char(grid_type, len(grid_type))
552 call parallel_bcast_int(west_east_dim)
553 call parallel_bcast_int(south_north_dim)
554 call parallel_bcast_int(bottom_top_dim)
555 call parallel_bcast_int(we_patch_s)
556 call parallel_bcast_int(we_patch_e)
557 call parallel_bcast_int(we_patch_s_stag)
558 call parallel_bcast_int(we_patch_e_stag)
559 call parallel_bcast_int(sn_patch_s)
560 call parallel_bcast_int(sn_patch_e)
561 call parallel_bcast_int(sn_patch_s_stag)
562 call parallel_bcast_int(sn_patch_e_stag)
563 call parallel_bcast_int(sr_x)
564 call parallel_bcast_int(sr_y)
566 ! Must figure out patch dimensions from info in parallel module
567 ! we_patch_s = my_minx
568 ! we_patch_s_stag = my_minx
569 ! we_patch_e = my_maxx - 1
570 ! sn_patch_s = my_miny
571 ! sn_patch_s_stag = my_miny
572 ! sn_patch_e = my_maxy - 1
574 ! if (trim(grid_type) == 'C') then
575 ! if (my_x /= nproc_x - 1) then
576 ! we_patch_e_stag = we_patch_e + 1
578 ! if (my_y /= nproc_y - 1) then
579 ! sn_patch_e_stag = sn_patch_e + 1
581 ! else if (trim(grid_type) == 'E') then
582 ! we_patch_e = we_patch_e + 1
583 ! sn_patch_e = sn_patch_e + 1
584 ! we_patch_e_stag = we_patch_e
585 ! sn_patch_e_stag = sn_patch_e
588 call parallel_bcast_real(dx)
589 call parallel_bcast_real(dy)
590 call parallel_bcast_int(dyn_opt)
591 call parallel_bcast_real(cen_lat)
592 call parallel_bcast_real(cen_lon)
593 call parallel_bcast_real(truelat1)
594 call parallel_bcast_real(truelat2)
595 call parallel_bcast_real(pole_lat)
596 call parallel_bcast_real(pole_lon)
597 call parallel_bcast_real(moad_cen_lat)
598 call parallel_bcast_real(stand_lon)
600 call parallel_bcast_real(corner_lats(i))
601 call parallel_bcast_real(corner_lons(i))
603 call parallel_bcast_int(map_proj)
604 call parallel_bcast_char(mminlu, len(mminlu))
605 call parallel_bcast_int(is_water)
606 call parallel_bcast_int(is_lake)
607 call parallel_bcast_int(is_ice)
608 call parallel_bcast_int(is_urban)
609 call parallel_bcast_int(isoilwater)
610 call parallel_bcast_int(grid_id)
611 call parallel_bcast_int(parent_id)
612 call parallel_bcast_int(i_parent_start)
613 call parallel_bcast_int(i_parent_end)
614 call parallel_bcast_int(j_parent_start)
615 call parallel_bcast_int(j_parent_end)
616 call parallel_bcast_int(parent_grid_ratio)
619 internal_gridtype = grid_type
621 end subroutine read_global_attrs
624 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
625 ! Name: ext_get_dom_ti_integer
627 ! Purpose: Read a domain time-independent integer attribute from input.
628 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
629 subroutine ext_get_dom_ti_integer_scalar(var_name, var_value, suppress_errors)
634 integer, intent(out) :: var_value
635 character (len=*), intent(in) :: var_name
636 logical, intent(in), optional :: suppress_errors
639 integer :: istatus, outcount
640 integer, dimension(1) :: var_value_arr
643 if (io_form_input == BINARY) then
644 call ext_int_get_dom_ti_integer(handle, trim(var_name), &
646 1, outcount, istatus)
650 if (io_form_input == NETCDF) then
651 call ext_ncd_get_dom_ti_integer(handle, trim(var_name), &
653 1, outcount, istatus)
657 if (io_form_input == GRIB1) then
658 call ext_gr1_get_dom_ti_integer(handle, trim(var_name), &
660 1, outcount, istatus)
664 if (present(suppress_errors)) then
665 call mprintf((istatus /= 0 .and. .not.suppress_errors),ERROR,'Error while reading domain time-independent attribute.')
667 call mprintf((istatus /= 0),ERROR,'Error while reading domain time-independent attribute.')
670 var_value = var_value_arr(1)
672 end subroutine ext_get_dom_ti_integer_scalar
675 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
676 ! Name: ext_get_dom_ti_integer
678 ! Purpose: Read a domain time-independent integer attribute from input.
679 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
680 subroutine ext_get_dom_ti_integer_vector(var_name, var_value, n)
685 integer, intent(in) :: n
686 integer, dimension(n), intent(out) :: var_value
687 character (len=*), intent(in) :: var_name
690 integer :: istatus, outcount
693 if (io_form_input == BINARY) then
694 call ext_int_get_dom_ti_integer(handle, trim(var_name), &
696 n, outcount, istatus)
700 if (io_form_input == NETCDF) then
701 call ext_ncd_get_dom_ti_integer(handle, trim(var_name), &
703 n, outcount, istatus)
707 if (io_form_input == GRIB1) then
708 call ext_gr1_get_dom_ti_integer(handle, trim(var_name), &
710 n, outcount, istatus)
714 call mprintf((istatus /= 0),ERROR,'Error while reading domain time-independent attribute.')
716 end subroutine ext_get_dom_ti_integer_vector
719 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
720 ! Name: ext_get_dom_ti_real
722 ! Purpose: Read a domain time-independent real attribute from input.
723 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
724 subroutine ext_get_dom_ti_real_scalar(var_name, var_value)
729 real, intent(out) :: var_value
730 character (len=*), intent(in) :: var_name
733 integer :: istatus, outcount
734 real, dimension(1) :: var_value_arr
737 if (io_form_input == BINARY) then
738 call ext_int_get_dom_ti_real(handle, trim(var_name), &
740 1, outcount, istatus)
744 if (io_form_input == NETCDF) then
745 call ext_ncd_get_dom_ti_real(handle, trim(var_name), &
747 1, outcount, istatus)
751 if (io_form_input == GRIB1) then
752 call ext_gr1_get_dom_ti_real(handle, trim(var_name), &
754 1, outcount, istatus)
758 call mprintf((istatus /= 0),ERROR,'Error while reading domain time-independent attribute.')
760 var_value = var_value_arr(1)
762 end subroutine ext_get_dom_ti_real_scalar
765 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
766 ! Name: ext_get_dom_ti_real
768 ! Purpose: Read a domain time-independent real attribute from input.
769 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
770 subroutine ext_get_dom_ti_real_vector(var_name, var_value, n)
775 integer, intent(in) :: n
776 real, dimension(n), intent(out) :: var_value
777 character (len=*), intent(in) :: var_name
780 integer :: istatus, outcount
783 if (io_form_input == BINARY) then
784 call ext_int_get_dom_ti_real(handle, trim(var_name), &
786 n, outcount, istatus)
790 if (io_form_input == NETCDF) then
791 call ext_ncd_get_dom_ti_real(handle, trim(var_name), &
793 n, outcount, istatus)
797 if (io_form_input == GRIB1) then
798 call ext_gr1_get_dom_ti_real(handle, trim(var_name), &
800 n, outcount, istatus)
804 call mprintf((istatus /= 0),ERROR,'Error while reading domain time-independent attribute.')
806 end subroutine ext_get_dom_ti_real_vector
809 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
810 ! Name: ext_get_dom_ti_char
812 ! Purpose: Read a domain time-independent character attribute from input.
813 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
814 subroutine ext_get_dom_ti_char(var_name, var_value)
819 character (len=*), intent(in) :: var_name
820 character (len=128), intent(out) :: var_value
826 if (io_form_input == BINARY) then
827 call ext_int_get_dom_ti_char(handle, trim(var_name), &
833 if (io_form_input == NETCDF) then
834 call ext_ncd_get_dom_ti_char(handle, trim(var_name), &
840 if (io_form_input == GRIB1) then
841 call ext_gr1_get_dom_ti_char(handle, trim(var_name), &
847 call mprintf((istatus /= 0),ERROR,'Error in reading domain time-independent attribute')
849 end subroutine ext_get_dom_ti_char
852 subroutine input_close()
860 if (my_proc_id == IO_NODE .or. do_tiled_input) then
862 if (io_form_input == BINARY) then
863 call ext_int_ioclose(handle, istatus)
864 call ext_int_ioexit(istatus)
868 if (io_form_input == NETCDF) then
869 call ext_ncd_ioclose(handle, istatus)
870 call ext_ncd_ioexit(istatus)
874 if (io_form_input == GRIB1) then
875 call ext_gr1_ioclose(handle, istatus)
876 call ext_gr1_ioexit(istatus)
881 call q_destroy(unit_desc)
883 end subroutine input_close
885 end module input_module