diff --git a/src/troute-network/troute/HYFeaturesNetwork.py b/src/troute-network/troute/HYFeaturesNetwork.py index 1883e3ba5..cd1791761 100644 --- a/src/troute-network/troute/HYFeaturesNetwork.py +++ b/src/troute-network/troute/HYFeaturesNetwork.py @@ -9,6 +9,9 @@ from itertools import chain import geopandas as gpd from pathlib import Path +import math +import troute.hyfeature_preprocess as hyfeature_prep +from datetime import datetime, timedelta __verbose__ = False __showtiming__ = False @@ -26,24 +29,6 @@ def numeric_id(flowpath): flowpath['toid'] = int(toid) return flowpath -def read_ngen_waterbody_df(parm_file, lake_index_field="wb-id", lake_id_mask=None): - """ - Reads lake.json file and prepares a dataframe, filtered - to the relevant reservoirs, to provide the parameters - for level-pool reservoir computation. - """ - def node_key_func(x): - return int(x[3:]) - df = pd.read_json(parm_file, orient="index") - - df.index = df.index.map(node_key_func) - df.index.name = lake_index_field - #df = df.set_index(lake_index_field, append=True).reset_index(level=0) - #df.rename(columns={'level_0':'wb-id'}, inplace=True) - if lake_id_mask: - df = df.loc[lake_id_mask] - return df - def read_qlats(forcing_parameters, segment_index, nexus_to_downstream_flowpath_dict): # STEP 5: Read (or set) QLateral Inputs if __showtiming__: @@ -92,6 +77,9 @@ def read_qlats(forcing_parameters, segment_index, nexus_to_downstream_flowpath_d qlat_df = pd.concat( (nexuses_flows_df.loc[int(k)].rename(index={int(k):v}) for k,v in nexus_to_downstream_flowpath_dict.items() ), axis=1 ).T + #qlat_df = pd.concat( (nexuses_flows_df.loc[int(k)].rename(v) + # for k,v in nexus_to_downstream_flowpath_dict.items() ), axis=1 + # ).T # The segment_index has the full network set of segments/flowpaths. # Whereas the set of flowpaths that are downstream of nexuses is a @@ -99,22 +87,19 @@ def read_qlats(forcing_parameters, segment_index, nexus_to_downstream_flowpath_d # that are not accounted for in the set of flowpaths downstream of # nexuses need to be added to the qlateral dataframe and padded with # zeros. - - #tq0 = time.time() all_df = pd.DataFrame( np.zeros( (len(segment_index), len(qlat_df.columns)) ), index=segment_index, columns=qlat_df.columns ) - all_df.loc[ qlat_df.index ] = qlat_df - - #tq1 = time.time() - #print("Time to fill null qlats: {}".format(tq1-tq0)) - # Sort qlats qlat_df = all_df.sort_index() # Set new nts based upon total nexus inputs nts = (qlat_df.shape[1]) * qts_subdivisions - max_col = 1 + nts // qts_subdivisions + + #dt = 300 # [sec] + #dt_qlat = 3600 # [sec] + #nts = 24 # steps + #max_col = math.ceil(nts*dt/dt_qlat) if len(qlat_df.columns) > max_col: qlat_df.drop(qlat_df.columns[max_col:], axis=1, inplace=True) @@ -178,8 +163,21 @@ class HYFeaturesNetwork(AbstractNetwork): """ """ - __slots__ = ["_flowpath_dict"] - def __init__(self, supernetwork_parameters, waterbody_parameters=None, restart_parameters=None, forcing_parameters=None, verbose=False, showtiming=False): + __slots__ = ["_flowpath_dict", + "segment_index", + "waterbody_type_specified", + "diffusive_network_data", + "topobathy_df", + "refactored_diffusive_domain", + "refactored_reaches", + "unrefactored_topobathy_df"] + def __init__(self, + supernetwork_parameters, + waterbody_parameters=None, + restart_parameters=None, + forcing_parameters=None, + verbose=False, + showtiming=False): """ """ @@ -190,156 +188,97 @@ def __init__(self, supernetwork_parameters, waterbody_parameters=None, restart_p print("creating supernetwork connections set") if __showtiming__: start_time = time.time() - geo_file_path = supernetwork_parameters["geo_file_path"] - cols = supernetwork_parameters["columns"] - terminal_code = supernetwork_parameters.get("terminal_code", 0) - break_network_at_waterbodies = supernetwork_parameters.get( - "break_network_at_waterbodies", False - ) - break_network_at_gages = supernetwork_parameters.get( - "break_network_at_gages", False - ) - break_points = {"break_network_at_waterbodies": break_network_at_waterbodies, - "break_network_at_gages": break_network_at_gages} - file_type = Path(geo_file_path).suffix - if( file_type == '.gpkg' ): - self._dataframe = read_geopkg(geo_file_path) - #df["NHDWaterbodyComID"].fillna(-9999, inplace=True) - #df["NHDWaterbodyComID"] = df["NHDWaterbodyComID"].astype("int64") - elif( file_type == '.json') : - #df = pd.read_json(geo_file_path, orient="index") - #print(df) - #raise( "BREAK" ) - edge_list = supernetwork_parameters['flowpath_edge_list'] - # attribute_file_path = supernetwork_parameters['flowpath_attributes'] - self._dataframe = read_json(geo_file_path, edge_list) - #df["NHDWaterbodyComID"].fillna(-9999, inplace=True) - #df["NHDWaterbodyComID"] = df["NHDWaterbodyComID"].astype("int64") - else: - raise RuntimeError("Unsupported file type: {}".format(file_type)) - - #Don't need the string prefix anymore, drop it - mask = ~ self._dataframe['toid'].str.startswith("tnex") - self._dataframe = self._dataframe.apply(numeric_id, axis=1) - #make the flowpath linkage, ignore the terminal nexus - self._flowpath_dict = dict(zip(self._dataframe.loc[mask].toid, self._dataframe.loc[mask].id)) - self._waterbody_types_df = pd.DataFrame() - self._waterbody_df = pd.DataFrame() - #FIXME the base class constructor is finiky - #as it requires the _dataframe, then sets some - #initial default properties...which, at the moment - #are used by the subclass constructor. - #So it needs to be called at just the right spot... - super().__init__(cols, terminal_code, break_points) - #FIXME once again, order here can hurt....to hack `alt` in, either need to - #put it as a column in the config, or do this AFTER the super constructor - #otherwise the alt column gets sliced out... - self._dataframe['alt'] = 1.0 #FIXME get the right value for this... - #Load waterbody/reservoir info - #For ngen HYFeatures, the reservoirs to be simulated - #are determined by the lake.json file - #we limit waterbody_connections to only the flowpaths - #that coincide with a lake listed in this file - #see `waterbody_connections` - - if waterbody_parameters: - #FIXME later, DO ALL LAKE PARAMS BETTER - levelpool_params = waterbody_parameters.get('level_pool', None) - if not levelpool_params: - #FIXME should not be a hard requirement - raise(RuntimeError("No supplied levelpool parameters in routing config")) - - lake_id = levelpool_params.get("level_pool_waterbody_id", "wb-id") - self._waterbody_df = read_ngen_waterbody_df( - levelpool_params["level_pool_waterbody_parameter_file_path"], - lake_id, - #self.waterbody_connections.values() - ) - - # Remove duplicate lake_ids and rows - self._waterbody_df = ( - self._waterbody_df.reset_index() - .drop_duplicates(subset=lake_id) - .set_index(lake_id) - ) - self._waterbody_df["qd0"] = 0.0 - self._waterbody_df["h0"] = -1e9 - - hybrid_params = waterbody_parameters.get('hybrid_and_rfc', None) - try: #FIXME for HYFeatures/ngen this will likely be a lot different... - self._waterbody_types_df = nhd_io.read_reservoir_parameter_file( - hybrid_params["reservoir_parameter_file"], - lake_id, - #self.waterbody_connections.values(), - ) - # Remove duplicate lake_ids and rows - self._waterbody_types_df = ( - self._waterbody_types_df.reset_index() - .drop_duplicates(subset=lake_id) - .set_index(lake_id) - ) - except: - self._waterbody_types_df = pd.DataFrame(index=self._waterbody_df.index) - self._waterbody_types_df['reservoir_type'] = 1 - #FIXME any reservoir operations requires some type - #So make this default to 1 (levelpool) - #At this point, need to adjust some waterbody/channel parameters based on lakes/reservoirs - #HACK for bad hydrofabric - def make_list(s): - if isinstance(s, list): - return s - else: - return [s] - - self._waterbody_df['member_wbs'] = self._waterbody_df['member_wbs'].apply(make_list) - self._waterbody_df['partial_length_percent'] = self._waterbody_df['partial_length_percent'].apply(make_list) - adjust = [ zip(x, y) - for x, y in - zip(self._waterbody_df['member_wbs'], self._waterbody_df['partial_length_percent']) - ] - #adjust is a generator of a list of list of tuples...use chain to flatten - for wb, percent in chain.from_iterable(adjust): - #print(wb, percent) - #FIXME not sure why some of these are 100%, if that is the case - #shouldn't they just not be in the topology??? - wb = node_key_func_wb(wb) - #Need to adjust waterbodys/channels that interact with this waterbody - #Hack for wonky hydrofabric - if percent != 'NA': - self._dataframe.loc[wb, 'dx'] = self._dataframe.loc[wb, 'dx'] - self._dataframe.loc[wb, 'dx']*float(percent) - #print(self._dataframe.loc[wb, 'dx']) + #------------------------------------------------ + # Preprocess network attributes + #------------------------------------------------ + (self._dataframe, + self._flowpath_dict, + self._waterbody_types_df, + self._waterbody_df, + self.waterbody_type_specified, + cols, + terminal_code, + break_points, + ) = hyfeature_prep.build_hyfeature_network( + supernetwork_parameters, + waterbody_parameters + ) + + # called to mainly initialize _waterbody_connections, _connections, _independent_networks, + # _reverse_network, _reaches_by_tw + super().__init__(cols, terminal_code, break_points) + if __verbose__: print("supernetwork connections set complete") if __showtiming__: print("... in %s seconds." % (time.time() - start_time)) - #TODO/FIXME reservoir restart load - #TODO/FIXME channel restart load - # STEP 4: Handle Channel Initial States + + + + # list of all segments in the domain (MC + diffusive) + self.segment_index = self._dataframe.index + #if self.diffusive_network_data: + # for tw in self.diffusive_network_data: + # self.segment_index = self.segment_index.append( + # pd.Index(self.diffusive_network_data[tw]['mainstem_segs']) + # ) + + #------------------------------------------------ + # Handle Channel Initial States + #------------------------------------------------ + if __verbose__: + print("setting waterbody and channel initial states ...") if __showtiming__: start_time = time.time() + + (#self._waterbody_df, + self._q0, + self._t0,) = hyfeature_prep.hyfeature_initial_warmstate_preprocess( + #break_network_at_waterbodies, + restart_parameters, + #data_assimilation_parameters, + self.segment_index, + #self._waterbody_df, + #self.link_lake_crosswalk, + ) + if __verbose__: - print("setting channel initial states ...") - #Get channel restarts - channel_restart_file = restart_parameters.get("channel_restart_file", None) - - if channel_restart_file: - self._q0 = nhd_io.get_channel_restart_from_csv(channel_restart_file) - self._q0 = self._q0[self._q0.index.isin(self._dataframe.index)] - # TODO is this the same??? - #self._q0 = self._q0.loc[self._dataframe.index] - #TODO/FIXME channel restart t0? self._t0 = ??? - if __verbose__: - print("channel initial states complete") + print("waterbody and channel initial states complete") if __showtiming__: - print("... in %s seconds." % (time.time() - start_time)) + print("... in %s seconds." % (time.time() - start_time)) + start_time = time.time() + + # Create empty dataframe for coastal_boundary_depth_df. This way we can check if + # it exists, and only read in SCHISM data during 'assemble_forcings' if it doesn't + self._coastal_boundary_depth_df = pd.DataFrame() - self._qlateral = read_qlats(forcing_parameters, self._dataframe.index, self.downstream_flowpath_dict) + + def assemble_forcings(self, run, forcing_parameters, hybrid_parameters, cpu_pool): + """ + Assembles model forcings for hydrological lateral inflows and coastal boundary + depths (hybrid simulations). Run this function after network initialization + and after any iteration loop in main. + """ + (self._qlateral, + self._coastal_boundary_depth_df + ) = hyfeature_prep.hyfeature_forcing( + run, + forcing_parameters, + hybrid_parameters, + self._flowpath_dict, + self.segment_index, + cpu_pool, + self._t0, + self._coastal_boundary_depth_df, + ) + #Mask out all non-simulated waterbodies self._dataframe['waterbody'] = self.waterbody_null + #This also remaps the initial NHDComID identity to the HY_Features Waterbody ID for the reservoir... self._dataframe.loc[self._waterbody_df.index, 'waterbody'] = self._waterbody_df.index.name - + #FIXME should waterbody_df and param_df overlap IDS? Doesn't seem like it should... #self._dataframe.drop(self._waterbody_df.index, axis=0, inplace=True) #For now, doing it in property waterbody_connections... @@ -358,7 +297,76 @@ def extract_waterbody_connections(rows, target_col, waterbody_null=-9999): return ( rows.loc[rows[target_col] != waterbody_null, target_col].astype("int").to_dict() ) - + + + def create_routing_network(self, + conn, + param_df, + wbody_conn, gages, + preprocessing_parameters, + compute_parameters, + waterbody_parameters + ): + + #-------------------------------------------------------------------------- + # Creation of routing network data objects. Logical ordering of lower-level + # function calls that build individual network data objects. + #-------------------------------------------------------------------------- + (self._independent_networks, + self._reaches_by_tw, + self._reverse_network, + self.diffusive_network_data, + self.topobathy_df, + self.refactored_diffusive_domain, + self.refactored_reaches, + self.unrefactored_topobathy_df + ) = hyfeature_prep.hyfeature_hybrid_routing_preprocess( + conn, + param_df, + wbody_conn, + gages, + preprocessing_parameters, + compute_parameters, + waterbody_parameters, + ) + return (self._independent_networks, + self._reaches_by_tw, + self._reverse_network, + self.diffusive_network_data, + self.topobathy_df, + self.refactored_diffusive_domain, + self.refactored_reaches, + self.unrefactored_topobathy_df) + + def new_q0(self, run_results): + """ + Prepare a new q0 dataframe with initial flow and depth to act as + a warmstate for the next simulation chunk. + """ + self._q0 = pd.concat( + [ + pd.DataFrame( + r[1][:, [-3, -3, -1]], index=r[0], columns=["qu0", "qd0", "h0"] + ) + for r in run_results + ], + copy=False, + ) + return self._q0 + + def update_waterbody_water_elevation(self): + """ + Update the starting water_elevation of each lake/reservoir + with flow and depth values from q0 + """ + self._waterbody_df.update(self._q0) + + def new_t0(self, dt, nts): + """ + Update t0 value for next loop iteration + """ + self._t0 += timedelta(seconds = dt * nts) + @property def downstream_flowpath_dict(self): return self._flowpath_dict @@ -407,4 +415,5 @@ def gages(self): @property def waterbody_null(self): - return np.nan#pd.NA + return np.nan #pd.NA + diff --git a/src/troute-network/troute/NHDNetwork.py b/src/troute-network/troute/NHDNetwork.py index 61101a610..b72996a71 100644 --- a/src/troute-network/troute/NHDNetwork.py +++ b/src/troute-network/troute/NHDNetwork.py @@ -196,7 +196,7 @@ def __init__( print("setting waterbody and channel initial states ...") if __showtiming__: start_time = time.time() - + (self._waterbody_df, self._q0, self._t0,) = nhd_prep.nhd_initial_warmstate_preprocess( @@ -237,7 +237,7 @@ def assemble_forcings(self, run, forcing_parameters, hybrid_parameters, cpu_pool self._coastal_boundary_depth_df, ) - def new_nhd_q0(self, run_results): + def new_q0(self, run_results): """ Prepare a new q0 dataframe with initial flow and depth to act as a warmstate for the next simulation chunk. diff --git a/src/troute-network/troute/hyfeature_network_utilities.py b/src/troute-network/troute/hyfeature_network_utilities.py new file mode 100644 index 000000000..a3c603d8c --- /dev/null +++ b/src/troute-network/troute/hyfeature_network_utilities.py @@ -0,0 +1,233 @@ +import json +import pathlib +from functools import partial +from datetime import datetime, timedelta +import logging + +import pandas as pd +import numpy as np +import netCDF4 +from joblib import delayed, Parallel + +import troute.nhd_io as nhd_io + + +LOG = logging.getLogger('') + + +def build_forcing_sets( + forcing_parameters, + t0 +): + + run_sets = forcing_parameters.get("qlat_forcing_sets", None) + nexus_input_folder = forcing_parameters.get("nexus_input_folder", None) + nts = forcing_parameters.get("nts", None) + max_loop_size = forcing_parameters.get("max_loop_size", 12) + dt = forcing_parameters.get("dt", None) + + try: + nexus_input_folder = pathlib.Path(nexus_input_folder) + assert nexus_input_folder.is_dir() == True + except TypeError: + raise TypeError("Aborting simulation because no nexus_input_folder is specified in the forcing_parameters section of the .yaml control file.") from None + except AssertionError: + raise AssertionError("Aborting simulation because the nexus_input_folder:", qlat_input_folder,"does not exist. Please check the the nexus_input_folder variable is correctly entered in the .yaml control file") from None + + forcing_glob_filter = forcing_parameters.get("nexus_file_pattern_filter", "*.NEXOUT") + + # TODO: Throw errors if insufficient input data are available + if run_sets: + #FIXME: Change it for hyfeature + ''' + # append final_timestamp variable to each set_list + qlat_input_folder = pathlib.Path(qlat_input_folder) + for (s, _) in enumerate(run_sets): + final_chrtout = qlat_input_folder.joinpath(run_sets[s]['qlat_files' + ][-1]) + final_timestamp_str = nhd_io.get_param_str(final_chrtout, + 'model_output_valid_time') + run_sets[s]['final_timestamp'] = \ + datetime.strptime(final_timestamp_str, '%Y-%m-%d_%H:%M:%S') + ''' + elif nexus_input_folder: + # Construct run_set dictionary from user-specified parameters + + # get the first and seconded files from an ordered list of all forcing files + nexus_input_folder = pathlib.Path(nexus_input_folder) + all_files = sorted(nexus_input_folder.glob(forcing_glob_filter)) + first_file = all_files[0] + second_file = all_files[1] + + # Deduce the timeinterval of the forcing data from the output timestamps of the first + # two ordered CHRTOUT files + df = pd.read_csv(first_file) + t1_str = pd.to_datetime(df.columns[1]).strftime("%Y-%m-%d_%H:%M:%S") + t1 = datetime.strptime(t1_str,"%Y-%m-%d_%H:%M:%S") + df = pd.read_csv(second_file) + t2_str = pd.to_datetime(df.columns[1]).strftime("%Y-%m-%d_%H:%M:%S") + t2 = datetime.strptime(t2_str,"%Y-%m-%d_%H:%M:%S") + dt_qlat_timedelta = t2 - t1 + dt_qlat = dt_qlat_timedelta.seconds + + # determine qts_subdivisions + qts_subdivisions = dt_qlat / dt + if dt_qlat % dt == 0: + qts_subdivisions = dt_qlat / dt + # make sure that qts_subdivisions = dt_qlat / dt + forcing_parameters['qts_subdivisions']= qts_subdivisions + + # the number of files required for the simulation + nfiles = int(np.ceil(nts / qts_subdivisions)) + + # list of forcing file datetimes + #datetime_list = [t0 + dt_qlat_timedelta * (n + 1) for n in + # range(nfiles)] + # ** Correction ** Because qlat file at time t is constantly applied throughout [t, t+1], + # ** n + 1 should be replaced by n + datetime_list = [t0 + dt_qlat_timedelta * (n) for n in + range(nfiles)] + datetime_list_str = [datetime.strftime(d, '%Y%m%d%H%M') for d in + datetime_list] + + # list of forcing files + forcing_filename_list = [d_str + "NEXOUT.csv" for d_str in + datetime_list_str] + + # check that all forcing files exist + for f in forcing_filename_list: + try: + J = pathlib.Path(nexus_input_folder.joinpath(f)) + assert J.is_file() == True + except AssertionError: + raise AssertionError("Aborting simulation because forcing file", J, "cannot be not found.") from None + + # build run sets list + run_sets = [] + k = 0 + j = 0 + nts_accum = 0 + nts_last = 0 + while k < len(forcing_filename_list): + run_sets.append({}) + + if k + max_loop_size < len(forcing_filename_list): + run_sets[j]['nexus_files'] = forcing_filename_list[k:k + + max_loop_size] + else: + run_sets[j]['nexus_files'] = forcing_filename_list[k:] + + nts_accum += len(run_sets[j]['nexus_files']) * qts_subdivisions + if nts_accum <= nts: + run_sets[j]['nts'] = int(len(run_sets[j]['nexus_files']) + * qts_subdivisions) + else: + run_sets[j]['nts'] = int(nts - nts_last) + + final_nexout = nexus_input_folder.joinpath(run_sets[j]['nexus_files' + ][-1]) + #final_timestamp_str = nhd_io.get_param_str(final_nexout, + # 'model_output_valid_time') + df = pd.read_csv(final_nexout) + final_timestamp_str = pd.to_datetime(df.columns[1]).strftime("%Y-%m-%d_%H:%M:%S") + + run_sets[j]['final_timestamp'] = \ + datetime.strptime(final_timestamp_str, '%Y-%m-%d_%H:%M:%S') + + nts_last = nts_accum + k += max_loop_size + j += 1 + + return run_sets + +def build_qlateral_array( + run, + cpu_pool, + nexus_to_upstream_flowpath_dict, + segment_index=pd.Index([]), + ts_iterator=None, + file_run_size=None, +): + # TODO: set default/optional arguments + qts_subdivisions = run.get("qts_subdivisions", 1) + nts = run.get("nts", 1) + nexus_input_folder = run.get("nexus_input_folder", None) + qlat_input_file = run.get("qlat_input_file", None) + + if nexus_input_folder: + nexus_input_folder = pathlib.Path(nexus_input_folder) + if "nexus_files" in run: + nexus_files = run.get("nexus_files") + nexus_files = [nexus_input_folder.joinpath(f) for f in nexus_files] + elif "nexus_file_pattern_filter" in run: + nexus_file_pattern_filter = run.get( + "nexus_file_pattern_filter", "*NEXOUT*" + ) + nexus_files = sorted(nexus_input_folder.glob(nexus_file_pattern_filter)) + + qlat_file_index_col = run.get( + "qlat_file_index_col", "feature_id" + ) + qlat_file_value_col = run.get("qlat_file_value_col", "q_lateral") + gw_bucket_col = run.get("qlat_file_gw_bucket_flux_col","qBucket") + terrain_ro_col = run.get("qlat_file_terrain_runoff_col","qSfcLatRunoff") + + + #nexuses_lateralflows_df = nhd_io.get_ql_from_csv(nexus_files[0]) + ''' + # Parallel reading of qlateral data from CHRTOUT + with Parallel(n_jobs=cpu_pool) as parallel: + jobs = [] + for f in qlat_files: + jobs.append( + #delayed(nhd_io.get_ql_from_chrtout) + #(f, qlat_file_value_col, gw_bucket_col, terrain_ro_col) + delayed(nhd_io.get_ql_from_csv) + (f) + ) + ql_list = parallel(jobs) + + # get feature_id from a single CHRTOUT file + with netCDF4.Dataset(qlat_files[0]) as ds: + idx = ds.variables[qlat_file_index_col][:].filled() + + # package data into a DataFrame + qlats_df = pd.DataFrame( + np.stack(ql_list).T, + index = idx, + columns = range(len(qlat_files)) + ) + ''' + dfs=[] + for f in nexus_files: + df = pd.read_csv(f).set_index(['feature_id']) + dfs.append(df) + # lateral flows [m^3/s] are stored at NEXUS points with NEXUS ids + nexuses_lateralflows_df = pd.concat(dfs, axis=1) + + # Take flowpath ids entering NEXUS and replace NEXUS ids by the upstream flowpath ids + qlats_df = pd.concat( (nexuses_lateralflows_df.loc[int(k)].rename(v) + for k,v in nexus_to_upstream_flowpath_dict.items() ), axis=1 + ).T + qlats_df.columns=range(len(nexus_files)) + qlats_df = qlats_df[qlats_df.index.isin(segment_index)] + elif qlat_input_file: + qlats_df = nhd_io.get_ql_from_csv(qlat_input_file) + else: + qlat_const = run.get("qlat_const", 0) + qlats_df = pd.DataFrame( + qlat_const, + index=segment_index, + columns=range(nts // qts_subdivisions), + dtype="float32", + ) + + # TODO: Make a more sophisticated date-based filter + max_col = 1 + nts // qts_subdivisions + if len(qlats_df.columns) > max_col: + qlats_df.drop(qlats_df.columns[max_col:], axis=1, inplace=True) + + if not segment_index.empty: + qlats_df = qlats_df[qlats_df.index.isin(segment_index)] + + return qlats_df \ No newline at end of file diff --git a/src/troute-network/troute/hyfeature_preprocess.py b/src/troute-network/troute/hyfeature_preprocess.py new file mode 100644 index 000000000..446f356df --- /dev/null +++ b/src/troute-network/troute/hyfeature_preprocess.py @@ -0,0 +1,806 @@ +import time +import pathlib +import logging +from datetime import datetime +from collections import defaultdict +from pathlib import Path +import os + +import pandas as pd +import numpy as np +import xarray as xr +import geopandas as gpd + +import troute.nhd_network_utilities_v02 as nnu +import troute.nhd_network as nhd_network +import troute.nhd_io as nhd_io +from troute.nhd_network import reverse_dict +import troute.HYFeaturesNetwork as hyf_network +import troute.hyfeature_network_utilities as hnu + +LOG = logging.getLogger('') + +def build_hyfeature_network(supernetwork_parameters, + waterbody_parameters, +): + + geo_file_path = supernetwork_parameters["geo_file_path"] + cols = supernetwork_parameters["columns"] + terminal_code = supernetwork_parameters.get("terminal_code", 0) + + break_network_at_waterbodies = supernetwork_parameters.get("break_network_at_waterbodies", False) + break_network_at_gages = supernetwork_parameters.get("break_network_at_gages", False) + break_points = {"break_network_at_waterbodies": break_network_at_waterbodies, + "break_network_at_gages": break_network_at_gages} + + file_type = Path(geo_file_path).suffix + if( file_type == '.gpkg' ): + dataframe = hyf_network.read_geopkg(geo_file_path) + elif( file_type == '.json') : + edge_list = supernetwork_parameters['flowpath_edge_list'] + dataframe = hyf_network.read_json(geo_file_path, edge_list) + else: + raise RuntimeError("Unsupported file type: {}".format(file_type)) + + # Don't need the string prefix anymore, drop it + mask = ~ dataframe['toid'].str.startswith("tnex") + dataframe = dataframe.apply(hyf_network.numeric_id, axis=1) + + # make the flowpath linkage, ignore the terminal nexus + flowpath_dict = dict(zip(dataframe.loc[mask].toid, dataframe.loc[mask].id)) + waterbody_types_df = pd.DataFrame() + waterbody_df = pd.DataFrame() + waterbody_type_specified = False + + # ********** need to be included in flowpath_attributes ************* + # FIXME once again, order here can hurt....to hack `alt` in, either need to + # put it as a column in the config, or do this AFTER the super constructor + # otherwise the alt column gets sliced out... + dataframe['alt'] = 1.0 #FIXME get the right value for this... + + #Load waterbody/reservoir info + #For ngen HYFeatures, the reservoirs to be simulated + #are determined by the lake.json file + #we limit waterbody_connections to only the flowpaths + #that coincide with a lake listed in this file + #see `waterbody_connections` + if waterbody_parameters: + # FIXME later, DO ALL LAKE PARAMS BETTER + levelpool_params = waterbody_parameters.get('level_pool', None) + if not levelpool_params: + # FIXME should not be a hard requirement + raise(RuntimeError("No supplied levelpool parameters in routing config")) + + lake_id = levelpool_params.get("level_pool_waterbody_id", "wb-id") + waterbody_df = read_ngen_waterbody_df( + levelpool_params["level_pool_waterbody_parameter_file_path"], + lake_id, + #self.waterbody_connections.values() + ) + + # Remove duplicate lake_ids and rows + waterbody_df = ( + waterbody_df.reset_index() + .drop_duplicates(subset=lake_id) + .set_index(lake_id) + ) + waterbody_df["qd0"] = 0.0 + waterbody_df["h0"] = -1e9 + + try: + waterbody_types_df = read_ngen_waterbody_type_df( + levelpool_params["reservoir_parameter_file"], + lake_id, + #self.waterbody_connections.values(), + ) + # Remove duplicate lake_ids and rows + waterbody_types_df =( + waterbody_types_df.reset_index() + .drop_duplicates(subset=lake_id) + .set_index(lake_id) + ) + + except ValueError: + #FIXME any reservoir operations requires some type + #So make this default to 1 (levelpool) + waterbody_types_df = pd.DataFrame(index=waterbody_df.index) + waterbody_types_df['reservoir_type'] = 1 + + return (dataframe, + flowpath_dict, + waterbody_types_df, + waterbody_df, + waterbody_type_specified, + cols, + terminal_code, + break_points, + ) + +def hyfeature_hybrid_routing_preprocess( + connections, + param_df, + wbody_conn, + gages, + preprocessing_parameters, + compute_parameters, + waterbody_parameters, +): + ''' + Creation of routing network data objects. Logical ordering of lower-level + function calls that build individual network data objects. + + Arguments + --------- + supernetwork_parameters (dict): user input data re network extent + waterbody_parameters (dict): user input data re waterbodies + preprocessing_parameters (dict): user input data re preprocessing + compute_parameters (dict): user input data re compute configuration + data_assimilation_parameters (dict): user input data re data assimilation + + Returns + ------- + connections (dict of int: [int]): {segment id: [downsteram adjacent segment ids]} + param_df (DataFrame): Hydraulic geometry and roughness parameters, by segment + wbody_conn (dict of int: int): {segment id: associated lake id} + waterbodies_df (DataFrame): Waterbody (reservoir) parameters + waterbody_types_df (DataFrame): Waterbody type codes (1 - levelpool, 2 - USGS, 3 - USACE, 4 - RFC) + break_network_at_waterbodies (bool): If True, waterbodies occpy reaches of their own + waterbody_type_specified (bool): If True, more than just levelpool waterbodies exist + link_lake_crosswalk (dict of int: int): {lake id: outlet segment id} + independent_networks (dict of int: {int: [int]}): {tailwater id: {segment id: [upstream adjacent segment ids]}} + reaches_bytw (dict of int: [[int]]): {tailwater id: list or reach lists} + rconn (dict of int: [int]): {segment id: [upstream adjacent segment ids]} + pd.DataFrame.from_dict(gages) (DataFrame): Gage ids and corresponding segment ids at which they are located + diffusive_network_data (dict or None): Network data objects for diffusive domain + topobathy_df (DataFrame): Natural cross section data for diffusive domain + + Notes + ----- + - waterbody_type_specified is likely an excessive return and can be removed and inferred from the + contents of waterbody_types_df + - The values of the link_lake_crosswalk dictionary are the downstream-most segments within + the waterbody extent to which waterbody data are written. They are NOT the first segments + downsteram of the waterbody + ''' + + #============================================================================ + # Establish diffusive domain for MC/diffusive hybrid simulations + + hybrid_params = compute_parameters.get("hybrid_parameters", False) + if hybrid_params: + # switch parameters + # if run_hybrid = False, run MC only + # if run_hybrid = True, if use_topobathy = False, run MC+diffusive on RouteLink.nc + # " " " , if use_topobathy = True, if run_refactored_network = False, run MC+diffusive on original hydrofabric + # " " " , if use_topobathy = True, if run_refactored_network = True, run MC+diffusive on refactored hydrofabric + run_hybrid = hybrid_params.get('run_hybrid_routing', False) + use_topobathy = hybrid_params.get('use_natl_xsections', False) + run_refactored = hybrid_params.get('run_refactored_network', False) + + # file path parameters of non-refactored hydrofabric defined by RouteLink.nc + domain_file = hybrid_params.get("diffusive_domain", None) + topobathy_file = hybrid_params.get("topobathy_domain", None) + + # file path parameters of refactored hydrofabric for diffusive wave channel routing + refactored_domain_file = hybrid_params.get("refactored_domain", None) + refactored_topobathy_file = hybrid_params.get("refactored_topobathy_domain", None) + #------------------------------------------------------------------------- + # for non-refactored hydofabric defined by RouteLink.nc + # TODO: By default, make diffusive available for both non-refactored and refactored hydrofabric for now. Place a switch in the future. + if run_hybrid and domain_file: + + LOG.info('reading diffusive domain extent for MC/Diffusive hybrid simulation') + + # read diffusive domain dictionary from yaml or json + diffusive_domain = nhd_io.read_diffusive_domain(domain_file) + + if use_topobathy and topobathy_file: + + LOG.debug('Natural cross section data on original hydrofabric are provided.') + + # read topobathy domain netcdf file, set index to 'comid' + # TODO: replace 'link' with a user-specified indexing variable name. + # ... if for whatever reason there is not a `link` variable in the + # ... dataframe returned from read_netcdf, then the code would break here. + topobathy_df = (nhd_io.read_netcdf(topobathy_file).set_index('link')) + + # TODO: Request GID make comID variable an integer in their product, so + # we do not need to change variable types, here. + topobathy_df.index = topobathy_df.index.astype(int) + + else: + topobathy_df = pd.DataFrame() + LOG.debug('No natural cross section topobathy data provided. Hybrid simualtion will run on compound trapezoidal geometry.') + + # initialize a dictionary to hold network data for each of the diffusive domains + diffusive_network_data = {} + + else: + diffusive_domain = None + diffusive_network_data = None + topobathy_df = pd.DataFrame() + LOG.info('No diffusive domain file specified in configuration file. This is an MC-only simulation') + unrefactored_topobathy_df = pd.DataFrame() + #------------------------------------------------------------------------- + # for refactored hydofabric + if run_hybrid and run_refactored and refactored_domain_file: + + LOG.info('reading refactored diffusive domain extent for MC/Diffusive hybrid simulation') + + # read diffusive domain dictionary from yaml or json + refactored_diffusive_domain = nhd_io.read_diffusive_domain(refactored_domain_file) + + if use_topobathy and refactored_topobathy_file: + + LOG.debug('Natural cross section data of refactored hydrofabric are provided.') + + # read topobathy domain netcdf file, set index to 'comid' + # TODO: replace 'link' with a user-specified indexing variable name. + # ... if for whatever reason there is not a `link` variable in the + # ... dataframe returned from read_netcdf, then the code would break here. + topobathy_df = (nhd_io.read_netcdf(refactored_topobathy_file).set_index('link')) + + # unrefactored_topobaty_data is passed to diffusive kernel to provide thalweg elevation of unrefactored topobathy + # for crosswalking water elevations between non-refactored and refactored hydrofabrics. + unrefactored_topobathy_df = (nhd_io.read_netcdf(topobathy_file).set_index('link')) + unrefactored_topobathy_df.index = unrefactored_topobathy_df.index.astype(int) + + else: + topobathy_df = pd.DataFrame() + LOG.debug('No natural cross section topobathy data of refactored hydrofabric provided. Hybrid simualtion will run on compound trapezoidal geometry.') + + # initialize a dictionary to hold network data for each of the diffusive domains + refactored_diffusive_network_data = {} + + else: + refactored_diffusive_domain = None + refactored_diffusive_network_data = None + refactored_reaches = {} + LOG.info('No refactored diffusive domain file specified in configuration file. This is an MC-only simulation') + + else: + diffusive_domain = None + diffusive_network_data = None + topobathy_df = pd.DataFrame() + unrefactored_topobathy_df = pd.DataFrame() + refactored_diffusive_domain = None + refactored_diffusive_network_data = None + refactored_reaches = {} + LOG.info('No hybrid parameters specified in configuration file. This is an MC-only simulation') + + #============================================================================ + # build diffusive domain data and edit MC domain data for hybrid simulation + + # + if diffusive_domain: + rconn_diff0 = nhd_network.reverse_network(connections) + refactored_reaches = {} + + for tw in diffusive_domain: + mainstem_segs = diffusive_domain[tw]['links'] + # we want mainstem_segs start at a mainstem link right after the upstream boundary mainstem link, which is + # in turn not under any waterbody. This boundary mainstem link should be turned into a tributary segment. + upstream_boundary_mainstem_link = diffusive_domain[tw]['upstream_boundary_link_mainstem'] + if upstream_boundary_mainstem_link[0] in mainstem_segs: + mainstem_segs.remove(upstream_boundary_mainstem_link[0]) + + # ===== build diffusive network data objects ==== + diffusive_network_data[tw] = {} + + # add diffusive domain segments + diffusive_network_data[tw]['mainstem_segs'] = mainstem_segs + + # diffusive domain tributary segments + trib_segs = [] + + for seg in mainstem_segs: + us_list = rconn_diff0[seg] + for u in us_list: + if u not in mainstem_segs: + trib_segs.append(u) + + diffusive_network_data[tw]['tributary_segments'] = trib_segs + # diffusive domain connections object + diffusive_network_data[tw]['connections'] = {k: connections[k] for k in (mainstem_segs + trib_segs)} + + # diffusive domain reaches and upstream connections. + # break network at tributary segments + _, reaches, rconn_diff = nnu.organize_independent_networks( + diffusive_network_data[tw]['connections'], + set(trib_segs), + set(), + ) + + diffusive_network_data[tw]['rconn'] = rconn_diff + diffusive_network_data[tw]['reaches'] = reaches[tw] + + # RouteLink parameters + diffusive_network_data[tw]['param_df'] = param_df.filter( + (mainstem_segs + trib_segs), + axis = 0, + ) + diffusive_network_data[tw]['upstream_boundary_link'] = upstream_boundary_mainstem_link + + if refactored_diffusive_domain: + diffusive_parameters = {'geo_file_path': refactored_topobathy_file} + refactored_connections = nnu.build_refac_connections(diffusive_parameters) + + # list of stream segments of a single refactored diffusive domain + refac_tw = refactored_diffusive_domain[tw]['refac_tw'] + rlinks_tw = refactored_diffusive_domain[tw]['rlinks'] + refactored_connections_tw = {} + + # Subset a connection dictionary (upstream segment as key : downstream segments as values) from refactored_connections + # for a single refactored diffusive domain defined by a current tw. + for k in rlinks_tw: + if k in refactored_connections.keys() and k != refac_tw: + refactored_connections_tw[k] = refactored_connections[k] + + refactored_diffusive_network_data[refac_tw] = {} + refactored_diffusive_network_data[refac_tw]['tributary_segments'] = trib_segs + refactored_diffusive_network_data[refac_tw]['connections'] = refactored_connections_tw + + for k in trib_segs: + refactored_diffusive_network_data[refac_tw]['connections'][k]= [refactored_diffusive_domain[tw]['incoming_tribs'][k]] + + # diffusive domain reaches and upstream connections. + # break network at tributary segments + _, refactored_reaches_batch, refactored_conn_diff = nnu.organize_independent_networks( + refactored_diffusive_network_data[refac_tw]['connections'], + set(trib_segs), + set(), + ) + + refactored_reaches[refac_tw] = refactored_reaches_batch[refac_tw] + refactored_diffusive_network_data[refac_tw]['mainstem_segs'] = refactored_diffusive_domain[tw]['rlinks'] + refactored_diffusive_network_data[refac_tw]['upstream_boundary_link'] = diffusive_network_data[tw]['upstream_boundary_link'] + else: + refactored_reaches={} + + # ==== remove diffusive domain segs from MC domain ==== + # drop indices from param_df + param_df = param_df.drop(mainstem_segs) + + # remove keys from connections dictionary + for s in mainstem_segs: + connections.pop(s) + + # update downstream connections of trib segs + for us in trib_segs: + connections[us] = [] + + #============================================================================ + # Identify Independent Networks and Reaches by Network + LOG.info("organizing connections into reaches ...") + start_time = time.time() + gage_break_segments = set() + wbody_break_segments = set() + + break_network_at_waterbodies = waterbody_parameters.get( + "break_network_at_waterbodies", False + ) + + # if streamflow DA, then break network at gages + break_network_at_gages = False + + if break_network_at_waterbodies: + wbody_break_segments = wbody_break_segments.union(wbody_conn.values()) + + if break_network_at_gages: + gage_break_segments = gage_break_segments.union(gages['gages'].keys()) + + independent_networks, reaches_bytw, rconn = nnu.organize_independent_networks( + connections, + wbody_break_segments, + gage_break_segments, + ) + + LOG.debug("reach organization complete in %s seconds." % (time.time() - start_time)) + # FIXME: Make this commented out alive + ''' + if preprocessing_parameters.get('preprocess_only', False): + + LOG.debug("saving preprocessed network data to disk for future use") + # todo: consider a better default than None + destination_folder = preprocessing_parameters.get('preprocess_output_folder', None) + if destination_folder: + + output_filename = preprocessing_parameters.get( + 'preprocess_output_filename', + 'preprocess_output' + ) + + outputs = {} + outputs.update( + {'connections': connections, + 'param_df': param_df, + 'wbody_conn': wbody_conn, + 'waterbodies_df': waterbodies_df, + 'waterbody_types_df': waterbody_types_df, + 'break_network_at_waterbodies': break_network_at_waterbodies, + 'waterbody_type_specified': waterbody_type_specified, + 'link_lake_crosswalk': link_lake_crosswalk, + 'independent_networks': independent_networks, + 'reaches_bytw': reaches_bytw, + 'rconn': rconn, + 'link_gage_df': link_gage_df, + 'usgs_lake_gage_crosswalk': usgs_lake_gage_crosswalk, + 'usace_lake_gage_crosswalk': usace_lake_gage_crosswalk, + 'diffusive_network_data': diffusive_network_data, + 'topobathy_data': topobathy_df, + } + ) + try: + np.save( + pathlib.Path(destination_folder).joinpath(output_filename), + outputs + ) + except: + LOG.critical('Canonot find %s. Aborting preprocessing routine' % pathlib.Path(destination_folder)) + quit() + + LOG.debug( + "writing preprocessed network data to %s"\ + % pathlib.Path(destination_folder).joinpath(output_filename + '.npy')) + LOG.critical( + "Preprocessed network data written to %s aborting preprocessing sequence" \ + % pathlib.Path(destination_folder).joinpath(output_filename + '.npy')) + quit() + + else: + LOG.critical( + "No destination folder specified for preprocessing. Please specify preprocess_output_folder in configuration file. Aborting preprocessing routine" + ) + quit() + ''' + return(independent_networks, + reaches_bytw, + rconn, + diffusive_network_data, + topobathy_df, + refactored_diffusive_domain, + refactored_reaches, + unrefactored_topobathy_df, + ) + +def hyfeature_initial_warmstate_preprocess( + # break_network_at_waterbodies, + restart_parameters, + # data_assimilation_parameters, + segment_index, + # waterbodies_df, + # link_lake_crosswalk, +): + + ''' + Assemble model initial condition data: + - waterbody inital states (outflow and pool elevation) + - channel initial states (flow and depth) + - initial time + + Arguments + --------- + - break_network_at_waterbodies (bool): If True, waterbody initial states will + be appended to the waterbody parameter + dataframe. If False, waterbodies will + not be simulated and the waterbody + parameter datataframe wil not be changed + - restart_parameters (dict): User-input simulation restart + parameters + - data_assimilation_parameters (dict): User-input data assimilation + parameters + - segment_index (Pandas Index): All segment IDs in the simulation + doamin + - waterbodies_df (Pandas DataFrame): Waterbody parameters + - link_lake_crosswalk (dict): Crosswalking between lake ids and the link + id of the lake outlet segment + + Returns + ------- + - waterbodies_df (Pandas DataFrame): Waterbody parameters with initial + states (outflow and pool elevation) + - q0 (Pandas DataFrame): Initial flow and depth states for each + segment in the model domain + - t0 (datetime): Datetime of the model initialization + + Notes + ----- + ''' + + #---------------------------------------------------------------------------- + # Assemble waterbody initial states (outflow and pool elevation + #---------------------------------------------------------------------------- + ''' + if break_network_at_waterbodies: + + start_time = time.time() + LOG.info("setting waterbody initial states ...") + + # if a lite restart file is provided, read initial states from it. + if restart_parameters.get("lite_waterbody_restart_file", None): + + waterbodies_initial_states_df, _ = nhd_io.read_lite_restart( + restart_parameters['lite_waterbody_restart_file'] + ) + + # read waterbody initial states from WRF-Hydro type restart file + elif restart_parameters.get("wrf_hydro_waterbody_restart_file", None): + waterbodies_initial_states_df = nhd_io.get_reservoir_restart_from_wrf_hydro( + restart_parameters["wrf_hydro_waterbody_restart_file"], + restart_parameters["wrf_hydro_waterbody_ID_crosswalk_file"], + restart_parameters.get("wrf_hydro_waterbody_ID_crosswalk_file_field_name", 'lake_id'), + restart_parameters["wrf_hydro_waterbody_crosswalk_filter_file"], + restart_parameters.get( + "wrf_hydro_waterbody_crosswalk_filter_file_field_name", + 'NHDWaterbodyComID' + ), + ) + + # if no restart file is provided, default initial states + else: + # TODO: Consider adding option to read cold state from route-link file + waterbodies_initial_ds_flow_const = 0.0 + waterbodies_initial_depth_const = -1e9 + # Set initial states from cold-state + waterbodies_initial_states_df = pd.DataFrame( + 0, + index=waterbodies_df.index, + columns=[ + "qd0", + "h0", + ], + dtype="float32", + ) + # TODO: This assignment could probably by done in the above call + waterbodies_initial_states_df["qd0"] = waterbodies_initial_ds_flow_const + waterbodies_initial_states_df["h0"] = waterbodies_initial_depth_const + waterbodies_initial_states_df["index"] = range( + len(waterbodies_initial_states_df) + ) + + waterbodies_df = pd.merge( + waterbodies_df, waterbodies_initial_states_df, on="lake_id" + ) + + LOG.debug( + "waterbody initial states complete in %s seconds."\ + % (time.time() - start_time)) + start_time = time.time() + ''' + + #---------------------------------------------------------------------------- + # Assemble channel initial states (flow and depth) + # also establish simulation initialization timestamp + #---------------------------------------------------------------------------- + start_time = time.time() + LOG.info("setting channel initial states ...") + + # if lite restart file is provided, the read channel initial states from it + if restart_parameters.get("lite_channel_restart_file", None): + # FIXME: Change it for hyfeature! + ''' + q0, t0 = nhd_io.read_lite_restart( + restart_parameters['lite_channel_restart_file'] + ) + t0_str = None + ''' + # when a restart file for hyfeature is provied, then read initial states from it. + elif restart_parameters.get("hyfeature_channel_restart_file", None): + q0 = nnu.build_channel_initial_state(restart_parameters, segment_index) + channel_initial_states_file = restart_parameters["hyfeature_channel_restart_file"] + df = pd.read_csv(channel_initial_states_file) + t0_str = pd.to_datetime(df.columns[1]).strftime("%Y-%m-%d_%H:%M:%S") + t0 = datetime.strptime(t0_str,"%Y-%m-%d_%H:%M:%S") + + # build initial states from user-provided restart parameters + else: + # FIXME: Change it for hyfeature! + ''' + q0 = nnu.build_channel_initial_state(restart_parameters, segment_index) + + # get initialization time from restart file + if restart_parameters.get("wrf_hydro_channel_restart_file", None): + channel_initial_states_file = restart_parameters[ + "wrf_hydro_channel_restart_file" + ] + t0_str = nhd_io.get_param_str( + channel_initial_states_file, + "Restart_Time" + ) + else: + t0_str = "2015-08-16_00:00:00" + + # convert timestamp from string to datetime + t0 = datetime.strptime(t0_str, "%Y-%m-%d_%H:%M:%S") + ''' + # get initial time from user inputs + if restart_parameters.get("start_datetime", None): + t0_str = restart_parameters.get("start_datetime") + + def _try_parsing_date(text): + for fmt in ( + "%Y-%m-%d_%H:%M", + "%Y-%m-%d_%H:%M:%S", + "%Y-%m-%d %H:%M", + "%Y-%m-%d %H:%M:%S", + "%Y/%m/%d %H:%M", + "%Y/%m/%d %H:%M:%S" + ): + try: + return datetime.strptime(text, fmt) + except ValueError: + pass + LOG.error('No valid date format found for start_datetime input. Please use format YYYY-MM-DD_HH:MM') + quit() + + t0 = _try_parsing_date(t0_str) + else: + if t0_str == "2015-08-16_00:00:00": + LOG.info('No user-input start_datetime and no restart file, start time arbitrarily 2015-08-16_00:00:00') + else: + LOG.info('No user-specified start_datetime, continuing with start time from restart file: %s', t0_str) + + LOG.debug( + "channel initial states complete in %s seconds."\ + % (time.time() - start_time) + ) + start_time = time.time() + + return ( + #waterbodies_df, + q0, + t0, + ) + # TODO: This returns a full dataframe (waterbodies_df) with the + # merged initial states for waterbodies, but only the + # initial state values (q0; not merged with the channel properties) + # for the channels -- + # That is because that is how they are used downstream. Need to + # trace that back and decide if there is one of those two ways + # that is optimal and make both returns that way. + +def hyfeature_forcing( + run, + forcing_parameters, + hybrid_parameters, + nexus_to_upstream_flowpath_dict, + segment_index, + cpu_pool, + t0, + coastal_boundary_depth_df, +): + """ + Assemble model forcings. Forcings include hydrological lateral inflows (qlats) + and coastal boundary depths for hybrid runs + + Aguments + -------- + - run (dict): List of forcing files pertaining to a + single run-set + - forcing_parameters (dict): User-input simulation forcing parameters + - hybrid_parameters (dict): User-input simulation hybrid parameters + - segment_index (Int64): Reach segment ids + - cpu_pool (int): Number of CPUs in the process-parallel pool + Returns + ------- + - qlats_df (Pandas DataFrame): Lateral inflow data, indexed by + segment ID + - coastal_bounary_depth_df (Pandas DataFrame): Coastal boundary water depths, + indexed by segment ID + + Notes + ----- + + """ + + # Unpack user-specified forcing parameters + dt = forcing_parameters.get("dt", None) + qts_subdivisions = forcing_parameters.get("qts_subdivisions", None) + nexus_input_folder = forcing_parameters.get("nexus_input_folder", None) + qlat_file_index_col = forcing_parameters.get("qlat_file_index_col", "feature_id") + qlat_file_value_col = forcing_parameters.get("qlat_file_value_col", "q_lateral") + qlat_file_gw_bucket_flux_col = forcing_parameters.get("qlat_file_gw_bucket_flux_col", "qBucket") + qlat_file_terrain_runoff_col = forcing_parameters.get("qlat_file_terrain_runoff_col", "qSfcLatRunoff") + + + # TODO: find a better way to deal with these defaults and overrides. + run["t0"] = run.get("t0", t0) + run["nts"] = run.get("nts") + run["dt"] = run.get("dt", dt) + run["qts_subdivisions"] = run.get("qts_subdivisions", qts_subdivisions) + run["nexus_input_folder"] = run.get("nexus_input_folder", nexus_input_folder) + run["qlat_file_index_col"] = run.get("qlat_file_index_col", qlat_file_index_col) + run["qlat_file_value_col"] = run.get("qlat_file_value_col", qlat_file_value_col) + run["qlat_file_gw_bucket_flux_col"] = run.get("qlat_file_gw_bucket_flux_col", qlat_file_gw_bucket_flux_col) + run["qlat_file_terrain_runoff_col"] = run.get("qlat_file_terrain_runoff_col", qlat_file_terrain_runoff_col) + + #--------------------------------------------------------------------------- + # Assemble lateral inflow data + #--------------------------------------------------------------------------- + + start_time = time.time() + LOG.info("Creating a DataFrame of lateral inflow forcings ...") + + # Place holder, if reading qlats from a file use this. + # TODO: add an option for reading qlat data from BMI/model engine + from_file = True + if from_file: + qlats_df = hnu.build_qlateral_array( + run, + cpu_pool, + nexus_to_upstream_flowpath_dict, + segment_index, + ) + + LOG.debug( + "lateral inflow DataFrame creation complete in %s seconds." \ + % (time.time() - start_time) + ) + + #--------------------------------------------------------------------- + # Assemble coastal coupling data [WIP] + #--------------------------------------------------------------------- + # Run if coastal_boundary_depth_df has not already been created: + if coastal_boundary_depth_df.empty: + coastal_boundary_elev_files = forcing_parameters.get('coastal_boundary_input_file', None) + coastal_boundary_domain_files = hybrid_parameters.get('coastal_boundary_domain', None) + + if coastal_boundary_elev_files: + start_time = time.time() + LOG.info("creating coastal dataframe ...") + + coastal_boundary_domain = nhd_io.read_coastal_boundary_domain(coastal_boundary_domain_files) + coastal_boundary_depth_df = nhd_io.build_coastal_ncdf_dataframe( + coastal_boundary_elev_files, + coastal_boundary_domain, + ) + + LOG.debug( + "coastal boundary elevation observation DataFrame creation complete in %s seconds." \ + % (time.time() - start_time) + ) + + return qlats_df, coastal_boundary_depth_df + +def read_ngen_waterbody_df(parm_file, lake_index_field="wb-id", lake_id_mask=None): + """ + Reads lake.json file and prepares a dataframe, filtered + to the relevant reservoirs, to provide the parameters + for level-pool reservoir computation. + """ + def node_key_func(x): + return int(x[3:]) + if os.path.splitext(parm_file)[1]=='.gpkg': + df = gpd.read_file(parm_file, layer="lake_attributes").set_index('id') + elif os.path.splitext(parm_file)[1]=='.json': + df = pd.read_json(parm_file, orient="index") + + df.index = df.index.map(node_key_func) + df.index.name = lake_index_field + #df = df.set_index(lake_index_field, append=True).reset_index(level=0) + #df.rename(columns={'level_0':'wb-id'}, inplace=True) + if lake_id_mask: + df = df.loc[lake_id_mask] + return df + +def read_ngen_waterbody_type_df(parm_file, lake_index_field="wb-id", lake_id_mask=None): + """ + """ + #FIXME: this function is likely not correct. Unclear how we will get + # reservoir type from the gpkg files. Information should be in 'crosswalk' + # layer, but as of now (Nov 22, 2022) there doesn't seem to be a differentiation + # between USGS reservoirs, USACE reservoirs, or RFC reservoirs... + def node_key_func(x): + return int(x[3:]) + + if os.path.splitext(parm_file)[1]=='.gpkg': + df = gpd.read_file(parm_file, layer="crosswalk").set_index('id') + elif os.path.splitext(parm_file)[1]=='.json': + df = pd.read_json(parm_file, orient="index") + + df.index = df.index.map(node_key_func) + df.index.name = lake_index_field + if lake_id_mask: + df = df.loc[lake_id_mask] + + return df \ No newline at end of file diff --git a/src/troute-network/troute/nhd_io.py b/src/troute-network/troute/nhd_io.py index 0f0349775..3515cd2d6 100644 --- a/src/troute-network/troute/nhd_io.py +++ b/src/troute-network/troute/nhd_io.py @@ -86,7 +86,6 @@ def read_config_file(custom_input_file): data_assimilation_parameters (dict): Input parameters re data assimilation ''' - if custom_input_file[-4:] == "yaml": with open(custom_input_file) as custom_file: data = yaml.load(custom_file, Loader=yaml.SafeLoader) @@ -99,11 +98,42 @@ def read_config_file(custom_input_file): supernetwork_parameters = network_topology_parameters.get( "supernetwork_parameters", None ) + # add attributes when HYfeature network is selected + if supernetwork_parameters['geo_file_path'][-4:] == "gpkg": + supernetwork_parameters["title_string"] = "HY_Features Test" + supernetwork_parameters["geo_file_path"] = supernetwork_parameters['geo_file_path'] + supernetwork_parameters["flowpath_edge_list"] = None + routelink_attr = { + #link???? + "key": "id", + "downstream": "toid", + "dx": "length_m", + "n": "n", # TODO: rename to `manningn` + "ncc": "nCC", # TODO: rename to `mannningncc` + "s0": "So", + "bw": "BtmWdth", # TODO: rename to `bottomwidth` + #waterbody: "NHDWaterbodyComID", + "tw": "TopWdth", # TODO: rename to `topwidth` + "twcc": "TopWdthCC", # TODO: rename to `topwidthcc` + "alt": "alt", + "musk": "MusK", + "musx": "MusX", + "cs": "ChSlp" # TODO: rename to `sideslope` + } + supernetwork_parameters["columns"] = routelink_attr + supernetwork_parameters["waterbody_null_code"] = -9999 + supernetwork_parameters["terminal_code"] = 0 + supernetwork_parameters["driver_string"] = "NetCDF" + supernetwork_parameters["layer_string"] = 0 + preprocessing_parameters = network_topology_parameters.get( "preprocessing_parameters", {} ) + #waterbody_parameters = network_topology_parameters.get( + # "waterbody_parameters", None + #) waterbody_parameters = network_topology_parameters.get( - "waterbody_parameters", None + "waterbody_parameters", {} ) compute_parameters = data.get("compute_parameters", {}) forcing_parameters = compute_parameters.get("forcing_parameters", {}) @@ -339,7 +369,7 @@ def read_reservoir_parameter_file( return df1, usgs_crosswalk, usace_crosswalk -def get_ql_from_csv(qlat_input_file, index_col=0): +def get_ql_from_csv(nhd_input_file, index_col=0): """ qlat_input_file: comma delimted file with header giving timesteps, rows for each segment index_col = 0: column/field in the input file with the segment/link id diff --git a/src/troute-network/troute/nhd_network_utilities_v02.py b/src/troute-network/troute/nhd_network_utilities_v02.py index a32b8038c..e2d353e5d 100644 --- a/src/troute-network/troute/nhd_network_utilities_v02.py +++ b/src/troute-network/troute/nhd_network_utilities_v02.py @@ -209,12 +209,15 @@ def build_channel_initial_state( wrf_hydro_channel_restart_file = restart_parameters.get( "wrf_hydro_channel_restart_file", None ) + + hyfeature_channel_restart_file = restart_parameters.get( + "hyfeature_channel_restart_file", None + ) if channel_restart_file: q0 = nhd_io.get_channel_restart_from_csv(channel_restart_file) - + elif wrf_hydro_channel_restart_file: - q0 = nhd_io.get_channel_restart_from_wrf_hydro( restart_parameters["wrf_hydro_channel_restart_file"], restart_parameters["wrf_hydro_channel_ID_crosswalk_file"], @@ -223,6 +226,11 @@ def build_channel_initial_state( restart_parameters.get("wrf_hydro_channel_restart_downstream_flow_field_name", 'qlink2'), restart_parameters.get("wrf_hydro_channel_restart_depth_flow_field_name", 'hlink'), ) + elif hyfeature_channel_restart_file: + # FIXME: fix this cold start when acutal restart file for hyfeature network rolls in. + q0 = pd.DataFrame( + 0, index=segment_index, columns=["qu0", "qd0", "h0"], dtype="float32", + ) else: # Set cold initial state # assume to be zero @@ -230,6 +238,7 @@ def build_channel_initial_state( q0 = pd.DataFrame( 0, index=segment_index, columns=["qu0", "qd0", "h0"], dtype="float32", ) + # TODO: If needed for performance improvement consider filtering mask file on read. if not segment_index.empty: q0 = q0[q0.index.isin(segment_index)] @@ -247,7 +256,7 @@ def build_forcing_sets( nts = forcing_parameters.get("nts", None) max_loop_size = forcing_parameters.get("max_loop_size", 12) dt = forcing_parameters.get("dt", None) - + try: qlat_input_folder = pathlib.Path(qlat_input_folder) assert qlat_input_folder.is_dir() == True @@ -259,7 +268,6 @@ def build_forcing_sets( forcing_glob_filter = forcing_parameters.get("qlat_file_pattern_filter", "*.CHRTOUT_DOMAIN1") # TODO: Throw errors if insufficient input data are available - if run_sets: # append final_timestamp variable to each set_list @@ -316,7 +324,7 @@ def build_forcing_sets( assert J.is_file() == True except AssertionError: raise AssertionError("Aborting simulation because forcing file", J, "cannot be not found.") from None - + # build run sets list run_sets = [] k = 0 @@ -349,7 +357,6 @@ def build_forcing_sets( nts_last = nts_accum k += max_loop_size j += 1 - return run_sets def build_qlateral_array( @@ -382,7 +389,7 @@ def build_qlateral_array( qlat_file_value_col = forcing_parameters.get("qlat_file_value_col", "q_lateral") gw_bucket_col = forcing_parameters.get("qlat_file_gw_bucket_flux_col","qBucket") terrain_ro_col = forcing_parameters.get("qlat_file_terrain_runoff_col","qSfcLatRunoff") - + # Parallel reading of qlateral data from CHRTOUT with Parallel(n_jobs=cpu_pool) as parallel: diff --git a/src/troute-network/troute/nhd_preprocess.py b/src/troute-network/troute/nhd_preprocess.py index c1f4c7934..dc303815b 100644 --- a/src/troute-network/troute/nhd_preprocess.py +++ b/src/troute-network/troute/nhd_preprocess.py @@ -735,12 +735,11 @@ def nhd_initial_warmstate_preprocess( "waterbody initial states complete in %s seconds."\ % (time.time() - start_time)) start_time = time.time() - + #---------------------------------------------------------------------------- # Assemble channel initial states (flow and depth) # also establish simulation initialization timestamp #---------------------------------------------------------------------------- - start_time = time.time() LOG.info("setting channel initial states ...") diff --git a/src/troute-nwm/src/nwm_routing/__main__.py b/src/troute-nwm/src/nwm_routing/__main__.py index 596261af6..d3c8c6f33 100644 --- a/src/troute-nwm/src/nwm_routing/__main__.py +++ b/src/troute-nwm/src/nwm_routing/__main__.py @@ -29,6 +29,7 @@ import troute.nhd_io as nhd_io import troute.nhd_network_utilities_v02 as nnu import troute.routing.diffusive_utils as diff_utils +import troute.hyfeature_network_utilities as hnu LOG = logging.getLogger('') @@ -53,7 +54,7 @@ def main_v04(argv): parity_parameters, data_assimilation_parameters, ) = _input_handler_v03(args) - + run_parameters = { 'dt': forcing_parameters.get('dt'), 'nts': forcing_parameters.get('nts'), @@ -75,14 +76,24 @@ def main_v04(argv): # perform initial warmstate preprocess. if showtiming: network_start_time = time.time() - - if "ngen_nexus_file" in supernetwork_parameters: - network = HYFeaturesNetwork(supernetwork_parameters, - waterbody_parameters=waterbody_parameters, - restart_parameters=restart_parameters, - forcing_parameters=forcing_parameters, - verbose=verbose, showtiming=showtiming) - else: + + #if "ngen_nexus_file" in supernetwork_parameters: + if supernetwork_parameters["geo_file_type"] == 'HYFeaturesNetwork': + network = HYFeaturesNetwork(supernetwork_parameters, + waterbody_parameters, + restart_parameters, + forcing_parameters, + verbose=True, showtiming=showtiming) + + network.create_routing_network(network.connections, + network.dataframe, + network.waterbody_connections, + network.gages, + preprocessing_parameters, + compute_parameters, + waterbody_parameters,) + + elif supernetwork_parameters["geo_file_type"] == 'NHDNetwork': network = NHDNetwork(supernetwork_parameters, waterbody_parameters, restart_parameters, @@ -97,9 +108,12 @@ def main_v04(argv): if showtiming: network_end_time = time.time() task_times['network_creation_time'] = network_end_time - network_start_time - + # Create run_sets: sets of forcing files for each loop - run_sets = nnu.build_forcing_sets(forcing_parameters, network.t0) + if supernetwork_parameters["geo_file_type"] == 'NHDNetwork': + run_sets = nnu.build_forcing_sets(forcing_parameters, network.t0) + elif supernetwork_parameters["geo_file_type"] == 'HYFeaturesNetwork': + run_sets = hnu.build_forcing_sets(forcing_parameters, network.t0) # Create da_sets: sets of TimeSlice files for each loop if "data_assimilation_parameters" in compute_parameters: @@ -113,19 +127,21 @@ def main_v04(argv): # Create forcing data within network object for first loop iteration network.assemble_forcings(run_sets[0], forcing_parameters, hybrid_parameters, cpu_pool) - + # Create data assimilation object from da_sets for first loop iteration - data_assimilation = AllDA(data_assimilation_parameters, - run_parameters, - waterbody_parameters, - network, - da_sets[0]) + # TODO: Add data_assimilation for hyfeature network + if 1==2: + data_assimilation = AllDA(data_assimilation_parameters, + run_parameters, + waterbody_parameters, + network, + da_sets[0]) if showtiming: forcing_end_time = time.time() task_times['forcing_time'] += forcing_end_time - network_end_time - + parallel_compute_method = compute_parameters.get("parallel_compute_method", None) subnetwork_target_size = compute_parameters.get("subnetwork_target_size", 1) qts_subdivisions = forcing_parameters.get("qts_subdivisions", 1) @@ -137,7 +153,6 @@ def main_v04(argv): # on first iteration of for loop only. For additional loops this will be passed # to function from inital loop. subnetwork_list = [None, None, None] - for run_set_iterator, run in enumerate(run_sets): t0 = run.get("t0") @@ -168,13 +183,13 @@ def main_v04(argv): network.dataframe, network.q0, network._qlateral, - data_assimilation.usgs_df, - data_assimilation.lastobs_df, - data_assimilation.reservoir_usgs_df, - data_assimilation.reservoir_usgs_param_df, - data_assimilation.reservoir_usace_df, - data_assimilation.reservoir_usace_param_df, - data_assimilation.assimilation_parameters, + pd.DataFrame(), #data_assimilation.usgs_df, + pd.DataFrame(), #data_assimilation.lastobs_df, + pd.DataFrame(), #data_assimilation.reservoir_usgs_df, + pd.DataFrame(), #data_assimilation.reservoir_usgs_param_df, + pd.DataFrame(), #data_assimilation.reservoir_usace_df, + pd.DataFrame(), #data_assimilation.reservoir_usace_param_df, + {}, #data_assimilation.assimilation_parameters, assume_short_ts, return_courant, network._waterbody_df, ## check: network._waterbody_df ?? def name is different from return self._ .. @@ -189,17 +204,17 @@ def main_v04(argv): network.coastal_boundary_depth_df, network.unrefactored_topobathy_df, ) - + # returns list, first item is run result, second item is subnetwork items subnetwork_list = run_results[1] run_results = run_results[0] - + if showtiming: route_end_time = time.time() task_times['route_time'] += route_end_time - route_start_time # create initial conditions for next loop itteration - network.new_nhd_q0(run_results) + network.new_q0(run_results) network.update_waterbody_water_elevation() # TODO move the conditional call to write_lite_restart to nwm_output_generator. @@ -210,7 +225,8 @@ def main_v04(argv): t0 + timedelta(seconds = dt * nts), output_parameters['lite_restart'] ) - + + # Prepare input forcing for next time loop simulation when mutiple time loops are presented. if run_set_iterator < len(run_sets) - 1: # update t0 network.new_t0(dt,nts) @@ -222,7 +238,9 @@ def main_v04(argv): cpu_pool) # get reservoir DA initial parameters for next loop iteration - data_assimilation.update(run_results, + # TODO: Add data_assimilation for hyfeature network + if 1==2: + data_assimilation.update(run_results, data_assimilation_parameters, run_parameters, network, @@ -249,15 +267,16 @@ def main_v04(argv): network._waterbody_df, ## check: network._waterbody_df ?? def name is different from return self._ .. network._waterbody_types_df, ## check: network._waterbody_types_df ?? def name is different from return self._ .. data_assimilation_parameters, - data_assimilation.lastobs_df, - network.link_gage_df, - network.link_lake_crosswalk, + pd.DataFrame(), #data_assimilation.lastobs_df, + pd.DataFrame(), #network.link_gage_df, + None, #network.link_lake_crosswalk, ) - + if showtiming: output_end_time = time.time() task_times['output_time'] += output_end_time - output_start_time - + # end of for run_set_iterator, run in enumerate(run_sets): + if showtiming: task_times['total_time'] = time.time() - main_start_time diff --git a/src/troute-routing/troute/routing/compute.py b/src/troute-routing/troute/routing/compute.py index c552e80a6..a5673817c 100644 --- a/src/troute-routing/troute/routing/compute.py +++ b/src/troute-routing/troute/routing/compute.py @@ -543,7 +543,6 @@ def compute_nhd_routing_v02( return_courant, ) ) - results_subn[order] = parallel(jobs) if order > 0: # This is not needed for the last rank of subnetworks @@ -1180,9 +1179,10 @@ def compute_diffusive_routing( else: topobathy_bytw = pd.DataFrame() unrefactored_topobathy_bytw = pd.DataFrame() - + # diffusive streamflow DA activation switch - if da_parameter_dict['diffusive_streamflow_nudging']==True: + #if da_parameter_dict['diffusive_streamflow_nudging']==True: + if 'diffusive_streamflow_nudging' in da_parameter_dict: diff_usgs_df = usgs_df else: diff_usgs_df = pd.DataFrame() diff --git a/src/troute-routing/troute/routing/fast_reach/mc_reach.pyx b/src/troute-routing/troute/routing/fast_reach/mc_reach.pyx index 5565e2c99..248630bfd 100644 --- a/src/troute-routing/troute/routing/fast_reach/mc_reach.pyx +++ b/src/troute-routing/troute/routing/fast_reach/mc_reach.pyx @@ -222,8 +222,10 @@ cpdef object compute_network_structured( # Check shapes if qlat_values.shape[0] != data_idx.shape[0]: raise ValueError(f"Number of rows in Qlat is incorrect: expected ({data_idx.shape[0]}), got ({qlat_values.shape[0]})") - if qlat_values.shape[1] < nsteps: + + if qlat_values.shape[1] < nsteps/qts_subdivisions: raise ValueError(f"Number of columns (timesteps) in Qlat is incorrect: expected at most ({data_idx.shape[0]}), got ({qlat_values.shape[1]}). The number of columns in Qlat must be equal to or less than the number of routing timesteps") + if data_values.shape[0] != data_idx.shape[0] or data_values.shape[1] != data_cols.shape[0]: raise ValueError(f"data_values shape mismatch") #define and initialize the final output array, add one extra time step for initial conditions diff --git a/test/unit_test_hyfeature/channel_forcing/201512010000NEXOUT.csv b/test/unit_test_hyfeature/channel_forcing/201512010000NEXOUT.csv new file mode 100644 index 000000000..57a2a30d4 --- /dev/null +++ b/test/unit_test_hyfeature/channel_forcing/201512010000NEXOUT.csv @@ -0,0 +1,8 @@ +feature_id,201512010000 +10238,1097500.0 +1000000001,1097500.0 +2,1097500.0 +4,1097500.0 +10236,1097500.0 +3,1097500.0 +10237,1097500.0 diff --git a/test/unit_test_hyfeature/channel_forcing/201512010100NEXOUT.csv b/test/unit_test_hyfeature/channel_forcing/201512010100NEXOUT.csv new file mode 100644 index 000000000..5dad6ca5b --- /dev/null +++ b/test/unit_test_hyfeature/channel_forcing/201512010100NEXOUT.csv @@ -0,0 +1,8 @@ +feature_id,201512010100 +10238,9876660.0 +1000000001,9876660.0 +2,9876660.0 +4,9876660.0 +10236,9876660.0 +3,9876660.0 +10237,9876660.0 diff --git a/test/unit_test_hyfeature/channel_forcing/201512010200NEXOUT.csv b/test/unit_test_hyfeature/channel_forcing/201512010200NEXOUT.csv new file mode 100644 index 000000000..3a28297b3 --- /dev/null +++ b/test/unit_test_hyfeature/channel_forcing/201512010200NEXOUT.csv @@ -0,0 +1,8 @@ +feature_id,201512010200 +10238,10868900.0 +1000000001,10868900.0 +2,10868900.0 +4,10868900.0 +10236,10868900.0 +3,10868900.0 +10237,10868900.0 diff --git a/test/unit_test_hyfeature/channel_forcing/201512010300NEXOUT.csv b/test/unit_test_hyfeature/channel_forcing/201512010300NEXOUT.csv new file mode 100644 index 000000000..7451f590c --- /dev/null +++ b/test/unit_test_hyfeature/channel_forcing/201512010300NEXOUT.csv @@ -0,0 +1,8 @@ +feature_id,201512010300 +10238,14574600.0 +1000000001,14574600.0 +2,14574600.0 +4,14574600.0 +10236,14574600.0 +3,14574600.0 +10237,14574600.0 diff --git a/test/unit_test_hyfeature/channel_forcing/201512010400NEXOUT.csv b/test/unit_test_hyfeature/channel_forcing/201512010400NEXOUT.csv new file mode 100644 index 000000000..f993d1069 --- /dev/null +++ b/test/unit_test_hyfeature/channel_forcing/201512010400NEXOUT.csv @@ -0,0 +1,8 @@ +feature_id,201512010400 +10238,12557100.0 +1000000001,12557100.0 +2,12557100.0 +4,12557100.0 +10236,12557100.0 +3,12557100.0 +10237,12557100.0 diff --git a/test/unit_test_hyfeature/channel_forcing/201512010500NEXOUT.csv b/test/unit_test_hyfeature/channel_forcing/201512010500NEXOUT.csv new file mode 100644 index 000000000..488458a0d --- /dev/null +++ b/test/unit_test_hyfeature/channel_forcing/201512010500NEXOUT.csv @@ -0,0 +1,8 @@ +feature_id,201512010500 +10238,14807000.0 +1000000001,14807000.0 +2,14807000.0 +4,14807000.0 +10236,14807000.0 +3,14807000.0 +10237,14807000.0 diff --git a/test/unit_test_hyfeature/channel_forcing/201512010600NEXOUT.csv b/test/unit_test_hyfeature/channel_forcing/201512010600NEXOUT.csv new file mode 100644 index 000000000..86f6b2186 --- /dev/null +++ b/test/unit_test_hyfeature/channel_forcing/201512010600NEXOUT.csv @@ -0,0 +1,8 @@ +feature_id,201512010600 +10238,12601900.0 +1000000001,12601900.0 +2,12601900.0 +4,12601900.0 +10236,12601900.0 +3,12601900.0 +10237,12601900.0 diff --git a/test/unit_test_hyfeature/channel_forcing/201512010700NEXOUT.csv b/test/unit_test_hyfeature/channel_forcing/201512010700NEXOUT.csv new file mode 100644 index 000000000..751808c6f --- /dev/null +++ b/test/unit_test_hyfeature/channel_forcing/201512010700NEXOUT.csv @@ -0,0 +1,8 @@ +feature_id,201512010700 +10238,14767200.0 +1000000001,14767200.0 +2,14767200.0 +4,14767200.0 +10236,14767200.0 +3,14767200.0 +10237,14767200.0 diff --git a/test/unit_test_hyfeature/channel_forcing/201512010800NEXOUT.csv b/test/unit_test_hyfeature/channel_forcing/201512010800NEXOUT.csv new file mode 100644 index 000000000..2c2e3aaa6 --- /dev/null +++ b/test/unit_test_hyfeature/channel_forcing/201512010800NEXOUT.csv @@ -0,0 +1,8 @@ +feature_id,201512010800 +10238,12642800.0 +1000000001,12642800.0 +2,12642800.0 +4,12642800.0 +10236,12642800.0 +3,12642800.0 +10237,12642800.0 diff --git a/test/unit_test_hyfeature/channel_forcing/201512010900NEXOUT.csv b/test/unit_test_hyfeature/channel_forcing/201512010900NEXOUT.csv new file mode 100644 index 000000000..577a50d27 --- /dev/null +++ b/test/unit_test_hyfeature/channel_forcing/201512010900NEXOUT.csv @@ -0,0 +1,8 @@ +feature_id,201512010900 +10238,14729800.0 +1000000001,14729800.0 +2,14729800.0 +4,14729800.0 +10236,14729800.0 +3,14729800.0 +10237,14729800.0 diff --git a/test/unit_test_hyfeature/channel_forcing/201512011000NEXOUT.csv b/test/unit_test_hyfeature/channel_forcing/201512011000NEXOUT.csv new file mode 100644 index 000000000..98ef290ff --- /dev/null +++ b/test/unit_test_hyfeature/channel_forcing/201512011000NEXOUT.csv @@ -0,0 +1,8 @@ +feature_id,201512011000 +10238,12681500.0 +1000000001,12681500.0 +2,12681500.0 +4,12681500.0 +10236,12681500.0 +3,12681500.0 +10237,12681500.0 diff --git a/test/unit_test_hyfeature/channel_forcing/201512011100NEXOUT.csv b/test/unit_test_hyfeature/channel_forcing/201512011100NEXOUT.csv new file mode 100644 index 000000000..2e44e8b85 --- /dev/null +++ b/test/unit_test_hyfeature/channel_forcing/201512011100NEXOUT.csv @@ -0,0 +1,8 @@ +feature_id,201512011100 +10238,14694500.0 +1000000001,14694500.0 +2,14694500.0 +4,14694500.0 +10236,14694500.0 +3,14694500.0 +10237,14694500.0 diff --git a/test/unit_test_hyfeature/channel_forcing/201512011200NEXOUT.csv b/test/unit_test_hyfeature/channel_forcing/201512011200NEXOUT.csv new file mode 100644 index 000000000..42197d8aa --- /dev/null +++ b/test/unit_test_hyfeature/channel_forcing/201512011200NEXOUT.csv @@ -0,0 +1,8 @@ +feature_id,201512011200 +10238,12718000.0 +1000000001,12718000.0 +2,12718000.0 +4,12718000.0 +10236,12718000.0 +3,12718000.0 +10237,12718000.0 diff --git a/test/unit_test_hyfeature/channel_forcing/201512011300NEXOUT.csv b/test/unit_test_hyfeature/channel_forcing/201512011300NEXOUT.csv new file mode 100644 index 000000000..6108b27b9 --- /dev/null +++ b/test/unit_test_hyfeature/channel_forcing/201512011300NEXOUT.csv @@ -0,0 +1,8 @@ +feature_id,201512011300 +10238,14661300.0 +1000000001,14661300.0 +2,14661300.0 +4,14661300.0 +10236,14661300.0 +3,14661300.0 +10237,14661300.0 diff --git a/test/unit_test_hyfeature/channel_forcing/201512011400NEXOUT.csv b/test/unit_test_hyfeature/channel_forcing/201512011400NEXOUT.csv new file mode 100644 index 000000000..1d3f452ca --- /dev/null +++ b/test/unit_test_hyfeature/channel_forcing/201512011400NEXOUT.csv @@ -0,0 +1,8 @@ +feature_id,201512011400 +10238,12752400.0 +1000000001,12752400.0 +2,12752400.0 +4,12752400.0 +10236,12752400.0 +3,12752400.0 +10237,12752400.0 diff --git a/test/unit_test_hyfeature/channel_forcing/201512011500NEXOUT.csv b/test/unit_test_hyfeature/channel_forcing/201512011500NEXOUT.csv new file mode 100644 index 000000000..a49ac1f91 --- /dev/null +++ b/test/unit_test_hyfeature/channel_forcing/201512011500NEXOUT.csv @@ -0,0 +1,8 @@ +feature_id,201512011500 +10238,14630000.0 +1000000001,14630000.0 +2,14630000.0 +4,14630000.0 +10236,14630000.0 +3,14630000.0 +10237,14630000.0 diff --git a/test/unit_test_hyfeature/channel_forcing/201512011600NEXOUT.csv b/test/unit_test_hyfeature/channel_forcing/201512011600NEXOUT.csv new file mode 100644 index 000000000..1e8e79e0f --- /dev/null +++ b/test/unit_test_hyfeature/channel_forcing/201512011600NEXOUT.csv @@ -0,0 +1,8 @@ +feature_id,201512011600 +10238,12785000.0 +1000000001,12785000.0 +2,12785000.0 +4,12785000.0 +10236,12785000.0 +3,12785000.0 +10237,12785000.0 diff --git a/test/unit_test_hyfeature/channel_forcing/201512011700NEXOUT.csv b/test/unit_test_hyfeature/channel_forcing/201512011700NEXOUT.csv new file mode 100644 index 000000000..4bb649f1e --- /dev/null +++ b/test/unit_test_hyfeature/channel_forcing/201512011700NEXOUT.csv @@ -0,0 +1,8 @@ +feature_id,201512011700 +10238,14600500.0 +1000000001,14600500.0 +2,14600500.0 +4,14600500.0 +10236,14600500.0 +3,14600500.0 +10237,14600500.0 diff --git a/test/unit_test_hyfeature/channel_forcing/201512011800NEXOUT.csv b/test/unit_test_hyfeature/channel_forcing/201512011800NEXOUT.csv new file mode 100644 index 000000000..e0e4916cb --- /dev/null +++ b/test/unit_test_hyfeature/channel_forcing/201512011800NEXOUT.csv @@ -0,0 +1,8 @@ +feature_id,201512011800 +10238,12815700.0 +1000000001,12815700.0 +2,12815700.0 +4,12815700.0 +10236,12815700.0 +3,12815700.0 +10237,12815700.0 diff --git a/test/unit_test_hyfeature/channel_forcing/201512011900NEXOUT.csv b/test/unit_test_hyfeature/channel_forcing/201512011900NEXOUT.csv new file mode 100644 index 000000000..6f929612f --- /dev/null +++ b/test/unit_test_hyfeature/channel_forcing/201512011900NEXOUT.csv @@ -0,0 +1,8 @@ +feature_id,201512011900 +10238,14572700.0 +1000000001,14572700.0 +2,14572700.0 +4,14572700.0 +10236,14572700.0 +3,14572700.0 +10237,14572700.0 diff --git a/test/unit_test_hyfeature/channel_forcing/201512012000NEXOUT.csv b/test/unit_test_hyfeature/channel_forcing/201512012000NEXOUT.csv new file mode 100644 index 000000000..285b0a092 --- /dev/null +++ b/test/unit_test_hyfeature/channel_forcing/201512012000NEXOUT.csv @@ -0,0 +1,8 @@ +feature_id,201512012000 +10238,12844700.0 +1000000001,12844700.0 +2,12844700.0 +4,12844700.0 +10236,12844700.0 +3,12844700.0 +10237,12844700.0 diff --git a/test/unit_test_hyfeature/channel_forcing/201512012100NEXOUT.csv b/test/unit_test_hyfeature/channel_forcing/201512012100NEXOUT.csv new file mode 100644 index 000000000..65f61c646 --- /dev/null +++ b/test/unit_test_hyfeature/channel_forcing/201512012100NEXOUT.csv @@ -0,0 +1,8 @@ +feature_id,201512012100 +10238,14546400.0 +1000000001,14546400.0 +2,14546400.0 +4,14546400.0 +10236,14546400.0 +3,14546400.0 +10237,14546400.0 diff --git a/test/unit_test_hyfeature/channel_forcing/201512012200NEXOUT.csv b/test/unit_test_hyfeature/channel_forcing/201512012200NEXOUT.csv new file mode 100644 index 000000000..c94471db1 --- /dev/null +++ b/test/unit_test_hyfeature/channel_forcing/201512012200NEXOUT.csv @@ -0,0 +1,8 @@ +feature_id,201512012200 +10238,12872000.0 +1000000001,12872000.0 +2,12872000.0 +4,12872000.0 +10236,12872000.0 +3,12872000.0 +10237,12872000.0 diff --git a/test/unit_test_hyfeature/channel_forcing/201512012300NEXOUT.csv b/test/unit_test_hyfeature/channel_forcing/201512012300NEXOUT.csv new file mode 100644 index 000000000..206fd56e4 --- /dev/null +++ b/test/unit_test_hyfeature/channel_forcing/201512012300NEXOUT.csv @@ -0,0 +1,8 @@ +feature_id,201512012300 +10238,14521700.0 +1000000001,14521700.0 +2,14521700.0 +4,14521700.0 +10236,14521700.0 +3,14521700.0 +10237,14521700.0 diff --git a/test/unit_test_hyfeature/channel_forcing/201512020000NEXOUT.csv b/test/unit_test_hyfeature/channel_forcing/201512020000NEXOUT.csv new file mode 100644 index 000000000..93eb82869 --- /dev/null +++ b/test/unit_test_hyfeature/channel_forcing/201512020000NEXOUT.csv @@ -0,0 +1,8 @@ +feature_id,201512020000 +10238,12897900.0 +1000000001,12897900.0 +2,12897900.0 +4,12897900.0 +10236,12897900.0 +3,12897900.0 +10237,12897900.0 diff --git a/test/unit_test_hyfeature/channel_forcing/201512020100NEXOUT.csv b/test/unit_test_hyfeature/channel_forcing/201512020100NEXOUT.csv new file mode 100644 index 000000000..daf0916ba --- /dev/null +++ b/test/unit_test_hyfeature/channel_forcing/201512020100NEXOUT.csv @@ -0,0 +1,8 @@ +feature_id,201512020100 +10238,14498400.0 +1000000001,14498400.0 +2,14498400.0 +4,14498400.0 +10236,14498400.0 +3,14498400.0 +10237,14498400.0 diff --git a/test/unit_test_hyfeature/channel_forcing/201512020200NEXOUT.csv b/test/unit_test_hyfeature/channel_forcing/201512020200NEXOUT.csv new file mode 100644 index 000000000..248590030 --- /dev/null +++ b/test/unit_test_hyfeature/channel_forcing/201512020200NEXOUT.csv @@ -0,0 +1,8 @@ +feature_id,201512020200 +10238,12922200.0 +1000000001,12922200.0 +2,12922200.0 +4,12922200.0 +10236,12922200.0 +3,12922200.0 +10237,12922200.0 diff --git a/test/unit_test_hyfeature/channel_forcing/201512020300NEXOUT.csv b/test/unit_test_hyfeature/channel_forcing/201512020300NEXOUT.csv new file mode 100644 index 000000000..229cea278 --- /dev/null +++ b/test/unit_test_hyfeature/channel_forcing/201512020300NEXOUT.csv @@ -0,0 +1,8 @@ +feature_id,201512020300 +10238,14476500.0 +1000000001,14476500.0 +2,14476500.0 +4,14476500.0 +10236,14476500.0 +3,14476500.0 +10237,14476500.0 diff --git a/test/unit_test_hyfeature/channel_forcing/201512020400NEXOUT.csv b/test/unit_test_hyfeature/channel_forcing/201512020400NEXOUT.csv new file mode 100644 index 000000000..3f185b6a3 --- /dev/null +++ b/test/unit_test_hyfeature/channel_forcing/201512020400NEXOUT.csv @@ -0,0 +1,8 @@ +feature_id,201512020400 +10238,12945200.0 +1000000001,12945200.0 +2,12945200.0 +4,12945200.0 +10236,12945200.0 +3,12945200.0 +10237,12945200.0 diff --git a/test/unit_test_hyfeature/channel_forcing/201512020500NEXOUT.csv b/test/unit_test_hyfeature/channel_forcing/201512020500NEXOUT.csv new file mode 100644 index 000000000..04742804f --- /dev/null +++ b/test/unit_test_hyfeature/channel_forcing/201512020500NEXOUT.csv @@ -0,0 +1,8 @@ +feature_id,201512020500 +10238,14455800.0 +1000000001,14455800.0 +2,14455800.0 +4,14455800.0 +10236,14455800.0 +3,14455800.0 +10237,14455800.0 diff --git a/test/unit_test_hyfeature/channel_forcing/201512020600NEXOUT.csv b/test/unit_test_hyfeature/channel_forcing/201512020600NEXOUT.csv new file mode 100644 index 000000000..ef66c1536 --- /dev/null +++ b/test/unit_test_hyfeature/channel_forcing/201512020600NEXOUT.csv @@ -0,0 +1,8 @@ +feature_id,201512020600 +10238,12966900.0 +1000000001,12966900.0 +2,12966900.0 +4,12966900.0 +10236,12966900.0 +3,12966900.0 +10237,12966900.0 diff --git a/test/unit_test_hyfeature/channel_forcing/201512020700NEXOUT.csv b/test/unit_test_hyfeature/channel_forcing/201512020700NEXOUT.csv new file mode 100644 index 000000000..1dc872679 --- /dev/null +++ b/test/unit_test_hyfeature/channel_forcing/201512020700NEXOUT.csv @@ -0,0 +1,8 @@ +feature_id,201512020700 +10238,14436200.0 +1000000001,14436200.0 +2,14436200.0 +4,14436200.0 +10236,14436200.0 +3,14436200.0 +10237,14436200.0 diff --git a/test/unit_test_hyfeature/channel_forcing/201512020800NEXOUT.csv b/test/unit_test_hyfeature/channel_forcing/201512020800NEXOUT.csv new file mode 100644 index 000000000..2f305c40d --- /dev/null +++ b/test/unit_test_hyfeature/channel_forcing/201512020800NEXOUT.csv @@ -0,0 +1,8 @@ +feature_id,201512020800 +10238,12987400.0 +1000000001,12987400.0 +2,12987400.0 +4,12987400.0 +10236,12987400.0 +3,12987400.0 +10237,12987400.0 diff --git a/test/unit_test_hyfeature/channel_forcing/201512020900NEXOUT.csv b/test/unit_test_hyfeature/channel_forcing/201512020900NEXOUT.csv new file mode 100644 index 000000000..539eae71a --- /dev/null +++ b/test/unit_test_hyfeature/channel_forcing/201512020900NEXOUT.csv @@ -0,0 +1,8 @@ +feature_id,201512020900 +10238,14417800.0 +1000000001,14417800.0 +2,14417800.0 +4,14417800.0 +10236,14417800.0 +3,14417800.0 +10237,14417800.0 diff --git a/test/unit_test_hyfeature/channel_forcing/201512021000NEXOUT.csv b/test/unit_test_hyfeature/channel_forcing/201512021000NEXOUT.csv new file mode 100644 index 000000000..73f650e00 --- /dev/null +++ b/test/unit_test_hyfeature/channel_forcing/201512021000NEXOUT.csv @@ -0,0 +1,8 @@ +feature_id,201512021000 +10238,13006700.0 +1000000001,13006700.0 +2,13006700.0 +4,13006700.0 +10236,13006700.0 +3,13006700.0 +10237,13006700.0 diff --git a/test/unit_test_hyfeature/channel_forcing/201512021100NEXOUT.csv b/test/unit_test_hyfeature/channel_forcing/201512021100NEXOUT.csv new file mode 100644 index 000000000..204dbbabf --- /dev/null +++ b/test/unit_test_hyfeature/channel_forcing/201512021100NEXOUT.csv @@ -0,0 +1,8 @@ +feature_id,201512021100 +10238,14400400.0 +1000000001,14400400.0 +2,14400400.0 +4,14400400.0 +10236,14400400.0 +3,14400400.0 +10237,14400400.0 diff --git a/test/unit_test_hyfeature/channel_forcing/201512021200NEXOUT.csv b/test/unit_test_hyfeature/channel_forcing/201512021200NEXOUT.csv new file mode 100644 index 000000000..243e6b73f --- /dev/null +++ b/test/unit_test_hyfeature/channel_forcing/201512021200NEXOUT.csv @@ -0,0 +1,8 @@ +feature_id,201512021200 +10238,13024900.0 +1000000001,13024900.0 +2,13024900.0 +4,13024900.0 +10236,13024900.0 +3,13024900.0 +10237,13024900.0 diff --git a/test/unit_test_hyfeature/channel_forcing/201512021300NEXOUT.csv b/test/unit_test_hyfeature/channel_forcing/201512021300NEXOUT.csv new file mode 100644 index 000000000..841508ecc --- /dev/null +++ b/test/unit_test_hyfeature/channel_forcing/201512021300NEXOUT.csv @@ -0,0 +1,8 @@ +feature_id,201512021300 +10238,14384000.0 +1000000001,14384000.0 +2,14384000.0 +4,14384000.0 +10236,14384000.0 +3,14384000.0 +10237,14384000.0 diff --git a/test/unit_test_hyfeature/channel_forcing/201512021400NEXOUT.csv b/test/unit_test_hyfeature/channel_forcing/201512021400NEXOUT.csv new file mode 100644 index 000000000..abde31155 --- /dev/null +++ b/test/unit_test_hyfeature/channel_forcing/201512021400NEXOUT.csv @@ -0,0 +1,8 @@ +feature_id,201512021400 +10238,13042100.0 +1000000001,13042100.0 +2,13042100.0 +4,13042100.0 +10236,13042100.0 +3,13042100.0 +10237,13042100.0 diff --git a/test/unit_test_hyfeature/channel_forcing/201512021500NEXOUT.csv b/test/unit_test_hyfeature/channel_forcing/201512021500NEXOUT.csv new file mode 100644 index 000000000..20c1492f2 --- /dev/null +++ b/test/unit_test_hyfeature/channel_forcing/201512021500NEXOUT.csv @@ -0,0 +1,8 @@ +feature_id,201512021500 +10238,14368600.0 +1000000001,14368600.0 +2,14368600.0 +4,14368600.0 +10236,14368600.0 +3,14368600.0 +10237,14368600.0 diff --git a/test/unit_test_hyfeature/channel_forcing/201512021600NEXOUT.csv b/test/unit_test_hyfeature/channel_forcing/201512021600NEXOUT.csv new file mode 100644 index 000000000..4b0552cf6 --- /dev/null +++ b/test/unit_test_hyfeature/channel_forcing/201512021600NEXOUT.csv @@ -0,0 +1,8 @@ +feature_id,201512021600 +10238,13058300.0 +1000000001,13058300.0 +2,13058300.0 +4,13058300.0 +10236,13058300.0 +3,13058300.0 +10237,13058300.0 diff --git a/test/unit_test_hyfeature/channel_forcing/201512021700NEXOUT.csv b/test/unit_test_hyfeature/channel_forcing/201512021700NEXOUT.csv new file mode 100644 index 000000000..0851c11b8 --- /dev/null +++ b/test/unit_test_hyfeature/channel_forcing/201512021700NEXOUT.csv @@ -0,0 +1,8 @@ +feature_id,201512021700 +10238,14354000.0 +1000000001,14354000.0 +2,14354000.0 +4,14354000.0 +10236,14354000.0 +3,14354000.0 +10237,14354000.0 diff --git a/test/unit_test_hyfeature/channel_forcing/201512021800NEXOUT.csv b/test/unit_test_hyfeature/channel_forcing/201512021800NEXOUT.csv new file mode 100644 index 000000000..8a25f3b88 --- /dev/null +++ b/test/unit_test_hyfeature/channel_forcing/201512021800NEXOUT.csv @@ -0,0 +1,8 @@ +feature_id,201512021800 +10238,13073600.0 +1000000001,13073600.0 +2,13073600.0 +4,13073600.0 +10236,13073600.0 +3,13073600.0 +10237,13073600.0 diff --git a/test/unit_test_hyfeature/channel_forcing/201512021900NEXOUT.csv b/test/unit_test_hyfeature/channel_forcing/201512021900NEXOUT.csv new file mode 100644 index 000000000..b32fa7211 --- /dev/null +++ b/test/unit_test_hyfeature/channel_forcing/201512021900NEXOUT.csv @@ -0,0 +1,8 @@ +feature_id,201512021900 +10238,14340200.0 +1000000001,14340200.0 +2,14340200.0 +4,14340200.0 +10236,14340200.0 +3,14340200.0 +10237,14340200.0 diff --git a/test/unit_test_hyfeature/channel_forcing/201512022000NEXOUT.csv b/test/unit_test_hyfeature/channel_forcing/201512022000NEXOUT.csv new file mode 100644 index 000000000..5e633fbcb --- /dev/null +++ b/test/unit_test_hyfeature/channel_forcing/201512022000NEXOUT.csv @@ -0,0 +1,8 @@ +feature_id,201512022000 +10238,13088000.0 +1000000001,13088000.0 +2,13088000.0 +4,13088000.0 +10236,13088000.0 +3,13088000.0 +10237,13088000.0 diff --git a/test/unit_test_hyfeature/channel_forcing/201512022100NEXOUT.csv b/test/unit_test_hyfeature/channel_forcing/201512022100NEXOUT.csv new file mode 100644 index 000000000..53708f36f --- /dev/null +++ b/test/unit_test_hyfeature/channel_forcing/201512022100NEXOUT.csv @@ -0,0 +1,8 @@ +feature_id,201512022100 +10238,14327200.0 +1000000001,14327200.0 +2,14327200.0 +4,14327200.0 +10236,14327200.0 +3,14327200.0 +10237,14327200.0 diff --git a/test/unit_test_hyfeature/channel_forcing/201512022200NEXOUT.csv b/test/unit_test_hyfeature/channel_forcing/201512022200NEXOUT.csv new file mode 100644 index 000000000..dfd4684d4 --- /dev/null +++ b/test/unit_test_hyfeature/channel_forcing/201512022200NEXOUT.csv @@ -0,0 +1,8 @@ +feature_id,201512022200 +10238,13101600.0 +1000000001,13101600.0 +2,13101600.0 +4,13101600.0 +10236,13101600.0 +3,13101600.0 +10237,13101600.0 diff --git a/test/unit_test_hyfeature/channel_forcing/201512022300NEXOUT.csv b/test/unit_test_hyfeature/channel_forcing/201512022300NEXOUT.csv new file mode 100644 index 000000000..b184ecc70 --- /dev/null +++ b/test/unit_test_hyfeature/channel_forcing/201512022300NEXOUT.csv @@ -0,0 +1,8 @@ +feature_id,201512022300 +10238,14315000.0 +1000000001,14315000.0 +2,14315000.0 +4,14315000.0 +10236,14315000.0 +3,14315000.0 +10237,14315000.0 diff --git a/test/unit_test_hyfeature/channel_forcing/nex-10236_output.csv b/test/unit_test_hyfeature/channel_forcing/nex-10236_output.csv new file mode 100644 index 000000000..87ab7fa89 --- /dev/null +++ b/test/unit_test_hyfeature/channel_forcing/nex-10236_output.csv @@ -0,0 +1,720 @@ +0, 2015-12-01 00:00:00, 1.0975e+06 +1, 2015-12-01 01:00:00, 9.87666e+06 +2, 2015-12-01 02:00:00, 1.08689e+07 +3, 2015-12-01 03:00:00, 1.45746e+07 +4, 2015-12-01 04:00:00, 1.25571e+07 +5, 2015-12-01 05:00:00, 1.4807e+07 +6, 2015-12-01 06:00:00, 1.26019e+07 +7, 2015-12-01 07:00:00, 1.47672e+07 +8, 2015-12-01 08:00:00, 1.26428e+07 +9, 2015-12-01 09:00:00, 1.47298e+07 +10, 2015-12-01 10:00:00, 1.26815e+07 +11, 2015-12-01 11:00:00, 1.46945e+07 +12, 2015-12-01 12:00:00, 1.2718e+07 +13, 2015-12-01 13:00:00, 1.46613e+07 +14, 2015-12-01 14:00:00, 1.27524e+07 +15, 2015-12-01 15:00:00, 1.463e+07 +16, 2015-12-01 16:00:00, 1.2785e+07 +17, 2015-12-01 17:00:00, 1.46005e+07 +18, 2015-12-01 18:00:00, 1.28157e+07 +19, 2015-12-01 19:00:00, 1.45727e+07 +20, 2015-12-01 20:00:00, 1.28447e+07 +21, 2015-12-01 21:00:00, 1.45464e+07 +22, 2015-12-01 22:00:00, 1.2872e+07 +23, 2015-12-01 23:00:00, 1.45217e+07 +24, 2015-12-02 00:00:00, 1.28979e+07 +25, 2015-12-02 01:00:00, 1.44984e+07 +26, 2015-12-02 02:00:00, 1.29222e+07 +27, 2015-12-02 03:00:00, 1.44765e+07 +28, 2015-12-02 04:00:00, 1.29452e+07 +29, 2015-12-02 05:00:00, 1.44558e+07 +30, 2015-12-02 06:00:00, 1.29669e+07 +31, 2015-12-02 07:00:00, 1.44362e+07 +32, 2015-12-02 08:00:00, 1.29874e+07 +33, 2015-12-02 09:00:00, 1.44178e+07 +34, 2015-12-02 10:00:00, 1.30067e+07 +35, 2015-12-02 11:00:00, 1.44004e+07 +36, 2015-12-02 12:00:00, 1.30249e+07 +37, 2015-12-02 13:00:00, 1.4384e+07 +38, 2015-12-02 14:00:00, 1.30421e+07 +39, 2015-12-02 15:00:00, 1.43686e+07 +40, 2015-12-02 16:00:00, 1.30583e+07 +41, 2015-12-02 17:00:00, 1.4354e+07 +42, 2015-12-02 18:00:00, 1.30736e+07 +43, 2015-12-02 19:00:00, 1.43402e+07 +44, 2015-12-02 20:00:00, 1.3088e+07 +45, 2015-12-02 21:00:00, 1.43272e+07 +46, 2015-12-02 22:00:00, 1.31016e+07 +47, 2015-12-02 23:00:00, 1.4315e+07 +48, 2015-12-03 00:00:00, 1.31144e+07 +49, 2015-12-03 01:00:00, 1.43034e+07 +50, 2015-12-03 02:00:00, 1.31264e+07 +51, 2015-12-03 03:00:00, 1.42925e+07 +52, 2015-12-03 04:00:00, 1.31378e+07 +53, 2015-12-03 05:00:00, 1.42822e+07 +54, 2015-12-03 06:00:00, 1.31485e+07 +55, 2015-12-03 07:00:00, 1.42724e+07 +56, 2015-12-03 08:00:00, 1.31586e+07 +57, 2015-12-03 09:00:00, 1.42632e+07 +58, 2015-12-03 10:00:00, 1.31682e+07 +59, 2015-12-03 11:00:00, 1.42545e+07 +60, 2015-12-03 12:00:00, 1.31771e+07 +61, 2015-12-03 13:00:00, 1.42463e+07 +62, 2015-12-03 14:00:00, 1.31856e+07 +63, 2015-12-03 15:00:00, 1.42386e+07 +64, 2015-12-03 16:00:00, 1.31936e+07 +65, 2015-12-03 17:00:00, 1.42313e+07 +66, 2015-12-03 18:00:00, 1.32011e+07 +67, 2015-12-03 19:00:00, 1.42244e+07 +68, 2015-12-03 20:00:00, 1.32081e+07 +69, 2015-12-03 21:00:00, 1.42179e+07 +70, 2015-12-03 22:00:00, 1.32148e+07 +71, 2015-12-03 23:00:00, 1.42117e+07 +72, 2015-12-04 00:00:00, 1.32211e+07 +73, 2015-12-04 01:00:00, 1.42059e+07 +74, 2015-12-04 02:00:00, 1.3227e+07 +75, 2015-12-04 03:00:00, 1.42004e+07 +76, 2015-12-04 04:00:00, 1.32325e+07 +77, 2015-12-04 05:00:00, 1.41952e+07 +78, 2015-12-04 06:00:00, 1.32378e+07 +79, 2015-12-04 07:00:00, 1.41902e+07 +80, 2015-12-04 08:00:00, 1.32427e+07 +81, 2015-12-04 09:00:00, 1.41856e+07 +82, 2015-12-04 10:00:00, 1.32473e+07 +83, 2015-12-04 11:00:00, 1.41812e+07 +84, 2015-12-04 12:00:00, 1.32517e+07 +85, 2015-12-04 13:00:00, 1.41771e+07 +86, 2015-12-04 14:00:00, 1.32558e+07 +87, 2015-12-04 15:00:00, 1.41731e+07 +88, 2015-12-04 16:00:00, 1.32597e+07 +89, 2015-12-04 17:00:00, 1.41694e+07 +90, 2015-12-04 18:00:00, 1.32633e+07 +91, 2015-12-04 19:00:00, 1.41659e+07 +92, 2015-12-04 20:00:00, 1.32668e+07 +93, 2015-12-04 21:00:00, 1.41626e+07 +94, 2015-12-04 22:00:00, 1.327e+07 +95, 2015-12-04 23:00:00, 1.41594e+07 +96, 2015-12-05 00:00:00, 1.3273e+07 +97, 2015-12-05 01:00:00, 1.41565e+07 +98, 2015-12-05 02:00:00, 1.32759e+07 +99, 2015-12-05 03:00:00, 1.41537e+07 +100, 2015-12-05 04:00:00, 1.32785e+07 +101, 2015-12-05 05:00:00, 1.4151e+07 +102, 2015-12-05 06:00:00, 1.32811e+07 +103, 2015-12-05 07:00:00, 1.41485e+07 +104, 2015-12-05 08:00:00, 1.32834e+07 +105, 2015-12-05 09:00:00, 1.41461e+07 +106, 2015-12-05 10:00:00, 1.32857e+07 +107, 2015-12-05 11:00:00, 1.41439e+07 +108, 2015-12-05 12:00:00, 1.32878e+07 +109, 2015-12-05 13:00:00, 1.41418e+07 +110, 2015-12-05 14:00:00, 1.32898e+07 +111, 2015-12-05 15:00:00, 1.41397e+07 +112, 2015-12-05 16:00:00, 1.32916e+07 +113, 2015-12-05 17:00:00, 1.41378e+07 +114, 2015-12-05 18:00:00, 1.32934e+07 +115, 2015-12-05 19:00:00, 1.4136e+07 +116, 2015-12-05 20:00:00, 1.3295e+07 +117, 2015-12-05 21:00:00, 1.41343e+07 +118, 2015-12-05 22:00:00, 1.32965e+07 +119, 2015-12-05 23:00:00, 1.41327e+07 +120, 2015-12-06 00:00:00, 1.3298e+07 +121, 2015-12-06 01:00:00, 1.41312e+07 +122, 2015-12-06 02:00:00, 1.32993e+07 +123, 2015-12-06 03:00:00, 1.41297e+07 +124, 2015-12-06 04:00:00, 1.33006e+07 +125, 2015-12-06 05:00:00, 1.41284e+07 +126, 2015-12-06 06:00:00, 1.33018e+07 +127, 2015-12-06 07:00:00, 1.41271e+07 +128, 2015-12-06 08:00:00, 1.3303e+07 +129, 2015-12-06 09:00:00, 1.41259e+07 +130, 2015-12-06 10:00:00, 1.3304e+07 +131, 2015-12-06 11:00:00, 1.41247e+07 +132, 2015-12-06 12:00:00, 1.3305e+07 +133, 2015-12-06 13:00:00, 1.41236e+07 +134, 2015-12-06 14:00:00, 1.3306e+07 +135, 2015-12-06 15:00:00, 1.41226e+07 +136, 2015-12-06 16:00:00, 1.33068e+07 +137, 2015-12-06 17:00:00, 1.41216e+07 +138, 2015-12-06 18:00:00, 1.33077e+07 +139, 2015-12-06 19:00:00, 1.41206e+07 +140, 2015-12-06 20:00:00, 1.33084e+07 +141, 2015-12-06 21:00:00, 1.41198e+07 +142, 2015-12-06 22:00:00, 1.33092e+07 +143, 2015-12-06 23:00:00, 1.41189e+07 +144, 2015-12-07 00:00:00, 1.33098e+07 +145, 2015-12-07 01:00:00, 1.41181e+07 +146, 2015-12-07 02:00:00, 1.33105e+07 +147, 2015-12-07 03:00:00, 1.41174e+07 +148, 2015-12-07 04:00:00, 1.33111e+07 +149, 2015-12-07 05:00:00, 1.41167e+07 +150, 2015-12-07 06:00:00, 1.33116e+07 +151, 2015-12-07 07:00:00, 1.4116e+07 +152, 2015-12-07 08:00:00, 1.33122e+07 +153, 2015-12-07 09:00:00, 1.41153e+07 +154, 2015-12-07 10:00:00, 1.33127e+07 +155, 2015-12-07 11:00:00, 1.41147e+07 +156, 2015-12-07 12:00:00, 1.33131e+07 +157, 2015-12-07 13:00:00, 1.41142e+07 +158, 2015-12-07 14:00:00, 1.33136e+07 +159, 2015-12-07 15:00:00, 1.41136e+07 +160, 2015-12-07 16:00:00, 1.3314e+07 +161, 2015-12-07 17:00:00, 1.41131e+07 +162, 2015-12-07 18:00:00, 1.33144e+07 +163, 2015-12-07 19:00:00, 1.41126e+07 +164, 2015-12-07 20:00:00, 1.33147e+07 +165, 2015-12-07 21:00:00, 1.41122e+07 +166, 2015-12-07 22:00:00, 1.33151e+07 +167, 2015-12-07 23:00:00, 1.41117e+07 +168, 2015-12-08 00:00:00, 1.33154e+07 +169, 2015-12-08 01:00:00, 1.41113e+07 +170, 2015-12-08 02:00:00, 1.33157e+07 +171, 2015-12-08 03:00:00, 1.41109e+07 +172, 2015-12-08 04:00:00, 1.3316e+07 +173, 2015-12-08 05:00:00, 1.41105e+07 +174, 2015-12-08 06:00:00, 1.33162e+07 +175, 2015-12-08 07:00:00, 1.41102e+07 +176, 2015-12-08 08:00:00, 1.33165e+07 +177, 2015-12-08 09:00:00, 1.41099e+07 +178, 2015-12-08 10:00:00, 1.33167e+07 +179, 2015-12-08 11:00:00, 1.41095e+07 +180, 2015-12-08 12:00:00, 1.33169e+07 +181, 2015-12-08 13:00:00, 1.41092e+07 +182, 2015-12-08 14:00:00, 1.33171e+07 +183, 2015-12-08 15:00:00, 1.4109e+07 +184, 2015-12-08 16:00:00, 1.33173e+07 +185, 2015-12-08 17:00:00, 1.41087e+07 +186, 2015-12-08 18:00:00, 1.33175e+07 +187, 2015-12-08 19:00:00, 1.41084e+07 +188, 2015-12-08 20:00:00, 1.33177e+07 +189, 2015-12-08 21:00:00, 1.41082e+07 +190, 2015-12-08 22:00:00, 1.33178e+07 +191, 2015-12-08 23:00:00, 1.4108e+07 +192, 2015-12-09 00:00:00, 1.3318e+07 +193, 2015-12-09 01:00:00, 1.41077e+07 +194, 2015-12-09 02:00:00, 1.33181e+07 +195, 2015-12-09 03:00:00, 1.41075e+07 +196, 2015-12-09 04:00:00, 1.33182e+07 +197, 2015-12-09 05:00:00, 1.41073e+07 +198, 2015-12-09 06:00:00, 1.33183e+07 +199, 2015-12-09 07:00:00, 1.41072e+07 +200, 2015-12-09 08:00:00, 1.33184e+07 +201, 2015-12-09 09:00:00, 1.4107e+07 +202, 2015-12-09 10:00:00, 1.33185e+07 +203, 2015-12-09 11:00:00, 1.41068e+07 +204, 2015-12-09 12:00:00, 1.33186e+07 +205, 2015-12-09 13:00:00, 1.41067e+07 +206, 2015-12-09 14:00:00, 1.33187e+07 +207, 2015-12-09 15:00:00, 1.41065e+07 +208, 2015-12-09 16:00:00, 1.33188e+07 +209, 2015-12-09 17:00:00, 1.41064e+07 +210, 2015-12-09 18:00:00, 1.33189e+07 +211, 2015-12-09 19:00:00, 1.41062e+07 +212, 2015-12-09 20:00:00, 1.3319e+07 +213, 2015-12-09 21:00:00, 1.41061e+07 +214, 2015-12-09 22:00:00, 1.3319e+07 +215, 2015-12-09 23:00:00, 1.4106e+07 +216, 2015-12-10 00:00:00, 1.33191e+07 +217, 2015-12-10 01:00:00, 1.41059e+07 +218, 2015-12-10 02:00:00, 1.33192e+07 +219, 2015-12-10 03:00:00, 1.41058e+07 +220, 2015-12-10 04:00:00, 1.33192e+07 +221, 2015-12-10 05:00:00, 1.41057e+07 +222, 2015-12-10 06:00:00, 1.33193e+07 +223, 2015-12-10 07:00:00, 1.41056e+07 +224, 2015-12-10 08:00:00, 1.33193e+07 +225, 2015-12-10 09:00:00, 1.41055e+07 +226, 2015-12-10 10:00:00, 1.33194e+07 +227, 2015-12-10 11:00:00, 1.41054e+07 +228, 2015-12-10 12:00:00, 1.33194e+07 +229, 2015-12-10 13:00:00, 1.41053e+07 +230, 2015-12-10 14:00:00, 1.33195e+07 +231, 2015-12-10 15:00:00, 1.41052e+07 +232, 2015-12-10 16:00:00, 1.33195e+07 +233, 2015-12-10 17:00:00, 1.41051e+07 +234, 2015-12-10 18:00:00, 1.33195e+07 +235, 2015-12-10 19:00:00, 1.41051e+07 +236, 2015-12-10 20:00:00, 1.33196e+07 +237, 2015-12-10 21:00:00, 1.4105e+07 +238, 2015-12-10 22:00:00, 1.33196e+07 +239, 2015-12-10 23:00:00, 1.41049e+07 +240, 2015-12-11 00:00:00, 1.33196e+07 +241, 2015-12-11 01:00:00, 1.41049e+07 +242, 2015-12-11 02:00:00, 1.33197e+07 +243, 2015-12-11 03:00:00, 1.41048e+07 +244, 2015-12-11 04:00:00, 1.33197e+07 +245, 2015-12-11 05:00:00, 1.41048e+07 +246, 2015-12-11 06:00:00, 1.33197e+07 +247, 2015-12-11 07:00:00, 1.41047e+07 +248, 2015-12-11 08:00:00, 1.33197e+07 +249, 2015-12-11 09:00:00, 1.41047e+07 +250, 2015-12-11 10:00:00, 1.33197e+07 +251, 2015-12-11 11:00:00, 1.41046e+07 +252, 2015-12-11 12:00:00, 1.33198e+07 +253, 2015-12-11 13:00:00, 1.41046e+07 +254, 2015-12-11 14:00:00, 1.33198e+07 +255, 2015-12-11 15:00:00, 1.41045e+07 +256, 2015-12-11 16:00:00, 1.33198e+07 +257, 2015-12-11 17:00:00, 1.41045e+07 +258, 2015-12-11 18:00:00, 1.33198e+07 +259, 2015-12-11 19:00:00, 1.41044e+07 +260, 2015-12-11 20:00:00, 1.33198e+07 +261, 2015-12-11 21:00:00, 1.41044e+07 +262, 2015-12-11 22:00:00, 1.33198e+07 +263, 2015-12-11 23:00:00, 1.41044e+07 +264, 2015-12-12 00:00:00, 1.33198e+07 +265, 2015-12-12 01:00:00, 1.41043e+07 +266, 2015-12-12 02:00:00, 1.33199e+07 +267, 2015-12-12 03:00:00, 1.41043e+07 +268, 2015-12-12 04:00:00, 1.33199e+07 +269, 2015-12-12 05:00:00, 1.41043e+07 +270, 2015-12-12 06:00:00, 1.33199e+07 +271, 2015-12-12 07:00:00, 1.41043e+07 +272, 2015-12-12 08:00:00, 1.33199e+07 +273, 2015-12-12 09:00:00, 1.41042e+07 +274, 2015-12-12 10:00:00, 1.33199e+07 +275, 2015-12-12 11:00:00, 1.41042e+07 +276, 2015-12-12 12:00:00, 1.33199e+07 +277, 2015-12-12 13:00:00, 1.41042e+07 +278, 2015-12-12 14:00:00, 1.33199e+07 +279, 2015-12-12 15:00:00, 1.41042e+07 +280, 2015-12-12 16:00:00, 1.33199e+07 +281, 2015-12-12 17:00:00, 1.41041e+07 +282, 2015-12-12 18:00:00, 1.33199e+07 +283, 2015-12-12 19:00:00, 1.41041e+07 +284, 2015-12-12 20:00:00, 1.33199e+07 +285, 2015-12-12 21:00:00, 1.41041e+07 +286, 2015-12-12 22:00:00, 1.33199e+07 +287, 2015-12-12 23:00:00, 1.41041e+07 +288, 2015-12-13 00:00:00, 1.33199e+07 +289, 2015-12-13 01:00:00, 1.41041e+07 +290, 2015-12-13 02:00:00, 1.33199e+07 +291, 2015-12-13 03:00:00, 1.41041e+07 +292, 2015-12-13 04:00:00, 1.33199e+07 +293, 2015-12-13 05:00:00, 1.4104e+07 +294, 2015-12-13 06:00:00, 1.332e+07 +295, 2015-12-13 07:00:00, 1.4104e+07 +296, 2015-12-13 08:00:00, 1.332e+07 +297, 2015-12-13 09:00:00, 1.4104e+07 +298, 2015-12-13 10:00:00, 1.332e+07 +299, 2015-12-13 11:00:00, 1.4104e+07 +300, 2015-12-13 12:00:00, 1.332e+07 +301, 2015-12-13 13:00:00, 1.4104e+07 +302, 2015-12-13 14:00:00, 1.332e+07 +303, 2015-12-13 15:00:00, 1.4104e+07 +304, 2015-12-13 16:00:00, 1.332e+07 +305, 2015-12-13 17:00:00, 1.4104e+07 +306, 2015-12-13 18:00:00, 1.332e+07 +307, 2015-12-13 19:00:00, 1.41039e+07 +308, 2015-12-13 20:00:00, 1.332e+07 +309, 2015-12-13 21:00:00, 1.41039e+07 +310, 2015-12-13 22:00:00, 1.332e+07 +311, 2015-12-13 23:00:00, 1.41039e+07 +312, 2015-12-14 00:00:00, 1.332e+07 +313, 2015-12-14 01:00:00, 1.41039e+07 +314, 2015-12-14 02:00:00, 1.332e+07 +315, 2015-12-14 03:00:00, 1.41039e+07 +316, 2015-12-14 04:00:00, 1.332e+07 +317, 2015-12-14 05:00:00, 1.41039e+07 +318, 2015-12-14 06:00:00, 1.332e+07 +319, 2015-12-14 07:00:00, 1.41039e+07 +320, 2015-12-14 08:00:00, 1.332e+07 +321, 2015-12-14 09:00:00, 1.41039e+07 +322, 2015-12-14 10:00:00, 1.332e+07 +323, 2015-12-14 11:00:00, 1.41039e+07 +324, 2015-12-14 12:00:00, 1.332e+07 +325, 2015-12-14 13:00:00, 1.41039e+07 +326, 2015-12-14 14:00:00, 1.332e+07 +327, 2015-12-14 15:00:00, 1.41039e+07 +328, 2015-12-14 16:00:00, 1.332e+07 +329, 2015-12-14 17:00:00, 1.41039e+07 +330, 2015-12-14 18:00:00, 1.332e+07 +331, 2015-12-14 19:00:00, 1.41039e+07 +332, 2015-12-14 20:00:00, 1.332e+07 +333, 2015-12-14 21:00:00, 1.41039e+07 +334, 2015-12-14 22:00:00, 1.332e+07 +335, 2015-12-14 23:00:00, 1.41038e+07 +336, 2015-12-15 00:00:00, 1.332e+07 +337, 2015-12-15 01:00:00, 1.41038e+07 +338, 2015-12-15 02:00:00, 1.332e+07 +339, 2015-12-15 03:00:00, 1.41038e+07 +340, 2015-12-15 04:00:00, 1.332e+07 +341, 2015-12-15 05:00:00, 1.41038e+07 +342, 2015-12-15 06:00:00, 1.332e+07 +343, 2015-12-15 07:00:00, 1.41038e+07 +344, 2015-12-15 08:00:00, 1.332e+07 +345, 2015-12-15 09:00:00, 1.41038e+07 +346, 2015-12-15 10:00:00, 1.332e+07 +347, 2015-12-15 11:00:00, 1.41038e+07 +348, 2015-12-15 12:00:00, 1.332e+07 +349, 2015-12-15 13:00:00, 1.41038e+07 +350, 2015-12-15 14:00:00, 1.332e+07 +351, 2015-12-15 15:00:00, 1.41038e+07 +352, 2015-12-15 16:00:00, 1.332e+07 +353, 2015-12-15 17:00:00, 1.41038e+07 +354, 2015-12-15 18:00:00, 1.332e+07 +355, 2015-12-15 19:00:00, 1.41038e+07 +356, 2015-12-15 20:00:00, 1.332e+07 +357, 2015-12-15 21:00:00, 1.41038e+07 +358, 2015-12-15 22:00:00, 1.332e+07 +359, 2015-12-15 23:00:00, 1.41038e+07 +360, 2015-12-16 00:00:00, 1.332e+07 +361, 2015-12-16 01:00:00, 1.41038e+07 +362, 2015-12-16 02:00:00, 1.332e+07 +363, 2015-12-16 03:00:00, 1.41038e+07 +364, 2015-12-16 04:00:00, 1.332e+07 +365, 2015-12-16 05:00:00, 1.41038e+07 +366, 2015-12-16 06:00:00, 1.332e+07 +367, 2015-12-16 07:00:00, 1.41038e+07 +368, 2015-12-16 08:00:00, 1.332e+07 +369, 2015-12-16 09:00:00, 1.41038e+07 +370, 2015-12-16 10:00:00, 1.332e+07 +371, 2015-12-16 11:00:00, 1.41038e+07 +372, 2015-12-16 12:00:00, 1.332e+07 +373, 2015-12-16 13:00:00, 1.41038e+07 +374, 2015-12-16 14:00:00, 1.332e+07 +375, 2015-12-16 15:00:00, 1.41038e+07 +376, 2015-12-16 16:00:00, 1.332e+07 +377, 2015-12-16 17:00:00, 1.41038e+07 +378, 2015-12-16 18:00:00, 1.332e+07 +379, 2015-12-16 19:00:00, 1.41038e+07 +380, 2015-12-16 20:00:00, 1.332e+07 +381, 2015-12-16 21:00:00, 1.41038e+07 +382, 2015-12-16 22:00:00, 1.332e+07 +383, 2015-12-16 23:00:00, 1.41038e+07 +384, 2015-12-17 00:00:00, 1.332e+07 +385, 2015-12-17 01:00:00, 1.41038e+07 +386, 2015-12-17 02:00:00, 1.332e+07 +387, 2015-12-17 03:00:00, 1.41038e+07 +388, 2015-12-17 04:00:00, 1.332e+07 +389, 2015-12-17 05:00:00, 1.41038e+07 +390, 2015-12-17 06:00:00, 1.332e+07 +391, 2015-12-17 07:00:00, 1.41038e+07 +392, 2015-12-17 08:00:00, 1.332e+07 +393, 2015-12-17 09:00:00, 1.41038e+07 +394, 2015-12-17 10:00:00, 1.332e+07 +395, 2015-12-17 11:00:00, 1.41038e+07 +396, 2015-12-17 12:00:00, 1.332e+07 +397, 2015-12-17 13:00:00, 1.41038e+07 +398, 2015-12-17 14:00:00, 1.332e+07 +399, 2015-12-17 15:00:00, 1.41038e+07 +400, 2015-12-17 16:00:00, 1.332e+07 +401, 2015-12-17 17:00:00, 1.41038e+07 +402, 2015-12-17 18:00:00, 1.332e+07 +403, 2015-12-17 19:00:00, 1.41038e+07 +404, 2015-12-17 20:00:00, 1.332e+07 +405, 2015-12-17 21:00:00, 1.41038e+07 +406, 2015-12-17 22:00:00, 1.332e+07 +407, 2015-12-17 23:00:00, 1.41038e+07 +408, 2015-12-18 00:00:00, 1.332e+07 +409, 2015-12-18 01:00:00, 1.41038e+07 +410, 2015-12-18 02:00:00, 1.332e+07 +411, 2015-12-18 03:00:00, 1.41038e+07 +412, 2015-12-18 04:00:00, 1.332e+07 +413, 2015-12-18 05:00:00, 1.41038e+07 +414, 2015-12-18 06:00:00, 1.332e+07 +415, 2015-12-18 07:00:00, 1.41038e+07 +416, 2015-12-18 08:00:00, 1.332e+07 +417, 2015-12-18 09:00:00, 1.41038e+07 +418, 2015-12-18 10:00:00, 1.332e+07 +419, 2015-12-18 11:00:00, 1.41038e+07 +420, 2015-12-18 12:00:00, 1.332e+07 +421, 2015-12-18 13:00:00, 1.41038e+07 +422, 2015-12-18 14:00:00, 1.332e+07 +423, 2015-12-18 15:00:00, 1.41038e+07 +424, 2015-12-18 16:00:00, 1.332e+07 +425, 2015-12-18 17:00:00, 1.41038e+07 +426, 2015-12-18 18:00:00, 1.332e+07 +427, 2015-12-18 19:00:00, 1.41038e+07 +428, 2015-12-18 20:00:00, 1.332e+07 +429, 2015-12-18 21:00:00, 1.41038e+07 +430, 2015-12-18 22:00:00, 1.332e+07 +431, 2015-12-18 23:00:00, 1.41038e+07 +432, 2015-12-19 00:00:00, 1.332e+07 +433, 2015-12-19 01:00:00, 1.41038e+07 +434, 2015-12-19 02:00:00, 1.332e+07 +435, 2015-12-19 03:00:00, 1.41038e+07 +436, 2015-12-19 04:00:00, 1.332e+07 +437, 2015-12-19 05:00:00, 1.41038e+07 +438, 2015-12-19 06:00:00, 1.332e+07 +439, 2015-12-19 07:00:00, 1.41038e+07 +440, 2015-12-19 08:00:00, 1.332e+07 +441, 2015-12-19 09:00:00, 1.41038e+07 +442, 2015-12-19 10:00:00, 1.332e+07 +443, 2015-12-19 11:00:00, 1.41038e+07 +444, 2015-12-19 12:00:00, 1.332e+07 +445, 2015-12-19 13:00:00, 1.41038e+07 +446, 2015-12-19 14:00:00, 1.332e+07 +447, 2015-12-19 15:00:00, 1.41038e+07 +448, 2015-12-19 16:00:00, 1.332e+07 +449, 2015-12-19 17:00:00, 1.41038e+07 +450, 2015-12-19 18:00:00, 1.332e+07 +451, 2015-12-19 19:00:00, 1.41038e+07 +452, 2015-12-19 20:00:00, 1.332e+07 +453, 2015-12-19 21:00:00, 1.41038e+07 +454, 2015-12-19 22:00:00, 1.332e+07 +455, 2015-12-19 23:00:00, 1.41038e+07 +456, 2015-12-20 00:00:00, 1.332e+07 +457, 2015-12-20 01:00:00, 1.41038e+07 +458, 2015-12-20 02:00:00, 1.332e+07 +459, 2015-12-20 03:00:00, 1.41038e+07 +460, 2015-12-20 04:00:00, 1.332e+07 +461, 2015-12-20 05:00:00, 1.41038e+07 +462, 2015-12-20 06:00:00, 1.332e+07 +463, 2015-12-20 07:00:00, 1.41038e+07 +464, 2015-12-20 08:00:00, 1.332e+07 +465, 2015-12-20 09:00:00, 1.41038e+07 +466, 2015-12-20 10:00:00, 1.332e+07 +467, 2015-12-20 11:00:00, 1.41038e+07 +468, 2015-12-20 12:00:00, 1.332e+07 +469, 2015-12-20 13:00:00, 1.41038e+07 +470, 2015-12-20 14:00:00, 1.332e+07 +471, 2015-12-20 15:00:00, 1.41038e+07 +472, 2015-12-20 16:00:00, 1.332e+07 +473, 2015-12-20 17:00:00, 1.41038e+07 +474, 2015-12-20 18:00:00, 1.332e+07 +475, 2015-12-20 19:00:00, 1.41038e+07 +476, 2015-12-20 20:00:00, 1.332e+07 +477, 2015-12-20 21:00:00, 1.41038e+07 +478, 2015-12-20 22:00:00, 1.332e+07 +479, 2015-12-20 23:00:00, 1.41038e+07 +480, 2015-12-21 00:00:00, 1.332e+07 +481, 2015-12-21 01:00:00, 1.41038e+07 +482, 2015-12-21 02:00:00, 1.332e+07 +483, 2015-12-21 03:00:00, 1.41038e+07 +484, 2015-12-21 04:00:00, 1.332e+07 +485, 2015-12-21 05:00:00, 1.41038e+07 +486, 2015-12-21 06:00:00, 1.332e+07 +487, 2015-12-21 07:00:00, 1.41038e+07 +488, 2015-12-21 08:00:00, 1.332e+07 +489, 2015-12-21 09:00:00, 1.41038e+07 +490, 2015-12-21 10:00:00, 1.332e+07 +491, 2015-12-21 11:00:00, 1.41038e+07 +492, 2015-12-21 12:00:00, 1.332e+07 +493, 2015-12-21 13:00:00, 1.41038e+07 +494, 2015-12-21 14:00:00, 1.332e+07 +495, 2015-12-21 15:00:00, 1.41038e+07 +496, 2015-12-21 16:00:00, 1.332e+07 +497, 2015-12-21 17:00:00, 1.41038e+07 +498, 2015-12-21 18:00:00, 1.332e+07 +499, 2015-12-21 19:00:00, 1.41038e+07 +500, 2015-12-21 20:00:00, 1.332e+07 +501, 2015-12-21 21:00:00, 1.41038e+07 +502, 2015-12-21 22:00:00, 1.332e+07 +503, 2015-12-21 23:00:00, 1.41038e+07 +504, 2015-12-22 00:00:00, 1.332e+07 +505, 2015-12-22 01:00:00, 1.41038e+07 +506, 2015-12-22 02:00:00, 1.332e+07 +507, 2015-12-22 03:00:00, 1.41038e+07 +508, 2015-12-22 04:00:00, 1.332e+07 +509, 2015-12-22 05:00:00, 1.41038e+07 +510, 2015-12-22 06:00:00, 1.332e+07 +511, 2015-12-22 07:00:00, 1.41038e+07 +512, 2015-12-22 08:00:00, 1.332e+07 +513, 2015-12-22 09:00:00, 1.41038e+07 +514, 2015-12-22 10:00:00, 1.332e+07 +515, 2015-12-22 11:00:00, 1.41038e+07 +516, 2015-12-22 12:00:00, 1.332e+07 +517, 2015-12-22 13:00:00, 1.41038e+07 +518, 2015-12-22 14:00:00, 1.332e+07 +519, 2015-12-22 15:00:00, 1.41038e+07 +520, 2015-12-22 16:00:00, 1.332e+07 +521, 2015-12-22 17:00:00, 1.41038e+07 +522, 2015-12-22 18:00:00, 1.332e+07 +523, 2015-12-22 19:00:00, 1.41038e+07 +524, 2015-12-22 20:00:00, 1.332e+07 +525, 2015-12-22 21:00:00, 1.41038e+07 +526, 2015-12-22 22:00:00, 1.332e+07 +527, 2015-12-22 23:00:00, 1.41038e+07 +528, 2015-12-23 00:00:00, 1.332e+07 +529, 2015-12-23 01:00:00, 1.41038e+07 +530, 2015-12-23 02:00:00, 1.332e+07 +531, 2015-12-23 03:00:00, 1.41038e+07 +532, 2015-12-23 04:00:00, 1.332e+07 +533, 2015-12-23 05:00:00, 1.41038e+07 +534, 2015-12-23 06:00:00, 1.332e+07 +535, 2015-12-23 07:00:00, 1.41038e+07 +536, 2015-12-23 08:00:00, 1.332e+07 +537, 2015-12-23 09:00:00, 1.41038e+07 +538, 2015-12-23 10:00:00, 1.332e+07 +539, 2015-12-23 11:00:00, 1.41038e+07 +540, 2015-12-23 12:00:00, 1.332e+07 +541, 2015-12-23 13:00:00, 1.41038e+07 +542, 2015-12-23 14:00:00, 1.332e+07 +543, 2015-12-23 15:00:00, 1.41038e+07 +544, 2015-12-23 16:00:00, 1.332e+07 +545, 2015-12-23 17:00:00, 1.41038e+07 +546, 2015-12-23 18:00:00, 1.332e+07 +547, 2015-12-23 19:00:00, 1.41038e+07 +548, 2015-12-23 20:00:00, 1.332e+07 +549, 2015-12-23 21:00:00, 1.41038e+07 +550, 2015-12-23 22:00:00, 1.332e+07 +551, 2015-12-23 23:00:00, 1.41038e+07 +552, 2015-12-24 00:00:00, 1.332e+07 +553, 2015-12-24 01:00:00, 1.41038e+07 +554, 2015-12-24 02:00:00, 1.332e+07 +555, 2015-12-24 03:00:00, 1.41038e+07 +556, 2015-12-24 04:00:00, 1.332e+07 +557, 2015-12-24 05:00:00, 1.41038e+07 +558, 2015-12-24 06:00:00, 1.332e+07 +559, 2015-12-24 07:00:00, 1.41038e+07 +560, 2015-12-24 08:00:00, 1.332e+07 +561, 2015-12-24 09:00:00, 1.41038e+07 +562, 2015-12-24 10:00:00, 1.332e+07 +563, 2015-12-24 11:00:00, 1.41038e+07 +564, 2015-12-24 12:00:00, 1.332e+07 +565, 2015-12-24 13:00:00, 1.41038e+07 +566, 2015-12-24 14:00:00, 1.332e+07 +567, 2015-12-24 15:00:00, 1.41038e+07 +568, 2015-12-24 16:00:00, 1.332e+07 +569, 2015-12-24 17:00:00, 1.41038e+07 +570, 2015-12-24 18:00:00, 1.332e+07 +571, 2015-12-24 19:00:00, 1.41038e+07 +572, 2015-12-24 20:00:00, 1.332e+07 +573, 2015-12-24 21:00:00, 1.41038e+07 +574, 2015-12-24 22:00:00, 1.332e+07 +575, 2015-12-24 23:00:00, 1.41038e+07 +576, 2015-12-25 00:00:00, 1.332e+07 +577, 2015-12-25 01:00:00, 1.41038e+07 +578, 2015-12-25 02:00:00, 1.332e+07 +579, 2015-12-25 03:00:00, 1.41038e+07 +580, 2015-12-25 04:00:00, 1.332e+07 +581, 2015-12-25 05:00:00, 1.41038e+07 +582, 2015-12-25 06:00:00, 1.332e+07 +583, 2015-12-25 07:00:00, 1.41038e+07 +584, 2015-12-25 08:00:00, 1.332e+07 +585, 2015-12-25 09:00:00, 1.41038e+07 +586, 2015-12-25 10:00:00, 1.332e+07 +587, 2015-12-25 11:00:00, 1.41038e+07 +588, 2015-12-25 12:00:00, 1.332e+07 +589, 2015-12-25 13:00:00, 1.41038e+07 +590, 2015-12-25 14:00:00, 1.332e+07 +591, 2015-12-25 15:00:00, 1.41038e+07 +592, 2015-12-25 16:00:00, 1.332e+07 +593, 2015-12-25 17:00:00, 1.41038e+07 +594, 2015-12-25 18:00:00, 1.332e+07 +595, 2015-12-25 19:00:00, 1.41038e+07 +596, 2015-12-25 20:00:00, 1.332e+07 +597, 2015-12-25 21:00:00, 1.41038e+07 +598, 2015-12-25 22:00:00, 1.332e+07 +599, 2015-12-25 23:00:00, 1.41038e+07 +600, 2015-12-26 00:00:00, 1.332e+07 +601, 2015-12-26 01:00:00, 1.41038e+07 +602, 2015-12-26 02:00:00, 1.332e+07 +603, 2015-12-26 03:00:00, 1.41038e+07 +604, 2015-12-26 04:00:00, 1.332e+07 +605, 2015-12-26 05:00:00, 1.41038e+07 +606, 2015-12-26 06:00:00, 1.332e+07 +607, 2015-12-26 07:00:00, 1.41038e+07 +608, 2015-12-26 08:00:00, 1.332e+07 +609, 2015-12-26 09:00:00, 1.41038e+07 +610, 2015-12-26 10:00:00, 1.332e+07 +611, 2015-12-26 11:00:00, 1.41038e+07 +612, 2015-12-26 12:00:00, 1.332e+07 +613, 2015-12-26 13:00:00, 1.41038e+07 +614, 2015-12-26 14:00:00, 1.332e+07 +615, 2015-12-26 15:00:00, 1.41038e+07 +616, 2015-12-26 16:00:00, 1.332e+07 +617, 2015-12-26 17:00:00, 1.41038e+07 +618, 2015-12-26 18:00:00, 1.332e+07 +619, 2015-12-26 19:00:00, 1.41038e+07 +620, 2015-12-26 20:00:00, 1.332e+07 +621, 2015-12-26 21:00:00, 1.41038e+07 +622, 2015-12-26 22:00:00, 1.332e+07 +623, 2015-12-26 23:00:00, 1.41038e+07 +624, 2015-12-27 00:00:00, 1.332e+07 +625, 2015-12-27 01:00:00, 1.41038e+07 +626, 2015-12-27 02:00:00, 1.332e+07 +627, 2015-12-27 03:00:00, 1.41038e+07 +628, 2015-12-27 04:00:00, 1.332e+07 +629, 2015-12-27 05:00:00, 1.41038e+07 +630, 2015-12-27 06:00:00, 1.332e+07 +631, 2015-12-27 07:00:00, 1.41038e+07 +632, 2015-12-27 08:00:00, 1.332e+07 +633, 2015-12-27 09:00:00, 1.41038e+07 +634, 2015-12-27 10:00:00, 1.332e+07 +635, 2015-12-27 11:00:00, 1.41038e+07 +636, 2015-12-27 12:00:00, 1.332e+07 +637, 2015-12-27 13:00:00, 1.41038e+07 +638, 2015-12-27 14:00:00, 1.332e+07 +639, 2015-12-27 15:00:00, 1.41038e+07 +640, 2015-12-27 16:00:00, 1.332e+07 +641, 2015-12-27 17:00:00, 1.41038e+07 +642, 2015-12-27 18:00:00, 1.332e+07 +643, 2015-12-27 19:00:00, 1.41038e+07 +644, 2015-12-27 20:00:00, 1.332e+07 +645, 2015-12-27 21:00:00, 1.41038e+07 +646, 2015-12-27 22:00:00, 1.332e+07 +647, 2015-12-27 23:00:00, 1.41038e+07 +648, 2015-12-28 00:00:00, 1.332e+07 +649, 2015-12-28 01:00:00, 1.41038e+07 +650, 2015-12-28 02:00:00, 1.332e+07 +651, 2015-12-28 03:00:00, 1.41038e+07 +652, 2015-12-28 04:00:00, 1.332e+07 +653, 2015-12-28 05:00:00, 1.41038e+07 +654, 2015-12-28 06:00:00, 1.332e+07 +655, 2015-12-28 07:00:00, 1.41038e+07 +656, 2015-12-28 08:00:00, 1.332e+07 +657, 2015-12-28 09:00:00, 1.41038e+07 +658, 2015-12-28 10:00:00, 1.332e+07 +659, 2015-12-28 11:00:00, 1.41038e+07 +660, 2015-12-28 12:00:00, 1.332e+07 +661, 2015-12-28 13:00:00, 1.41038e+07 +662, 2015-12-28 14:00:00, 1.332e+07 +663, 2015-12-28 15:00:00, 1.41038e+07 +664, 2015-12-28 16:00:00, 1.332e+07 +665, 2015-12-28 17:00:00, 1.41038e+07 +666, 2015-12-28 18:00:00, 1.332e+07 +667, 2015-12-28 19:00:00, 1.41038e+07 +668, 2015-12-28 20:00:00, 1.332e+07 +669, 2015-12-28 21:00:00, 1.41038e+07 +670, 2015-12-28 22:00:00, 1.332e+07 +671, 2015-12-28 23:00:00, 1.41038e+07 +672, 2015-12-29 00:00:00, 1.332e+07 +673, 2015-12-29 01:00:00, 1.41038e+07 +674, 2015-12-29 02:00:00, 1.332e+07 +675, 2015-12-29 03:00:00, 1.41038e+07 +676, 2015-12-29 04:00:00, 1.332e+07 +677, 2015-12-29 05:00:00, 1.41038e+07 +678, 2015-12-29 06:00:00, 1.332e+07 +679, 2015-12-29 07:00:00, 1.41038e+07 +680, 2015-12-29 08:00:00, 1.332e+07 +681, 2015-12-29 09:00:00, 1.41038e+07 +682, 2015-12-29 10:00:00, 1.332e+07 +683, 2015-12-29 11:00:00, 1.41038e+07 +684, 2015-12-29 12:00:00, 1.332e+07 +685, 2015-12-29 13:00:00, 1.41038e+07 +686, 2015-12-29 14:00:00, 1.332e+07 +687, 2015-12-29 15:00:00, 1.41038e+07 +688, 2015-12-29 16:00:00, 1.332e+07 +689, 2015-12-29 17:00:00, 1.41038e+07 +690, 2015-12-29 18:00:00, 1.332e+07 +691, 2015-12-29 19:00:00, 1.41038e+07 +692, 2015-12-29 20:00:00, 1.332e+07 +693, 2015-12-29 21:00:00, 1.41038e+07 +694, 2015-12-29 22:00:00, 1.332e+07 +695, 2015-12-29 23:00:00, 1.41038e+07 +696, 2015-12-30 00:00:00, 1.332e+07 +697, 2015-12-30 01:00:00, 1.41038e+07 +698, 2015-12-30 02:00:00, 1.332e+07 +699, 2015-12-30 03:00:00, 1.41038e+07 +700, 2015-12-30 04:00:00, 1.332e+07 +701, 2015-12-30 05:00:00, 1.41038e+07 +702, 2015-12-30 06:00:00, 1.332e+07 +703, 2015-12-30 07:00:00, 1.41038e+07 +704, 2015-12-30 08:00:00, 1.332e+07 +705, 2015-12-30 09:00:00, 1.41038e+07 +706, 2015-12-30 10:00:00, 1.332e+07 +707, 2015-12-30 11:00:00, 1.41038e+07 +708, 2015-12-30 12:00:00, 1.332e+07 +709, 2015-12-30 13:00:00, 1.41038e+07 +710, 2015-12-30 14:00:00, 1.332e+07 +711, 2015-12-30 15:00:00, 1.41038e+07 +712, 2015-12-30 16:00:00, 1.332e+07 +713, 2015-12-30 17:00:00, 1.41038e+07 +714, 2015-12-30 18:00:00, 1.332e+07 +715, 2015-12-30 19:00:00, 1.41038e+07 +716, 2015-12-30 20:00:00, 1.332e+07 +717, 2015-12-30 21:00:00, 1.41038e+07 +718, 2015-12-30 22:00:00, 1.332e+07 +719, 2015-12-30 23:00:00, 1.41038e+07 diff --git a/test/unit_test_hyfeature/channel_forcing/nex-10237_output.csv b/test/unit_test_hyfeature/channel_forcing/nex-10237_output.csv new file mode 100644 index 000000000..87ab7fa89 --- /dev/null +++ b/test/unit_test_hyfeature/channel_forcing/nex-10237_output.csv @@ -0,0 +1,720 @@ +0, 2015-12-01 00:00:00, 1.0975e+06 +1, 2015-12-01 01:00:00, 9.87666e+06 +2, 2015-12-01 02:00:00, 1.08689e+07 +3, 2015-12-01 03:00:00, 1.45746e+07 +4, 2015-12-01 04:00:00, 1.25571e+07 +5, 2015-12-01 05:00:00, 1.4807e+07 +6, 2015-12-01 06:00:00, 1.26019e+07 +7, 2015-12-01 07:00:00, 1.47672e+07 +8, 2015-12-01 08:00:00, 1.26428e+07 +9, 2015-12-01 09:00:00, 1.47298e+07 +10, 2015-12-01 10:00:00, 1.26815e+07 +11, 2015-12-01 11:00:00, 1.46945e+07 +12, 2015-12-01 12:00:00, 1.2718e+07 +13, 2015-12-01 13:00:00, 1.46613e+07 +14, 2015-12-01 14:00:00, 1.27524e+07 +15, 2015-12-01 15:00:00, 1.463e+07 +16, 2015-12-01 16:00:00, 1.2785e+07 +17, 2015-12-01 17:00:00, 1.46005e+07 +18, 2015-12-01 18:00:00, 1.28157e+07 +19, 2015-12-01 19:00:00, 1.45727e+07 +20, 2015-12-01 20:00:00, 1.28447e+07 +21, 2015-12-01 21:00:00, 1.45464e+07 +22, 2015-12-01 22:00:00, 1.2872e+07 +23, 2015-12-01 23:00:00, 1.45217e+07 +24, 2015-12-02 00:00:00, 1.28979e+07 +25, 2015-12-02 01:00:00, 1.44984e+07 +26, 2015-12-02 02:00:00, 1.29222e+07 +27, 2015-12-02 03:00:00, 1.44765e+07 +28, 2015-12-02 04:00:00, 1.29452e+07 +29, 2015-12-02 05:00:00, 1.44558e+07 +30, 2015-12-02 06:00:00, 1.29669e+07 +31, 2015-12-02 07:00:00, 1.44362e+07 +32, 2015-12-02 08:00:00, 1.29874e+07 +33, 2015-12-02 09:00:00, 1.44178e+07 +34, 2015-12-02 10:00:00, 1.30067e+07 +35, 2015-12-02 11:00:00, 1.44004e+07 +36, 2015-12-02 12:00:00, 1.30249e+07 +37, 2015-12-02 13:00:00, 1.4384e+07 +38, 2015-12-02 14:00:00, 1.30421e+07 +39, 2015-12-02 15:00:00, 1.43686e+07 +40, 2015-12-02 16:00:00, 1.30583e+07 +41, 2015-12-02 17:00:00, 1.4354e+07 +42, 2015-12-02 18:00:00, 1.30736e+07 +43, 2015-12-02 19:00:00, 1.43402e+07 +44, 2015-12-02 20:00:00, 1.3088e+07 +45, 2015-12-02 21:00:00, 1.43272e+07 +46, 2015-12-02 22:00:00, 1.31016e+07 +47, 2015-12-02 23:00:00, 1.4315e+07 +48, 2015-12-03 00:00:00, 1.31144e+07 +49, 2015-12-03 01:00:00, 1.43034e+07 +50, 2015-12-03 02:00:00, 1.31264e+07 +51, 2015-12-03 03:00:00, 1.42925e+07 +52, 2015-12-03 04:00:00, 1.31378e+07 +53, 2015-12-03 05:00:00, 1.42822e+07 +54, 2015-12-03 06:00:00, 1.31485e+07 +55, 2015-12-03 07:00:00, 1.42724e+07 +56, 2015-12-03 08:00:00, 1.31586e+07 +57, 2015-12-03 09:00:00, 1.42632e+07 +58, 2015-12-03 10:00:00, 1.31682e+07 +59, 2015-12-03 11:00:00, 1.42545e+07 +60, 2015-12-03 12:00:00, 1.31771e+07 +61, 2015-12-03 13:00:00, 1.42463e+07 +62, 2015-12-03 14:00:00, 1.31856e+07 +63, 2015-12-03 15:00:00, 1.42386e+07 +64, 2015-12-03 16:00:00, 1.31936e+07 +65, 2015-12-03 17:00:00, 1.42313e+07 +66, 2015-12-03 18:00:00, 1.32011e+07 +67, 2015-12-03 19:00:00, 1.42244e+07 +68, 2015-12-03 20:00:00, 1.32081e+07 +69, 2015-12-03 21:00:00, 1.42179e+07 +70, 2015-12-03 22:00:00, 1.32148e+07 +71, 2015-12-03 23:00:00, 1.42117e+07 +72, 2015-12-04 00:00:00, 1.32211e+07 +73, 2015-12-04 01:00:00, 1.42059e+07 +74, 2015-12-04 02:00:00, 1.3227e+07 +75, 2015-12-04 03:00:00, 1.42004e+07 +76, 2015-12-04 04:00:00, 1.32325e+07 +77, 2015-12-04 05:00:00, 1.41952e+07 +78, 2015-12-04 06:00:00, 1.32378e+07 +79, 2015-12-04 07:00:00, 1.41902e+07 +80, 2015-12-04 08:00:00, 1.32427e+07 +81, 2015-12-04 09:00:00, 1.41856e+07 +82, 2015-12-04 10:00:00, 1.32473e+07 +83, 2015-12-04 11:00:00, 1.41812e+07 +84, 2015-12-04 12:00:00, 1.32517e+07 +85, 2015-12-04 13:00:00, 1.41771e+07 +86, 2015-12-04 14:00:00, 1.32558e+07 +87, 2015-12-04 15:00:00, 1.41731e+07 +88, 2015-12-04 16:00:00, 1.32597e+07 +89, 2015-12-04 17:00:00, 1.41694e+07 +90, 2015-12-04 18:00:00, 1.32633e+07 +91, 2015-12-04 19:00:00, 1.41659e+07 +92, 2015-12-04 20:00:00, 1.32668e+07 +93, 2015-12-04 21:00:00, 1.41626e+07 +94, 2015-12-04 22:00:00, 1.327e+07 +95, 2015-12-04 23:00:00, 1.41594e+07 +96, 2015-12-05 00:00:00, 1.3273e+07 +97, 2015-12-05 01:00:00, 1.41565e+07 +98, 2015-12-05 02:00:00, 1.32759e+07 +99, 2015-12-05 03:00:00, 1.41537e+07 +100, 2015-12-05 04:00:00, 1.32785e+07 +101, 2015-12-05 05:00:00, 1.4151e+07 +102, 2015-12-05 06:00:00, 1.32811e+07 +103, 2015-12-05 07:00:00, 1.41485e+07 +104, 2015-12-05 08:00:00, 1.32834e+07 +105, 2015-12-05 09:00:00, 1.41461e+07 +106, 2015-12-05 10:00:00, 1.32857e+07 +107, 2015-12-05 11:00:00, 1.41439e+07 +108, 2015-12-05 12:00:00, 1.32878e+07 +109, 2015-12-05 13:00:00, 1.41418e+07 +110, 2015-12-05 14:00:00, 1.32898e+07 +111, 2015-12-05 15:00:00, 1.41397e+07 +112, 2015-12-05 16:00:00, 1.32916e+07 +113, 2015-12-05 17:00:00, 1.41378e+07 +114, 2015-12-05 18:00:00, 1.32934e+07 +115, 2015-12-05 19:00:00, 1.4136e+07 +116, 2015-12-05 20:00:00, 1.3295e+07 +117, 2015-12-05 21:00:00, 1.41343e+07 +118, 2015-12-05 22:00:00, 1.32965e+07 +119, 2015-12-05 23:00:00, 1.41327e+07 +120, 2015-12-06 00:00:00, 1.3298e+07 +121, 2015-12-06 01:00:00, 1.41312e+07 +122, 2015-12-06 02:00:00, 1.32993e+07 +123, 2015-12-06 03:00:00, 1.41297e+07 +124, 2015-12-06 04:00:00, 1.33006e+07 +125, 2015-12-06 05:00:00, 1.41284e+07 +126, 2015-12-06 06:00:00, 1.33018e+07 +127, 2015-12-06 07:00:00, 1.41271e+07 +128, 2015-12-06 08:00:00, 1.3303e+07 +129, 2015-12-06 09:00:00, 1.41259e+07 +130, 2015-12-06 10:00:00, 1.3304e+07 +131, 2015-12-06 11:00:00, 1.41247e+07 +132, 2015-12-06 12:00:00, 1.3305e+07 +133, 2015-12-06 13:00:00, 1.41236e+07 +134, 2015-12-06 14:00:00, 1.3306e+07 +135, 2015-12-06 15:00:00, 1.41226e+07 +136, 2015-12-06 16:00:00, 1.33068e+07 +137, 2015-12-06 17:00:00, 1.41216e+07 +138, 2015-12-06 18:00:00, 1.33077e+07 +139, 2015-12-06 19:00:00, 1.41206e+07 +140, 2015-12-06 20:00:00, 1.33084e+07 +141, 2015-12-06 21:00:00, 1.41198e+07 +142, 2015-12-06 22:00:00, 1.33092e+07 +143, 2015-12-06 23:00:00, 1.41189e+07 +144, 2015-12-07 00:00:00, 1.33098e+07 +145, 2015-12-07 01:00:00, 1.41181e+07 +146, 2015-12-07 02:00:00, 1.33105e+07 +147, 2015-12-07 03:00:00, 1.41174e+07 +148, 2015-12-07 04:00:00, 1.33111e+07 +149, 2015-12-07 05:00:00, 1.41167e+07 +150, 2015-12-07 06:00:00, 1.33116e+07 +151, 2015-12-07 07:00:00, 1.4116e+07 +152, 2015-12-07 08:00:00, 1.33122e+07 +153, 2015-12-07 09:00:00, 1.41153e+07 +154, 2015-12-07 10:00:00, 1.33127e+07 +155, 2015-12-07 11:00:00, 1.41147e+07 +156, 2015-12-07 12:00:00, 1.33131e+07 +157, 2015-12-07 13:00:00, 1.41142e+07 +158, 2015-12-07 14:00:00, 1.33136e+07 +159, 2015-12-07 15:00:00, 1.41136e+07 +160, 2015-12-07 16:00:00, 1.3314e+07 +161, 2015-12-07 17:00:00, 1.41131e+07 +162, 2015-12-07 18:00:00, 1.33144e+07 +163, 2015-12-07 19:00:00, 1.41126e+07 +164, 2015-12-07 20:00:00, 1.33147e+07 +165, 2015-12-07 21:00:00, 1.41122e+07 +166, 2015-12-07 22:00:00, 1.33151e+07 +167, 2015-12-07 23:00:00, 1.41117e+07 +168, 2015-12-08 00:00:00, 1.33154e+07 +169, 2015-12-08 01:00:00, 1.41113e+07 +170, 2015-12-08 02:00:00, 1.33157e+07 +171, 2015-12-08 03:00:00, 1.41109e+07 +172, 2015-12-08 04:00:00, 1.3316e+07 +173, 2015-12-08 05:00:00, 1.41105e+07 +174, 2015-12-08 06:00:00, 1.33162e+07 +175, 2015-12-08 07:00:00, 1.41102e+07 +176, 2015-12-08 08:00:00, 1.33165e+07 +177, 2015-12-08 09:00:00, 1.41099e+07 +178, 2015-12-08 10:00:00, 1.33167e+07 +179, 2015-12-08 11:00:00, 1.41095e+07 +180, 2015-12-08 12:00:00, 1.33169e+07 +181, 2015-12-08 13:00:00, 1.41092e+07 +182, 2015-12-08 14:00:00, 1.33171e+07 +183, 2015-12-08 15:00:00, 1.4109e+07 +184, 2015-12-08 16:00:00, 1.33173e+07 +185, 2015-12-08 17:00:00, 1.41087e+07 +186, 2015-12-08 18:00:00, 1.33175e+07 +187, 2015-12-08 19:00:00, 1.41084e+07 +188, 2015-12-08 20:00:00, 1.33177e+07 +189, 2015-12-08 21:00:00, 1.41082e+07 +190, 2015-12-08 22:00:00, 1.33178e+07 +191, 2015-12-08 23:00:00, 1.4108e+07 +192, 2015-12-09 00:00:00, 1.3318e+07 +193, 2015-12-09 01:00:00, 1.41077e+07 +194, 2015-12-09 02:00:00, 1.33181e+07 +195, 2015-12-09 03:00:00, 1.41075e+07 +196, 2015-12-09 04:00:00, 1.33182e+07 +197, 2015-12-09 05:00:00, 1.41073e+07 +198, 2015-12-09 06:00:00, 1.33183e+07 +199, 2015-12-09 07:00:00, 1.41072e+07 +200, 2015-12-09 08:00:00, 1.33184e+07 +201, 2015-12-09 09:00:00, 1.4107e+07 +202, 2015-12-09 10:00:00, 1.33185e+07 +203, 2015-12-09 11:00:00, 1.41068e+07 +204, 2015-12-09 12:00:00, 1.33186e+07 +205, 2015-12-09 13:00:00, 1.41067e+07 +206, 2015-12-09 14:00:00, 1.33187e+07 +207, 2015-12-09 15:00:00, 1.41065e+07 +208, 2015-12-09 16:00:00, 1.33188e+07 +209, 2015-12-09 17:00:00, 1.41064e+07 +210, 2015-12-09 18:00:00, 1.33189e+07 +211, 2015-12-09 19:00:00, 1.41062e+07 +212, 2015-12-09 20:00:00, 1.3319e+07 +213, 2015-12-09 21:00:00, 1.41061e+07 +214, 2015-12-09 22:00:00, 1.3319e+07 +215, 2015-12-09 23:00:00, 1.4106e+07 +216, 2015-12-10 00:00:00, 1.33191e+07 +217, 2015-12-10 01:00:00, 1.41059e+07 +218, 2015-12-10 02:00:00, 1.33192e+07 +219, 2015-12-10 03:00:00, 1.41058e+07 +220, 2015-12-10 04:00:00, 1.33192e+07 +221, 2015-12-10 05:00:00, 1.41057e+07 +222, 2015-12-10 06:00:00, 1.33193e+07 +223, 2015-12-10 07:00:00, 1.41056e+07 +224, 2015-12-10 08:00:00, 1.33193e+07 +225, 2015-12-10 09:00:00, 1.41055e+07 +226, 2015-12-10 10:00:00, 1.33194e+07 +227, 2015-12-10 11:00:00, 1.41054e+07 +228, 2015-12-10 12:00:00, 1.33194e+07 +229, 2015-12-10 13:00:00, 1.41053e+07 +230, 2015-12-10 14:00:00, 1.33195e+07 +231, 2015-12-10 15:00:00, 1.41052e+07 +232, 2015-12-10 16:00:00, 1.33195e+07 +233, 2015-12-10 17:00:00, 1.41051e+07 +234, 2015-12-10 18:00:00, 1.33195e+07 +235, 2015-12-10 19:00:00, 1.41051e+07 +236, 2015-12-10 20:00:00, 1.33196e+07 +237, 2015-12-10 21:00:00, 1.4105e+07 +238, 2015-12-10 22:00:00, 1.33196e+07 +239, 2015-12-10 23:00:00, 1.41049e+07 +240, 2015-12-11 00:00:00, 1.33196e+07 +241, 2015-12-11 01:00:00, 1.41049e+07 +242, 2015-12-11 02:00:00, 1.33197e+07 +243, 2015-12-11 03:00:00, 1.41048e+07 +244, 2015-12-11 04:00:00, 1.33197e+07 +245, 2015-12-11 05:00:00, 1.41048e+07 +246, 2015-12-11 06:00:00, 1.33197e+07 +247, 2015-12-11 07:00:00, 1.41047e+07 +248, 2015-12-11 08:00:00, 1.33197e+07 +249, 2015-12-11 09:00:00, 1.41047e+07 +250, 2015-12-11 10:00:00, 1.33197e+07 +251, 2015-12-11 11:00:00, 1.41046e+07 +252, 2015-12-11 12:00:00, 1.33198e+07 +253, 2015-12-11 13:00:00, 1.41046e+07 +254, 2015-12-11 14:00:00, 1.33198e+07 +255, 2015-12-11 15:00:00, 1.41045e+07 +256, 2015-12-11 16:00:00, 1.33198e+07 +257, 2015-12-11 17:00:00, 1.41045e+07 +258, 2015-12-11 18:00:00, 1.33198e+07 +259, 2015-12-11 19:00:00, 1.41044e+07 +260, 2015-12-11 20:00:00, 1.33198e+07 +261, 2015-12-11 21:00:00, 1.41044e+07 +262, 2015-12-11 22:00:00, 1.33198e+07 +263, 2015-12-11 23:00:00, 1.41044e+07 +264, 2015-12-12 00:00:00, 1.33198e+07 +265, 2015-12-12 01:00:00, 1.41043e+07 +266, 2015-12-12 02:00:00, 1.33199e+07 +267, 2015-12-12 03:00:00, 1.41043e+07 +268, 2015-12-12 04:00:00, 1.33199e+07 +269, 2015-12-12 05:00:00, 1.41043e+07 +270, 2015-12-12 06:00:00, 1.33199e+07 +271, 2015-12-12 07:00:00, 1.41043e+07 +272, 2015-12-12 08:00:00, 1.33199e+07 +273, 2015-12-12 09:00:00, 1.41042e+07 +274, 2015-12-12 10:00:00, 1.33199e+07 +275, 2015-12-12 11:00:00, 1.41042e+07 +276, 2015-12-12 12:00:00, 1.33199e+07 +277, 2015-12-12 13:00:00, 1.41042e+07 +278, 2015-12-12 14:00:00, 1.33199e+07 +279, 2015-12-12 15:00:00, 1.41042e+07 +280, 2015-12-12 16:00:00, 1.33199e+07 +281, 2015-12-12 17:00:00, 1.41041e+07 +282, 2015-12-12 18:00:00, 1.33199e+07 +283, 2015-12-12 19:00:00, 1.41041e+07 +284, 2015-12-12 20:00:00, 1.33199e+07 +285, 2015-12-12 21:00:00, 1.41041e+07 +286, 2015-12-12 22:00:00, 1.33199e+07 +287, 2015-12-12 23:00:00, 1.41041e+07 +288, 2015-12-13 00:00:00, 1.33199e+07 +289, 2015-12-13 01:00:00, 1.41041e+07 +290, 2015-12-13 02:00:00, 1.33199e+07 +291, 2015-12-13 03:00:00, 1.41041e+07 +292, 2015-12-13 04:00:00, 1.33199e+07 +293, 2015-12-13 05:00:00, 1.4104e+07 +294, 2015-12-13 06:00:00, 1.332e+07 +295, 2015-12-13 07:00:00, 1.4104e+07 +296, 2015-12-13 08:00:00, 1.332e+07 +297, 2015-12-13 09:00:00, 1.4104e+07 +298, 2015-12-13 10:00:00, 1.332e+07 +299, 2015-12-13 11:00:00, 1.4104e+07 +300, 2015-12-13 12:00:00, 1.332e+07 +301, 2015-12-13 13:00:00, 1.4104e+07 +302, 2015-12-13 14:00:00, 1.332e+07 +303, 2015-12-13 15:00:00, 1.4104e+07 +304, 2015-12-13 16:00:00, 1.332e+07 +305, 2015-12-13 17:00:00, 1.4104e+07 +306, 2015-12-13 18:00:00, 1.332e+07 +307, 2015-12-13 19:00:00, 1.41039e+07 +308, 2015-12-13 20:00:00, 1.332e+07 +309, 2015-12-13 21:00:00, 1.41039e+07 +310, 2015-12-13 22:00:00, 1.332e+07 +311, 2015-12-13 23:00:00, 1.41039e+07 +312, 2015-12-14 00:00:00, 1.332e+07 +313, 2015-12-14 01:00:00, 1.41039e+07 +314, 2015-12-14 02:00:00, 1.332e+07 +315, 2015-12-14 03:00:00, 1.41039e+07 +316, 2015-12-14 04:00:00, 1.332e+07 +317, 2015-12-14 05:00:00, 1.41039e+07 +318, 2015-12-14 06:00:00, 1.332e+07 +319, 2015-12-14 07:00:00, 1.41039e+07 +320, 2015-12-14 08:00:00, 1.332e+07 +321, 2015-12-14 09:00:00, 1.41039e+07 +322, 2015-12-14 10:00:00, 1.332e+07 +323, 2015-12-14 11:00:00, 1.41039e+07 +324, 2015-12-14 12:00:00, 1.332e+07 +325, 2015-12-14 13:00:00, 1.41039e+07 +326, 2015-12-14 14:00:00, 1.332e+07 +327, 2015-12-14 15:00:00, 1.41039e+07 +328, 2015-12-14 16:00:00, 1.332e+07 +329, 2015-12-14 17:00:00, 1.41039e+07 +330, 2015-12-14 18:00:00, 1.332e+07 +331, 2015-12-14 19:00:00, 1.41039e+07 +332, 2015-12-14 20:00:00, 1.332e+07 +333, 2015-12-14 21:00:00, 1.41039e+07 +334, 2015-12-14 22:00:00, 1.332e+07 +335, 2015-12-14 23:00:00, 1.41038e+07 +336, 2015-12-15 00:00:00, 1.332e+07 +337, 2015-12-15 01:00:00, 1.41038e+07 +338, 2015-12-15 02:00:00, 1.332e+07 +339, 2015-12-15 03:00:00, 1.41038e+07 +340, 2015-12-15 04:00:00, 1.332e+07 +341, 2015-12-15 05:00:00, 1.41038e+07 +342, 2015-12-15 06:00:00, 1.332e+07 +343, 2015-12-15 07:00:00, 1.41038e+07 +344, 2015-12-15 08:00:00, 1.332e+07 +345, 2015-12-15 09:00:00, 1.41038e+07 +346, 2015-12-15 10:00:00, 1.332e+07 +347, 2015-12-15 11:00:00, 1.41038e+07 +348, 2015-12-15 12:00:00, 1.332e+07 +349, 2015-12-15 13:00:00, 1.41038e+07 +350, 2015-12-15 14:00:00, 1.332e+07 +351, 2015-12-15 15:00:00, 1.41038e+07 +352, 2015-12-15 16:00:00, 1.332e+07 +353, 2015-12-15 17:00:00, 1.41038e+07 +354, 2015-12-15 18:00:00, 1.332e+07 +355, 2015-12-15 19:00:00, 1.41038e+07 +356, 2015-12-15 20:00:00, 1.332e+07 +357, 2015-12-15 21:00:00, 1.41038e+07 +358, 2015-12-15 22:00:00, 1.332e+07 +359, 2015-12-15 23:00:00, 1.41038e+07 +360, 2015-12-16 00:00:00, 1.332e+07 +361, 2015-12-16 01:00:00, 1.41038e+07 +362, 2015-12-16 02:00:00, 1.332e+07 +363, 2015-12-16 03:00:00, 1.41038e+07 +364, 2015-12-16 04:00:00, 1.332e+07 +365, 2015-12-16 05:00:00, 1.41038e+07 +366, 2015-12-16 06:00:00, 1.332e+07 +367, 2015-12-16 07:00:00, 1.41038e+07 +368, 2015-12-16 08:00:00, 1.332e+07 +369, 2015-12-16 09:00:00, 1.41038e+07 +370, 2015-12-16 10:00:00, 1.332e+07 +371, 2015-12-16 11:00:00, 1.41038e+07 +372, 2015-12-16 12:00:00, 1.332e+07 +373, 2015-12-16 13:00:00, 1.41038e+07 +374, 2015-12-16 14:00:00, 1.332e+07 +375, 2015-12-16 15:00:00, 1.41038e+07 +376, 2015-12-16 16:00:00, 1.332e+07 +377, 2015-12-16 17:00:00, 1.41038e+07 +378, 2015-12-16 18:00:00, 1.332e+07 +379, 2015-12-16 19:00:00, 1.41038e+07 +380, 2015-12-16 20:00:00, 1.332e+07 +381, 2015-12-16 21:00:00, 1.41038e+07 +382, 2015-12-16 22:00:00, 1.332e+07 +383, 2015-12-16 23:00:00, 1.41038e+07 +384, 2015-12-17 00:00:00, 1.332e+07 +385, 2015-12-17 01:00:00, 1.41038e+07 +386, 2015-12-17 02:00:00, 1.332e+07 +387, 2015-12-17 03:00:00, 1.41038e+07 +388, 2015-12-17 04:00:00, 1.332e+07 +389, 2015-12-17 05:00:00, 1.41038e+07 +390, 2015-12-17 06:00:00, 1.332e+07 +391, 2015-12-17 07:00:00, 1.41038e+07 +392, 2015-12-17 08:00:00, 1.332e+07 +393, 2015-12-17 09:00:00, 1.41038e+07 +394, 2015-12-17 10:00:00, 1.332e+07 +395, 2015-12-17 11:00:00, 1.41038e+07 +396, 2015-12-17 12:00:00, 1.332e+07 +397, 2015-12-17 13:00:00, 1.41038e+07 +398, 2015-12-17 14:00:00, 1.332e+07 +399, 2015-12-17 15:00:00, 1.41038e+07 +400, 2015-12-17 16:00:00, 1.332e+07 +401, 2015-12-17 17:00:00, 1.41038e+07 +402, 2015-12-17 18:00:00, 1.332e+07 +403, 2015-12-17 19:00:00, 1.41038e+07 +404, 2015-12-17 20:00:00, 1.332e+07 +405, 2015-12-17 21:00:00, 1.41038e+07 +406, 2015-12-17 22:00:00, 1.332e+07 +407, 2015-12-17 23:00:00, 1.41038e+07 +408, 2015-12-18 00:00:00, 1.332e+07 +409, 2015-12-18 01:00:00, 1.41038e+07 +410, 2015-12-18 02:00:00, 1.332e+07 +411, 2015-12-18 03:00:00, 1.41038e+07 +412, 2015-12-18 04:00:00, 1.332e+07 +413, 2015-12-18 05:00:00, 1.41038e+07 +414, 2015-12-18 06:00:00, 1.332e+07 +415, 2015-12-18 07:00:00, 1.41038e+07 +416, 2015-12-18 08:00:00, 1.332e+07 +417, 2015-12-18 09:00:00, 1.41038e+07 +418, 2015-12-18 10:00:00, 1.332e+07 +419, 2015-12-18 11:00:00, 1.41038e+07 +420, 2015-12-18 12:00:00, 1.332e+07 +421, 2015-12-18 13:00:00, 1.41038e+07 +422, 2015-12-18 14:00:00, 1.332e+07 +423, 2015-12-18 15:00:00, 1.41038e+07 +424, 2015-12-18 16:00:00, 1.332e+07 +425, 2015-12-18 17:00:00, 1.41038e+07 +426, 2015-12-18 18:00:00, 1.332e+07 +427, 2015-12-18 19:00:00, 1.41038e+07 +428, 2015-12-18 20:00:00, 1.332e+07 +429, 2015-12-18 21:00:00, 1.41038e+07 +430, 2015-12-18 22:00:00, 1.332e+07 +431, 2015-12-18 23:00:00, 1.41038e+07 +432, 2015-12-19 00:00:00, 1.332e+07 +433, 2015-12-19 01:00:00, 1.41038e+07 +434, 2015-12-19 02:00:00, 1.332e+07 +435, 2015-12-19 03:00:00, 1.41038e+07 +436, 2015-12-19 04:00:00, 1.332e+07 +437, 2015-12-19 05:00:00, 1.41038e+07 +438, 2015-12-19 06:00:00, 1.332e+07 +439, 2015-12-19 07:00:00, 1.41038e+07 +440, 2015-12-19 08:00:00, 1.332e+07 +441, 2015-12-19 09:00:00, 1.41038e+07 +442, 2015-12-19 10:00:00, 1.332e+07 +443, 2015-12-19 11:00:00, 1.41038e+07 +444, 2015-12-19 12:00:00, 1.332e+07 +445, 2015-12-19 13:00:00, 1.41038e+07 +446, 2015-12-19 14:00:00, 1.332e+07 +447, 2015-12-19 15:00:00, 1.41038e+07 +448, 2015-12-19 16:00:00, 1.332e+07 +449, 2015-12-19 17:00:00, 1.41038e+07 +450, 2015-12-19 18:00:00, 1.332e+07 +451, 2015-12-19 19:00:00, 1.41038e+07 +452, 2015-12-19 20:00:00, 1.332e+07 +453, 2015-12-19 21:00:00, 1.41038e+07 +454, 2015-12-19 22:00:00, 1.332e+07 +455, 2015-12-19 23:00:00, 1.41038e+07 +456, 2015-12-20 00:00:00, 1.332e+07 +457, 2015-12-20 01:00:00, 1.41038e+07 +458, 2015-12-20 02:00:00, 1.332e+07 +459, 2015-12-20 03:00:00, 1.41038e+07 +460, 2015-12-20 04:00:00, 1.332e+07 +461, 2015-12-20 05:00:00, 1.41038e+07 +462, 2015-12-20 06:00:00, 1.332e+07 +463, 2015-12-20 07:00:00, 1.41038e+07 +464, 2015-12-20 08:00:00, 1.332e+07 +465, 2015-12-20 09:00:00, 1.41038e+07 +466, 2015-12-20 10:00:00, 1.332e+07 +467, 2015-12-20 11:00:00, 1.41038e+07 +468, 2015-12-20 12:00:00, 1.332e+07 +469, 2015-12-20 13:00:00, 1.41038e+07 +470, 2015-12-20 14:00:00, 1.332e+07 +471, 2015-12-20 15:00:00, 1.41038e+07 +472, 2015-12-20 16:00:00, 1.332e+07 +473, 2015-12-20 17:00:00, 1.41038e+07 +474, 2015-12-20 18:00:00, 1.332e+07 +475, 2015-12-20 19:00:00, 1.41038e+07 +476, 2015-12-20 20:00:00, 1.332e+07 +477, 2015-12-20 21:00:00, 1.41038e+07 +478, 2015-12-20 22:00:00, 1.332e+07 +479, 2015-12-20 23:00:00, 1.41038e+07 +480, 2015-12-21 00:00:00, 1.332e+07 +481, 2015-12-21 01:00:00, 1.41038e+07 +482, 2015-12-21 02:00:00, 1.332e+07 +483, 2015-12-21 03:00:00, 1.41038e+07 +484, 2015-12-21 04:00:00, 1.332e+07 +485, 2015-12-21 05:00:00, 1.41038e+07 +486, 2015-12-21 06:00:00, 1.332e+07 +487, 2015-12-21 07:00:00, 1.41038e+07 +488, 2015-12-21 08:00:00, 1.332e+07 +489, 2015-12-21 09:00:00, 1.41038e+07 +490, 2015-12-21 10:00:00, 1.332e+07 +491, 2015-12-21 11:00:00, 1.41038e+07 +492, 2015-12-21 12:00:00, 1.332e+07 +493, 2015-12-21 13:00:00, 1.41038e+07 +494, 2015-12-21 14:00:00, 1.332e+07 +495, 2015-12-21 15:00:00, 1.41038e+07 +496, 2015-12-21 16:00:00, 1.332e+07 +497, 2015-12-21 17:00:00, 1.41038e+07 +498, 2015-12-21 18:00:00, 1.332e+07 +499, 2015-12-21 19:00:00, 1.41038e+07 +500, 2015-12-21 20:00:00, 1.332e+07 +501, 2015-12-21 21:00:00, 1.41038e+07 +502, 2015-12-21 22:00:00, 1.332e+07 +503, 2015-12-21 23:00:00, 1.41038e+07 +504, 2015-12-22 00:00:00, 1.332e+07 +505, 2015-12-22 01:00:00, 1.41038e+07 +506, 2015-12-22 02:00:00, 1.332e+07 +507, 2015-12-22 03:00:00, 1.41038e+07 +508, 2015-12-22 04:00:00, 1.332e+07 +509, 2015-12-22 05:00:00, 1.41038e+07 +510, 2015-12-22 06:00:00, 1.332e+07 +511, 2015-12-22 07:00:00, 1.41038e+07 +512, 2015-12-22 08:00:00, 1.332e+07 +513, 2015-12-22 09:00:00, 1.41038e+07 +514, 2015-12-22 10:00:00, 1.332e+07 +515, 2015-12-22 11:00:00, 1.41038e+07 +516, 2015-12-22 12:00:00, 1.332e+07 +517, 2015-12-22 13:00:00, 1.41038e+07 +518, 2015-12-22 14:00:00, 1.332e+07 +519, 2015-12-22 15:00:00, 1.41038e+07 +520, 2015-12-22 16:00:00, 1.332e+07 +521, 2015-12-22 17:00:00, 1.41038e+07 +522, 2015-12-22 18:00:00, 1.332e+07 +523, 2015-12-22 19:00:00, 1.41038e+07 +524, 2015-12-22 20:00:00, 1.332e+07 +525, 2015-12-22 21:00:00, 1.41038e+07 +526, 2015-12-22 22:00:00, 1.332e+07 +527, 2015-12-22 23:00:00, 1.41038e+07 +528, 2015-12-23 00:00:00, 1.332e+07 +529, 2015-12-23 01:00:00, 1.41038e+07 +530, 2015-12-23 02:00:00, 1.332e+07 +531, 2015-12-23 03:00:00, 1.41038e+07 +532, 2015-12-23 04:00:00, 1.332e+07 +533, 2015-12-23 05:00:00, 1.41038e+07 +534, 2015-12-23 06:00:00, 1.332e+07 +535, 2015-12-23 07:00:00, 1.41038e+07 +536, 2015-12-23 08:00:00, 1.332e+07 +537, 2015-12-23 09:00:00, 1.41038e+07 +538, 2015-12-23 10:00:00, 1.332e+07 +539, 2015-12-23 11:00:00, 1.41038e+07 +540, 2015-12-23 12:00:00, 1.332e+07 +541, 2015-12-23 13:00:00, 1.41038e+07 +542, 2015-12-23 14:00:00, 1.332e+07 +543, 2015-12-23 15:00:00, 1.41038e+07 +544, 2015-12-23 16:00:00, 1.332e+07 +545, 2015-12-23 17:00:00, 1.41038e+07 +546, 2015-12-23 18:00:00, 1.332e+07 +547, 2015-12-23 19:00:00, 1.41038e+07 +548, 2015-12-23 20:00:00, 1.332e+07 +549, 2015-12-23 21:00:00, 1.41038e+07 +550, 2015-12-23 22:00:00, 1.332e+07 +551, 2015-12-23 23:00:00, 1.41038e+07 +552, 2015-12-24 00:00:00, 1.332e+07 +553, 2015-12-24 01:00:00, 1.41038e+07 +554, 2015-12-24 02:00:00, 1.332e+07 +555, 2015-12-24 03:00:00, 1.41038e+07 +556, 2015-12-24 04:00:00, 1.332e+07 +557, 2015-12-24 05:00:00, 1.41038e+07 +558, 2015-12-24 06:00:00, 1.332e+07 +559, 2015-12-24 07:00:00, 1.41038e+07 +560, 2015-12-24 08:00:00, 1.332e+07 +561, 2015-12-24 09:00:00, 1.41038e+07 +562, 2015-12-24 10:00:00, 1.332e+07 +563, 2015-12-24 11:00:00, 1.41038e+07 +564, 2015-12-24 12:00:00, 1.332e+07 +565, 2015-12-24 13:00:00, 1.41038e+07 +566, 2015-12-24 14:00:00, 1.332e+07 +567, 2015-12-24 15:00:00, 1.41038e+07 +568, 2015-12-24 16:00:00, 1.332e+07 +569, 2015-12-24 17:00:00, 1.41038e+07 +570, 2015-12-24 18:00:00, 1.332e+07 +571, 2015-12-24 19:00:00, 1.41038e+07 +572, 2015-12-24 20:00:00, 1.332e+07 +573, 2015-12-24 21:00:00, 1.41038e+07 +574, 2015-12-24 22:00:00, 1.332e+07 +575, 2015-12-24 23:00:00, 1.41038e+07 +576, 2015-12-25 00:00:00, 1.332e+07 +577, 2015-12-25 01:00:00, 1.41038e+07 +578, 2015-12-25 02:00:00, 1.332e+07 +579, 2015-12-25 03:00:00, 1.41038e+07 +580, 2015-12-25 04:00:00, 1.332e+07 +581, 2015-12-25 05:00:00, 1.41038e+07 +582, 2015-12-25 06:00:00, 1.332e+07 +583, 2015-12-25 07:00:00, 1.41038e+07 +584, 2015-12-25 08:00:00, 1.332e+07 +585, 2015-12-25 09:00:00, 1.41038e+07 +586, 2015-12-25 10:00:00, 1.332e+07 +587, 2015-12-25 11:00:00, 1.41038e+07 +588, 2015-12-25 12:00:00, 1.332e+07 +589, 2015-12-25 13:00:00, 1.41038e+07 +590, 2015-12-25 14:00:00, 1.332e+07 +591, 2015-12-25 15:00:00, 1.41038e+07 +592, 2015-12-25 16:00:00, 1.332e+07 +593, 2015-12-25 17:00:00, 1.41038e+07 +594, 2015-12-25 18:00:00, 1.332e+07 +595, 2015-12-25 19:00:00, 1.41038e+07 +596, 2015-12-25 20:00:00, 1.332e+07 +597, 2015-12-25 21:00:00, 1.41038e+07 +598, 2015-12-25 22:00:00, 1.332e+07 +599, 2015-12-25 23:00:00, 1.41038e+07 +600, 2015-12-26 00:00:00, 1.332e+07 +601, 2015-12-26 01:00:00, 1.41038e+07 +602, 2015-12-26 02:00:00, 1.332e+07 +603, 2015-12-26 03:00:00, 1.41038e+07 +604, 2015-12-26 04:00:00, 1.332e+07 +605, 2015-12-26 05:00:00, 1.41038e+07 +606, 2015-12-26 06:00:00, 1.332e+07 +607, 2015-12-26 07:00:00, 1.41038e+07 +608, 2015-12-26 08:00:00, 1.332e+07 +609, 2015-12-26 09:00:00, 1.41038e+07 +610, 2015-12-26 10:00:00, 1.332e+07 +611, 2015-12-26 11:00:00, 1.41038e+07 +612, 2015-12-26 12:00:00, 1.332e+07 +613, 2015-12-26 13:00:00, 1.41038e+07 +614, 2015-12-26 14:00:00, 1.332e+07 +615, 2015-12-26 15:00:00, 1.41038e+07 +616, 2015-12-26 16:00:00, 1.332e+07 +617, 2015-12-26 17:00:00, 1.41038e+07 +618, 2015-12-26 18:00:00, 1.332e+07 +619, 2015-12-26 19:00:00, 1.41038e+07 +620, 2015-12-26 20:00:00, 1.332e+07 +621, 2015-12-26 21:00:00, 1.41038e+07 +622, 2015-12-26 22:00:00, 1.332e+07 +623, 2015-12-26 23:00:00, 1.41038e+07 +624, 2015-12-27 00:00:00, 1.332e+07 +625, 2015-12-27 01:00:00, 1.41038e+07 +626, 2015-12-27 02:00:00, 1.332e+07 +627, 2015-12-27 03:00:00, 1.41038e+07 +628, 2015-12-27 04:00:00, 1.332e+07 +629, 2015-12-27 05:00:00, 1.41038e+07 +630, 2015-12-27 06:00:00, 1.332e+07 +631, 2015-12-27 07:00:00, 1.41038e+07 +632, 2015-12-27 08:00:00, 1.332e+07 +633, 2015-12-27 09:00:00, 1.41038e+07 +634, 2015-12-27 10:00:00, 1.332e+07 +635, 2015-12-27 11:00:00, 1.41038e+07 +636, 2015-12-27 12:00:00, 1.332e+07 +637, 2015-12-27 13:00:00, 1.41038e+07 +638, 2015-12-27 14:00:00, 1.332e+07 +639, 2015-12-27 15:00:00, 1.41038e+07 +640, 2015-12-27 16:00:00, 1.332e+07 +641, 2015-12-27 17:00:00, 1.41038e+07 +642, 2015-12-27 18:00:00, 1.332e+07 +643, 2015-12-27 19:00:00, 1.41038e+07 +644, 2015-12-27 20:00:00, 1.332e+07 +645, 2015-12-27 21:00:00, 1.41038e+07 +646, 2015-12-27 22:00:00, 1.332e+07 +647, 2015-12-27 23:00:00, 1.41038e+07 +648, 2015-12-28 00:00:00, 1.332e+07 +649, 2015-12-28 01:00:00, 1.41038e+07 +650, 2015-12-28 02:00:00, 1.332e+07 +651, 2015-12-28 03:00:00, 1.41038e+07 +652, 2015-12-28 04:00:00, 1.332e+07 +653, 2015-12-28 05:00:00, 1.41038e+07 +654, 2015-12-28 06:00:00, 1.332e+07 +655, 2015-12-28 07:00:00, 1.41038e+07 +656, 2015-12-28 08:00:00, 1.332e+07 +657, 2015-12-28 09:00:00, 1.41038e+07 +658, 2015-12-28 10:00:00, 1.332e+07 +659, 2015-12-28 11:00:00, 1.41038e+07 +660, 2015-12-28 12:00:00, 1.332e+07 +661, 2015-12-28 13:00:00, 1.41038e+07 +662, 2015-12-28 14:00:00, 1.332e+07 +663, 2015-12-28 15:00:00, 1.41038e+07 +664, 2015-12-28 16:00:00, 1.332e+07 +665, 2015-12-28 17:00:00, 1.41038e+07 +666, 2015-12-28 18:00:00, 1.332e+07 +667, 2015-12-28 19:00:00, 1.41038e+07 +668, 2015-12-28 20:00:00, 1.332e+07 +669, 2015-12-28 21:00:00, 1.41038e+07 +670, 2015-12-28 22:00:00, 1.332e+07 +671, 2015-12-28 23:00:00, 1.41038e+07 +672, 2015-12-29 00:00:00, 1.332e+07 +673, 2015-12-29 01:00:00, 1.41038e+07 +674, 2015-12-29 02:00:00, 1.332e+07 +675, 2015-12-29 03:00:00, 1.41038e+07 +676, 2015-12-29 04:00:00, 1.332e+07 +677, 2015-12-29 05:00:00, 1.41038e+07 +678, 2015-12-29 06:00:00, 1.332e+07 +679, 2015-12-29 07:00:00, 1.41038e+07 +680, 2015-12-29 08:00:00, 1.332e+07 +681, 2015-12-29 09:00:00, 1.41038e+07 +682, 2015-12-29 10:00:00, 1.332e+07 +683, 2015-12-29 11:00:00, 1.41038e+07 +684, 2015-12-29 12:00:00, 1.332e+07 +685, 2015-12-29 13:00:00, 1.41038e+07 +686, 2015-12-29 14:00:00, 1.332e+07 +687, 2015-12-29 15:00:00, 1.41038e+07 +688, 2015-12-29 16:00:00, 1.332e+07 +689, 2015-12-29 17:00:00, 1.41038e+07 +690, 2015-12-29 18:00:00, 1.332e+07 +691, 2015-12-29 19:00:00, 1.41038e+07 +692, 2015-12-29 20:00:00, 1.332e+07 +693, 2015-12-29 21:00:00, 1.41038e+07 +694, 2015-12-29 22:00:00, 1.332e+07 +695, 2015-12-29 23:00:00, 1.41038e+07 +696, 2015-12-30 00:00:00, 1.332e+07 +697, 2015-12-30 01:00:00, 1.41038e+07 +698, 2015-12-30 02:00:00, 1.332e+07 +699, 2015-12-30 03:00:00, 1.41038e+07 +700, 2015-12-30 04:00:00, 1.332e+07 +701, 2015-12-30 05:00:00, 1.41038e+07 +702, 2015-12-30 06:00:00, 1.332e+07 +703, 2015-12-30 07:00:00, 1.41038e+07 +704, 2015-12-30 08:00:00, 1.332e+07 +705, 2015-12-30 09:00:00, 1.41038e+07 +706, 2015-12-30 10:00:00, 1.332e+07 +707, 2015-12-30 11:00:00, 1.41038e+07 +708, 2015-12-30 12:00:00, 1.332e+07 +709, 2015-12-30 13:00:00, 1.41038e+07 +710, 2015-12-30 14:00:00, 1.332e+07 +711, 2015-12-30 15:00:00, 1.41038e+07 +712, 2015-12-30 16:00:00, 1.332e+07 +713, 2015-12-30 17:00:00, 1.41038e+07 +714, 2015-12-30 18:00:00, 1.332e+07 +715, 2015-12-30 19:00:00, 1.41038e+07 +716, 2015-12-30 20:00:00, 1.332e+07 +717, 2015-12-30 21:00:00, 1.41038e+07 +718, 2015-12-30 22:00:00, 1.332e+07 +719, 2015-12-30 23:00:00, 1.41038e+07 diff --git a/test/unit_test_hyfeature/channel_forcing/nex-10238_output.csv b/test/unit_test_hyfeature/channel_forcing/nex-10238_output.csv new file mode 100644 index 000000000..87ab7fa89 --- /dev/null +++ b/test/unit_test_hyfeature/channel_forcing/nex-10238_output.csv @@ -0,0 +1,720 @@ +0, 2015-12-01 00:00:00, 1.0975e+06 +1, 2015-12-01 01:00:00, 9.87666e+06 +2, 2015-12-01 02:00:00, 1.08689e+07 +3, 2015-12-01 03:00:00, 1.45746e+07 +4, 2015-12-01 04:00:00, 1.25571e+07 +5, 2015-12-01 05:00:00, 1.4807e+07 +6, 2015-12-01 06:00:00, 1.26019e+07 +7, 2015-12-01 07:00:00, 1.47672e+07 +8, 2015-12-01 08:00:00, 1.26428e+07 +9, 2015-12-01 09:00:00, 1.47298e+07 +10, 2015-12-01 10:00:00, 1.26815e+07 +11, 2015-12-01 11:00:00, 1.46945e+07 +12, 2015-12-01 12:00:00, 1.2718e+07 +13, 2015-12-01 13:00:00, 1.46613e+07 +14, 2015-12-01 14:00:00, 1.27524e+07 +15, 2015-12-01 15:00:00, 1.463e+07 +16, 2015-12-01 16:00:00, 1.2785e+07 +17, 2015-12-01 17:00:00, 1.46005e+07 +18, 2015-12-01 18:00:00, 1.28157e+07 +19, 2015-12-01 19:00:00, 1.45727e+07 +20, 2015-12-01 20:00:00, 1.28447e+07 +21, 2015-12-01 21:00:00, 1.45464e+07 +22, 2015-12-01 22:00:00, 1.2872e+07 +23, 2015-12-01 23:00:00, 1.45217e+07 +24, 2015-12-02 00:00:00, 1.28979e+07 +25, 2015-12-02 01:00:00, 1.44984e+07 +26, 2015-12-02 02:00:00, 1.29222e+07 +27, 2015-12-02 03:00:00, 1.44765e+07 +28, 2015-12-02 04:00:00, 1.29452e+07 +29, 2015-12-02 05:00:00, 1.44558e+07 +30, 2015-12-02 06:00:00, 1.29669e+07 +31, 2015-12-02 07:00:00, 1.44362e+07 +32, 2015-12-02 08:00:00, 1.29874e+07 +33, 2015-12-02 09:00:00, 1.44178e+07 +34, 2015-12-02 10:00:00, 1.30067e+07 +35, 2015-12-02 11:00:00, 1.44004e+07 +36, 2015-12-02 12:00:00, 1.30249e+07 +37, 2015-12-02 13:00:00, 1.4384e+07 +38, 2015-12-02 14:00:00, 1.30421e+07 +39, 2015-12-02 15:00:00, 1.43686e+07 +40, 2015-12-02 16:00:00, 1.30583e+07 +41, 2015-12-02 17:00:00, 1.4354e+07 +42, 2015-12-02 18:00:00, 1.30736e+07 +43, 2015-12-02 19:00:00, 1.43402e+07 +44, 2015-12-02 20:00:00, 1.3088e+07 +45, 2015-12-02 21:00:00, 1.43272e+07 +46, 2015-12-02 22:00:00, 1.31016e+07 +47, 2015-12-02 23:00:00, 1.4315e+07 +48, 2015-12-03 00:00:00, 1.31144e+07 +49, 2015-12-03 01:00:00, 1.43034e+07 +50, 2015-12-03 02:00:00, 1.31264e+07 +51, 2015-12-03 03:00:00, 1.42925e+07 +52, 2015-12-03 04:00:00, 1.31378e+07 +53, 2015-12-03 05:00:00, 1.42822e+07 +54, 2015-12-03 06:00:00, 1.31485e+07 +55, 2015-12-03 07:00:00, 1.42724e+07 +56, 2015-12-03 08:00:00, 1.31586e+07 +57, 2015-12-03 09:00:00, 1.42632e+07 +58, 2015-12-03 10:00:00, 1.31682e+07 +59, 2015-12-03 11:00:00, 1.42545e+07 +60, 2015-12-03 12:00:00, 1.31771e+07 +61, 2015-12-03 13:00:00, 1.42463e+07 +62, 2015-12-03 14:00:00, 1.31856e+07 +63, 2015-12-03 15:00:00, 1.42386e+07 +64, 2015-12-03 16:00:00, 1.31936e+07 +65, 2015-12-03 17:00:00, 1.42313e+07 +66, 2015-12-03 18:00:00, 1.32011e+07 +67, 2015-12-03 19:00:00, 1.42244e+07 +68, 2015-12-03 20:00:00, 1.32081e+07 +69, 2015-12-03 21:00:00, 1.42179e+07 +70, 2015-12-03 22:00:00, 1.32148e+07 +71, 2015-12-03 23:00:00, 1.42117e+07 +72, 2015-12-04 00:00:00, 1.32211e+07 +73, 2015-12-04 01:00:00, 1.42059e+07 +74, 2015-12-04 02:00:00, 1.3227e+07 +75, 2015-12-04 03:00:00, 1.42004e+07 +76, 2015-12-04 04:00:00, 1.32325e+07 +77, 2015-12-04 05:00:00, 1.41952e+07 +78, 2015-12-04 06:00:00, 1.32378e+07 +79, 2015-12-04 07:00:00, 1.41902e+07 +80, 2015-12-04 08:00:00, 1.32427e+07 +81, 2015-12-04 09:00:00, 1.41856e+07 +82, 2015-12-04 10:00:00, 1.32473e+07 +83, 2015-12-04 11:00:00, 1.41812e+07 +84, 2015-12-04 12:00:00, 1.32517e+07 +85, 2015-12-04 13:00:00, 1.41771e+07 +86, 2015-12-04 14:00:00, 1.32558e+07 +87, 2015-12-04 15:00:00, 1.41731e+07 +88, 2015-12-04 16:00:00, 1.32597e+07 +89, 2015-12-04 17:00:00, 1.41694e+07 +90, 2015-12-04 18:00:00, 1.32633e+07 +91, 2015-12-04 19:00:00, 1.41659e+07 +92, 2015-12-04 20:00:00, 1.32668e+07 +93, 2015-12-04 21:00:00, 1.41626e+07 +94, 2015-12-04 22:00:00, 1.327e+07 +95, 2015-12-04 23:00:00, 1.41594e+07 +96, 2015-12-05 00:00:00, 1.3273e+07 +97, 2015-12-05 01:00:00, 1.41565e+07 +98, 2015-12-05 02:00:00, 1.32759e+07 +99, 2015-12-05 03:00:00, 1.41537e+07 +100, 2015-12-05 04:00:00, 1.32785e+07 +101, 2015-12-05 05:00:00, 1.4151e+07 +102, 2015-12-05 06:00:00, 1.32811e+07 +103, 2015-12-05 07:00:00, 1.41485e+07 +104, 2015-12-05 08:00:00, 1.32834e+07 +105, 2015-12-05 09:00:00, 1.41461e+07 +106, 2015-12-05 10:00:00, 1.32857e+07 +107, 2015-12-05 11:00:00, 1.41439e+07 +108, 2015-12-05 12:00:00, 1.32878e+07 +109, 2015-12-05 13:00:00, 1.41418e+07 +110, 2015-12-05 14:00:00, 1.32898e+07 +111, 2015-12-05 15:00:00, 1.41397e+07 +112, 2015-12-05 16:00:00, 1.32916e+07 +113, 2015-12-05 17:00:00, 1.41378e+07 +114, 2015-12-05 18:00:00, 1.32934e+07 +115, 2015-12-05 19:00:00, 1.4136e+07 +116, 2015-12-05 20:00:00, 1.3295e+07 +117, 2015-12-05 21:00:00, 1.41343e+07 +118, 2015-12-05 22:00:00, 1.32965e+07 +119, 2015-12-05 23:00:00, 1.41327e+07 +120, 2015-12-06 00:00:00, 1.3298e+07 +121, 2015-12-06 01:00:00, 1.41312e+07 +122, 2015-12-06 02:00:00, 1.32993e+07 +123, 2015-12-06 03:00:00, 1.41297e+07 +124, 2015-12-06 04:00:00, 1.33006e+07 +125, 2015-12-06 05:00:00, 1.41284e+07 +126, 2015-12-06 06:00:00, 1.33018e+07 +127, 2015-12-06 07:00:00, 1.41271e+07 +128, 2015-12-06 08:00:00, 1.3303e+07 +129, 2015-12-06 09:00:00, 1.41259e+07 +130, 2015-12-06 10:00:00, 1.3304e+07 +131, 2015-12-06 11:00:00, 1.41247e+07 +132, 2015-12-06 12:00:00, 1.3305e+07 +133, 2015-12-06 13:00:00, 1.41236e+07 +134, 2015-12-06 14:00:00, 1.3306e+07 +135, 2015-12-06 15:00:00, 1.41226e+07 +136, 2015-12-06 16:00:00, 1.33068e+07 +137, 2015-12-06 17:00:00, 1.41216e+07 +138, 2015-12-06 18:00:00, 1.33077e+07 +139, 2015-12-06 19:00:00, 1.41206e+07 +140, 2015-12-06 20:00:00, 1.33084e+07 +141, 2015-12-06 21:00:00, 1.41198e+07 +142, 2015-12-06 22:00:00, 1.33092e+07 +143, 2015-12-06 23:00:00, 1.41189e+07 +144, 2015-12-07 00:00:00, 1.33098e+07 +145, 2015-12-07 01:00:00, 1.41181e+07 +146, 2015-12-07 02:00:00, 1.33105e+07 +147, 2015-12-07 03:00:00, 1.41174e+07 +148, 2015-12-07 04:00:00, 1.33111e+07 +149, 2015-12-07 05:00:00, 1.41167e+07 +150, 2015-12-07 06:00:00, 1.33116e+07 +151, 2015-12-07 07:00:00, 1.4116e+07 +152, 2015-12-07 08:00:00, 1.33122e+07 +153, 2015-12-07 09:00:00, 1.41153e+07 +154, 2015-12-07 10:00:00, 1.33127e+07 +155, 2015-12-07 11:00:00, 1.41147e+07 +156, 2015-12-07 12:00:00, 1.33131e+07 +157, 2015-12-07 13:00:00, 1.41142e+07 +158, 2015-12-07 14:00:00, 1.33136e+07 +159, 2015-12-07 15:00:00, 1.41136e+07 +160, 2015-12-07 16:00:00, 1.3314e+07 +161, 2015-12-07 17:00:00, 1.41131e+07 +162, 2015-12-07 18:00:00, 1.33144e+07 +163, 2015-12-07 19:00:00, 1.41126e+07 +164, 2015-12-07 20:00:00, 1.33147e+07 +165, 2015-12-07 21:00:00, 1.41122e+07 +166, 2015-12-07 22:00:00, 1.33151e+07 +167, 2015-12-07 23:00:00, 1.41117e+07 +168, 2015-12-08 00:00:00, 1.33154e+07 +169, 2015-12-08 01:00:00, 1.41113e+07 +170, 2015-12-08 02:00:00, 1.33157e+07 +171, 2015-12-08 03:00:00, 1.41109e+07 +172, 2015-12-08 04:00:00, 1.3316e+07 +173, 2015-12-08 05:00:00, 1.41105e+07 +174, 2015-12-08 06:00:00, 1.33162e+07 +175, 2015-12-08 07:00:00, 1.41102e+07 +176, 2015-12-08 08:00:00, 1.33165e+07 +177, 2015-12-08 09:00:00, 1.41099e+07 +178, 2015-12-08 10:00:00, 1.33167e+07 +179, 2015-12-08 11:00:00, 1.41095e+07 +180, 2015-12-08 12:00:00, 1.33169e+07 +181, 2015-12-08 13:00:00, 1.41092e+07 +182, 2015-12-08 14:00:00, 1.33171e+07 +183, 2015-12-08 15:00:00, 1.4109e+07 +184, 2015-12-08 16:00:00, 1.33173e+07 +185, 2015-12-08 17:00:00, 1.41087e+07 +186, 2015-12-08 18:00:00, 1.33175e+07 +187, 2015-12-08 19:00:00, 1.41084e+07 +188, 2015-12-08 20:00:00, 1.33177e+07 +189, 2015-12-08 21:00:00, 1.41082e+07 +190, 2015-12-08 22:00:00, 1.33178e+07 +191, 2015-12-08 23:00:00, 1.4108e+07 +192, 2015-12-09 00:00:00, 1.3318e+07 +193, 2015-12-09 01:00:00, 1.41077e+07 +194, 2015-12-09 02:00:00, 1.33181e+07 +195, 2015-12-09 03:00:00, 1.41075e+07 +196, 2015-12-09 04:00:00, 1.33182e+07 +197, 2015-12-09 05:00:00, 1.41073e+07 +198, 2015-12-09 06:00:00, 1.33183e+07 +199, 2015-12-09 07:00:00, 1.41072e+07 +200, 2015-12-09 08:00:00, 1.33184e+07 +201, 2015-12-09 09:00:00, 1.4107e+07 +202, 2015-12-09 10:00:00, 1.33185e+07 +203, 2015-12-09 11:00:00, 1.41068e+07 +204, 2015-12-09 12:00:00, 1.33186e+07 +205, 2015-12-09 13:00:00, 1.41067e+07 +206, 2015-12-09 14:00:00, 1.33187e+07 +207, 2015-12-09 15:00:00, 1.41065e+07 +208, 2015-12-09 16:00:00, 1.33188e+07 +209, 2015-12-09 17:00:00, 1.41064e+07 +210, 2015-12-09 18:00:00, 1.33189e+07 +211, 2015-12-09 19:00:00, 1.41062e+07 +212, 2015-12-09 20:00:00, 1.3319e+07 +213, 2015-12-09 21:00:00, 1.41061e+07 +214, 2015-12-09 22:00:00, 1.3319e+07 +215, 2015-12-09 23:00:00, 1.4106e+07 +216, 2015-12-10 00:00:00, 1.33191e+07 +217, 2015-12-10 01:00:00, 1.41059e+07 +218, 2015-12-10 02:00:00, 1.33192e+07 +219, 2015-12-10 03:00:00, 1.41058e+07 +220, 2015-12-10 04:00:00, 1.33192e+07 +221, 2015-12-10 05:00:00, 1.41057e+07 +222, 2015-12-10 06:00:00, 1.33193e+07 +223, 2015-12-10 07:00:00, 1.41056e+07 +224, 2015-12-10 08:00:00, 1.33193e+07 +225, 2015-12-10 09:00:00, 1.41055e+07 +226, 2015-12-10 10:00:00, 1.33194e+07 +227, 2015-12-10 11:00:00, 1.41054e+07 +228, 2015-12-10 12:00:00, 1.33194e+07 +229, 2015-12-10 13:00:00, 1.41053e+07 +230, 2015-12-10 14:00:00, 1.33195e+07 +231, 2015-12-10 15:00:00, 1.41052e+07 +232, 2015-12-10 16:00:00, 1.33195e+07 +233, 2015-12-10 17:00:00, 1.41051e+07 +234, 2015-12-10 18:00:00, 1.33195e+07 +235, 2015-12-10 19:00:00, 1.41051e+07 +236, 2015-12-10 20:00:00, 1.33196e+07 +237, 2015-12-10 21:00:00, 1.4105e+07 +238, 2015-12-10 22:00:00, 1.33196e+07 +239, 2015-12-10 23:00:00, 1.41049e+07 +240, 2015-12-11 00:00:00, 1.33196e+07 +241, 2015-12-11 01:00:00, 1.41049e+07 +242, 2015-12-11 02:00:00, 1.33197e+07 +243, 2015-12-11 03:00:00, 1.41048e+07 +244, 2015-12-11 04:00:00, 1.33197e+07 +245, 2015-12-11 05:00:00, 1.41048e+07 +246, 2015-12-11 06:00:00, 1.33197e+07 +247, 2015-12-11 07:00:00, 1.41047e+07 +248, 2015-12-11 08:00:00, 1.33197e+07 +249, 2015-12-11 09:00:00, 1.41047e+07 +250, 2015-12-11 10:00:00, 1.33197e+07 +251, 2015-12-11 11:00:00, 1.41046e+07 +252, 2015-12-11 12:00:00, 1.33198e+07 +253, 2015-12-11 13:00:00, 1.41046e+07 +254, 2015-12-11 14:00:00, 1.33198e+07 +255, 2015-12-11 15:00:00, 1.41045e+07 +256, 2015-12-11 16:00:00, 1.33198e+07 +257, 2015-12-11 17:00:00, 1.41045e+07 +258, 2015-12-11 18:00:00, 1.33198e+07 +259, 2015-12-11 19:00:00, 1.41044e+07 +260, 2015-12-11 20:00:00, 1.33198e+07 +261, 2015-12-11 21:00:00, 1.41044e+07 +262, 2015-12-11 22:00:00, 1.33198e+07 +263, 2015-12-11 23:00:00, 1.41044e+07 +264, 2015-12-12 00:00:00, 1.33198e+07 +265, 2015-12-12 01:00:00, 1.41043e+07 +266, 2015-12-12 02:00:00, 1.33199e+07 +267, 2015-12-12 03:00:00, 1.41043e+07 +268, 2015-12-12 04:00:00, 1.33199e+07 +269, 2015-12-12 05:00:00, 1.41043e+07 +270, 2015-12-12 06:00:00, 1.33199e+07 +271, 2015-12-12 07:00:00, 1.41043e+07 +272, 2015-12-12 08:00:00, 1.33199e+07 +273, 2015-12-12 09:00:00, 1.41042e+07 +274, 2015-12-12 10:00:00, 1.33199e+07 +275, 2015-12-12 11:00:00, 1.41042e+07 +276, 2015-12-12 12:00:00, 1.33199e+07 +277, 2015-12-12 13:00:00, 1.41042e+07 +278, 2015-12-12 14:00:00, 1.33199e+07 +279, 2015-12-12 15:00:00, 1.41042e+07 +280, 2015-12-12 16:00:00, 1.33199e+07 +281, 2015-12-12 17:00:00, 1.41041e+07 +282, 2015-12-12 18:00:00, 1.33199e+07 +283, 2015-12-12 19:00:00, 1.41041e+07 +284, 2015-12-12 20:00:00, 1.33199e+07 +285, 2015-12-12 21:00:00, 1.41041e+07 +286, 2015-12-12 22:00:00, 1.33199e+07 +287, 2015-12-12 23:00:00, 1.41041e+07 +288, 2015-12-13 00:00:00, 1.33199e+07 +289, 2015-12-13 01:00:00, 1.41041e+07 +290, 2015-12-13 02:00:00, 1.33199e+07 +291, 2015-12-13 03:00:00, 1.41041e+07 +292, 2015-12-13 04:00:00, 1.33199e+07 +293, 2015-12-13 05:00:00, 1.4104e+07 +294, 2015-12-13 06:00:00, 1.332e+07 +295, 2015-12-13 07:00:00, 1.4104e+07 +296, 2015-12-13 08:00:00, 1.332e+07 +297, 2015-12-13 09:00:00, 1.4104e+07 +298, 2015-12-13 10:00:00, 1.332e+07 +299, 2015-12-13 11:00:00, 1.4104e+07 +300, 2015-12-13 12:00:00, 1.332e+07 +301, 2015-12-13 13:00:00, 1.4104e+07 +302, 2015-12-13 14:00:00, 1.332e+07 +303, 2015-12-13 15:00:00, 1.4104e+07 +304, 2015-12-13 16:00:00, 1.332e+07 +305, 2015-12-13 17:00:00, 1.4104e+07 +306, 2015-12-13 18:00:00, 1.332e+07 +307, 2015-12-13 19:00:00, 1.41039e+07 +308, 2015-12-13 20:00:00, 1.332e+07 +309, 2015-12-13 21:00:00, 1.41039e+07 +310, 2015-12-13 22:00:00, 1.332e+07 +311, 2015-12-13 23:00:00, 1.41039e+07 +312, 2015-12-14 00:00:00, 1.332e+07 +313, 2015-12-14 01:00:00, 1.41039e+07 +314, 2015-12-14 02:00:00, 1.332e+07 +315, 2015-12-14 03:00:00, 1.41039e+07 +316, 2015-12-14 04:00:00, 1.332e+07 +317, 2015-12-14 05:00:00, 1.41039e+07 +318, 2015-12-14 06:00:00, 1.332e+07 +319, 2015-12-14 07:00:00, 1.41039e+07 +320, 2015-12-14 08:00:00, 1.332e+07 +321, 2015-12-14 09:00:00, 1.41039e+07 +322, 2015-12-14 10:00:00, 1.332e+07 +323, 2015-12-14 11:00:00, 1.41039e+07 +324, 2015-12-14 12:00:00, 1.332e+07 +325, 2015-12-14 13:00:00, 1.41039e+07 +326, 2015-12-14 14:00:00, 1.332e+07 +327, 2015-12-14 15:00:00, 1.41039e+07 +328, 2015-12-14 16:00:00, 1.332e+07 +329, 2015-12-14 17:00:00, 1.41039e+07 +330, 2015-12-14 18:00:00, 1.332e+07 +331, 2015-12-14 19:00:00, 1.41039e+07 +332, 2015-12-14 20:00:00, 1.332e+07 +333, 2015-12-14 21:00:00, 1.41039e+07 +334, 2015-12-14 22:00:00, 1.332e+07 +335, 2015-12-14 23:00:00, 1.41038e+07 +336, 2015-12-15 00:00:00, 1.332e+07 +337, 2015-12-15 01:00:00, 1.41038e+07 +338, 2015-12-15 02:00:00, 1.332e+07 +339, 2015-12-15 03:00:00, 1.41038e+07 +340, 2015-12-15 04:00:00, 1.332e+07 +341, 2015-12-15 05:00:00, 1.41038e+07 +342, 2015-12-15 06:00:00, 1.332e+07 +343, 2015-12-15 07:00:00, 1.41038e+07 +344, 2015-12-15 08:00:00, 1.332e+07 +345, 2015-12-15 09:00:00, 1.41038e+07 +346, 2015-12-15 10:00:00, 1.332e+07 +347, 2015-12-15 11:00:00, 1.41038e+07 +348, 2015-12-15 12:00:00, 1.332e+07 +349, 2015-12-15 13:00:00, 1.41038e+07 +350, 2015-12-15 14:00:00, 1.332e+07 +351, 2015-12-15 15:00:00, 1.41038e+07 +352, 2015-12-15 16:00:00, 1.332e+07 +353, 2015-12-15 17:00:00, 1.41038e+07 +354, 2015-12-15 18:00:00, 1.332e+07 +355, 2015-12-15 19:00:00, 1.41038e+07 +356, 2015-12-15 20:00:00, 1.332e+07 +357, 2015-12-15 21:00:00, 1.41038e+07 +358, 2015-12-15 22:00:00, 1.332e+07 +359, 2015-12-15 23:00:00, 1.41038e+07 +360, 2015-12-16 00:00:00, 1.332e+07 +361, 2015-12-16 01:00:00, 1.41038e+07 +362, 2015-12-16 02:00:00, 1.332e+07 +363, 2015-12-16 03:00:00, 1.41038e+07 +364, 2015-12-16 04:00:00, 1.332e+07 +365, 2015-12-16 05:00:00, 1.41038e+07 +366, 2015-12-16 06:00:00, 1.332e+07 +367, 2015-12-16 07:00:00, 1.41038e+07 +368, 2015-12-16 08:00:00, 1.332e+07 +369, 2015-12-16 09:00:00, 1.41038e+07 +370, 2015-12-16 10:00:00, 1.332e+07 +371, 2015-12-16 11:00:00, 1.41038e+07 +372, 2015-12-16 12:00:00, 1.332e+07 +373, 2015-12-16 13:00:00, 1.41038e+07 +374, 2015-12-16 14:00:00, 1.332e+07 +375, 2015-12-16 15:00:00, 1.41038e+07 +376, 2015-12-16 16:00:00, 1.332e+07 +377, 2015-12-16 17:00:00, 1.41038e+07 +378, 2015-12-16 18:00:00, 1.332e+07 +379, 2015-12-16 19:00:00, 1.41038e+07 +380, 2015-12-16 20:00:00, 1.332e+07 +381, 2015-12-16 21:00:00, 1.41038e+07 +382, 2015-12-16 22:00:00, 1.332e+07 +383, 2015-12-16 23:00:00, 1.41038e+07 +384, 2015-12-17 00:00:00, 1.332e+07 +385, 2015-12-17 01:00:00, 1.41038e+07 +386, 2015-12-17 02:00:00, 1.332e+07 +387, 2015-12-17 03:00:00, 1.41038e+07 +388, 2015-12-17 04:00:00, 1.332e+07 +389, 2015-12-17 05:00:00, 1.41038e+07 +390, 2015-12-17 06:00:00, 1.332e+07 +391, 2015-12-17 07:00:00, 1.41038e+07 +392, 2015-12-17 08:00:00, 1.332e+07 +393, 2015-12-17 09:00:00, 1.41038e+07 +394, 2015-12-17 10:00:00, 1.332e+07 +395, 2015-12-17 11:00:00, 1.41038e+07 +396, 2015-12-17 12:00:00, 1.332e+07 +397, 2015-12-17 13:00:00, 1.41038e+07 +398, 2015-12-17 14:00:00, 1.332e+07 +399, 2015-12-17 15:00:00, 1.41038e+07 +400, 2015-12-17 16:00:00, 1.332e+07 +401, 2015-12-17 17:00:00, 1.41038e+07 +402, 2015-12-17 18:00:00, 1.332e+07 +403, 2015-12-17 19:00:00, 1.41038e+07 +404, 2015-12-17 20:00:00, 1.332e+07 +405, 2015-12-17 21:00:00, 1.41038e+07 +406, 2015-12-17 22:00:00, 1.332e+07 +407, 2015-12-17 23:00:00, 1.41038e+07 +408, 2015-12-18 00:00:00, 1.332e+07 +409, 2015-12-18 01:00:00, 1.41038e+07 +410, 2015-12-18 02:00:00, 1.332e+07 +411, 2015-12-18 03:00:00, 1.41038e+07 +412, 2015-12-18 04:00:00, 1.332e+07 +413, 2015-12-18 05:00:00, 1.41038e+07 +414, 2015-12-18 06:00:00, 1.332e+07 +415, 2015-12-18 07:00:00, 1.41038e+07 +416, 2015-12-18 08:00:00, 1.332e+07 +417, 2015-12-18 09:00:00, 1.41038e+07 +418, 2015-12-18 10:00:00, 1.332e+07 +419, 2015-12-18 11:00:00, 1.41038e+07 +420, 2015-12-18 12:00:00, 1.332e+07 +421, 2015-12-18 13:00:00, 1.41038e+07 +422, 2015-12-18 14:00:00, 1.332e+07 +423, 2015-12-18 15:00:00, 1.41038e+07 +424, 2015-12-18 16:00:00, 1.332e+07 +425, 2015-12-18 17:00:00, 1.41038e+07 +426, 2015-12-18 18:00:00, 1.332e+07 +427, 2015-12-18 19:00:00, 1.41038e+07 +428, 2015-12-18 20:00:00, 1.332e+07 +429, 2015-12-18 21:00:00, 1.41038e+07 +430, 2015-12-18 22:00:00, 1.332e+07 +431, 2015-12-18 23:00:00, 1.41038e+07 +432, 2015-12-19 00:00:00, 1.332e+07 +433, 2015-12-19 01:00:00, 1.41038e+07 +434, 2015-12-19 02:00:00, 1.332e+07 +435, 2015-12-19 03:00:00, 1.41038e+07 +436, 2015-12-19 04:00:00, 1.332e+07 +437, 2015-12-19 05:00:00, 1.41038e+07 +438, 2015-12-19 06:00:00, 1.332e+07 +439, 2015-12-19 07:00:00, 1.41038e+07 +440, 2015-12-19 08:00:00, 1.332e+07 +441, 2015-12-19 09:00:00, 1.41038e+07 +442, 2015-12-19 10:00:00, 1.332e+07 +443, 2015-12-19 11:00:00, 1.41038e+07 +444, 2015-12-19 12:00:00, 1.332e+07 +445, 2015-12-19 13:00:00, 1.41038e+07 +446, 2015-12-19 14:00:00, 1.332e+07 +447, 2015-12-19 15:00:00, 1.41038e+07 +448, 2015-12-19 16:00:00, 1.332e+07 +449, 2015-12-19 17:00:00, 1.41038e+07 +450, 2015-12-19 18:00:00, 1.332e+07 +451, 2015-12-19 19:00:00, 1.41038e+07 +452, 2015-12-19 20:00:00, 1.332e+07 +453, 2015-12-19 21:00:00, 1.41038e+07 +454, 2015-12-19 22:00:00, 1.332e+07 +455, 2015-12-19 23:00:00, 1.41038e+07 +456, 2015-12-20 00:00:00, 1.332e+07 +457, 2015-12-20 01:00:00, 1.41038e+07 +458, 2015-12-20 02:00:00, 1.332e+07 +459, 2015-12-20 03:00:00, 1.41038e+07 +460, 2015-12-20 04:00:00, 1.332e+07 +461, 2015-12-20 05:00:00, 1.41038e+07 +462, 2015-12-20 06:00:00, 1.332e+07 +463, 2015-12-20 07:00:00, 1.41038e+07 +464, 2015-12-20 08:00:00, 1.332e+07 +465, 2015-12-20 09:00:00, 1.41038e+07 +466, 2015-12-20 10:00:00, 1.332e+07 +467, 2015-12-20 11:00:00, 1.41038e+07 +468, 2015-12-20 12:00:00, 1.332e+07 +469, 2015-12-20 13:00:00, 1.41038e+07 +470, 2015-12-20 14:00:00, 1.332e+07 +471, 2015-12-20 15:00:00, 1.41038e+07 +472, 2015-12-20 16:00:00, 1.332e+07 +473, 2015-12-20 17:00:00, 1.41038e+07 +474, 2015-12-20 18:00:00, 1.332e+07 +475, 2015-12-20 19:00:00, 1.41038e+07 +476, 2015-12-20 20:00:00, 1.332e+07 +477, 2015-12-20 21:00:00, 1.41038e+07 +478, 2015-12-20 22:00:00, 1.332e+07 +479, 2015-12-20 23:00:00, 1.41038e+07 +480, 2015-12-21 00:00:00, 1.332e+07 +481, 2015-12-21 01:00:00, 1.41038e+07 +482, 2015-12-21 02:00:00, 1.332e+07 +483, 2015-12-21 03:00:00, 1.41038e+07 +484, 2015-12-21 04:00:00, 1.332e+07 +485, 2015-12-21 05:00:00, 1.41038e+07 +486, 2015-12-21 06:00:00, 1.332e+07 +487, 2015-12-21 07:00:00, 1.41038e+07 +488, 2015-12-21 08:00:00, 1.332e+07 +489, 2015-12-21 09:00:00, 1.41038e+07 +490, 2015-12-21 10:00:00, 1.332e+07 +491, 2015-12-21 11:00:00, 1.41038e+07 +492, 2015-12-21 12:00:00, 1.332e+07 +493, 2015-12-21 13:00:00, 1.41038e+07 +494, 2015-12-21 14:00:00, 1.332e+07 +495, 2015-12-21 15:00:00, 1.41038e+07 +496, 2015-12-21 16:00:00, 1.332e+07 +497, 2015-12-21 17:00:00, 1.41038e+07 +498, 2015-12-21 18:00:00, 1.332e+07 +499, 2015-12-21 19:00:00, 1.41038e+07 +500, 2015-12-21 20:00:00, 1.332e+07 +501, 2015-12-21 21:00:00, 1.41038e+07 +502, 2015-12-21 22:00:00, 1.332e+07 +503, 2015-12-21 23:00:00, 1.41038e+07 +504, 2015-12-22 00:00:00, 1.332e+07 +505, 2015-12-22 01:00:00, 1.41038e+07 +506, 2015-12-22 02:00:00, 1.332e+07 +507, 2015-12-22 03:00:00, 1.41038e+07 +508, 2015-12-22 04:00:00, 1.332e+07 +509, 2015-12-22 05:00:00, 1.41038e+07 +510, 2015-12-22 06:00:00, 1.332e+07 +511, 2015-12-22 07:00:00, 1.41038e+07 +512, 2015-12-22 08:00:00, 1.332e+07 +513, 2015-12-22 09:00:00, 1.41038e+07 +514, 2015-12-22 10:00:00, 1.332e+07 +515, 2015-12-22 11:00:00, 1.41038e+07 +516, 2015-12-22 12:00:00, 1.332e+07 +517, 2015-12-22 13:00:00, 1.41038e+07 +518, 2015-12-22 14:00:00, 1.332e+07 +519, 2015-12-22 15:00:00, 1.41038e+07 +520, 2015-12-22 16:00:00, 1.332e+07 +521, 2015-12-22 17:00:00, 1.41038e+07 +522, 2015-12-22 18:00:00, 1.332e+07 +523, 2015-12-22 19:00:00, 1.41038e+07 +524, 2015-12-22 20:00:00, 1.332e+07 +525, 2015-12-22 21:00:00, 1.41038e+07 +526, 2015-12-22 22:00:00, 1.332e+07 +527, 2015-12-22 23:00:00, 1.41038e+07 +528, 2015-12-23 00:00:00, 1.332e+07 +529, 2015-12-23 01:00:00, 1.41038e+07 +530, 2015-12-23 02:00:00, 1.332e+07 +531, 2015-12-23 03:00:00, 1.41038e+07 +532, 2015-12-23 04:00:00, 1.332e+07 +533, 2015-12-23 05:00:00, 1.41038e+07 +534, 2015-12-23 06:00:00, 1.332e+07 +535, 2015-12-23 07:00:00, 1.41038e+07 +536, 2015-12-23 08:00:00, 1.332e+07 +537, 2015-12-23 09:00:00, 1.41038e+07 +538, 2015-12-23 10:00:00, 1.332e+07 +539, 2015-12-23 11:00:00, 1.41038e+07 +540, 2015-12-23 12:00:00, 1.332e+07 +541, 2015-12-23 13:00:00, 1.41038e+07 +542, 2015-12-23 14:00:00, 1.332e+07 +543, 2015-12-23 15:00:00, 1.41038e+07 +544, 2015-12-23 16:00:00, 1.332e+07 +545, 2015-12-23 17:00:00, 1.41038e+07 +546, 2015-12-23 18:00:00, 1.332e+07 +547, 2015-12-23 19:00:00, 1.41038e+07 +548, 2015-12-23 20:00:00, 1.332e+07 +549, 2015-12-23 21:00:00, 1.41038e+07 +550, 2015-12-23 22:00:00, 1.332e+07 +551, 2015-12-23 23:00:00, 1.41038e+07 +552, 2015-12-24 00:00:00, 1.332e+07 +553, 2015-12-24 01:00:00, 1.41038e+07 +554, 2015-12-24 02:00:00, 1.332e+07 +555, 2015-12-24 03:00:00, 1.41038e+07 +556, 2015-12-24 04:00:00, 1.332e+07 +557, 2015-12-24 05:00:00, 1.41038e+07 +558, 2015-12-24 06:00:00, 1.332e+07 +559, 2015-12-24 07:00:00, 1.41038e+07 +560, 2015-12-24 08:00:00, 1.332e+07 +561, 2015-12-24 09:00:00, 1.41038e+07 +562, 2015-12-24 10:00:00, 1.332e+07 +563, 2015-12-24 11:00:00, 1.41038e+07 +564, 2015-12-24 12:00:00, 1.332e+07 +565, 2015-12-24 13:00:00, 1.41038e+07 +566, 2015-12-24 14:00:00, 1.332e+07 +567, 2015-12-24 15:00:00, 1.41038e+07 +568, 2015-12-24 16:00:00, 1.332e+07 +569, 2015-12-24 17:00:00, 1.41038e+07 +570, 2015-12-24 18:00:00, 1.332e+07 +571, 2015-12-24 19:00:00, 1.41038e+07 +572, 2015-12-24 20:00:00, 1.332e+07 +573, 2015-12-24 21:00:00, 1.41038e+07 +574, 2015-12-24 22:00:00, 1.332e+07 +575, 2015-12-24 23:00:00, 1.41038e+07 +576, 2015-12-25 00:00:00, 1.332e+07 +577, 2015-12-25 01:00:00, 1.41038e+07 +578, 2015-12-25 02:00:00, 1.332e+07 +579, 2015-12-25 03:00:00, 1.41038e+07 +580, 2015-12-25 04:00:00, 1.332e+07 +581, 2015-12-25 05:00:00, 1.41038e+07 +582, 2015-12-25 06:00:00, 1.332e+07 +583, 2015-12-25 07:00:00, 1.41038e+07 +584, 2015-12-25 08:00:00, 1.332e+07 +585, 2015-12-25 09:00:00, 1.41038e+07 +586, 2015-12-25 10:00:00, 1.332e+07 +587, 2015-12-25 11:00:00, 1.41038e+07 +588, 2015-12-25 12:00:00, 1.332e+07 +589, 2015-12-25 13:00:00, 1.41038e+07 +590, 2015-12-25 14:00:00, 1.332e+07 +591, 2015-12-25 15:00:00, 1.41038e+07 +592, 2015-12-25 16:00:00, 1.332e+07 +593, 2015-12-25 17:00:00, 1.41038e+07 +594, 2015-12-25 18:00:00, 1.332e+07 +595, 2015-12-25 19:00:00, 1.41038e+07 +596, 2015-12-25 20:00:00, 1.332e+07 +597, 2015-12-25 21:00:00, 1.41038e+07 +598, 2015-12-25 22:00:00, 1.332e+07 +599, 2015-12-25 23:00:00, 1.41038e+07 +600, 2015-12-26 00:00:00, 1.332e+07 +601, 2015-12-26 01:00:00, 1.41038e+07 +602, 2015-12-26 02:00:00, 1.332e+07 +603, 2015-12-26 03:00:00, 1.41038e+07 +604, 2015-12-26 04:00:00, 1.332e+07 +605, 2015-12-26 05:00:00, 1.41038e+07 +606, 2015-12-26 06:00:00, 1.332e+07 +607, 2015-12-26 07:00:00, 1.41038e+07 +608, 2015-12-26 08:00:00, 1.332e+07 +609, 2015-12-26 09:00:00, 1.41038e+07 +610, 2015-12-26 10:00:00, 1.332e+07 +611, 2015-12-26 11:00:00, 1.41038e+07 +612, 2015-12-26 12:00:00, 1.332e+07 +613, 2015-12-26 13:00:00, 1.41038e+07 +614, 2015-12-26 14:00:00, 1.332e+07 +615, 2015-12-26 15:00:00, 1.41038e+07 +616, 2015-12-26 16:00:00, 1.332e+07 +617, 2015-12-26 17:00:00, 1.41038e+07 +618, 2015-12-26 18:00:00, 1.332e+07 +619, 2015-12-26 19:00:00, 1.41038e+07 +620, 2015-12-26 20:00:00, 1.332e+07 +621, 2015-12-26 21:00:00, 1.41038e+07 +622, 2015-12-26 22:00:00, 1.332e+07 +623, 2015-12-26 23:00:00, 1.41038e+07 +624, 2015-12-27 00:00:00, 1.332e+07 +625, 2015-12-27 01:00:00, 1.41038e+07 +626, 2015-12-27 02:00:00, 1.332e+07 +627, 2015-12-27 03:00:00, 1.41038e+07 +628, 2015-12-27 04:00:00, 1.332e+07 +629, 2015-12-27 05:00:00, 1.41038e+07 +630, 2015-12-27 06:00:00, 1.332e+07 +631, 2015-12-27 07:00:00, 1.41038e+07 +632, 2015-12-27 08:00:00, 1.332e+07 +633, 2015-12-27 09:00:00, 1.41038e+07 +634, 2015-12-27 10:00:00, 1.332e+07 +635, 2015-12-27 11:00:00, 1.41038e+07 +636, 2015-12-27 12:00:00, 1.332e+07 +637, 2015-12-27 13:00:00, 1.41038e+07 +638, 2015-12-27 14:00:00, 1.332e+07 +639, 2015-12-27 15:00:00, 1.41038e+07 +640, 2015-12-27 16:00:00, 1.332e+07 +641, 2015-12-27 17:00:00, 1.41038e+07 +642, 2015-12-27 18:00:00, 1.332e+07 +643, 2015-12-27 19:00:00, 1.41038e+07 +644, 2015-12-27 20:00:00, 1.332e+07 +645, 2015-12-27 21:00:00, 1.41038e+07 +646, 2015-12-27 22:00:00, 1.332e+07 +647, 2015-12-27 23:00:00, 1.41038e+07 +648, 2015-12-28 00:00:00, 1.332e+07 +649, 2015-12-28 01:00:00, 1.41038e+07 +650, 2015-12-28 02:00:00, 1.332e+07 +651, 2015-12-28 03:00:00, 1.41038e+07 +652, 2015-12-28 04:00:00, 1.332e+07 +653, 2015-12-28 05:00:00, 1.41038e+07 +654, 2015-12-28 06:00:00, 1.332e+07 +655, 2015-12-28 07:00:00, 1.41038e+07 +656, 2015-12-28 08:00:00, 1.332e+07 +657, 2015-12-28 09:00:00, 1.41038e+07 +658, 2015-12-28 10:00:00, 1.332e+07 +659, 2015-12-28 11:00:00, 1.41038e+07 +660, 2015-12-28 12:00:00, 1.332e+07 +661, 2015-12-28 13:00:00, 1.41038e+07 +662, 2015-12-28 14:00:00, 1.332e+07 +663, 2015-12-28 15:00:00, 1.41038e+07 +664, 2015-12-28 16:00:00, 1.332e+07 +665, 2015-12-28 17:00:00, 1.41038e+07 +666, 2015-12-28 18:00:00, 1.332e+07 +667, 2015-12-28 19:00:00, 1.41038e+07 +668, 2015-12-28 20:00:00, 1.332e+07 +669, 2015-12-28 21:00:00, 1.41038e+07 +670, 2015-12-28 22:00:00, 1.332e+07 +671, 2015-12-28 23:00:00, 1.41038e+07 +672, 2015-12-29 00:00:00, 1.332e+07 +673, 2015-12-29 01:00:00, 1.41038e+07 +674, 2015-12-29 02:00:00, 1.332e+07 +675, 2015-12-29 03:00:00, 1.41038e+07 +676, 2015-12-29 04:00:00, 1.332e+07 +677, 2015-12-29 05:00:00, 1.41038e+07 +678, 2015-12-29 06:00:00, 1.332e+07 +679, 2015-12-29 07:00:00, 1.41038e+07 +680, 2015-12-29 08:00:00, 1.332e+07 +681, 2015-12-29 09:00:00, 1.41038e+07 +682, 2015-12-29 10:00:00, 1.332e+07 +683, 2015-12-29 11:00:00, 1.41038e+07 +684, 2015-12-29 12:00:00, 1.332e+07 +685, 2015-12-29 13:00:00, 1.41038e+07 +686, 2015-12-29 14:00:00, 1.332e+07 +687, 2015-12-29 15:00:00, 1.41038e+07 +688, 2015-12-29 16:00:00, 1.332e+07 +689, 2015-12-29 17:00:00, 1.41038e+07 +690, 2015-12-29 18:00:00, 1.332e+07 +691, 2015-12-29 19:00:00, 1.41038e+07 +692, 2015-12-29 20:00:00, 1.332e+07 +693, 2015-12-29 21:00:00, 1.41038e+07 +694, 2015-12-29 22:00:00, 1.332e+07 +695, 2015-12-29 23:00:00, 1.41038e+07 +696, 2015-12-30 00:00:00, 1.332e+07 +697, 2015-12-30 01:00:00, 1.41038e+07 +698, 2015-12-30 02:00:00, 1.332e+07 +699, 2015-12-30 03:00:00, 1.41038e+07 +700, 2015-12-30 04:00:00, 1.332e+07 +701, 2015-12-30 05:00:00, 1.41038e+07 +702, 2015-12-30 06:00:00, 1.332e+07 +703, 2015-12-30 07:00:00, 1.41038e+07 +704, 2015-12-30 08:00:00, 1.332e+07 +705, 2015-12-30 09:00:00, 1.41038e+07 +706, 2015-12-30 10:00:00, 1.332e+07 +707, 2015-12-30 11:00:00, 1.41038e+07 +708, 2015-12-30 12:00:00, 1.332e+07 +709, 2015-12-30 13:00:00, 1.41038e+07 +710, 2015-12-30 14:00:00, 1.332e+07 +711, 2015-12-30 15:00:00, 1.41038e+07 +712, 2015-12-30 16:00:00, 1.332e+07 +713, 2015-12-30 17:00:00, 1.41038e+07 +714, 2015-12-30 18:00:00, 1.332e+07 +715, 2015-12-30 19:00:00, 1.41038e+07 +716, 2015-12-30 20:00:00, 1.332e+07 +717, 2015-12-30 21:00:00, 1.41038e+07 +718, 2015-12-30 22:00:00, 1.332e+07 +719, 2015-12-30 23:00:00, 1.41038e+07 diff --git a/test/unit_test_hyfeature/channel_forcing/schout_1.nc b/test/unit_test_hyfeature/channel_forcing/schout_1.nc new file mode 100644 index 000000000..dea94bc49 Binary files /dev/null and b/test/unit_test_hyfeature/channel_forcing/schout_1.nc differ diff --git a/test/unit_test_hyfeature/domain/coastal_boundary_domain.yaml b/test/unit_test_hyfeature/domain/coastal_boundary_domain.yaml new file mode 100644 index 000000000..3374cc333 --- /dev/null +++ b/test/unit_test_hyfeature/domain/coastal_boundary_domain.yaml @@ -0,0 +1,4 @@ +10237: 0 # Lower Colorado River +#5781901: 252935 # Lower Colorado River + + diff --git a/test/unit_test_hyfeature/domain/coastal_domain.yaml b/test/unit_test_hyfeature/domain/coastal_domain.yaml new file mode 100644 index 000000000..9bda405ce --- /dev/null +++ b/test/unit_test_hyfeature/domain/coastal_domain.yaml @@ -0,0 +1,10 @@ +10237: + links: + - 10236 + - 10237 + rfc: + - wgrfc + rpu: + - 12d + upstream_boundary_link_mainstem: + - 10236 diff --git a/test/unit_test_hyfeature/domain/gauge_01069700.gpkg b/test/unit_test_hyfeature/domain/gauge_01069700.gpkg new file mode 100644 index 000000000..48b20ae7b Binary files /dev/null and b/test/unit_test_hyfeature/domain/gauge_01069700.gpkg differ diff --git a/test/unit_test_hyfeature/lakeout/.gitkeep b/test/unit_test_hyfeature/lakeout/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/test/unit_test_hyfeature/lastobs/.gitkeep b/test/unit_test_hyfeature/lastobs/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/test/unit_test_hyfeature/output/.gitkeep b/test/unit_test_hyfeature/output/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/test/unit_test_hyfeature/restart/201512010000NEXOUT.csv b/test/unit_test_hyfeature/restart/201512010000NEXOUT.csv new file mode 100644 index 000000000..57a2a30d4 --- /dev/null +++ b/test/unit_test_hyfeature/restart/201512010000NEXOUT.csv @@ -0,0 +1,8 @@ +feature_id,201512010000 +10238,1097500.0 +1000000001,1097500.0 +2,1097500.0 +4,1097500.0 +10236,1097500.0 +3,1097500.0 +10237,1097500.0 diff --git a/test/unit_test_hyfeature/rfc_TimeSeries/.gitkeep b/test/unit_test_hyfeature/rfc_TimeSeries/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/test/unit_test_hyfeature/unittest_hyfeature.yaml b/test/unit_test_hyfeature/unittest_hyfeature.yaml new file mode 100644 index 000000000..a74b827be --- /dev/null +++ b/test/unit_test_hyfeature/unittest_hyfeature.yaml @@ -0,0 +1,104 @@ +# $ python -m nwm_routing -f -V3 test_AnA.yaml +#-------------------------------------------------------------------------------- +log_parameters: + #---------- + showtiming: True + log_level : DEBUG +#-------------------------------------------------------------------------------- +network_topology_parameters: + #---------- + supernetwork_parameters: + #---------- + geo_file_type: HYFeaturesNetwork #NHDNetwork + geo_file_path: domain/gauge_01069700.gpkg #domain/RouteLink_NWMv2.1.nc + mask_file_path: # domain/unit_test_noRS/coastal_subset.txt + synthetic_wb_segments: + #- 4800002 + #- 4800004 + #- 4800006 + #- 4800007 + waterbody_parameters: + #---------- + break_network_at_waterbodies: False + level_pool: + #---------- + level_pool_waterbody_parameter_file_path: domain/gauge_01069700.gpkg #domain/LAKEPARM_NWMv2.1.nc + reservoir_parameter_file : domain/gauge_01069700.gpkg #domain/reservoir_index_AnA.nc + #rfc: + #---------- + #reservoir_parameter_file : domain/reservoir_index_AnA.nc + #reservoir_rfc_forecasts : False + #reservoir_rfc_forecasts_time_series_path: rfc_TimeSeries/ + #reservoir_rfc_forecasts_lookback_hours : 48 +#-------------------------------------------------------------------------------- +compute_parameters: + #---------- + parallel_compute_method: by-subnetwork-jit-clustered #serial + compute_kernel : V02-structured + assume_short_ts : True + subnetwork_target_size : 10000 + cpu_pool : 36 + restart_parameters: + #---------- + #wrf_hydro_channel_restart_file: restart/HYDRO_RST.2020-08-26_00:00_DOMAIN1 + #wrf_hydro_channel_ID_crosswalk_file: domain/RouteLink_NWMv2.1.nc + #wrf_hydro_waterbody_restart_file: restart/HYDRO_RST.2020-08-26_00:00_DOMAIN1 + #wrf_hydro_waterbody_ID_crosswalk_file : domain/LAKEPARM_NWMv2.1.nc + #wrf_hydro_waterbody_crosswalk_filter_file: domain/LAKEPARM_NWMv2.1.nc + hyfeature_channel_restart_file: restart/201512010000NEXOUT.csv + hybrid_parameters: + run_hybrid_routing: True + diffusive_domain : domain/coastal_domain.yaml + use_natl_xsections: False + topobathy_domain : # domain/final_diffusive_natural_xs.nc + run_refactored_network: False + refactored_domain: # domain/unit_test_noRS/refactored_coastal_domain.yaml + refactored_topobathy_domain: # domain/refac_final_diffusive_natural_xs.nc + coastal_boundary_domain: domain/coastal_boundary_domain.yaml + forcing_parameters: + #---------- + qts_subdivisions : 12 + dt : 300 # [sec] + qlat_input_folder : channel_forcing/ + qlat_file_pattern_filter : "*.CHRTOUT_DOMAIN1" + nexus_input_folder : channel_forcing/ + nexus_file_pattern_filter : "*NEXOUT.csv" + coastal_boundary_input_file : channel_forcing/schout_1.nc + nts : 48 #288 for 1day + max_loop_size : 2 # [hr] + data_assimilation_parameters: + #---------- + usgs_timeslices_folder : #usgs_TimeSlice/ + usace_timeslices_folder : #usace_TimeSlice/ + timeslice_lookback_hours : #48 + qc_threshold : #1 + streamflow_da: + #---------- + streamflow_nudging : False + diffusive_streamflow_nudging : False + gage_segID_crosswalk_file : # domain/RouteLink_NWMv2.1.nc + crosswalk_gage_field : # 'gages' + crosswalk_segID_field : # 'link' + wrf_hydro_lastobs_file : + lastobs_output_folder : lastobs/ + reservoir_da: + #---------- + reservoir_persistence_usgs : False + reservoir_persistence_usace : False + gage_lakeID_crosswalk_file : # domain/reservoir_index_AnA.nc +#-------------------------------------------------------------------------------- +output_parameters: + #---------- + test_output: output/unit_test_hyfeature.pkl + lite_restart: + #---------- + lite_restart_output_directory: restart/ + chrtout_output: + #---------- + #wrf_hydro_channel_output_source_folder: channel_forcing/ + chanobs_output: + #---------- + chanobs_output_directory: output/ + chanobs_filepath : Chanobs.nc + lakeout_output: lakeout/ + \ No newline at end of file diff --git a/test/unit_test_hyfeature/usace_TimeSlice/.gitkeep b/test/unit_test_hyfeature/usace_TimeSlice/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/test/unit_test_hyfeature/usgs_TimeSlice/.gitkeep b/test/unit_test_hyfeature/usgs_TimeSlice/.gitkeep new file mode 100644 index 000000000..e69de29bb