From a472cab580a2e125b8fd2f5d0269c4b7bdf2a440 Mon Sep 17 00:00:00 2001 From: Donald W Johnson -- NOAA Date: Thu, 28 Sep 2023 16:30:16 -0500 Subject: [PATCH] Multi level hydrofabric (#615) * Add trival multi layer hydrofabric sample. * Added Multlevel hydrofabric sample file. * Added level variable to HY_Catchment. Added function to get and set catchment level. Added constant variables to mark predefined catchment level values. * Add missing config file for a multilevel configuration testing. * Updated level variables in multilevel hydrofabric test to match documentation. * Update non mpi code to handle hydro fabric multiple levels. Fix bug where level was not a string. * Add support for hydrofabric levels. * Added runtime loop based on levels. * saving for merge * Fix for error in rebase. * Fix missing variable in HY_Features.hpp * added test file using google test replacing stand alone test. * fix parsing of layer data from the formulation config file. * Update test code for multilayer. * Multilayer test added to CMake. * Add datastructures for storing layer meta data and add those structures to the formulation manager. * Inital multi time step muti level time loop * Simulation_Time methods useful for multilayer * Change get_properties() of the FeatureBase class to return const or normal references to avoid copies of maps * add an internal map to the network class to track layer association. * Add support for filtering a network based on level. * Create inital skelton of layer class. * add to simulation_time.hpp to fix VSCode issue * Add missing changes to Layer.hpp * moved logic to run catchments into layer class * remove code that is no longer needed * Fix typos * update layer control for better depnd btwn layers * Add command to advance the current time stored in a layer. * add current_timestep_epoch_time to layers * commit changes to simulation time object to allow current time update. * Fix to missing changes on pervious commit. * Updates to fix testing on Multilayer * Add current_time_index to SurfaceLayer to improve readability * Added more documentation to main time loop. * Fix to HY_Features constructor set of levels is now correctly updated. * Add defualt layer creation to formulation manager * fix bad units on defualt layer * Correct units string for default layer. * Fix merge error in HH_Features_MPI.hpp * Required fixes for serial build * Create HY_Catchments with level metadata in single processor mode. * Change HY_Features constructor to use the link hydrofabric version that works with levels. * Apply spelling/grammar/clarity suggestions from code review Co-authored-by: Phil Miller - NOAA * Resolving issues from pr review. * Fixes after rebase, mainly to remove pdm03 dependency and `using namespace std`. * Missed precompiled header file from removed code * Correct typedef to ussing change that was not finished. * Correct primary time loop time objects was not being advanced. * More corrections to time object advancment. * Remove debuging code. * Change call to get response in layer code to use the built in simulation time object. Conflicts: include/core/Layer.hpp * Apply typographical suggestions from code review Co-authored-by: Phil Miller - NOAA * Changes to make multilayer tests pass * Unifying terminology from "level" to "layer" --------- Co-authored-by: Matt Williamson Co-authored-by: Matt Williamson <87771120+mattw-nws@users.noreply.github.com> Co-authored-by: Phil Miller - NOAA Co-authored-by: Phil Miller - NOAA --- ...noah-owp-modular-init-agg-1.namelist.input | 68 ++ data/catchment_data_multilayer.geojson | 11 + ...example_multilayer_realization_config.json | 131 ++++ ...015-12-01 00_00_00_2015-12-30 23_00_00.csv | 721 ++++++++++++++++++ include/core/HY_Features.hpp | 41 +- include/core/HY_Features_MPI.hpp | 12 + include/core/Layer.hpp | 147 ++++ include/core/LayerData.hpp | 76 ++ include/core/Partition_Parser.hpp | 30 +- include/core/SurfaceLayer.hpp | 40 + include/core/catchment/HY_Catchment.hpp | 36 +- include/core/network.hpp | 52 +- include/geojson/features/FeatureBase.hpp | 6 +- .../catchment/Formulation_Manager.hpp | 67 +- ...{Simulation_Time.h => Simulation_Time.hpp} | 55 ++ src/NGen.cpp | 163 ++-- src/core/HY_Features.cpp | 104 +-- src/core/HY_Features_MPI.cpp | 15 +- src/core/SurfaceLayer.cpp | 53 ++ src/core/network.cpp | 15 + test/CMakeLists.txt | 17 + test/core/multilayer/MultiLayerParserTest.cpp | 61 ++ test/simulation_time/Simulation_Time_Test.cpp | 53 +- 23 files changed, 1830 insertions(+), 144 deletions(-) create mode 100644 data/bmi/fortran/noah-owp-modular-init-agg-1.namelist.input create mode 100644 data/catchment_data_multilayer.geojson create mode 100644 data/example_multilayer_realization_config.json create mode 100644 data/forcing/agg-1_2015-12-01 00_00_00_2015-12-30 23_00_00.csv create mode 100644 include/core/Layer.hpp create mode 100644 include/core/LayerData.hpp create mode 100644 include/core/SurfaceLayer.hpp rename include/simulation_time/{Simulation_Time.h => Simulation_Time.hpp} (69%) create mode 100644 src/core/SurfaceLayer.cpp create mode 100644 test/core/multilayer/MultiLayerParserTest.cpp diff --git a/data/bmi/fortran/noah-owp-modular-init-agg-1.namelist.input b/data/bmi/fortran/noah-owp-modular-init-agg-1.namelist.input new file mode 100644 index 0000000000..860f848fd8 --- /dev/null +++ b/data/bmi/fortran/noah-owp-modular-init-agg-1.namelist.input @@ -0,0 +1,68 @@ +&timing ! and output + dt = 1800.0 ! timestep [seconds] + startdate = "199801010630" ! UTC time start of simulation (YYYYMMDDhhmm) + enddate = "199901010630" ! UTC time end of simulation (YYYYMMDDhhmm) + forcing_filename = "data/config/bmi/sugar_creek/noah-mp-modular.dat" ! change filename to match your forcing data + output_filename = "data/config/bmi/sugar_creek/output.nc" +/ + +¶meters + parameter_dir = "extern/noah-owp-modular/noah-owp-modular/parameters/" + general_table = "GENPARM.TBL" ! general param tables and misc params + soil_table = "SOILPARM.TBL" ! soil param table + noahowp_table = "MPTABLE.TBL" ! noah-mp related param tables + soil_class_name = "STAS" ! soil class data source - "STAS" or "STAS-RUC" + veg_class_name = "MODIFIED_IGBP_MODIS_NOAH" ! vegetation class data source - "MODIFIED_IGBP_MODIS_NOAH" or "USGS" +/ + +&location ! for point runs, needs to be modified for gridded + lat = 40.01 ! latitude [degrees] + lon = -88.37 ! longitude [degrees] + terrain_slope = 0.0 ! terrain slope [degrees] + azimuth = 0.0 ! terrain azimuth or aspect [degrees clockwise from north] +/ + +&forcing + ZREF = 10.0 ! measurment height for wind speed + rain_snow_thresh = 1.0 ! rain-snow temperature threshold (degrees Celcius) +/ + +&model_options + precip_phase_option = 2 + snow_albedo_option = 2 ! 1 = BATS, 2 = CLASS + dynamic_veg_option = 1 + runoff_option = 8 + drainage_option = 8 + frozen_soil_option = 1 + dynamic_vic_option = 1 + radiative_transfer_option = 3 + sfc_drag_coeff_option = 1 + canopy_stom_resist_option = 1 + crop_model_option = 0 + snowsoil_temp_time_option = 3 + soil_temp_boundary_option = 2 + supercooled_water_option = 1 + stomatal_resistance_option = 1 + evap_srfc_resistance_option = 1 + subsurface_option = 1 +/ + +&structure + isltyp = 1 ! soil texture class + nsoil = 4 ! number of soil levels + nsnow = 3 ! number of snow levels + nveg = 20 ! number of vegetation types + vegtyp = 1 ! vegetation type modis + croptype = 0 ! crop type (0 = no crops) + sfctyp = 1 ! land surface type, 1:soil, 2:lake + soilcolor = 4 ! soil color code +/ + +&initial_values + dzsnso = 0.0, 0.0, 0.0, 0.1, 0.3, 0.6, 1.0 ! level thickness [m] + sice = 0.0, 0.0, 0.0, 0.0 ! initial soil ice profile [vol] + sh2o = 0.3, 0.3, 0.3, 0.3 ! initial soil liquid profile [vol] + zwt = -2.0 ! initial water table depth below surface [m] +/ + + diff --git a/data/catchment_data_multilayer.geojson b/data/catchment_data_multilayer.geojson new file mode 100644 index 0000000000..aa79fc9eab --- /dev/null +++ b/data/catchment_data_multilayer.geojson @@ -0,0 +1,11 @@ +{ +"type": "FeatureCollection", +"name": "catchment_data", +"crs": {"type": "name", "properties": {"name": "urn:ogc:def:crs:OGC:1.3:CRS84"}}, +"features": [ +{ "type": "Feature", "properties": { "layer": 20, "agg": 0, "areasqkm": 55.356841159445864, "id": "agg-1" }, "geometry": { "type": "Polygon", "coordinates": [ [ [ -80.715617203572421, 35.162592318783524 ], [ -80.715461282861213, 35.163159749477792 ], [ -80.715345548657382, 35.164061070133094 ], [ -80.714744503892121, 35.165247080610385 ], [ -80.714185954379701, 35.166247633685273 ], [ -80.714122357235766, 35.166746278867357 ], [ -80.713350316345355, 35.16725203276151 ], [ -80.71127537436891, 35.167714484462437 ], [ -80.710280990889572, 35.168541154094569 ], [ -80.709413988957323, 35.169583974587987 ], [ -80.707284761222155, 35.170680219969363 ], [ -80.707112899301862, 35.171300479557914 ], [ -80.707044705715447, 35.171834735555464 ], [ -80.70675493882689, 35.172883152946092 ], [ -80.706629183206999, 35.173874595904771 ], [ -80.705609029659414, 35.175287826337588 ], [ -80.708048306543091, 35.175904322998562 ], [ -80.710733331192245, 35.177613967732675 ], [ -80.711601991486617, 35.17664136346712 ], [ -80.714003725354672, 35.176412687826499 ], [ -80.714872330568838, 35.175440058317818 ], [ -80.717380397112109, 35.174682063580804 ], [ -80.717761483257135, 35.174460362912669 ], [ -80.720783411888206, 35.177843384761864 ], [ -80.7220418909816, 35.178279670935723 ], [ -80.723309270567, 35.180346618536326 ], [ -80.726429052207365, 35.181569552573457 ], [ -80.727643443958669, 35.183901074949894 ], [ -80.729467909127507, 35.185643970383488 ], [ -80.729752611282052, 35.186831198746511 ], [ -80.734326891012756, 35.187490901526644 ], [ -80.735532469279477, 35.188191669911511 ], [ -80.737375635695301, 35.185716843366968 ], [ -80.745415345333683, 35.187582214420011 ], [ -80.746283678603476, 35.186609363664083 ], [ -80.749447726375919, 35.185936382627936 ], [ -80.749606985128651, 35.185142468888891 ], [ -80.749004152907474, 35.184792157314988 ], [ -80.750031659014738, 35.183025361586083 ], [ -80.752983237543475, 35.183410838319567 ], [ -80.755004039102047, 35.183403140756802 ], [ -80.756484640516632, 35.184411158747039 ], [ -80.757777003140788, 35.183892505924078 ], [ -80.758106114862386, 35.184860309047203 ], [ -80.760039015642377, 35.187718143175104 ], [ -80.760184131536008, 35.188568678926856 ], [ -80.760429719770585, 35.189126965684167 ], [ -80.760687733326364, 35.189886322485677 ], [ -80.760859465773336, 35.191915600499783 ], [ -80.761480202066721, 35.192951306184256 ], [ -80.763536432972458, 35.194564758423539 ], [ -80.763176765363241, 35.194810514904738 ], [ -80.762237232560082, 35.195273594843755 ], [ -80.761629460885786, 35.196023763836756 ], [ -80.761421404581398, 35.198097005125454 ], [ -80.760783392001628, 35.198747876895908 ], [ -80.760828463789935, 35.200582582893027 ], [ -80.760813049184506, 35.202207833455311 ], [ -80.758868451327814, 35.204612374528828 ], [ -80.756630018078724, 35.206280628476456 ], [ -80.756217195673699, 35.206790996741951 ], [ -80.755757803202826, 35.207259379067928 ], [ -80.756011318135052, 35.211030676986631 ], [ -80.757075093301935, 35.212584641881072 ], [ -80.757144693341289, 35.213011626897732 ], [ -80.755183284442552, 35.213610770690806 ], [ -80.754493447671365, 35.214990791544444 ], [ -80.754414400757312, 35.215778262563624 ], [ -80.754335791738299, 35.216039564457191 ], [ -80.75415787380723, 35.217817700729405 ], [ -80.752663318764888, 35.219341012746945 ], [ -80.752377209873472, 35.219993132870037 ], [ -80.752160936334079, 35.220075338497637 ], [ -80.751391745997637, 35.221495983024838 ], [ -80.750751757445471, 35.222063889179523 ], [ -80.750248059910206, 35.222776614733384 ], [ -80.750335007758807, 35.223916755586636 ], [ -80.748365545549277, 35.224671674399318 ], [ -80.747762622701273, 35.225526229186201 ], [ -80.746921216215043, 35.22627149585454 ], [ -80.746353229465527, 35.227514717016625 ], [ -80.746083800966304, 35.227861536767925 ], [ -80.745362205585366, 35.228350876648904 ], [ -80.742221738305361, 35.229905391509512 ], [ -80.740055047557362, 35.230776559201892 ], [ -80.739475109490016, 35.231489856207183 ], [ -80.738988846733236, 35.231986367731402 ], [ -80.73885642532781, 35.233299434937237 ], [ -80.738538784929588, 35.234344201947366 ], [ -80.738468966727638, 35.235045675089651 ], [ -80.738903765440597, 35.23601069695372 ], [ -80.738928988291363, 35.237431250572648 ], [ -80.737521588447748, 35.237731105659385 ], [ -80.737341611920343, 35.23785393929758 ], [ -80.7357381659873, 35.236445672049015 ], [ -80.734527232932351, 35.236225914023585 ], [ -80.733553485181204, 35.236501813090406 ], [ -80.731235739114581, 35.234196295956693 ], [ -80.73082530827314, 35.231825880977155 ], [ -80.729800441212291, 35.231021461207405 ], [ -80.727747656193046, 35.229662634107562 ], [ -80.726739363410942, 35.22865877863584 ], [ -80.725918547429828, 35.225099486721305 ], [ -80.725759267985282, 35.223181876804951 ], [ -80.725312437140957, 35.223102329786663 ], [ -80.723568809450484, 35.223780177318353 ], [ -80.722436100624961, 35.224100966261716 ], [ -80.721580664984515, 35.224116428593007 ], [ -80.720368130651096, 35.225710403614173 ], [ -80.71661457296068, 35.22556309402934 ], [ -80.714567781804305, 35.225119076636453 ], [ -80.714018939303273, 35.225505624890701 ], [ -80.713973943121886, 35.226108674827671 ], [ -80.713800701371596, 35.226631273885495 ], [ -80.712296684614401, 35.22734455318502 ], [ -80.7117634243845, 35.22772045915476 ], [ -80.709969534442791, 35.227718943651759 ], [ -80.70804917677394, 35.226841748151742 ], [ -80.707088422213644, 35.226058454963912 ], [ -80.704544996716479, 35.224356694426376 ], [ -80.701757770899164, 35.22347419863133 ], [ -80.700636187462777, 35.221871616191095 ], [ -80.699581038708075, 35.221336598966666 ], [ -80.697985145723464, 35.218615376113917 ], [ -80.697231461743826, 35.217941779556796 ], [ -80.697284750794637, 35.217677173368372 ], [ -80.69630054169086, 35.21754822827269 ], [ -80.695820254515084, 35.217360068422003 ], [ -80.693461844635948, 35.2154851723108 ], [ -80.692302201788394, 35.215666349721261 ], [ -80.691591669142809, 35.216203317853704 ], [ -80.690814758394893, 35.216195039824349 ], [ -80.687851280819743, 35.215377767288203 ], [ -80.687290712134001, 35.214544722719836 ], [ -80.686637481120698, 35.214535428612727 ], [ -80.686316895902252, 35.214455373765631 ], [ -80.685813148339761, 35.214448774651082 ], [ -80.685012637675953, 35.214243926235191 ], [ -80.684335616528571, 35.214235724360449 ], [ -80.68355141507601, 35.213975968847961 ], [ -80.683049388244186, 35.213751099888846 ], [ -80.681600210335759, 35.213633168044083 ], [ -80.678359155821596, 35.213046595496039 ], [ -80.676589829651576, 35.213733383852052 ], [ -80.674338461924535, 35.213051713706449 ], [ -80.673656947270601, 35.21105685968557 ], [ -80.670860922635995, 35.20826661621102 ], [ -80.670353172619798, 35.207627189590319 ], [ -80.670331945906625, 35.207172335621209 ], [ -80.669966580861143, 35.206218428623892 ], [ -80.670398783231931, 35.205731956199848 ], [ -80.670150016358861, 35.204736014644062 ], [ -80.670376412775084, 35.201096968464306 ], [ -80.669588509873691, 35.200581902044725 ], [ -80.669409481512716, 35.200154612563793 ], [ -80.669063563612809, 35.200667799621229 ], [ -80.667780253158313, 35.199845646126008 ], [ -80.66665237274367, 35.198331067379954 ], [ -80.665775195821482, 35.196851505538511 ], [ -80.664349073666799, 35.196320479356892 ], [ -80.662868677878507, 35.195092718365458 ], [ -80.659529655045475, 35.194526729556195 ], [ -80.658217857967415, 35.194354376662218 ], [ -80.658014975243532, 35.193183930808075 ], [ -80.657733282335087, 35.192533676555243 ], [ -80.657360385625964, 35.191436553653013 ], [ -80.655295952480145, 35.188752416542442 ], [ -80.654714893564176, 35.186511576426312 ], [ -80.653364076866993, 35.185451267336049 ], [ -80.652148669363214, 35.185232039757544 ], [ -80.65111375027567, 35.185146985728487 ], [ -80.650745281113998, 35.184680552444021 ], [ -80.650869501743443, 35.183022510885465 ], [ -80.649472722898849, 35.182282943651821 ], [ -80.648259549667642, 35.181219525542772 ], [ -80.647297554190828, 35.180708823564871 ], [ -80.647718894410048, 35.179665077605001 ], [ -80.648192714542077, 35.179544800117988 ], [ -80.648916253233793, 35.178736057342043 ], [ -80.650522876943654, 35.177941423427832 ], [ -80.652408304343737, 35.176665842342203 ], [ -80.653768094894374, 35.174996399956399 ], [ -80.654018436962502, 35.171801570477449 ], [ -80.65536902072084, 35.170920112215391 ], [ -80.657344609977258, 35.171801812484773 ], [ -80.658440688900825, 35.171568027556333 ], [ -80.660111410392503, 35.170845393763571 ], [ -80.661353020501465, 35.170034662562706 ], [ -80.663055117034091, 35.169443474681849 ], [ -80.664304847330158, 35.168408646118955 ], [ -80.665028843456525, 35.16661724679463 ], [ -80.666631770925207, 35.165410305421112 ], [ -80.66774481581551, 35.16360451651488 ], [ -80.670280731941318, 35.16186218617618 ], [ -80.670789451901243, 35.157839992873825 ], [ -80.671403501363372, 35.156566795449017 ], [ -80.671362745705224, 35.155882403363279 ], [ -80.672028591036863, 35.15552622095403 ], [ -80.675520144518003, 35.152757380625886 ], [ -80.675971621409431, 35.152513062430202 ], [ -80.677704159679521, 35.15279789769815 ], [ -80.678598618668644, 35.152885760275566 ], [ -80.679796348227953, 35.15213249951676 ], [ -80.680164651607356, 35.149704646657263 ], [ -80.680741062555271, 35.147416378098214 ], [ -80.680325128436493, 35.145528378084528 ], [ -80.681537307561939, 35.144507809125379 ], [ -80.6822942382977, 35.142510620403286 ], [ -80.682790377549793, 35.141769359916019 ], [ -80.683349608754597, 35.13980144127828 ], [ -80.683746426759285, 35.139501339404603 ], [ -80.684184715860496, 35.140157329172702 ], [ -80.684607250972675, 35.140238143464963 ], [ -80.685909182831892, 35.139855241453098 ], [ -80.687611257088477, 35.141294545095299 ], [ -80.687853477799521, 35.1421411675556 ], [ -80.688481312238181, 35.141985745920756 ], [ -80.689070154314336, 35.141541220109737 ], [ -80.690677542519722, 35.141558986176221 ], [ -80.692426706094125, 35.14223180168559 ], [ -80.69471509662614, 35.142769801002288 ], [ -80.695978622885221, 35.143255724931315 ], [ -80.698282555184178, 35.145834843394269 ], [ -80.704510130145138, 35.146651307868318 ], [ -80.704731473157352, 35.147223525592473 ], [ -80.705768005049649, 35.147087781044625 ], [ -80.710312276270145, 35.149584479982714 ], [ -80.712455873644743, 35.152309695861248 ], [ -80.712473179219856, 35.155571127789813 ], [ -80.713350239552838, 35.156229203669419 ], [ -80.712650071222185, 35.158038665114191 ], [ -80.713801797625308, 35.159004303746563 ], [ -80.713642222579907, 35.159798188918124 ], [ -80.716211705732931, 35.16040628617953 ], [ -80.716601465769671, 35.161815290821401 ], [ -80.715617203572421, 35.162592318783524 ] ], [ [ -80.669409481512716, 35.200154612563793 ], [ -80.670549670260229, 35.19846311766527 ], [ -80.669352444757394, 35.200018262975142 ], [ -80.669409481512716, 35.200154612563793 ] ], [ [ -80.724526012315437, 35.205501866863663 ], [ -80.72454198695246, 35.206036550908649 ], [ -80.725063842491295, 35.206698956395634 ], [ -80.724526012315437, 35.205501866863663 ] ] ] } }, +{"type": "Feature", "id": "cat-67", "properties": {"layer":0, "areasqkm": 14.756535022220804, "toid": "nex-68"}, "geometry": {"type": "MultiPolygon", "coordinates": [[[[-80.75777700314079, 35.18389250592408], [-80.75810611486239, 35.1848603090472], [-80.76003901564238, 35.187718143175104], [-80.76018413153601, 35.188568678926856], [-80.76042971977058, 35.18912696568417], [-80.76068773332636, 35.18988632248568], [-80.76085946577334, 35.19191560049978], [-80.76148020206672, 35.192951306184256], [-80.76353643297246, 35.19456475842354], [-80.76317676536324, 35.19481051490474], [-80.76223723256008, 35.195273594843755], [-80.76162946088579, 35.196023763836756], [-80.7614214045814, 35.198097005125454], [-80.76078339200163, 35.19874787689591], [-80.76082846378993, 35.20058258289303], [-80.7608130491845, 35.20220783345531], [-80.75886845132781, 35.20461237452883], [-80.75663001807872, 35.206280628476456], [-80.7562171956737, 35.20679099674195], [-80.75575780320283, 35.20725937906793], [-80.75601131813505, 35.21103067698663], [-80.75707509330194, 35.21258464188107], [-80.75714469334129, 35.21301162689773], [-80.75518328444255, 35.213610770690806], [-80.75449344767136, 35.214990791544444], [-80.75441440075731, 35.215778262563624], [-80.7543357917383, 35.21603956445719], [-80.75415787380723, 35.217817700729405], [-80.75266331876489, 35.219341012746945], [-80.75237720987347, 35.21999313287004], [-80.75216093633408, 35.22007533849764], [-80.75139174599764, 35.22149598302484], [-80.75075175744547, 35.22206388917952], [-80.7502480599102, 35.222776614733384], [-80.7503350077588, 35.223916755586636], [-80.74836554554928, 35.22467167439932], [-80.74776262270127, 35.2255262291862], [-80.74692121621504, 35.22627149585454], [-80.74635322946553, 35.227514717016625], [-80.7460838009663, 35.227861536767925], [-80.74536220558537, 35.2283508766489], [-80.74222173830536, 35.22990539150951], [-80.74005504755736, 35.23077655920189], [-80.73947510949002, 35.23148985620718], [-80.73898884673324, 35.2319863677314], [-80.73885642532781, 35.23329943493724], [-80.73853878492959, 35.234344201947366], [-80.73846896672764, 35.23504567508965], [-80.7389037654406, 35.23601069695372], [-80.73892898829136, 35.23743125057265], [-80.73752158844775, 35.237731105659385], [-80.73734161192034, 35.23785393929758], [-80.7357381659873, 35.236445672049015], [-80.73452723293235, 35.236225914023585], [-80.7335534851812, 35.236501813090406], [-80.73123573911458, 35.23419629595669], [-80.73082530827314, 35.231825880977155], [-80.72980044121229, 35.231021461207405], [-80.72774765619305, 35.22966263410756], [-80.72673936341094, 35.22865877863584], [-80.72591854742983, 35.225099486721305], [-80.72575926798528, 35.22318187680495], [-80.72531243714096, 35.22310232978666], [-80.72356880945048, 35.22378017731835], [-80.72243610062496, 35.224100966261716], [-80.72158066498451, 35.22411642859301], [-80.7211145060318, 35.22368642034355], [-80.72074273965856, 35.22250049897515], [-80.72046317440251, 35.221901770864974], [-80.7213088113704, 35.21935787562199], [-80.72072641034856, 35.21702218048747], [-80.72131472945011, 35.21539121856291], [-80.7216853788768, 35.21477765632368], [-80.72287605212085, 35.213564948465645], [-80.72316300997122, 35.20987463204784], [-80.72427529288194, 35.20708798049849], [-80.7250638424913, 35.206698956395634], [-80.72452601231544, 35.20550186686366], [-80.72618792000482, 35.204677572727775], [-80.72670524844105, 35.202979974795994], [-80.72629344934451, 35.20243818376059], [-80.72433323444952, 35.202050235437646], [-80.72326622164341, 35.201980669569856], [-80.72218392325884, 35.20094136323369], [-80.72203343642354, 35.19869411060445], [-80.72240476606557, 35.197473803873024], [-80.72258571719085, 35.19565796653196], [-80.72488120361596, 35.19452190066924], [-80.72547498310766, 35.19379116746099], [-80.72677829031477, 35.192591067694586], [-80.72685423974872, 35.19182216938071], [-80.72758443862824, 35.18999337824186], [-80.72856218290306, 35.18978600853656], [-80.72889692584329, 35.18868190918505], [-80.72893964298866, 35.188273788489035], [-80.72975261128205, 35.18683119874651], [-80.73432689101276, 35.187490901526644], [-80.73553246927948, 35.18819166991151], [-80.7373756356953, 35.18571684336697], [-80.74541534533368, 35.18758221442001], [-80.74628367860348, 35.18660936366408], [-80.74944772637592, 35.185936382627936], [-80.74960698512865, 35.18514246888889], [-80.74900415290747, 35.18479215731499], [-80.75003165901474, 35.18302536158608], [-80.75298323754348, 35.18341083831957], [-80.75500403910205, 35.1834031407568], [-80.75648464051663, 35.18441115874704], [-80.75777700314079, 35.18389250592408]]]]}}, +{"type": "Feature", "id": "cat-27", "properties": {"layer":0, "areasqkm": 18.92205293111518, "toid": "nex-26"}, "geometry": {"type": "MultiPolygon", "coordinates": [[[[-80.72946790912751, 35.18564397038349], [-80.72975261128205, 35.18683119874651], [-80.72893964298866, 35.188273788489035], [-80.72889692584329, 35.18868190918505], [-80.72856218290306, 35.18978600853656], [-80.72758443862824, 35.18999337824186], [-80.72685423974872, 35.19182216938071], [-80.72677829031477, 35.192591067694586], [-80.72547498310766, 35.19379116746099], [-80.72488120361596, 35.19452190066924], [-80.72258571719085, 35.19565796653196], [-80.72240476606557, 35.197473803873024], [-80.72203343642354, 35.19869411060445], [-80.72218392325884, 35.20094136323369], [-80.72326622164341, 35.201980669569856], [-80.72433323444952, 35.202050235437646], [-80.72629344934451, 35.20243818376059], [-80.72670524844105, 35.202979974795994], [-80.72618792000482, 35.204677572727775], [-80.72452601231544, 35.20550186686366], [-80.72454198695246, 35.20603655090865], [-80.7250638424913, 35.206698956395634], [-80.72427529288194, 35.20708798049849], [-80.72316300997122, 35.20987463204784], [-80.72287605212085, 35.213564948465645], [-80.7216853788768, 35.21477765632368], [-80.72131472945011, 35.21539121856291], [-80.72072641034856, 35.21702218048747], [-80.7213088113704, 35.21935787562199], [-80.72046317440251, 35.221901770864974], [-80.72074273965856, 35.22250049897515], [-80.7211145060318, 35.22368642034355], [-80.72158066498451, 35.22411642859301], [-80.7203681306511, 35.22571040361417], [-80.71661457296068, 35.22556309402934], [-80.7145677818043, 35.22511907663645], [-80.71401893930327, 35.2255056248907], [-80.71397394312189, 35.22610867482767], [-80.7138007013716, 35.226631273885495], [-80.7122966846144, 35.22734455318502], [-80.7117634243845, 35.22772045915476], [-80.70996953444279, 35.22771894365176], [-80.70804917677394, 35.22684174815174], [-80.70708842221364, 35.22605845496391], [-80.70454499671648, 35.224356694426376], [-80.70175777089916, 35.22347419863133], [-80.70063618746278, 35.221871616191095], [-80.69958103870808, 35.221336598966666], [-80.69798514572346, 35.21861537611392], [-80.69723146174383, 35.217941779556796], [-80.69728475079464, 35.21767717336837], [-80.69630054169086, 35.21754822827269], [-80.69582025451508, 35.217360068422], [-80.69346184463595, 35.2154851723108], [-80.6923022017884, 35.21566634972126], [-80.69159166914281, 35.216203317853704], [-80.6908147583949, 35.21619503982435], [-80.68785128081974, 35.2153777672882], [-80.687290712134, 35.214544722719836], [-80.6866374811207, 35.21453542861273], [-80.68631689590225, 35.21445537376563], [-80.68581314833976, 35.21444877465108], [-80.68501263767595, 35.21424392623519], [-80.68433561652857, 35.21423572436045], [-80.68355141507601, 35.21397596884796], [-80.68304938824419, 35.213751099888846], [-80.68160021033576, 35.21363316804408], [-80.6783591558216, 35.21304659549604], [-80.67658982965158, 35.21373338385205], [-80.67433846192453, 35.21305171370645], [-80.6736569472706, 35.21105685968557], [-80.670860922636, 35.20826661621102], [-80.6703531726198, 35.20762718959032], [-80.67033194590663, 35.20717233562121], [-80.66996658086114, 35.20621842862389], [-80.67039878323193, 35.20573195619985], [-80.67059801573924, 35.205630756749926], [-80.67177841457134, 35.20468238425277], [-80.6733743199286, 35.203550733229946], [-80.67491306083075, 35.20215505078978], [-80.67584839975643, 35.200321356086974], [-80.67668461451515, 35.199448493163665], [-80.6779958755478, 35.19899677473522], [-80.67913768850855, 35.198552385941596], [-80.68004537279869, 35.197075969681634], [-80.68077081420435, 35.19602106539493], [-80.68267822918273, 35.1958086635977], [-80.68367115794709, 35.19552728426538], [-80.68580151457986, 35.193595583815984], [-80.6865724667587, 35.191413753581685], [-80.68707742553893, 35.19068208024061], [-80.68812780481943, 35.187883240048215], [-80.68782934599146, 35.18658357352836], [-80.69020942609288, 35.183488027737866], [-80.69087998324167, 35.18182957307456], [-80.69252329406433, 35.18098219212587], [-80.69549287463391, 35.18064997395927], [-80.69894390178752, 35.179101565176026], [-80.70010304020761, 35.17770659010988], [-80.70173223150607, 35.17654733040429], [-80.70258699815237, 35.176703701678896], [-80.70560902965941, 35.17528782633759], [-80.70804830654309, 35.17590432299856], [-80.71073333119224, 35.177613967732675], [-80.71160199148662, 35.17664136346712], [-80.71400372535467, 35.1764126878265], [-80.71487233056884, 35.17544005831782], [-80.71738039711211, 35.1746820635808], [-80.71776148325714, 35.17446036291267], [-80.7207834118882, 35.177843384761864], [-80.7220418909816, 35.17827967093572], [-80.723309270567, 35.180346618536326], [-80.72642905220737, 35.18156955257346], [-80.72764344395867, 35.183901074949894], [-80.72946790912751, 35.18564397038349]]]]}}, +{"type": "Feature", "id": "cat-52", "properties": {"layer":0, "areasqkm": 21.67825320610988, "toid": "nex-34"}, "geometry": {"type": "MultiPolygon", "coordinates": [[[[-80.71561720357242, 35.162592318783524], [-80.71546128286121, 35.16315974947779], [-80.71534554865738, 35.164061070133094], [-80.71474450389212, 35.165247080610385], [-80.7141859543797, 35.16624763368527], [-80.71412235723577, 35.16674627886736], [-80.71335031634536, 35.16725203276151], [-80.71127537436891, 35.16771448446244], [-80.71028099088957, 35.16854115409457], [-80.70941398895732, 35.16958397458799], [-80.70728476122216, 35.17068021996936], [-80.70711289930186, 35.171300479557914], [-80.70704470571545, 35.171834735555464], [-80.70675493882689, 35.17288315294609], [-80.706629183207, 35.17387459590477], [-80.70560902965941, 35.17528782633759], [-80.70258699815237, 35.176703701678896], [-80.70173223150607, 35.17654733040429], [-80.70010304020761, 35.17770659010988], [-80.69894390178752, 35.179101565176026], [-80.69549287463391, 35.18064997395927], [-80.69252329406433, 35.18098219212587], [-80.69087998324167, 35.18182957307456], [-80.69020942609288, 35.183488027737866], [-80.68782934599146, 35.18658357352836], [-80.68812780481943, 35.187883240048215], [-80.68707742553893, 35.19068208024061], [-80.6865724667587, 35.191413753581685], [-80.68580151457986, 35.193595583815984], [-80.68367115794709, 35.19552728426538], [-80.68267822918273, 35.1958086635977], [-80.68077081420435, 35.19602106539493], [-80.68004537279869, 35.197075969681634], [-80.67913768850855, 35.198552385941596], [-80.6779958755478, 35.19899677473522], [-80.67668461451515, 35.199448493163665], [-80.67584839975643, 35.200321356086974], [-80.67491306083075, 35.20215505078978], [-80.6733743199286, 35.203550733229946], [-80.67177841457134, 35.20468238425277], [-80.67059801573924, 35.205630756749926], [-80.67039878323193, 35.20573195619985], [-80.67015001635886, 35.20473601464406], [-80.67037641277508, 35.201096968464306], [-80.66958850987369, 35.200581902044725], [-80.66940948151272, 35.20015461256379], [-80.66906356361281, 35.20066779962123], [-80.66778025315831, 35.19984564612601], [-80.66665237274367, 35.198331067379954], [-80.66577519582148, 35.19685150553851], [-80.6643490736668, 35.19632047935689], [-80.6628686778785, 35.19509271836546], [-80.65952965504547, 35.194526729556195], [-80.65821785796741, 35.19435437666222], [-80.65801497524353, 35.193183930808075], [-80.65773328233509, 35.19253367655524], [-80.65736038562596, 35.19143655365301], [-80.65529595248015, 35.18875241654244], [-80.65471489356418, 35.18651157642631], [-80.65336407686699, 35.18545126733605], [-80.65214866936321, 35.185232039757544], [-80.65111375027567, 35.18514698572849], [-80.650745281114, 35.18468055244402], [-80.65086950174344, 35.183022510885465], [-80.64947272289885, 35.18228294365182], [-80.64825954966764, 35.18121952554277], [-80.64729755419083, 35.18070882356487], [-80.64771889441005, 35.179665077605], [-80.64819271454208, 35.17954480011799], [-80.64891625323379, 35.17873605734204], [-80.65052287694365, 35.17794142342783], [-80.65240830434374, 35.1766658423422], [-80.65376809489437, 35.1749963999564], [-80.6540184369625, 35.17180157047745], [-80.65536902072084, 35.17092011221539], [-80.65734460997726, 35.17180181248477], [-80.65844068890082, 35.17156802755633], [-80.6601114103925, 35.17084539376357], [-80.66135302050147, 35.170034662562706], [-80.66305511703409, 35.16944347468185], [-80.66430484733016, 35.168408646118955], [-80.66502884345653, 35.16661724679463], [-80.6666317709252, 35.16541030542111], [-80.66774481581551, 35.16360451651488], [-80.67028073194132, 35.16186218617618], [-80.67078945190124, 35.157839992873825], [-80.67140350136337, 35.15656679544902], [-80.67136274570522, 35.15588240336328], [-80.67202859103686, 35.15552622095403], [-80.675520144518, 35.152757380625886], [-80.67597162140943, 35.1525130624302], [-80.67770415967952, 35.15279789769815], [-80.67859861866864, 35.152885760275566], [-80.67979634822795, 35.15213249951676], [-80.68016465160736, 35.14970464665726], [-80.68074106255527, 35.147416378098214], [-80.6803251284365, 35.14552837808453], [-80.68153730756194, 35.14450780912538], [-80.6822942382977, 35.142510620403286], [-80.6827903775498, 35.14176935991602], [-80.6833496087546, 35.13980144127828], [-80.68374642675928, 35.1395013394046], [-80.6841847158605, 35.1401573291727], [-80.68460725097268, 35.14023814346496], [-80.68590918283189, 35.1398552414531], [-80.68761125708848, 35.1412945450953], [-80.68785347779952, 35.1421411675556], [-80.68848131223818, 35.141985745920756], [-80.68907015431434, 35.14154122010974], [-80.69067754251972, 35.14155898617622], [-80.69242670609412, 35.14223180168559], [-80.69471509662614, 35.14276980100229], [-80.69597862288522, 35.143255724931315], [-80.69828255518418, 35.14583484339427], [-80.70451013014514, 35.14665130786832], [-80.70473147315735, 35.14722352559247], [-80.70576800504965, 35.147087781044625], [-80.71031227627014, 35.149584479982714], [-80.71245587364474, 35.15230969586125], [-80.71247317921986, 35.15557112778981], [-80.71335023955284, 35.15622920366942], [-80.71265007122219, 35.15803866511419], [-80.71380179762531, 35.15900430374656], [-80.7136422225799, 35.159798188918124], [-80.71621170573293, 35.16040628617953], [-80.71660146576967, 35.1618152908214], [-80.71561720357242, 35.162592318783524]], [[-80.66940948151272, 35.20015461256379], [-80.67054967026023, 35.19846311766527], [-80.6693524447574, 35.20001826297514], [-80.66940948151272, 35.20015461256379]]]]}} +] +} diff --git a/data/example_multilayer_realization_config.json b/data/example_multilayer_realization_config.json new file mode 100644 index 0000000000..5b07d4cd69 --- /dev/null +++ b/data/example_multilayer_realization_config.json @@ -0,0 +1,131 @@ +{ + "global": { + "formulations": [ + { + "name": "bmi_c++", + "params": { + "model_type_name": "test_bmi_cpp", + "library_file": "./extern/test_bmi_cpp/cmake_build/libtestbmicppmodel.so", + "init_config": "./data/bmi/c/test/test_bmi_c_config.ini", + "main_output_variable": "OUTPUT_VAR_2", + "variables_names_map" : { + "INPUT_VAR_2": "TMP_2maboveground", + "INPUT_VAR_1": "precip_rate" + }, + "create_function": "bmi_model_create", + "destroy_function": "bmi_model_destroy", + "uses_forcing_file": false + } + } + ], + "forcing": { + "file_pattern": ".*{{id}}.*.csv", + "path": "./data/forcing/" + } + }, + "time": { + "start_time": "2015-12-01 00:00:00", + "end_time": "2015-12-30 23:00:00", + "output_interval": 3600 + }, + "catchments": { + "cat-27": { + "formulations": [ + { + "name": "bmi_c++", + "params": { + "model_type_name": "test_bmi_cpp", + "library_file": "./extern/test_bmi_cpp/cmake_build/libtestbmicppmodel.so", + "init_config": "./data/bmi/c/test/test_bmi_c_config.ini", + "main_output_variable": "OUTPUT_VAR_2", + "variables_names_map" : { + "INPUT_VAR_2": "TMP_2maboveground", + "INPUT_VAR_1": "precip_rate" + }, + "create_function": "bmi_model_create", + "destroy_function": "bmi_model_destroy", + "uses_forcing_file": false + } + } + ], + "forcing": { + "path": "./data/forcing/cat-27_2015-12-01 00_00_00_2015-12-30 23_00_00.csv" + } + }, + "cat-52": { + "formulations": [ + { + "name": "bmi_c++", + "params": { + "model_type_name": "test_bmi_cpp", + "library_file": "./extern/test_bmi_cpp/cmake_build/libtestbmicppmodel.so", + "init_config": "./data/bmi/c/test/test_bmi_c_config.ini", + "main_output_variable": "OUTPUT_VAR_2", + "variables_names_map" : { + "INPUT_VAR_2": "TMP_2maboveground", + "INPUT_VAR_1": "precip_rate" + }, + "create_function": "bmi_model_create", + "destroy_function": "bmi_model_destroy", + "uses_forcing_file": false + } + } + ], + "forcing": { + "path": "./data/forcing/cat-52_2015-12-01 00_00_00_2015-12-30 23_00_00.csv" + } + }, + "cat-67": { + "formulations": [ + { + "name": "bmi_c++", + "params": { + "model_type_name": "test_bmi_cpp", + "library_file": "./extern/test_bmi_cpp/cmake_build/libtestbmicppmodel.so", + "init_config": "./data/bmi/c/test/test_bmi_c_config.ini", + "main_output_variable": "OUTPUT_VAR_2", + "variables_names_map" : { + "INPUT_VAR_2": "TMP_2maboveground", + "INPUT_VAR_1": "precip_rate" + }, + "create_function": "bmi_model_create", + "destroy_function": "bmi_model_destroy", + "uses_forcing_file": false + } + } + ], + "forcing": { + "path": "./data/forcing/cat-67_2015-12-01 00_00_00_2015-12-30 23_00_00.csv" + } + }, + "agg-1": { + "formulations": [ + { + "name": "bmi_fortran", + "params": { + "model_type_name": "bmi_fortran_noahowp", + "library_file": "./extern/noah-owp-modular/cmake_build/libsurfacebmi.so", + "forcing_file": "", + "init_config": "./data/bmi/fortran/noah-owp-modular-init-agg-1.namelist.input", + "allow_exceed_end_time": true, + "main_output_variable": "QINSUR", + "variables_names_map": { + "PRCPNONC": "atmosphere_water__liquid_equivalent_precipitation_rate", + "Q2": "atmosphere_air_water~vapor__relative_saturation", + "SFCTMP": "land_surface_air__temperature", + "UU": "land_surface_wind__x_component_of_velocity", + "VV": "land_surface_wind__y_component_of_velocity", + "LWDN": "land_surface_radiation~incoming~longwave__energy_flux", + "SOLDN": "land_surface_radiation~incoming~shortwave__energy_flux", + "SFCPRS": "land_surface_air__pressure" + }, + "uses_forcing_file": false + } + } + ], + "forcing": { + "path": "./data/forcing/agg-1_2015-12-01 00_00_00_2015-12-30 23_00_00.csv" + } + } + } +} diff --git a/data/forcing/agg-1_2015-12-01 00_00_00_2015-12-30 23_00_00.csv b/data/forcing/agg-1_2015-12-01 00_00_00_2015-12-30 23_00_00.csv new file mode 100644 index 0000000000..3a857159b5 --- /dev/null +++ b/data/forcing/agg-1_2015-12-01 00_00_00_2015-12-30 23_00_00.csv @@ -0,0 +1,721 @@ +time,APCP_surface,DLWRF_surface,DSWRF_surface,PRES_surface,SPFH_2maboveground,TMP_2maboveground,UGRD_10maboveground,VGRD_10maboveground,precip_rate +2015-12-01 00:00:00,0.0,361.3000183105469,0.0,100310.0,0.00930000003427267,285.8000183105469,-2.299999952316284,0.10000000149011612,0.0 +2015-12-01 01:00:00,0.0,361.3000183105469,0.0,100320.0,0.008799999952316284,285.3000183105469,-2.299999952316284,-0.30000001192092896,0.0 +2015-12-01 02:00:00,0.0,361.3000183105469,0.0,100340.0,0.008299999870359898,284.8000183105469,-2.4000000953674316,-0.6000000238418579,0.0 +2015-12-01 03:00:00,0.0,356.0,0.0,100390.0,0.007999999448657036,283.8999938964844,-2.4000000953674316,-0.9000000357627869,0.0 +2015-12-01 04:00:00,0.0,356.0,0.0,100370.0,0.007799999788403511,283.20001220703125,-2.200000047683716,-0.20000000298023224,0.0 +2015-12-01 05:00:00,0.0,356.0,0.0,100280.0,0.007499999832361937,282.8000183105469,-2.0,0.4000000059604645,0.0 +2015-12-01 06:00:00,0.0,349.1000061035156,0.0,100320.0,0.007199999876320362,282.6000061035156,-1.8000000715255737,1.100000023841858,0.0 +2015-12-01 07:00:00,0.0,349.1000061035156,0.0,100230.0,0.0071000000461936,282.20001220703125,-2.0,0.800000011920929,0.0 +2015-12-01 08:00:00,0.0,349.1000061035156,0.0,100230.0,0.006899999920278788,282.0,-2.1000001430511475,0.5,0.0 +2015-12-01 09:00:00,0.0,341.8999938964844,0.0,100250.0,0.00699999975040555,281.8999938964844,-2.299999952316284,0.30000001192092896,0.0 +2015-12-01 10:00:00,0.0,341.8999938964844,0.0,100200.0,0.006899999920278788,281.8000183105469,-2.299999952316284,0.6000000238418579,0.0 +2015-12-01 11:00:00,0.0,341.8999938964844,0.0,100200.0,0.006799999624490738,281.8000183105469,-2.299999952316284,1.0,0.0 +2015-12-01 12:00:00,0.0,353.70001220703125,0.0,100240.0,0.006899999920278788,281.70001220703125,-2.299999952316284,1.3000000715255737,0.0 +2015-12-01 13:00:00,0.0,353.70001220703125,81.30000305175781,100280.0,0.006899999920278788,281.8999938964844,-2.4000000953674316,1.3000000715255737,0.0 +2015-12-01 14:00:00,0.0,353.70001220703125,184.8000030517578,100330.0,0.00699999975040555,282.1000061035156,-2.5,1.3000000715255737,0.0 +2015-12-01 15:00:00,0.0,391.20001220703125,227.1999969482422,100350.0,0.0071000000461936,282.1000061035156,-2.6000001430511475,1.2000000476837158,0.0 +2015-12-01 16:00:00,0.0,391.20001220703125,275.6000061035156,100270.0,0.007199999876320362,282.70001220703125,-1.899999976158142,1.899999976158142,0.0 +2015-12-01 17:00:00,0.0,391.20001220703125,287.8000183105469,100240.0,0.007499999832361937,282.70001220703125,-1.3000000715255737,2.6000001430511475,0.0 +2015-12-01 18:00:00,0.0,392.3999938964844,342.8999938964844,100130.0,0.007799999788403511,283.3000183105469,-0.6000000238418579,3.200000047683716,0.0 +2015-12-01 19:00:00,0.0,392.3999938964844,309.3000183105469,100030.0,0.008299999870359898,284.20001220703125,-0.699999988079071,3.200000047683716,0.0 +2015-12-01 20:00:00,0.0,392.3999938964844,232.90000915527344,100040.0,0.00839999970048666,284.8999938964844,-0.800000011920929,3.1000001430511475,0.0 +2015-12-01 21:00:00,0.0,390.1000061035156,109.0999984741211,99930.0,0.008599999360740185,284.8000183105469,-0.9000000357627869,3.0,0.0 +2015-12-01 22:00:00,0.0,390.1000061035156,16.80000114440918,99940.0,0.008799999952316284,285.0,-1.2000000476837158,2.6000001430511475,0.0 +2015-12-01 23:00:00,0.0,390.1000061035156,0.0,100000.0,0.008899999782443047,285.0,-1.5,2.299999952316284,0.0 +2015-12-02 00:00:00,0.0,387.6000061035156,0.0,99990.0,0.008899999782443047,285.0,-1.8000000715255737,1.899999976158142,0.0 +2015-12-02 01:00:00,0.0,387.6000061035156,0.0,99940.0,0.009099999442696571,285.3999938964844,-1.7000000476837158,1.7000000476837158,0.0 +2015-12-02 02:00:00,0.0,387.6000061035156,0.0,99900.0,0.008899999782443047,285.5,-1.600000023841858,1.5,0.0 +2015-12-02 03:00:00,0.0,369.20001220703125,0.0,99880.0,0.008999999612569809,285.6000061035156,-1.600000023841858,1.3000000715255737,0.0 +2015-12-02 04:00:00,0.0,369.20001220703125,0.0,99800.0,0.009200000204145908,285.6000061035156,-1.600000023841858,1.899999976158142,0.0 +2015-12-02 05:00:00,0.0,369.20001220703125,0.0,99810.0,0.008999999612569809,285.20001220703125,-1.600000023841858,2.6000001430511475,0.0 +2015-12-02 06:00:00,0.0,366.3999938964844,0.0,99770.0,0.009099999442696571,285.3999938964844,-1.600000023841858,3.200000047683716,0.0 +2015-12-02 07:00:00,0.0,366.3999938964844,0.0,99600.0,0.00930000003427267,286.0,-1.600000023841858,3.4000000953674316,0.0 +2015-12-02 08:00:00,0.0,366.3999938964844,0.0,99550.0,0.009800000116229057,286.8999938964844,-1.7000000476837158,3.700000047683716,0.0 +2015-12-02 09:00:00,0.0,369.70001220703125,0.0,99500.0,0.00989999994635582,287.0,-1.8000000715255737,3.9000000953674316,0.0 +2015-12-02 10:00:00,0.0,369.70001220703125,0.0,99440.0,0.010499999858438969,287.6000061035156,-1.600000023841858,4.0,0.0 +2015-12-02 11:00:00,0.0,369.70001220703125,0.0,99430.0,0.010900000110268593,288.20001220703125,-1.5,4.0,0.0 +2015-12-02 12:00:00,0.0,376.5,0.0,99440.0,0.01119999960064888,288.70001220703125,-1.399999976158142,4.099999904632568,0.0 +2015-12-02 13:00:00,0.0,376.5,76.30000305175781,99440.0,0.011399999260902405,289.3999938964844,-0.800000011920929,4.0,0.0 +2015-12-02 14:00:00,0.0,376.5,175.60000610351562,99400.0,0.011899999342858791,290.0,-0.20000000298023224,4.0,2.780978003916007e-08 +2015-12-02 15:00:00,0.10000000149011612,398.0,117.0999984741211,99550.0,0.012299999594688416,290.6000061035156,0.30000001192092896,3.9000000953674316,1.9468860507876914e-07 +2015-12-02 16:00:00,0.699999988079071,398.0,142.3000030517578,99530.0,0.012199999764561653,290.3999938964844,1.0,4.0,1.1124674758866803e-07 +2015-12-02 17:00:00,0.4000000059604645,397.8999938964844,148.6999969482422,99360.0,0.012299999594688416,290.1000061035156,1.8000000715255737,4.200000286102295,2.781025218983742e-08 +2015-12-02 18:00:00,0.10000000149011612,398.8999938964844,132.10000610351562,99260.0,0.012000000104308128,290.8000183105469,2.5,4.300000190734863,0.0 +2015-12-02 19:00:00,0.0,398.8999938964844,119.20000457763672,99210.0,0.011699999682605267,289.8999938964844,3.0,4.200000286102295,0.0 +2015-12-02 20:00:00,0.0,398.8999938964844,89.70000457763672,99070.0,0.011899999342858791,290.1000061035156,3.5,4.099999904632568,0.0 +2015-12-02 21:00:00,0.0,377.8000183105469,56.900001525878906,99120.0,0.011799999512732029,289.8000183105469,4.099999904632568,4.0,0.0 +2015-12-02 22:00:00,0.0,377.8000183105469,8.699999809265137,99130.0,0.011500000022351742,289.5,4.5,4.099999904632568,0.0 +2015-12-02 23:00:00,0.0,377.8000183105469,0.0,99180.0,0.010900000110268593,289.3999938964844,5.0,4.300000190734863,0.0 +2015-12-03 00:00:00,0.0,352.0,0.0,99280.0,0.008700000122189522,288.0,5.400000095367432,4.400000095367432,0.0 +2015-12-03 01:00:00,0.0,352.0,0.0,99240.0,0.007499999832361937,286.3999938964844,5.200000286102295,4.0,0.0 +2015-12-03 02:00:00,0.0,352.0,0.0,99320.0,0.0071000000461936,285.20001220703125,4.900000095367432,3.6000001430511475,0.0 +2015-12-03 03:00:00,0.0,297.5,0.0,99430.0,0.006599999964237213,283.8999938964844,4.599999904632568,3.299999952316284,0.0 +2015-12-03 04:00:00,0.0,297.5,0.0,99440.0,0.0064999996684491634,283.0,4.5,2.4000000953674316,0.0 +2015-12-03 05:00:00,0.0,297.5,0.0,99570.0,0.006599999964237213,282.8999938964844,4.400000095367432,1.5,0.0 +2015-12-03 06:00:00,0.0,279.70001220703125,0.0,99560.0,0.0064999996684491634,282.3999938964844,4.300000190734863,0.699999988079071,0.0 +2015-12-03 07:00:00,0.0,279.70001220703125,0.0,99600.0,0.006599999964237213,281.70001220703125,3.9000000953674316,-0.20000000298023224,0.0 +2015-12-03 08:00:00,0.0,279.70001220703125,0.0,99700.0,0.0064999996684491634,281.3999938964844,3.4000000953674316,-1.0,0.0 +2015-12-03 09:00:00,0.0,256.70001220703125,0.0,99760.0,0.006300000008195639,281.1000061035156,2.9000000953674316,-1.899999976158142,0.0 +2015-12-03 10:00:00,0.0,256.70001220703125,0.0,99830.0,0.006199999712407589,280.70001220703125,2.299999952316284,-2.299999952316284,0.0 +2015-12-03 11:00:00,0.0,256.70001220703125,0.0,99940.0,0.0058999997563660145,280.6000061035156,1.600000023841858,-2.799999952316284,0.0 +2015-12-03 12:00:00,0.0,252.3000030517578,0.0,100080.0,0.0050999997183680534,278.70001220703125,0.9000000357627869,-3.299999952316284,0.0 +2015-12-03 13:00:00,0.0,252.3000030517578,110.5999984741211,100110.0,0.0050999997183680534,278.8999938964844,0.20000000298023224,-4.200000286102295,0.0 +2015-12-03 14:00:00,0.0,252.3000030517578,258.1000061035156,100240.0,0.004399999976158142,280.8999938964844,-0.5,-5.099999904632568,0.0 +2015-12-03 15:00:00,0.0,262.1000061035156,384.0,100410.0,0.0038999998942017555,282.20001220703125,-1.2000000476837158,-5.900000095367432,0.0 +2015-12-03 16:00:00,0.0,262.1000061035156,467.3999938964844,100430.0,0.003599999938160181,282.8999938964844,-1.399999976158142,-5.599999904632568,0.0 +2015-12-03 17:00:00,0.0,262.1000061035156,489.0,100410.0,0.003700000001117587,283.5,-1.7000000476837158,-5.300000190734863,0.0 +2015-12-03 18:00:00,0.0,265.3999938964844,483.20001220703125,100380.0,0.003499999875202775,283.5,-2.0,-4.900000095367432,0.0 +2015-12-03 19:00:00,0.0,265.3999938964844,436.1000061035156,100350.0,0.003499999875202775,283.8999938964844,-1.7000000476837158,-4.700000286102295,0.0 +2015-12-03 20:00:00,0.0,265.3999938964844,328.3999938964844,100450.0,0.003599999938160181,283.3000183105469,-1.399999976158142,-4.400000095367432,0.0 +2015-12-03 21:00:00,0.0,251.8000030517578,175.40000915527344,100500.0,0.0037999998312443495,282.70001220703125,-1.100000023841858,-4.200000286102295,0.0 +2015-12-03 22:00:00,0.0,251.8000030517578,26.399999618530273,100580.0,0.004100000020116568,281.1000061035156,-1.2000000476837158,-3.700000047683716,0.0 +2015-12-03 23:00:00,0.0,251.8000030517578,0.0,100660.0,0.00419999985024333,279.8999938964844,-1.2000000476837158,-3.299999952316284,0.0 +2015-12-04 00:00:00,0.0,233.5,0.0,100760.0,0.00419999985024333,279.6000061035156,-1.2000000476837158,-2.9000000953674316,0.0 +2015-12-04 01:00:00,0.0,233.5,0.0,100780.0,0.00419999985024333,278.20001220703125,-1.399999976158142,-2.9000000953674316,0.0 +2015-12-04 02:00:00,0.0,233.5,0.0,100870.0,0.00419999985024333,278.1000061035156,-1.600000023841858,-2.9000000953674316,0.0 +2015-12-04 03:00:00,0.0,227.60000610351562,0.0,101010.0,0.003999999724328518,278.3999938964844,-1.7000000476837158,-2.799999952316284,0.0 +2015-12-04 04:00:00,0.0,227.60000610351562,0.0,101020.0,0.003999999724328518,277.8999938964844,-1.7000000476837158,-2.799999952316284,0.0 +2015-12-04 05:00:00,0.0,227.60000610351562,0.0,101000.0,0.003700000001117587,277.8000183105469,-1.7000000476837158,-2.799999952316284,0.0 +2015-12-04 06:00:00,0.0,220.90000915527344,0.0,101060.0,0.003499999875202775,277.6000061035156,-1.8000000715255737,-2.799999952316284,0.0 +2015-12-04 07:00:00,0.0,220.90000915527344,0.0,101060.0,0.003499999875202775,277.70001220703125,-1.399999976158142,-2.9000000953674316,0.0 +2015-12-04 08:00:00,0.0,220.90000915527344,0.0,101160.0,0.003499999875202775,276.3999938964844,-1.100000023841858,-3.0,0.0 +2015-12-04 09:00:00,0.0,216.3000030517578,0.0,101210.0,0.003399999812245369,275.8000183105469,-0.699999988079071,-3.1000001430511475,0.0 +2015-12-04 10:00:00,0.0,216.3000030517578,0.0,101210.0,0.0032999999821186066,274.70001220703125,-0.9000000357627869,-3.0,0.0 +2015-12-04 11:00:00,0.0,216.3000030517578,0.0,101300.0,0.0032999999821186066,274.3000183105469,-1.100000023841858,-2.799999952316284,0.0 +2015-12-04 12:00:00,0.0,219.3000030517578,0.0,101410.0,0.0032999999821186066,273.8999938964844,-1.3000000715255737,-2.700000047683716,0.0 +2015-12-04 13:00:00,0.0,219.3000030517578,109.5999984741211,101410.0,0.003399999812245369,274.6000061035156,-1.5,-3.0,0.0 +2015-12-04 14:00:00,0.0,219.1999969482422,259.1000061035156,101470.0,0.003599999938160181,277.6000061035156,-1.8000000715255737,-3.4000000953674316,0.0 +2015-12-04 15:00:00,0.0,237.6999969482422,413.8000183105469,101550.0,0.003599999938160181,280.0,-2.0,-3.700000047683716,0.0 +2015-12-04 16:00:00,0.0,237.6999969482422,504.3000183105469,101540.0,0.003700000001117587,281.70001220703125,-2.5,-3.799999952316284,0.0 +2015-12-04 17:00:00,0.0,237.6999969482422,528.1000366210938,101480.0,0.003499999875202775,283.3999938964844,-3.0,-3.9000000953674316,0.0 +2015-12-04 18:00:00,0.0,246.0,508.20001220703125,101470.0,0.003499999875202775,284.20001220703125,-3.5,-3.9000000953674316,0.0 +2015-12-04 19:00:00,0.0,246.0,458.8999938964844,101360.0,0.003499999875202775,285.0,-3.299999952316284,-3.799999952316284,0.0 +2015-12-04 20:00:00,0.0,246.0,345.6000061035156,101310.0,0.0032999999821186066,285.1000061035156,-3.1000001430511475,-3.6000001430511475,0.0 +2015-12-04 21:00:00,0.0,237.1999969482422,148.5,101360.0,0.0031999999191612005,284.8999938964844,-2.9000000953674316,-3.4000000953674316,0.0 +2015-12-04 22:00:00,0.0,237.1999969482422,22.200000762939453,101390.0,0.003499999875202775,282.8000183105469,-2.0,-3.5,0.0 +2015-12-04 23:00:00,0.0,237.1999969482422,0.0,101420.0,0.003700000001117587,279.5,-1.2000000476837158,-3.5,0.0 +2015-12-05 00:00:00,0.0,225.6999969482422,0.0,101480.0,0.003700000001117587,278.1000061035156,-0.30000001192092896,-3.5,0.0 +2015-12-05 01:00:00,0.0,225.6999969482422,0.0,101440.0,0.003599999938160181,276.70001220703125,-0.699999988079071,-3.4000000953674316,0.0 +2015-12-05 02:00:00,0.0,225.6999969482422,0.0,101550.0,0.003599999938160181,275.8999938964844,-1.0,-3.200000047683716,0.0 +2015-12-05 03:00:00,0.0,222.1999969482422,0.0,101630.0,0.003599999938160181,275.70001220703125,-1.399999976158142,-3.1000001430511475,0.0 +2015-12-05 04:00:00,0.0,222.1999969482422,0.0,101590.0,0.003499999875202775,275.0,-1.399999976158142,-3.1000001430511475,0.0 +2015-12-05 05:00:00,0.0,222.1999969482422,0.0,101630.0,0.003499999875202775,274.3000183105469,-1.399999976158142,-3.1000001430511475,0.0 +2015-12-05 06:00:00,0.0,219.60000610351562,0.0,101590.0,0.003499999875202775,274.3000183105469,-1.3000000715255737,-3.200000047683716,0.0 +2015-12-05 07:00:00,0.0,219.60000610351562,0.0,101600.0,0.003499999875202775,274.20001220703125,-1.3000000715255737,-3.1000001430511475,0.0 +2015-12-05 08:00:00,0.0,219.60000610351562,0.0,101700.0,0.003399999812245369,273.3000183105469,-1.2000000476837158,-3.1000001430511475,0.0 +2015-12-05 09:00:00,0.0,220.0,0.0,101720.0,0.003499999875202775,273.5,-1.2000000476837158,-3.0,0.0 +2015-12-05 10:00:00,0.0,220.0,0.0,101760.0,0.003399999812245369,273.6000061035156,-1.3000000715255737,-2.9000000953674316,0.0 +2015-12-05 11:00:00,0.0,220.0,0.0,101780.0,0.003499999875202775,273.8999938964844,-1.399999976158142,-2.700000047683716,0.0 +2015-12-05 12:00:00,0.0,225.6999969482422,0.0,101840.0,0.003399999812245369,273.3999938964844,-1.399999976158142,-2.5,0.0 +2015-12-05 13:00:00,0.0,225.6999969482422,105.80000305175781,101840.0,0.003599999938160181,274.20001220703125,-1.7000000476837158,-2.9000000953674316,0.0 +2015-12-05 14:00:00,0.0,225.6999969482422,253.5,101890.0,0.003700000001117587,278.20001220703125,-2.0,-3.299999952316284,0.0 +2015-12-05 15:00:00,0.0,251.10000610351562,404.3999938964844,101910.0,0.003700000001117587,280.8000183105469,-2.299999952316284,-3.700000047683716,0.0 +2015-12-05 16:00:00,0.0,251.10000610351562,493.70001220703125,101920.0,0.003700000001117587,282.8999938964844,-2.5,-3.700000047683716,0.0 +2015-12-05 17:00:00,0.0,251.10000610351562,517.4000244140625,101830.0,0.003700000001117587,284.6000061035156,-2.799999952316284,-3.700000047683716,0.0 +2015-12-05 18:00:00,0.0,266.8000183105469,495.1000061035156,101720.0,0.003499999875202775,285.70001220703125,-3.0,-3.799999952316284,0.0 +2015-12-05 19:00:00,0.0,266.8000183105469,447.20001220703125,101570.0,0.003599999938160181,286.6000061035156,-2.700000047683716,-3.700000047683716,0.0 +2015-12-05 20:00:00,0.0,266.8000183105469,336.8999938964844,101580.0,0.003700000001117587,286.70001220703125,-2.5,-3.700000047683716,0.0 +2015-12-05 21:00:00,0.0,260.0,142.10000610351562,101670.0,0.003599999938160181,286.3000183105469,-2.200000047683716,-3.700000047683716,0.0 +2015-12-05 22:00:00,0.0,260.0,21.100000381469727,101670.0,0.0037999998312443495,284.70001220703125,-2.200000047683716,-3.299999952316284,0.0 +2015-12-05 23:00:00,0.0,260.0,0.0,101700.0,0.003999999724328518,281.6000061035156,-2.1000001430511475,-3.0,0.0 +2015-12-06 00:00:00,0.0,249.5,0.0,101750.0,0.0038999998942017555,280.5,-2.1000001430511475,-2.700000047683716,0.0 +2015-12-06 01:00:00,0.0,249.5,0.0,101730.0,0.0037999998312443495,280.0,-2.1000001430511475,-2.6000001430511475,0.0 +2015-12-06 02:00:00,0.0,249.5,0.0,101760.0,0.0037999998312443495,279.3000183105469,-2.200000047683716,-2.6000001430511475,0.0 +2015-12-06 03:00:00,0.0,250.90000915527344,0.0,101760.0,0.003999999724328518,279.1000061035156,-2.200000047683716,-2.6000001430511475,0.0 +2015-12-06 04:00:00,0.0,250.90000915527344,0.0,101730.0,0.0037999998312443495,278.3000183105469,-2.200000047683716,-2.4000000953674316,0.0 +2015-12-06 05:00:00,0.0,250.90000915527344,0.0,101740.0,0.0037999998312443495,277.8999938964844,-2.1000001430511475,-2.200000047683716,0.0 +2015-12-06 06:00:00,0.0,268.20001220703125,0.0,101720.0,0.0038999998942017555,277.3999938964844,-2.0,-2.0,0.0 +2015-12-06 07:00:00,0.0,268.20001220703125,0.0,101620.0,0.0037999998312443495,277.3999938964844,-1.899999976158142,-2.200000047683716,0.0 +2015-12-06 08:00:00,0.0,268.20001220703125,0.0,101610.0,0.003700000001117587,276.8000183105469,-1.8000000715255737,-2.5,0.0 +2015-12-06 09:00:00,0.0,303.1000061035156,0.0,101600.0,0.0038999998942017555,276.3000183105469,-1.8000000715255737,-2.700000047683716,0.0 +2015-12-06 10:00:00,0.0,303.1000061035156,0.0,101600.0,0.003999999724328518,276.5,-1.600000023841858,-2.4000000953674316,0.0 +2015-12-06 11:00:00,0.0,303.1000061035156,0.0,101600.0,0.0037999998312443495,275.3000183105469,-1.5,-2.1000001430511475,0.0 +2015-12-06 12:00:00,0.0,272.20001220703125,0.0,101650.0,0.003700000001117587,275.1000061035156,-1.3000000715255737,-1.8000000715255737,0.0 +2015-12-06 13:00:00,0.0,272.20001220703125,101.0,101620.0,0.003999999724328518,276.0,-1.399999976158142,-2.0,0.0 +2015-12-06 14:00:00,0.0,272.20001220703125,245.10000610351562,101590.0,0.004299999680370092,279.3000183105469,-1.600000023841858,-2.299999952316284,0.0 +2015-12-06 15:00:00,0.0,276.8000183105469,393.3999938964844,101590.0,0.004399999976158142,282.20001220703125,-1.7000000476837158,-2.5,0.0 +2015-12-06 16:00:00,0.0,276.8000183105469,481.0,101520.0,0.004299999680370092,284.3999938964844,-1.899999976158142,-2.0,0.0 +2015-12-06 17:00:00,0.0,276.8000183105469,504.5,101420.0,0.00419999985024333,285.70001220703125,-2.0,-1.5,0.0 +2015-12-06 18:00:00,0.0,294.3999938964844,484.3000183105469,101330.0,0.0038999998942017555,287.70001220703125,-2.200000047683716,-1.100000023841858,0.0 +2015-12-06 19:00:00,0.0,294.3999938964844,437.6000061035156,101090.0,0.004600000102072954,288.5,-2.0,-1.100000023841858,0.0 +2015-12-06 20:00:00,0.0,294.3999938964844,329.70001220703125,100990.0,0.004699999932199717,289.3000183105469,-1.7000000476837158,-1.100000023841858,0.0 +2015-12-06 21:00:00,0.0,286.20001220703125,145.60000610351562,101010.0,0.004999999888241291,289.5,-1.5,-1.100000023841858,0.0 +2015-12-06 22:00:00,0.0,286.1000061035156,21.600000381469727,100930.0,0.00559999980032444,286.3000183105469,-1.5,-0.6000000238418579,0.0 +2015-12-06 23:00:00,0.0,286.20001220703125,0.0,100950.0,0.005499999970197678,283.5,-1.399999976158142,-0.10000000149011612,0.0 +2015-12-07 00:00:00,0.0,275.5,0.0,101000.0,0.005499999970197678,282.20001220703125,-1.399999976158142,0.4000000059604645,0.0 +2015-12-07 01:00:00,0.0,275.5,0.0,100940.0,0.005499999970197678,280.8999938964844,-1.2000000476837158,0.0,0.0 +2015-12-07 02:00:00,0.0,275.5,0.0,100920.0,0.005200000014156103,279.70001220703125,-0.9000000357627869,-0.30000001192092896,0.0 +2015-12-07 03:00:00,0.0,275.8999938964844,0.0,100930.0,0.0050999997183680534,279.0,-0.699999988079071,-0.6000000238418579,0.0 +2015-12-07 04:00:00,0.0,275.8999938964844,0.0,100820.0,0.004999999888241291,277.70001220703125,-0.30000001192092896,-1.3000000715255737,0.0 +2015-12-07 05:00:00,0.0,275.8999938964844,0.0,100830.0,0.0052999998442828655,278.3999938964844,0.0,-1.899999976158142,0.0 +2015-12-07 06:00:00,0.0,270.8999938964844,0.0,100810.0,0.0052999998442828655,277.8999938964844,0.30000001192092896,-2.5,0.0 +2015-12-07 07:00:00,0.0,270.8999938964844,0.0,100700.0,0.005399999674409628,278.0,0.10000000149011612,-2.4000000953674316,0.0 +2015-12-07 08:00:00,0.0,270.8999938964844,0.0,100640.0,0.0044999998062849045,276.1000061035156,-0.10000000149011612,-2.200000047683716,0.0 +2015-12-07 09:00:00,0.0,273.0,0.0,100610.0,0.004600000102072954,276.1000061035156,-0.20000000298023224,-2.1000001430511475,0.0 +2015-12-07 10:00:00,0.0,273.0,0.0,100530.0,0.004399999976158142,274.8000183105469,0.10000000149011612,-2.0,0.0 +2015-12-07 11:00:00,0.0,273.0,0.0,100540.0,0.0044999998062849045,275.5,0.4000000059604645,-1.899999976158142,0.0 +2015-12-07 12:00:00,0.0,314.3999938964844,0.0,100580.0,0.004799999762326479,276.20001220703125,0.699999988079071,-1.899999976158142,0.0 +2015-12-07 13:00:00,0.0,314.3999938964844,70.5999984741211,100530.0,0.004900000058114529,276.3999938964844,0.9000000357627869,-1.899999976158142,0.0 +2015-12-07 14:00:00,0.0,314.3999938964844,173.6999969482422,100510.0,0.005699999630451202,279.20001220703125,1.0,-1.899999976158142,0.0 +2015-12-07 15:00:00,0.0,342.3999938964844,287.6000061035156,100530.0,0.006099999882280827,284.0,1.2000000476837158,-2.0,0.0 +2015-12-07 16:00:00,0.0,342.3999938964844,352.1000061035156,100430.0,0.0052999998442828655,287.3000183105469,1.0,-2.1000001430511475,0.0 +2015-12-07 17:00:00,0.0,342.3999938964844,369.6000061035156,100280.0,0.004999999888241291,289.6000061035156,0.9000000357627869,-2.299999952316284,0.0 +2015-12-07 18:00:00,0.0,338.20001220703125,409.6000061035156,100210.0,0.0050999997183680534,290.5,0.800000011920929,-2.4000000953674316,0.0 +2015-12-07 19:00:00,0.0,338.20001220703125,370.3000183105469,100030.0,0.005499999970197678,291.1000061035156,0.9000000357627869,-2.299999952316284,0.0 +2015-12-07 20:00:00,0.0,338.20001220703125,279.1000061035156,99960.0,0.00559999980032444,291.3000183105469,1.100000023841858,-2.200000047683716,0.0 +2015-12-07 21:00:00,0.0,343.8000183105469,130.0,100050.0,0.00559999980032444,291.3999938964844,1.2000000476837158,-2.0,0.0 +2015-12-07 22:00:00,0.0,343.8000183105469,19.200000762939453,100030.0,0.005699999630451202,288.6000061035156,0.9000000357627869,-1.7000000476837158,0.0 +2015-12-07 23:00:00,0.0,343.8000183105469,0.0,100120.0,0.00559999980032444,283.3000183105469,0.699999988079071,-1.3000000715255737,0.0 +2015-12-08 00:00:00,0.0,311.6000061035156,0.0,100170.0,0.005799999926239252,284.0,0.4000000059604645,-1.0,0.0 +2015-12-08 01:00:00,0.0,311.6000061035156,0.0,100130.0,0.005699999630451202,282.70001220703125,0.5,-1.0,0.0 +2015-12-08 02:00:00,0.0,311.6000061035156,0.0,100170.0,0.005499999970197678,281.8999938964844,0.5,-1.0,0.0 +2015-12-08 03:00:00,0.0,281.3000183105469,0.0,100250.0,0.00559999980032444,282.3000183105469,0.6000000238418579,-1.0,0.0 +2015-12-08 04:00:00,0.0,281.3000183105469,0.0,100250.0,0.0052999998442828655,280.5,0.6000000238418579,-0.699999988079071,0.0 +2015-12-08 05:00:00,0.0,281.3000183105469,0.0,100230.0,0.0050999997183680534,280.3000183105469,0.699999988079071,-0.4000000059604645,0.0 +2015-12-08 06:00:00,0.0,279.5,0.0,100190.0,0.0050999997183680534,279.8000183105469,0.699999988079071,0.0,0.0 +2015-12-08 07:00:00,0.0,279.5,0.0,100150.0,0.005200000014156103,279.0,0.800000011920929,-0.30000001192092896,0.0 +2015-12-08 08:00:00,0.0,279.5,0.0,100220.0,0.005399999674409628,278.3000183105469,0.800000011920929,-0.6000000238418579,0.0 +2015-12-08 09:00:00,0.0,267.20001220703125,0.0,100210.0,0.004900000058114529,277.70001220703125,0.9000000357627869,-0.9000000357627869,0.0 +2015-12-08 10:00:00,0.0,267.20001220703125,0.0,100160.0,0.004799999762326479,277.0,0.5,-0.800000011920929,0.0 +2015-12-08 11:00:00,0.0,267.20001220703125,0.0,100230.0,0.0044999998062849045,275.3999938964844,0.10000000149011612,-0.800000011920929,0.0 +2015-12-08 12:00:00,0.0,258.20001220703125,0.0,100330.0,0.0044999998062849045,275.5,-0.30000001192092896,-0.800000011920929,0.0 +2015-12-08 13:00:00,0.0,258.20001220703125,96.80000305175781,100300.0,0.0044999998062849045,275.20001220703125,-0.4000000059604645,-0.6000000238418579,0.0 +2015-12-08 14:00:00,0.0,258.20001220703125,241.5,100380.0,0.006000000052154064,280.1000061035156,-0.6000000238418579,-0.4000000059604645,0.0 +2015-12-08 15:00:00,0.0,283.6000061035156,393.6000061035156,100460.0,0.006099999882280827,284.1000061035156,-0.699999988079071,-0.30000001192092896,0.0 +2015-12-08 16:00:00,0.0,283.6000061035156,482.70001220703125,100430.0,0.00559999980032444,286.5,-0.699999988079071,0.5,0.0 +2015-12-08 17:00:00,0.0,283.6000061035156,507.20001220703125,100320.0,0.0052999998442828655,288.5,-0.800000011920929,1.3000000715255737,0.0 +2015-12-08 18:00:00,0.0,289.5,489.5,100250.0,0.005499999970197678,289.3000183105469,-0.800000011920929,2.1000001430511475,0.0 +2015-12-08 19:00:00,0.0,289.5,442.70001220703125,100120.0,0.005699999630451202,290.0,-0.4000000059604645,2.5,0.0 +2015-12-08 20:00:00,0.0,289.5,333.8000183105469,100130.0,0.005799999926239252,290.20001220703125,0.0,2.9000000953674316,0.0 +2015-12-08 21:00:00,0.0,278.70001220703125,141.40000915527344,100100.0,0.006000000052154064,289.5,0.5,3.200000047683716,0.0 +2015-12-08 22:00:00,0.0,278.70001220703125,21.0,100100.0,0.006000000052154064,287.5,0.10000000149011612,2.9000000953674316,0.0 +2015-12-08 23:00:00,0.0,278.70001220703125,0.0,100120.0,0.006000000052154064,283.5,-0.20000000298023224,2.6000001430511475,0.0 +2015-12-09 00:00:00,0.0,263.3000183105469,0.0,100180.0,0.006099999882280827,281.8000183105469,-0.5,2.299999952316284,0.0 +2015-12-09 01:00:00,0.0,263.3000183105469,0.0,100190.0,0.006099999882280827,281.20001220703125,-0.800000011920929,2.299999952316284,0.0 +2015-12-09 02:00:00,0.0,263.3000183105469,0.0,100220.0,0.006399999838322401,281.0,-1.2000000476837158,2.200000047683716,0.0 +2015-12-09 03:00:00,0.0,258.1000061035156,0.0,100240.0,0.006099999882280827,280.1000061035156,-1.600000023841858,2.200000047683716,0.0 +2015-12-09 04:00:00,0.0,258.1000061035156,0.0,100170.0,0.005799999926239252,278.8999938964844,-1.100000023841858,2.0,0.0 +2015-12-09 05:00:00,0.0,258.1000061035156,0.0,100160.0,0.005699999630451202,279.0,-0.6000000238418579,1.8000000715255737,0.0 +2015-12-09 06:00:00,0.0,254.5,0.0,100160.0,0.005699999630451202,278.5,0.0,1.600000023841858,0.0 +2015-12-09 07:00:00,0.0,254.5,0.0,100130.0,0.005499999970197678,278.6000061035156,-0.20000000298023224,1.5,0.0 +2015-12-09 08:00:00,0.0,254.5,0.0,100160.0,0.005499999970197678,278.5,-0.4000000059604645,1.399999976158142,0.0 +2015-12-09 09:00:00,0.0,255.3000030517578,0.0,100110.0,0.005399999674409628,277.70001220703125,-0.6000000238418579,1.399999976158142,0.0 +2015-12-09 10:00:00,0.0,255.3000030517578,0.0,100090.0,0.004999999888241291,276.8999938964844,-0.800000011920929,1.7000000476837158,0.0 +2015-12-09 11:00:00,0.0,255.3000030517578,0.0,100130.0,0.004900000058114529,277.1000061035156,-1.0,2.1000001430511475,0.0 +2015-12-09 12:00:00,0.0,266.6000061035156,0.0,100190.0,0.004999999888241291,276.6000061035156,-1.2000000476837158,2.5,0.0 +2015-12-09 13:00:00,0.0,266.6000061035156,93.4000015258789,100160.0,0.004699999932199717,276.0,-1.0,1.8000000715255737,0.0 +2015-12-09 14:00:00,0.0,266.6000061035156,236.10000610351562,100240.0,0.0058999997563660145,279.3000183105469,-0.800000011920929,1.0,0.0 +2015-12-09 15:00:00,0.0,294.6000061035156,362.0,100290.0,0.0066999997943639755,283.0,-0.699999988079071,0.30000001192092896,0.0 +2015-12-09 16:00:00,0.0,294.6000061035156,444.6000061035156,100160.0,0.006000000052154064,286.5,-0.4000000059604645,1.0,0.0 +2015-12-09 17:00:00,0.0,294.6000061035156,467.70001220703125,100020.0,0.0052999998442828655,288.8999938964844,-0.20000000298023224,1.600000023841858,0.0 +2015-12-09 18:00:00,0.0,304.1000061035156,478.0,99930.0,0.004799999762326479,290.1000061035156,0.0,2.299999952316284,0.0 +2015-12-09 19:00:00,0.0,304.1000061035156,432.5,99750.0,0.004999999888241291,291.0,0.4000000059604645,2.0,0.0 +2015-12-09 20:00:00,0.0,304.1000061035156,326.3000183105469,99770.0,0.004999999888241291,291.1000061035156,0.800000011920929,1.8000000715255737,0.0 +2015-12-09 21:00:00,0.0,291.8000183105469,138.1999969482422,99740.0,0.004999999888241291,290.70001220703125,1.2000000476837158,1.5,0.0 +2015-12-09 22:00:00,0.0,291.8000183105469,20.600000381469727,99790.0,0.005200000014156103,288.0,1.600000023841858,0.6000000238418579,0.0 +2015-12-09 23:00:00,0.0,291.8000183105469,0.0,99830.0,0.0050999997183680534,284.0,2.0,-0.30000001192092896,0.0 +2015-12-10 00:00:00,0.0,274.6000061035156,0.0,99830.0,0.005200000014156103,284.20001220703125,2.4000000953674316,-1.2000000476837158,0.0 +2015-12-10 01:00:00,0.0,274.6000061035156,0.0,99830.0,0.0052999998442828655,282.3000183105469,2.1000001430511475,-1.600000023841858,0.0 +2015-12-10 02:00:00,0.0,274.6000061035156,0.0,99860.0,0.004999999888241291,281.1000061035156,1.8000000715255737,-2.0,0.0 +2015-12-10 03:00:00,0.0,271.8000183105469,0.0,99830.0,0.004900000058114529,280.5,1.5,-2.4000000953674316,0.0 +2015-12-10 04:00:00,0.0,271.8000183105469,0.0,99790.0,0.005200000014156103,280.8999938964844,1.5,-2.1000001430511475,0.0 +2015-12-10 05:00:00,0.0,271.8000183105469,0.0,99820.0,0.0050999997183680534,279.8999938964844,1.399999976158142,-1.7000000476837158,0.0 +2015-12-10 06:00:00,0.0,277.3999938964844,0.0,99860.0,0.0050999997183680534,279.20001220703125,1.399999976158142,-1.399999976158142,0.0 +2015-12-10 07:00:00,0.0,277.3999938964844,0.0,99780.0,0.004999999888241291,280.3999938964844,1.399999976158142,-1.3000000715255737,0.0 +2015-12-10 08:00:00,0.0,277.3999938964844,0.0,99780.0,0.0050999997183680534,279.5,1.399999976158142,-1.2000000476837158,0.0 +2015-12-10 09:00:00,0.0,306.3999938964844,0.0,99780.0,0.005200000014156103,279.8000183105469,1.3000000715255737,-1.100000023841858,0.0 +2015-12-10 10:00:00,0.0,306.3999938964844,0.0,99780.0,0.004999999888241291,279.5,0.800000011920929,-0.9000000357627869,0.0 +2015-12-10 11:00:00,0.0,306.3999938964844,0.0,99820.0,0.0052999998442828655,279.3999938964844,0.30000001192092896,-0.699999988079071,0.0 +2015-12-10 12:00:00,0.0,289.1000061035156,0.0,99830.0,0.0050999997183680534,279.3000183105469,-0.20000000298023224,-0.6000000238418579,0.0 +2015-12-10 13:00:00,0.0,289.1000061035156,91.0,99860.0,0.005399999674409628,278.8000183105469,0.20000000298023224,-0.6000000238418579,0.0 +2015-12-10 14:00:00,0.0,289.1000061035156,233.3000030517578,99880.0,0.006099999882280827,282.70001220703125,0.699999988079071,-0.6000000238418579,0.0 +2015-12-10 15:00:00,0.0,301.1000061035156,382.1000061035156,100000.0,0.006300000008195639,286.1000061035156,1.2000000476837158,-0.6000000238418579,0.0 +2015-12-10 16:00:00,0.0,301.1000061035156,469.8999938964844,99920.0,0.007199999876320362,288.8999938964844,1.5,0.20000000298023224,0.0 +2015-12-10 17:00:00,0.0,301.1000061035156,494.70001220703125,99860.0,0.007199999876320362,291.8000183105469,1.8000000715255737,1.100000023841858,0.0 +2015-12-10 18:00:00,0.0,328.3999938964844,440.8999938964844,99730.0,0.007899999618530273,293.0,2.1000001430511475,1.899999976158142,0.0 +2015-12-10 19:00:00,0.0,328.3999938964844,399.20001220703125,99650.0,0.008100000210106373,292.8999938964844,1.899999976158142,2.4000000953674316,0.0 +2015-12-10 20:00:00,0.0,328.3999938964844,301.3999938964844,99630.0,0.008200000040233135,293.0,1.7000000476837158,3.0,0.0 +2015-12-10 21:00:00,0.0,351.3000183105469,126.5999984741211,99670.0,0.007899999618530273,292.1000061035156,1.399999976158142,3.6000001430511475,0.0 +2015-12-10 22:00:00,0.0,351.3000183105469,19.0,99670.0,0.007799999788403511,290.6000061035156,1.100000023841858,3.4000000953674316,0.0 +2015-12-10 23:00:00,0.0,351.3999938964844,0.0,99650.0,0.007799999788403511,287.8999938964844,0.699999988079071,3.299999952316284,0.0 +2015-12-11 00:00:00,0.0,351.20001220703125,0.0,99710.0,0.007899999618530273,286.1000061035156,0.4000000059604645,3.1000001430511475,0.0 +2015-12-11 01:00:00,0.0,351.20001220703125,0.0,99690.0,0.007999999448657036,286.1000061035156,0.10000000149011612,2.799999952316284,0.0 +2015-12-11 02:00:00,0.0,351.20001220703125,0.0,99770.0,0.007999999448657036,285.8000183105469,-0.20000000298023224,2.4000000953674316,0.0 +2015-12-11 03:00:00,0.0,363.8999938964844,0.0,99790.0,0.007799999788403511,284.6000061035156,-0.6000000238418579,2.1000001430511475,0.0 +2015-12-11 04:00:00,0.0,363.8999938964844,0.0,99750.0,0.007599999662488699,284.5,-0.20000000298023224,2.200000047683716,0.0 +2015-12-11 05:00:00,0.0,363.8999938964844,0.0,99740.0,0.007400000002235174,284.3999938964844,0.10000000149011612,2.299999952316284,0.0 +2015-12-11 06:00:00,0.0,369.5,0.0,99750.0,0.007400000002235174,284.6000061035156,0.4000000059604645,2.4000000953674316,0.0 +2015-12-11 07:00:00,0.0,369.5,0.0,99650.0,0.007599999662488699,283.8999938964844,0.800000011920929,2.299999952316284,0.0 +2015-12-11 08:00:00,0.0,369.5,0.0,99720.0,0.007599999662488699,283.8000183105469,1.3000000715255737,2.200000047683716,0.0 +2015-12-11 09:00:00,0.0,311.70001220703125,0.0,99710.0,0.007400000002235174,283.8000183105469,1.7000000476837158,2.0,0.0 +2015-12-11 10:00:00,0.0,311.70001220703125,0.0,99730.0,0.0071000000461936,282.3000183105469,1.3000000715255737,2.1000001430511475,0.0 +2015-12-11 11:00:00,0.0,311.8000183105469,0.0,99840.0,0.00699999975040555,281.8999938964844,0.9000000357627869,2.200000047683716,0.0 +2015-12-11 12:00:00,0.0,297.1000061035156,0.0,99900.0,0.007199999876320362,281.8999938964844,0.5,2.299999952316284,0.0 +2015-12-11 13:00:00,0.0,297.1000061035156,86.9000015258789,99910.0,0.007499999832361937,283.1000061035156,0.800000011920929,2.1000001430511475,0.0 +2015-12-11 14:00:00,0.0,297.1000061035156,226.1999969482422,100010.0,0.008799999952316284,285.3000183105469,1.2000000476837158,1.8000000715255737,0.0 +2015-12-11 15:00:00,0.0,327.0,373.70001220703125,100090.0,0.010099999606609344,287.5,1.5,1.600000023841858,0.0 +2015-12-11 16:00:00,0.0,327.0,460.3000183105469,100110.0,0.010099999606609344,287.8000183105469,1.8000000715255737,2.299999952316284,0.0 +2015-12-11 17:00:00,0.0,326.8999938964844,485.0,100090.0,0.010199999436736107,288.3999938964844,2.0,3.0,0.0 +2015-12-11 18:00:00,0.0,348.8999938964844,463.8999938964844,100080.0,0.011500000022351742,290.8999938964844,2.299999952316284,3.700000047683716,0.0 +2015-12-11 19:00:00,0.0,348.8999938964844,420.3000183105469,99970.0,0.010599999688565731,293.8999938964844,2.200000047683716,3.799999952316284,0.0 +2015-12-11 20:00:00,0.0,348.8999938964844,317.5,99910.0,0.010599999688565731,295.20001220703125,2.1000001430511475,3.9000000953674316,0.0 +2015-12-11 21:00:00,0.0,344.8000183105469,131.3000030517578,99990.0,0.010799999348819256,294.3000183105469,2.0,4.0,0.0 +2015-12-11 22:00:00,0.0,344.8000183105469,20.0,99970.0,0.010900000110268593,292.8000183105469,1.399999976158142,3.700000047683716,0.0 +2015-12-11 23:00:00,0.0,344.8000183105469,0.0,100000.0,0.010699999518692493,289.8999938964844,0.9000000357627869,3.5,0.0 +2015-12-12 00:00:00,0.0,329.8999938964844,0.0,100080.0,0.010599999688565731,288.6000061035156,0.30000001192092896,3.200000047683716,0.0 +2015-12-12 01:00:00,0.0,329.8999938964844,0.0,100030.0,0.010400000028312206,287.6000061035156,0.30000001192092896,3.1000001430511475,0.0 +2015-12-12 02:00:00,0.0,330.0,0.0,100080.0,0.010099999606609344,287.1000061035156,0.20000000298023224,3.0,0.0 +2015-12-12 03:00:00,0.0,327.0,0.0,100210.0,0.010199999436736107,287.5,0.20000000298023224,3.0,0.0 +2015-12-12 04:00:00,0.0,327.0,0.0,100250.0,0.009999999776482582,287.5,0.9000000357627869,3.1000001430511475,0.0 +2015-12-12 05:00:00,0.0,327.0,0.0,100290.0,0.009200000204145908,285.8999938964844,1.600000023841858,3.299999952316284,0.0 +2015-12-12 06:00:00,0.0,327.0,0.0,100320.0,0.009399999864399433,286.1000061035156,2.299999952316284,3.5,0.0 +2015-12-12 07:00:00,0.0,327.0,0.0,100330.0,0.009099999442696571,285.8999938964844,2.1000001430511475,3.200000047683716,0.0 +2015-12-12 08:00:00,0.0,327.0,0.0,100350.0,0.009499999694526196,287.1000061035156,1.899999976158142,2.9000000953674316,0.0 +2015-12-12 09:00:00,0.0,320.20001220703125,0.0,100410.0,0.00969999935477972,287.70001220703125,1.7000000476837158,2.5,0.0 +2015-12-12 10:00:00,0.0,320.20001220703125,0.0,100430.0,0.009800000116229057,287.3000183105469,1.3000000715255737,2.5,0.0 +2015-12-12 11:00:00,0.0,320.20001220703125,0.0,100430.0,0.010300000198185444,287.70001220703125,0.9000000357627869,2.6000001430511475,0.0 +2015-12-12 12:00:00,0.0,316.3000183105469,0.0,100590.0,0.00930000003427267,286.70001220703125,0.5,2.5,0.0 +2015-12-12 13:00:00,0.0,316.3000183105469,83.5999984741211,100520.0,0.009599999524652958,286.3000183105469,0.9000000357627869,2.4000000953674316,0.0 +2015-12-12 14:00:00,0.0,316.3000183105469,220.5,100610.0,0.010499999858438969,288.3999938964844,1.399999976158142,2.299999952316284,0.0 +2015-12-12 15:00:00,0.0,341.5,367.5,100690.0,0.011399999260902405,290.70001220703125,1.8000000715255737,2.200000047683716,0.0 +2015-12-12 16:00:00,0.0,341.5,453.3000183105469,100610.0,0.011599999852478504,293.3000183105469,2.299999952316284,2.0,0.0 +2015-12-12 17:00:00,0.0,341.5,478.0,100550.0,0.010499999858438969,295.5,2.9000000953674316,1.8000000715255737,0.0 +2015-12-12 18:00:00,0.0,354.20001220703125,463.6000061035156,100500.0,0.010199999436736107,295.8999938964844,3.5,1.600000023841858,0.0 +2015-12-12 19:00:00,0.0,354.20001220703125,420.20001220703125,100390.0,0.010199999436736107,296.8000183105469,3.200000047683716,1.899999976158142,0.0 +2015-12-12 20:00:00,0.0,354.20001220703125,317.70001220703125,100390.0,0.010900000110268593,296.70001220703125,2.9000000953674316,2.200000047683716,0.0 +2015-12-12 21:00:00,0.0,339.8999938964844,149.60000610351562,100420.0,0.010499999858438969,296.3000183105469,2.6000001430511475,2.4000000953674316,0.0 +2015-12-12 22:00:00,0.0,339.8999938964844,23.100000381469727,100460.0,0.010799999348819256,293.6000061035156,2.4000000953674316,2.4000000953674316,0.0 +2015-12-12 23:00:00,0.0,339.8999938964844,0.0,100490.0,0.010499999858438969,290.20001220703125,2.1000001430511475,2.4000000953674316,0.0 +2015-12-13 00:00:00,0.0,319.20001220703125,0.0,100510.0,0.010699999518692493,289.1000061035156,1.8000000715255737,2.4000000953674316,0.0 +2015-12-13 01:00:00,0.0,319.20001220703125,0.0,100510.0,0.010699999518692493,288.6000061035156,1.2000000476837158,2.200000047683716,0.0 +2015-12-13 02:00:00,0.0,319.20001220703125,0.0,100560.0,0.010099999606609344,287.0,0.699999988079071,2.0,0.0 +2015-12-13 03:00:00,0.0,310.70001220703125,0.0,100580.0,0.009499999694526196,286.3999938964844,0.10000000149011612,1.8000000715255737,0.0 +2015-12-13 04:00:00,0.0,310.70001220703125,0.0,100580.0,0.008899999782443047,285.3999938964844,0.5,1.8000000715255737,0.0 +2015-12-13 05:00:00,0.0,310.70001220703125,0.0,100580.0,0.00839999970048666,284.3000183105469,0.9000000357627869,1.8000000715255737,0.0 +2015-12-13 06:00:00,0.0,303.20001220703125,0.0,100600.0,0.008200000040233135,284.1000061035156,1.3000000715255737,1.8000000715255737,0.0 +2015-12-13 07:00:00,0.0,303.20001220703125,0.0,100490.0,0.007799999788403511,283.8999938964844,1.0,1.8000000715255737,0.0 +2015-12-13 08:00:00,0.0,303.20001220703125,0.0,100500.0,0.008100000210106373,284.3000183105469,0.6000000238418579,1.7000000476837158,0.0 +2015-12-13 09:00:00,0.0,295.3000183105469,0.0,100490.0,0.007899999618530273,283.6000061035156,0.20000000298023224,1.600000023841858,0.0 +2015-12-13 10:00:00,0.0,295.3000183105469,0.0,100440.0,0.0071000000461936,281.8999938964844,-0.20000000298023224,1.3000000715255737,0.0 +2015-12-13 11:00:00,0.0,295.3000183105469,0.0,100490.0,0.006599999964237213,281.1000061035156,-0.6000000238418579,0.9000000357627869,0.0 +2015-12-13 12:00:00,0.0,299.8999938964844,0.0,100530.0,0.007199999876320362,282.3000183105469,-1.0,0.6000000238418579,0.0 +2015-12-13 13:00:00,0.0,299.8999938964844,83.0,100450.0,0.006799999624490738,281.3999938964844,-0.800000011920929,0.10000000149011612,0.0 +2015-12-13 14:00:00,0.0,299.8999938964844,222.10000610351562,100570.0,0.00839999970048666,284.3999938964844,-0.6000000238418579,-0.4000000059604645,0.0 +2015-12-13 15:00:00,0.0,334.20001220703125,356.8999938964844,100570.0,0.009399999864399433,288.0,-0.4000000059604645,-0.9000000357627869,0.0 +2015-12-13 16:00:00,0.0,334.20001220703125,440.8999938964844,100450.0,0.00930000003427267,291.70001220703125,-0.6000000238418579,0.30000001192092896,0.0 +2015-12-13 17:00:00,0.0,334.20001220703125,465.3999938964844,100430.0,0.008700000122189522,293.0,-0.699999988079071,1.5,0.0 +2015-12-13 18:00:00,0.0,342.8000183105469,447.20001220703125,100350.0,0.00989999994635582,294.8000183105469,-0.9000000357627869,2.700000047683716,0.0 +2015-12-13 19:00:00,0.0,342.8000183105469,405.6000061035156,100200.0,0.009599999524652958,294.8000183105469,-1.3000000715255737,2.9000000953674316,0.0 +2015-12-13 20:00:00,0.0,342.8000183105469,306.8999938964844,100170.0,0.009999999776482582,295.1000061035156,-1.7000000476837158,3.200000047683716,0.0 +2015-12-13 21:00:00,0.0,322.70001220703125,142.8000030517578,100140.0,0.010599999688565731,294.6000061035156,-2.1000001430511475,3.4000000953674316,0.0 +2015-12-13 22:00:00,0.0,322.70001220703125,22.30000114440918,100110.0,0.010599999688565731,292.0,-2.200000047683716,2.9000000953674316,0.0 +2015-12-13 23:00:00,0.0,322.70001220703125,0.0,100140.0,0.010599999688565731,289.3999938964844,-2.4000000953674316,2.4000000953674316,0.0 +2015-12-14 00:00:00,0.0,319.6000061035156,0.0,100120.0,0.010799999348819256,288.20001220703125,-2.5,1.899999976158142,0.0 +2015-12-14 01:00:00,0.0,319.6000061035156,0.0,100060.0,0.010799999348819256,288.70001220703125,-2.700000047683716,1.7000000476837158,0.0 +2015-12-14 02:00:00,0.0,319.6000061035156,0.0,100130.0,0.010900000110268593,288.0,-2.799999952316284,1.5,0.0 +2015-12-14 03:00:00,0.0,314.70001220703125,0.0,100080.0,0.011500000022351742,289.6000061035156,-3.0,1.399999976158142,0.0 +2015-12-14 04:00:00,0.0,314.70001220703125,0.0,100050.0,0.010900000110268593,288.8999938964844,-2.700000047683716,1.899999976158142,0.0 +2015-12-14 05:00:00,0.0,314.70001220703125,0.0,99960.0,0.010699999518692493,288.3000183105469,-2.5,2.4000000953674316,0.0 +2015-12-14 06:00:00,0.0,323.3000183105469,0.0,99970.0,0.011299999430775642,288.6000061035156,-2.200000047683716,3.0,0.0 +2015-12-14 07:00:00,0.0,323.3000183105469,0.0,99810.0,0.010900000110268593,288.5,-1.8000000715255737,3.1000001430511475,0.0 +2015-12-14 08:00:00,0.0,323.3000183105469,0.0,99750.0,0.011399999260902405,289.3000183105469,-1.399999976158142,3.200000047683716,0.0 +2015-12-14 09:00:00,0.0,345.5,0.0,99710.0,0.011500000022351742,289.5,-1.0,3.299999952316284,0.0 +2015-12-14 10:00:00,0.0,345.5,0.0,99590.0,0.011699999682605267,289.3999938964844,-1.399999976158142,3.299999952316284,0.0 +2015-12-14 11:00:00,0.0,345.5,0.0,99510.0,0.011799999512732029,289.70001220703125,-1.899999976158142,3.200000047683716,0.0 +2015-12-14 12:00:00,0.0,377.70001220703125,0.0,99470.0,0.011799999512732029,289.70001220703125,-2.299999952316284,3.200000047683716,0.0 +2015-12-14 13:00:00,0.0,377.70001220703125,38.400001525878906,99380.0,0.01249999925494194,290.20001220703125,-1.7000000476837158,4.0,0.0 +2015-12-14 14:00:00,0.0,377.70001220703125,104.20000457763672,99390.0,0.012999999336898327,291.3000183105469,-1.100000023841858,4.700000286102295,0.0 +2015-12-14 15:00:00,0.0,389.5,173.5,99330.0,0.01269999984651804,291.8000183105469,-0.5,5.5,2.781874398823169e-07 +2015-12-14 16:00:00,1.0,389.5,214.60000610351562,99150.0,0.013199999928474426,292.1000061035156,-0.30000001192092896,5.700000286102295,0.0 +2015-12-14 17:00:00,0.0,389.5,226.8000030517578,99080.0,0.013899999670684338,293.0,-0.10000000149011612,5.800000190734863,0.0 +2015-12-14 18:00:00,0.0,405.5,149.90000915527344,99000.0,0.014499999582767487,293.3000183105469,0.10000000149011612,6.0,0.0 +2015-12-14 19:00:00,0.0,405.5,136.10000610351562,98920.0,0.015199999324977398,294.1000061035156,0.699999988079071,5.599999904632568,0.0 +2015-12-14 20:00:00,0.0,405.5,103.0999984741211,98870.0,0.014599999412894249,293.8000183105469,1.3000000715255737,5.300000190734863,1.1410234794070803e-06 +2015-12-14 21:00:00,4.099999904632568,398.0,43.400001525878906,98930.0,0.013499999418854713,292.0,1.899999976158142,4.900000095367432,2.5037821260041673e-07 +2015-12-14 22:00:00,0.9000000357627869,397.8999938964844,6.900000095367432,98880.0,0.012000000104308128,290.20001220703125,2.4000000953674316,4.599999904632568,0.0 +2015-12-14 23:00:00,0.0,397.8999938964844,0.0,98920.0,0.011899999342858791,289.5,2.799999952316284,4.300000190734863,0.0 +2015-12-15 00:00:00,0.0,343.70001220703125,0.0,98900.0,0.01209999993443489,289.8999938964844,3.299999952316284,3.9000000953674316,0.0 +2015-12-15 01:00:00,0.0,343.70001220703125,0.0,98860.0,0.01209999993443489,289.8999938964844,3.299999952316284,3.799999952316284,0.0 +2015-12-15 02:00:00,0.0,343.70001220703125,0.0,98910.0,0.011799999512732029,289.3000183105469,3.299999952316284,3.700000047683716,0.0 +2015-12-15 03:00:00,0.0,305.5,0.0,98940.0,0.011399999260902405,288.8999938964844,3.4000000953674316,3.6000001430511475,0.0 +2015-12-15 04:00:00,0.0,305.5,0.0,98920.0,0.011099999770522118,288.70001220703125,3.6000001430511475,3.0,0.0 +2015-12-15 05:00:00,0.0,305.5,0.0,99020.0,0.010400000028312206,287.8999938964844,3.9000000953674316,2.4000000953674316,0.0 +2015-12-15 06:00:00,0.0,287.8000183105469,0.0,99050.0,0.009399999864399433,286.8000183105469,4.099999904632568,1.8000000715255737,0.0 +2015-12-15 07:00:00,0.0,287.8000183105469,0.0,99030.0,0.008899999782443047,286.6000061035156,4.200000286102295,1.600000023841858,0.0 +2015-12-15 08:00:00,0.0,287.8000183105469,0.0,99020.0,0.007899999618530273,285.70001220703125,4.200000286102295,1.3000000715255737,0.0 +2015-12-15 09:00:00,0.0,279.8000183105469,0.0,99080.0,0.007400000002235174,284.8000183105469,4.200000286102295,1.100000023841858,0.0 +2015-12-15 10:00:00,0.0,279.8000183105469,0.0,99060.0,0.0071000000461936,283.6000061035156,3.799999952316284,0.9000000357627869,0.0 +2015-12-15 11:00:00,0.0,279.8000183105469,0.0,99080.0,0.00699999975040555,283.3000183105469,3.299999952316284,0.800000011920929,0.0 +2015-12-15 12:00:00,0.0,271.6000061035156,0.0,99210.0,0.0066999997943639755,282.6000061035156,2.799999952316284,0.6000000238418579,0.0 +2015-12-15 13:00:00,0.0,271.6000061035156,81.5999984741211,99240.0,0.00699999975040555,282.1000061035156,2.9000000953674316,0.20000000298023224,0.0 +2015-12-15 14:00:00,0.0,271.6000061035156,224.60000610351562,99300.0,0.007899999618530273,284.6000061035156,3.0,-0.30000001192092896,0.0 +2015-12-15 15:00:00,0.0,301.6000061035156,376.8000183105469,99400.0,0.007400000002235174,287.20001220703125,3.1000001430511475,-0.699999988079071,0.0 +2015-12-15 16:00:00,0.0,301.6000061035156,466.70001220703125,99350.0,0.007499999832361937,290.20001220703125,2.799999952316284,-0.20000000298023224,0.0 +2015-12-15 17:00:00,0.0,301.6000061035156,493.6000061035156,99260.0,0.007799999788403511,292.6000061035156,2.5,0.20000000298023224,0.0 +2015-12-15 18:00:00,0.0,314.5,478.3000183105469,99280.0,0.007400000002235174,294.3999938964844,2.200000047683716,0.699999988079071,0.0 +2015-12-15 19:00:00,0.0,314.5,434.3999938964844,99170.0,0.007400000002235174,295.8999938964844,1.899999976158142,0.30000001192092896,0.0 +2015-12-15 20:00:00,0.0,314.5,329.20001220703125,99210.0,0.0072999997064471245,296.20001220703125,1.7000000476837158,0.0,0.0 +2015-12-15 21:00:00,0.0,303.8000183105469,142.0,99270.0,0.007599999662488699,295.8999938964844,1.5,-0.4000000059604645,0.0 +2015-12-15 22:00:00,0.0,303.8000183105469,23.100000381469727,99320.0,0.008100000210106373,292.3999938964844,1.2000000476837158,0.0,0.0 +2015-12-15 23:00:00,0.0,303.8000183105469,0.0,99320.0,0.008100000210106373,288.20001220703125,0.9000000357627869,0.30000001192092896,0.0 +2015-12-16 00:00:00,0.0,287.0,0.0,99380.0,0.008499999530613422,287.1000061035156,0.6000000238418579,0.6000000238418579,0.0 +2015-12-16 01:00:00,0.0,287.0,0.0,99370.0,0.008100000210106373,285.20001220703125,0.30000001192092896,-0.20000000298023224,0.0 +2015-12-16 02:00:00,0.0,287.0,0.0,99410.0,0.008200000040233135,285.0,0.0,-1.0,0.0 +2015-12-16 03:00:00,0.0,280.6000061035156,0.0,99510.0,0.008299999870359898,284.0,-0.20000000298023224,-1.8000000715255737,0.0 +2015-12-16 04:00:00,0.0,280.6000061035156,0.0,99530.0,0.007799999788403511,283.3999938964844,-0.4000000059604645,-1.5,0.0 +2015-12-16 05:00:00,0.0,280.6000061035156,0.0,99540.0,0.007199999876320362,282.1000061035156,-0.5,-1.2000000476837158,0.0 +2015-12-16 06:00:00,0.0,275.70001220703125,0.0,99570.0,0.0066999997943639755,280.8999938964844,-0.6000000238418579,-0.800000011920929,0.0 +2015-12-16 07:00:00,0.0,275.70001220703125,0.0,99590.0,0.006799999624490738,280.8999938964844,-0.800000011920929,-0.800000011920929,0.0 +2015-12-16 08:00:00,0.0,275.70001220703125,0.0,99590.0,0.0066999997943639755,280.6000061035156,-1.0,-0.800000011920929,0.0 +2015-12-16 09:00:00,0.0,272.1000061035156,0.0,99630.0,0.006300000008195639,279.8999938964844,-1.2000000476837158,-0.699999988079071,0.0 +2015-12-16 10:00:00,0.0,272.1000061035156,0.0,99600.0,0.006099999882280827,279.3000183105469,-1.600000023841858,-0.699999988079071,0.0 +2015-12-16 11:00:00,0.0,272.1000061035156,0.0,99650.0,0.006799999624490738,281.70001220703125,-1.899999976158142,-0.699999988079071,0.0 +2015-12-16 12:00:00,0.0,267.0,0.0,99760.0,0.00699999975040555,280.8999938964844,-2.299999952316284,-0.6000000238418579,0.0 +2015-12-16 13:00:00,0.0,267.0,80.5,99770.0,0.0066999997943639755,280.5,-2.200000047683716,-0.699999988079071,0.0 +2015-12-16 14:00:00,0.0,267.0,224.6999969482422,99840.0,0.007799999788403511,284.20001220703125,-2.1000001430511475,-0.800000011920929,0.0 +2015-12-16 15:00:00,0.0,291.20001220703125,378.70001220703125,99910.0,0.00699999975040555,287.3000183105469,-2.1000001430511475,-0.9000000357627869,0.0 +2015-12-16 16:00:00,0.0,291.20001220703125,469.70001220703125,99880.0,0.007199999876320362,290.0,-2.4000000953674316,-0.30000001192092896,0.0 +2015-12-16 17:00:00,0.0,291.20001220703125,497.20001220703125,99780.0,0.007699999958276749,292.3000183105469,-2.700000047683716,0.30000001192092896,0.0 +2015-12-16 18:00:00,0.0,305.6000061035156,479.8999938964844,99740.0,0.007599999662488699,294.0,-3.0,0.800000011920929,0.0 +2015-12-16 19:00:00,0.0,305.6000061035156,436.20001220703125,99650.0,0.007599999662488699,294.6000061035156,-2.9000000953674316,0.9000000357627869,0.0 +2015-12-16 20:00:00,0.0,305.6000061035156,330.8999938964844,99620.0,0.007699999958276749,294.8000183105469,-2.700000047683716,1.100000023841858,0.0 +2015-12-16 21:00:00,0.0,300.8000183105469,142.3000030517578,99580.0,0.007599999662488699,294.0,-2.5,1.2000000476837158,0.0 +2015-12-16 22:00:00,0.0,300.8000183105469,23.600000381469727,99590.0,0.007799999788403511,291.6000061035156,-2.4000000953674316,1.0,0.0 +2015-12-16 23:00:00,0.0,300.8000183105469,0.0,99670.0,0.008299999870359898,287.8000183105469,-2.4000000953674316,0.800000011920929,0.0 +2015-12-17 00:00:00,0.0,301.0,0.0,99640.0,0.008200000040233135,286.8000183105469,-2.299999952316284,0.5,0.0 +2015-12-17 01:00:00,0.0,301.0,0.0,99720.0,0.00839999970048666,286.1000061035156,-2.1000001430511475,0.6000000238418579,0.0 +2015-12-17 02:00:00,0.0,301.1000061035156,0.0,99720.0,0.008299999870359898,286.3000183105469,-2.0,0.6000000238418579,0.0 +2015-12-17 03:00:00,0.0,329.70001220703125,0.0,99700.0,0.008299999870359898,285.8999938964844,-1.899999976158142,0.6000000238418579,5.558624344337431e-08 +2015-12-17 04:00:00,0.20000000298023224,329.70001220703125,0.0,99620.0,0.008299999870359898,285.8999938964844,-1.399999976158142,0.6000000238418579,2.779312130753737e-07 +2015-12-17 05:00:00,1.0,329.70001220703125,0.0,99610.0,0.008899999782443047,286.0,-1.0,0.699999988079071,4.446954255654342e-07 +2015-12-17 06:00:00,1.600000023841858,380.1000061035156,0.0,99570.0,0.009099999442696571,286.0,-0.5,0.699999988079071,4.724888958755971e-07 +2015-12-17 07:00:00,1.7000000476837158,380.1000061035156,0.0,99480.0,0.009599999524652958,286.6000061035156,-0.9000000357627869,0.699999988079071,6.115029072671384e-07 +2015-12-17 08:00:00,2.200000047683716,380.1000061035156,0.0,99460.0,0.00930000003427267,286.20001220703125,-1.399999976158142,0.699999988079071,0.0 +2015-12-17 09:00:00,0.0,383.8000183105469,0.0,99450.0,0.008999999612569809,285.6000061035156,-1.8000000715255737,0.699999988079071,8.3376344949306e-08 +2015-12-17 10:00:00,0.30000001192092896,383.8000183105469,0.0,99340.0,0.009099999442696571,285.8000183105469,-2.1000001430511475,0.6000000238418579,0.0 +2015-12-17 11:00:00,0.0,383.8000183105469,0.0,99250.0,0.009200000204145908,286.1000061035156,-2.299999952316284,0.6000000238418579,1.945566619149497e-07 +2015-12-17 12:00:00,0.699999988079071,379.8999938964844,0.0,99260.0,0.009599999524652958,286.3000183105469,-2.6000001430511475,0.5,7.22657308704565e-07 +2015-12-17 13:00:00,2.6000001430511475,379.8999938964844,43.29999923706055,99220.0,0.009399999864399433,286.3000183105469,-2.700000047683716,1.399999976158142,1.41752000103748e-06 +2015-12-17 14:00:00,5.099999904632568,379.8999938964844,122.4000015258789,99230.0,0.009800000116229057,287.20001220703125,-2.9000000953674316,2.4000000953674316,2.2238260147358027e-07 +2015-12-17 15:00:00,0.800000011920929,400.8999938964844,146.8000030517578,99220.0,0.009800000116229057,287.3000183105469,-3.0,3.299999952316284,1.3343140915244274e-06 +2015-12-17 16:00:00,4.800000190734863,400.8999938964844,182.3000030517578,99200.0,0.00989999994635582,287.20001220703125,-1.100000023841858,4.599999904632568,1.1119129907991068e-06 +2015-12-17 17:00:00,4.0,400.8999938964844,193.1999969482422,99150.0,0.00989999994635582,286.70001220703125,0.9000000357627869,5.900000095367432,0.0 +2015-12-17 18:00:00,0.0,378.70001220703125,254.1999969482422,99020.0,0.010499999858438969,287.8000183105469,2.799999952316284,7.200000286102295,0.0 +2015-12-17 19:00:00,0.0,378.70001220703125,231.3000030517578,99020.0,0.010799999348819256,288.3999938964844,3.5,6.200000286102295,0.0 +2015-12-17 20:00:00,0.0,378.70001220703125,175.60000610351562,98990.0,0.01119999960064888,288.8000183105469,4.200000286102295,5.200000286102295,0.0 +2015-12-17 21:00:00,0.0,362.3000183105469,74.0,99000.0,0.010999999940395355,288.70001220703125,4.800000190734863,4.300000190734863,0.0 +2015-12-17 22:00:00,0.0,362.3000183105469,12.5,99020.0,0.01119999960064888,288.70001220703125,4.099999904632568,4.0,0.0 +2015-12-17 23:00:00,0.0,362.3000183105469,0.0,99060.0,0.010999999940395355,288.3000183105469,3.4000000953674316,3.700000047683716,0.0 +2015-12-18 00:00:00,0.0,360.20001220703125,0.0,99090.0,0.011099999770522118,288.8000183105469,2.700000047683716,3.4000000953674316,0.0 +2015-12-18 01:00:00,0.0,360.20001220703125,0.0,99090.0,0.010900000110268593,288.6000061035156,2.200000047683716,3.299999952316284,0.0 +2015-12-18 02:00:00,0.0,360.20001220703125,0.0,99120.0,0.010900000110268593,288.5,1.600000023841858,3.200000047683716,0.0 +2015-12-18 03:00:00,0.0,363.6000061035156,0.0,99170.0,0.010599999688565731,287.8999938964844,1.100000023841858,3.1000001430511475,0.0 +2015-12-18 04:00:00,0.0,363.6000061035156,0.0,99190.0,0.010699999518692493,287.8999938964844,1.2000000476837158,3.1000001430511475,0.0 +2015-12-18 05:00:00,0.0,363.6000061035156,0.0,99080.0,0.010599999688565731,287.8000183105469,1.399999976158142,3.0,0.0 +2015-12-18 06:00:00,0.0,346.1000061035156,0.0,99090.0,0.010699999518692493,287.5,1.600000023841858,2.9000000953674316,0.0 +2015-12-18 07:00:00,0.0,346.20001220703125,0.0,99050.0,0.010300000198185444,287.8999938964844,1.899999976158142,2.6000001430511475,0.0 +2015-12-18 08:00:00,0.0,346.20001220703125,0.0,99100.0,0.010099999606609344,287.70001220703125,2.1000001430511475,2.299999952316284,0.0 +2015-12-18 09:00:00,0.0,329.3999938964844,0.0,99070.0,0.00989999994635582,287.0,2.4000000953674316,2.0,0.0 +2015-12-18 10:00:00,0.0,329.3999938964844,0.0,99090.0,0.00969999935477972,286.5,3.0,2.0,0.0 +2015-12-18 11:00:00,0.0,329.3999938964844,0.0,99120.0,0.008799999952316284,285.70001220703125,3.6000001430511475,1.899999976158142,0.0 +2015-12-18 12:00:00,0.0,272.0,0.0,99240.0,0.008200000040233135,285.0,4.300000190734863,1.899999976158142,0.0 +2015-12-18 13:00:00,0.0,272.0,81.30000305175781,99240.0,0.007999999448657036,284.0,5.0,1.5,0.0 +2015-12-18 14:00:00,0.0,272.0,233.0,99370.0,0.007799999788403511,283.5,5.800000190734863,1.2000000476837158,0.0 +2015-12-18 15:00:00,0.0,267.0,378.8000183105469,99520.0,0.006199999712407589,283.70001220703125,6.5,0.800000011920929,0.0 +2015-12-18 16:00:00,0.0,267.0,471.20001220703125,99610.0,0.0052999998442828655,284.3000183105469,7.099999904632568,0.6000000238418579,0.0 +2015-12-18 17:00:00,0.0,267.0,499.6000061035156,99570.0,0.004600000102072954,285.0,7.599999904632568,0.30000001192092896,0.0 +2015-12-18 18:00:00,0.0,260.6000061035156,490.20001220703125,99580.0,0.003499999875202775,285.8999938964844,8.100000381469727,0.10000000149011612,0.0 +2015-12-18 19:00:00,0.0,260.6000061035156,446.3000183105469,99450.0,0.003700000001117587,287.0,7.5,-1.2000000476837158,0.0 +2015-12-18 20:00:00,0.0,260.70001220703125,339.3000183105469,99510.0,0.003499999875202775,287.3999938964844,6.800000190734863,-2.5,0.0 +2015-12-18 21:00:00,0.0,241.90000915527344,152.10000610351562,99640.0,0.002899999963119626,286.70001220703125,6.099999904632568,-3.799999952316284,0.0 +2015-12-18 22:00:00,0.0,241.90000915527344,26.399999618530273,99730.0,0.0030999998562037945,285.20001220703125,5.5,-3.700000047683716,0.0 +2015-12-18 23:00:00,0.0,241.90000915527344,0.0,99970.0,0.0030999998562037945,281.20001220703125,4.800000190734863,-3.5,0.0 +2015-12-19 00:00:00,0.0,223.8000030517578,0.0,100130.0,0.003000000026077032,279.20001220703125,4.200000286102295,-3.4000000953674316,0.0 +2015-12-19 01:00:00,0.0,223.8000030517578,0.0,100270.0,0.00279999990016222,277.8999938964844,4.0,-3.299999952316284,0.0 +2015-12-19 02:00:00,0.0,223.8000030517578,0.0,100480.0,0.0026000000070780516,276.3000183105469,3.799999952316284,-3.1000001430511475,0.0 +2015-12-19 03:00:00,0.0,214.5,0.0,100610.0,0.0024999999441206455,275.3000183105469,3.700000047683716,-2.9000000953674316,0.0 +2015-12-19 04:00:00,0.0,214.5,0.0,100640.0,0.0026000000070780516,274.70001220703125,3.1000001430511475,-2.700000047683716,0.0 +2015-12-19 05:00:00,0.0,214.5,0.0,100730.0,0.0024999999441206455,273.70001220703125,2.5,-2.4000000953674316,0.0 +2015-12-19 06:00:00,0.0,205.6999969482422,0.0,100780.0,0.002300000051036477,272.70001220703125,2.0,-2.1000001430511475,0.0 +2015-12-19 07:00:00,0.0,205.6999969482422,0.0,100750.0,0.0023999998811632395,272.0,2.0,-2.0,0.0 +2015-12-19 08:00:00,0.0,205.6999969482422,0.0,100840.0,0.0024999999441206455,271.3999938964844,1.899999976158142,-1.8000000715255737,0.0 +2015-12-19 09:00:00,0.0,203.60000610351562,0.0,100870.0,0.0024999999441206455,270.8999938964844,1.899999976158142,-1.7000000476837158,0.0 +2015-12-19 10:00:00,0.0,203.60000610351562,0.0,100910.0,0.0026000000070780516,271.1000061035156,1.899999976158142,-0.800000011920929,0.0 +2015-12-19 11:00:00,0.0,203.60000610351562,0.0,101050.0,0.002699999837204814,270.1000061035156,2.0,0.10000000149011612,0.0 +2015-12-19 12:00:00,0.0,207.40000915527344,0.0,101170.0,0.002699999837204814,270.0,2.0,0.9000000357627869,0.0 +2015-12-19 13:00:00,0.0,207.40000915527344,78.5,101180.0,0.002899999963119626,270.3000183105469,2.0,0.699999988079071,0.0 +2015-12-19 14:00:00,0.0,207.40000915527344,228.10000610351562,101260.0,0.00279999990016222,273.3999938964844,2.1000001430511475,0.4000000059604645,0.0 +2015-12-19 15:00:00,0.0,226.8000030517578,384.8999938964844,101430.0,0.002699999837204814,276.3000183105469,2.1000001430511475,0.20000000298023224,0.0 +2015-12-19 16:00:00,0.0,226.8000030517578,479.5,101340.0,0.002099999925121665,279.3999938964844,2.799999952316284,0.5,0.0 +2015-12-19 17:00:00,0.0,226.8000030517578,508.8999938964844,101250.0,0.0017999999690800905,280.8999938964844,3.4000000953674316,0.9000000357627869,0.0 +2015-12-19 18:00:00,0.0,237.1999969482422,496.3000183105469,101260.0,0.0016999999061226845,281.8999938964844,4.099999904632568,1.2000000476837158,0.0 +2015-12-19 19:00:00,0.0,237.1999969482422,452.20001220703125,101130.0,0.0017999999690800905,282.6000061035156,4.0,0.9000000357627869,0.0 +2015-12-19 20:00:00,0.0,237.1999969482422,344.1000061035156,101120.0,0.0017999999690800905,283.3999938964844,3.799999952316284,0.6000000238418579,0.0 +2015-12-19 21:00:00,0.0,231.0,155.40000915527344,101180.0,0.002099999925121665,283.0,3.6000001430511475,0.30000001192092896,0.0 +2015-12-19 22:00:00,0.0,231.0,27.700000762939453,101130.0,0.002199999988079071,281.3000183105469,3.1000001430511475,0.6000000238418579,0.0 +2015-12-19 23:00:00,0.0,231.0,0.0,101210.0,0.0024999999441206455,278.1000061035156,2.700000047683716,0.800000011920929,0.0 +2015-12-20 00:00:00,0.0,222.10000610351562,0.0,101330.0,0.002699999837204814,275.8999938964844,2.200000047683716,1.100000023841858,0.0 +2015-12-20 01:00:00,0.0,222.10000610351562,0.0,101290.0,0.002899999963119626,275.20001220703125,2.0,0.699999988079071,0.0 +2015-12-20 02:00:00,0.0,222.10000610351562,0.0,101290.0,0.00279999990016222,273.3999938964844,1.7000000476837158,0.30000001192092896,0.0 +2015-12-20 03:00:00,0.0,218.90000915527344,0.0,101320.0,0.00279999990016222,273.1000061035156,1.399999976158142,-0.10000000149011612,0.0 +2015-12-20 04:00:00,0.0,218.90000915527344,0.0,101340.0,0.00279999990016222,272.6000061035156,1.100000023841858,-0.699999988079071,0.0 +2015-12-20 05:00:00,0.0,218.90000915527344,0.0,101400.0,0.00279999990016222,272.1000061035156,0.699999988079071,-1.399999976158142,0.0 +2015-12-20 06:00:00,0.0,217.1999969482422,0.0,101400.0,0.00279999990016222,271.6000061035156,0.30000001192092896,-2.0,0.0 +2015-12-20 07:00:00,0.0,217.1999969482422,0.0,101350.0,0.003000000026077032,271.0,0.20000000298023224,-2.299999952316284,0.0 +2015-12-20 08:00:00,0.0,217.3000030517578,0.0,101360.0,0.003000000026077032,272.0,0.10000000149011612,-2.6000001430511475,0.0 +2015-12-20 09:00:00,0.0,215.0,0.0,101430.0,0.00279999990016222,271.70001220703125,0.10000000149011612,-2.9000000953674316,0.0 +2015-12-20 10:00:00,0.0,215.0,0.0,101440.0,0.002699999837204814,271.0,-0.30000001192092896,-2.200000047683716,0.0 +2015-12-20 11:00:00,0.0,215.0,0.0,101460.0,0.00279999990016222,270.6000061035156,-0.699999988079071,-1.5,0.0 +2015-12-20 12:00:00,0.0,219.0,0.0,101510.0,0.00279999990016222,270.70001220703125,-1.100000023841858,-0.9000000357627869,0.0 +2015-12-20 13:00:00,0.0,219.0,76.4000015258789,101550.0,0.003000000026077032,271.3999938964844,-1.399999976158142,-0.699999988079071,0.0 +2015-12-20 14:00:00,0.0,219.0,224.90000915527344,101660.0,0.003399999812245369,275.3999938964844,-1.7000000476837158,-0.6000000238418579,0.0 +2015-12-20 15:00:00,0.0,239.8000030517578,381.3999938964844,101710.0,0.0031999999191612005,279.3000183105469,-2.1000001430511475,-0.4000000059604645,0.0 +2015-12-20 16:00:00,0.0,239.8000030517578,475.6000061035156,101660.0,0.002699999837204814,282.3000183105469,-2.4000000953674316,0.0,0.0 +2015-12-20 17:00:00,0.0,239.8000030517578,505.20001220703125,101530.0,0.0024999999441206455,284.20001220703125,-2.700000047683716,0.30000001192092896,0.0 +2015-12-20 18:00:00,0.0,251.0,489.6000061035156,101580.0,0.002300000051036477,285.3000183105469,-3.0,0.699999988079071,0.0 +2015-12-20 19:00:00,0.0,251.0,446.3999938964844,101410.0,0.0024999999441206455,286.20001220703125,-2.700000047683716,0.699999988079071,0.0 +2015-12-20 20:00:00,0.0,251.0,340.20001220703125,101410.0,0.0024999999441206455,286.3000183105469,-2.5,0.800000011920929,0.0 +2015-12-20 21:00:00,0.0,250.1999969482422,167.5,101350.0,0.0026000000070780516,285.20001220703125,-2.299999952316284,0.9000000357627869,0.0 +2015-12-20 22:00:00,0.0,250.1999969482422,30.600000381469727,101360.0,0.0026000000070780516,283.3000183105469,-2.6000001430511475,0.9000000357627869,0.0 +2015-12-20 23:00:00,0.0,250.1999969482422,0.0,101390.0,0.0032999999821186066,280.1000061035156,-3.0,1.0,0.0 +2015-12-21 00:00:00,0.0,247.90000915527344,0.0,101390.0,0.003399999812245369,278.70001220703125,-3.4000000953674316,1.100000023841858,0.0 +2015-12-21 01:00:00,0.0,247.90000915527344,0.0,101330.0,0.003399999812245369,277.70001220703125,-3.200000047683716,0.6000000238418579,0.0 +2015-12-21 02:00:00,0.0,247.90000915527344,0.0,101350.0,0.003399999812245369,276.5,-2.9000000953674316,0.20000000298023224,0.0 +2015-12-21 03:00:00,0.0,263.5,0.0,101370.0,0.003599999938160181,276.70001220703125,-2.700000047683716,-0.30000001192092896,0.0 +2015-12-21 04:00:00,0.0,263.5,0.0,101280.0,0.003599999938160181,277.20001220703125,-2.799999952316284,-0.6000000238418579,0.0 +2015-12-21 05:00:00,0.0,263.5,0.0,101250.0,0.003599999938160181,276.6000061035156,-2.799999952316284,-0.800000011920929,0.0 +2015-12-21 06:00:00,0.0,282.6000061035156,0.0,101280.0,0.0037999998312443495,276.8000183105469,-2.799999952316284,-1.100000023841858,0.0 +2015-12-21 07:00:00,0.0,282.6000061035156,0.0,101170.0,0.004100000020116568,278.5,-2.700000047683716,-1.0,0.0 +2015-12-21 08:00:00,0.0,282.6000061035156,0.0,101220.0,0.003999999724328518,278.6000061035156,-2.5,-0.9000000357627869,0.0 +2015-12-21 09:00:00,0.0,330.3000183105469,0.0,101140.0,0.004100000020116568,279.20001220703125,-2.4000000953674316,-0.800000011920929,0.0 +2015-12-21 10:00:00,0.0,330.20001220703125,0.0,101010.0,0.00419999985024333,278.8999938964844,-2.299999952316284,-0.800000011920929,0.0 +2015-12-21 11:00:00,0.0,330.20001220703125,0.0,101030.0,0.004100000020116568,278.6000061035156,-2.200000047683716,-0.699999988079071,0.0 +2015-12-21 12:00:00,0.0,351.8000183105469,0.0,101090.0,0.004299999680370092,279.0,-2.1000001430511475,-0.6000000238418579,0.0 +2015-12-21 13:00:00,0.0,351.8000183105469,33.5,101070.0,0.004399999976158142,279.3000183105469,-2.1000001430511475,-0.5,0.0 +2015-12-21 14:00:00,0.0,351.70001220703125,99.80000305175781,101030.0,0.0044999998062849045,280.6000061035156,-2.0,-0.4000000059604645,0.0 +2015-12-21 15:00:00,0.0,371.20001220703125,153.90000915527344,101060.0,0.004399999976158142,281.70001220703125,-2.0,-0.20000000298023224,0.0 +2015-12-21 16:00:00,0.0,371.20001220703125,192.1999969482422,101010.0,0.004900000058114529,283.70001220703125,-1.899999976158142,0.10000000149011612,0.0 +2015-12-21 17:00:00,0.0,371.20001220703125,204.40000915527344,101000.0,0.00559999980032444,285.1000061035156,-1.8000000715255737,0.4000000059604645,0.0 +2015-12-21 18:00:00,0.0,374.8999938964844,271.5,100920.0,0.00559999980032444,284.3999938964844,-1.7000000476837158,0.699999988079071,0.0 +2015-12-21 19:00:00,0.0,374.8999938964844,247.8000030517578,100740.0,0.006099999882280827,285.70001220703125,-1.8000000715255737,0.699999988079071,0.0 +2015-12-21 20:00:00,0.0,374.8999938964844,189.0,100660.0,0.0064999996684491634,286.5,-1.899999976158142,0.699999988079071,0.0 +2015-12-21 21:00:00,0.0,361.3999938964844,124.20000457763672,100640.0,0.0064999996684491634,287.0,-2.0,0.800000011920929,0.0 +2015-12-21 22:00:00,0.0,361.3999938964844,23.30000114440918,100580.0,0.006599999964237213,285.70001220703125,-2.1000001430511475,1.0,0.0 +2015-12-21 23:00:00,0.0,361.3999938964844,0.0,100570.0,0.0064999996684491634,283.8000183105469,-2.299999952316284,1.100000023841858,0.0 +2015-12-22 00:00:00,0.0,354.8000183105469,0.0,100500.0,0.006599999964237213,283.1000061035156,-2.4000000953674316,1.3000000715255737,0.0 +2015-12-22 01:00:00,0.0,354.8000183105469,0.0,100450.0,0.006899999920278788,282.70001220703125,-2.299999952316284,1.399999976158142,0.0 +2015-12-22 02:00:00,0.0,354.8000183105469,0.0,100430.0,0.006899999920278788,283.0,-2.299999952316284,1.399999976158142,0.0 +2015-12-22 03:00:00,0.0,367.8000183105469,0.0,100370.0,0.00699999975040555,282.8000183105469,-2.200000047683716,1.399999976158142,0.0 +2015-12-22 04:00:00,0.0,367.8000183105469,0.0,100350.0,0.0072999997064471245,283.20001220703125,-2.4000000953674316,1.600000023841858,0.0 +2015-12-22 05:00:00,0.0,367.8000183105469,0.0,100260.0,0.0072999997064471245,283.3000183105469,-2.6000001430511475,1.7000000476837158,8.335614187810817e-08 +2015-12-22 06:00:00,0.30000001192092896,387.20001220703125,0.0,100190.0,0.007799999788403511,283.3000183105469,-2.799999952316284,1.8000000715255737,5.279222042923904e-07 +2015-12-22 07:00:00,1.899999976158142,387.20001220703125,0.0,100020.0,0.007899999618530273,283.3000183105469,-1.600000023841858,2.0,2.52846964248974e-06 +2015-12-22 08:00:00,9.100000381469727,387.20001220703125,0.0,99900.0,0.008200000040233135,284.0,-0.4000000059604645,2.1000001430511475,1.4171493158587097e-06 +2015-12-22 09:00:00,5.099999904632568,387.8999938964844,0.0,99850.0,0.008899999782443047,285.20001220703125,0.800000011920929,2.200000047683716,1.0477138035473381e-05 +2015-12-22 10:00:00,37.70000076293945,387.8999938964844,0.0,99830.0,0.009099999442696571,285.8000183105469,0.800000011920929,2.700000047683716,1.7787380935536381e-06 +2015-12-22 11:00:00,6.400000095367432,387.8999938964844,0.0,99800.0,0.009200000204145908,285.8999938964844,0.800000011920929,3.1000001430511475,1.361862970574917e-06 +2015-12-22 12:00:00,4.900000095367432,380.1000061035156,0.0,99870.0,0.009599999524652958,286.0,0.800000011920929,3.5,2.223477127827171e-07 +2015-12-22 13:00:00,0.800000011920929,380.1000061035156,25.0,99870.0,0.010300000198185444,287.3999938964844,0.6000000238418579,3.700000047683716,5.5597193987443644e-08 +2015-12-22 14:00:00,0.20000000298023224,380.1000061035156,75.4000015258789,99940.0,0.010499999858438969,288.1000061035156,0.4000000059604645,3.9000000953674316,0.0 +2015-12-22 15:00:00,0.0,383.3000183105469,231.8000030517578,99970.0,0.010799999348819256,288.1000061035156,0.30000001192092896,4.0,0.0 +2015-12-22 16:00:00,0.0,383.3000183105469,289.8000183105469,99980.0,0.011099999770522118,288.70001220703125,0.30000001192092896,3.799999952316284,0.0 +2015-12-22 17:00:00,0.0,383.3000183105469,308.3999938964844,99910.0,0.010999999940395355,288.5,0.30000001192092896,3.5,0.0 +2015-12-22 18:00:00,0.0,395.20001220703125,297.70001220703125,99830.0,0.010799999348819256,288.6000061035156,0.30000001192092896,3.299999952316284,0.0 +2015-12-22 19:00:00,0.0,395.20001220703125,272.0,99680.0,0.012000000104308128,290.3999938964844,-0.20000000298023224,3.5,0.0 +2015-12-22 20:00:00,0.0,395.20001220703125,207.8000030517578,99720.0,0.01209999993443489,290.6000061035156,-0.6000000238418579,3.799999952316284,0.0 +2015-12-22 21:00:00,0.0,386.5,122.5,99820.0,0.01209999993443489,290.1000061035156,-1.100000023841858,4.0,0.0 +2015-12-22 22:00:00,0.0,386.5,23.700000762939453,99740.0,0.011799999512732029,289.5,-1.3000000715255737,3.5,0.0 +2015-12-22 23:00:00,0.0,386.5,0.0,99720.0,0.011299999430775642,288.5,-1.600000023841858,3.0,0.0 +2015-12-23 00:00:00,0.0,387.3999938964844,0.0,99830.0,0.011299999430775642,288.8000183105469,-1.899999976158142,2.5,0.0 +2015-12-23 01:00:00,0.0,387.3999938964844,0.0,99800.0,0.011399999260902405,289.0,-1.899999976158142,2.200000047683716,0.0 +2015-12-23 02:00:00,0.0,387.3999938964844,0.0,99870.0,0.011500000022351742,289.20001220703125,-2.0,1.899999976158142,0.0 +2015-12-23 03:00:00,0.0,377.6000061035156,0.0,99870.0,0.011699999682605267,289.70001220703125,-2.0,1.600000023841858,0.0 +2015-12-23 04:00:00,0.0,377.6000061035156,0.0,99770.0,0.012000000104308128,289.8000183105469,-1.600000023841858,1.7000000476837158,0.0 +2015-12-23 05:00:00,0.0,377.6000061035156,0.0,99750.0,0.012000000104308128,289.8000183105469,-1.2000000476837158,1.8000000715255737,0.0 +2015-12-23 06:00:00,0.0,387.3999938964844,0.0,99750.0,0.01249999925494194,290.20001220703125,-0.699999988079071,1.899999976158142,2.7810727410571993e-08 +2015-12-23 07:00:00,0.10000000149011612,387.3999938964844,0.0,99680.0,0.01249999925494194,290.5,-1.100000023841858,2.0,0.0 +2015-12-23 08:00:00,0.0,387.3999938964844,0.0,99670.0,0.01269999984651804,290.3000183105469,-1.399999976158142,2.1000001430511475,0.0 +2015-12-23 09:00:00,0.0,387.0,0.0,99730.0,0.01269999984651804,290.5,-1.8000000715255737,2.1000001430511475,0.0 +2015-12-23 10:00:00,0.0,387.0,0.0,99650.0,0.01249999925494194,290.3000183105469,-1.8000000715255737,2.200000047683716,0.0 +2015-12-23 11:00:00,0.0,387.0,0.0,99710.0,0.012299999594688416,290.0,-1.899999976158142,2.200000047683716,0.0 +2015-12-23 12:00:00,0.0,387.3999938964844,0.0,99650.0,0.012399999424815178,290.3000183105469,-2.0,2.200000047683716,3.893568673245631e-07 +2015-12-23 13:00:00,1.399999976158142,387.3999938964844,27.30000114440918,99620.0,0.012399999424815178,290.5,-2.1000001430511475,2.799999952316284,3.893703857757011e-07 +2015-12-23 14:00:00,1.399999976158142,387.3999938964844,83.4000015258789,99640.0,0.01269999984651804,290.3999938964844,-2.299999952316284,3.4000000953674316,1.1124674593096233e-06 +2015-12-23 15:00:00,4.0,390.5,159.1999969482422,99710.0,0.012799999676644802,291.0,-2.4000000953674316,4.099999904632568,1.001327023947647e-06 +2015-12-23 16:00:00,3.6000001430511475,390.5,199.3000030517578,99610.0,0.013199999928474426,291.8999938964844,-1.7000000476837158,4.300000190734863,7.511203185325428e-07 +2015-12-23 17:00:00,2.700000047683716,390.5,212.1999969482422,99480.0,0.013700000010430813,292.20001220703125,-1.0,4.599999904632568,0.0 +2015-12-23 18:00:00,0.0,403.8999938964844,175.0,99390.0,0.014299999922513962,293.1000061035156,-0.30000001192092896,4.800000190734863,3.617357214924627e-07 +2015-12-23 19:00:00,1.3000000715255737,403.8999938964844,160.0,99270.0,0.0142000000923872,292.3999938964844,0.0,4.800000190734863,2.6152633535538457e-06 +2015-12-23 20:00:00,9.40000057220459,403.8999938964844,122.4000015258789,99380.0,0.012899999506771564,291.3000183105469,0.30000001192092896,4.800000190734863,0.0 +2015-12-23 21:00:00,0.0,392.6000061035156,82.5999984741211,99520.0,0.013199999928474426,291.3000183105469,0.6000000238418579,4.800000190734863,3.059777168752196e-07 +2015-12-23 22:00:00,1.100000023841858,392.6000061035156,16.399999618530273,99480.0,0.012799999676644802,290.8000183105469,0.4000000059604645,4.0,5.562728561571695e-08 +2015-12-23 23:00:00,0.20000000298023224,392.6000061035156,0.0,99500.0,0.012399999424815178,290.3000183105469,0.10000000149011612,3.200000047683716,3.337344766516485e-07 +2015-12-24 00:00:00,1.2000000476837158,396.8999938964844,0.0,99600.0,0.012399999424815178,290.3999938964844,-0.10000000149011612,2.299999952316284,3.893636041275454e-07 +2015-12-24 01:00:00,1.399999976158142,396.8000183105469,0.0,99590.0,0.011799999512732029,289.8000183105469,-0.800000011920929,2.6000001430511475,5.283680425381081e-07 +2015-12-24 02:00:00,1.899999976158142,396.8000183105469,0.0,99720.0,0.012399999424815178,290.3999938964844,-1.399999976158142,2.9000000953674316,5.840454559224889e-07 +2015-12-24 03:00:00,2.1000001430511475,395.20001220703125,0.0,99860.0,0.01209999993443489,290.20001220703125,-2.1000001430511475,3.200000047683716,8.34321809884796e-07 +2015-12-24 04:00:00,3.0,395.20001220703125,0.0,99710.0,0.012199999764561653,290.5,-1.5,4.099999904632568,0.0 +2015-12-24 05:00:00,0.0,395.20001220703125,0.0,99680.0,0.012199999764561653,290.20001220703125,-0.9000000357627869,5.099999904632568,2.2248581928457594e-07 +2015-12-24 06:00:00,0.800000011920929,394.20001220703125,0.0,99670.0,0.012299999594688416,290.5,-0.30000001192092896,6.0,0.0 +2015-12-24 07:00:00,0.0,394.20001220703125,0.0,99650.0,0.012600000016391277,291.0,0.0,6.0,0.0 +2015-12-24 08:00:00,0.0,394.20001220703125,0.0,99660.0,0.013599999248981476,291.8000183105469,0.30000001192092896,6.0,0.0 +2015-12-24 09:00:00,0.0,383.70001220703125,0.0,99700.0,0.0142000000923872,292.8999938964844,0.6000000238418579,5.900000095367432,0.0 +2015-12-24 10:00:00,0.0,383.70001220703125,0.0,99740.0,0.014599999412894249,292.8000183105469,0.30000001192092896,5.0,0.0 +2015-12-24 11:00:00,0.0,383.70001220703125,0.0,99820.0,0.014699999243021011,293.3999938964844,0.0,4.0,0.0 +2015-12-24 12:00:00,0.0,376.3000183105469,0.0,99870.0,0.014399999752640724,293.5,-0.30000001192092896,3.0,0.0 +2015-12-24 13:00:00,0.0,376.3000183105469,46.79999923706055,99920.0,0.014699999243021011,293.8000183105469,0.30000001192092896,3.299999952316284,0.0 +2015-12-24 14:00:00,0.0,376.3000183105469,144.60000610351562,100040.0,0.014999999664723873,294.3000183105469,0.9000000357627869,3.6000001430511475,0.0 +2015-12-24 15:00:00,0.0,395.6000061035156,284.70001220703125,100150.0,0.01529999915510416,294.6000061035156,1.5,3.9000000953674316,0.0 +2015-12-24 16:00:00,0.0,395.6000061035156,356.70001220703125,100100.0,0.015399999916553497,295.5,2.700000047683716,3.799999952316284,0.0 +2015-12-24 17:00:00,0.0,395.6000061035156,380.1000061035156,100110.0,0.01599999889731407,295.5,3.9000000953674316,3.700000047683716,0.0 +2015-12-24 18:00:00,0.0,396.1000061035156,334.20001220703125,100100.0,0.01589999906718731,295.3000183105469,5.099999904632568,3.6000001430511475,0.0 +2015-12-24 19:00:00,0.0,396.1000061035156,305.8000183105469,100040.0,0.01549999974668026,295.5,4.5,3.200000047683716,0.0 +2015-12-24 20:00:00,0.0,396.1000061035156,234.3000030517578,100040.0,0.01599999889731407,295.0,3.9000000953674316,2.799999952316284,0.0 +2015-12-24 21:00:00,0.0,400.3000183105469,112.4000015258789,100090.0,0.015699999406933784,295.3999938964844,3.299999952316284,2.4000000953674316,0.0 +2015-12-24 22:00:00,0.0,400.3000183105469,23.0,100110.0,0.015799999237060547,294.5,2.1000001430511475,2.4000000953674316,0.0 +2015-12-24 23:00:00,0.0,400.3000183105469,0.0,100210.0,0.01529999915510416,294.3999938964844,0.9000000357627869,2.4000000953674316,8.350020135867138e-08 +2015-12-25 00:00:00,0.30000001192092896,385.5,0.0,100270.0,0.015599999576807022,294.6000061035156,-0.4000000059604645,2.4000000953674316,0.0 +2015-12-25 01:00:00,0.0,385.5,0.0,100300.0,0.013899999670684338,293.5,0.4000000059604645,2.200000047683716,5.5656204442663486e-08 +2015-12-25 02:00:00,0.20000000298023224,385.5,0.0,100370.0,0.013499999418854713,292.70001220703125,1.2000000476837158,2.1000001430511475,0.0 +2015-12-25 03:00:00,0.0,370.70001220703125,0.0,100450.0,0.012899999506771564,291.8999938964844,1.899999976158142,1.899999976158142,0.0 +2015-12-25 04:00:00,0.0,370.70001220703125,0.0,100510.0,0.012600000016391277,291.3999938964844,1.8000000715255737,1.5,2.7816667451248293e-08 +2015-12-25 05:00:00,0.10000000149011612,370.70001220703125,0.0,100490.0,0.012399999424815178,291.20001220703125,1.7000000476837158,1.100000023841858,0.0 +2015-12-25 06:00:00,0.0,383.0,0.0,100450.0,0.01269999984651804,291.3999938964844,1.5,0.699999988079071,0.0 +2015-12-25 07:00:00,0.0,383.0,0.0,100450.0,0.012899999506771564,291.5,1.3000000715255737,0.6000000238418579,0.0 +2015-12-25 08:00:00,0.0,383.0,0.0,100520.0,0.012299999594688416,291.1000061035156,1.100000023841858,0.4000000059604645,2.7815141514545572e-08 +2015-12-25 09:00:00,0.10000000149011612,391.5,0.0,100570.0,0.012399999424815178,290.8000183105469,1.0,0.30000001192092896,0.0 +2015-12-25 10:00:00,0.0,391.5,0.0,100490.0,0.012000000104308128,290.5,0.10000000149011612,0.5,0.0 +2015-12-25 11:00:00,0.0,391.5,0.0,100510.0,0.011799999512732029,290.20001220703125,-0.800000011920929,0.699999988079071,0.0 +2015-12-25 12:00:00,0.0,381.5,0.0,100620.0,0.011599999852478504,289.8999938964844,-1.7000000476837158,0.9000000357627869,0.0 +2015-12-25 13:00:00,0.0,381.5,53.5,100550.0,0.011799999512732029,290.1000061035156,-1.3000000715255737,1.0,0.0 +2015-12-25 14:00:00,0.0,381.5,167.3000030517578,100590.0,0.012600000016391277,291.1000061035156,-0.800000011920929,1.2000000476837158,0.0 +2015-12-25 15:00:00,0.0,388.8999938964844,312.20001220703125,100630.0,0.013700000010430813,292.8999938964844,-0.4000000059604645,1.399999976158142,0.0 +2015-12-25 16:00:00,0.0,388.8999938964844,391.6000061035156,100620.0,0.013899999670684338,293.70001220703125,0.0,1.899999976158142,0.0 +2015-12-25 17:00:00,0.0,388.8999938964844,417.70001220703125,100560.0,0.0142000000923872,294.1000061035156,0.30000001192092896,2.4000000953674316,0.0 +2015-12-25 18:00:00,0.0,402.3000183105469,391.20001220703125,100450.0,0.01489999983459711,294.20001220703125,0.699999988079071,2.9000000953674316,0.0 +2015-12-25 19:00:00,0.0,402.3000183105469,358.3999938964844,100380.0,0.015099999494850636,294.8000183105469,1.2000000476837158,2.799999952316284,0.0 +2015-12-25 20:00:00,0.0,402.3000183105469,274.8999938964844,100410.0,0.01549999974668026,295.8000183105469,1.600000023841858,2.799999952316284,0.0 +2015-12-25 21:00:00,0.0,398.0,125.5,100440.0,0.015599999576807022,296.20001220703125,2.1000001430511475,2.700000047683716,0.0 +2015-12-25 22:00:00,0.0,398.0,26.399999618530273,100440.0,0.014999999664723873,294.8999938964844,1.3000000715255737,2.5,0.0 +2015-12-25 23:00:00,0.0,398.1000061035156,0.0,100540.0,0.014800000004470348,294.1000061035156,0.5,2.299999952316284,3.3397930247683724e-07 +2015-12-26 00:00:00,1.2000000476837158,396.6000061035156,0.0,100590.0,0.014399999752640724,293.70001220703125,-0.30000001192092896,2.200000047683716,1.029682587294264e-06 +2015-12-26 01:00:00,3.700000047683716,396.6000061035156,0.0,100590.0,0.013700000010430813,292.8999938964844,-0.6000000238418579,1.600000023841858,5.84318769949322e-07 +2015-12-26 02:00:00,2.1000001430511475,396.6000061035156,0.0,100610.0,0.013399999588727951,291.8999938964844,-0.9000000357627869,1.0,0.0 +2015-12-26 03:00:00,0.0,391.6000061035156,0.0,100620.0,0.012600000016391277,291.70001220703125,-1.2000000476837158,0.4000000059604645,0.0 +2015-12-26 04:00:00,0.0,391.6000061035156,0.0,100610.0,0.01209999993443489,291.20001220703125,-1.0,0.20000000298023224,0.0 +2015-12-26 05:00:00,0.0,391.6000061035156,0.0,100600.0,0.011500000022351742,290.0,-0.699999988079071,-0.10000000149011612,0.0 +2015-12-26 06:00:00,0.0,388.8999938964844,0.0,100670.0,0.011899999342858791,290.3000183105469,-0.5,-0.4000000059604645,0.0 +2015-12-26 07:00:00,0.0,388.8999938964844,0.0,100600.0,0.011799999512732029,290.0,-0.9000000357627869,-0.30000001192092896,0.0 +2015-12-26 08:00:00,0.0,388.8999938964844,0.0,100670.0,0.011399999260902405,289.8000183105469,-1.399999976158142,-0.30000001192092896,0.0 +2015-12-26 09:00:00,0.0,382.6000061035156,0.0,100600.0,0.01119999960064888,289.70001220703125,-1.8000000715255737,-0.20000000298023224,0.0 +2015-12-26 10:00:00,0.0,382.6000061035156,0.0,100500.0,0.011299999430775642,289.8000183105469,-1.5,-0.30000001192092896,0.0 +2015-12-26 11:00:00,0.0,382.6000061035156,0.0,100490.0,0.011399999260902405,289.8000183105469,-1.100000023841858,-0.5,0.0 +2015-12-26 12:00:00,0.0,360.8000183105469,0.0,100570.0,0.011500000022351742,289.8999938964844,-0.800000011920929,-0.6000000238418579,0.0 +2015-12-26 13:00:00,0.0,360.8000183105469,62.400001525878906,100530.0,0.011799999512732029,290.1000061035156,-1.0,-0.6000000238418579,0.0 +2015-12-26 14:00:00,0.0,360.8000183105469,197.3000030517578,100700.0,0.011599999852478504,290.5,-1.2000000476837158,-0.5,0.0 +2015-12-26 15:00:00,0.0,373.6000061035156,345.3999938964844,100840.0,0.012999999336898327,292.3999938964844,-1.399999976158142,-0.5,0.0 +2015-12-26 16:00:00,0.0,373.6000061035156,433.8000183105469,100860.0,0.013299999758601189,293.20001220703125,-1.100000023841858,0.4000000059604645,0.0 +2015-12-26 17:00:00,0.0,373.6000061035156,463.1000061035156,100690.0,0.0139999995008111,293.8999938964844,-0.9000000357627869,1.3000000715255737,0.0 +2015-12-26 18:00:00,0.0,384.20001220703125,459.1000061035156,100660.0,0.014299999922513962,295.5,-0.699999988079071,2.200000047683716,0.0 +2015-12-26 19:00:00,0.0,384.20001220703125,420.8999938964844,100510.0,0.01489999983459711,296.8000183105469,-0.699999988079071,2.1000001430511475,0.0 +2015-12-26 20:00:00,0.0,384.20001220703125,323.3999938964844,100540.0,0.013700000010430813,297.3000183105469,-0.699999988079071,2.1000001430511475,0.0 +2015-12-26 21:00:00,0.0,371.8999938964844,146.5,100510.0,0.013899999670684338,296.3999938964844,-0.699999988079071,2.0,0.0 +2015-12-26 22:00:00,0.0,371.8999938964844,31.80000114440918,100560.0,0.014299999922513962,294.8999938964844,-1.100000023841858,2.1000001430511475,0.0 +2015-12-26 23:00:00,0.0,371.8999938964844,0.0,100600.0,0.0139999995008111,293.70001220703125,-1.600000023841858,2.200000047683716,0.0 +2015-12-27 00:00:00,0.0,361.6000061035156,0.0,100640.0,0.013599999248981476,292.6000061035156,-2.0,2.299999952316284,0.0 +2015-12-27 01:00:00,0.0,361.6000061035156,0.0,100570.0,0.013299999758601189,291.8000183105469,-2.1000001430511475,2.1000001430511475,0.0 +2015-12-27 02:00:00,0.0,361.6000061035156,0.0,100620.0,0.013299999758601189,292.1000061035156,-2.200000047683716,1.899999976158142,0.0 +2015-12-27 03:00:00,0.0,351.3999938964844,0.0,100610.0,0.013499999418854713,291.8999938964844,-2.200000047683716,1.7000000476837158,0.0 +2015-12-27 04:00:00,0.0,351.3999938964844,0.0,100580.0,0.013100000098347664,291.70001220703125,-2.1000001430511475,1.899999976158142,0.0 +2015-12-27 05:00:00,0.0,351.3999938964844,0.0,100530.0,0.013199999928474426,292.0,-1.899999976158142,2.1000001430511475,0.0 +2015-12-27 06:00:00,0.0,362.20001220703125,0.0,100470.0,0.013299999758601189,292.1000061035156,-1.8000000715255737,2.299999952316284,0.0 +2015-12-27 07:00:00,0.0,362.20001220703125,0.0,100350.0,0.013399999588727951,292.20001220703125,-1.7000000476837158,2.1000001430511475,0.0 +2015-12-27 08:00:00,0.0,362.20001220703125,0.0,100410.0,0.013399999588727951,292.0,-1.7000000476837158,1.899999976158142,0.0 +2015-12-27 09:00:00,0.0,380.3000183105469,0.0,100420.0,0.013499999418854713,292.5,-1.600000023841858,1.7000000476837158,0.0 +2015-12-27 10:00:00,0.0,380.3000183105469,0.0,100380.0,0.013499999418854713,292.3000183105469,-1.7000000476837158,1.7000000476837158,0.0 +2015-12-27 11:00:00,0.0,380.3000183105469,0.0,100410.0,0.013499999418854713,292.6000061035156,-1.8000000715255737,1.7000000476837158,0.0 +2015-12-27 12:00:00,0.0,366.3999938964844,0.0,100430.0,0.013299999758601189,292.20001220703125,-1.8000000715255737,1.7000000476837158,0.0 +2015-12-27 13:00:00,0.0,366.3999938964844,36.29999923706055,100320.0,0.012999999336898327,292.3000183105469,-1.2000000476837158,1.2000000476837158,0.0 +2015-12-27 14:00:00,0.0,366.3999938964844,115.80000305175781,100360.0,0.013499999418854713,292.3000183105469,-0.6000000238418579,0.699999988079071,2.7821407388965253e-07 +2015-12-27 15:00:00,1.0,388.70001220703125,184.6999969482422,100370.0,0.013399999588727951,292.3999938964844,0.0,0.20000000298023224,1.0572340440260603e-06 +2015-12-27 16:00:00,3.799999952316284,388.70001220703125,232.1999969482422,100310.0,0.013499999418854713,292.5,0.4000000059604645,0.5,0.0 +2015-12-27 17:00:00,0.0,388.70001220703125,248.10000610351562,100190.0,0.014099999330937862,293.6000061035156,0.699999988079071,0.9000000357627869,0.0 +2015-12-27 18:00:00,0.0,383.5,333.3000183105469,100120.0,0.01489999983459711,294.0,1.100000023841858,1.2000000476837158,0.0 +2015-12-27 19:00:00,0.0,383.5,305.8999938964844,99960.0,0.014999999664723873,294.8999938964844,1.2000000476837158,1.3000000715255737,0.0 +2015-12-27 20:00:00,0.0,383.5,235.40000915527344,99970.0,0.014999999664723873,295.5,1.2000000476837158,1.5,5.568038368734538e-08 +2015-12-27 21:00:00,0.20000000298023224,375.20001220703125,143.0,100000.0,0.015199999324977398,294.8000183105469,1.3000000715255737,1.7000000476837158,0.0 +2015-12-27 22:00:00,0.0,375.20001220703125,32.0,100010.0,0.015099999494850636,294.3999938964844,0.699999988079071,1.899999976158142,0.0 +2015-12-27 23:00:00,0.0,375.20001220703125,0.0,99990.0,0.014699999243021011,293.3000183105469,0.10000000149011612,2.1000001430511475,0.0 +2015-12-28 00:00:00,0.0,368.1000061035156,0.0,100000.0,0.014800000004470348,293.20001220703125,-0.4000000059604645,2.299999952316284,0.0 +2015-12-28 01:00:00,0.0,368.20001220703125,0.0,99980.0,0.013599999248981476,292.3000183105469,-0.699999988079071,2.200000047683716,0.0 +2015-12-28 02:00:00,0.0,368.20001220703125,0.0,100020.0,0.012999999336898327,291.3000183105469,-1.100000023841858,2.1000001430511475,0.0 +2015-12-28 03:00:00,0.0,338.3000183105469,0.0,100090.0,0.013100000098347664,291.0,-1.399999976158142,2.0,0.0 +2015-12-28 04:00:00,0.0,338.3000183105469,0.0,100110.0,0.012999999336898327,291.70001220703125,-1.399999976158142,2.200000047683716,0.0 +2015-12-28 05:00:00,0.0,338.3000183105469,0.0,100090.0,0.013199999928474426,291.8000183105469,-1.399999976158142,2.299999952316284,0.0 +2015-12-28 06:00:00,0.0,341.3000183105469,0.0,100050.0,0.013499999418854713,292.3999938964844,-1.5,2.4000000953674316,0.0 +2015-12-28 07:00:00,0.0,341.3000183105469,0.0,100040.0,0.013100000098347664,292.1000061035156,-1.8000000715255737,1.899999976158142,0.0 +2015-12-28 08:00:00,0.0,341.3000183105469,0.0,100030.0,0.013399999588727951,291.8999938964844,-2.1000001430511475,1.5,0.0 +2015-12-28 09:00:00,0.0,341.1000061035156,0.0,100040.0,0.013100000098347664,291.8999938964844,-2.4000000953674316,1.0,0.0 +2015-12-28 10:00:00,0.0,341.1000061035156,0.0,100000.0,0.012899999506771564,291.6000061035156,-2.5,1.0,0.0 +2015-12-28 11:00:00,0.0,341.1000061035156,0.0,100000.0,0.012999999336898327,291.70001220703125,-2.5,0.9000000357627869,0.0 +2015-12-28 12:00:00,0.0,346.5,0.0,100070.0,0.013100000098347664,291.3999938964844,-2.6000001430511475,0.800000011920929,0.0 +2015-12-28 13:00:00,0.0,346.5,54.400001525878906,100060.0,0.012899999506771564,291.8000183105469,-2.5,0.4000000059604645,0.0 +2015-12-28 14:00:00,0.0,346.5,175.5,100080.0,0.013100000098347664,291.70001220703125,-2.4000000953674316,0.0,0.0 +2015-12-28 15:00:00,0.0,378.70001220703125,257.8000183105469,100090.0,0.013799999840557575,292.8000183105469,-2.299999952316284,-0.4000000059604645,0.0 +2015-12-28 16:00:00,0.0,378.70001220703125,324.5,100100.0,0.014399999752640724,293.3999938964844,-3.299999952316284,0.10000000149011612,0.0 +2015-12-28 17:00:00,0.0,378.70001220703125,346.8999938964844,100020.0,0.014800000004470348,293.8999938964844,-4.300000190734863,0.6000000238418579,0.0 +2015-12-28 18:00:00,0.0,403.6000061035156,251.8000030517578,99920.0,0.015399999916553497,294.8999938964844,-5.300000190734863,1.100000023841858,0.0 +2015-12-28 19:00:00,0.0,403.6000061035156,231.3000030517578,99800.0,0.01549999974668026,296.6000061035156,-5.599999904632568,1.5,0.0 +2015-12-28 20:00:00,0.0,403.6000061035156,178.3000030517578,99710.0,0.01489999983459711,297.0,-5.800000190734863,2.0,0.0 +2015-12-28 21:00:00,0.0,388.5,106.80000305175781,99730.0,0.014800000004470348,296.0,-6.099999904632568,2.4000000953674316,0.0 +2015-12-28 22:00:00,0.0,388.5,24.600000381469727,99660.0,0.01589999906718731,295.1000061035156,-6.200000286102295,2.5,2.2270145581262254e-07 +2015-12-28 23:00:00,0.800000011920929,388.5,0.0,99710.0,0.015399999916553497,294.3999938964844,-6.400000095367432,2.700000047683716,0.0 +2015-12-29 00:00:00,0.0,377.70001220703125,0.0,99760.0,0.015099999494850636,294.1000061035156,-6.599999904632568,2.799999952316284,0.0 +2015-12-29 01:00:00,0.0,377.70001220703125,0.0,99740.0,0.01549999974668026,294.8000183105469,-5.900000095367432,2.799999952316284,0.0 +2015-12-29 02:00:00,0.0,377.70001220703125,0.0,99680.0,0.015699999406933784,294.8999938964844,-5.099999904632568,2.799999952316284,0.0 +2015-12-29 03:00:00,0.0,382.1000061035156,0.0,99740.0,0.0142000000923872,293.70001220703125,-4.300000190734863,2.799999952316284,0.0 +2015-12-29 04:00:00,0.0,382.1000061035156,0.0,99670.0,0.014499999582767487,293.6000061035156,-3.5,3.4000000953674316,0.0 +2015-12-29 05:00:00,0.0,382.1000061035156,0.0,99710.0,0.013899999670684338,293.3000183105469,-2.700000047683716,3.9000000953674316,2.226156571250332e-07 +2015-12-29 06:00:00,0.800000011920929,397.3000183105469,0.0,99650.0,0.013899999670684338,293.3000183105469,-1.8000000715255737,4.5,6.400199914285021e-07 +2015-12-29 07:00:00,2.299999952316284,397.3000183105469,0.0,99510.0,0.014999999664723873,294.20001220703125,-0.800000011920929,5.0,9.462948913342166e-07 +2015-12-29 08:00:00,3.4000000953674316,397.3000183105469,0.0,99600.0,0.014499999582767487,293.70001220703125,0.20000000298023224,5.5,1.6975847576620752e-06 +2015-12-29 09:00:00,6.099999904632568,378.8999938964844,0.0,99620.0,0.014399999752640724,293.8999938964844,1.2000000476837158,6.0,4.7311727553386857e-07 +2015-12-29 10:00:00,1.7000000476837158,378.8999938964844,0.0,99620.0,0.014499999582767487,293.3000183105469,2.200000047683716,5.5,2.226156571250332e-07 +2015-12-29 11:00:00,0.800000011920929,379.0,0.0,99670.0,0.014800000004470348,293.3999938964844,3.200000047683716,5.0,0.0 +2015-12-29 12:00:00,0.0,379.5,0.0,99710.0,0.014699999243021011,293.6000061035156,4.300000190734863,4.5,0.0 +2015-12-29 13:00:00,0.0,379.5,39.20000076293945,99770.0,0.014800000004470348,293.8999938964844,3.9000000953674316,4.099999904632568,0.0 +2015-12-29 14:00:00,0.0,379.5,127.4000015258789,99850.0,0.014999999664723873,293.70001220703125,3.6000001430511475,3.700000047683716,0.0 +2015-12-29 15:00:00,0.0,368.70001220703125,257.20001220703125,99950.0,0.015799999237060547,295.20001220703125,3.299999952316284,3.4000000953674316,0.0 +2015-12-29 16:00:00,0.0,368.70001220703125,324.0,99990.0,0.014699999243021011,294.70001220703125,3.4000000953674316,3.5,0.0 +2015-12-29 17:00:00,0.0,368.70001220703125,346.70001220703125,99900.0,0.0142000000923872,294.8000183105469,3.4000000953674316,3.6000001430511475,0.0 +2015-12-29 18:00:00,0.0,367.3999938964844,399.3999938964844,99890.0,0.013700000010430813,295.0,3.5,3.700000047683716,0.0 +2015-12-29 19:00:00,0.0,367.3999938964844,367.20001220703125,99790.0,0.013899999670684338,296.6000061035156,3.1000001430511475,3.299999952316284,0.0 +2015-12-29 20:00:00,0.0,367.3999938964844,283.5,99810.0,0.014299999922513962,296.5,2.700000047683716,2.9000000953674316,0.0 +2015-12-29 21:00:00,0.0,366.1000061035156,140.10000610351562,99950.0,0.013599999248981476,296.1000061035156,2.299999952316284,2.6000001430511475,0.0 +2015-12-29 22:00:00,0.0,366.1000061035156,33.20000076293945,99950.0,0.013399999588727951,295.20001220703125,2.1000001430511475,2.200000047683716,0.0 +2015-12-29 23:00:00,0.0,366.1000061035156,0.0,100020.0,0.013899999670684338,293.8000183105469,1.899999976158142,1.8000000715255737,0.0 +2015-12-30 00:00:00,0.0,334.8999938964844,0.0,100130.0,0.013100000098347664,292.5,1.600000023841858,1.5,0.0 +2015-12-30 01:00:00,0.0,334.8999938964844,0.0,100070.0,0.013799999840557575,293.1000061035156,1.2000000476837158,1.399999976158142,0.0 +2015-12-30 02:00:00,0.0,334.8999938964844,0.0,100220.0,0.013100000098347664,292.3999938964844,0.699999988079071,1.3000000715255737,0.0 +2015-12-30 03:00:00,0.0,334.0,0.0,100290.0,0.013100000098347664,291.5,0.20000000298023224,1.100000023841858,0.0 +2015-12-30 04:00:00,0.0,334.0,0.0,100270.0,0.012399999424815178,291.1000061035156,0.10000000149011612,1.2000000476837158,0.0 +2015-12-30 05:00:00,0.0,334.0,0.0,100310.0,0.012399999424815178,290.8000183105469,-0.10000000149011612,1.3000000715255737,0.0 +2015-12-30 06:00:00,0.0,346.8999938964844,0.0,100360.0,0.012299999594688416,290.6000061035156,-0.20000000298023224,1.399999976158142,0.0 +2015-12-30 07:00:00,0.0,346.8999938964844,0.0,100330.0,0.012000000104308128,290.6000061035156,-0.6000000238418579,0.699999988079071,0.0 +2015-12-30 08:00:00,0.0,346.8999938964844,0.0,100330.0,0.012399999424815178,291.0,-1.0,0.0,0.0 +2015-12-30 09:00:00,0.0,381.3999938964844,0.0,100340.0,0.012399999424815178,290.8000183105469,-1.5,-0.699999988079071,1.390682119670145e-07 +2015-12-30 10:00:00,0.5,381.3999938964844,0.0,100300.0,0.012199999764561653,290.70001220703125,-1.600000023841858,-0.5,0.0 +2015-12-30 11:00:00,0.0,381.3999938964844,0.0,100300.0,0.012299999594688416,291.1000061035156,-1.7000000476837158,-0.20000000298023224,2.781514110006767e-07 +2015-12-30 12:00:00,1.0,397.3999938964844,0.0,100310.0,0.012999999336898327,291.5,-1.899999976158142,0.10000000149011612,0.0 +2015-12-30 13:00:00,0.0,397.3999938964844,28.200000762939453,100300.0,0.012799999676644802,292.0,-1.2000000476837158,0.30000001192092896,0.0 +2015-12-30 14:00:00,0.0,397.3999938964844,92.4000015258789,100270.0,0.013299999758601189,292.3999938964844,-0.5,0.6000000238418579,0.0 +2015-12-30 15:00:00,0.0,399.0,137.8000030517578,100340.0,0.014299999922513962,293.3999938964844,0.20000000298023224,0.800000011920929,1.1409286097882968e-06 +2015-12-30 16:00:00,4.099999904632568,399.0,173.6999969482422,100440.0,0.0139999995008111,292.8999938964844,0.4000000059604645,1.399999976158142,5.731888601858435e-06 +2015-12-30 17:00:00,20.600000381469727,399.0,186.0,100250.0,0.013799999840557575,292.6000061035156,0.6000000238418579,2.1000001430511475,3.950871781250009e-06 +2015-12-30 18:00:00,14.199999809265137,401.0,181.8000030517578,100330.0,0.012799999676644802,291.70001220703125,0.800000011920929,2.799999952316284,7.510919598994889e-07 +2015-12-30 19:00:00,2.700000047683716,401.0,167.40000915527344,100240.0,0.012399999424815178,291.6000061035156,0.699999988079071,2.299999952316284,6.119894023402888e-07 +2015-12-30 20:00:00,2.200000047683716,401.0,129.40000915527344,100220.0,0.012799999676644802,291.70001220703125,0.699999988079071,1.899999976158142,3.6163688309164025e-07 +2015-12-30 21:00:00,1.3000000715255737,396.70001220703125,75.30000305175781,100190.0,0.012799999676644802,291.3000183105469,0.6000000238418579,1.5,4.45058494258552e-07 +2015-12-30 22:00:00,1.600000023841858,396.70001220703125,18.399999618530273,100230.0,0.01269999984651804,291.0,1.0,1.100000023841858,1.1404001498766157e-06 +2015-12-30 23:00:00,4.099999904632568,396.70001220703125,0.0,100260.0,0.012600000016391277,290.8000183105469,1.399999976158142,0.699999988079071,4.172046359010436e-07 diff --git a/include/core/HY_Features.hpp b/include/core/HY_Features.hpp index 0f4d5b2c00..335a7489a8 100644 --- a/include/core/HY_Features.hpp +++ b/include/core/HY_Features.hpp @@ -2,6 +2,7 @@ #define HY_FEATURES_H #include +#include #include #include @@ -59,24 +60,14 @@ namespace hy_features { /** * @brief Construct a new HY_Features object from a Network and a set of formulations. * - * Constructs the HY_Catchment objects for each catchment feature in the network, and attaches tha formaulation + * Constructs the HY_Catchment objects for each catchment connecting them with the provided link_key attaches the formulation * associated with the catchment found in the Formulation_Manager. Also constucts each nexus as a HY_PointHydroNexus. * - * @param network - * @param formulations - */ - HY_Features( network::Network network, std::shared_ptr formulations); - - /** - * @brief Construct a new HY_Features object From a GeoJSON feature collection and a set of formulations. - * - * Constructs the network::Network index from the GeoJSON feature collection and link_key and then - * \copydetails HY_Features::HY_Features(network::Network,std::shared_ptr) - * * @param catchments - * @param link_key + * @param link_key * @param formulations */ + HY_Features( geojson::GeoJSON catchments, std::string* link_key, std::shared_ptr formulations); /** @@ -116,6 +107,21 @@ namespace hy_features { */ inline auto catchments(){return network.filter("cat");} + /** + * @brief An iterator of only the catchment feature ids from only the specified layer + * + * @return auto + */ + inline auto catchments(long lyr) { + return network.filter("cat",lyr); + } + + /** + * @brief Return a set of layers that contain a catchment + */ + + inline const auto& layers() { return hf_layers; } + /** * @brief An iterator of only the nexus feature ids * @@ -180,6 +186,8 @@ namespace hy_features { private: + void init(); + /** * @brief Internal mapping of catchment id -> HY_Catchment pointer. * @@ -204,6 +212,13 @@ namespace hy_features { */ std::shared_ptr formulations; + /** + * @brief The set of layers that contain at least one catchment + */ + std::set hf_layers; + + geojson::GeoJSON fabric; + }; } diff --git a/include/core/HY_Features_MPI.hpp b/include/core/HY_Features_MPI.hpp index cd92e5584a..ec26abbda5 100644 --- a/include/core/HY_Features_MPI.hpp +++ b/include/core/HY_Features_MPI.hpp @@ -4,6 +4,7 @@ #ifdef NGEN_MPI_ACTIVE #include +#include #include #include @@ -32,6 +33,16 @@ namespace hy_features { inline bool is_remote_sender_nexus(const std::string& id) { return _nexuses.find(id) != _nexuses.end() && _nexuses[id]->is_remote_sender(); } + + inline auto catchments(long lyr) { + return network.filter("cat",lyr); + } + + /** + * @brief Return a set of layers that contain a catchment + */ + + inline const auto& layers() { return hf_layers; } inline std::vector> destination_nexuses(const std::string& id) { std::vector> downstream; @@ -77,6 +88,7 @@ namespace hy_features { std::unordered_map> _nexuses; network::Network network; std::shared_ptr formulations; + std::set hf_layers; int mpi_rank; int mpi_num_procs; diff --git a/include/core/Layer.hpp b/include/core/Layer.hpp new file mode 100644 index 0000000000..e25fa66884 --- /dev/null +++ b/include/core/Layer.hpp @@ -0,0 +1,147 @@ +#ifndef __NGEN_LAYER__ +#define __NGEN_LAYER__ + +#include "LayerData.hpp" +#include "Simulation_Time.hpp" + +#ifdef NGEN_MPI_ACTIVE +#include "HY_Features_MPI.hpp" +#else +#include "HY_Features.hpp" +#endif + +namespace ngen +{ + + class Layer + { + public: + + #ifdef NGEN_MPI_ACTIVE + using feature_type = hy_features::HY_Features_MPI; + #else + using feature_type = hy_features::HY_Features; + #endif + + Layer( + const LayerDescription& desc, + const std::vector& p_u, + const Simulation_Time& s_t, + feature_type& f, + geojson::GeoJSON cd, + long idx) : + description(desc), + processing_units(p_u), + simulation_time(s_t), + features(f), + catchment_data(cd), + output_time_index(idx) + { + + } + + virtual ~Layer() {} + + /*** + * @brief Return the next timestep that will be processed by this layer in epoch time units + */ + time_t next_timestep_epoch_time() { return simulation_time.next_timestep_epoch_time(); } + + + /*** + * @brief Return the last timestep that was processed by this layer in epoch time units + */ + time_t current_timestep_epoch_time() { return simulation_time.get_current_epoch_time(); } + + + /*** + * @brief Return the numeric id of this layer + */ + int get_id() const { return this->description.id; } + + /*** + * @brief Return the name of this layer + */ + const std::string& get_name() const { return this->description.name; } + + /*** + * @brief Return this time_step interval used for this layer + */ + const double get_time_step() const { return this->description.time_step; } + + /*** + * @brief Return the units for the time_step value of this layer + */ + const std::string& get_time_step_units() const { return this->description.time_step_units; } + + /*** + * @brief Run one simulation timestep for each model in this layer + */ + virtual void update_models() + { + auto idx = simulation_time.next_timestep_index(); + auto step = simulation_time.get_output_interval_seconds(); + + //std::cout<<"Output Time Index: "<(r); + double response = r_c->get_response(output_time_index, simulation_time.get_output_interval_seconds()); + std::string output = std::to_string(output_time_index)+","+current_timestamp+","+ + r_c->get_output_line_for_timestep(output_time_index)+"\n"; + r_c->write_output(output); + //TODO put this somewhere else. For now, just trying to ensure we get m^3/s into nexus output + double area; + try{ + area = catchment_data->get_feature(id)->get_property("areasqkm").as_real_number(); + } + catch(std::invalid_argument &e) + { + area = catchment_data->get_feature(id)->get_property("area_sqkm").as_real_number(); + } + double response_m_s = response * (area * 1000000); + //TODO put this somewhere else as well, for now, an implicit assumption is that a module's get_response returns + //m/timestep + //since we are operating on a 1 hour (3600s) dt, we need to scale the output appropriately + //so no response is m^2/hr...m^2/hr * 1hr/3600s = m^3/hr + double response_m_h = response_m_s / 3600.0; + //update the nexus with this flow + for(auto& nexus : features.destination_nexuses(id)) { + //TODO in a DENDRITIC network, only one destination nexus per catchment + //If there is more than one, some form of catchment partitioning will be required. + //for now, only contribute to the first one in the list + nexus->add_upstream_flow(response_m_h, id, output_time_index); + /*std::cerr << "Add water to nexus ID = " << nexus->get_id() << " from catchment ID = " << id << " value = " + << response << ", ID = " << id << ", time-index = " << output_time_index << std::endl; */ + break; + } + + } //done catchments + + ++output_time_index; + if ( output_time_index < simulation_time.get_total_output_times() ) + { + simulation_time.advance_timestep(); + } + } + + + protected: + + const LayerDescription description; + const std::vector processing_units; + Simulation_Time simulation_time; + feature_type& features; + const geojson::GeoJSON catchment_data; + long output_time_index; + + }; +} + +#endif \ No newline at end of file diff --git a/include/core/LayerData.hpp b/include/core/LayerData.hpp new file mode 100644 index 0000000000..9820402ba5 --- /dev/null +++ b/include/core/LayerData.hpp @@ -0,0 +1,76 @@ +#ifndef __NGEN_LAYER_DATA__ +#define __NGEN_LAYER_DATA__ + +#include +#include +#include + +namespace ngen +{ + /** + * @brief A simple structure to hold meta data related to a computational layer + * + * This structure is used to hold information about a layers time_step, include value and units + * as well as the numeric id that is used to store and retrieve the layer + */ + + struct LayerDescription + { + std::string name; //> The name of the computational layer + std::string time_step_units; //> The time units that time_step is expressed in + int id; //> The layer id which determines the order that this layer will be processed in + double time_step; //> The time step that will be used for models in this layer + }; + + /** + * @brief A class to hold and manage layer metadata for the system + * + * Layer can be accessed by interger id the default valid range is -20 .. 80 + */ + + class LayerDataStorage + { + public: + + LayerDataStorage() {} + + ~LayerDataStorage() {} + + /** + * @brief return the layer object at this numeric id + */ + + const LayerDescription& get_layer(int id) const + { + return stored_layers.at(id); + } + + /** + * @brief store a new layer description in the indicated id slot + */ + + void put_layer(const LayerDescription& desc, int id) + { + stored_layers[id] = desc; + keys.push_back(id); + } + + /*** + * @brief check to see if a layer has been associated with an id number + */ + + bool exists(int id) + { + return stored_layers.find(id) != stored_layers.end(); + } + + std::vector& get_keys() { return keys; } + + private: + + std::unordered_map stored_layers; //< Map object that is used to store layer data objects + std::vector keys; //< A list of the currently valid map keys + }; +} + +#endif \ No newline at end of file diff --git a/include/core/Partition_Parser.hpp b/include/core/Partition_Parser.hpp index 541147d97c..9c0e740bfb 100644 --- a/include/core/Partition_Parser.hpp +++ b/include/core/Partition_Parser.hpp @@ -93,29 +93,37 @@ class Partitions_Parser { } part_data.nexus_ids = nexus_ids; nexus_ids.clear(); - if( part.at("remote-connections").get_type() == geojson::PropertyType::List ) { + + if( part.at("remote-connections").get_type() == geojson::PropertyType::List ) + { //It is valid to have no remote connections, but the backend property tree parser - //can't represent empty lists/objects, so it turns into an ampty string (which is iterable) + //can't represent empty lists/objects, so it turns into an empty string (which is iterable) //so we check to ensure the remote connections are a list type (not string) before we attempt //to process the remote-connections. If they are empty, this step gets skipped entirely. //Get remote-connections and set the corresponding part_data struct member + for (auto &remote_conn : part.at("remote-connections").as_list()) { - remote_mpi_rank = remote_conn.at("mpi-rank").as_natural_number(); - remote_nex_id = remote_conn.at("nex-id").as_string(); - remote_cat_id = remote_conn.at("cat-id").as_string(); - direction = remote_conn.at("cat-direction").as_string(); - tmp_tuple = std::make_tuple(remote_mpi_rank, remote_nex_id, remote_cat_id, direction); - remote_conn_vec.push_back(tmp_tuple); + if ( remote_conn.get_type() != geojson::PropertyType::String ) + { + remote_mpi_rank = remote_conn.at("mpi-rank").as_natural_number(); + remote_nex_id = remote_conn.at("nex-id").as_string(); + remote_cat_id = remote_conn.at("cat-id").as_string(); + direction = remote_conn.at("cat-direction").as_string(); + tmp_tuple = std::make_tuple(remote_mpi_rank, remote_nex_id, remote_cat_id, direction); + remote_conn_vec.push_back(tmp_tuple); + } } } + part_data.remote_connections = remote_conn_vec; remote_conn_vec.clear(); //Push part_data struct the vector partition_ranks.push_back(part_data); - part_counter++; + part_counter++; + } }; @@ -158,7 +166,7 @@ class Partitions_Parser { */ return part_data; - }; + } //This example function shows how to get a specific member of the struct int get_mpi_rank(int part_id) @@ -170,7 +178,7 @@ class Partitions_Parser { std::cout << "mpi_world_rank: " << mpi_world_rank << std::endl; return mpi_world_rank; - }; + } // partition_ranks is a vector of struct: PartitionData std::vector partition_ranks; diff --git a/include/core/SurfaceLayer.hpp b/include/core/SurfaceLayer.hpp new file mode 100644 index 0000000000..30bea7a98d --- /dev/null +++ b/include/core/SurfaceLayer.hpp @@ -0,0 +1,40 @@ +#ifndef __NGEN_SURFACE_LAYER__ +#define __NGEN_SURFACE_LAYER__ + +#include "Layer.hpp" + +namespace ngen +{ + class SurfaceLayer : public Layer + { + public: + + SurfaceLayer( + const LayerDescription& desc, + const std::vector& p_u, + const Simulation_Time& s_t, + feature_type& f, + geojson::GeoJSON cd, + long idx, + const std::vector& n_u, + std::unordered_map& output_files) : + Layer(desc,p_u,s_t,f,cd,idx), + nexus_ids(n_u), + nexus_outfiles(output_files) + { + + } + + /*** + * @brief Run one simulation timestep for each model in this layer + */ + void update_models() override; + + private: + + std::vector nexus_ids; + std::unordered_map& nexus_outfiles; + }; +} + +#endif \ No newline at end of file diff --git a/include/core/catchment/HY_Catchment.hpp b/include/core/catchment/HY_Catchment.hpp index d31660dba9..5b0329ec32 100644 --- a/include/core/catchment/HY_Catchment.hpp +++ b/include/core/catchment/HY_Catchment.hpp @@ -21,7 +21,7 @@ class HY_Catchment : public HY_HydroFeature public: HY_Catchment(); - HY_Catchment(std::string id, Nexuses inflows, Nexuses outflows, std::shared_ptr realization): + HY_Catchment(std::string id, Nexuses inflows, Nexuses outflows, std::shared_ptr realization, long lyr = 0): id(std::move(id)), inflows(std::move(inflows)), outflows(std::move(outflows)), @@ -30,10 +30,40 @@ class HY_Catchment : public HY_HydroFeature conjoint_catchment({}), upper_catchment({}), lower_catchment({}), - realization(realization){} + realization(realization), + layer(lyr){} virtual ~HY_Catchment(); const Nexuses& get_outflow_nexuses(){ return outflows; } std::shared_ptr realization; + + /*! \brief get the hydrofabric layer of this catchment + * + * The hydrofabric is divided into multiple layers which are intended to be processed in decreasing numeric order. + * The current defined layers are: + * 80 -- Atmospheric Models (high) + * 60 -- Atmospeheric Models (low) + * 40 -- Canopy Models + * 20 -- Snow melt models + * 0 -- Surface water processes + * -20 -- Ground Water (Shallow) + * -40 -- Ground Water (Deep) + */ + long get_layer() { return layer; } + + /*! \brief set the layer of this catchment + * + * This function changes the layer of a catchment. It should only be used if the type of model being used in the catchment changes. + */ + void set_layer(long lyr) { layer = lyr; } + + const long ATMOSPHERIC_LAYER_HIGH = 80; //!< This is the catchment layer for high air atmospheric models + const long ATMOSPHERIC_Layer_LOW = 60; //!< This is the catchment layer for low air atmospheric models + const long CANOPY_LAYER = 40; //!< This is the catchment layer for canopy layer models + const long SNOW_LAYER = 20; //!< This is the catchment layer for surface snow models + const long SURFACE_LAYER = 0; //!< This is the catchment layer for surface water models + const long GROUND_WATER_SHALLOW_LAYER = -20; //!< This is the catchment layer for shallow groundwater models + const long GROUND_WATER_DEEP_LAYER = -40; //!< This is the catchment layer for deep groundwater models + protected: private: @@ -47,6 +77,8 @@ class HY_Catchment : public HY_HydroFeature Catchment upper_catchment; Catchment lower_catchment; + long layer; + }; #endif // HY_CATCHMENT_H diff --git a/include/core/network.hpp b/include/core/network.hpp index d14726efb8..9949813f4d 100644 --- a/include/core/network.hpp +++ b/include/core/network.hpp @@ -18,6 +18,9 @@ #include namespace network { + + const static int DEFAULT_LAYER_ID = 0; + /** * @brief Selector for using different traversal orders for linear return */ @@ -206,12 +209,53 @@ namespace network { | boost::adaptors::transformed([this](int const& i) { return get_id(i); }) | boost::adaptors::filtered([type](std::string const& s) { if(type == "nex"){ - return s.substr(0,3) == type || s.substr(0,3) == "tnx"; + return s.substr(0,3) == type || s.substr(0,3) == "tnx" || s.substr(0,4) == "tnex"; + } + if(type == "cat"){ + return s.substr(0,3) == type || s.substr(0,3) == "agg"; } return s.substr(0,3) == type; }); } + + /** + * @brief Provides a boost transform_iterator, filtered by @p type , to the topologically ordered graph vertex string id's + * + * This function is useful when only interested in a single type of feature. + * It returns the a topologically ordered set of feature ids. For example, to print all catchments + * in the network: + * @code {.cpp} + * for( auto catchment : network.filter('cat') ){ + * std::cout << catchment; + * } + * @endcode + * + * @param type The type of feature to filter for, i.e. 'cat', 'nex' + * @param target_layer The layer that filtered results should be in + * @param order What order to return results in + * @return auto + */ + auto filter(std::string type, int target_layer, SortOrder order = SortOrder::Topological) + { + //todo need to worry about valivdating input??? + //if type isn't found as a prefix, this iterator range should be empty, + //which is a reasonable semantic + return get_sorted_index(order) | boost::adaptors::reversed + | boost::adaptors::transformed([this](int const& i) { return get_id(i); }) + | boost::adaptors::filtered([this,type,target_layer](std::string const& s) { + if(type == "nex"){ + return (s.substr(0,3) == type || s.substr(0,3) == "tnx" || s.substr(0,4) == "tnex") && + (this->layer_map.find(s) != this->layer_map.end() && this->layer_map[s] == target_layer); + } + if(type == "cat"){ + return (s.substr(0,3) == type || s.substr(0,3) == "agg") && + (this->layer_map.find(s) != this->layer_map.end() && this->layer_map[s] == target_layer); + } + return (s.substr(0,3) == type) && + (this->layer_map.find(s) != this->layer_map.end() && (this->layer_map[s] == target_layer)); + }); + } /** * @brief Get the string id of a given graph vertex_descriptor @p idx * @@ -316,6 +360,12 @@ namespace network { * */ std::unordered_map descriptor_map; + + /** + * @brief Mapping of identifier to hydrofabric layer + * + */ + std::unordered_map layer_map; /** * @brief Get an index of the graph in a particular order. diff --git a/include/geojson/features/FeatureBase.hpp b/include/geojson/features/FeatureBase.hpp index 7df0c8a423..c888d5983a 100644 --- a/include/geojson/features/FeatureBase.hpp +++ b/include/geojson/features/FeatureBase.hpp @@ -384,7 +384,11 @@ namespace geojson { return bounding_box; } - PropertyMap get_properties() const { + const PropertyMap& get_properties() const { + return properties; + } + + PropertyMap& get_properties() { return properties; } diff --git a/include/realizations/catchment/Formulation_Manager.hpp b/include/realizations/catchment/Formulation_Manager.hpp index 1ad5d8c4d7..5133d323cf 100644 --- a/include/realizations/catchment/Formulation_Manager.hpp +++ b/include/realizations/catchment/Formulation_Manager.hpp @@ -16,8 +16,9 @@ #include "features/Features.hpp" #include #include "Formulation_Constructors.hpp" -#include "Simulation_Time.h" +#include "Simulation_Time.hpp" #include "routing/Routing_Params.h" +#include "LayerData.hpp" namespace realization { @@ -129,6 +130,62 @@ namespace realization { */ this->Simulation_Time_Object = std::make_shared(simulation_time_config); + /** + * Read the layer descriptions + */ + + // try to get the json node + auto layers_json_array = tree.get_child_optional("layers"); + + // check to see if the node existed + if (!layers_json_array) { + // layer description struct + ngen::LayerDescription layer_desc; + + // extract and store layer data from the json + layer_desc.name = "surface layer"; + layer_desc.id = 0; + layer_desc.time_step = 3600; + layer_desc.time_step_units = "s"; + + // add the layer to storage + layer_storage.put_layer(layer_desc, layer_desc.id); + } + else + { + for (std::pair layer_config : *layers_json_array) + { + // layer description struct + ngen::LayerDescription layer_desc; + + // extract and store layer data from the json + layer_desc.name = layer_config.second.get("name"); + layer_desc.id = layer_config.second.get("id"); + layer_desc.time_step = layer_config.second.get("time_step"); + boost::optional layer_units = layer_config.second.get_optional("time_step_units"); + if (*layer_units == "") layer_units = "s"; + layer_desc.time_step_units = *layer_units; + + // check to see if this layer was allready defined + if (layer_storage.exists(layer_desc.id) ) + { + std::string message = "A layer with id = "; + message += std::to_string(layer_desc.id); + message += " was defined more than once"; + + std::runtime_error r_error(message); + + throw r_error; + } + + // add the layer to storage + layer_storage.put_layer(layer_desc, layer_desc.id); + + // debuggin print to see parsed data + std::cout << layer_desc.name << ", " << layer_desc.id << ", " << layer_desc.time_step << ", " << layer_desc.time_step_units << "\n"; + } + } + /** * Read routing configurations from configuration file */ @@ -302,6 +359,12 @@ namespace realization { return "./"; } + /** + * @brief return the layer storage used for formulations + * @return a reference to the LayerStorageObject + */ + ngen::LayerDataStorage& get_layer_metadata() { return layer_storage; } + protected: std::shared_ptr construct_formulation_from_tree( @@ -685,6 +748,8 @@ namespace realization { std::shared_ptr routing_config; bool using_routing = false; + + ngen::LayerDataStorage layer_storage; }; } #endif // NGEN_FORMULATION_MANAGER_H diff --git a/include/simulation_time/Simulation_Time.h b/include/simulation_time/Simulation_Time.hpp similarity index 69% rename from include/simulation_time/Simulation_Time.h rename to include/simulation_time/Simulation_Time.hpp index 02832f7b4c..947ef89dd4 100644 --- a/include/simulation_time/Simulation_Time.h +++ b/include/simulation_time/Simulation_Time.hpp @@ -3,6 +3,8 @@ #include #include +#include +#include /** * @brief simulation_time_params providing configuration information for simulation time period. @@ -66,6 +68,12 @@ class Simulation_Time total_output_times = simulation_total_time_seconds / output_interval_seconds + 1; } + Simulation_Time(const Simulation_Time& t, int interval) : Simulation_Time(t) + { + output_interval_seconds = interval; + total_output_times = simulation_total_time_seconds / output_interval_seconds + 1; + } + /** * @brief Accessor to the total number of time steps * @return total_output_times @@ -84,12 +92,23 @@ class Simulation_Time return output_interval_seconds; } + /** + * @brief Accessor to the the current simulation time + * @return current_date_time_epoch + */ + + time_t get_current_epoch_time() + { + return current_date_time_epoch; + } + /** * @brief Accessor to the current timestamp string * @return current_timestamp */ std::string get_timestamp(int current_output_time_index) { + // "get" method mutates state! current_date_time_epoch = start_date_time_epoch + current_output_time_index * output_interval_seconds; struct tm *temp_gmtime_struct; @@ -107,6 +126,42 @@ class Simulation_Time return current_timestamp; } + inline int next_timestep_index(int epoch_time_seconds) + { + return int(epoch_time_seconds - start_date_time_epoch) / output_interval_seconds; + } + + inline int next_timestep_index() + { + return next_timestep_index(current_date_time_epoch); + } + + inline time_t next_timestep_epoch_time(int epoch_time_seconds){ + return start_date_time_epoch + ( next_timestep_index(epoch_time_seconds) * output_interval_seconds ); + } + + inline time_t next_timestep_epoch_time(){ + return next_timestep_epoch_time(current_date_time_epoch); + } + + inline int diff(const Simulation_Time& other){ + return start_date_time_epoch - other.start_date_time_epoch; + } + + /** + * @brief move this simulation time object to represent the next time step as the current time + */ + + inline void advance_timestep(){ + current_date_time_epoch += output_interval_seconds; + + if (current_date_time_epoch > end_date_time_epoch) + { + throw std::runtime_error("Simulation time objects current time exceeded the end_date_time_epoch value for that object"); + } + } + + private: int total_output_times; diff --git a/src/NGen.cpp b/src/NGen.cpp index e19cc2d90b..382bba42bb 100644 --- a/src/NGen.cpp +++ b/src/NGen.cpp @@ -17,6 +17,7 @@ #include #include +#include #ifdef WRITE_PID_FILE_FOR_GDB_SERVER #include @@ -51,6 +52,9 @@ int mpi_rank; int mpi_num_procs; #endif +#include +#include + std::unordered_map nexus_outfiles; int main(int argc, char *argv[]) { @@ -306,11 +310,11 @@ int main(int argc, char *argv[]) { #endif //NGEN_ROUTING_ACTIVE std::string link_key = "toid"; - #ifdef NGEN_MPI_ACTIVE nexus_collection->link_features_from_property(nullptr, &link_key); + #ifdef NGEN_MPI_ACTIVE hy_features::HY_Features_MPI features = hy_features::HY_Features_MPI(local_data, nexus_collection, manager, mpi_rank, mpi_num_procs); #else - hy_features::HY_Features features = hy_features::HY_Features(catchment_collection, &link_key, manager); + hy_features::HY_Features features = hy_features::HY_Features(nexus_collection, manager); #endif //validate dendritic connections @@ -333,74 +337,105 @@ int main(int argc, char *argv[]) { std::cout<<"Running Models"<get_layer_metadata(); + + // get the keys for the existing layers + std::vector& keys = layer_meta_data.get_keys(); + + // get the converted time steps for layers + double min_time_step; + double max_time_step; + std::vector time_steps; + for(int i = 0; i < keys.size(); ++i) + { + auto& m_data = layer_meta_data.get_layer(keys[i]); + double c_value = UnitsHelper::get_converted_value(m_data.time_step_units,m_data.time_step,"s"); + time_steps.push_back(c_value); + } + + std::vector output_time_index; + output_time_index.resize(keys.size()); + std::fill(output_time_index.begin(), output_time_index.end(),0); + + // now create the layer objects + + // first make sure that the layer are listed in decreasing order + boost::range::sort(keys, std::greater()); + + std::vector > layers; + layers.resize(keys.size()); + + for(long i = 0; i < keys.size(); ++i) + { + auto& desc = layer_meta_data.get_layer(keys[i]); + std::vector cat_ids; + + // make a new simulation time object with a different output interval + Simulation_Time sim_time(*manager->Simulation_Time_Object, time_steps[i]); + + for ( std::string id : features.catchments(keys[i]) ) { cat_ids.push_back(id); } + if (keys[i] != 0 ) + { + layers[i] = std::make_shared(desc, cat_ids, sim_time, features, catchment_collection, 0); + } + else + { + layers[i] = std::make_shared(desc, cat_ids, sim_time, features, catchment_collection, 0, nexus_subset_ids, nexus_outfiles); + } + + } + //Now loop some time, iterate catchments, do stuff for total number of output times - for(int output_time_index = 0; output_time_index < manager->Simulation_Time_Object->get_total_output_times(); output_time_index++) { - //std::cout<<"Output Time Index: "<Simulation_Time_Object->get_timestamp(output_time_index); - for(const auto& id : features.catchments()) { - //std::cout<<"Running cat "<(r); - double response = r_c->get_response(output_time_index, 3600.0); - std::string output = std::to_string(output_time_index)+","+current_timestamp+","+ - r_c->get_output_line_for_timestep(output_time_index)+"\n"; - r_c->write_output(output); - //TODO put this somewhere else. For now, just trying to ensure we get m^3/s into nexus output - try{ - response *= (catchment_collection->get_feature(id)->get_property("areasqkm").as_real_number() * 1000000); - }catch(std::invalid_argument &e) + auto num_times = manager->Simulation_Time_Object->get_total_output_times(); + for( int count = 0; count < num_times; count++) + { + // The Inner loop will advance all layers unless doing so will break one of two constraints + // 1) A layer may not proceed ahead of the master simulation object's current time + // 2) A layer may not proceed ahead of any layer that is computed before it + // The do while loop ensures that all layers are tested at least once while allowing + // layers with small time steps to be updated more than once + // If a layer with a large time step is after a layer with a small time step the + // layer with the large time step will wait for multiple timesteps from the preceeding + // layer. + + // this is the time that layers are trying to reach (or get as close as possible) + auto next_time = manager->Simulation_Time_Object->next_timestep_epoch_time(); + + // this is the time that the layer above the current layer is at + auto prev_layer_time = next_time; + + // this is the time that the least advanced layer is at + auto layer_min_next_time = next_time; + do + { + for ( auto& layer : layers ) { - response *= (catchment_collection->get_feature(id)->get_property("area_sqkm").as_real_number() * 1000000); - } - //TODO put this somewhere else as well, for now, an implicit assumption is that a modules get_response returns - //m/timestep - //since we are operating on a 1 hour (3600s) dt, we need to scale the output appropriately - //so no response is m^2/hr...m^2/hr * 1hr/3600s = m^3/hr - response /= 3600.0; - //update the nexus with this flow - for(auto& nexus : features.destination_nexuses(id)) { - //TODO in a dendritic network, only one destination nexus per catchment - //If there is more than one, some form of catchment partitioning will be required. - //for now, only contribute to the first one in the list - nexus->add_upstream_flow(response, id, output_time_index); - break; - } - } //done catchments - //At this point, could make an internal routing pass, extracting flows from nexuses and routing - //across the flowpath to the next nexus. - //Once everything is updated for this timestep, dump the nexus output - for(const auto& id : features.nexuses()) { - #ifdef NGEN_MPI_ACTIVE - if (!features.is_remote_sender_nexus(id)) { //Ensures only one side of the dual sided remote nexus actually doing this... - #endif - - //Get the correct "requesting" id for downstream_flow - const auto& nexus = features.nexus_at(id); - const auto& cat_ids = nexus->get_receiving_catchments(); - std::string cat_id; - if( cat_ids.size() > 0 ) { - //Assumes dendritic, e.g. only a single downstream...it will consume 100% of the available flow - cat_id = cat_ids[0]; + auto layer_next_time = layer->next_timestep_epoch_time(); + + // only advance if you would not pass the master next time and the previous layer next time + if ( layer_next_time <= next_time && layer_next_time <= prev_layer_time) + { + layer->update_models(); + prev_layer_time = layer_next_time; } - else { - //This is a terminal node, SHOULDN'T be remote, so ID shouldn't matter too much - cat_id = "terminal"; + else + { + layer_min_next_time = prev_layer_time = layer->current_timestep_epoch_time(); } - double contribution_at_t = features.nexus_at(id)->get_downstream_flow(cat_id, output_time_index, 100.0); - if(nexus_outfiles[id].is_open()) { - nexus_outfiles[id] << output_time_index << ", " << current_timestamp << ", " << contribution_at_t << std::endl; + + if ( layer_min_next_time > layer_next_time) + { + layer_min_next_time = layer_next_time; } - #ifdef NGEN_MPI_ACTIVE - } - #endif - //std::cout<<"\tNexus "<Simulation_Time_Object->advance_timestep(); + } - //Note: Use below if developing in-memory transfer of nexus flows to routing - //If using below, then another single time vector would be needed to hold the timestamp - //nexus_flows[id].push_back(contribution_at_t); - } //done nexuses } //done time std::cout<<"Finished "<Simulation_Time_Object->get_total_output_times()<<" timesteps."< formulations) - :HY_Features(network::Network(fabric), formulations) +HY_Features::HY_Features(geojson::GeoJSON linked_hydro_fabric, std::shared_ptr formulations) + :network(linked_hydro_fabric), formulations(formulations), fabric(linked_hydro_fabric) { - /* If you nest the constuctor calls like this, then the network, while valid in the next constructor, - is empty once the collection is fully instansiated... - HY_Features(network::Network(fabric)); - */ + init(); } -HY_Features::HY_Features(network::Network network, std::shared_ptr formulations) - :network(network), formulations(formulations) +HY_Features::HY_Features( geojson::GeoJSON catchments, std::string* link_key, std::shared_ptr formulations) + : network(catchments, link_key), formulations(formulations), fabric(catchments) { - std::string feat_id; - std::string feat_type; - std::vector origins, destinations; - - for(const auto& feat_idx : network){ - feat_id = network.get_id(feat_idx);//feature->get_id(); - feat_type = feat_id.substr(0, 3); - - destinations = network.get_destination_ids(feat_id); - if(feat_type == "cat") - { - //Find and prepare formulation - auto formulation = formulations->get_formulation(feat_id); - formulation->set_output_stream(formulations->get_output_root() + feat_id + ".csv"); - // TODO: add command line or config option to have this be omitted - //FIXME why isn't default param working here??? get_output_header_line() fails. - formulation->write_output("Time Step,""Time,"+formulation->get_output_header_line(",")+"\n"); - //Find upstream nexus ids - origins = network.get_origination_ids(feat_id); - //Create the HY_Catchment with the formulation realization - std::shared_ptr c = std::make_shared( - HY_Catchment(feat_id, origins, destinations, formulation) - ); - - _catchments.emplace(feat_id, c); - } - else if(feat_type == "nex" || feat_type == "tnx") - { - _nexuses.emplace(feat_id, std::make_unique( - HY_PointHydroNexus(feat_id, destinations) )); - } - else - { - std::cerr<<"HY_Features::HY_Features unknown feature identifier type "< formulations): - HY_Features(network::Network(catchments, link_key), formulations){ +void HY_Features::init() +{ + std::string feat_id; + std::string feat_type; + std::vector origins, destinations; + + for(const auto& feat_idx : network) + { + feat_id = network.get_id(feat_idx);//feature->get_id(); + feat_type = feat_id.substr(0, 3); + + destinations = network.get_destination_ids(feat_id); + if(feat_type == "cat" || feat_type == "agg") + { + //Find and prepare formulation + auto formulation = formulations->get_formulation(feat_id); + formulation->set_output_stream(formulations->get_output_root() + feat_id + ".csv"); // MERGE bd63e5b + // TODO: add command line or config option to have this be omitted + //FIXME why isn't default param working here??? get_output_header_line() fails. + formulation->write_output("Time Step,""Time,"+formulation->get_output_header_line(",")+"\n"); + //Find upstream nexus ids + origins = network.get_origination_ids(feat_id); + + // get the catchment layer from the hydro fabric + const auto& cat_json_node = fabric->get_feature(feat_id); + long lyr = cat_json_node->has_key("layer") ? cat_json_node->get_property("layer").as_natural_number() : 0; + + // add this layer to the set of layers if needed + if (hf_layers.find(lyr) == hf_layers.end() ) + { + hf_layers.insert(lyr); + } + + //Create the HY_Catchment with the formulation realization + std::shared_ptr c = std::make_shared( + HY_Catchment(feat_id, origins, destinations, formulation, lyr) + ); + _catchments.emplace(feat_id, c); + } + else if(feat_type == "nex" || feat_type == "tnx") + { + _nexuses.emplace(feat_id, std::make_unique( + HY_PointHydroNexus(feat_id, destinations) )); + } + else + { + std::cerr<<"HY_Features::HY_Features unknown feature identifier type "<get_formulation(feat_id); @@ -42,9 +42,20 @@ HY_Features_MPI::HY_Features_MPI( PartitionData partition_data, geojson::GeoJSON // TODO: add command line or config option to have this be omitted //FIXME why isn't default param working here??? get_output_header_line() fails. formulation->write_output("Time Step,""Time,"+formulation->get_output_header_line(",")+"\n"); + + // get the catchment layer from the hydro fabric + const auto& cat_json_node = linked_hydro_fabric->get_feature(feat_id); + long lyr = cat_json_node->has_key("layer") ? cat_json_node->get_property("layer").as_natural_number() : 0; + + // add this layer to the set of layers if needed + if (hf_layers.find(lyr) == hf_layers.end() ) + { + hf_layers.insert(lyr); + } + //Create the HY_Catchment with the formulation realization std::shared_ptr c = std::make_shared( - HY_Catchment(feat_id, origins, destinations, formulation) + HY_Catchment(feat_id, origins, destinations, formulation, lyr) ); _catchments.emplace(feat_id, c); diff --git a/src/core/SurfaceLayer.cpp b/src/core/SurfaceLayer.cpp new file mode 100644 index 0000000000..3eec688fa8 --- /dev/null +++ b/src/core/SurfaceLayer.cpp @@ -0,0 +1,53 @@ +#include "SurfaceLayer.hpp" + +/*** + * @breif Run one simulation timestep for each model in this layer, then gather catchment output +*/ + +void ngen::SurfaceLayer::update_models() +{ + long current_time_index = output_time_index; + + Layer::update_models(); + + //At this point, could make an internal routing pass, extracting flows from nexuses and routing + //across the flowpath to the next nexus. + //Once everything is updated for this timestep, dump the nexus output + for(const auto& id : features.nexuses()) + { + std::string current_timestamp = simulation_time.get_timestamp(current_time_index); + + #ifdef NGEN_MPI_ACTIVE + if (!features.is_remote_sender_nexus(id)) { //Ensures only one side of the dual sided remote nexus actually doing this... + #endif + + //Get the correct "requesting" id for downstream_flow + const auto& nexus = features.nexus_at(id); + const auto& cat_ids = nexus->get_receiving_catchments(); + std::string cat_id; + if( cat_ids.size() > 0 ) { + //Assumes dendridic, e.g. only a single downstream...it will consume 100% of the available flow + cat_id = cat_ids[0]; + } + else { + //This is a terminal node, SHOULDN'T be remote, so ID shouldn't matter too much + cat_id = "terminal"; + } + + //std::cerr << "Requesting water from nexus, id = " << id << " at time = " <get_id(); + if( this->descriptor_map.find( feature_id ) == this->descriptor_map.end() ) { //Haven't visited this feature yet, add it to graph @@ -43,6 +44,20 @@ Network::Network( geojson::GeoJSON fabric ){ else{ v1 = this->descriptor_map[ feature_id]; } + + if ( this->layer_map.find(feature_id) == this->layer_map.end() ) + { + if ( feature->has_property("layer") ) + { + const auto& prop = feature->get_property("layer"); + this->layer_map.emplace( feature_id, prop.as_natural_number() ); + } + else + { + this->layer_map.emplace( feature_id, DEFAULT_LAYER_ID); + } + } + //Add the downstream features/edges for( auto& downstream: feature->destination_features() ) { diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 9729b0304b..b050239c1c 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -174,6 +174,22 @@ ngen_add_test( # NGEN_WITH_MPI ) +########################## MultiLayer Tests +ngen_add_test( + test_multilayer + OBJECTS + core/multilayer/MultiLayerParserTest.cpp + LIBRARIES + NGen::core + NGen::geojson + NGen::realizations_catchment + NGen::core_mediator + NGen::forcing + REQUIRES + NGEN_WITH_NETCDF +) + + ########################## BMI C++ Tests ngen_add_test( test_bmi_cpp @@ -375,6 +391,7 @@ ngen_add_test( core/mediator/UnitsHelper_Tests.cpp realizations/Formulation_Manager_Test.cpp core/nexus/NexusTests.cpp + core/multilayer/MultiLayerParserTest.cpp utils/Partition_Test.cpp utils/mdarray_Test.cpp utils/mdframe_Test.cpp diff --git a/test/core/multilayer/MultiLayerParserTest.cpp b/test/core/multilayer/MultiLayerParserTest.cpp new file mode 100644 index 0000000000..1ce12aae5a --- /dev/null +++ b/test/core/multilayer/MultiLayerParserTest.cpp @@ -0,0 +1,61 @@ + +#include "gtest/gtest.h" +#include + +class MultiLayerParserTest : public ::testing::Test { + protected: + + MultiLayerParserTest() : + nexus_data_path("./data/nexus_data.geojson"), + catchment_data_path("./data/catchment_data_multilayer.geojson"), + realization_config_path("./data/example_multilayer_realization_config.json") + { + + } + + ~MultiLayerParserTest() override { + + } + + void SetUp() override { + nexus_collection = geojson::read(nexus_data_path.c_str()); + std::cout << "Building Catchment collection" << std::endl; + + catchment_collection = geojson::read(catchment_data_path.c_str()); + + // add the catchments to the nexus collection + for(auto& feature: *catchment_collection) + { + nexus_collection->add_feature(feature); + } + } + + void TearDown() override { + + } + + geojson::GeoJSON nexus_collection; + geojson::GeoJSON catchment_collection; + std::shared_ptr manager; + + std::string nexus_data_path; + std::string catchment_data_path; + std::string realization_config_path; + + +}; + +TEST_F(MultiLayerParserTest, TestInit0) +{ + manager = std::make_shared(realization_config_path.c_str()); + + ASSERT_TRUE(true); +} + +TEST_F(MultiLayerParserTest, TestRead0) +{ + manager = std::make_shared(realization_config_path.c_str()); + manager->read(catchment_collection, utils::getStdOut()); + + ASSERT_TRUE(true); +} \ No newline at end of file diff --git a/test/simulation_time/Simulation_Time_Test.cpp b/test/simulation_time/Simulation_Time_Test.cpp index 6e2951356b..aab9efc77b 100644 --- a/test/simulation_time/Simulation_Time_Test.cpp +++ b/test/simulation_time/Simulation_Time_Test.cpp @@ -1,5 +1,5 @@ #include "gtest/gtest.h" -#include "Simulation_Time.h" +#include "Simulation_Time.hpp" #include #include #include @@ -70,4 +70,55 @@ TEST_F(SimulationTimeTest, TestSimulationTime) } +TEST_F(SimulationTimeTest, TestSimTimeNextIndex) +{ + simulation_time_params other_stp("2015-12-14 21:00:00", "2015-12-30 23:00:00", 3600); + + int next_index; + + // for 2.5h in the future + next_index = Simulation_Time_Object1->next_timestep_index(other_stp.start_t + (3600 * 2.5)); + + EXPECT_EQ(2, next_index); + + // for 2.0h in the future + next_index = Simulation_Time_Object1->next_timestep_index(other_stp.start_t + (3600 * 2.00)); + + EXPECT_EQ(2, next_index); + +} + +TEST_F(SimulationTimeTest, TestSimTimeNextEpochTime) +{ + simulation_time_params other_stp("2015-12-14 21:00:00", "2015-12-30 23:00:00", 3600); + + int next_time; + + // for 2.5h in the future + next_time = Simulation_Time_Object1->next_timestep_epoch_time(other_stp.start_t + (3600 * 2.5)); + + EXPECT_EQ(other_stp.start_t + (3600 * 2.0), next_time); + + // for 2.0h in the future + next_time = Simulation_Time_Object1->next_timestep_epoch_time(other_stp.start_t + (3600 * 2.00)); + + EXPECT_EQ(other_stp.start_t + (3600 * 2.0), next_time); + +} + +TEST_F(SimulationTimeTest, TestSimTimeDiff) +{ + simulation_time_params other_stp("2015-12-14 23:00:00", "2015-12-30 23:00:00", 3600); + Simulation_Time other_st(other_stp); + int diff; + + diff = other_st.diff(*Simulation_Time_Object1); + + EXPECT_EQ(7200, diff); + + diff = Simulation_Time_Object1->diff(other_st); + + EXPECT_EQ(-7200, diff); + +}