def uhs2param_init(config_file): # ---------------------------------------------------------------- # # Read Configuration files config_dict = read_config(config_file) # ---------------------------------------------------------------- # # ---------------------------------------------------------------- # # Setup Directory Structures directories = make_directories(config_dict['OPTIONS']['CASE_DIR'], ['plots', 'logs', 'params', 'inputs']) # ---------------------------------------------------------------- # # ---------------------------------------------------------------- # # copy inputs to $case_dir/inputs and update configuration config_dict = copy_inputs(config_file, directories['inputs']) options = config_dict['OPTIONS'] config_dict['POUR_POINTS'] = {'FILE_NAME': config_dict['UHS_FILES']['STATION_FILE']} config_dict['ROUTING']['FILE_NAME'] = 'unknown' config_dict['UH_BOX'] = {'FILE_NAME': 'unknown'} # ---------------------------------------------------------------- # # ---------------------------------------------------------------- # # Start Logging log = init_logger(directories['logs'], options['LOG_LEVEL'], options['VERBOSE']) for direc in directories: log.info('%s directory is %s' % (direc, directories[direc])) # ---------------------------------------------------------------- # # ---------------------------------------------------------------- # # Read domain file (if applicable) dom_data, DomVats, DomGats = read_domain(config_dict['DOMAIN']) log.info('Opened Domain File: %s' % config_dict['DOMAIN']['FILE_NAME']) if 'NEW_DOMAIN' in config_dict: new_dom_data, new_DomVats, \ new_DomGats = read_domain(config_dict['NEW_DOMAIN']) log.info('Opened New Domain File: %s', config_dict['NEW_DOMAIN']['FILE_NAME']) else: new_dom_data = None # ---------------------------------------------------------------- # # ---------------------------------------------------------------- # # Read station file outlets = read_station_file(config_dict['UHS_FILES']['STATION_FILE'], dom_data, config_dict) # ---------------------------------------------------------------- # return dom_data, new_dom_data, outlets, config_dict, directories
def gen_uh_init(config_file): """Initialize RVIC parameter""" # ---------------------------------------------------------------- # # Read Configuration files config_dict = read_config(config_file) # ---------------------------------------------------------------- # # ---------------------------------------------------------------- # # Import optional modules if config_dict['OPTIONS']['REMAP'] and not remap_available: raise ValueError('Problem importing remap module ' 'check to make sure cdo.py is available)') # ---------------------------------------------------------------- # # ---------------------------------------------------------------- # # Setup Directory Structures directories = make_directories(config_dict['OPTIONS']['CASE_DIR'], ['plots', 'logs', 'params', 'inputs']) directories.update( make_directories(config_dict['OPTIONS']['TEMP_DIR'], ['aggregated', 'remapped'])) # ---------------------------------------------------------------- # # ---------------------------------------------------------------- # # copy inputs to $case_dir/inputs and update configuration config_dict = copy_inputs(config_file, directories['inputs']) options = config_dict['OPTIONS'] # ---------------------------------------------------------------- # # ---------------------------------------------------------------- # # Start Logging log = init_logger(directories['logs'], options['LOG_LEVEL'], options['VERBOSE']) for direc in directories: log.info('%s directory is %s', direc, directories[direc]) # ---------------------------------------------------------------- # # ---------------------------------------------------------------- # # Read Pour Points files try: pour_points = pd.read_csv(config_dict['POUR_POINTS']['FILE_NAME'], comment='#') log.info('Opened Pour Points File: ' '{0}'.format(config_dict['POUR_POINTS']['FILE_NAME'])) if not (all(x in pour_points.keys() for x in ['lons', 'lats']) or all(x in pour_points.keys() for x in ['x', 'y'])): raise ValueError('Pour Points File must include ' 'variables (lons, lats) or (x, y)') if 'names' in pour_points: pour_points.fillna(inplace=True, value='unknown') for i, name in enumerate(pour_points.names): pour_points.names[i] = strip_invalid_char(name) pour_points.drop_duplicates(inplace=True) pour_points.dropna() except Exception as e: log.error('Error opening pour points file: ' '{0}'.format(config_dict['POUR_POINTS']['FILE_NAME'])) log.exception(e) raise # ---------------------------------------------------------------- # # ---------------------------------------------------------------- # # Read uh box file uh_file = config_dict['UH_BOX']['FILE_NAME'] uh_header = int(config_dict['UH_BOX']['HEADER_LINES']) uh_box = {} try: uh_box['time'], uh_box['func'] = np.genfromtxt(uh_file, skip_header=uh_header, delimiter=',', unpack=True) log.info('Opened UHbox File: ' '{0}'.format(config_dict['UH_BOX']['FILE_NAME'])) except: log.exception('Error opening uh_box file: ' '{0}'.format(config_dict['POUR_POINTS']['FILE_NAME'])) raise # ---------------------------------------------------------------- # # ---------------------------------------------------------------- # # Read FDR file fdr_file = config_dict['ROUTING']['FILE_NAME'] fdr_var = config_dict['ROUTING']['FLOW_DIRECTION_VAR'] fdr_lat = config_dict['ROUTING']['LATITUDE_VAR'] fdr_lon = config_dict['ROUTING']['LONGITUDE_VAR'] fdr_vel = config_dict['ROUTING']['VELOCITY'] fdr_dif = config_dict['ROUTING']['DIFFUSION'] try: fdr_data, fdr_vatts, _ = read_netcdf(fdr_file) fdr_shape = fdr_data[fdr_var].shape # ---------------------------------------------------------------- # # Check latitude order, flip if necessary. if fdr_data[fdr_lat][-1] > fdr_data[fdr_lat][0]: log.debug('Flow Direction inputs came in upside down, flipping ' 'everything now.') remove_vars = [] for var, data in fdr_data.iteritems(): log.debug('flipping %s', var) if data.ndim >= 1 and var != fdr_lon: fdr_data[var] = np.flipud(data) elif data.ndim == 0: remove_vars.append(var) if remove_vars: for var in remove_vars: del fdr_data[var] # ---------------------------------------------------------------- # # ---------------------------------------------------------------- # # Add velocity and/or diffusion grids if not present yet if not type(fdr_vel) == str: fdr_data['velocity'] = np.zeros(fdr_shape) + fdr_vel config_dict['ROUTING']['VELOCITY'] = 'velocity' log.info('Added velocity grid to fdr_data') if not type(fdr_dif) == str: fdr_data['diffusion'] = np.zeros(fdr_shape) + fdr_dif config_dict['ROUTING']['DIFFUSION'] = 'diffusion' log.info('Added diffusion grid to fdr_data') if ('SOURCE_AREA_VAR' not in config_dict['ROUTING'] or config_dict['ROUTING']['SOURCE_AREA_VAR'] not in fdr_data): log.warning('Upstream `SOURCE_AREA` was not provided, output ' 'source area will be zero.') config_dict['ROUTING']['SOURCE_AREA_VAR'] = 'src_area' fdr_data[config_dict['ROUTING']['SOURCE_AREA_VAR']] = \ np.zeros(fdr_shape) # ---------------------------------------------------------------- # # ---------------------------------------------------------------- # fdr_data['resolution'] = np.abs(fdr_data[fdr_lon][1] - fdr_data[fdr_lon][0]) check_ncvars(config_dict['ROUTING'], fdr_data.keys()) # ---------------------------------------------------------------- # log.info('Opened FDR File: {0}'.format(fdr_file)) except: log.exception('Error opening FDR file') raise # ---------------------------------------------------------------- # # ---------------------------------------------------------------- # # ---------------------------------------------------------------- # # Read domain file domain = config_dict['DOMAIN'] dom_data, _, _ = read_domain(domain) log.info('Opened Domain File: ' '{0}'.format(domain['FILE_NAME'])) # ---------------------------------------------------------------- # # ---------------------------------------------------------------- # # If remap is False, domain coordinates needs to be in the fdr coordinates # We can move the unit hydrographs to the domain grid later if options['AGGREGATE'] and not options['REMAP']: log.error('RVIC parameter generation requires REMAP option to be True' ' if AGGREGATE is True') raise ValueError('Invalid option') # ---------------------------------------------------------------- # # ---------------------------------------------------------------- # # Group pour points (if aggregate) if options['AGGREGATE']: outlets = make_agg_pairs(pour_points, dom_data, fdr_data, config_dict) log.info('Finished making agg pairs of ' 'pour points and outlet grid cells') else: outlets = {} if all(x in pour_points.keys() for x in ['x', 'y', 'lons', 'lats']): lats = pour_points['lats'].values lons = pour_points['lons'].values routys = pour_points['y'].values routxs = pour_points['x'].values elif all(x in pour_points.keys() for x in ['x', 'y']): # use x and y (assume from routing inputs grid) # find lons and lats from xs and ys routys = pour_points['y'].values routxs = pour_points['x'].values lats = fdr_data[fdr_lat][routys] lons = fdr_data[fdr_lon][routxs] else: # use lons and lats to find xs and ys lats = pour_points['lats'].values lons = pour_points['lons'].values # find x and y on routing grid routys, routxs = latlon2yx(plats=lats, plons=lons, glats=fdr_data[fdr_lat], glons=fdr_data[fdr_lon]) if options['SEARCH_FOR_CHANNEL']: routys, routxs = search_for_channel( fdr_data[config_dict['ROUTING']['SOURCE_AREA_VAR']], routys, routxs, tol=10, search=2) # update lats and lons lats = fdr_data[fdr_lat][routys] lons = fdr_data[fdr_lon][routxs] # Find location on domain grid domys, domxs = latlon2yx(plats=lats, plons=lons, glats=dom_data[domain['LATITUDE_VAR']], glons=dom_data[domain['LONGITUDE_VAR']]) for i in xrange(len(lats)): if 'names' in pour_points.keys(): name = pour_points['names'].values[i] name = name.replace("'", '').replace(" ", "_") else: # fill name filed with p-outlet_num name = 'p-{0}'.format(i) outlets[i] = Point(lat=lats[i], lon=lons[i], domx=domxs[i], domy=domys[i], routx=routxs[i], routy=routys[i], name=name, cell_id=dom_data['cell_ids'][domys[i], domxs[i]]) outlets[i].pour_points = [outlets[i]] # ---------------------------------------------------------------- # log.debug(outlets) log.info('Finished with gen_uh_init') log.info('-------------------------------------------------------------\n') return (uh_box, fdr_data, fdr_vatts, dom_data, outlets, config_dict, directories)
def gen_uh_init(config_file): """Initialize RVIC parameter""" # ---------------------------------------------------------------- # # Read Configuration files config_dict = read_config(config_file) # ---------------------------------------------------------------- # # ---------------------------------------------------------------- # # Import optional modules if config_dict['OPTIONS']['REMAP'] and not remap_available: raise ValueError('Problem importing remap module ' 'check to make sure cdo.py is available)') # ---------------------------------------------------------------- # # ---------------------------------------------------------------- # # Setup Directory Structures directories = make_directories(config_dict['OPTIONS']['CASE_DIR'], ['plots', 'logs', 'params', 'inputs']) directories.update(make_directories(config_dict['OPTIONS']['TEMP_DIR'], ['aggregated', 'remapped'])) # ---------------------------------------------------------------- # # ---------------------------------------------------------------- # # copy inputs to $case_dir/inputs and update configuration config_dict = copy_inputs(config_file, directories['inputs']) options = config_dict['OPTIONS'] # ---------------------------------------------------------------- # # ---------------------------------------------------------------- # # Start Logging log = init_logger(directories['logs'], options['LOG_LEVEL'], options['VERBOSE']) for direc in directories: log.info('%s directory is %s', direc, directories[direc]) # ---------------------------------------------------------------- # # ---------------------------------------------------------------- # # Read Pour Points files try: pour_points = pd.read_csv(config_dict['POUR_POINTS']['FILE_NAME'], comment='#') log.info('Opened Pour Points File: ' '{0}'.format(config_dict['POUR_POINTS']['FILE_NAME'])) if not (all(x in pour_points.keys() for x in ['lons', 'lats']) or all(x in pour_points.keys() for x in ['x', 'y'])): raise ValueError('Pour Points File must include ' 'variables (lons, lats) or (x, y)') if 'names' in pour_points: pour_points.fillna(inplace=True, value='unknown') for i, name in enumerate(pour_points.names): pour_points.names[i] = strip_invalid_char(name) pour_points.drop_duplicates(inplace=True) pour_points.dropna() except Exception as e: log.error('Error opening pour points file: ' '{0}'.format(config_dict['POUR_POINTS']['FILE_NAME'])) log.exception(e) raise # ---------------------------------------------------------------- # # ---------------------------------------------------------------- # # Read uh box file uh_file = config_dict['UH_BOX']['FILE_NAME'] uh_header = int(config_dict['UH_BOX']['HEADER_LINES']) uh_box = {} try: uh_box['time'], uh_box['func'] = np.genfromtxt(uh_file, skip_header=uh_header, delimiter=',', unpack=True) log.info('Opened UHbox File: ' '{0}'.format(config_dict['UH_BOX']['FILE_NAME'])) except: log.exception('Error opening uh_box file: ' '{0}'.format(config_dict['POUR_POINTS']['FILE_NAME'])) raise # ---------------------------------------------------------------- # # ---------------------------------------------------------------- # # Read FDR file fdr_file = config_dict['ROUTING']['FILE_NAME'] fdr_var = config_dict['ROUTING']['FLOW_DIRECTION_VAR'] fdr_lat = config_dict['ROUTING']['LATITUDE_VAR'] fdr_lon = config_dict['ROUTING']['LONGITUDE_VAR'] fdr_vel = config_dict['ROUTING']['VELOCITY'] fdr_dif = config_dict['ROUTING']['DIFFUSION'] try: fdr_data, fdr_vatts, _ = read_netcdf(fdr_file) fdr_shape = fdr_data[fdr_var].shape # ---------------------------------------------------------------- # # Check latitude order, flip if necessary. if fdr_data[fdr_lat][-1] > fdr_data[fdr_lat][0]: log.debug('Flow Direction inputs came in upside down, flipping ' 'everything now.') remove_vars = [] for var, data in fdr_data.iteritems(): log.debug('flipping %s', var) if data.ndim >= 1 and var != fdr_lon: fdr_data[var] = np.flipud(data) elif data.ndim == 0: remove_vars.append(var) if remove_vars: for var in remove_vars: del fdr_data[var] # ---------------------------------------------------------------- # # ---------------------------------------------------------------- # # Add velocity and/or diffusion grids if not present yet if not type(fdr_vel) == str: fdr_data['velocity'] = np.zeros(fdr_shape) + fdr_vel config_dict['ROUTING']['VELOCITY'] = 'velocity' log.info('Added velocity grid to fdr_data') if not type(fdr_dif) == str: fdr_data['diffusion'] = np.zeros(fdr_shape) + fdr_dif config_dict['ROUTING']['DIFFUSION'] = 'diffusion' log.info('Added diffusion grid to fdr_data') if ('SOURCE_AREA_VAR' not in config_dict['ROUTING'] or config_dict['ROUTING']['SOURCE_AREA_VAR'] not in fdr_data): log.warning('Upstream `SOURCE_AREA` was not provided, output ' 'source area will be zero.') config_dict['ROUTING']['SOURCE_AREA_VAR'] = 'src_area' fdr_data[config_dict['ROUTING']['SOURCE_AREA_VAR']] = \ np.zeros(fdr_shape) # ---------------------------------------------------------------- # # ---------------------------------------------------------------- # fdr_data['resolution'] = np.abs(fdr_data[fdr_lon][1] - fdr_data[fdr_lon][0]) check_ncvars(config_dict['ROUTING'], fdr_data.keys()) # ---------------------------------------------------------------- # log.info('Opened FDR File: {0}'.format(fdr_file)) except: log.exception('Error opening FDR file') raise # ---------------------------------------------------------------- # # ---------------------------------------------------------------- # # ---------------------------------------------------------------- # # Read domain file domain = config_dict['DOMAIN'] dom_data, _, _ = read_domain(domain) log.info('Opened Domain File: ' '{0}'.format(domain['FILE_NAME'])) # ---------------------------------------------------------------- # # ---------------------------------------------------------------- # # If remap is False, domain coordinates needs to be in the fdr coordinates # We can move the unit hydrographs to the domain grid later if options['AGGREGATE'] and not options['REMAP']: log.error('RVIC parameter generation requires REMAP option to be True' ' if AGGREGATE is True') raise ValueError('Invalid option') # ---------------------------------------------------------------- # # ---------------------------------------------------------------- # # Group pour points (if aggregate) if options['AGGREGATE']: outlets = make_agg_pairs(pour_points, dom_data, fdr_data, config_dict) log.info('Finished making agg pairs of ' 'pour points and outlet grid cells') else: outlets = {} if all(x in pour_points.keys() for x in ['x', 'y', 'lons', 'lats']): lats = pour_points['lats'].values lons = pour_points['lons'].values routys = pour_points['y'].values routxs = pour_points['x'].values elif all(x in pour_points.keys() for x in ['x', 'y']): # use x and y (assume from routing inputs grid) # find lons and lats from xs and ys routys = pour_points['y'].values routxs = pour_points['x'].values lats = fdr_data[fdr_lat][routys] lons = fdr_data[fdr_lon][routxs] else: # use lons and lats to find xs and ys lats = pour_points['lats'].values lons = pour_points['lons'].values # find x and y on routing grid routys, routxs = latlon2yx(plats=lats, plons=lons, glats=fdr_data[fdr_lat], glons=fdr_data[fdr_lon]) if options['SEARCH_FOR_CHANNEL']: routys, routxs = search_for_channel( fdr_data[config_dict['ROUTING']['SOURCE_AREA_VAR']], routys, routxs, tol=10, search=2) # update lats and lons lats = fdr_data[fdr_lat][routys] lons = fdr_data[fdr_lon][routxs] # Find location on domain grid domys, domxs = latlon2yx(plats=lats, plons=lons, glats=dom_data[domain['LATITUDE_VAR']], glons=dom_data[domain['LONGITUDE_VAR']]) for i in xrange(len(lats)): if 'names' in pour_points.keys(): name = pour_points['names'].values[i] name = name.replace("'", '').replace(" ", "_") else: # fill name filed with p-outlet_num name = 'p-{0}'.format(i) outlets[i] = Point(lat=lats[i], lon=lons[i], domx=domxs[i], domy=domys[i], routx=routxs[i], routy=routys[i], name=name, cell_id=dom_data['cell_ids'][domys[i], domxs[i]]) outlets[i].pour_points = [outlets[i]] # ---------------------------------------------------------------- # log.debug(outlets) log.info('Finished with gen_uh_init') log.info('-------------------------------------------------------------\n') return (uh_box, fdr_data, fdr_vatts, dom_data, outlets, config_dict, directories)