diff --git a/data_override/data_override.F90 b/data_override/data_override.F90 index 8a00be7b62..dbbd0a6db8 100644 --- a/data_override/data_override.F90 +++ b/data_override/data_override.F90 @@ -42,7 +42,7 @@ module data_override_mod use yaml_parser_mod use constants_mod, only: PI -use mpp_mod, only : mpp_error, FATAL, WARNING, stdout, stdlog, mpp_max +use mpp_mod, only : mpp_error, FATAL, WARNING, NOTE, stdout, stdlog, mpp_max use mpp_mod, only : input_nml_file use horiz_interp_mod, only : horiz_interp_init, horiz_interp_new, horiz_interp_type, & assignment(=) @@ -261,6 +261,10 @@ subroutine data_override_init(Atm_domain_in, Ocean_domain_in, Ice_domain_in, Lan module_is_initialized = .TRUE. if ( .NOT. (atm_on .or. ocn_on .or. lnd_on .or. ice_on .or. lndUG_on)) return + if (table_size .eq. 0) then + call mpp_error(NOTE, "data_table is empty, not doing any data_overrides") + return + endif call fms2_io_init ! Test if grid_file is already opened @@ -361,13 +365,21 @@ subroutine read_table(data_table) type(data_type) :: data_entry logical :: ongrid + logical :: table_exists !< Flag indicating existence of data_table character(len=128) :: region, region_type integer :: sunit ! Read coupler_table + inquire(file='data_table', EXIST=table_exists) + if (.not. table_exists) then + call mpp_error(NOTE, 'data_override_mod: File data_table does not exist.') + table_size = 0 + return + end if + open(newunit=iunit, file='data_table', action='READ', iostat=io_status) - if(io_status/=0) call mpp_error(FATAL, 'data_override_mod: Error in opening file data_table') + if(io_status/=0) call mpp_error(FATAL, 'data_override_mod: Error in opening file data_table.') ntable = 0 ntable_lima = 0 @@ -495,35 +507,39 @@ subroutine read_table_yaml(data_table) integer :: file_id file_id = open_and_parse_file("data_table.yaml") - nentries = get_num_blocks(file_id, "data_table") - allocate(data_table(nentries)) - allocate(entry_id(nentries)) - call get_block_ids(file_id, "data_table", entry_id) - - do i = 1, nentries - call get_value_from_key(file_id, entry_id(i), "gridname", data_table(i)%gridname) - call get_value_from_key(file_id, entry_id(i), "fieldname_code", data_table(i)%fieldname_code) - call get_value_from_key(file_id, entry_id(i), "fieldname_file", data_table(i)%fieldname_file) - call get_value_from_key(file_id, entry_id(i), "file_name", data_table(i)%file_name) - call get_value_from_key(file_id, entry_id(i), "interpol_method", data_table(i)%interpol_method) - call get_value_from_key(file_id, entry_id(i), "factor", data_table(i)%factor) - call get_value_from_key(file_id, entry_id(i), "region_type", buffer, is_optional=.true.) - - if(trim(buffer) == "inside_region" ) then - data_table(i)%region_type = INSIDE_REGION - else if( trim(buffer) == "outside_region" ) then - data_table(i)%region_type = OUTSIDE_REGION - else - data_table(i)%region_type = NO_REGION - endif - - call get_value_from_key(file_id, entry_id(i), "lon_start", data_table(i)%lon_start, is_optional=.true.) - call get_value_from_key(file_id, entry_id(i), "lon_end", data_table(i)%lon_end, is_optional=.true.) - call get_value_from_key(file_id, entry_id(i), "lat_start", data_table(i)%lat_start, is_optional=.true.) - call get_value_from_key(file_id, entry_id(i), "lat_end", data_table(i)%lat_end, is_optional=.true.) + if (file_id==999) then + nentries = 0 + else + nentries = get_num_blocks(file_id, "data_table") + allocate(data_table(nentries)) + allocate(entry_id(nentries)) + call get_block_ids(file_id, "data_table", entry_id) + + do i = 1, nentries + call get_value_from_key(file_id, entry_id(i), "gridname", data_table(i)%gridname) + call get_value_from_key(file_id, entry_id(i), "fieldname_code", data_table(i)%fieldname_code) + call get_value_from_key(file_id, entry_id(i), "fieldname_file", data_table(i)%fieldname_file) + call get_value_from_key(file_id, entry_id(i), "file_name", data_table(i)%file_name) + call get_value_from_key(file_id, entry_id(i), "interpol_method", data_table(i)%interpol_method) + call get_value_from_key(file_id, entry_id(i), "factor", data_table(i)%factor) + call get_value_from_key(file_id, entry_id(i), "region_type", buffer, is_optional=.true.) + + if(trim(buffer) == "inside_region" ) then + data_table(i)%region_type = INSIDE_REGION + else if( trim(buffer) == "outside_region" ) then + data_table(i)%region_type = OUTSIDE_REGION + else + data_table(i)%region_type = NO_REGION + endif + + call get_value_from_key(file_id, entry_id(i), "lon_start", data_table(i)%lon_start, is_optional=.true.) + call get_value_from_key(file_id, entry_id(i), "lon_end", data_table(i)%lon_end, is_optional=.true.) + call get_value_from_key(file_id, entry_id(i), "lat_start", data_table(i)%lat_start, is_optional=.true.) + call get_value_from_key(file_id, entry_id(i), "lat_end", data_table(i)%lat_end, is_optional=.true.) - end do + end do + end if table_size = nentries !< Because one variable is not enough end subroutine read_table_yaml #endif diff --git a/parser/yaml_parser.F90 b/parser/yaml_parser.F90 index 1fd19b21ee..0e989a8ae4 100644 --- a/parser/yaml_parser.F90 +++ b/parser/yaml_parser.F90 @@ -207,9 +207,16 @@ function open_and_parse_file(filename) & character(len=*), intent(in) :: filename !< Filename of the yaml file logical :: sucess !< Flag indicating if the read was sucessful + logical :: yaml_exists !< Flag indicating whether the yaml exists integer :: file_id + inquire(file=trim(filename), EXIST=yaml_exists) + if (.not. yaml_exists) then + file_id = 999 + call mpp_error(NOTE, "The yaml file:"//trim(filename)//" does not exist, hopefully this is your intent!") + return + end if sucess = open_and_parse_file_wrap(trim(filename)//c_null_char, file_id) if (.not. sucess) call mpp_error(FATAL, "Error opening the yaml file:"//trim(filename)//". Check the file!") diff --git a/test_fms/parser/test_yaml_parser.sh b/test_fms/parser/test_yaml_parser.sh index c9e1a5abc1..5406b01474 100755 --- a/test_fms/parser/test_yaml_parser.sh +++ b/test_fms/parser/test_yaml_parser.sh @@ -26,7 +26,7 @@ . ../test-lib.sh if [ ! -z $parser_skip ]; then - SKIP_TESTS='test_yaml_parser.[1-22]' + SKIP_TESTS='test_yaml_parser.[1-21]' fi touch input.nml @@ -95,11 +95,6 @@ test_expect_success "parser_demo2" ' mpirun -n 1 ./parser_demo2 ' -printf "&check_crashes_nml \n missing_file = .true. \n/" | cat > input.nml -test_expect_failure "missing file" ' - mpirun -n 1 ./check_crashes -' - printf "&check_crashes_nml \n bad_conversion = .true. \n/" | cat > input.nml test_expect_failure "bad conversion" ' mpirun -n 1 ./check_crashes