Beispiel #1
0
def check_array_size(config, keys, size):
	if not has_key(config, keys): return
	if len(keys) == 1:
		if len(config[keys[0]]) != size:
			cli.error(f'Parameter max_dom is {config["domains"]["max_dom"]}, but {keys} only has {len(config[keys[0]])} elements!')
	elif len(keys) == 2:
		if len(config[keys[0]][keys[1]]) != size:
			cli.error(f'Parameter max_dom is {config["domains"]["max_dom"]}, but {keys} only has {len(config[keys[0]][keys[1]])} elements!')
	elif len(keys) == 3:
		if len(config[keys[0]][keys[1]][keys[2]]) != size:
			cli.error(f'Parameter max_dom is {config["domains"]["max_dom"]}, but {keys} only has {len(config[keys[0]][keys[1]][keys[2]])} elements!')
Beispiel #2
0
def change_to_array(config, keys):
	if not has_key(config, keys): return
	if len(keys) == 1:
		if type(config[keys[0]]) != list:
			config[keys[0]] = [config[keys[0]]]
	elif len(keys) == 2:
		if type(config[keys[0]][keys[1]]) != list:
			config[keys[0]][keys[1]] = [config[keys[0]][keys[1]]]
	elif len(keys) == 3:
		if type(config[keys[0]][keys[1]][keys[2]]) != list:
			config[keys[0]][keys[1]][keys[2]] = [config[keys[0]][keys[1]][keys[2]]]
Beispiel #3
0
def parse_config(config_json):
    config = {}

    if os.path.isfile(config_json):
        config = json.loads(open(config_json, 'r').read())
    else:
        try:
            config = json.loads(config_json)
        except:
            cli.error(f'{cli.red(config_json)} is not a JSON file or text!')

    # Set defaults.
    if not has_key(config, 'share'): config['share'] = {}
    if not has_key(config, 'domains'): config['domains'] = {}
    check_mandatory_params(config['domains'],
                           ('max_dom', 'dx', 'dy', 'e_we', 'e_sn'))
    # - parent_grid_ratio, parent_time_step_ratio, i_parent_start, j_parent_start
    if config['domains']['max_dom'] == 1:
        config['domains']['parent_grid_ratio'] = [1]
        config['domains']['parent_time_step_ratio'] = [1]
        config['domains']['i_parent_start'] = [1]
        config['domains']['j_parent_start'] = [1]
    else:
        if has_key(config, ('custom', 'start_time')):
            check_mandatory_params(config['domains'],
                                   ['parent_time_step_ratio'])
        check_mandatory_params(config['domains'],
                               ('i_parent_start', 'j_parent_start'))
    # Change to array.
    change_to_array(config, ('domains', 'dx'))
    change_to_array(config, ('domains', 'dy'))
    change_to_array(config, ('domains', 'e_we'))
    change_to_array(config, ('domains', 'e_sn'))
    change_to_array(config, ('domains', 'e_vert'))
    change_to_array(config, ('domains', 'parent_time_step_ratio'))
    change_to_array(config, ('domains', 'i_parent_start'))
    change_to_array(config, ('domains', 'j_parent_start'))
    # Check dimension.
    check_array_size(config, ('domains', 'dx'), config['domains']['max_dom'])
    check_array_size(config, ('domains', 'dy'), config['domains']['max_dom'])
    check_array_size(config, ('domains', 'e_we'), config['domains']['max_dom'])
    check_array_size(config, ('domains', 'e_sn'), config['domains']['max_dom'])
    check_array_size(config, ('domains', 'e_vert'),
                     config['domains']['max_dom'])
    check_array_size(config, ('domains', 'parent_time_step_ratio'),
                     config['domains']['max_dom'])
    check_array_size(config, ('domains', 'i_parent_start'),
                     config['domains']['max_dom'])
    check_array_size(config, ('domains', 'j_parent_start'),
                     config['domains']['max_dom'])
    if not has_key(config, ('domains', 'parent_grid_ratio')):
        config['domains']['parent_grid_ratio'] = [1]
        for i in range(1, len(config['domains']['dx'])):
            config['domains']['parent_grid_ratio'].append(
                int(config['domains']['dx'][i - 1] /
                    config['domains']['dx'][i]))
    config['domains']['grid_id'] = [
        i + 1 for i in range(config['domains']['max_dom'])
    ]
    if not has_key(config, ('domains', 'parent_id')):
        config['domains']['parent_id'] = [
            i for i in range(config['domains']['max_dom'])
        ]

    # Transform parameters.
    if has_key(config, ('custom', 'start_time')):
        config['custom']['start_time'] = pendulum.from_format(
            config['custom']['start_time'], 'YYYYMMDDHH')
        if not has_key(config, ('custom', 'end_time')):
            config['custom']['end_time'] = config['custom']['start_time'].add(
                hours=config['custom']['forecast_hours'])
        else:
            config['custom']['end_time'] = pendulum.from_format(
                config['custom']['end_time'], 'YYYYMMDDHH')
    if not type(config['domains']['dx']) == list:
        config['domains']['dx'] = [config['domains']['dx']]
    if not type(config['domains']['dy']) == list:
        config['domains']['dy'] = [config['domains']['dy']]

    for key in ('e_we', 'e_sn', 'parent_id', 'parent_grid_ratio',
                'i_parent_start', 'j_parent_start'):
        config['geogrid'][key] = config['domains'][key]
    config['geogrid']['dx'] = config['domains']['dx'][0]
    config['geogrid']['dy'] = config['domains']['dy'][0]

    # Set time step if not set yet.
    if not has_key(config, ('domains', 'time_step')):
        if config['domains']['dx'][0] >= 30000:
            config['domains']['time_step'] = 120
        elif 25000 <= config['domains']['dx'][0] < 30000:
            config['domains']['time_step'] = 120
        elif 20000 <= config['domains']['dx'][0] < 25000:
            config['domains']['time_step'] = 120
        elif 15000 <= config['domains']['dx'][0] < 20000:
            config['domains']['time_step'] = 90
        elif 10000 <= config['domains']['dx'][0] < 15000:
            config['domains']['time_step'] = 60
        elif 5000 <= config['domains']['dx'][0] < 10000:
            config['domains']['time_step'] = 30
        elif 2500 <= config['domains']['dx'][0] >= 5000:
            config['domains']['time_step'] = 10
        else:
            config['domains']['time_step'] = 5

    if not has_key(config, 'time_control'): config['time_control'] = {}

    # wrfvar* sections
    for tag in range(1, 23):
        section = f'wrfvar{tag}'
        if not section in config: config[section] = {}
    if not has_key(config, ('wrfvar3', 'ob_format')):
        config['wrfvar3']['ob_format'] = 2
    if config['wrfvar3']['ob_format'] == 1 and not has_key(
            config, ('custom', 'wrfda', 'prepbufr_source')):
        config['custom']['wrfda']['prepbufr_source'] = 'gdas'

    return config