PROGRAM checkGrib USE cgutils IMPLICIT NONE INTEGER :: i, stat INTEGER :: num_filepaths, expected_num_levels CHARACTER(LEN=16) :: source_str, levels_str CHARACTER(LEN=256), DIMENSION(100) :: filepaths LOGICAL :: check_fcst, check_anl, check_grib2 INTEGER :: return_code CALL get_command_args(source_str, levels_str, & & filepaths, num_filepaths, & & check_fcst, check_anl, check_grib2) !WRITE(6,*) '----- got args ------' !WRITE(6,*) 'source_str: ', TRIM(source_str) !WRITE(6,*) 'levels_str: ', TRIM(levels_str) !WRITE(6,*) 'filepaths:' !DO i=1,num_filepaths ! WRITE(6,*) TRIM(filepaths(i)) !END DO !WRITE(6,*) '----- got args ------' ! Convert string to integer READ(levels_str,*,IOSTAT=stat) expected_num_levels DO i=1,num_filepaths IF ( TRIM(source_str) .EQ. 'ECMWF' ) THEN return_code = cgutils_check_ecmwf_grib(filepaths(i), & & expected_num_levels, & & check_fcst, check_anl, check_grib2) ELSE IF ( TRIM(source_str) .EQ. 'NCEP' ) THEN return_code = cgutils_check_ncep_grib2(filepaths(i), & & expected_num_levels, & & check_fcst, check_anl, check_grib2) ELSE IF ( TRIM(source_str) .EQ. 'NCEPFV3' ) THEN return_code = cgutils_check_fv3_grib2(filepaths(i), & & expected_num_levels, & & check_fcst, check_anl, check_grib2) ELSE WRITE(6,*) 'Invalid source string: ', TRIM(source_str) CALL EXIT(2) ENDIF !PRINT *, 'return_code: ', return_code IF (return_code .EQ. 0) THEN WRITE(6,*) 'Passed: ', TRIM(filepaths(i)) ELSE WRITE(6,*) 'Failed on: ', TRIM(filepaths(i)) CALL EXIT(return_code) ENDIF END DO END PROGRAM checkGrib SUBROUTINE get_command_args(source_arg, levels_arg, & & filepaths, num_filepaths, & & check_fcst, check_anl, check_grib2) !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! This subroutine makes an effort to retrieve the command line arguments ! in string format. It makes no effort to verify their values !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! CHARACTER(LEN=16), INTENT(OUT) :: source_arg, levels_arg CHARACTER(LEN=256), DIMENSION(100), INTENT(OUT) :: filepaths INTEGER, INTENT(OUT) :: num_filepaths LOGICAL, INTENT(OUT) :: check_fcst, check_anl, check_grib2 INTEGER :: arg_idx INTEGER :: num_cli_args CHARACTER(LEN=256) :: arg_str LOGICAL :: required_flags_processed ! Logic in the following loop will set this to True only if ! the required args are storing something other than 'NUL' required_flags_processed = .FALSE. source_arg = 'NUL' levels_arg = 'NUL' ! Default values check_fcst = .FALSE. check_anl = .FALSE. check_grib2 = .FALSE. num_cli_args = IARGC() ! Abort if there were no args IF (num_cli_args .LT. 1) THEN WRITE(0,*) 'No arguments provided' CALL print_usage CALL EXIT(2) ENDIF ! We expect commandline flags, usually with arguments, followed ! by a variable-size list of filepaths num_filepaths = 0 arg_idx = 1 DO WHILE (arg_idx .LE. num_cli_args) CALL GETARG(arg_idx, arg_str) SELECT CASE ( TRIM(arg_str) ) CASE ('--source') arg_idx = arg_idx + 1 CALL GETARG(arg_idx, source_arg) IF (.NOT. ( (source_arg .EQ. 'NUL') .OR. & & (levels_arg .EQ. 'NUL') ) ) THEN required_flags_processed = .TRUE. ENDIF CASE ('--levels') arg_idx = arg_idx + 1 CALL GETARG(arg_idx, levels_arg) IF (.NOT. ( (source_arg .EQ. 'NUL') .OR. & & (levels_arg .EQ. 'NUL') ) ) THEN required_flags_processed = .TRUE. ENDIF CASE ('--checkfcst') check_fcst = .TRUE. CASE ('--checkanl') check_anl = .TRUE. CASE ('--checkgrib2') check_grib2 = .TRUE. CASE default ! We should only be here if required flags have been ! processed, in which case we assume any remaining tokens ! are paths to GRIB files ! ! Note - an additional sanity check might be to see if the ! first two characters of the token are '--', in which case ! someone might have slipped in another command flag at a ! time when we're only expecting pathnames. But, I chose ! not to implement that at this time. I figure the utility ! will barf when it tries to open an invalid file. IF (.NOT. required_flags_processed) THEN WRITE(0,*) 'args missing or out of sync' CALL print_usage CALL EXIT(2) ENDIF num_filepaths = num_filepaths + 1 filepaths(num_filepaths) = TRIM(arg_str) END SELECT !PRINT *, TRIM(arg_str) arg_idx = arg_idx + 1 END DO ! Let's make sure that at least one filepath was counted IF (num_filepaths .LT. 1) THEN WRITE(0,*) 'No GRIB files were specified' CALL print_usage CALL EXIT(2) ENDIF ! Let's make sure that both checkfcst and checkanl weren't specified IF (check_fcst .AND. check_anl) THEN WRITE(0,*) 'Only one of --checkfcst and --checkanl can be specified' CALL print_usage CALL EXIT(2) ENDIF END SUBROUTINE get_command_args SUBROUTINE print_usage WRITE(0,*) ' ' WRITE(0,*) 'Usage: ' WRITE(0,*) ' ' WRITE(0,*) 'checkgrib --source [ECMWF | NCEP | NCEPFV3] --levels ' WRITE(0,*) ' [ --checkfcst | --checkanl | --checkgrib2 ]' WRITE(0,*) ' path1 path2 ...' WRITE(0,*) ' ' END SUBROUTINE print_usage