From d697819781bf5acaf00543d5feb174a589ceb1dc Mon Sep 17 00:00:00 2001 From: Dong Kim Date: Tue, 8 Nov 2022 12:46:25 -0700 Subject: [PATCH 1/7] working version 1 --- src/troute-network/troute/nhd_io.py | 33 +- .../channel_forcing/nex-10236_output.csv | 720 ++++++++++++++++++ .../channel_forcing/nex-10237_output.csv | 720 ++++++++++++++++++ .../channel_forcing/nex-10238_output.csv | 720 ++++++++++++++++++ .../channel_forcing/schout_1.nc | Bin 0 -> 25915 bytes .../domain/coastal_boundary_domain.yaml | 4 + .../domain/coastal_domain.yaml | 10 + .../domain/gauge_01069700.gpkg | Bin 0 -> 184320 bytes .../unittest_hyfeature.yaml | 99 +++ 9 files changed, 2305 insertions(+), 1 deletion(-) create mode 100644 test/unit_test_hyfeature/channel_forcing/nex-10236_output.csv create mode 100644 test/unit_test_hyfeature/channel_forcing/nex-10237_output.csv create mode 100644 test/unit_test_hyfeature/channel_forcing/nex-10238_output.csv create mode 100644 test/unit_test_hyfeature/channel_forcing/schout_1.nc create mode 100644 test/unit_test_hyfeature/domain/coastal_boundary_domain.yaml create mode 100644 test/unit_test_hyfeature/domain/coastal_domain.yaml create mode 100644 test/unit_test_hyfeature/domain/gauge_01069700.gpkg create mode 100644 test/unit_test_hyfeature/unittest_hyfeature.yaml diff --git a/src/troute-network/troute/nhd_io.py b/src/troute-network/troute/nhd_io.py index 0f0349775..c92059645 100644 --- a/src/troute-network/troute/nhd_io.py +++ b/src/troute-network/troute/nhd_io.py @@ -86,7 +86,7 @@ def read_config_file(custom_input_file): data_assimilation_parameters (dict): Input parameters re data assimilation ''' - + import pdb; pdb.set_trace() if custom_input_file[-4:] == "yaml": with open(custom_input_file) as custom_file: data = yaml.load(custom_file, Loader=yaml.SafeLoader) @@ -99,6 +99,37 @@ 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": + params = { + "title_string":"HY_Features Test", + "geo_file_path":supernetwork_parameters['geo_file_path'], + "flowpath_edge_list": None, + "columns": { + #link???? + "key": "id", + "downstream": "toid", + "dx": "lengthkm", + "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` + }, + "waterbody_null_code": -9999, + "terminal_code": 0, + "waterbody_null_code": -9999, + "driver_string": "NetCDF", + "layer_string": 0 + } + supernetwork_parameters['hyfeature_params'] = params + preprocessing_parameters = network_topology_parameters.get( "preprocessing_parameters", {} ) 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 0000000000000000000000000000000000000000..dea94bc498e6aa88554700acad0c098fe0ea431a GIT binary patch literal 25915 zcmeHP3v^RO8lIc9P-u!g%S$A@6oe*iDG#B!Jkpj{N~uj{ee5x$$!!}Zby2uf90MUJ`$6cuF^0bvD~moEGNGk4l#lJHn%ck$eT z=D#!Z{qy+epMUP1`R{$WFs~r3bHC06LrMxsB3dU<%MDsW@JaNIUC@gpgj>LQ@FQcP7m`#!{kZG^o-Jy)iEF0!dQPU85Z7$Uq&2 z5z-MdX<3le-D|TJ7TIRltE>EOm)+}gDKA~4LZKXls@0Gr#iP{CAEajXVVP>3B-y3Z z2CL`GESH2NVAaC^Kmse?Ik~W)tgw`%K;^nfrR5q`sgC_KeC)WUaH_VNss6>g0BmiX ztmxsOs>QuH=j*oXw@fWB%!3wzDs_Wo*YG21-JJ=q<<)D~rBYNUM5QrQGApAUHU6dv zTMKMZ7U8|%ip(jmHHnmxd&qEzvYd3R7(#zW+Nk%1IiF4~FD`)A%|uO~PDm#pp3xs? zkd4SX8Wo+84<2%v$zr%56H%^&1k?K!kS`E%Hy8*YFP>>BCSkZBlVE-V+4uG4MPw!> zKp60Oj)Qi3UjK8h_A30lNhkIak8T6I*6}x|nr5r(_%Y-i#d=e`*4UMNh=sy}ic{^?#^AF^;(TJ5jd>E>^dncvlo|PmLaxd1M;ipR zyxJWw!heU+s|2li1x6P<+j|3UpVwFs3L3q>V0%`b!|!%fcodV7hiqb?_DLdLhyiM` zmncD}t1>6gUE_8^>0QAvG!V7?TxFNGYV|Be8L|bC3psVhD!Cxmp|%9v-nyh zfmwfxW-Z_SO}~P|ys3oW+0c?FxnK5Nu7u*r1|N~QY;c0=LIA z%i#$rw2g6Z^(bDwLF5&4%D7H1kYJ(1LG<{%Rd%lfTEzkmCW@Ei%b~#>Tj2;Oc9$a< zi5(PyHD+gKXBv&;joD+>(abbuLIMqVi5kK-o+$9=Re=Bq~K*){tXhfL0}<$-a5q_1RI9B z$W#Y!^7t573o^1ynWK!iPAe%KF-l0z0_ExGKl=INDleo6Kt z0=7E!Ko&1Exkw8lpbR{U$(!A26#;iDLT0l^3g;7#9bzXyrH}~0x$E6Sq&u=e87M?= zuRD&C0=1T8NT{tIaX$aS{8MnLg)1e2$m1M!WJshkkVr*{8uO^ZiyF8nU5QeQD3$2D z;Wo_^<4TR|rItI*I|H+v=6H=RTGFs@JB~ z=kvSVUT~mcE=7ra+W7Ver&u611U-}DyFJF9pirI!K5~R?1(!$WFjS)isu7E>I0pFR z9gcj-R3g2prx5!1*{i`F@Lr!c=SHc5=P?!vO=ZH%Poo`iC(aR3o}1Sd~E>zB)R`1e`kr0F{jwB`VsI00n;Mme0z*$YCr!+5@6?_Il}vB zd`vmL=y@mjv9qntnDb86sE$@xr@2w(N1Ywp&Q`hE<F5RjjM{-*o9-q_E=41-(iD%OcaHi1#I4*C7b4f%}KErXeyKVf71IW)N7&lC& zeK9sO+UIpOzLU|0-D>*#jIR8fn*R}_jh`^u@EN1CK4-MgK}PrfozazFF?!e6j2e$H zdf+IdjmH?>e4NpSe=r*QmeE-!7#(+#(LUcXdPb#t|HXWF z#kZ@N{9}KcoGgvwq*w?|*(Tul#+nF!Tfpf>fEwQ;;MnF{EO?)QLx}jQ7vtpRB>K=$s(|C)D-!GNA>a%mK#lhoaO&5EV$eeb zT$dOGOBgBO61jh}V}y2pQrv)#7bXhjsb4ILfm#I|-Ia|&!6yj?9BwAY3pN4QGad-i z?i6rsUuqQaP60`o$>=lO7Rp{2c=k z{)B+LRs^W=6#{NR0^Di=cU=P9dI5)D7l;=&3pisu5TrE;xIqbU+XUR;1h}^a+>ivg zJpyiM0^B|UH!K0}a{&iC{&B-$0e3@O6d@-B-0%dra{^91KZ`-@h2xVOV-PGMRlto* zfa@XP;6x#A=r7@J@;Dpf$e{?e6@CS_&xo*mh*QQS{k~YwRn$(TDlZS z@^IUTmLA8qS|03TYB_VrZ`uFnvX%j(Mp&B0w1z+2=*=B)s891A$MWWk=MU%3DVZ3) z(YM25dt*X4r7T-s(0aJ}*36~yw`V$qx7EBLH&o?>kL`a|9$ntpoSX56yywLcmR;X& zlS7}hT1qXuDZ-~Cm(uK4jhgnd>}1Hp1uAZxoAtJ?A)?j aUbOEqd6e-T*(W_O7r(q^a?=eJQ~nJa#1`WK literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..48b20ae7beedcfb9e92118d89ecd8f454477f2e0 GIT binary patch literal 184320 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%0Apb5nhnoB_AM>p$ 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 SSp9pagxo3di{>qS{r> Date: Mon, 21 Nov 2022 20:53:49 -0700 Subject: [PATCH 2/7] t-route with hyfeature: prepare channel connection, forcing, t0, hybrid routing network --- .../troute/HYFeaturesNetwork.py | 294 ++++--- .../troute/hyfeature_network_utilities.py | 233 ++++++ .../troute/hyfeature_preprocess.py | 785 ++++++++++++++++++ src/troute-nwm/src/nwm_routing/__main__.py | 81 +- src/troute-routing/troute/routing/compute.py | 10 +- .../troute/routing/fast_reach/mc_reach.pyx | 4 +- .../channel_forcing/201512010000NEXOUT.csv | 8 + .../channel_forcing/201512010100NEXOUT.csv | 8 + .../channel_forcing/201512010200NEXOUT.csv | 8 + .../channel_forcing/201512010300NEXOUT.csv | 8 + .../channel_forcing/201512010400NEXOUT.csv | 8 + .../channel_forcing/201512010500NEXOUT.csv | 8 + .../channel_forcing/201512010600NEXOUT.csv | 8 + .../channel_forcing/201512010700NEXOUT.csv | 8 + .../channel_forcing/201512010800NEXOUT.csv | 8 + .../channel_forcing/201512010900NEXOUT.csv | 8 + .../channel_forcing/201512011000NEXOUT.csv | 8 + .../channel_forcing/201512011100NEXOUT.csv | 8 + .../channel_forcing/201512011200NEXOUT.csv | 8 + .../channel_forcing/201512011300NEXOUT.csv | 8 + .../channel_forcing/201512011400NEXOUT.csv | 8 + .../channel_forcing/201512011500NEXOUT.csv | 8 + .../channel_forcing/201512011600NEXOUT.csv | 8 + .../channel_forcing/201512011700NEXOUT.csv | 8 + .../channel_forcing/201512011800NEXOUT.csv | 8 + .../channel_forcing/201512011900NEXOUT.csv | 8 + .../channel_forcing/201512012000NEXOUT.csv | 8 + .../channel_forcing/201512012100NEXOUT.csv | 8 + .../channel_forcing/201512012200NEXOUT.csv | 8 + .../channel_forcing/201512012300NEXOUT.csv | 8 + .../channel_forcing/201512020000NEXOUT.csv | 8 + .../channel_forcing/201512020100NEXOUT.csv | 8 + .../channel_forcing/201512020200NEXOUT.csv | 8 + .../channel_forcing/201512020300NEXOUT.csv | 8 + .../channel_forcing/201512020400NEXOUT.csv | 8 + .../channel_forcing/201512020500NEXOUT.csv | 8 + .../channel_forcing/201512020600NEXOUT.csv | 8 + .../channel_forcing/201512020700NEXOUT.csv | 8 + .../channel_forcing/201512020800NEXOUT.csv | 8 + .../channel_forcing/201512020900NEXOUT.csv | 8 + .../channel_forcing/201512021000NEXOUT.csv | 8 + .../channel_forcing/201512021100NEXOUT.csv | 8 + .../channel_forcing/201512021200NEXOUT.csv | 8 + .../channel_forcing/201512021300NEXOUT.csv | 8 + .../channel_forcing/201512021400NEXOUT.csv | 8 + .../channel_forcing/201512021500NEXOUT.csv | 8 + .../channel_forcing/201512021600NEXOUT.csv | 8 + .../channel_forcing/201512021700NEXOUT.csv | 8 + .../channel_forcing/201512021800NEXOUT.csv | 8 + .../channel_forcing/201512021900NEXOUT.csv | 8 + .../channel_forcing/201512022000NEXOUT.csv | 8 + .../channel_forcing/201512022100NEXOUT.csv | 8 + .../channel_forcing/201512022200NEXOUT.csv | 8 + .../channel_forcing/201512022300NEXOUT.csv | 8 + .../restart/201512010000NEXOUT.csv | 8 + .../unittest_hyfeature.yaml | 42 +- 56 files changed, 1636 insertions(+), 205 deletions(-) create mode 100644 src/troute-network/troute/hyfeature_network_utilities.py create mode 100644 src/troute-network/troute/hyfeature_preprocess.py create mode 100644 test/unit_test_hyfeature/channel_forcing/201512010000NEXOUT.csv create mode 100644 test/unit_test_hyfeature/channel_forcing/201512010100NEXOUT.csv create mode 100644 test/unit_test_hyfeature/channel_forcing/201512010200NEXOUT.csv create mode 100644 test/unit_test_hyfeature/channel_forcing/201512010300NEXOUT.csv create mode 100644 test/unit_test_hyfeature/channel_forcing/201512010400NEXOUT.csv create mode 100644 test/unit_test_hyfeature/channel_forcing/201512010500NEXOUT.csv create mode 100644 test/unit_test_hyfeature/channel_forcing/201512010600NEXOUT.csv create mode 100644 test/unit_test_hyfeature/channel_forcing/201512010700NEXOUT.csv create mode 100644 test/unit_test_hyfeature/channel_forcing/201512010800NEXOUT.csv create mode 100644 test/unit_test_hyfeature/channel_forcing/201512010900NEXOUT.csv create mode 100644 test/unit_test_hyfeature/channel_forcing/201512011000NEXOUT.csv create mode 100644 test/unit_test_hyfeature/channel_forcing/201512011100NEXOUT.csv create mode 100644 test/unit_test_hyfeature/channel_forcing/201512011200NEXOUT.csv create mode 100644 test/unit_test_hyfeature/channel_forcing/201512011300NEXOUT.csv create mode 100644 test/unit_test_hyfeature/channel_forcing/201512011400NEXOUT.csv create mode 100644 test/unit_test_hyfeature/channel_forcing/201512011500NEXOUT.csv create mode 100644 test/unit_test_hyfeature/channel_forcing/201512011600NEXOUT.csv create mode 100644 test/unit_test_hyfeature/channel_forcing/201512011700NEXOUT.csv create mode 100644 test/unit_test_hyfeature/channel_forcing/201512011800NEXOUT.csv create mode 100644 test/unit_test_hyfeature/channel_forcing/201512011900NEXOUT.csv create mode 100644 test/unit_test_hyfeature/channel_forcing/201512012000NEXOUT.csv create mode 100644 test/unit_test_hyfeature/channel_forcing/201512012100NEXOUT.csv create mode 100644 test/unit_test_hyfeature/channel_forcing/201512012200NEXOUT.csv create mode 100644 test/unit_test_hyfeature/channel_forcing/201512012300NEXOUT.csv create mode 100644 test/unit_test_hyfeature/channel_forcing/201512020000NEXOUT.csv create mode 100644 test/unit_test_hyfeature/channel_forcing/201512020100NEXOUT.csv create mode 100644 test/unit_test_hyfeature/channel_forcing/201512020200NEXOUT.csv create mode 100644 test/unit_test_hyfeature/channel_forcing/201512020300NEXOUT.csv create mode 100644 test/unit_test_hyfeature/channel_forcing/201512020400NEXOUT.csv create mode 100644 test/unit_test_hyfeature/channel_forcing/201512020500NEXOUT.csv create mode 100644 test/unit_test_hyfeature/channel_forcing/201512020600NEXOUT.csv create mode 100644 test/unit_test_hyfeature/channel_forcing/201512020700NEXOUT.csv create mode 100644 test/unit_test_hyfeature/channel_forcing/201512020800NEXOUT.csv create mode 100644 test/unit_test_hyfeature/channel_forcing/201512020900NEXOUT.csv create mode 100644 test/unit_test_hyfeature/channel_forcing/201512021000NEXOUT.csv create mode 100644 test/unit_test_hyfeature/channel_forcing/201512021100NEXOUT.csv create mode 100644 test/unit_test_hyfeature/channel_forcing/201512021200NEXOUT.csv create mode 100644 test/unit_test_hyfeature/channel_forcing/201512021300NEXOUT.csv create mode 100644 test/unit_test_hyfeature/channel_forcing/201512021400NEXOUT.csv create mode 100644 test/unit_test_hyfeature/channel_forcing/201512021500NEXOUT.csv create mode 100644 test/unit_test_hyfeature/channel_forcing/201512021600NEXOUT.csv create mode 100644 test/unit_test_hyfeature/channel_forcing/201512021700NEXOUT.csv create mode 100644 test/unit_test_hyfeature/channel_forcing/201512021800NEXOUT.csv create mode 100644 test/unit_test_hyfeature/channel_forcing/201512021900NEXOUT.csv create mode 100644 test/unit_test_hyfeature/channel_forcing/201512022000NEXOUT.csv create mode 100644 test/unit_test_hyfeature/channel_forcing/201512022100NEXOUT.csv create mode 100644 test/unit_test_hyfeature/channel_forcing/201512022200NEXOUT.csv create mode 100644 test/unit_test_hyfeature/channel_forcing/201512022300NEXOUT.csv create mode 100644 test/unit_test_hyfeature/restart/201512010000NEXOUT.csv diff --git a/src/troute-network/troute/HYFeaturesNetwork.py b/src/troute-network/troute/HYFeaturesNetwork.py index 1883e3ba5..1d447d1b8 100644 --- a/src/troute-network/troute/HYFeaturesNetwork.py +++ b/src/troute-network/troute/HYFeaturesNetwork.py @@ -9,6 +9,8 @@ from itertools import chain import geopandas as gpd from pathlib import Path +import math +import troute.hyfeature_preprocess as hyfeature_prep __verbose__ = False __showtiming__ = False @@ -92,6 +94,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 +104,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 +180,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 +205,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 +314,48 @@ 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) + + @property def downstream_flowpath_dict(self): return self._flowpath_dict @@ -407,4 +404,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/hyfeature_network_utilities.py b/src/troute-network/troute/hyfeature_network_utilities.py new file mode 100644 index 000000000..5c78ccd38 --- /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 = 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..ea02a3eac --- /dev/null +++ b/src/troute-network/troute/hyfeature_preprocess.py @@ -0,0 +1,785 @@ +import time +import pathlib +import logging +from datetime import datetime +from collections import defaultdict +from pathlib import Path + +import pandas as pd +import numpy as np +import xarray as xr + +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 + + hybrid_params = waterbody_parameters.get('hybrid_and_rfc', None) + try: #FIXME for HYFeatures/ngen this will likely be a lot different... + 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 + waterbody_types_df =( + waterbody_types_df.reset_index() + .drop_duplicates(subset=lake_id) + .set_index(lake_id) + ) + except: + waterbody_types_df = pd.DataFrame(index=waterbody_df.index) + 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] + + waterbody_df['member_wbs'] = waterbody_df['member_wbs'].apply(make_list) + waterbody_df['partial_length_percent'] = waterbody_df['partial_length_percent'].apply(make_list) + adjust = [ zip(x, y) + for x, y in + zip(waterbody_df['member_wbs'], 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): + # 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': + dataframe.loc[wb, 'dx'] = dataframe.loc[wb, 'dx'] - dataframe.loc[wb, 'dx']*float(percent) + + 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)) + ''' + 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 \ No newline at end of file diff --git a/src/troute-nwm/src/nwm_routing/__main__.py b/src/troute-nwm/src/nwm_routing/__main__.py index 596261af6..9e8309a20 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]) + if supernetwork_parameters["geo_file_type"] == 'NHDNetwork': + data_assimilation = AllDA(data_assimilation_parameters, + run_parameters, + waterbody_parameters, + network, + da_sets[0]) + # TODO: apply data_assimilation for hyfeature network 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") @@ -150,7 +165,7 @@ def main_v04(argv): if showtiming: route_start_time = time.time() - + import pdb; pdb.set_trace() run_results = nwm_route( network.connections, network.reverse_network, @@ -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,11 +204,11 @@ def main_v04(argv): network.coastal_boundary_depth_df, network.unrefactored_topobathy_df, ) - + import pdb; pdb.set_trace() # 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 @@ -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) @@ -253,11 +269,12 @@ def main_v04(argv): network.link_gage_df, 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..6d68f4482 100644 --- a/src/troute-routing/troute/routing/compute.py +++ b/src/troute-routing/troute/routing/compute.py @@ -249,7 +249,7 @@ def compute_nhd_routing_v02( waterbody_type_specified, subnetwork_list, ): - + import pdb; pdb.set_trace() da_decay_coefficient = da_parameter_dict.get("da_decay_coefficient", 0) param_df["dt"] = dt param_df = param_df.astype("float32") @@ -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() @@ -1201,7 +1201,7 @@ def compute_diffusive_routing( coastal_boundary_depth_bytw_df = coastal_boundary_depth_df.loc[tw].to_frame().T else: coastal_boundary_depth_bytw_df = pd.DataFrame() - + import pdb; pdb.set_trace() # build diffusive inputs diffusive_inputs = diff_utils.diffusive_input_data_v02( tw, 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/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/unittest_hyfeature.yaml b/test/unit_test_hyfeature/unittest_hyfeature.yaml index 335174f57..78564141f 100644 --- a/test/unit_test_hyfeature/unittest_hyfeature.yaml +++ b/test/unit_test_hyfeature/unittest_hyfeature.yaml @@ -9,25 +9,26 @@ network_topology_parameters: #---------- supernetwork_parameters: #---------- - geo_file_path: domain/gauge_01069700.gpkg #domain/RouteLink_NWMv2.1.nc + 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: + #waterbody_parameters: #---------- - break_network_at_waterbodies: False - level_pool: + #break_network_at_waterbodies: False + #level_pool: #---------- - level_pool_waterbody_parameter_file_path: # domain/LAKEPARM_NWMv2.1.nc - rfc: + #level_pool_waterbody_parameter_file_path: domain/LAKEPARM_NWMv2.1.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 + #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: #---------- @@ -38,29 +39,32 @@ compute_parameters: 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 + #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/unit_test_noRS/coastal_domain.yaml + 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/unit_test_noRS/coastal_boundary_domain.yaml + coastal_boundary_domain: domain/coastal_boundary_domain.yaml forcing_parameters: #---------- qts_subdivisions : 12 dt : 300 # [sec] - qlat_input_folder : channel_forcing/ + 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 : 24 # [hr] + max_loop_size : 2 # [hr] data_assimilation_parameters: #---------- usgs_timeslices_folder : #usgs_TimeSlice/ From d7a52885a61a01d52081ad645748a1788c7c0d13 Mon Sep 17 00:00:00 2001 From: Dong Kim Date: Mon, 21 Nov 2022 21:04:13 -0700 Subject: [PATCH 3/7] add empty folders --- test/unit_test_hyfeature/lakeout/.gitkeep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 test/unit_test_hyfeature/lakeout/.gitkeep diff --git a/test/unit_test_hyfeature/lakeout/.gitkeep b/test/unit_test_hyfeature/lakeout/.gitkeep new file mode 100644 index 000000000..e69de29bb From 34581ef82db00826aa59c4b588b141a0f45158a9 Mon Sep 17 00:00:00 2001 From: Dong Kim Date: Mon, 21 Nov 2022 21:06:12 -0700 Subject: [PATCH 4/7] add second empty folders --- test/unit_test_hyfeature/lastobs/.gitkeep | 0 test/unit_test_hyfeature/output/.gitkeep | 0 test/unit_test_hyfeature/rfc_TimeSeries/.gitkeep | 0 test/unit_test_hyfeature/usace_TimeSlice/.gitkeep | 0 test/unit_test_hyfeature/usgs_TimeSlice/.gitkeep | 0 5 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 test/unit_test_hyfeature/lastobs/.gitkeep create mode 100644 test/unit_test_hyfeature/output/.gitkeep create mode 100644 test/unit_test_hyfeature/rfc_TimeSeries/.gitkeep create mode 100644 test/unit_test_hyfeature/usace_TimeSlice/.gitkeep create mode 100644 test/unit_test_hyfeature/usgs_TimeSlice/.gitkeep 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/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/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 From 8af5b254ad401aa8d38bbcd5f37bc89678934810 Mon Sep 17 00:00:00 2001 From: Dong Kim Date: Tue, 22 Nov 2022 14:37:14 -0700 Subject: [PATCH 5/7] make hybrid routing (MC + Diffusive) run on hyfeature network of a unit test --- .../troute/HYFeaturesNetwork.py | 29 +++++++++ src/troute-network/troute/NHDNetwork.py | 4 +- .../troute/hyfeature_network_utilities.py | 4 +- .../troute/hyfeature_preprocess.py | 1 + src/troute-network/troute/nhd_io.py | 62 +++++++++---------- .../troute/nhd_network_utilities_v02.py | 21 ++++--- src/troute-network/troute/nhd_preprocess.py | 3 +- src/troute-nwm/src/nwm_routing/__main__.py | 20 +++--- src/troute-routing/troute/routing/compute.py | 4 +- .../unittest_hyfeature.yaml | 2 +- 10 files changed, 94 insertions(+), 56 deletions(-) diff --git a/src/troute-network/troute/HYFeaturesNetwork.py b/src/troute-network/troute/HYFeaturesNetwork.py index 1d447d1b8..ee0607193 100644 --- a/src/troute-network/troute/HYFeaturesNetwork.py +++ b/src/troute-network/troute/HYFeaturesNetwork.py @@ -11,6 +11,7 @@ from pathlib import Path import math import troute.hyfeature_preprocess as hyfeature_prep +from datetime import datetime, timedelta __verbose__ = False __showtiming__ = False @@ -355,6 +356,34 @@ def create_routing_network(self, 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): 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 index 5c78ccd38..a3c603d8c 100644 --- a/src/troute-network/troute/hyfeature_network_utilities.py +++ b/src/troute-network/troute/hyfeature_network_utilities.py @@ -208,8 +208,8 @@ def build_qlateral_array( # 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 - + ).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) diff --git a/src/troute-network/troute/hyfeature_preprocess.py b/src/troute-network/troute/hyfeature_preprocess.py index ea02a3eac..6b4485c85 100644 --- a/src/troute-network/troute/hyfeature_preprocess.py +++ b/src/troute-network/troute/hyfeature_preprocess.py @@ -417,6 +417,7 @@ def hyfeature_hybrid_routing_preprocess( ) 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): diff --git a/src/troute-network/troute/nhd_io.py b/src/troute-network/troute/nhd_io.py index c92059645..d7d344092 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 ''' - import pdb; pdb.set_trace() if custom_input_file[-4:] == "yaml": with open(custom_input_file) as custom_file: data = yaml.load(custom_file, Loader=yaml.SafeLoader) @@ -101,40 +100,41 @@ def read_config_file(custom_input_file): ) # add attributes when HYfeature network is selected if supernetwork_parameters['geo_file_path'][-4:] == "gpkg": - params = { - "title_string":"HY_Features Test", - "geo_file_path":supernetwork_parameters['geo_file_path'], - "flowpath_edge_list": None, - "columns": { - #link???? - "key": "id", - "downstream": "toid", - "dx": "lengthkm", - "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` - }, - "waterbody_null_code": -9999, - "terminal_code": 0, - "waterbody_null_code": -9999, - "driver_string": "NetCDF", - "layer_string": 0 - } - supernetwork_parameters['hyfeature_params'] = params + 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["waterbody_null_code"] = -9999 + 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", {}) @@ -370,7 +370,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 9e8309a20..d3c8c6f33 100644 --- a/src/troute-nwm/src/nwm_routing/__main__.py +++ b/src/troute-nwm/src/nwm_routing/__main__.py @@ -129,13 +129,13 @@ def main_v04(argv): network.assemble_forcings(run_sets[0], forcing_parameters, hybrid_parameters, cpu_pool) # Create data assimilation object from da_sets for first loop iteration - if supernetwork_parameters["geo_file_type"] == 'NHDNetwork': + # TODO: Add data_assimilation for hyfeature network + if 1==2: data_assimilation = AllDA(data_assimilation_parameters, run_parameters, waterbody_parameters, network, da_sets[0]) - # TODO: apply data_assimilation for hyfeature network if showtiming: forcing_end_time = time.time() @@ -165,7 +165,7 @@ def main_v04(argv): if showtiming: route_start_time = time.time() - import pdb; pdb.set_trace() + run_results = nwm_route( network.connections, network.reverse_network, @@ -204,7 +204,7 @@ def main_v04(argv): network.coastal_boundary_depth_df, network.unrefactored_topobathy_df, ) - import pdb; pdb.set_trace() + # returns list, first item is run result, second item is subnetwork items subnetwork_list = run_results[1] run_results = run_results[0] @@ -214,7 +214,7 @@ def main_v04(argv): 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. @@ -238,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, @@ -265,9 +267,9 @@ 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: diff --git a/src/troute-routing/troute/routing/compute.py b/src/troute-routing/troute/routing/compute.py index 6d68f4482..a5673817c 100644 --- a/src/troute-routing/troute/routing/compute.py +++ b/src/troute-routing/troute/routing/compute.py @@ -249,7 +249,7 @@ def compute_nhd_routing_v02( waterbody_type_specified, subnetwork_list, ): - import pdb; pdb.set_trace() + da_decay_coefficient = da_parameter_dict.get("da_decay_coefficient", 0) param_df["dt"] = dt param_df = param_df.astype("float32") @@ -1201,7 +1201,7 @@ def compute_diffusive_routing( coastal_boundary_depth_bytw_df = coastal_boundary_depth_df.loc[tw].to_frame().T else: coastal_boundary_depth_bytw_df = pd.DataFrame() - import pdb; pdb.set_trace() + # build diffusive inputs diffusive_inputs = diff_utils.diffusive_input_data_v02( tw, diff --git a/test/unit_test_hyfeature/unittest_hyfeature.yaml b/test/unit_test_hyfeature/unittest_hyfeature.yaml index 78564141f..151e4c36e 100644 --- a/test/unit_test_hyfeature/unittest_hyfeature.yaml +++ b/test/unit_test_hyfeature/unittest_hyfeature.yaml @@ -94,7 +94,7 @@ output_parameters: lite_restart_output_directory: restart/ chrtout_output: #---------- - wrf_hydro_channel_output_source_folder: channel_forcing/ + #wrf_hydro_channel_output_source_folder: channel_forcing/ chanobs_output: #---------- chanobs_output_directory: output/ From 5f66efca728ead9b80f91557dc4e24b8ed39f349 Mon Sep 17 00:00:00 2001 From: Dong Kim Date: Mon, 28 Nov 2022 11:41:07 -0700 Subject: [PATCH 6/7] waterbody dataframe updates by Sean Horvath --- .../troute/HYFeaturesNetwork.py | 18 ---- .../troute/hyfeature_preprocess.py | 86 ++++++++++++------- .../unittest_hyfeature.yaml | 9 +- 3 files changed, 58 insertions(+), 55 deletions(-) diff --git a/src/troute-network/troute/HYFeaturesNetwork.py b/src/troute-network/troute/HYFeaturesNetwork.py index ee0607193..cd1791761 100644 --- a/src/troute-network/troute/HYFeaturesNetwork.py +++ b/src/troute-network/troute/HYFeaturesNetwork.py @@ -29,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__: diff --git a/src/troute-network/troute/hyfeature_preprocess.py b/src/troute-network/troute/hyfeature_preprocess.py index 6b4485c85..446f356df 100644 --- a/src/troute-network/troute/hyfeature_preprocess.py +++ b/src/troute-network/troute/hyfeature_preprocess.py @@ -4,10 +4,12 @@ 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 @@ -85,10 +87,9 @@ def build_hyfeature_network(supernetwork_parameters, waterbody_df["qd0"] = 0.0 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... - waterbody_types_df = nhd_io.read_reservoir_parameter_file( - hybrid_params["reservoir_parameter_file"], + try: + waterbody_types_df = read_ngen_waterbody_type_df( + levelpool_params["reservoir_parameter_file"], lake_id, #self.waterbody_connections.values(), ) @@ -98,34 +99,12 @@ def build_hyfeature_network(supernetwork_parameters, .drop_duplicates(subset=lake_id) .set_index(lake_id) ) - except: - waterbody_types_df = pd.DataFrame(index=waterbody_df.index) - waterbody_types_df['reservoir_type'] = 1 + + except ValueError: #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] - - waterbody_df['member_wbs'] = waterbody_df['member_wbs'].apply(make_list) - waterbody_df['partial_length_percent'] = waterbody_df['partial_length_percent'].apply(make_list) - adjust = [ zip(x, y) - for x, y in - zip(waterbody_df['member_wbs'], 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): - # 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': - dataframe.loc[wb, 'dx'] = dataframe.loc[wb, 'dx'] - dataframe.loc[wb, 'dx']*float(percent) + waterbody_types_df = pd.DataFrame(index=waterbody_df.index) + waterbody_types_df['reservoir_type'] = 1 return (dataframe, flowpath_dict, @@ -679,9 +658,7 @@ def _try_parsing_date(text): # 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, @@ -783,4 +760,47 @@ def hyfeature_forcing( % (time.time() - start_time) ) - return qlats_df, coastal_boundary_depth_df \ No newline at end of file + 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/test/unit_test_hyfeature/unittest_hyfeature.yaml b/test/unit_test_hyfeature/unittest_hyfeature.yaml index 151e4c36e..a74b827be 100644 --- a/test/unit_test_hyfeature/unittest_hyfeature.yaml +++ b/test/unit_test_hyfeature/unittest_hyfeature.yaml @@ -17,12 +17,13 @@ network_topology_parameters: #- 4800004 #- 4800006 #- 4800007 - #waterbody_parameters: + waterbody_parameters: #---------- - #break_network_at_waterbodies: False - #level_pool: + break_network_at_waterbodies: False + level_pool: #---------- - #level_pool_waterbody_parameter_file_path: domain/LAKEPARM_NWMv2.1.nc + 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 From b03bf627e73055d5bca5db9a97fa3cf07fe2d205 Mon Sep 17 00:00:00 2001 From: Dong Kim Date: Tue, 29 Nov 2022 08:07:01 -0700 Subject: [PATCH 7/7] remove redundant line in nhd_io.py --- src/troute-network/troute/nhd_io.py | 1 - 1 file changed, 1 deletion(-) diff --git a/src/troute-network/troute/nhd_io.py b/src/troute-network/troute/nhd_io.py index d7d344092..3515cd2d6 100644 --- a/src/troute-network/troute/nhd_io.py +++ b/src/troute-network/troute/nhd_io.py @@ -123,7 +123,6 @@ def read_config_file(custom_input_file): supernetwork_parameters["columns"] = routelink_attr supernetwork_parameters["waterbody_null_code"] = -9999 supernetwork_parameters["terminal_code"] = 0 - supernetwork_parameters["waterbody_null_code"] = -9999 supernetwork_parameters["driver_string"] = "NetCDF" supernetwork_parameters["layer_string"] = 0