Ignore:
Timestamp:
Jan 17, 2019 2:12:17 PM (5 years ago)
Author:
eckhard
Message:

inifor: bugfix: avoid empty averaging regions, check if all input files are present

Location:
palm/trunk/UTIL/inifor/src
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • palm/trunk/UTIL/inifor/src/inifor_control.f90

    r3618 r3678  
    2626! -----------------
    2727! $Id$
     28! Added message buffer for displaying tips to rectify encountered errors
     29!
     30!
     31! 3618 2018-12-10 13:25:22Z eckhard
    2832! Prefixed all INIFOR modules with inifor_
    2933!
     
    7377
    7478    CHARACTER (LEN=5000) ::  message = '' !< log message buffer
     79    CHARACTER (LEN=5000) ::  tip     = '' !< optional log message buffer for tips on how to rectify encountered errors
    7580
    7681 CONTAINS
  • palm/trunk/UTIL/inifor/src/inifor_defs.f90

    r3618 r3678  
    2626! -----------------
    2727! $Id$
     28! Bumped version number
     29!
     30!
     31! 3618 2018-12-10 13:25:22Z eckhard
    2832! Prefixed module with inifor_
    2933!
     
    127131 INTEGER, PARAMETER          ::  FORCING_STEP = 1             !< Number of hours between forcing time steps [h]
    128132 REAL(dp), PARAMETER         ::  NUDGING_TAU = 21600.0_dp     !< Nudging relaxation time scale [s]
    129  CHARACTER(LEN=*), PARAMETER ::  VERSION = '1.4.3'            !< INIFOR version number
     133 CHARACTER(LEN=*), PARAMETER ::  VERSION = '1.4.4'            !< INIFOR version number
    130134 CHARACTER(LEN=*), PARAMETER ::  COPYRIGHT = 'Copyright 2017-2018 Leibniz Universitaet Hannover' // &
    131135     ACHAR( 10 ) // ' Copyright 2017-2018 Deutscher Wetterdienst Offenbach' !< Copyright notice
  • palm/trunk/UTIL/inifor/src/inifor_grid.f90

    r3618 r3678  
    2626! -----------------
    2727! $Id$
     28! bugfix: Avoid empty averaging regions for small PALM domains
     29! change: moved get_input_file_list() to io module
     30!
     31!
     32! 3618 2018-12-10 13:25:22Z eckhard
    2833! Prefixed all INIFOR modules with inifor_, removed unused variables
    2934!
     
    112117        ONLY:  get_netcdf_attribute, get_netcdf_dim_vector,                    &
    113118               get_netcdf_variable, parse_command_line_arguments,              &
    114                validate_config
     119               get_input_file_list, validate_config
    115120    USE inifor_transform,                                                      &
    116121        ONLY:  average_2d, rotate_to_cosmo, find_horizontal_neighbours,&
     
    16251630       dlat = cosmo_lat(1) - cosmo_lat(0)
    16261631
    1627        imin = CEILING( (avg_grid % lon(1) - cosmo_lon(0)) / dlon )
    1628        imax = FLOOR  ( (avg_grid % lon(2) - cosmo_lon(0)) / dlon )
    1629 
    1630        jmin = CEILING( (avg_grid % lat(1) - cosmo_lat(0)) / dlat )
    1631        jmax = FLOOR  ( (avg_grid % lat(2) - cosmo_lat(0)) / dlat )
     1632       imin = FLOOR  ( (avg_grid % lon(1) - cosmo_lon(0)) / dlon )
     1633       imax = CEILING( (avg_grid % lon(2) - cosmo_lon(0)) / dlon )
     1634
     1635       jmin = FLOOR  ( (avg_grid % lat(1) - cosmo_lat(0)) / dlat )
     1636       jmax = CEILING( (avg_grid % lat(2) - cosmo_lat(0)) / dlat )
    16321637       
    16331638       message = "Averaging '" // TRIM(avg_grid % kind) // "' over "//         &
     
    36413646
    36423647
    3643     SUBROUTINE get_input_file_list(start_date_string, start_hour, end_hour,        &
    3644                                    step_hour, path, prefix, suffix, file_list)
    3645 
    3646        CHARACTER (LEN=DATE), INTENT(IN) ::  start_date_string
    3647        CHARACTER (LEN=*),    INTENT(IN) ::  prefix, suffix, path
    3648        INTEGER,              INTENT(IN) ::  start_hour, end_hour, step_hour
    3649        CHARACTER(LEN=*), ALLOCATABLE, INTENT(INOUT) ::  file_list(:)
    3650 
    3651        INTEGER             ::  number_of_intervals, hour, i
    3652        CHARACTER(LEN=DATE) ::  date_string
    3653 
    3654        number_of_intervals = CEILING( REAL(end_hour - start_hour) / step_hour )
    3655        ALLOCATE( file_list(number_of_intervals + 1) )
    3656 
    3657        DO i = 0, number_of_intervals
    3658           hour = start_hour + i * step_hour
    3659           date_string = add_hours_to(start_date_string, hour)
    3660 
    3661           file_list(i+1) = TRIM(path) // TRIM(prefix) // TRIM(date_string) //    &
    3662                            TRIM(suffix) // '.nc'
    3663           message = "Set up input file name '" // TRIM(file_list(i+1)) //"'"
    3664           CALL report('input_file_list', message)
    3665        END DO
    3666 
    3667     END SUBROUTINE get_input_file_list
    3668 
    3669 
    36703648!------------------------------------------------------------------------------!
    36713649! Description:
  • palm/trunk/UTIL/inifor/src/inifor_io.f90

    r3618 r3678  
    2626! -----------------
    2727! $Id$
     28! Moved get_input_file_list() here from grid module, added check for presence of
     29!    input files
     30!
     31!
     32!
     33!
     34! 3618 2018-12-10 13:25:22Z eckhard
    2835! Prefixed all INIFOR modules with inifor_
    2936!
     
    98105    USE inifor_types
    99106    USE inifor_util,                                                           &
    100         ONLY:  reverse, str, real_to_str
     107        ONLY:  add_hours_to, reverse, str, real_to_str
    101108    USE netcdf
    102109
     
    529536
    530537   
     538
     539   SUBROUTINE get_datetime_file_list( start_date_string, start_hour, end_hour, &
     540                                      step_hour, input_path, prefix, suffix,   &
     541                                      file_list )
     542
     543      CHARACTER (LEN=DATE), INTENT(IN) ::  start_date_string
     544      CHARACTER (LEN=*),    INTENT(IN) ::  prefix, suffix, input_path
     545      INTEGER,              INTENT(IN) ::  start_hour, end_hour, step_hour
     546      CHARACTER(LEN=*), ALLOCATABLE, INTENT(INOUT) ::  file_list(:)
     547
     548      INTEGER             ::  number_of_intervals, hour, i
     549      CHARACTER(LEN=DATE) ::  date_string
     550
     551      number_of_intervals = CEILING( REAL(end_hour - start_hour) / step_hour )
     552      ALLOCATE( file_list(number_of_intervals + 1) )
     553
     554      DO i = 0, number_of_intervals
     555
     556         hour = start_hour + i * step_hour
     557         date_string = add_hours_to(start_date_string, hour)
     558
     559         file_list(i+1) = TRIM(input_path) // TRIM(prefix) //                  &
     560                          TRIM(date_string) // TRIM(suffix) // '.nc'
     561
     562         message = "Set up input file name '" // TRIM(file_list(i+1)) // "'"
     563         CALL report('input_file_list', message)
     564
     565      END DO
     566
     567   END SUBROUTINE get_datetime_file_list
     568
     569!------------------------------------------------------------------------------!
     570! Description:
     571! ------------
     572!> Establish a list of files based on the given start and end times and file
     573!> prefixes and suffixes.
     574!------------------------------------------------------------------------------!
     575   SUBROUTINE get_input_file_list( start_date_string, start_hour, end_hour,    &
     576                                   step_hour, input_path, prefix, suffix,      &
     577                                   file_list )
     578
     579      CHARACTER (LEN=DATE), INTENT(IN) ::  start_date_string
     580      CHARACTER (LEN=*),    INTENT(IN) ::  prefix, suffix, input_path
     581      INTEGER,              INTENT(IN) ::  start_hour, end_hour, step_hour
     582      CHARACTER(LEN=*), ALLOCATABLE, INTENT(INOUT) ::  file_list(:)
     583
     584      INTEGER             ::  number_of_intervals, hour, i
     585      CHARACTER(LEN=DATE) ::  date_string
     586      CHARACTER(LEN=PATH) ::  file_name
     587
     588      CALL get_datetime_file_list( start_date_string, start_hour, end_hour,    &
     589                                   step_hour, input_path, prefix, suffix,      &
     590                                   file_list )
     591
     592      tip = "Please check if you specified the correct file prefix " //        &
     593            "using the options --input-prefix, --flow-prefix, etc."
     594
     595      DO i = 1, SIZE(file_list)
     596          CALL verify_file(file_list(i), 'input', tip)
     597      END DO
     598
     599   END SUBROUTINE get_input_file_list
     600
     601
     602!------------------------------------------------------------------------------!
     603! Description:
     604! ------------
     605!> Abort INIFOR if the given file is not present.
     606!------------------------------------------------------------------------------!
     607   SUBROUTINE verify_file(file_name, file_kind, tip)
     608
     609      CHARACTER(LEN=*), INTENT(IN)           ::  file_name, file_kind
     610      CHARACTER(LEN=*), INTENT(IN), OPTIONAL ::  tip
     611
     612      IF (.NOT. file_present(file_name))  THEN
     613
     614         IF (LEN(TRIM(file_name)) == 0)  THEN
     615
     616            message = "No name was given for the " // TRIM(file_kind) // " file."
     617
     618         ELSE
     619
     620            message = "The " // TRIM(file_kind) // " file '" //                &
     621                      TRIM(file_name) // "' was not found."
     622
     623            IF (PRESENT(tip))  THEN
     624               message = TRIM(message) // " " // TRIM(tip)
     625            END IF
     626
     627         END IF
     628
     629         CALL inifor_abort('verify_file', message)
     630
     631      END IF
     632
     633   END SUBROUTINE verify_file
     634
     635
    531636!------------------------------------------------------------------------------!
    532637! Description:
     
    552657   SUBROUTINE validate_config(cfg)
    553658      TYPE(inifor_config), INTENT(IN) ::  cfg
    554       LOGICAL                         ::  all_files_present
    555 
    556       all_files_present = .TRUE.
    557       all_files_present = all_files_present .AND. file_present(cfg % hhl_file, 'HHL')
    558       all_files_present = all_files_present .AND. file_present(cfg % namelist_file, 'NAMELIST')
    559       all_files_present = all_files_present .AND. file_present(cfg % soiltyp_file, 'SOILTYP')
     659
     660      CALL verify_file(cfg % hhl_file, 'HHL')
     661      CALL verify_file(cfg % namelist_file, 'NAMELIST')
     662      CALL verify_file(cfg % soiltyp_file, 'SOILTYP')
    560663
    561664!
    562665!--   Only check optional static driver file name, if it has been given.
    563666      IF (TRIM(cfg % static_driver_file) .NE. '')  THEN
    564          all_files_present = all_files_present .AND. file_present(cfg % static_driver_file, 'static driver')
     667         CALL verify_file(cfg % static_driver_file, 'static driver')
    565668      END IF
    566669
    567       IF (.NOT. all_files_present)  THEN
    568          message = "INIFOR configuration invalid; some input files are missing."
    569          CALL inifor_abort( 'validate_config', message )
    570       END IF
    571      
    572      
    573670      SELECT CASE( TRIM(cfg % ic_mode) )
    574671      CASE( 'profile', 'volume')
     
    619716!> Check whether the given file is present on the filesystem.
    620717!------------------------------------------------------------------------------!
    621    LOGICAL FUNCTION file_present(filename, kind)
     718   LOGICAL FUNCTION file_present(filename)
    622719      CHARACTER(LEN=PATH), INTENT(IN) ::  filename
    623       CHARACTER(LEN=*), INTENT(IN)    ::  kind
    624 
    625       IF (LEN(TRIM(filename))==0)  THEN
    626 
    627          file_present = .FALSE.
    628          message = "No name was given for the " // TRIM(kind) // " file."
    629          CALL report('file_present', message)
    630 
    631       ELSE
    632 
    633          INQUIRE(FILE=filename, EXIST=file_present)
    634 
    635          IF (.NOT. file_present)  THEN
    636             message = "The given " // TRIM(kind) // " file '" //               &
    637                       TRIM(filename) // "' does not exist."
    638             CALL report('file_present', message)
    639          END IF
    640 
    641       END IF
     720
     721      INQUIRE(FILE=filename, EXIST=file_present)
    642722
    643723   END FUNCTION file_present
  • palm/trunk/UTIL/inifor/src/inifor_transform.f90

    r3618 r3678  
    2626! -----------------
    2727! $Id$
     28! Check if set of averaging columns is empty
     29!
     30!
     31! 3618 2018-12-10 13:25:22Z eckhard
    2832! Prefixed all INIFOR modules with inifor_, removed unused variables
    2933!
     
    226230       REAL(dp) ::  ni
    227231
    228        IF (SIZE(ii) .NE. SIZE(jj))  THEN
     232       IF (SIZE(ii) /= SIZE(jj))  THEN
    229233          message = "Length of 'ii' and 'jj' index lists do not match." //     &
    230234             NEW_LINE(' ') // "ii has " // str(SIZE(ii)) // " elements, " //   &
    231235             NEW_LINE(' ') // "jj has " // str(SIZE(jj)) // "."
     236          CALL inifor_abort('average_2d', message)
     237       END IF
     238
     239       IF (SIZE(ii) == 0)  THEN
     240          message = "No columns to average over; " //                          &
     241                    "size of index lists 'ii' and 'jj' is zero."
    232242          CALL inifor_abort('average_2d', message)
    233243       END IF
Note: See TracChangeset for help on using the changeset viewer.