diff --git a/.gitignore b/.gitignore index ba74660..127e341 100644 --- a/.gitignore +++ b/.gitignore @@ -55,3 +55,10 @@ docs/_build/ # PyBuilder target/ + +#other +*~ +*.DS_Store + +# pycharm +.idea/ diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..05eb018 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,116 @@ +#******************************************************************************* +#.travis.yml +#******************************************************************************* + +#Purpose: +#Travis CI is a hosted continuous integration service, that is, it allows +#running code directly from a repository and checking that the code acts as +#expected. The purpose of the .travis.yml file is to give instructions to Travis +#CI on how to do the work. +#Authors: +#Alan D. Snow, 2016, based on initial .yml file by Cedric H. David + +#******************************************************************************* +#System specifications for Travis CI +#******************************************************************************* +language: c +os: + - linux + - osx +env: + - TRAVIS_PYTHON_VERSION="2.7" + - TRAVIS_PYTHON_VERSION="3.5" +matrix: + fast_finish: true + allow_failures: + - os: osx +notifications: + email: false + +#******************************************************************************* +#Before installing RAPIDpy +#******************************************************************************* +before_install: +- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then + sudo apt-get update -qq; + sudo apt-get install -y g++ gfortran; + fi +- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then + brew update; + brew install gcc; + fi + +#------------------------------------------------------------------------------- +#Add miniconda - from https://gist.github.com/dan-blanchard/7045057 +#----------------------------------------------------------------------------- + +- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then + wget http://repo.continuum.io/miniconda/Miniconda${TRAVIS_PYTHON_VERSION:0:1}-latest-Linux-x86_64.sh -O miniconda.sh; + fi +- if [[ "$TRAVIS_OS_NAME" == "osx" ]]; then + curl -o miniconda.sh https://repo.continuum.io/miniconda/Miniconda${TRAVIS_PYTHON_VERSION:0:1}-latest-MacOSX-x86_64.sh; + fi +- chmod +x miniconda.sh +- ./miniconda.sh -b -p $HOME/miniconda +- export PATH=$HOME/miniconda/bin:$PATH +- conda update --yes conda python +#create environment in conda +- conda create --yes --name rapid python=$TRAVIS_PYTHON_VERSION +- source activate rapid + +#----------------------------------------------------------------------------- +# Install required python packages +#----------------------------------------------------------------------------- +- conda config --add channels conda-forge +- conda install --yes cmake gdal future netcdf4 numpy pandas pangaea pyproj pytz requests rtree scipy shapely +- conda install --yes pytest-cov +- pip install coveralls +- source deactivate rapid + +#------------------------------------------------------------------------------- +#Creating directory for installation of libraries used by RAPID & RAPIDpy +#------------------------------------------------------------------------------- +- export INSTALLZ_DIR=$TRAVIS_BUILD_DIR/installz +- mkdir $INSTALLZ_DIR + +#------------------------------------------------------------------------------- +#Installing RAPID +#------------------------------------------------------------------------------- +- cd $TRAVIS_BUILD_DIR/.. +- git clone https://github.com/c-h-david/rapid.git --branch 20161221 +- cd rapid +# Installing RAPID Prereqs +- chmod +x rapid_install_prereqs.sh +- ./rapid_install_prereqs.sh -i=$INSTALLZ_DIR +- source ./rapid_specify_varpath.sh $INSTALLZ_DIR +# Building RAPID +- cd src +- make rapid + +#------------------------------------------------------------------------------- +#Installing TauDEM +#------------------------------------------------------------------------------- +- cd $TRAVIS_BUILD_DIR/.. +- git clone https://github.com/dtarb/TauDEM.git +- cd TauDEM/src +- rm makefile +# use conda gdal for build +- source activate rapid +- cmake . +- make + +#******************************************************************************* +#Installing RAPIDpy +#******************************************************************************* +install: +- cd $TRAVIS_BUILD_DIR +- python setup.py install +#******************************************************************************* +#Testing RAPIDpy +#******************************************************************************* +- cd $TRAVIS_BUILD_DIR/tests +script: +- py.test --cov-report term-missing --cov=RAPIDpy +##ADD Coveralls stats for code coverage +after_success: +- coveralls diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..a401902 --- /dev/null +++ b/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) 2016, ERDC Computational Mechanics +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of RAPIDpy nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 0000000..c1a7121 --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1,2 @@ +include LICENSE +include README.md diff --git a/RAPIDpy/__init__.py b/RAPIDpy/__init__.py new file mode 100644 index 0000000..f2e54c7 --- /dev/null +++ b/RAPIDpy/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- +from .rapid import RAPID +from .dataset import RAPIDDataset \ No newline at end of file diff --git a/RAPIDpy/dataset.py b/RAPIDpy/dataset.py new file mode 100644 index 0000000..87bd4d8 --- /dev/null +++ b/RAPIDpy/dataset.py @@ -0,0 +1,1089 @@ +# -*- coding: utf-8 -*- +'''RAPIDDataset docstrings + +''' +## +# dataset.py +# RAPIDpy +# +# Created by Alan D Snow. +# Copyright © 2016 Alan D Snow. All rights reserved. +# BSD 3-Clause + +from csv import writer as csv_writer +import datetime +from netCDF4 import Dataset, num2date +import numpy as np +from numpy.ma import masked +import pandas as pd +from past.builtins import xrange +from pytz import utc +# local import +from .helper_functions import log, open_csv + + +# ------------------------------------------------------------------------------ +# Helper Function +# ------------------------------------------------------------------------------ +def compare_qout_files(dataset1_path, dataset2_path, Qout_var="Qout"): + """ + This function compares the output of RAPID Qout and tells you where + they are different. + """ + qout_same = False + + d1 = RAPIDDataset(dataset1_path) + d2 = RAPIDDataset(dataset2_path) + + if len(d1.get_river_id_array()) != len(d2.get_river_id_array()): + log("Length of COMID/rivid input not the same.", + "ERROR") + + if not (d1.get_river_id_array() == d2.get_river_id_array()).all(): + log("COMID/rivid order is different in each dataset." + " Reordering data for comparison.", + "WARNING") + + d2_reordered_river_index_list = [] + for rivid in d1.get_river_id_array(): + reordered_index = np.where(d2.get_river_id_array() == rivid)[0][0] + d2_reordered_river_index_list.append(reordered_index) + d2_reordered_qout = d2.get_qout_index(d2_reordered_river_index_list) + else: + d2_reordered_qout = d2.get_qout() + + # get where the files are different + d1_qout = d1.get_qout() + where_diff = np.where(d1_qout != d2_reordered_qout) + un_where_diff = np.unique(where_diff[0]) + + # if different, check to see how different + if un_where_diff.any(): + decimal_test = 7 + while decimal_test > 0: + try: + np.testing.assert_almost_equal(d1_qout, + d2_reordered_qout, + decimal=decimal_test) + log("ALMOST EQUAL to {0} decimal places.".format(decimal_test), + "INFO") + qout_same = True + decimal_test = -1 + except AssertionError as ex: + if decimal_test <= 1: + print(ex) + decimal_test -= 1 + pass + log("Number of different timeseries: {0}".format(len(un_where_diff)), + "INFO") + log("COMID idexes where different: {0}".format(un_where_diff), + "INFO") + log("COMID idexes where different: {0}".format(un_where_diff), + "INFO") + index = un_where_diff[0] + log("Dataset 1 example. COMID index: " + "{0}".format(d1.get_qout_index(index)), + "INFO") + log("Dataset 2 example. COMID index: " + "{0}".format(d2_reordered_qout[index, :]), + "INFO") + + else: + qout_same = True + log("Output Qout data is the same.", + "INFO") + + d1.close() + d2.close() + return qout_same + + +# ------------------------------------------------------------------------------ +# Main Dataset Manager Class +# ------------------------------------------------------------------------------ +class RAPIDDataset(object): + """ + This class is designed to access data from the RAPID Qout + NetCDF file. + + Attributes: + filename(str): Path to the RAPID Qout NetCDF file. + river_id_dimension(Optional[str]): Name of the river ID dimension. Default is to search through a standard list. + river_id_variable(Optional[str]): Name of the river ID variable. Default is to search through a standard list. + streamflow_variable(Optional[str]): Name of the streamflow varaible. Default is to search through a standard list. + datetime_simulation_start(Optional[datetime]): This is a datetime object with the date of the simulation start time. + simulation_time_step_seconds(Optional[integer]): This is the time step of the simulation output in seconds. + out_tzinfo(Optional[tzinfo]): Time zone to output data as. The dates will be converted from UTC to the time zone input. Default is UTC. + + Example:: + + from RAPIDpy import RAPIDDataset + + path_to_rapid_qout = '/path/to/Qout.nc' + with RAPIDDataset(path_to_rapid_qout) as qout_nc: + #USE FUNCTIONS TO ACCESS DATA HERE + + """ + + def __init__(self, filename, + river_id_dimension="", + river_id_variable="", + streamflow_variable="", + datetime_simulation_start=None, + simulation_time_step_seconds=None, + out_tzinfo=None): + """ + Initialize the class with variables given by the user + """ + self.qout_nc = Dataset(filename, mode='r') + + # determine river ID dimension + self.river_id_dimension = river_id_dimension + if not river_id_dimension: + if 'rivid' in self.qout_nc.dimensions: + self.river_id_dimension = 'rivid' + elif 'COMID' in self.qout_nc.dimensions: + self.river_id_dimension = 'COMID' + elif 'station' in self.qout_nc.dimensions: + self.river_id_dimension = 'station' + elif 'DrainLnID' in self.qout_nc.dimensions: + self.river_id_dimension = 'DrainLnID' + elif 'FEATUREID' in self.qout_nc.dimensions: + self.river_id_dimension = 'FEATUREID' + else: + raise IndexError('ERROR: Could not find river ID dimension.') + elif river_id_dimension not in self.qout_nc.dimensions: + raise IndexError('ERROR: Could not find river ID dimension:' + ' {0}.'.format(river_id_dimension)) + + self.size_river_id = len(self.qout_nc + .dimensions[self.river_id_dimension]) + + variable_keys = self.qout_nc.variables.keys() + + # determine streamflow variable + self.q_var_name = streamflow_variable + if not streamflow_variable: + if 'Qout' in variable_keys: + self.q_var_name = 'Qout' + elif 'streamflow' in variable_keys: + self.q_var_name = 'streamflow' + elif 'm3_riv' in variable_keys: + self.q_var_name = 'm3_riv' + else: + raise IndexError('ERROR: Could not find flow variable.' + ' Looked for Qout, streamflow, and m3_riv.') + elif streamflow_variable not in variable_keys: + raise IndexError('ERROR: Could not find flow variable.' + ' Looked for {0}.'.format(streamflow_variable)) + + self.size_q_var = len(self.qout_nc.variables[self.q_var_name]) + + # determine time dimension + if 'time' in self.qout_nc.dimensions: + self.size_time = len(self.qout_nc.dimensions['time']) + elif 'Time' in self.qout_nc.dimensions: + self.size_time = len(self.qout_nc.dimensions['Time']) + else: + raise IndexError('ERROR: Could not find time dimension.') + + # determine river ID variable + self.river_id_variable = river_id_variable + if not river_id_variable: + if 'rivid' in variable_keys: + self.river_id_variable = 'rivid' + elif 'COMID' in variable_keys: + self.river_id_variable = 'COMID' + elif 'station_id' in variable_keys: + self.river_id_variable = 'station_id' + elif 'DrainLnID' in variable_keys: + self.river_id_variable = 'DrainLnID' + elif 'FEATUREID' in variable_keys: + self.river_id_variable = 'FEATUREID' + else: + print('WARNING: Could not find river ID variable' + ' in {0}.'.format(variable_keys)) + elif river_id_variable not in variable_keys: + print('WARNING: Could not find river ID variable:' + ' {0}.'.format(river_id_variable)) + + self.out_tzinfo = out_tzinfo + self.datetime_simulation_start = datetime_simulation_start + self.simulation_time_step_seconds = simulation_time_step_seconds + + def __enter__(self): + return self + + def __exit__(self, exc_type, exc_value, traceback): + self.close() + + def close(self): + self.qout_nc.close() + + def _is_legacy_time_valid(self): + """ + This determines whether or not legacy time is set correctly + """ + return self.datetime_simulation_start is not None and \ + self.simulation_time_step_seconds is not None + + def is_time_variable_valid(self): + """ + This function returns whether or not the time variable + is valid. + + Returns: + boolean: True if the time variable is valid, otherwise false. + + Example:: + + from RAPIDpy import RAPIDDataset + + path_to_rapid_qout = '/path/to/Qout.nc' + with RAPIDDataset(path_to_rapid_qout) as qout_nc: + if qout_nc.is_time_variable_valid(): + #DO WORK HERE + """ + time_var_valid = False + if 'time' in self.qout_nc.variables.keys(): + if len(self.qout_nc.dimensions['time']) > 0: + if not (self.qout_nc.variables['time'][:] == masked).any(): + try: + timestep = (datetime.datetime + .utcfromtimestamp( + self.qout_nc.variables['time'][1] + ) - + datetime.datetime + .utcfromtimestamp( + self.qout_nc.variables['time'][0] + )).total_seconds() + if timestep > 0: + time_var_valid = True + except ValueError: + pass + + return time_var_valid + + def get_time_array(self, + datetime_simulation_start=None, + simulation_time_step_seconds=None, + return_datetime=False, + time_index_array=None): + """ + This method extracts or generates an array of time. + The new version of RAPID output has the time array stored. + However, the old version requires the user to know when the + simulation began and the time step of the output. + + Parameters: + return_datetime(Optional[boolean]): If true, it converts the data to a list of datetime objects. Default is False. + time_index_array(Optional[list or np.array]): This is used to extract the datetime vales. This can be from the *get_time_index_range* function. + + Returns: + list: An array of integers representing seconds since Jan 1, 1970 UTC or datetime objects if return_datetime is set to True. + + These examples demonstrates how to retrieve or generate a time array + to go along with your RAPID streamflow series. + + CF-Compliant Qout File Example: + + .. code:: python + + from RAPIDpy import RAPIDDataset + + path_to_rapid_qout = '/path/to/Qout.nc' + with RAPIDDataset(path_to_rapid_qout) as qout_nc: + #retrieve integer timestamp array + time_array = qout_nc.get_time_array() + + #or, to get datetime array + time_datetime = qout_nc.get_time_array(return_datetime=True) + + + Legacy Qout File Example: + + .. code:: python + + from RAPIDpy import RAPIDDataset + + path_to_rapid_qout = '/path/to/Qout.nc' + with RAPIDDataset(path_to_rapid_qout, + datetime_simulation_start=datetime_simulation_start, + simulation_time_step_seconds=simulation_time_step_seconds) as qout_nc: + + #retrieve integer timestamp array + time_array = qout_nc.get_time_array() + + #or, to get datetime array + time_datetime = qout_nc.get_time_array(return_datetime=True) + + """ + # Original Qout file + if datetime_simulation_start is not None: + self.datetime_simulation_start = datetime_simulation_start + if simulation_time_step_seconds is not None: + self.simulation_time_step_seconds = simulation_time_step_seconds + + time_array = [] + + epoch = datetime.datetime(1970, 1, 1, tzinfo=utc) + time_units = "seconds since {0}".format(epoch) + + # CF-1.6 compliant file + if self.is_time_variable_valid(): + time_array = self.qout_nc.variables['time'][:] + if self.qout_nc.variables['time'].units: + time_units = self.qout_nc.variables['time'].units + + # Original Qout file + elif self._is_legacy_time_valid(): + initial_time_seconds = ((self.datetime_simulation_start + .replace(tzinfo=utc) - epoch) + .total_seconds() + + self.simulation_time_step_seconds) + final_time_seconds = (initial_time_seconds + + self.size_time * + self.simulation_time_step_seconds) + time_array = np.arange(initial_time_seconds, + final_time_seconds, + self.simulation_time_step_seconds) + else: + raise Exception("ERROR: This file does not contain the time" + " variable. To get time array, add" + " datetime_simulation_start and" + " simulation_time_step_seconds") + + if time_index_array is not None: + time_array = time_array[time_index_array] + + if return_datetime: + time_array = num2date(time_array, time_units) + + if self.out_tzinfo is not None: + for i in xrange(len(time_array)): + # convert time to output timezone + time_array[i] = utc.localize(time_array[i]) \ + .astimezone(self.out_tzinfo) \ + .replace(tzinfo=None) + + return time_array + + def get_time_index_range(self, + date_search_start=None, + date_search_end=None, + time_index_start=None, + time_index_end=None, + time_index=None): + """ + Generates a time index range based on time bounds given. + This is useful for subset data extraction. + + Parameters: + date_search_start(Optional[datetime]): This is a datetime object with the date of the minimum date for starting. + date_search_end(Optional[datetime]): This is a datetime object with the date of the maximum date for ending. + time_index_start(Optional[int]): This is the index of the start of the time array subset. Useful for the old file version. + time_index_end(Optional[int]): This is the index of the end of the time array subset. Useful for the old file version. + time_index(Optional[int]): This is the index of time to return in the case that your code only wants one index. Used internally. + + Returns: + index_array: This is an array used to extract a subset of data. + + CF-Compliant Qout File Example: + + .. code:: python + + from datetime import datetime + from RAPIDpy import RAPIDDataset + + path_to_rapid_qout = '/path/to/Qout.nc' + with RAPIDDataset(path_to_rapid_qout) as qout_nc: + time_index_range = qout_nc.get_time_index_range(date_search_start=datetime(1980, 1, 1), + date_search_end=datetime(1980, 12, 11)) + + + Legacy Qout File Example: + + .. code:: python + + from datetime import datetime + from RAPIDpy import RAPIDDataset + + path_to_rapid_qout = '/path/to/Qout.nc' + with RAPIDDataset(path_to_rapid_qout, + datetime_simulation_start=datetime(1980, 1, 1), + simulation_time_step_seconds=3600) as qout_nc: + + time_index_range = qout_nc.get_time_index_range(date_search_start=datetime(1980, 1, 1), + date_search_end=datetime(1980, 12, 11)) + """ + # get the range of time based on datetime range + time_range = None + if ((self.is_time_variable_valid() or self._is_legacy_time_valid()) and + (date_search_start is not None or + date_search_end is not None)): + + print("Determining time range ({0} to {1})" + "...".format(date_search_start, date_search_end)) + time_array = self.get_time_array() + if date_search_start is not None: + date_search_start_utc = date_search_start + if self.out_tzinfo is not None: + date_search_start_utc = self.out_tzinfo \ + .localize(date_search_start) \ + .astimezone(utc) \ + .replace(tzinfo=None) + seconds_start = (date_search_start_utc - + datetime.datetime(1970, 1, 1)).total_seconds() + time_range = np.where(time_array >= seconds_start)[0] + + if date_search_end is not None: + date_search_end_utc = date_search_end + if self.out_tzinfo is not None: + date_search_end_utc = self.out_tzinfo \ + .localize(date_search_end) \ + .astimezone(utc) \ + .replace(tzinfo=None) + + seconds_end = (date_search_end_utc - + datetime.datetime(1970, 1, 1)).total_seconds() + if time_range is not None: + time_range = np.intersect1d(time_range, + np.where(time_array <= + seconds_end)[0]) + else: + time_range = np.where(time_array <= seconds_end)[0] + + # get the range of time based on time index range + elif time_index_start is not None or time_index_end is not None: + if time_index_start is None: + time_index_start = 0 + if time_index_end is None: + time_index_end = self.size_time + time_range = range(time_index_start, time_index_end) + + # get only one time step + elif time_index is not None: + time_range = [time_index] + # return all + else: + time_range = range(self.size_time) + + return time_range + + def get_river_id_array(self): + """ + This method returns the river ID array for this file. + + Returns: + numpy.array: An array of the river ID's + + Example:: + + from RAPIDpy import RAPIDDataset + + path_to_rapid_qout = '/path/to/Qout.nc' + with RAPIDDataset(path_to_rapid_qout) as qout_nc: + river_ids = qout_nc.get_river_id_array() + + """ + return self.qout_nc.variables[self.river_id_variable][:] + + def get_river_index(self, river_id): + """ + This method retrieves the river index in the netCDF + dataset corresponding to the river ID. + + Returns: + int: The index of the river ID's in the file + + Example:: + + from RAPIDpy import RAPIDDataset + + path_to_rapid_qout = '/path/to/Qout.nc' + river_id = 53458 + + with RAPIDDataset(path_to_rapid_qout) as qout_nc: + river_index = qout_nc.get_river_index(river_id) + """ + try: + return np.where(self.get_river_id_array() == river_id)[0][0] + except IndexError: + raise IndexError("ERROR: River ID {0} not found in dataset " + "...".format(river_id)) + + def get_subset_riverid_index_list(self, river_id_list): + """ + Gets the subset riverid_list from the netcdf file + Optional returns include the list of valid river ids in the dataset + as well as a list of missing rive rids + """ + netcdf_river_indices_list = [] + valid_river_ids = [] + missing_river_ids = [] + for river_id in river_id_list: + # get where streamids are in netcdf file + try: + netcdf_river_indices_list \ + .append(self.get_river_index(river_id)) + valid_river_ids.append(river_id) + except IndexError: + print("WARNING: ReachID {0} not found in netCDF dataset." + " Skipping ...".format(river_id)) + missing_river_ids.append(river_id) + pass + + np_valid_river_indices_list = np.array(netcdf_river_indices_list) + np_valid_river_ids = np.array(valid_river_ids) + sorted_indexes = np.argsort(np_valid_river_indices_list) + + return(np_valid_river_indices_list[sorted_indexes], + np_valid_river_ids[sorted_indexes], + np.array(missing_river_ids)) + + def get_qout(self, river_id_array=None, + date_search_start=None, + date_search_end=None, + time_index_start=None, + time_index_end=None, + time_index=None, + time_index_array=None, + daily=False, + pd_filter=None, + daily_mode="mean"): + """ + This method extracts streamflow data by a single river ID + or by a river ID array. It has options to extract by date + or by date index. + + Parameters: + river_id_array(Optional[list or int]): A single river ID or an array of river IDs. + date_search_start(Optional[datetime]): This is a datetime object with the date of the minimum date for starting. + date_search_end(Optional[datetime]): This is a datetime object with the date of the maximum date for ending. + time_index_start(Optional[int]): This is the index of the start of the time array subset. Useful for the old file version. + time_index_end(Optional[int]): This is the index of the end of the time array subset. Useful for the old file version. + time_index(Optional[int]): This is the index of time to return in the case that your code only wants one index. Used internally. + time_index_array(Optional[list or np.array]): This is used to extract the vales only for particular dates. This can be from the *get_time_index_range* function. + daily(Optional[bool]): If true, this will convert qout to daily average. + pd_filter(Optional[str]): This is a valid pandas resample frequency filter. + filter_mode(Optional[str]): You can get the daily average "mean" or the maximum "max". Default is "mean". + + Returns: + numpy.array: This is a 1D or 2D array or a single value depending on your input search. + + This example demonstrates how to retrieve the streamflow associated + with the reach you are interested in:: + + from RAPIDpy import RAPIDDataset + + path_to_rapid_qout = '/path/to/Qout.nc' + river_id = 500 + with RAPIDDataset(path_to_rapid_qout) as qout_nc: + streamflow_array = qout_nc.get_qout(river_id) + + This example demonstrates how to retrieve the streamflow within a date + range associated with the reach you are interested in:: + + from RAPIDpy import RAPIDDataset + + path_to_rapid_qout = '/path/to/Qout.nc' + river_id = 500 + with RAPIDDataset(path_to_rapid_qout) as qout_nc: + streamflow_array = qout_nc.get_qout(river_id, + date_search_start=datetime(1985,1,1), + date_search_end=datetime(1985,2,4)) + + """ + # get indices of where the streamflow data is + riverid_index_list_subset = None + if river_id_array is not None: + if not hasattr(river_id_array, "__len__"): + river_id_array = [river_id_array] + riverid_index_list_subset = \ + self.get_subset_riverid_index_list(river_id_array)[0] + + return self.get_qout_index(riverid_index_list_subset, + date_search_start, + date_search_end, + time_index_start, + time_index_end, + time_index, + time_index_array, + daily, + pd_filter, + daily_mode) + + def get_qout_index(self, river_index_array=None, + date_search_start=None, + date_search_end=None, + time_index_start=None, + time_index_end=None, + time_index=None, + time_index_array=None, + daily=False, + pd_filter=None, + filter_mode="mean"): + """ + This method extracts streamflow data by river index + It allows for extracting single or multiple river streamflow arrays + It has options to extract by date or by date index + """ + if river_index_array is not None: + if hasattr(river_index_array, "__len__"): + if len(river_index_array) == 1: + river_index_array = river_index_array[0] + + if time_index_array is None: + time_index_array = self.get_time_index_range(date_search_start, + date_search_end, + time_index_start, + time_index_end, + time_index) + + qout_variable = self.qout_nc.variables[self.q_var_name] + qout_dimensions = qout_variable.dimensions + streamflow_array = [] + if qout_dimensions[0].lower() == 'time' and \ + qout_dimensions[1].lower() == self.river_id_dimension.lower(): + if time_index_array is not None and river_index_array is not None: + streamflow_array = qout_variable[time_index_array, + river_index_array].transpose() + elif time_index_array is not None: + streamflow_array = qout_variable[time_index_array, :] \ + .transpose() + elif river_index_array is not None: + streamflow_array = qout_variable[:, river_index_array] \ + .transpose() + else: + streamflow_array = qout_variable[:].transpose() + elif qout_dimensions[1].lower() == 'time' and \ + qout_dimensions[0].lower() == self.river_id_dimension.lower(): + if time_index_array is not None and river_index_array is not None: + streamflow_array = qout_variable[river_index_array, + time_index_array] + elif time_index_array is not None: + streamflow_array = qout_variable[:, time_index_array] + elif river_index_array is not None: + streamflow_array = qout_variable[river_index_array, :] + else: + streamflow_array = qout_variable[:] + else: + raise Exception("Invalid RAPID Qout file dimensions ...") + + if daily: + pd_filter = "D" + + if pd_filter is not None: + time_array = self.get_time_array(return_datetime=True, + time_index_array=time_index_array) + df = pd.DataFrame(streamflow_array.T, index=time_array) \ + .resample(pd_filter) + if filter_mode == "mean": + df = df.mean() + elif filter_mode == "max": + df = df.max() + else: + raise Exception("Invalid filter_mode ...") + + streamflow_array = df.as_matrix().T + + if streamflow_array.ndim > 0 and streamflow_array.shape[0] == 1: + streamflow_array = streamflow_array[0] + + return streamflow_array + + def write_flows_to_csv(self, path_to_output_file, + river_index=None, + river_id=None, + date_search_start=None, + date_search_end=None, + daily=False, + mode="mean"): + """ + Write out RAPID output to CSV file. + + .. note:: Need either *reach\_id* or *reach\_index* parameter, + but either can be used. + + Parameters: + path_to_output_file(str): Path to the output csv file. + river_index(Optional[datetime]): This is the index of the river in the file you want the streamflow for. + river_id(Optional[datetime]): This is the river ID that you want the streamflow for. + date_search_start(Optional[datetime]): This is a datetime object with the date of the minimum date for starting. + date_search_end(Optional[datetime]): This is a datetime object with the date of the maximum date for ending. + daily(Optional[boolean]): If True and the file is CF-Compliant, write out daily flows. + mode(Optional[str]): You can get the daily average "mean" or the maximum "max". Defauls is "mean". + + Example writing entire time series to file: + + .. code:: python + + from RAPIDpy import RAPIDDataset + + river_id = 3624735 + path_to_rapid_qout = '/path/to/Qout.nc' + + with RAPIDDataset(path_to_rapid_qout) as qout_nc: + #for writing entire time series to file + qout_nc.write_flows_to_csv('/timeseries/Qout_3624735.csv', + river_id=river_id, + ) + + + #if file is CF compliant, you can write out daily average + + #NOTE: Getting the river index is not necessary + #this is just an example of how to use this + river_index = qout_nc.get_river_index(river_id) + qout_nc.write_flows_to_csv('/timeseries/Qout_daily.csv', + river_index=river_index, + daily=True, + ) + + Example writing entire time series as daily average to file: + + .. code:: python + + from RAPIDpy import RAPIDDataset + + river_id = 3624735 + path_to_rapid_qout = '/path/to/Qout.nc' + + with RAPIDDataset(path_to_rapid_qout) as qout_nc: + #NOTE: Getting the river index is not necessary + #this is just an example of how to use this + river_index = qout_nc.get_river_index(river_id) + + #if file is CF compliant, you can write out daily average + qout_nc.write_flows_to_csv('/timeseries/Qout_daily.csv', + river_index=river_index, + daily=True, + ) + + Example writing entire time series as daily average to file: + + .. code:: python + + from datetime import datetime + from RAPIDpy import RAPIDDataset + + river_id = 3624735 + path_to_rapid_qout = '/path/to/Qout.nc' + + with RAPIDDataset(path_to_rapid_qout) as qout_nc: + # if file is CF compliant, you can filter by date + qout_nc.write_flows_to_csv('/timeseries/Qout_daily_date_filter.csv', + river_id=river_id, + daily=True, + date_search_start=datetime(2002, 8, 31), + date_search_end=datetime(2002, 9, 15), + mode="max" + ) + """ + if river_id is not None: + river_index = self.get_river_index(river_id) + elif river_id is None and river_index is None: + raise Exception("ERROR: Need reach id or reach index ...") + + # analyze and write + if self.is_time_variable_valid() or self._is_legacy_time_valid(): + time_index_range = \ + self.get_time_index_range(date_search_start=date_search_start, + date_search_end=date_search_end) + + qout_arr = self.get_qout_index(river_index, + time_index_array=time_index_range) + time_array = self.get_time_array(time_index_array=time_index_range, + return_datetime=True) + + df = pd.DataFrame(qout_arr.T, index=time_array) + + if daily: + df = df.resample('D') + if mode == "mean": + df = df.mean() + elif mode == "max": + df = df.max() + else: + raise Exception("Invalid mode ...") + + df.to_csv(path_to_output_file, header=False) + + else: + print("Valid time variable not found. Printing values only ...") + qout_arr = self.get_qout_index(river_index) + with open_csv(path_to_output_file, 'w') as outcsv: + writer = csv_writer(outcsv) + for index in xrange(len(qout_arr)): + writer.writerow([index, "{0:.5f}".format(qout_arr[index])]) + + def write_flows_to_gssha_time_series_xys(self, + path_to_output_file, + series_name, + series_id, + river_index=None, + river_id=None, + date_search_start=None, + date_search_end=None, + daily=False, + mode="mean"): + """ + Write out RAPID output to GSSHA WMS time series xys file. + + Parameters: + path_to_output_file(str): Path to the output xys file. + series_name(str): The name for the series. + series_id(int): The ID to give the series. + river_index(Optional[datetime]): This is the index of the river in the file you want the streamflow for. + river_id(Optional[datetime]): This is the river ID that you want the streamflow for. + date_search_start(Optional[datetime]): This is a datetime object with the date of the minimum date for starting. + date_search_end(Optional[datetime]): This is a datetime object with the date of the maximum date for ending. + daily(Optional[boolean]): If True and the file is CF-Compliant, write out daily flows. + mode(Optional[str]): You can get the daily average "mean" or the maximum "max". Defauls is "mean". + + Example writing entire time series to file: + + .. code:: python + + from RAPIDpy import RAPIDDataset + + river_id = 3624735 + path_to_rapid_qout = '/path/to/Qout.nc' + + with RAPIDDataset(path_to_rapid_qout) as qout_nc: + qout_nc.write_flows_to_gssha_time_series_xys('/timeseries/Qout_3624735.xys', + series_name="RAPID_TO_GSSHA_{0}".format(river_id), + series_id=34, + river_id=river_id, + ) + + Example writing entire time series as daily average to file: + + .. code:: python + + from RAPIDpy import RAPIDDataset + + river_id = 3624735 + path_to_rapid_qout = '/path/to/Qout.nc' + + with RAPIDDataset(path_to_rapid_qout) as qout_nc: + # NOTE: Getting the river index is not necessary + # this is just an example of how to use this + river_index = qout_nc.get_river_index(river_id) + + # if file is CF compliant, you can write out daily average + qout_nc.write_flows_to_gssha_time_series_xys('/timeseries/Qout_daily.xys', + series_name="RAPID_TO_GSSHA_{0}".format(river_id), + series_id=34, + river_index=river_index, + daily=True, + ) + + Example writing subset of time series as daily maximum to file: + + .. code:: python + + from datetime import datetime + from RAPIDpy import RAPIDDataset + + river_id = 3624735 + path_to_rapid_qout = '/path/to/Qout.nc' + + with RAPIDDataset(path_to_rapid_qout) as qout_nc: + # NOTE: Getting the river index is not necessary + # this is just an example of how to use this + river_index = qout_nc.get_river_index(river_id) + + # if file is CF compliant, you can filter by date and + # get daily values + qout_nc.write_flows_to_gssha_time_series_xys('/timeseries/Qout_daily_date_filter.xys', + series_name="RAPID_TO_GSSHA_{0}".format(river_id), + series_id=34, + river_index=river_index, + date_search_start=datetime(2002, 8, 31), + date_search_end=datetime(2002, 9, 15), + daily=True, + mode="max" + ) + """ + if river_id is not None: + river_index = self.get_river_index(river_id) + elif river_id is None and river_index is None: + raise Exception("ERROR: Need reach id or reach index ...") + + # analyze and write + if self.is_time_variable_valid() or self._is_legacy_time_valid(): + time_index_range = \ + self.get_time_index_range(date_search_start=date_search_start, + date_search_end=date_search_end) + + qout_arr = self.get_qout_index(river_index, + time_index_array=time_index_range) + time_array = self.get_time_array(time_index_array=time_index_range, + return_datetime=True) + + df = pd.DataFrame(qout_arr.T, index=time_array) + if daily: + df = df.resample('D').mean() + + with open_csv(path_to_output_file, 'w') as out_ts: + out_ts.write("XYS {0} {1} \"{2}\"\r\n".format(series_id, + len(df.index), + series_name)) + for index, pd_row in df.iterrows(): + date_str = index.strftime("%m/%d/%Y %I:%M:%S %p") + out_ts.write("\"{0}\" {1:.5f}\n".format(date_str, + pd_row[0])) + else: + raise IndexError("Valid time variable not found. Valid time" + " variable required in Qout file to proceed ...") + + def write_flows_to_gssha_time_series_ihg(self, + path_to_output_file, + connection_list_file, + date_search_start=None, + date_search_end=None, + daily=False, + mode="mean"): + """ + Write out RAPID output to GSSHA time series ihg file + + .. note:: See: http://www.gsshawiki.com/Surface_Water_Routing:Introducing_Dischage/Constituent_Hydrographs + + .. note:: GSSHA project card is CHAN_POINT_INPUT + + Parameters: + path_to_output_file(str): Path to the output xys file. + connection_list_file(list): CSV file with link_id, node_id, baseflow, and rapid_rivid header and rows with data. + date_search_start(Optional[datetime]): This is a datetime object with the date of the minimum date for starting. + date_search_end(Optional[datetime]): This is a datetime object with the date of the maximum date for ending. + out_tzinfo(Optional[tzinfo]): Timezone object with output time zone for GSSHA. Default is the native RAPID output timezone (UTC). + daily(Optional[boolean]): If True and the file is CF-Compliant, write out daily flows. + mode(Optional[str]): You can get the daily average "mean" or the maximum "max". Defauls is "mean". + + + Example connection list file:: + + link_id, node_id, baseflow, rapid_rivid + 599, 1, 0.0, 80968 + 603, 1, 0.0, 80967 + + Example writing entire time series to file: + + .. code:: python + + from RAPIDpy import RAPIDDataset + + path_to_rapid_qout = '/path/to/Qout.nc' + connection_list_file = '/path/to/connection_list_file.csv' + + with RAPIDDataset(path_to_rapid_qout) as qout_nc: + #for writing entire time series to file + qout_nc.write_flows_to_gssha_time_series_ihg('/timeseries/Qout_3624735.ihg', + connection_list_file, + ) + + Example writing entire time series as daily average to file: + + .. code:: python + + from RAPIDpy import RAPIDDataset + + path_to_rapid_qout = '/path/to/Qout.nc' + connection_list_file = '/path/to/connection_list_file.csv' + + with RAPIDDataset(path_to_rapid_qout) as qout_nc: + # if file is CF compliant, you can write out daily average + qout_nc.write_flows_to_gssha_time_series_ihg('/timeseries/Qout_3624735.ihg', + connection_list_file, + daily=True, + ) + + + Example writing subset of time series as daily maximum to file: + + .. code:: python + + from datetime import datetime + from RAPIDpy import RAPIDDataset + + path_to_rapid_qout = '/path/to/Qout.nc' + connection_list_file = '/path/to/connection_list_file.csv' + + with RAPIDDataset(path_to_rapid_qout) as qout_nc: + # if file is CF compliant, you can filter by date and get daily values + qout_nc.write_flows_to_gssha_time_series_ihg('/timeseries/Qout_daily_date_filter.ihg', + connection_list_file, + date_search_start=datetime(2002, 8, 31), + date_search_end=datetime(2002, 9, 15), + daily=True, + mode="max" + ) + """ + # analyze and write + if self.is_time_variable_valid() or self._is_legacy_time_valid(): + time_index_range = \ + self.get_time_index_range(date_search_start=date_search_start, + date_search_end=date_search_end) + + with open_csv(path_to_output_file, 'w') as out_ts: + # HEADER SECTION EXAMPLE: + # NUMPT 3 + # POINT 1 599 0.0 + # POINT 1 603 0.0 + # POINT 1 605 0.0 + + connection_list = np.loadtxt(connection_list_file, skiprows=1, + ndmin=1, delimiter=',', + usecols=(0, 1, 2, 3), + dtype={'names': ('link_id', + 'node_id', + 'baseflow', + 'rapid_rivid'), + 'formats': ('i8', 'i8', + 'f4', 'i8') + }, + ) + + out_ts.write("NUMPT {0}\n".format(connection_list.size)) + + river_idx_list = [] + for connection in connection_list: + out_ts.write("POINT {0} {1} {2}\n" + "".format(connection['node_id'], + connection['link_id'], + connection['baseflow'], + ), + ) + river_idx_list.append( + self.get_river_index(connection['rapid_rivid']) + ) + + # INFLOW SECTION EXAMPLE: + # NRPDS 54 + # INPUT 2002 01 01 00 00 15.551210 12.765090 0.000000 + # INPUT 2002 01 02 00 00 15.480830 12.765090 0.000000 + # INPUT 2002 01 03 00 00 16.078910 12.765090 0.000000 + # ... + qout_2d_array = \ + self.get_qout_index(river_idx_list, + time_index_array=time_index_range) + time_array = \ + self.get_time_array(time_index_array=time_index_range, + return_datetime=True) + + df = pd.DataFrame(qout_2d_array.T, index=time_array) + + if daily: + df = df.resample('D').mean() + + out_ts.write("NRPDS {0}\n".format(len(df.index))) + + for index, pd_row in df.iterrows(): + date_str = index.strftime("%Y %m %d %H %M") + qout_str = " ".join(["{0:.5f}".format(pd_row[column]) + for column in df]) + out_ts.write("INPUT {0} {1}\n".format(date_str, qout_str)) + else: + raise IndexError("Valid time variable not found. Valid time " + "variable required in Qout file to proceed ...") diff --git a/RAPIDpy/gis/__init__.py b/RAPIDpy/gis/__init__.py new file mode 100644 index 0000000..40a96af --- /dev/null +++ b/RAPIDpy/gis/__init__.py @@ -0,0 +1 @@ +# -*- coding: utf-8 -*- diff --git a/RAPIDpy/gis/centroid.py b/RAPIDpy/gis/centroid.py new file mode 100644 index 0000000..32eb15b --- /dev/null +++ b/RAPIDpy/gis/centroid.py @@ -0,0 +1,74 @@ +# -*- coding: utf-8 -*- +## +## centroid.py +## RAPIDpy +## +## Created by Alan D Snow. +## +## Copyright © 2016 Alan D Snow. All rights reserved. +## License: BSD 3-Clause + +from csv import writer as csv_writer +try: + from osgeo import gdal, ogr, osr +except Exception: + raise Exception("You need the gdal python package to run this tool ...") +# Enable GDAL/OGR exceptions +gdal.UseExceptions() + +#local +from ..helper_functions import open_csv + +def FlowlineToPoint(in_drainage_line, + river_id, + out_csv_file, + file_geodatabase=None): + """ + Converts flowline feature to a list of centroid points with their comid in EPSG:4326. + + Args: + in_drainage_line(str): Path to the stream network (i.e. Drainage Line) shapefile. + river_id(str): The name of the field with the river ID (Ex. 'HydroID', 'COMID', or 'LINKNO'). + out_csv_file(str): Path to the output csv file with the centroid points. + file_geodatabase(Optional[str]): Path to the file geodatabase. If you use this option, in_drainage_line is the name of the stream network feature class. (WARNING: Not always stable with GDAL.) + + Example:: + + from RAPIDpy.gis.centroid import FlowlineToPoint + #------------------------------------------------------------------------------ + #main process + #------------------------------------------------------------------------------ + if __name__ == "__main__": + FlowlineToPoint(in_drainage_line='/path/to/drainageline.shp', + river_id='LINKNO', + out_csv_file='/path/to/comid_lat_lon_z.csv', + ) + + """ + + if file_geodatabase: + gdb_driver = ogr.GetDriverByName("OpenFileGDB") + ogr_file_geodatabase = gdb_driver.Open(file_geodatabase, 0) + ogr_drainage_line_shapefile_lyr = ogr_file_geodatabase.GetLayer(in_drainage_line) + else: + ogr_drainage_line_shapefile = ogr.Open(in_drainage_line) + ogr_drainage_line_shapefile_lyr = ogr_drainage_line_shapefile.GetLayer() + + ogr_drainage_line_shapefile_lyr_proj = ogr_drainage_line_shapefile_lyr.GetSpatialRef() + osr_geographic_proj = osr.SpatialReference() + osr_geographic_proj.ImportFromEPSG(4326) + proj_transform = None + if ogr_drainage_line_shapefile_lyr_proj != osr_geographic_proj: + proj_transform = osr.CoordinateTransformation(ogr_drainage_line_shapefile_lyr_proj, osr_geographic_proj) + + #print valid field names to table + with open_csv(out_csv_file, 'w') as outfile: + writer = csv_writer(outfile) + writer.writerow(['rivid','lat','lon','z']) + for feature in ogr_drainage_line_shapefile_lyr: + feat_geom = feature.GetGeometryRef() + if proj_transform: + feat_geom.Transform(proj_transform) + centroid = feat_geom.Centroid() + centroid_pt = centroid.GetPoint(0) + writer.writerow([feature.GetField(river_id), centroid_pt[1], centroid_pt[0], centroid_pt[2]]) \ No newline at end of file diff --git a/RAPIDpy/gis/lsm_grids/runoff_ecmwf_t1279_grid.nc b/RAPIDpy/gis/lsm_grids/runoff_ecmwf_t1279_grid.nc new file mode 100644 index 0000000..869032d Binary files /dev/null and b/RAPIDpy/gis/lsm_grids/runoff_ecmwf_t1279_grid.nc differ diff --git a/RAPIDpy/gis/lsm_grids/runoff_ecmwf_tco639_grid.nc b/RAPIDpy/gis/lsm_grids/runoff_ecmwf_tco639_grid.nc new file mode 100644 index 0000000..8ea0a92 Binary files /dev/null and b/RAPIDpy/gis/lsm_grids/runoff_ecmwf_tco639_grid.nc differ diff --git a/RAPIDpy/gis/lsm_grids/runoff_era_t511_grid.nc b/RAPIDpy/gis/lsm_grids/runoff_era_t511_grid.nc new file mode 100644 index 0000000..0829954 Binary files /dev/null and b/RAPIDpy/gis/lsm_grids/runoff_era_t511_grid.nc differ diff --git a/RAPIDpy/gis/merge.py b/RAPIDpy/gis/merge.py new file mode 100644 index 0000000..fcfd150 --- /dev/null +++ b/RAPIDpy/gis/merge.py @@ -0,0 +1,131 @@ +# -*- coding: utf-8 -*- +## +## merge.py +## RAPIDpy +## +## Created by Alan D Snow. +## +## Copyright © 2016 Alan D Snow. All rights reserved. +## License: BSD 3-Clause + +import csv +import numpy as np + +from ..helper_functions import csv_to_list + +def MergeWeightTables(weight_table_file, + connectivity_file, + new_weight_table_file): + """ + This function merges multiple weight tables combined into one file + with duplicate headers removed + """ + + weight_table = csv_to_list(weight_table_file) + weight_comid_list = np.array([row[0] for row in weight_table[1:]], dtype=int) + #FEATUREID,area_sqm,lon_index,lat_index,npoints,weight,Lon,Lat + new_weight_table = weight_table[0:1] + replacement_row = weight_table[1][1:] + #set area_sqm to zero + replacement_row[0] = 0 + #set npoints to one + replacement_row[3] = 1 + + print("Looping ...") + with open(connectivity_file, "rb") as fconnect: + for row in fconnect: + connect_rivid = int(float(row.split(",")[0])) + try: + #find all occurences + comid_indicies = np.where(weight_comid_list==connect_rivid)[0] + weight_indices = [int(d)+1 for d in comid_indicies] + #if num occurences don't match what table says + if len(weight_indices) > int(weight_table[weight_indices[0]][4]): + #print weight_table[weight_indices[0]] + for weight_index in weight_indices: + #remove if it has an area of zero + if float(weight_table[weight_index][1]) == 0.0: + #print "REMOVED:", weight_table[weight_index] + weight_indices.remove(weight_index) + + if len(weight_indices) != int(weight_table[weight_indices[0]][4]): + for weight_index in weight_indices: + print("ERROR: {0} {1}".format(weight_index, weight_table[weight_index])) + + for weight_index in weight_indices: + new_weight_table.append(weight_table[weight_index]) + except IndexError: + print("{0} not found ...".format(connect_rivid)) + #skip if not found + continue + + print("Writing ...") + with open(new_weight_table_file, 'wb') as outfile: + writer = csv.writer(outfile) + writer.writerows(new_weight_table) + +def MergeNetworkConnectFiles(old_connectivity_file, + new_connectivity_file): + + """ + This function merges multiple rapid_connect files combined into one file + """ + connectivity_table = csv_to_list(old_connectivity_file) + + max_num_upstream = max([int(float(row[2])) for row in connectivity_table]) + + print("Maximum number of upstream reaches: {0}".format(max_num_upstream)) + print("Looping ...") + new_comid_list = np.zeros(len(connectivity_table), dtype=np.int32) + new_connectivity_table = [] + index = 0 + for row in connectivity_table: + try: + comid_index = np.where(new_comid_list==int(float(row[0])))[0][0] + if int(float(new_connectivity_table[comid_index][2]))= 2: + # find the slope + stream_slope = slope_list[streamIDindex] + + if stream_slope <= 0: + #if no slope, take average of upstream and downstream to get it + nextDownID = int(float(row[1])) + next_down_slope = 0 + try: + next_down_index = np.where(river_id_list==nextDownID)[0][0] + next_down_slope = slope_list[next_down_index] + except IndexError: + pass + + nextUpID = int(float(row[3])) + next_up_slope = 0 + try: + next_up_index = np.where(river_id_list==nextUpID)[0][0] + next_up_slope = slope_list[next_up_index] + except IndexError: + pass + + stream_slope = (next_down_slope+next_up_slope)/2.0 + if stream_slope <=0: + #if still no slope, set to 0.001 + stream_slope = 0.001 + + length_slope_array.append(stream_length/stream_slope**0.5) + kfac2_array.append(stream_length/celerity) + else: + kfac = stream_length/celerity + kfac_writer.writerow(kfac) + + if formula_type >= 2: + if formula_type == 3: + print("Filtering Data by 5th and 95th Percentiles ...") + length_slope_array = np.array(length_slope_array) + percentile_5 = np.percentile(length_slope_array, 5) + percentile_95 = np.percentile(length_slope_array, 95) + + length_slope_array[length_slope_arraypercentile_95] = percentile_95 + + eta = np.mean(kfac2_array) / np.mean(length_slope_array) + print("Kfac2_Avg {0}".format(np.mean(kfac2_array))) + print("Length_Slope Avg {0}".format( np.mean(length_slope_array))) + print("Eta {0}".format(eta)) + print("Writing Data ...") + for len_slope in length_slope_array: + kfac_writer.writerow(eta*len_slope) + +def CreateMuskingumKFile(lambda_k, + in_kfac_file, + out_k_file): + """ + Creates muskingum k file from kfac file. + + Args: + lambda_k(float): The value for lambda given from RAPID after the calibration process. If no calibration has been performed, 0.35 is reasonable. + in_kfac_file(str): The path to the input kfac file. + out_k_file(str): The path to the output k file. + + Example:: + + from RAPIDpy.gis.muskingum import CreateMuskingumKFile + #------------------------------------------------------------------------------ + #main process + #------------------------------------------------------------------------------ + if __name__ == "__main__": + CreateMuskingumKFile(lambda_k=0.35, + in_kfac_file='/path/to/kfac.csv', + out_k_file='/path/to/k.csv', + ) + """ + kfac_table = csv_to_list(in_kfac_file) + + with open_csv(out_k_file,'w') as kfile: + k_writer = csv_writer(kfile) + for row in kfac_table: + k_writer.writerow([lambda_k*float(row[0])]) + +def CreateMuskingumXFileFromDranageLine(in_drainage_line, + x_id, + out_x_file, + file_geodatabase=None): + """ + Create muskingum X file from drainage line. + + Args: + in_drainage_line(str): Path to the stream network (i.e. Drainage Line) shapefile. + x_id(str): The name of the muksingum X field (i.e. 'Musk_x'). + out_x_file(str): The path to the output x file. + file_geodatabase(Optional[str]): Path to the file geodatabase. If you use this option, in_drainage_line is the name of the stream network feature class. (WARNING: Not always stable with GDAL.) + + Example:: + + from RAPIDpy.gis.muskingum import CreateMuskingumXFileFromDranageLine + #------------------------------------------------------------------------------ + #main process + #------------------------------------------------------------------------------ + if __name__ == "__main__": + CreateMuskingumXFileFromDranageLine(in_drainage_line='/path/to/drainageline.shp', + x_id='Musk_x', + out_x_file='/path/to/x.csv', + ) + """ + if file_geodatabase: + gdb_driver = ogr.GetDriverByName("OpenFileGDB") + ogr_file_geodatabase = gdb_driver.Open(file_geodatabase) + ogr_drainage_line_shapefile_lyr = ogr_file_geodatabase.GetLayer(in_drainage_line) + else: + ogr_drainage_line_shapefile = ogr.Open(in_drainage_line) + ogr_drainage_line_shapefile_lyr = ogr_drainage_line_shapefile.GetLayer() + + with open_csv(out_x_file,'w') as kfile: + x_writer = csv_writer(kfile) + for drainage_line_feature in ogr_drainage_line_shapefile_lyr: + x_writer.writerow([drainage_line_feature.GetField(x_id)]) + +def CreateConstMuskingumXFile(x_value, + in_connectivity_file, + out_x_file): + """ + Create muskingum X file from value that is constant all the way through for each river segment. + + Args: + x_value(float): Value for the muskingum X parameter [0-0.5]. + in_connectivity_file(str): The path to the RAPID connectivity file. + out_x_file(str): The path to the output x file. + + Example:: + + from RAPIDpy.gis.muskingum import CreateConstMuskingumXFile + #------------------------------------------------------------------------------ + #main process + #------------------------------------------------------------------------------ + if __name__ == "__main__": + CreateConstMuskingumXFile(x_value=0.3, + in_connectivity_file='/path/to/rapid_connect.csv', + out_x_file='/path/to/x.csv', + ) + """ + num_rivers = 0 + with open_csv(in_connectivity_file, "r") as csvfile: + reader = csv_reader(csvfile) + for row in reader: + num_rivers+=1 + + with open_csv(out_x_file,'w') as kfile: + x_writer = csv_writer(kfile) + for idx in xrange(num_rivers): + x_writer.writerow([x_value]) diff --git a/RAPIDpy/gis/network.py b/RAPIDpy/gis/network.py new file mode 100644 index 0000000..b100202 --- /dev/null +++ b/RAPIDpy/gis/network.py @@ -0,0 +1,289 @@ +# -*- coding: utf-8 -*- +## +## centroid.py +## RAPIDpy +## +## Created by Alan D Snow. +## Based on RAPID_Toolbox for ArcMap +## Copyright © 2016 Alan D Snow. All rights reserved. +## License: BSD 3-Clause + +from csv import writer as csv_writer +import numpy as np +from past.builtins import xrange + +try: + from osgeo import gdal, ogr +except Exception: + raise Exception("You need the gdal python package to run this tool ...") + +# Enable GDAL/OGR exceptions +gdal.UseExceptions() + +#local +from ..helper_functions import open_csv + +def StreamIDNextDownIDToConnectivity(stream_id_array, + next_down_id_array, + out_csv_file): + """ + Creates RAPID connect file from stream_id array and next down id array + """ + list_all = [] + max_count_upstream = 0 + + for hydroid in np.sort(stream_id_array): + # find the HydroID of the upstreams + list_upstreamID = stream_id_array[next_down_id_array==hydroid] + # count the total number of the upstreams + count_upstream = len(list_upstreamID) + if count_upstream > max_count_upstream: + max_count_upstream = count_upstream + nextDownID = next_down_id_array[stream_id_array==hydroid][0] +#THIS IS REMOVED DUE TO THE FACT THAT THERE ARE STREAMS WITH ID OF ZERO +# # replace the nextDownID with 0 if it equals to -1 (no next downstream) +# if nextDownID == -1: +# nextDownID = 0 + # append the list of Stream HydroID, NextDownID, Count of Upstream ID, and HydroID of each Upstream into a larger list + list_all.append(np.concatenate([np.array([hydroid,nextDownID,count_upstream]),list_upstreamID]).astype(int)) + + with open_csv(out_csv_file,'w') as csvfile: + connectwriter = csv_writer(csvfile) + for row_list in list_all: + out = np.concatenate([row_list, np.array([0 for i in xrange(max_count_upstream - row_list[2])])]) + connectwriter.writerow(out.astype(int)) + +def CreateNetworkConnectivity(in_drainage_line, + river_id, + next_down_id, + out_connectivity_file, + file_geodatabase=None): + """ + Creates Network Connectivity input CSV file for RAPID + based on the Drainage Line shapefile with river ID and next downstream ID fields + + Args: + in_drainage_line(str): Path to the stream network (i.e. Drainage Line) shapefile. + river_id(str): The name of the field with the river ID (Ex. 'HydroID', 'COMID', or 'LINKNO'). + next_down_id(str): The name of the field with the river ID of the next downstream river segment (Ex. 'NextDownID' or 'DSLINKNO'). + out_connectivity_file(str): The path to the output connectivity file. + file_geodatabase(Optional[str]): Path to the file geodatabase. If you use this option, in_drainage_line is the name of the stream network feature class. (WARNING: Not always stable with GDAL.) + + Example:: + + from RAPIDpy.gis.network import CreateNetworkConnectivity + #------------------------------------------------------------------------------ + #main process + #------------------------------------------------------------------------------ + if __name__ == "__main__": + CreateNetworkConnectivity(in_drainage_line='/path/to/drainageline.shp', + river_id='LINKNO', + next_down_id='DSLINKNO', + out_connectivity_file='/path/to/rapid_connect.csv', + ) + """ + if file_geodatabase: + gdb_driver = ogr.GetDriverByName("OpenFileGDB") + ogr_file_geodatabase = gdb_driver.Open(file_geodatabase, 0) + ogr_drainage_line_shapefile_lyr = ogr_file_geodatabase.GetLayer(in_drainage_line) + else: + ogr_drainage_line_shapefile = ogr.Open(in_drainage_line) + ogr_drainage_line_shapefile_lyr = ogr_drainage_line_shapefile.GetLayer() + + stream_id_array = [] + next_down_id_array = [] + for drainage_line_feature in ogr_drainage_line_shapefile_lyr: + stream_id_array.append(drainage_line_feature.GetField(river_id)) + next_down_id_array.append(drainage_line_feature.GetField(next_down_id)) + + stream_id_array = np.array(stream_id_array, dtype=np.int32) + next_down_id_array = np.array(next_down_id_array, dtype=np.int32) + + StreamIDNextDownIDToConnectivity(stream_id_array, + next_down_id_array, + out_connectivity_file) + +def CreateNetworkConnectivityTauDEMTree(network_connectivity_tree_file, + out_csv_file): + """ + Creates Network Connectivity input CSV file for RAPID + based on the TauDEM network connectivity tree file + """ + stream_id_array = [] + next_down_id_array = [] + with open_csv(network_connectivity_tree_file, "r") as csvfile: + for row in csvfile: + split_row = row.split() + stream_id_array.append(split_row[0].strip()) #link number + next_down_id_array.append(split_row[3].strip()) #next downstream link number + + stream_id_array = np.array(stream_id_array, dtype=np.int32) + next_down_id_array = np.array(next_down_id_array, dtype=np.int32) + + StreamIDNextDownIDToConnectivity(stream_id_array, + next_down_id_array, + out_csv_file) + +def CreateNetworkConnectivityNHDPlus(in_drainage_line, + out_connectivity_file, + file_geodatabase=None): + """ + Creates Network Connectivity input CSV file for RAPID + based on the NHDPlus drainage lines with COMID, FROMNODE, TONODE, and DIVERGENCE fields. + + Args: + in_drainage_line(str): Path to the stream network (i.e. Drainage Line) shapefile. + out_connectivity_file(str): The path to the output connectivity file. + file_geodatabase(Optional[str]): Path to the file geodatabase. If you use this option, in_drainage_line is the name of the stream network feature class. (WARNING: Not always stable with GDAL.) + + Example:: + + from RAPIDpy.gis.network import CreateNetworkConnectivityNHDPlus + #------------------------------------------------------------------------------ + #main process + #------------------------------------------------------------------------------ + if __name__ == "__main__": + CreateNetworkConnectivityNHDPlus(in_drainage_line='/path/to/drainageline.shp', + out_connectivity_file='/path/to/rapid_connect.csv', + ) + """ + if file_geodatabase: + gdb_driver = ogr.GetDriverByName("OpenFileGDB") + ogr_file_geodatabase = gdb_driver.Open(file_geodatabase, 0) + ogr_drainage_line_shapefile_lyr = ogr_file_geodatabase.GetLayer(in_drainage_line) + else: + ogr_drainage_line_shapefile = ogr.Open(in_drainage_line) + ogr_drainage_line_shapefile_lyr = ogr_drainage_line_shapefile.GetLayer() + + ogr_drainage_line_definition = ogr_drainage_line_shapefile_lyr.GetLayerDefn() + + orig_field_names = [] + for idx in xrange(ogr_drainage_line_definition.GetFieldCount()): + orig_field_names.append(ogr_drainage_line_definition.GetFieldDefn(idx).GetName()) + + upper_field_names = [field.upper() for field in orig_field_names] + + def get_field_name_index(upper_field_name, upper_field_names): + """ + returns index of field name + """ + try: + return upper_field_names.index(upper_field_name) + except ValueError: + raise IndexError("{0} not found in shapefile ..".format(upper_field_name)) + + rivid_field = orig_field_names[get_field_name_index('COMID', upper_field_names)] + fromnode_field = orig_field_names[get_field_name_index('FROMNODE', upper_field_names)] + tonode_field = orig_field_names[get_field_name_index('TONODE', upper_field_names)] + divergence_field = orig_field_names[get_field_name_index('DIVERGENCE', upper_field_names)] + + number_of_features = ogr_drainage_line_shapefile_lyr.GetFeatureCount() + rivid_list = np.zeros(number_of_features, dtype=np.int32) + fromnode_list = np.zeros(number_of_features, dtype=np.int32) + tonode_list = np.zeros(number_of_features, dtype=np.int32) + divergence_list = np.zeros(number_of_features, dtype=np.int32) + for feature_idx, catchment_feature in enumerate(ogr_drainage_line_shapefile_lyr): + rivid_list[feature_idx] = catchment_feature.GetField(rivid_field) + fromnode_list[feature_idx] = catchment_feature.GetField(fromnode_field) + tonode_list[feature_idx] = catchment_feature.GetField(tonode_field) + divergence_list[feature_idx] = catchment_feature.GetField(divergence_field) + + #------------------------------------------------------------------------------- + #Compute connectivity (based on: https://github.com/c-h-david/rrr/blob/master/src/rrr_riv_tot_gen_all_nhdplus.py) + #------------------------------------------------------------------------------- + fromnode_list[fromnode_list==0] = -9999 + #Some NHDPlus v1 reaches have FLOWDIR='With Digitized' but no info in VAA table + + fromnode_list[divergence_list==2] = -9999 + #Virtually disconnect the upstream node of all minor divergences + divergence_list = [] #don't need this anymore + + next_down_id_list = np.zeros(number_of_features, dtype=np.int32) + for rivid_index, rivid in enumerate(rivid_list): + try: + next_down_id_list[rivid_index] = rivid_list[np.where(fromnode_list==tonode_list[rivid_index])[0][0]] + except IndexError: + next_down_id_list[rivid_index] = -1 #this is an outlet + pass + #determine the downstream reach for each reach + + #empty unecessary lists + fromnode_list = [] + tonode_list = [] + + StreamIDNextDownIDToConnectivity(rivid_list, + next_down_id_list, + out_connectivity_file) + +def CreateSubsetFile(in_drainage_line, + river_id, + out_riv_bas_id_file, + file_geodatabase=None): + """ + Creates River Basin ID subset input CSV file for RAPID + based on the Drainage Line shapefile with river ID and next downstream ID fields + + Args: + in_drainage_line(str): Path to the stream network (i.e. Drainage Line) shapefile. + river_id(str): The name of the field with the river ID (Ex. 'HydroID', 'COMID', or 'LINKNO'). + out_riv_bas_id_file(str): The path to the output river basin ID subset file. + file_geodatabase(Optional[str]): Path to the file geodatabase. If you use this option, in_drainage_line is the name of the stream network feature class. (WARNING: Not always stable with GDAL.) + + Example:: + + from RAPIDpy.gis.network import CreateSubsetFile + #------------------------------------------------------------------------------ + #main process + #------------------------------------------------------------------------------ + if __name__ == "__main__": + CreateSubsetFile(in_drainage_line='/path/to/drainageline.shp', + river_id='LINKNO', + out_riv_bas_id_file='/path/to/riv_bas_id.csv', + ) + """ + + if file_geodatabase: + gdb_driver = ogr.GetDriverByName("OpenFileGDB") + ogr_file_geodatabase = gdb_driver.Open(file_geodatabase, 0) + ogr_drainage_line_shapefile_lyr = ogr_file_geodatabase.GetLayer(in_drainage_line) + else: + ogr_drainage_line_shapefile = ogr.Open(in_drainage_line) + ogr_drainage_line_shapefile_lyr = ogr_drainage_line_shapefile.GetLayer() + + ogr_drainage_line_definition = ogr_drainage_line_shapefile_lyr.GetLayerDefn() + + orig_field_names = [] + for idx in xrange(ogr_drainage_line_definition.GetFieldCount()): + orig_field_names.append(ogr_drainage_line_definition.GetFieldDefn(idx).GetName()) + + upper_field_names = [field.upper() for field in orig_field_names] + sort_field = None + + #Sort by HYDROSEQ order if the option exists + if 'HYDROSEQ' in upper_field_names: + #with this method, smaller is downstream + sort_field = orig_field_names[upper_field_names.index('HYDROSEQ')] + print("Sorting by {0}".format(sort_field)) + + hydroseq_list = [] + hydroid_list = [] + '''The script line below makes sure that rows in the subset file are + arranged in descending order of NextDownID of stream segements''' + for drainage_line_feature in ogr_drainage_line_shapefile_lyr: + hydroid_list.append(drainage_line_feature.GetField(river_id)) + if sort_field: + hydroseq_list.append(drainage_line_feature.GetField(sort_field)) + + hydroid_list = np.array(hydroid_list, dtype=np.int32) + if hydroseq_list: + hydroseq_list = np.array(hydroseq_list, dtype=np.int32) + sort_order = hydroseq_list.argsort()[::-1] + hydroid_list = hydroid_list[sort_order] + else: + hydroid_list = np.sort(hydroid_list) + + + with open_csv(out_riv_bas_id_file,'w') as csvfile: + connectwriter = csv_writer(csvfile) + for hydroid in hydroid_list: + connectwriter.writerow([hydroid]) diff --git a/RAPIDpy/gis/taudem.py b/RAPIDpy/gis/taudem.py new file mode 100644 index 0000000..61f081c --- /dev/null +++ b/RAPIDpy/gis/taudem.py @@ -0,0 +1,834 @@ +# -*- coding: utf-8 -*- +## +## taudem.py +## RAPIDpy +## +## Created by Alan D Snow. +## Command line function based on ArcGIS python scripts by David Tarboton (https://github.com/dtarb/TauDEM) +## Copyright © 2016 Alan D Snow. All rights reserved. +## License: BSD 3-Clause + +from datetime import datetime +from multiprocessing import cpu_count +import numpy as np +import os +from subprocess import PIPE, Popen +from sys import getrecursionlimit, setrecursionlimit +from past.builtins import xrange + +try: + from pyproj import Geod + from shapely.wkb import loads as shapely_loads + from shapely.ops import cascaded_union + from osgeo import gdal, ogr, osr +except ImportError: + print("WARNING: Several GIS functions will not work. " \ + "You need to install the gdal, pyproj, and shapely " \ + "python packages for these functions to work ...") + pass + +#------------------------------------------------------------------------------ +# MAIN CLASS +#------------------------------------------------------------------------------ +class TauDEM(object): + """ + TauDEM process manager. + + Attributes: + taudem_exe_path(Optional[str]): Path to TauDEM directory containing executables. This is requred to use TauDEM functionality. + num_processors(Optional[int]): Number of proessors to use with TauDEM. It only works if use_all_processors=False. + use_all_processors(Optional[bool]): If True, the TauDEM processes will use all avaialble processors. + mpiexec_path(Optional[str]): Path to mpiexec command. Default is 'mpiexec'. + + Initialization Example: + + .. code:: python + + from RAPIDpy.gis.taudem import TauDEM + + td = TauDEM("/path/to/scripts/TauDEM", use_all_processors=True) + + """ + def __init__(self, + taudem_exe_path="", + num_processors=1, + use_all_processors=False, + mpiexec_path="mpiexec"): + """ + Initializer + """ + if use_all_processors or num_processors > cpu_count(): + num_processors = cpu_count() + + self.taudem_exe_path = taudem_exe_path + self.num_processors = num_processors + self.mpiexec_path = mpiexec_path + + def _run_mpi_cmd(self, cmd): + """ + This runs the command you send in + """ + # Get and describe the first argument + # + + print("Number of Processes: {0}".format(self.num_processors)) + time_start = datetime.utcnow() + + # Construct the taudem command line. + cmd = [self.mpiexec_path, '-n', str(self.num_processors)] + cmd + print("Command Line: {0}".format(" ".join(cmd))) + process = Popen(cmd, stdout=PIPE, stderr=PIPE, shell=False) + out, err = process.communicate() + if out: + print("OUTPUT:") + for line in out.split(b'\n'): + print(line) + if err: + print("ERROR:") + print(err) + #raise Exception(err) + print("Time to complete: {0}".format(datetime.utcnow()-time_start)) + + def _add_prj_file(self, original_gis_file, + new_gis_file): + """ + Adds prj file + """ + out_prj_file = "{0}.prj".format(os.path.splitext(new_gis_file)[0]) + if original_gis_file.endswith(".shp"): + dataset = ogr.Open(original_gis_file) + layer = dataset.GetLayer() + spatial_ref = layer.GetSpatialRef() + spatial_ref.MorphToESRI() + spatial_ref_str = spatial_ref.ExportToWkt() + else: + dataset = gdal.Open(original_gis_file) + spatial_ref_str = dataset.GetProjection() + + with open(out_prj_file, 'w') as prj_file: + prj_file.write(spatial_ref_str) + + def extractSubNetwork(self, + network_file, + out_subset_network_file, + outlet_ids, + river_id_field, + next_down_id_field, + river_magnitude_field, + safe_mode=True): + """ + Extracts a subset river network from the main river network based on + the outlet IDs. + + Parameters: + network_file(str): Path to the stream network shapefile. + out_subset_network_file(str): Path to the output subset stream network shapefile. + outlet_ids(list): List if integers reperesenting the outlet IDs to be included in the subset stream network. + river_id_field(str): Name of the river ID field in the stream network shapefile. + next_down_id_field(str): Name if the field with the river ID of the next downstream river segment in the stream network shapefile. + river_magnitude_field(str): Name of the river magnitude field in the stream network shapefile. + safe_mode(Optional[bool]): If True, it will kill the simulation early before over taxing your computer. If you are confident your computer can handle it, set it to False. + + Here is an example of how to use this: + + .. code:: python + + import os + from RAPIDpy.gis.taudem import TauDEM + + td = TauDEM() + + output_directory = '/path/to/output/files' + td.extractSubNetwork(network_file=os.path.join(output_directory,"stream_reach_file.shp"), + out_subset_network_file=os.path.join(output_directory,"stream_reach_file_subset.shp"), + outlet_ids=[60830], + river_id_field="LINKNO", + next_down_id_field="DSLINKNO", + river_magnitude_field="Magnitude", + ) + + """ + network_shapefile = ogr.Open(network_file) + network_layer = network_shapefile.GetLayer() + number_of_features = network_layer.GetFeatureCount() + network_layer_defn = network_layer.GetLayerDefn() + rivid_list = np.zeros(number_of_features, dtype=np.int32) + next_down_rivid_list = np.zeros(number_of_features, dtype=np.int32) + for feature_idx, drainage_line_feature in enumerate(network_layer): + rivid_list[feature_idx] = drainage_line_feature.GetField(river_id_field) + next_down_rivid_list[feature_idx] = drainage_line_feature.GetField(next_down_id_field) + + def getSubNetworkIDList(outlet_river_id, + rivid_list, + next_down_rivid_list): + """ + Adds ids upstream of the outlet to a list + """ + sub_network_index_list = [] + try: + for feature_index in np.where(next_down_rivid_list==outlet_river_id)[0]: + sub_network_index_list.append(feature_index) + sub_network_index_list += getSubNetworkIDList(rivid_list[feature_index], + rivid_list, + next_down_rivid_list) + except IndexError: + pass + return sub_network_index_list + + original_recursion_limit = getrecursionlimit() + try: + main_sub_network_index_list = [] + for outlet_id in outlet_ids: + outlet_index = np.where(rivid_list==outlet_id)[0][0] + outlet_feature = network_layer.GetFeature(outlet_index) + outlet_magnitude = outlet_feature.GetField(river_magnitude_field) + if outlet_magnitude > original_recursion_limit: + if not safe_mode: + setrecursionlimit(outlet_magnitude) + else: + raise Exception("Current recursion limit {0} will not allow" + " extraction for stream magnitude {1}. To override," + " set safe_mode to False ...".format(original_recursion_limit, + outlet_magnitude)) + main_sub_network_index_list.append(outlet_index) + main_sub_network_index_list += getSubNetworkIDList(outlet_id, + rivid_list, + next_down_rivid_list) + except Exception: + setrecursionlimit(original_recursion_limit) + raise + + setrecursionlimit(original_recursion_limit) + + #Write out subset to new shapefile + shp_drv = ogr.GetDriverByName('ESRI Shapefile') + # Remove output shapefile if it already exists + if os.path.exists(out_subset_network_file): + shp_drv.DeleteDataSource(out_subset_network_file) + + network_subset_shp = shp_drv.CreateDataSource(out_subset_network_file) + network_subset_layer = network_subset_shp.CreateLayer('', network_layer.GetSpatialRef(), + ogr.wkbLineString) + # Add input Layer Fields to the output Layer if it is the one we want + for i in xrange(network_layer_defn.GetFieldCount()): + network_subset_layer.CreateField(network_layer_defn.GetFieldDefn(i)) + network_subset_layer_defn = network_subset_layer.GetLayerDefn() + + for feature_index in main_sub_network_index_list: + subset_feature = network_layer.GetFeature(feature_index) + #add to list + new_feat = ogr.Feature(network_subset_layer_defn) + + # Add field values from input Layer + for i in xrange(network_layer_defn.GetFieldCount()): + new_feat.SetField(network_subset_layer_defn.GetFieldDefn(i).GetNameRef(), + subset_feature.GetField(i)) + + # Set geometry as centroid + geom = subset_feature.GetGeometryRef() + new_feat.SetGeometry(geom.Clone()) + # Add new feature to output Layer + network_subset_layer.CreateFeature(new_feat) + + def extractLargestSubNetwork(self, + network_file, + out_subset_network_file, + river_id_field, + next_down_id_field, + river_magnitude_field, + safe_mode=True): + """ + Extracts the larges sub network from the watershed based on the magnitude parameter. + + Parameters: + network_file(str): Path to the stream network shapefile. + out_subset_network_file(str): Path to the output subset stream network shapefile. + river_id_field(str): Name of the river ID field in the stream network shapefile. + next_down_id_field(str): Name if the field with the river ID of the next downstream river segment in the stream network shapefile. + river_magnitude_field(str): Name of the river magnitude field in the stream network shapefile. + safe_mode(Optional[bool]): If True, it will kill the simulation early before over taxing your computer. If you are confident your computer can handle it, set it to False. + + Here is an example of how to use this: + + .. code:: python + + import os + from RAPIDpy.gis.taudem import TauDEM + + td = TauDEM() + + output_directory = '/path/to/output/files' + td.extractLargestSubNetwork(network_file=os.path.join(output_directory,"stream_reach_file.shp"), + out_subset_network_file=os.path.join(output_directory,"stream_reach_file_subset.shp"), + river_id_field="LINKNO", + next_down_id_field="DSLINKNO", + river_magnitude_field="Magnitude", + ) + """ + network_shapefile = ogr.Open(network_file) + network_layer = network_shapefile.GetLayer() + number_of_features = network_layer.GetFeatureCount() + riv_magnuitude_list = np.zeros(number_of_features, dtype=np.int32) + for feature_idx, drainage_line_feature in enumerate(network_layer): + riv_magnuitude_list[feature_idx] = drainage_line_feature.GetField(river_magnitude_field) + + max_magnitude_feature = network_layer.GetFeature(np.argmax(riv_magnuitude_list)) + self.extractSubNetwork(network_file, + out_subset_network_file, + [max_magnitude_feature.GetField(river_id_field)], + river_id_field, + next_down_id_field, + river_magnitude_field, + safe_mode) + + def extractSubsetFromWatershed(self, + subset_network_file, + subset_network_river_id_field, + watershed_file, + watershed_network_river_id_field, + out_watershed_subset_file): + """ + Extract catchment by using subset network file. Use this after using either :func:`~RAPIDpy.gis.taudem.TauDEM.extractSubNetwork()` + or :func:`~RAPIDpy.gis.taudem.TauDEM.extractLargestSubNetwork()`. + + Parameters: + network_file(str): Path to the stream network shapefile. + out_subset_network_file(str): Path to the output subset stream network shapefile. + river_id_field(str): Name of the river ID field in the stream network shapefile. + next_down_id_field(str): Name if the field with the river ID of the next downstream river segment in the stream network shapefile. + river_magnitude_field(str): Name of the river magnitude field in the stream network shapefile. + safe_mode(Optional[bool]): If True, it will kill the simulation early before over taxing your computer. If you are confident your computer can handle it, set it to False. + + Here is an example of how to use this: + + .. code:: python + + import os + from RAPIDpy.gis.taudem import TauDEM + + td = TauDEM() + + output_directory = '/path/to/output/files' + td.extractSubsetFromWatershed(subset_network_file=os.path.join(output_directory,"stream_reach_file_subset.shp"), + subset_network_river_id_field="LINKNO", + watershed_file=os.path.join(output_directory,"watershed_shapefile.shp"), + watershed_network_river_id_field="LINKNO", + out_watershed_subset_file=os.path.join(output_directory,"watershed_shapefile_subset.shp")) + + """ + subset_network_shapefile = ogr.Open(subset_network_file) + subset_network_layer = subset_network_shapefile.GetLayer() + + ogr_watershed_shapefile = ogr.Open(watershed_file) + ogr_watershed_shapefile_lyr = ogr_watershed_shapefile.GetLayer() + ogr_watershed_shapefile_lyr_defn = ogr_watershed_shapefile_lyr.GetLayerDefn() + + number_of_features = ogr_watershed_shapefile_lyr.GetFeatureCount() + watershed_rivid_list = np.zeros(number_of_features, dtype=np.int32) + for feature_idx, watershed_feature in enumerate(ogr_watershed_shapefile_lyr): + watershed_rivid_list[feature_idx] = watershed_feature.GetField(watershed_network_river_id_field) + + + shp_drv = ogr.GetDriverByName('ESRI Shapefile') + # Remove output shapefile if it already exists + if os.path.exists(out_watershed_subset_file): + shp_drv.DeleteDataSource(out_watershed_subset_file) + + subset_watershed_shapefile = shp_drv.CreateDataSource(out_watershed_subset_file) + subset_watershed_layer = subset_watershed_shapefile.CreateLayer('', ogr_watershed_shapefile_lyr.GetSpatialRef(), + ogr.wkbPolygon) + # Add input Layer Fields to the output Layer if it is the one we want + for i in xrange(ogr_watershed_shapefile_lyr_defn.GetFieldCount()): + subset_watershed_layer.CreateField(ogr_watershed_shapefile_lyr_defn.GetFieldDefn(i)) + subset_watershed_layer_defn = subset_watershed_layer.GetLayerDefn() + + for drainage_line_feature in subset_network_layer: + try: + watershed_feature_index = np.where(watershed_rivid_list==drainage_line_feature.GetField(subset_network_river_id_field))[0][0] + except IndexError: + print("{0} {1} not found ...".format(subset_network_river_id_field, + drainage_line_feature.GetField(subset_network_river_id_field))) + continue + + subset_feature = ogr_watershed_shapefile_lyr.GetFeature(watershed_feature_index) + #add to list + new_feat = ogr.Feature(subset_watershed_layer_defn) + + # Add field values from input Layer + for i in xrange(ogr_watershed_shapefile_lyr_defn.GetFieldCount()): + new_feat.SetField(subset_watershed_layer_defn.GetFieldDefn(i).GetNameRef(), + subset_feature.GetField(i)) + + # Set geometry as centroid + geom = subset_feature.GetGeometryRef() + new_feat.SetGeometry(geom.Clone()) + # Add new feature to output Layer + subset_watershed_layer.CreateFeature(new_feat) + + def rasterToPolygon(self, raster_file, polygon_file): + """ + Converts raster to polygon and then dissolves it + """ + print("Process: Raster to Polygon ...") + time_start = datetime.utcnow() + temp_polygon_file = "{0}_temp.shp".format(os.path.splitext(os.path.basename(polygon_file))[0]) + cmd = ["gdal_polygonize.py", raster_file, + "-f", "ESRI Shapefile", temp_polygon_file, + os.path.splitext(os.path.basename(temp_polygon_file))[0], + "LINKNO"] + + process = Popen(cmd, stdout=PIPE, stderr=PIPE, shell=False) + out, err = process.communicate() + if out: + print("OUTPUT:") + for line in out.split(b'\n'): + print(line) + if err: + print("ERROR:") + print(err) + #raise Exception(err) + print("Time to convert to polygon: {0}".format(datetime.utcnow()-time_start)) + + print("Dissolving ...") + time_start_dissolve = datetime.utcnow() + ogr_polygin_shapefile = ogr.Open(temp_polygon_file) + ogr_polygon_shapefile_lyr = ogr_polygin_shapefile.GetLayer() + number_of_features = ogr_polygon_shapefile_lyr.GetFeatureCount() + polygon_rivid_list = np.zeros(number_of_features, dtype=np.int32) + for feature_idx, catchment_feature in enumerate(ogr_polygon_shapefile_lyr): + polygon_rivid_list[feature_idx] = catchment_feature.GetField('LINKNO') + + + shp_drv = ogr.GetDriverByName('ESRI Shapefile') + # Remove output shapefile if it already exists + if os.path.exists(polygon_file): + shp_drv.DeleteDataSource(polygon_file) + + dissolve_shapefile = shp_drv.CreateDataSource(polygon_file) + dissolve_layer = dissolve_shapefile.CreateLayer('', ogr_polygon_shapefile_lyr.GetSpatialRef(), + ogr.wkbPolygon) + dissolve_layer.CreateField(ogr.FieldDefn('LINKNO', ogr.OFTInteger)) + dissolve_layer_defn = dissolve_layer.GetLayerDefn() + + for unique_rivid in np.unique(polygon_rivid_list): + #get indices where it is in the polygon + feature_indices = np.where(polygon_rivid_list==unique_rivid)[0] + new_feat = ogr.Feature(dissolve_layer_defn) + new_feat.SetField('LINKNO', int(unique_rivid)) + + if len(feature_indices) == 1: + ##write feature to file + feature = ogr_polygon_shapefile_lyr.GetFeature(feature_indices[0]) + new_feat.SetGeometry(feature.GetGeometryRef()) + else: + ##dissolve + dissolve_poly_list = [] + for feature_index in feature_indices: + feature = ogr_polygon_shapefile_lyr.GetFeature(feature_index) + feat_geom = feature.GetGeometryRef() + dissolve_poly_list.append(shapely_loads(feat_geom.ExportToWkb())) + dissolve_polygon = cascaded_union(dissolve_poly_list) + new_feat.SetGeometry(ogr.CreateGeometryFromWkb(dissolve_polygon.wkb)) + dissolve_layer.CreateFeature(new_feat) + #clean up + shp_drv.DeleteDataSource(temp_polygon_file) + print("Time to dissolve: {0}".format(datetime.utcnow()-time_start_dissolve)) + print("Total time to convert: {0}".format(datetime.utcnow()-time_start)) + + def addLengthMeters(self, stream_network): + """ + Adds length field in meters to network (The added field name will be 'LENGTH_M'). + + .. note:: This may be needed for generating the kfac file depending on the units of your raster. See: :doc:`gis_tools`. + + Parameters: + stream_network(str): Path to stream network file. + + Here is an example of how to use this: + + .. code:: python + + import os + from RAPIDpy.gis.taudem import TauDEM + + td = TauDEM() + + output_directory = '/path/to/output/files' + td.addLengthMeters(os.path.join(output_directory,"stream_reach_file.shp")) + + """ + network_shapefile = ogr.Open(stream_network, 1) + network_layer = network_shapefile.GetLayer() + network_layer_defn = network_layer.GetLayerDefn() + + #make sure projection EPSG:4326 + network_layer_proj = network_layer.GetSpatialRef() + geographic_proj = osr.SpatialReference() + geographic_proj.ImportFromEPSG(4326) + proj_transform = None + if network_layer_proj != geographic_proj: + proj_transform = osr.CoordinateTransformation(network_layer_proj, geographic_proj) + + #check for field + create_field=True + for i in xrange(network_layer_defn.GetFieldCount()): + field_name = network_layer_defn.GetFieldDefn(i).GetName() + if field_name == 'LENGTH_M': + create_field=False + break + + if create_field: + network_layer.CreateField(ogr.FieldDefn('LENGTH_M', ogr.OFTReal)) + + geo_manager = Geod(ellps="WGS84") + for network_feature in network_layer: + feat_geom = network_feature.GetGeometryRef() + #make sure coordinates are geographic + if proj_transform: + feat_geom.Transform(proj_transform) + + line = shapely_loads(feat_geom.ExportToWkb()) + lon_list, lat_list = line.xy + az1, az2, dist = geo_manager.inv(lon_list[:-1], lat_list[:-1], lon_list[1:], lat_list[1:]) + network_feature.SetField('LENGTH_M', sum(dist)) + network_layer.SetFeature(network_feature) + + def pitRemove(self, + elevation_grid, + pit_filled_elevation_grid, + input_depression_mask_grid=None, + consider4way=False, + ): + """ + Remove low spots from DEM + """ + print("PROCESS: PitRemove") + self.pit_filled_elevation_grid = pit_filled_elevation_grid + + # Construct the taudem command line. + cmd = [os.path.join(self.taudem_exe_path, 'pitremove'), + '-z', elevation_grid, + '-fel', self.pit_filled_elevation_grid, + ] + + if input_depression_mask_grid: + cmd += ['-depmask', input_depression_mask_grid] + if consider4way: + cmd += ['-4way'] + + self._run_mpi_cmd(cmd) + + #create projection file + self._add_prj_file(elevation_grid, + self.pit_filled_elevation_grid) + + def dinfFlowDirection(self, + flow_dir_grid, + slope_grid, + pit_filled_elevation_grid=None): + """ + Calculates flow direction with Dinf method + """ + print("PROCESS: DinfFlowDirection") + if pit_filled_elevation_grid: + self.pit_filled_elevation_grid = pit_filled_elevation_grid + + # Construct the taudem command line. + cmd = [os.path.join(self.taudem_exe_path, 'dinfflowdir'), + '-fel', self.pit_filled_elevation_grid, + '-ang', flow_dir_grid, + '-slp', slope_grid, + ] + + self._run_mpi_cmd(cmd) + + #create projection files + self._add_prj_file(self.pit_filled_elevation_grid, + flow_dir_grid) + self._add_prj_file(self.pit_filled_elevation_grid, + slope_grid) + + def d8FlowDirection(self, + flow_dir_grid, + slope_grid, + pit_filled_elevation_grid=None): + """ + Calculates flow direction with D8 method + """ + print("PROCESS: D8FlowDirection") + if pit_filled_elevation_grid: + self.pit_filled_elevation_grid = pit_filled_elevation_grid + + self.flow_dir_grid = flow_dir_grid + + # Construct the taudem command line. + cmd = [os.path.join(self.taudem_exe_path, 'd8flowdir'), + '-fel', self.pit_filled_elevation_grid, + '-p', self.flow_dir_grid, + '-sd8', slope_grid, + ] + + self._run_mpi_cmd(cmd) + + #create projection files + self._add_prj_file(self.pit_filled_elevation_grid, + self.flow_dir_grid) + self._add_prj_file(self.pit_filled_elevation_grid, + slope_grid) + + def dinfContributingArea(self, + contributing_area_grid, + flow_dir_grid, + outlet_shapefile=None, + weight_grid=None, + edge_contamination=False, + ): + """ + Calculates contributing area with Dinf method + """ + print("PROCESS: DinfContributingArea") + + # Construct the taudem command line. + cmd = [os.path.join(self.taudem_exe_path, 'areadinf'), + '-ang', flow_dir_grid, + '-sca', contributing_area_grid, + ] + + if outlet_shapefile: + cmd += ['-o', outlet_shapefile] + if weight_grid: + cmd += ['-wg', weight_grid] + if not edge_contamination: + cmd = cmd + ['-nc'] + + self._run_mpi_cmd(cmd) + + #create projection file + self._add_prj_file(flow_dir_grid, + contributing_area_grid) + + def d8ContributingArea(self, + contributing_area_grid, + outlet_shapefile=None, + weight_grid=None, + edge_contamination=False, + flow_dir_grid=None): + """ + Calculates contributing area with D8 method + """ + print("PROCESS: D8ContributingArea") + if flow_dir_grid: + self.flow_dir_grid = flow_dir_grid + + self.contributing_area_grid = contributing_area_grid + # Construct the taudem command line. + cmd = [os.path.join(self.taudem_exe_path, 'aread8'), + '-p', self.flow_dir_grid, + '-ad8', self.contributing_area_grid, + ] + + if outlet_shapefile: + cmd += ['-o', outlet_shapefile] + if weight_grid: + cmd += ['-wg', weight_grid] + if not edge_contamination: + cmd = cmd + ['-nc'] + + self._run_mpi_cmd(cmd) + + #create projection file + self._add_prj_file(self.flow_dir_grid, + self.contributing_area_grid) + + def streamDefByThreshold(self, + stream_raster_grid, + threshold, + contributing_area_grid, + mask_grid=None, + ): + """ + Calculates the stream definition by threshold + """ + print("PROCESS: StreamDefByThreshold") + self.stream_raster_grid = stream_raster_grid + + # Construct the taudem command line. + cmd = [os.path.join(self.taudem_exe_path, 'threshold'), + '-ssa', contributing_area_grid, + '-src', self.stream_raster_grid, + '-thresh', str(threshold), + ] + + if mask_grid: + cmd += ['-mask', mask_grid] + + self._run_mpi_cmd(cmd) + + #create projection file + self._add_prj_file(contributing_area_grid, + self.stream_raster_grid) + + def streamReachAndWatershed(self, + delineate, + out_stream_order_grid, + out_network_connectivity_tree, + out_network_coordinates, + out_stream_reach_file, + out_watershed_grid, + pit_filled_elevation_grid=None, + flow_dir_grid=None, + contributing_area_grid=None, + stream_raster_grid=None, + outlet_shapefile=None + ): + """ + Creates vector network and shapefile from stream raster grid + """ + print("PROCESS: StreamReachAndWatershed") + if pit_filled_elevation_grid: + self.pit_filled_elevation_grid = pit_filled_elevation_grid + if flow_dir_grid: + self.flow_dir_grid = flow_dir_grid + if contributing_area_grid: + self.contributing_area_grid = contributing_area_grid + if stream_raster_grid: + self.stream_raster_grid = stream_raster_grid + + # Construct the taudem command line. + cmd = [os.path.join(self.taudem_exe_path, 'streamnet'), + '-fel', self.pit_filled_elevation_grid, + '-p', self.flow_dir_grid, + '-ad8', self.contributing_area_grid, + '-src', self.stream_raster_grid, + '-ord', out_stream_order_grid, + '-tree', out_network_connectivity_tree, + '-coord', out_network_coordinates, + '-net', out_stream_reach_file, + '-w', out_watershed_grid, + ] + + if outlet_shapefile: + cmd += ['-o', outlet_shapefile] + if delineate: + cmd += ['-sw'] + + self._run_mpi_cmd(cmd) + + #create projection file + self._add_prj_file(self.pit_filled_elevation_grid, + out_stream_order_grid) + self._add_prj_file(self.pit_filled_elevation_grid, + out_stream_reach_file) + self._add_prj_file(self.pit_filled_elevation_grid, + out_watershed_grid) + + def demToStreamNetwork(self, + output_directory, + raw_elevation_dem="", + pit_filled_elevation_grid="", + flow_dir_grid_d8="", + contributing_area_grid_d8="", + flow_dir_grid_dinf="", + contributing_area_grid_dinf="", + use_dinf=False, + threshold=1000, + delineate=False): + """ + This function will run all of the TauDEM processes to generate + a stream network from an elevation raster. + + .. note:: For information about the stream reach and watershed process: + http://hydrology.usu.edu/taudem/taudem5/help53/StreamReachAndWatershed.html + + .. note:: For information about the *threshold* parameter, see: + http://hydrology.usu.edu/taudem/taudem5/help53/StreamDefinitionByThreshold.html + + Parameters: + output_directory(str): Path to output generated files to. + raw_elevation_dem(Optional[str]): Path to original elevation DEM file. Required if *pit_filled_elevation_grid* is not used. + pit_filled_elevation_grid(Optional[str]): Path to pit filled elevation DEM file. Required if *raw_elevation_dem* is not used. + flow_dir_grid_d8(Optional[str]): Path to flow direction grid generated using TauDEM's D8 method. + contributing_area_grid_d8(Optional[str]): Path to contributing area grid generated using TauDEM's D8 method. + flow_dir_grid_dinf(Optional[str]): Path to flow direction grid generated using TauDEM's D-Infinity method (EXPERIMENTAL). + contributing_area_grid_dinf(Optional[str]): Path to contributing area grid generated using TauDEM's D-Infinity method (EXPERIMENTAL). + use_dinf(Optional[bool]): Use the D-Infinity method to get stream definition (EXPERIMENTAL). + threshold(Optional[int]): The stream threshold or maximum number of upstream grid cells. See above note. + delineate(Optional[bool]): If True, this will use the delineate option for theis method using TauDEM. Default is False. + + Here is an example of how to use this: + + .. code:: python + + from RAPIDpy.gis.taudem import TauDEM + + td = TauDEM("/path/to/scripts/TauDEM") + + elevation_dem = '/path/to/dem.tif' + output_directory = '/path/to/output/files' + td.demToStreamNetwork(output_directory, + elevation_dem, + threshold=1000) + + """ + + time_start = datetime.utcnow() + + #FILL PITS IF NEEDED + self.pit_filled_elevation_grid = pit_filled_elevation_grid + if not pit_filled_elevation_grid: + pit_filled_elevation_grid = os.path.join(output_directory, 'pit_filled_elevation_grid.tif') + self.pitRemove(raw_elevation_dem, + pit_filled_elevation_grid) + + #GENERATE D8 RASTERS + self.flow_dir_grid = flow_dir_grid_d8 + if not flow_dir_grid_d8: + flow_dir_grid_d8 = os.path.join(output_directory, 'flow_dir_grid_d8.tif') + slope_grid_d8 = os.path.join(output_directory, 'slope_grid_d8.tif') + self.d8FlowDirection(flow_dir_grid_d8, + slope_grid_d8) + + self.contributing_area_grid = contributing_area_grid_d8 + if not contributing_area_grid_d8: + contributing_area_grid_d8 = os.path.join(output_directory, 'contributing_area_grid_d8.tif') + self.d8ContributingArea(contributing_area_grid_d8) + + stream_raster_grid = os.path.join(output_directory, 'stream_raster_grid.tif') + if use_dinf: + print("USING DINF METHOD TO GET STREAM DEFINITION ...") + if not flow_dir_grid_dinf: + flow_dir_grid_dinf = os.path.join(output_directory, 'flow_dir_grid_dinf.tif') + slope_grid_dinf = os.path.join(output_directory, 'slope_grid_dinf.tif') + self.dinfFlowDirection(flow_dir_grid_dinf, + slope_grid_dinf) + if not contributing_area_grid_dinf: + contributing_area_grid_dinf = os.path.join(output_directory, 'contributing_area_grid_dinf.tif') + self.dinfContributingArea(contributing_area_grid_dinf, + flow_dir_grid_dinf) + + self.streamDefByThreshold(stream_raster_grid, + threshold, + contributing_area_grid_dinf) + else: + print("USING D8 METHOD TO GET STREAM DEFINITION ...") + self.streamDefByThreshold(stream_raster_grid, + threshold, + contributing_area_grid_d8) + + #GENERATE STREAM NETWORK + out_stream_order_grid = os.path.join(output_directory, 'stream_order_grid.tif') + out_network_connectivity_tree = os.path.join(output_directory, 'network_connectivity_tree.txt') + out_network_coordinates = os.path.join(output_directory, 'network_coordinates.txt') + out_stream_reach_file = os.path.join(output_directory, 'stream_reach_file.shp') + out_watershed_grid = os.path.join(output_directory, 'watershed_grid.tif') + self.streamReachAndWatershed(delineate, + out_stream_order_grid, + out_network_connectivity_tree, + out_network_coordinates, + out_stream_reach_file, + out_watershed_grid) + + #convert watersed grid to shapefile + out_watershed_shapefile = os.path.join(output_directory, 'watershed_shapefile.shp') + self.rasterToPolygon(out_watershed_grid, out_watershed_shapefile) + print("Total time to complete: {0}".format(datetime.utcnow()-time_start)) diff --git a/RAPIDpy/gis/voronoi.py b/RAPIDpy/gis/voronoi.py new file mode 100644 index 0000000..4c9b11a --- /dev/null +++ b/RAPIDpy/gis/voronoi.py @@ -0,0 +1,363 @@ +# -*- coding: utf-8 -*- +## +## voronoi.py +## RAPIDpy +## +## Created by Alan D Snow. +## +## Copyright © 2016 Alan D Snow. All rights reserved. +## License: BSD 3-Clause + +import numpy as np +import os +from itertools import product +try: + from osgeo import ogr, osr + from scipy.spatial import Voronoi + from shapely.geometry import Polygon + from shapely.wkt import loads as shapely_load_wkt +except Exception: + raise Exception("You need scipy, gdal, and shapely python packages to run these tools ...") + + +def _get_lat_lon_indices(lsm_lat_array, lsm_lon_array, lat, lon): + """ + Determines the index in the array (1D or 2D) where the + lat/lon point is + """ + if lsm_lat_array.ndim == 2 and lsm_lon_array.ndim == 2: + lsm_lat_indices_from_lat, lsm_lon_indices_from_lat = np.where((lsm_lat_array == lat)) + lsm_lat_indices_from_lon, lsm_lon_indices_from_lon = np.where((lsm_lon_array == lon)) + + index_lsm_grid_lat = np.intersect1d(lsm_lat_indices_from_lat, lsm_lat_indices_from_lon)[0] + index_lsm_grid_lon = np.intersect1d(lsm_lon_indices_from_lat, lsm_lon_indices_from_lon)[0] + + elif lsm_lat_array.ndim == 1 and lsm_lon_array.ndim == 1: + index_lsm_grid_lon = np.where(lsm_lon_array == lon)[0][0] + index_lsm_grid_lat = np.where(lsm_lat_array == lat)[0][0] + else: + raise IndexError("Lat/Lon lists have invalid dimensions. Only 1D or 2D arrays allowed ...") + + return index_lsm_grid_lat, index_lsm_grid_lon + + +def _get_voronoi_centroid_array(lsm_lat_array, lsm_lon_array, extent): + """ + This function generates a voronoi centroid point + list from arrays of latitude and longitude + """ + if extent: + YMin = extent[2] + YMax = extent[3] + XMin = extent[0] + XMax = extent[1] + + ptList = [] + if (lsm_lat_array.ndim == 2) and (lsm_lon_array.ndim == 2): + # generate point list with 2D lat lon lists + if extent: + #exctract subset within extent + lsm_dx = np.max(np.absolute(np.diff(lsm_lon_array))) + lsm_dy = np.max(np.absolute(np.diff(lsm_lat_array, axis=0))) + + #remove values with NaN + lsm_lat_array = np.ma.filled(lsm_lat_array, fill_value=-9999) + lsm_lon_array = np.ma.filled(lsm_lon_array, fill_value=-9999) + + lsm_lat_indices_from_lat, lsm_lon_indices_from_lat = np.where((lsm_lat_array >= (YMin - 2*lsm_dy)) & (lsm_lat_array <= (YMax + 2*lsm_dy))) + lsm_lat_indices_from_lon, lsm_lon_indices_from_lon = np.where((lsm_lon_array >= (XMin - 2*lsm_dx)) & (lsm_lon_array <= (XMax + 2*lsm_dx))) + + lsm_lat_indices = np.intersect1d(lsm_lat_indices_from_lat, lsm_lat_indices_from_lon) + lsm_lon_indices = np.intersect1d(lsm_lon_indices_from_lat, lsm_lon_indices_from_lon) + + lsm_lat_list = lsm_lat_array[lsm_lat_indices,:][:,lsm_lon_indices] + lsm_lon_list = lsm_lon_array[lsm_lat_indices,:][:,lsm_lon_indices] + + else: + lsm_lat_indices = lsm_lat_array + lsm_lon_indices = lsm_lon_array + lsm_lat_list = lsm_lat_array + lsm_lon_list = lsm_lon_array + # Create a list of geographic coordinate pairs + for i in range(len(lsm_lat_indices)): + for j in range(len(lsm_lon_indices)): + ptList.append([lsm_lon_list[i][j], lsm_lat_list[i][j]]) + + elif lsm_lat_array.ndim == 1 and lsm_lon_array.ndim == 1: + #generate point list with 1D lat lon lists + if extent: + Ybuffer = 2 * abs(lsm_lat_array[0]-lsm_lat_array[1]) + Xbuffer = 2 * abs(lsm_lon_array[0]-lsm_lon_array[1]) + # Extract the lat and lon within buffered extent (buffer with 2* interval degree) + lsm_lat_list = lsm_lat_array[(lsm_lat_array >= (YMin - Ybuffer)) & (lsm_lat_array <= (YMax + Ybuffer))] + lsm_lon_list = lsm_lon_array[(lsm_lon_array >= (XMin - Xbuffer)) & (lsm_lon_array <= (XMax + Xbuffer))] + + # Create a list of geographic coordinate pairs + for ptX in lsm_lon_list: + for ptY in lsm_lat_list: + ptList.append([ptX, ptY]) + else: + raise IndexError("Lat/Lon lists have invalid dimensions. Only 1D or 2D arrays allowed ...") + + if len(ptList) <=0: + raise IndexError("The watershed is outside of the bounds of the land surface model grid ...") + + return np.array(ptList) # set-up for input to Delaunay + +def _get_voronoi_poly_points(vert_index_list, voronoi_vertices, voronoi_centroid): + """ + This function returns the corner points for a polygon from scipy voronoi information + """ + voronoi_poly_points = [] + if -1 not in vert_index_list and len(vert_index_list) > 3: + voronoi_poly_points = voronoi_vertices[vert_index_list] + elif vert_index_list.size>0: + #ASSUME RECTANGLE + vert_index_list = vert_index_list[vert_index_list>=0] + voronoi_poly_points = voronoi_vertices[vert_index_list] + #CASE 1: 2 valid voronoi vertices + if vert_index_list.size == 2: + center_lon = voronoi_centroid[0] + center_lat = voronoi_centroid[1] + corner_lon1 = voronoi_poly_points[0][0] + corner_lat1 = voronoi_poly_points[0][1] + corner_lon2 = voronoi_poly_points[1][0] + corner_lat2 = voronoi_poly_points[1][1] + + #check if need to add points in lon or lat + if abs(corner_lon1-corner_lon2) > abs(corner_lat1-corner_lat2): + dLat = center_lat - corner_lat1 + #append the corners in order + voronoi_poly_points = np.array([[corner_lon1, corner_lat1], + [corner_lon2, corner_lat2], + [corner_lon2, center_lat + dLat], + [corner_lon1, center_lat + dLat]]) + else: + dLon = center_lon - corner_lon1 + #append the corners in order + voronoi_poly_points = np.array([[corner_lon1, corner_lat1], + [corner_lon2, corner_lat2], + [center_lon+dLon, corner_lat2], + [center_lon+dLon, corner_lat1]]) + #CADE 2: 1 valid voronoi vertex + elif vert_index_list.size == 1: + center_lon = voronoi_centroid[0] + center_lat = voronoi_centroid[1] + corner_lon = voronoi_poly_points[0][0] + corner_lat = voronoi_poly_points[0][1] + dLat = center_lat - corner_lat + dLon = center_lon - corner_lon + #append the corners in order + voronoi_poly_points = np.array([[corner_lon, corner_lat], + [center_lon + dLon, corner_lat], + [center_lon + dLon, center_lat + dLat], + [corner_lon, center_lat + dLat]]) + + + return voronoi_poly_points + +def pointsToVoronoiGridShapefile(lat, lon, vor_shp_path, extent=None): + """ + Converts points to shapefile grid via voronoi + """ + voronoi_centroids = _get_voronoi_centroid_array(lat, lon, extent) + + # set-up output polygon shp + print("Creating output polygon shp {0}".format(os.path.basename(vor_shp_path))) + if os.path.exists(vor_shp_path): os.remove(vor_shp_path) + drv = ogr.GetDriverByName('ESRI Shapefile') + outShp = drv.CreateDataSource(vor_shp_path) + osr_geographic_proj = osr.SpatialReference() + osr_geographic_proj.ImportFromEPSG(4326) + layer = outShp.CreateLayer('', osr_geographic_proj, ogr.wkbPolygon) + layer.CreateField(ogr.FieldDefn('GRID_LAT', ogr.OFTReal)) + layer.CreateField(ogr.FieldDefn('GRID_LON', ogr.OFTReal)) + layerDefn = layer.GetLayerDefn() + + # find nodes surrounding polygon centroid + # sort nodes in counterclockwise order + # create polygon perimeter through nodes + print("Building Voronoi polygons...") + #compute voronoi + voronoi_manager = Voronoi(voronoi_centroids) + voronoi_vertices = voronoi_manager.vertices + voronoi_regions = voronoi_manager.regions + for point_id, region_index in enumerate(voronoi_manager.point_region): + vert_index_list = np.array(voronoi_regions[region_index]) + voronoi_centroid = voronoi_centroids[point_id] + voronoi_poly_points = _get_voronoi_poly_points(vert_index_list, + voronoi_vertices, + voronoi_centroid) + if len(voronoi_poly_points) == 4: + poly = ogr.Geometry(ogr.wkbPolygon) + ring = ogr.Geometry(ogr.wkbLinearRing) + for i, node in enumerate(voronoi_poly_points): + if i==0: + loopLon = node[0] # grab first node to close ring + loopLat = node[1] + ring.AddPoint(node[0],node[1]) + + ring.AddPoint(loopLon,loopLat) + poly.AddGeometry(ring) + feat = ogr.Feature(layerDefn) + feat.SetField('GRID_LON', float(voronoi_centroid[0])) + feat.SetField('GRID_LAT', float(voronoi_centroid[1])) + feat.SetGeometry(poly) + layer.CreateFeature(feat) + feat = poly = ring = None + + +def pointsToVoronoiGridArray(lat, lon, extent=None, coord_transform_in=None, coord_transforma_out=None, no_data_value=None): + """ + Converts points to grid array via voronoi + """ + voronoi_centroids = _get_voronoi_centroid_array(lat, lon, extent) + + lon_lat = np.vstack([(lon, lat)]) + number_of_rows = lon_lat.shape[1] + number_of_columns = lon_lat.shape[2] + + # convert to shapely objects + voronoi_centroids = [] + for i, j in product(range(number_of_rows), range(number_of_columns)): + voronoi_centroids.append(list(lon_lat[:, i, j])) + + if coord_transform_in: + proj_centroids = coord_transform_in.TransformPoints(voronoi_centroids) + voronoi_centroids = np.asarray(proj_centroids)[:, 0:2] + + # find nodes surrounding polygon centroid + # sort nodes in counterclockwise order + # create polygon perimeter through nodes + print("Building Voronoi polygons...") + #compute voronoi + voronoi_manager = Voronoi(voronoi_centroids) + voronoi_vertices = voronoi_manager.vertices + voronoi_regions = voronoi_manager.regions + feature_list = [] + for point_id, region_index in enumerate(voronoi_manager.point_region): + vert_index_list = np.array(voronoi_regions[region_index]) + voronoi_centroid = voronoi_centroids[point_id] + voronoi_poly_points = _get_voronoi_poly_points(vert_index_list, + voronoi_vertices, + voronoi_centroid) + + if len(voronoi_poly_points) == 4: + poly = Polygon(voronoi_poly_points) + + if coord_transforma_out: + ogr_poly = ogr.CreateGeometryFromWkt(poly.wkt) + ogr_poly.Transform(coord_transforma_out) + poly = shapely_load_wkt(ogr_poly.ExportToWkt()) + + voronoi_centroid = coord_transforma_out.TransformPoint(*voronoi_centroid) + + lat_index, lon_index = _get_lat_lon_indices(lat, lon, + voronoi_centroid[1], + voronoi_centroid[0]) + + feature_list.append({'polygon': poly, + 'lon': voronoi_centroid[0], + 'lat': voronoi_centroid[1], + 'lat_index': lat_index, + 'lon_index': lon_index, + }) + + write_shapefile(feature_list) + + return feature_list + + +def _fill_nan(a, axis): + + filled = np.copy(a) + rolled = np.roll(a, shift=1, axis=axis) + # rolled = np.nanmean(a, axis=axis) + idx = np.where(np.isnan(filled)) + filled[idx] = np.take(rolled, idx[1]) # TODO why inx[1]? see (http://stackoverflow.com/questions/18689235/numpy-array-replace-nan-values-with-average-of-columns) + + rolled = np.roll(a, shift=-1, axis=axis) + idx = np.where(np.isnan(filled)) + filled[idx] = np.take(rolled, idx[1]) + + return filled + + +def pointsArrayToPolygonGridList(lat, lon, extent=None, coord_transform_in=None, coord_transform_out=None, + no_data_value=-9999): + """ + Converts points to grid array via voronoi + """ + if lat.ndim == 1 or lon.ndim == 1: + number_of_rows = lat.shape[0] + number_of_columns = lon.shape[0] + + # create a 2D matrix of lats and lons + lon, lat = np.meshgrid(lon, lat) + # lat = np.repeat(lat, number_of_columns, axis=0).reshape(number_of_rows, -1) + # lon = np.repeat(lon, number_of_rows, axis=0).reshape(number_of_columns, -1).T + + # combine lat and lon arrays into 3D array + lon_lat = np.vstack([(lon, lat)]) + + lon_lat[lon_lat == no_data_value] = np.nan + + if coord_transform_in is not None: + centroids = np.apply_along_axis(lambda p: coord_transform_in.TransformPoint(float(p[0]), float(p[1])), 0, lon_lat) + else: + centroids = lon_lat + + v_distances = np.linalg.norm(centroids[:, 0:-1, :] - centroids[:, 1:, :], axis=0) / 2.0 + h_distances = np.linalg.norm(centroids[:, :, 0:-1] - centroids[:, :, 1:], axis=0) / 2.0 + + v_distances = _fill_nan(v_distances, axis=1) + h_distances = _fill_nan(h_distances, axis=0) + + v_up = np.insert(v_distances, 0, v_distances[0, :], axis=0) + v_down = np.insert(v_distances, -1, v_distances[-1, :], axis=0) + + h_left = np.insert(h_distances, 0, h_distances[:, 0], axis=1) + h_right = np.insert(h_distances, -1, h_distances[:, -1], axis=1) + + poly_coords = np.array([(centroids[0] - h_left, centroids[1] + v_up), + (centroids[0] + h_right, centroids[1] + v_up), + (centroids[0] + h_right, centroids[1] - v_down), + (centroids[0] - h_left, centroids[1] - v_down)]) + + # poly_coords_list = np.reshape(poly_coords, (4, 2, -1)) + number_of_rows = len(poly_coords[0, 0, :, 0]) + number_of_columns = len(poly_coords[0, 0, 0, :]) + + # convert to shapely objects + feature_list = [] + for i, j in product(range(number_of_rows), range(number_of_columns)): + coords = poly_coords[:, :, i, j] + if not np.any(np.isnan(coords)): # this alternative may be faster: if not np.isnan(np.sum(coords)): + poly = Polygon(coords) + if coord_transform_out is not None: + ogr_poly = ogr.CreateGeometryFromWkb(poly.wkb) + ogr_poly.Transform(coord_transform_out) + poly = shapely_load_wkt(ogr_poly.ExportToWkt()) + feature_list.append({'polygon': poly, + 'lon': poly.centroid.coords[0][0], + 'lat': poly.centroid.coords[0][1], + 'lon_index': i, + 'lat_index': j}) + + write_shapefile(feature_list) + + return feature_list + + +def write_shapefile(feature_list): + from shapely.geometry import mapping + import fiona + schema = { + 'geometry': 'Polygon', + 'properties': {'id': 'int'}, + } + with fiona.open('voronoi_grid.shp', 'w', layer='grid7', driver='ESRI Shapefile', schema=schema) as c: + for x, p in enumerate(feature_list): + c.write({'geometry': mapping(p['polygon']), + 'properties': {'id': x}, + }) \ No newline at end of file diff --git a/RAPIDpy/gis/weight.py b/RAPIDpy/gis/weight.py new file mode 100644 index 0000000..d64da32 --- /dev/null +++ b/RAPIDpy/gis/weight.py @@ -0,0 +1,417 @@ +# -*- coding: utf-8 -*- +## +## weight.py +## RAPIDpy +## +## Created by Alan D Snow. +## Based on RAPID_Toolbox for ArcMap +## Copyright © 2016 Alan D Snow. All rights reserved. +## License: BSD 3-Clause + +import csv +from datetime import datetime +from functools import partial +from netCDF4 import Dataset +import pangaea as pa +import numpy as np + +try: + from pyproj import Proj, transform + from shapely.wkb import loads as shapely_loads + from shapely.ops import transform as shapely_transform + from shapely.geos import TopologicalError + from shapely.geometry import Polygon + import rtree #http://toblerity.org/rtree/install.html + from osgeo import gdal, ogr, osr +except Exception: + raise Exception("You need the gdal, pyproj, shapely, and rtree python package to run these tools ...") + +#local +from .voronoi import pointsToVoronoiGridArray, pointsArrayToPolygonGridList +from ..helper_functions import open_csv + +GRIDDING_METHODS = { + 'array_math': pointsArrayToPolygonGridList, + 'voronoi': pointsToVoronoiGridArray +} + +gdal.UseExceptions() + + +def gdal_error_handler(err_class, err_num, err_msg): + errtype = { + gdal.CE_None: 'None', + gdal.CE_Debug: 'Debug', + gdal.CE_Warning: 'Warning', + gdal.CE_Failure: 'Failure', + gdal.CE_Fatal: 'Fatal' + } + err_msg = err_msg.replace('\n', ' ') + err_class = errtype.get(err_class, 'None') + print('Error Number: %s' % (err_num,)) + print('Error Type: %s' % (err_class,)) + print('Error Message: %s' % (err_msg,)) + +# install error handler +gdal.PushErrorHandler(gdal_error_handler) + + +def get_poly_area_geo(poly): + """ + Calculates the area in meters squared of the individual polygon + """ + minx, miny, maxx, maxy = poly.bounds + #reproject polygon to get area + reprojected_for_area = Proj("+proj=aea +lat_1={0} +lat_1={1} +lat_0={2} +lon_0={3}".format(miny, + maxy, + (miny+maxy)/2.0, + (minx+maxx)/2.0)) + geographic_proj = Proj(init='epsg:4326') + project_func = partial(transform, + geographic_proj, + reprojected_for_area) + reprojected_poly = shapely_transform(project_func, poly) + return reprojected_poly.area + + +def find_nearest(array, value): + """ + Get the nearest index to value searching for + """ + return (np.abs(array-value)).argmin() + + +def RTreeCreateWeightTable(lsm_grid_lat, lsm_grid_lon, + in_catchment_shapefile, river_id, + in_rapid_connect, out_weight_table, + file_geodatabase=None, area_id=None, + grid_proj=None, no_data_value=-9999, + gridding_method='array_math' + ): + + """ + Create Weight Table for Land Surface Model Grids + """ + time_start_all = datetime.utcnow() + + if lsm_grid_lat.ndim == 3 and lsm_grid_lon.ndim == 3: + #assume first dimension is time + lsm_grid_lat = lsm_grid_lat[0] + lsm_grid_lon = lsm_grid_lon[0] + + print("Generating LSM Grid Thiessen Array ...") + if file_geodatabase: + gdb_driver = ogr.GetDriverByName("OpenFileGDB") + ogr_file_geodatabase = gdb_driver.Open(file_geodatabase, 0) + ogr_catchment_shapefile_lyr = ogr_file_geodatabase.GetLayer(in_catchment_shapefile) + else: + ogr_catchment_shapefile = ogr.Open(in_catchment_shapefile) + ogr_catchment_shapefile_lyr = ogr_catchment_shapefile.GetLayer() + + osr_geographic_proj = osr.SpatialReference() + osr_geographic_proj.ImportFromEPSG(4326) + + ogr_catchment_proj = ogr_catchment_shapefile_lyr.GetSpatialRef() + + extent = ogr_catchment_shapefile_lyr.GetExtent() + + catchment_transform = None + if ogr_catchment_proj != osr_geographic_proj: + catchment_transform = osr.CoordinateTransformation(ogr_catchment_proj, osr_geographic_proj) + + point1, point2 = catchment_transform.TransformPoints(((extent[0], extent[2]), (extent[1], extent[3]))) + x = point1[0], point2[0] + y = point1[1], point2[1] + + extent = [min(x), max(x), min(y), max(y)] + + poly = Polygon([(extent[0], extent[2]), + (extent[1], extent[2]), + (extent[1], extent[3]), + (extent[0], extent[3]), + ]) + + ogr_poly = ogr.CreateGeometryFromWkb(poly.wkb) + ogr_poly.Transform(catchment_transform) + + extent = ogr_poly.GetEnvelope() + + grid_transform_in = None + grid_transform_out = None + + if grid_proj is not None: + grid_transform_in = osr.CoordinateTransformation(osr_geographic_proj, grid_proj) + grid_transform_out = osr.CoordinateTransformation(grid_proj, osr_geographic_proj) + + extent = None + # TODO figure out how to define the extents if grid needs to be reprojected + + generate_grid_function = GRIDDING_METHODS[gridding_method] + lsm_grid_feature_list = generate_grid_function(lsm_grid_lat, lsm_grid_lon, + extent, grid_transform_in, grid_transform_out, + no_data_value) + + ##COMMENTED LINES FOR TESTING +# import os +# from .voronoi import pointsToVoronoiGridShapefile +# vor_shp_path = os.path.join(os.path.dirname(in_catchment_shapefile), "test_grid.shp") +# pointsToVoronoiGridShapefile(lsm_grid_lat, lsm_grid_lon, vor_shp_path, extent) + + time_end_lsm_grid_thiessen = datetime.utcnow() + print(time_end_lsm_grid_thiessen - time_start_all) + + print("Generating LSM Grid Rtree ...") + rtree_idx = rtree.index.Index() + # Populate R-tree index with bounds of ECMWF grid cells + for lsm_grid_pos, lsm_grid_feature in enumerate(lsm_grid_feature_list): + rtree_idx.insert(lsm_grid_pos, lsm_grid_feature['polygon'].bounds) + + time_end_lsm_grid_rtree = datetime.utcnow() + print(time_end_lsm_grid_rtree - time_end_lsm_grid_thiessen) + + print("Retrieving catchment river id list ...") + number_of_catchment_features = ogr_catchment_shapefile_lyr.GetFeatureCount() + catchment_rivid_list = np.zeros(number_of_catchment_features, dtype=np.int64) + for feature_idx, catchment_feature in enumerate(ogr_catchment_shapefile_lyr): + catchment_rivid_list[feature_idx] = catchment_feature.GetField(river_id) + + print("Reading in RAPID connect file ...") + rapid_connect_rivid_list = np.loadtxt(in_rapid_connect, + delimiter=",", + usecols=(0,), + ndmin=1, + dtype=int) + print("Find LSM grid cells that intersect with each catchment") + print("and write out weight table ...") + + dummy_grid_feature = lsm_grid_feature_list[0] + dummy_lat_index = dummy_grid_feature['lat_index'] + dummy_lon_index = dummy_grid_feature['lon_index'] + dummy_row_end = [0, + dummy_lon_index, + dummy_lat_index, + 1, + lsm_grid_feature_list[0]['lon'], + lsm_grid_feature_list[0]['lat'] + ] + + with open_csv(out_weight_table, 'w') as csvfile: + connectwriter = csv.writer(csvfile) + connectwriter.writerow(['rivid', 'area_sqm', 'lon_index', 'lat_index', + 'npoints', 'lsm_grid_lon', 'lsm_grid_lat']) + + for rapid_connect_rivid in rapid_connect_rivid_list: + intersect_grid_info_list = [] + try: + catchment_pos = np.where(catchment_rivid_list==rapid_connect_rivid)[0][0] + except IndexError: + #if it is not in the catchment, add dummy row in its place + connectwriter.writerow([rapid_connect_rivid] + dummy_row_end) + continue + pass + get_catchment_feature = ogr_catchment_shapefile_lyr.GetFeature(catchment_pos) + feat_geom = get_catchment_feature.GetGeometryRef() + #make sure coordinates are geographic + if catchment_transform: + feat_geom.Transform(catchment_transform) + catchment_polygon = shapely_loads(feat_geom.ExportToWkb()) + + for sub_lsm_grid_pos in rtree_idx.intersection(catchment_polygon.bounds): + lsm_grid_polygon = lsm_grid_feature_list[sub_lsm_grid_pos]['polygon'] + if catchment_polygon.intersects(lsm_grid_polygon): + try: + intersect_poly = catchment_polygon.intersection(lsm_grid_polygon) + except TopologicalError: + print('INFO: The catchment polygon with id {0} was invalid. Attempting to self clean...'.format(rapid_connect_rivid)) + original_area = catchment_polygon.area + catchment_polygon = catchment_polygon.buffer(0) + area_ratio = original_area/catchment_polygon.area + print('AREA_RATIO', area_ratio) + msg_level = "INFO" + if round(area_ratio, 5) != 1: + msg_level = "WARNING" + print('{0}: The cleaned catchment polygon area differs from the' + ' original area by {1}%.'.format(msg_level, abs(area_ratio - 1))) + intersect_poly = catchment_polygon.intersection(lsm_grid_polygon) + if not area_id: + #attempt to calculate AREA + poly_area = get_poly_area_geo(intersect_poly) + else: + poly_area = float(get_catchment_feature.GetField(area_id))*intersect_poly.area/catchment_polygon.area + + index_lsm_grid_lat = lsm_grid_feature_list[sub_lsm_grid_pos]['lat_index'] + index_lsm_grid_lon = lsm_grid_feature_list[sub_lsm_grid_pos]['lon_index'] + intersect_grid_info_list.append({'rivid': rapid_connect_rivid, + 'area': poly_area, + 'lsm_grid_lat': lsm_grid_feature_list[sub_lsm_grid_pos]['lat'], + 'lsm_grid_lon': lsm_grid_feature_list[sub_lsm_grid_pos]['lon'], + 'index_lsm_grid_lon': index_lsm_grid_lon, + 'index_lsm_grid_lat': index_lsm_grid_lat}) + + npoints = len(intersect_grid_info_list) + #If no intersection found, add dummy row + if(npoints <=0): + connectwriter.writerow([rapid_connect_rivid] + dummy_row_end) + + for intersect_grid_info in intersect_grid_info_list: + connectwriter.writerow([intersect_grid_info['rivid'], + intersect_grid_info['area'], + intersect_grid_info['index_lsm_grid_lon'], + intersect_grid_info['index_lsm_grid_lat'], + npoints, + intersect_grid_info['lsm_grid_lon'], + intersect_grid_info['lsm_grid_lat']]) + + time_end_all = datetime.utcnow() + print(time_end_all - time_end_lsm_grid_rtree) + print("TOTAL TIME: {0}".format(time_end_all - time_start_all)) + + +def CreateWeightTableECMWF(in_ecmwf_nc, + in_catchment_shapefile, + river_id, + in_connectivity_file, + out_weight_table, + area_id=None, + file_geodatabase=None, + ): + + """ + Create Weight Table for ECMWF Grids + + .. note:: The grids are in the RAPIDpy package under the gis/lsm_grids folder. + + Args: + in_ecmwf_nc(str): Path to the ECMWF NetCDF grid. + in_catchment_shapefile(str): Path to the Catchment shapefile. + river_id(str): The name of the field with the river ID (Ex. 'DrainLnID' or 'LINKNO'). + in_connectivity_file(str): The path to the RAPID connectivity file. + out_weight_table(str): The path to the output weight table file. + area_id(Optional[str]): The name of the field with the area of each catchment stored in meters squared. Default is it calculate the area. + file_geodatabase(Optional[str]): Path to the file geodatabase. If you use this option, in_drainage_line is the name of the stream network feature class. (WARNING: Not always stable with GDAL.) + + Example: + + .. code:: python + + from RAPIDpy.gis.weight import CreateWeightTableECMWF + + CreateWeightTableECMWF(in_ecmwf_nc='/path/to/runoff_ecmwf_grid.nc' + in_catchment_shapefile='/path/to/catchment.shp', + river_id='LINKNO', + in_connectivity_file='/path/to/rapid_connect.csv', + out_weight_table='/path/to/ecmwf_weight.csv', + ) + """ + #extract ECMWF GRID + data_ecmwf_nc = Dataset(in_ecmwf_nc) + variables_list = data_ecmwf_nc.variables.keys() + in_ecmwf_lat_var = 'lat' + if 'latitude' in variables_list: + in_ecmwf_lat_var = 'latitude' + in_ecmwf_lon_var = 'lon' + if 'longitude' in variables_list: + in_ecmwf_lon_var = 'longitude' + + ecmwf_lon = (data_ecmwf_nc.variables[in_ecmwf_lon_var][:] + 180) % 360 - 180 # convert [0, 360] to [-180, 180] + ecmwf_lat = data_ecmwf_nc.variables[in_ecmwf_lat_var][:] #assume [-90,90] + data_ecmwf_nc.close() + + RTreeCreateWeightTable(ecmwf_lat, ecmwf_lon, + in_catchment_shapefile, river_id, + in_connectivity_file, out_weight_table, + file_geodatabase, area_id) + + +def CreateWeightTableLDAS(in_ldas_nc, + in_nc_lon_var, + in_nc_lat_var, + in_catchment_shapefile, + river_id, + in_connectivity_file, + out_weight_table, + area_id=None, + file_geodatabase=None): + + """ + Create Weight Table for NLDAS, GLDAS grids as well as for 2D Joules, or LIS Grids + + Args: + in_ldas_nc(str): Path to the land surface model NetCDF grid. + in_nc_lon_var(str): The variable name in the NetCDF file for the longitude. + in_nc_lat_var(str): The variable name in the NetCDF file for the latitude. + in_catchment_shapefile(str): Path to the Catchment shapefile. + river_id(str): The name of the field with the river ID (Ex. 'DrainLnID' or 'LINKNO'). + in_connectivity_file(str): The path to the RAPID connectivity file. + out_weight_table(str): The path to the output weight table file. + area_id(Optional[str]): The name of the field with the area of each catchment stored in meters squared. Default is it calculate the area. + file_geodatabase(Optional[str]): Path to the file geodatabase. If you use this option, in_drainage_line is the name of the stream network feature class. (WARNING: Not always stable with GDAL.) + + Example: + + .. code:: python + + from RAPIDpy.gis.weight import CreateWeightTableLDAS + + CreateWeightTableLDAS(in_ldas_nc='/path/to/runoff_grid.nc', + in_nc_lon_var="lon_110", + in_nc_lat_var="lat_110", + in_catchment_shapefile='/path/to/catchment.shp', + river_id='LINKNO', + in_connectivity_file='/path/to/rapid_connect.csv', + out_weight_table='/path/to/ldas_weight.csv', + ) + """ + #extract ECMWF GRID + data_ldas_nc = Dataset(in_ldas_nc) + variables_list = data_ldas_nc.variables.keys() + if in_nc_lon_var not in variables_list: + raise Exception("Invalid longitude variable. Choose from: {0}".format(variables_list)) + if in_nc_lat_var not in variables_list: + raise Exception("Invalid latitude variable. Choose from: {0}".format(variables_list)) + ldas_lon = data_ldas_nc.variables[in_nc_lon_var][:] #assume [-180, 180] + ldas_lat = data_ldas_nc.variables[in_nc_lat_var][:] #assume [-90,90] + data_ldas_nc.close() + + RTreeCreateWeightTable(ldas_lat, ldas_lon, + in_catchment_shapefile, river_id, + in_connectivity_file, out_weight_table, + file_geodatabase, area_id) + + +def CreateWeightTable(lsm_grid, + lat_var, + lon_var, + time_var, + lat_dim, + lon_dim, + time_dim, + in_catchment_shapefile, + river_id, + in_rapid_connect, + out_weight_table, + area_id=None, + file_geodatabase=None + ): + + with pa.open_mfdataset(lsm_grid, + lat_var, + lon_var, + time_var, + lat_dim, + lon_dim, + time_dim) as xds: + proj = xds.lsm.projection + lsm_grid_lat, lsm_grid_lon = xds.lsm.latlon + + RTreeCreateWeightTable(lsm_grid_lat, + lsm_grid_lon, + in_catchment_shapefile, + river_id, + in_rapid_connect, + out_weight_table, + file_geodatabase=None, + area_id=None, + grid_proj=proj, + no_data_value=-9999, + ) \ No newline at end of file diff --git a/RAPIDpy/gis/workflow.py b/RAPIDpy/gis/workflow.py new file mode 100644 index 0000000..e693ab3 --- /dev/null +++ b/RAPIDpy/gis/workflow.py @@ -0,0 +1,260 @@ +# -*- coding: utf-8 -*- +## +## workflow.py +## RAPIDpy +## +## Created by Alan D Snow. +## Based on RAPID_Toolbox for ArcMap +## Copyright © 2016 Alan D Snow. All rights reserved. +## License: BSD 3-Clause + +import os + +from .network import (CreateNetworkConnectivity, CreateNetworkConnectivityTauDEMTree, + CreateNetworkConnectivityNHDPlus, CreateSubsetFile) +from .muskingum import (CreateMuskingumKfacFile, CreateMuskingumKFile, + CreateConstMuskingumXFile) +from .weight import CreateWeightTableECMWF +from .centroid import FlowlineToPoint + +def CreateAllStaticRAPIDFiles(in_drainage_line, + river_id, + length_id, + slope_id, + next_down_id, + rapid_output_folder, + kfac_celerity=1000.0/3600.0, + kfac_formula_type=3, + kfac_length_units="km", + lambda_k=0.35, + x_value=0.3, + nhdplus=False, + taudem_network_connectivity_tree_file=None, + file_geodatabase=None + ): + """ + To generate the static RAPID files (rapid_connect.csv, riv_bas_id.csv, + kfac.csv, k.csv, x.csv, comid_lat_lon_z.csv) with default values. + + Args: + in_drainage_line(str): Path to the stream network (i.e. Drainage Line) shapefile. + river_id(str): The name of the field with the river ID (Ex. 'HydroID', 'COMID', or 'LINKNO'). + length_id(str): The field name containging the length of the river segment (Ex. 'LENGTHKM' or 'Length'). + slope_id(str): The field name containging the slope of the river segment (Ex. 'Avg_Slope' or 'Slope'). + next_down_id(str): The name of the field with the river ID of the next downstream river segment (Ex. 'NextDownID' or 'DSLINKNO'). + rapid_output_folder(str): The path to the folder where all of the RAPID output will be generated. + kfac_celerity(Optional[float]): The flow wave celerity for the watershed in meters per second. 1 km/hr or 1000.0/3600.0 m/s is a reasonable value if unknown. + kfac_formula_type(Optional[int]): An integer representing the formula type to use when calculating kfac. Default is 3. + kfac_length_units(Optional[str]): The units for the length_id field. Supported types are "m" for meters and "km" for kilometers. Default is "km". + lambda_k(Optional[float]): The value for lambda given from RAPID after the calibration process. Default is 0.35. + x_value(Optional[float]): Value for the muskingum X parameter [0-0.5]. Default is 0.3. + nhdplus(Optional[bool]): If True, the drainage line is from the NHDPlus dataset with the VAA fields COMID, FROMNODE, TONODE, and DIVERGENCE. Default is False. + taudem_network_connectivity_tree_file(Optional[str]): If set, the connectivity file will be generated from the TauDEM connectivity tree file. + file_geodatabase(Optional[str]): Path to the file geodatabase. If you use this option, in_drainage_line is the name of the stream network feature class. (WARNING: Not always stable with GDAL.) + + Example:: + + from RAPIDpy.gis.workflow import CreateAllStaticRAPIDFiles + #------------------------------------------------------------------------------ + #main process + #------------------------------------------------------------------------------ + if __name__=="__main__": + CreateAllStaticRAPIDFiles(in_drainage_line="/path/to/drainage_line.shp", + river_id="HydroID", + length_id="LENGTHKM", + slope_id="SLOPE", + next_down_river_id="NextDownID", + rapid_output_folder="/path/to/rapid/output", + ) + """ + #RAPID connect file + rapid_connect_file = os.path.join(rapid_output_folder, 'rapid_connect.csv') + if nhdplus: + CreateNetworkConnectivityNHDPlus(in_drainage_line, + rapid_connect_file, + file_geodatabase) + elif taudem_network_connectivity_tree_file: + CreateNetworkConnectivityTauDEMTree(taudem_network_connectivity_tree_file, + rapid_connect_file) + else: + CreateNetworkConnectivity(in_drainage_line, + river_id, + next_down_id, + rapid_connect_file, + file_geodatabase) + + #river basin id file + riv_bas_id_file = os.path.join(rapid_output_folder, 'riv_bas_id.csv') + CreateSubsetFile(in_drainage_line, + river_id, + riv_bas_id_file, + file_geodatabase) + #kfac file + kfac_file = os.path.join(rapid_output_folder, 'kfac.csv') + CreateMuskingumKfacFile(in_drainage_line, + river_id, + length_id, + slope_id, + kfac_celerity, + kfac_formula_type, + rapid_connect_file, + kfac_file, + length_units=kfac_length_units, + file_geodatabase=file_geodatabase) + #k file + k_file = os.path.join(rapid_output_folder, 'k.csv') + CreateMuskingumKFile(lambda_k, + kfac_file, + k_file) + #x file + x_file = os.path.join(rapid_output_folder, 'x.csv') + CreateConstMuskingumXFile(x_value, + rapid_connect_file, + x_file) + #comid lat lon z file + comid_lat_lon_z_file = os.path.join(rapid_output_folder, 'comid_lat_lon_z.csv') + FlowlineToPoint(in_drainage_line, + river_id, + comid_lat_lon_z_file, + file_geodatabase) + +def CreateAllStaticECMWFFiles(in_catchment, + catchment_river_id, + rapid_output_folder, + rapid_connect_file, + file_geodatabase=None + ): + """ + This creates all of the ECMWF grid weight tables using an area weighted method based on Esri's RAPID_Toolbox. + + Args: + in_catchment(str): Path to the Catchment shapefile. + catchment_river_id(str): The name of the field with the river ID (Ex. 'DrainLnID' or 'LINKNO'). + rapid_output_folder(str): The path to the folder where all of the RAPID output will be generated. + rapid_connect_file(str): The path to the RAPID connectivity file. + file_geodatabase(Optional[str]): Path to the file geodatabase. If you use this option, in_drainage_line is the name of the stream network feature class. (WARNING: Not always stable with GDAL.) + + Example:: + + from RAPIDpy.gis.workflow import CreateAllStaticECMWFFiles + #------------------------------------------------------------------------------ + #main process + #------------------------------------------------------------------------------ + if __name__=="__main__": + CreateAllStaticECMWFFiles(in_catchment="/path/to/catchment.shp", + catchment_river_id="DrainLnID", + rapid_output_folder="/path/to/rapid/output", + rapid_connect_file="/path/to/rapid_connect.csv", + ) + """ + lsm_grid_folder = os.path.join(os.path.dirname(os.path.realpath(__file__)), 'lsm_grids') + + #create from ECMWF high reslution grid + ecmwf_t1279_grid_file = os.path.join(lsm_grid_folder, 'runoff_ecmwf_t1279_grid.nc') + weight_ecmwf_t1279_file = os.path.join(rapid_output_folder, 'weight_ecmwf_t1279.csv') + CreateWeightTableECMWF(ecmwf_t1279_grid_file, + in_catchment, + catchment_river_id, + rapid_connect_file, + weight_ecmwf_t1279_file, + file_geodatabase=file_geodatabase) + + #create from ECMWF low reslution grid + ecmwf_tco639_grid_file = os.path.join(lsm_grid_folder, 'runoff_ecmwf_tco639_grid.nc') + weight_ecmwf_tco639_file = os.path.join(rapid_output_folder, 'weight_ecmwf_tco639.csv') + CreateWeightTableECMWF(ecmwf_tco639_grid_file, + in_catchment, + catchment_river_id, + rapid_connect_file, + weight_ecmwf_tco639_file, + file_geodatabase=file_geodatabase) + + #create from ERA Interim grid + era_t511_grid_file = os.path.join(lsm_grid_folder, 'runoff_era_t511_grid.nc') + weight_era_t511_file = os.path.join(rapid_output_folder, 'weight_era_t511.csv') + CreateWeightTableECMWF(era_t511_grid_file, + in_catchment, + catchment_river_id, + rapid_connect_file, + weight_era_t511_file, + file_geodatabase=file_geodatabase) + +def CreateAllStaticECMWFRAPIDFiles(in_drainage_line, + river_id, + length_id, + slope_id, + next_down_id, + in_catchment, + catchment_river_id, + rapid_output_folder, + kfac_celerity=1000.0/3600.0, + kfac_formula_type=3, + kfac_length_units="km", + lambda_k=0.35, + x_value=0.3, + nhdplus=False, + taudem_network_connectivity_tree_file=None, + file_geodatabase=None + ): + """ + This creates all of the static RAPID files and ECMWF grid weight tables. + + Args: + in_drainage_line(str): Path to the stream network (i.e. Drainage Line) shapefile. + river_id(str): The name of the field with the river ID (Ex. 'HydroID', 'COMID', or 'LINKNO'). + length_id(str): The field name containging the length of the river segment (Ex. 'LENGTHKM' or 'Length'). + slope_id(str): The field name containging the slope of the river segment (Ex. 'Avg_Slope' or 'Slope'). + next_down_id(str): The name of the field with the river ID of the next downstream river segment (Ex. 'NextDownID' or 'DSLINKNO'). + in_catchment(str): Path to the Catchment shapefile. + catchment_river_id(str): The name of the field with the river ID (Ex. 'DrainLnID' or 'LINKNO'). + rapid_output_folder(str): The path to the folder where all of the RAPID output will be generated. + kfac_celerity(Optional[float]): The flow wave celerity for the watershed in meters per second. 1 km/hr or 1000.0/3600.0 m/s is a reasonable value if unknown. + kfac_formula_type(Optional[int]): An integer representing the formula type to use when calculating kfac. Default is 3. + kfac_length_units(Optional[str]): The units for the length_id field. Supported types are "m" for meters and "km" for kilometers. Default is "km". + lambda_k(Optional[float]): The value for lambda given from RAPID after the calibration process. Default is 0.35. + x_value(Optional[float]): Value for the muskingum X parameter [0-0.5]. Default is 0.3. + nhdplus(Optional[bool]): If True, the drainage line is from the NHDPlus dataset with the VAA fields COMID, FROMNODE, TONODE, and DIVERGENCE. Default is False. + taudem_network_connectivity_tree_file(Optional[str]): If set, the connectivity file will be generated from the TauDEM connectivity tree file. + file_geodatabase(Optional[str]): Path to the file geodatabase. If you use this option, in_drainage_line is the name of the stream network feature class. (WARNING: Not always stable with GDAL.) + + Example:: + + from RAPIDpy.gis.workflow import CreateAllStaticECMWFRAPIDFiles + #------------------------------------------------------------------------------ + #main process + #------------------------------------------------------------------------------ + if __name__=="__main__": + CreateAllStaticECMWFRAPIDFiles(in_drainage_line="/path/to/drainage_line.shp", + river_id="HydroID", + length_id="LENGTHKM", + slope_id="SLOPE", + next_down_id="NextDownID", + in_catchment="/path/to/catchment.shp", + catchment_river_id="DrainLnID", + rapid_output_folder="/path/to/rapid/output", + ) + """ + #create all RAPID files + CreateAllStaticRAPIDFiles(in_drainage_line, + river_id, + length_id, + slope_id, + next_down_id, + rapid_output_folder, + kfac_celerity, + kfac_formula_type, + kfac_length_units, + lambda_k, + x_value, + nhdplus, + taudem_network_connectivity_tree_file, + file_geodatabase) + + + rapid_connect_file = os.path.join(rapid_output_folder, 'rapid_connect.csv') + + CreateAllStaticECMWFFiles(in_catchment, + catchment_river_id, + rapid_output_folder, + rapid_connect_file, + file_geodatabase) \ No newline at end of file diff --git a/RAPIDpy/helper_functions.py b/RAPIDpy/helper_functions.py new file mode 100644 index 0000000..6c632e5 --- /dev/null +++ b/RAPIDpy/helper_functions.py @@ -0,0 +1,116 @@ +# -*- coding: utf-8 -*- +## +## helper_functions.py +## RAPIDpy +## +## Created by Alan D Snow, 2015. +## Copyright © 2015 Alan D Snow. All rights reserved. +## +import csv +from numpy.testing import assert_almost_equal +from numpy import array as np_array +from numpy import float32 as np_float32 +from os import remove +from sys import version_info + +#------------------------------------------------------------------------------ +# HELPER FUNCTIONS +#------------------------------------------------------------------------------ +def open_csv(csv_file, mode='r'): + """ + Get mode depending on Python version + Based on: http://stackoverflow.com/questions/29840849/writing-a-csv-file-in-python-that-works-for-both-python-2-7-and-python-3-3-in + """ + if version_info[0] == 2: # Not named on 2.6 + access = '{0}b'.format(mode) + kwargs = {} + else: + access = '{0}t'.format(mode) + kwargs = {'newline':''} + + return open(csv_file, access, **kwargs) + +def log(message, severity, print_debug=True): + """Logs, prints, or raises a message. + + Arguments: + message -- message to report + severity -- string of one of these values: + CRITICAL|ERROR|WARNING|INFO|DEBUG + """ + + print_me = ['WARNING', 'INFO', 'DEBUG'] + if severity in print_me: + if severity == 'DEBUG': + if print_debug: + print("{0}: {1}".format(severity, message)) + else: + print("{0}: {1}".format(severity, message)) + else: + raise Exception("{0}: {1}".format(severity, message)) + +def csv_to_list(csv_file, delimiter=','): + """ + Reads in a CSV file and returns the contents as list, + where every row is stored as a sublist, and each element + in the sublist represents 1 cell in the table. + """ + with open_csv(csv_file) as csv_con: + if len(delimiter) > 1: + dialect = csv.Sniffer().sniff(csv_con.read(1024), delimiters=delimiter) + csv_con.seek(0) + reader = csv.reader(csv_con, dialect) + else: + reader = csv.reader(csv_con, delimiter=delimiter) + return list(reader) + +def compare_csv_decimal_files(file1, file2, header=True, timeseries=False): + """ + This function compares two csv files + """ + #CHECK NUM LINES + with open_csv(file1) as fh1, \ + open_csv(file2) as fh2: + assert sum(1 for line1 in fh1) == sum(1 for line2 in fh2) + + with open_csv(file1) as fh1, \ + open_csv(file2) as fh2: + csv1 = csv.reader(fh1) + csv2 = csv.reader(fh2) + + if header: + assert next(csv1) == next(csv2) #header + + while True: + try: + row1 = next(csv1) + row2 = next(csv2) + compare_start_index = 0 + if timeseries: + assert row1[0] == row2[0] #check dates + compare_start_index=1 + + assert_almost_equal(np_array(row1[compare_start_index:], dtype=np_float32), + np_array(row2[compare_start_index:], dtype=np_float32), + decimal=2) + except StopIteration: + break + pass + return True + +def compare_csv_timeseries_files(file1, file2, header=True): + """ + This function compares two csv files + """ + return compare_csv_decimal_files(file1, file2, header, True) + +def remove_files(*args): + """ + This function removes all files input as arguments + """ + for arg in args: + try: + remove(arg) + except OSError: + pass + diff --git a/RAPIDpy/inflow/CreateInflowFileFromERAInterimRunoff.py b/RAPIDpy/inflow/CreateInflowFileFromERAInterimRunoff.py new file mode 100644 index 0000000..0c16c53 --- /dev/null +++ b/RAPIDpy/inflow/CreateInflowFileFromERAInterimRunoff.py @@ -0,0 +1,185 @@ +# -*- coding: utf-8 -*- +# +# CreateInflowFileFromERAInterimRunoff.py +# RAPIDpy +# +# Created by Alan D. Snow (adapted from CreateInflowFileFromECMWFRunoff.py). +# Copyright © 2015-2016 Alan D Snow. All rights reserved. +# License: BSD-3 Clause + +import netCDF4 as NET +import numpy as NUM +import os +from sys import version_info +from past.builtins import xrange + +from .CreateInflowFileFromGriddedRunoff import CreateInflowFileFromGriddedRunoff + + +class CreateInflowFileFromERAInterimRunoff(CreateInflowFileFromGriddedRunoff): + def __init__(self): + """Define the tool (tool name is the name of the class).""" + self.label = "Create Inflow File From ERA Interim Runoff" + self.description = ("Creates RAPID NetCDF input of water inflow " + "based on ERA Interim runoff results and " + "previously created weight table.") + self.header_wt = ['rivid', 'area_sqm', 'lon_index', 'lat_index', 'npoints'] + self.dims_oi = [['lon', 'lat', 'time'], ['longitude', 'latitude', 'time']] + self.vars_oi = [["lon", "lat", "time", "RO"], ['longitude', 'latitude', 'time', 'ro']] + self.length_time = {"Daily": 1, "3-Hourly": 8} + self.errorMessages = ["Missing Variable 'time'", + "Incorrect dimensions in the input ERA Interim runoff file.", + "Incorrect variables in the input ERA Interim runoff file.", + "Incorrect time variable in the input ERA Interim runoff file", + "Incorrect number of columns in the weight table", + "No or incorrect header in the weight table", + "Incorrect sequence of rows in the weight table"] + + def dataValidation(self, in_nc): + """Check the necessary dimensions and variables in the input netcdf data""" + + data_nc = NET.Dataset(in_nc) + + dims = data_nc.dimensions + if version_info[0] == 2: # Python 2 + dims = dims.keys() + if version_info[0] == 3: # Python 3 + dims = list(dims) + + if dims not in self.dims_oi: + raise Exception("{0} {1}".format(self.errorMessages[1],dims)) + + vars = data_nc.variables + if version_info[0] == 2: # Python 2 + vars = vars.keys() + if version_info[0] == 3: # Python 3 + vars = list(vars) + + if vars == self.vars_oi[0]: + vars_oi_index = 0 + elif vars == self.vars_oi[1]: + vars_oi_index = 1 + else: + raise Exception("{0} {1}".format(self.errorMessages[2],vars)) + + return vars_oi_index + + def dataIdentify(self, in_nc, vars_oi_index): + """Check if the data is daily (one value) or 3 hourly""" + data_nc = NET.Dataset(in_nc) + name_time = self.vars_oi[vars_oi_index][2] + time = data_nc.variables[name_time][:] + if len(time) == self.length_time["Daily"]: + return "Daily" + + diff = NUM.unique(NUM.diff(time)) + data_nc.close() + time_interval_3hr = NUM.array([3.0],dtype=float) + if (diff == time_interval_3hr).all(): + return "3-Hourly" + else: + return None + + def execute(self, nc_file_list, index_list, in_weight_table, + out_nc, grid_type, mp_lock): + + """The source code of the tool.""" + if not os.path.exists(out_nc): + print("ERROR: Outfile has not been created. You need to run: generateOutputInflowFile function ...") + raise Exception("ERROR: Outfile has not been created. You need to run: generateOutputInflowFile function ...") + + if len(nc_file_list) != len(index_list): + print("ERROR: Number of runoff files not equal to number of indices ...") + raise Exception("ERROR: Number of runoff files not equal to number of indices ...") + + self.readInWeightTable(in_weight_table) + + lon_ind_all = [int(i) for i in self.dict_list[self.header_wt[2]]] + lat_ind_all = [int(j) for j in self.dict_list[self.header_wt[3]]] + + # Obtain a subset of runoff data based on the indices in the weight table + min_lon_ind_all = min(lon_ind_all) + max_lon_ind_all = max(lon_ind_all) + min_lat_ind_all = min(lat_ind_all) + max_lat_ind_all = max(lat_ind_all) + + index_new = [] + + # Validate the netcdf dataset + vars_oi_index = self.dataValidation(nc_file_list[0]) + + id_data = self.dataIdentify(nc_file_list[0], vars_oi_index) + if id_data is None: + raise Exception(self.errorMessages[3]) + + # combine inflow data + for nc_file_array_index, nc_file in enumerate(nc_file_list): + index = index_list[nc_file_array_index] + + '''Calculate water inflows''' + # print("Calculating water inflows for {0} {1} ...".format(os.path.basename(nc_file) , grid_type)) + + ''' Read the netcdf dataset''' + data_in_nc = NET.Dataset(nc_file) + time = data_in_nc.variables[self.vars_oi[vars_oi_index][2]][:] + + # Check the size of time variable in the netcdf data + size_time = len(time) + if size_time != self.length_time[id_data]: + raise Exception(self.errorMessages[3]) + + data_subset_all = data_in_nc.variables[self.vars_oi[vars_oi_index][3]][:, min_lat_ind_all:max_lat_ind_all+1, min_lon_ind_all:max_lon_ind_all+1] + data_in_nc.close() + + len_time_subset_all = data_subset_all.shape[0] + len_lat_subset_all = data_subset_all.shape[1] + len_lon_subset_all = data_subset_all.shape[2] + data_subset_all = data_subset_all.reshape(len_time_subset_all, (len_lat_subset_all * len_lon_subset_all)) + + # compute new indices based on the data_subset_all + if not index_new: + for r in xrange(self.count): + ind_lat_orig = lat_ind_all[r] + ind_lon_orig = lon_ind_all[r] + index_new.append((ind_lat_orig - min_lat_ind_all)*len_lon_subset_all + (ind_lon_orig - min_lon_ind_all)) + + # obtain a new subset of data + data_subset_new = data_subset_all[:,index_new] + + inflow_data = NUM.zeros((size_time, self.size_streamID)) + # start compute inflow + pointer = 0 + for stream_index in xrange(self.size_streamID): + npoints = int(self.dict_list[self.header_wt[4]][pointer]) + # Check if all npoints points correspond to the same streamID + if len(set(self.dict_list[self.header_wt[0]][pointer : (pointer + npoints)])) != 1: + print("ROW INDEX {0}".format(pointer)) + print("COMID {0}".format(self.dict_list[self.header_wt[0]][pointer])) + raise Exception(self.errorMessages[2]) + + area_sqm_npoints = [float(k) for k in self.dict_list[self.header_wt[1]][pointer : (pointer + npoints)]] + area_sqm_npoints = NUM.array(area_sqm_npoints) + area_sqm_npoints = area_sqm_npoints.reshape(1, npoints) + data_goal = data_subset_new[:, pointer:(pointer + npoints)] + + if grid_type == 't255': + # A) ERA Interim Low Res (T255) - data is cumulative + data_goal = data_goal.astype(NUM.float32) + # from time 3/6/9/12 (time zero not included, so assumed to be zero) + ro_first_half = NUM.concatenate([data_goal[0:1,], NUM.subtract(data_goal[1:4,], data_goal[0:3,])]) + # from time 15/18/21/24 (time restarts at time 12, assumed to be zero) + ro_second_half = NUM.concatenate([data_goal[4:5,], NUM.subtract(data_goal[5:,], data_goal[4:7,])]) + ro_stream = NUM.multiply(NUM.concatenate([ro_first_half, ro_second_half]), area_sqm_npoints) + else: + # A) ERA Interim High Res (T511) - data is incremental + # from time 3/6/9/12/15/18/21/24 + ro_stream = NUM.multiply(data_goal, area_sqm_npoints) + inflow_data[:,stream_index] = ro_stream.sum(axis=1) + pointer += npoints + + # only one process is allowed to write at a time to netcdf file + mp_lock.acquire() + data_out_nc = NET.Dataset(out_nc, "a", format="NETCDF3_CLASSIC") + data_out_nc.variables['m3_riv'][index*size_time:(index+1)*size_time,:] = inflow_data + data_out_nc.close() + mp_lock.release() diff --git a/RAPIDpy/inflow/CreateInflowFileFromGriddedRunoff.py b/RAPIDpy/inflow/CreateInflowFileFromGriddedRunoff.py new file mode 100644 index 0000000..33f33e4 --- /dev/null +++ b/RAPIDpy/inflow/CreateInflowFileFromGriddedRunoff.py @@ -0,0 +1,225 @@ +# -*- coding: utf-8 -*- +## +## CreateInflowFileFromGriddedRunoff.py +## RAPIDpy +## +## Created by Alan D Snow. +## Copyright © 2016 Alan D Snow. All rights reserved. +## BSD 3-Clause + +import csv +from datetime import datetime +import netCDF4 as NET +import numpy as np +import os +from pytz import utc + +#local +from ..helper_functions import open_csv + + +class CreateInflowFileFromGriddedRunoff(object): + def __init__(self): + """Define the tool (tool name is the name of the class).""" + self.header_wt = ['rivid', 'area_sqm', 'lon_index', 'lat_index', 'npoints'] + + def readInWeightTable(self, in_weight_table): + """ + Read in weight table + """ + print("Reading the weight table...") + with open_csv(in_weight_table, "r") as csvfile: + reader = csv.reader(csvfile) + header_row = next(reader) + # check number of columns in the weight table + if len(header_row) < len(self.header_wt): + raise Exception(self.errorMessages[4]) + # check header + if header_row[1:len(self.header_wt)] != self.header_wt[1:]: + raise Exception(self.errorMessages[5]) + + self.dict_list = np.loadtxt(in_weight_table, + delimiter=",", + usecols=(0, 1, 2, 3, 4), + skiprows=1, + dtype={'names': (self.header_wt[0], self.header_wt[1], self.header_wt[2], self.header_wt[3], self.header_wt[4]), + 'formats': ('i8', 'f8', 'i8', 'i8', 'i8')}, + ) + + self.count = self.dict_list.shape[0] + self.size_streamID = len(np.unique(np.array(self.dict_list[self.header_wt[0]], dtype=np.int32))) + + def _write_lat_lon(self, data_out_nc, rivid_lat_lon_z_file): + """Add latitude and longitude each netCDF feature + Lookup table is a CSV file with rivid, Lat, Lon, columns. + Columns must be in that order and these must be the first three columns. + """ + #only add if user adds + if rivid_lat_lon_z_file and os.path.exists(rivid_lat_lon_z_file): + #get list of COMIDS + lookup_table = np.loadtxt(rivid_lat_lon_z_file, + delimiter=",", + usecols=(0,1,2), + skiprows=1, + dtype={'names': ('rivid', 'lat', 'lon'), + 'formats': ('i8', 'f8', 'f8'), + }, + ) + + # Get relevant arrays while we update them + nc_rivids = data_out_nc.variables['rivid'][:] + lats = data_out_nc.variables['lat'][:] + lons = data_out_nc.variables['lon'][:] + + lat_min = None + lat_max = None + lon_min = None + lon_max = None + + # Process each row in the lookup table + for nc_index, nc_rivid in enumerate(nc_rivids): + try: + lookup_index = np.where(lookup_table['rivid'] == nc_rivid)[0][0] + except Exception: + raise Exception('rivid {0} misssing in comid_lat_lon_z file'.format(nc_rivid)) + + lat = float(lookup_table['lat'][lookup_index]) + lats[nc_index] = lat + if (lat_min) is None or lat < lat_min: + lat_min = lat + if (lat_max) is None or lat > lat_max: + lat_max = lat + + lon = float(lookup_table['lon'][lookup_index]) + lons[nc_index] = lon + if (lon_min) is None or lon < lon_min: + lon_min = lon + if (lon_max) is None or lon > lon_max: + lon_max = lon + + # Overwrite netCDF variable values + data_out_nc.variables['lat'][:] = lats + data_out_nc.variables['lon'][:] = lons + + # Update metadata + if lat_min is not None: + data_out_nc.geospatial_lat_min = lat_min + if lat_max is not None: + data_out_nc.geospatial_lat_max = lat_max + if lon_min is not None: + data_out_nc.geospatial_lon_min = lon_min + if lon_max is not None: + data_out_nc.geospatial_lon_max = lon_max + else: + print('No comid_lat_lon_z file. Not adding values ...') + + def generateOutputInflowFile(self, + out_nc, #file generated for inflows + start_datetime_utc, + number_of_timesteps, + simulation_time_step_seconds, + in_rapid_connect_file, + in_rivid_lat_lon_z_file, + land_surface_model_description, + modeling_institution + ): + """ + Generate inflow file for RAPID + """ + self.simulation_time_step_seconds = simulation_time_step_seconds + + # Create output inflow netcdf data + print("Generating inflow file ...") + data_out_nc = NET.Dataset(out_nc, "w", format="NETCDF3_CLASSIC") + rivid_list = np.loadtxt(in_rapid_connect_file, + delimiter=",", + ndmin=1, + usecols=(0,), + dtype=int) + #create dimensions + data_out_nc.createDimension('time', number_of_timesteps) + data_out_nc.createDimension('rivid', len(rivid_list)) + data_out_nc.createDimension('nv', 2) + #create variables + #m3_riv + m3_riv_var = data_out_nc.createVariable('m3_riv', 'f4', + ('time', 'rivid'), + fill_value=0) + m3_riv_var.long_name = 'accumulated external water volume inflow upstream of each river reach' + m3_riv_var.units = 'm3' + m3_riv_var.coordinates = 'lon lat' + m3_riv_var.grid_mapping = 'crs' + m3_riv_var.cell_methods = "time: sum" + data_out_nc.close() + + try: + data_out_nc = NET.Dataset(out_nc, "a", format="NETCDF3_CLASSIC") + #rivid + rivid_var = data_out_nc.createVariable('rivid', 'i4', + ('rivid',)) + rivid_var.long_name = 'unique identifier for each river reach' + rivid_var.units = '1' + rivid_var.cf_role = 'timeseries_id' + + rivid_var[:] = rivid_list + + #time + time_var = data_out_nc.createVariable('time', 'i4', + ('time',)) + time_var.long_name = 'time' + time_var.standard_name = 'time' + time_var.units = 'seconds since 1970-01-01 00:00:00+00:00' + time_var.axis = 'T' + time_var.calendar = 'gregorian' + time_var.bounds = 'time_bnds' + + initial_time_seconds = (start_datetime_utc.replace(tzinfo=utc)- + datetime(1970,1,1, tzinfo=utc)).total_seconds() + final_time_seconds = initial_time_seconds + number_of_timesteps*simulation_time_step_seconds + time_array = np.arange(initial_time_seconds, final_time_seconds, simulation_time_step_seconds) + time_var[:] = time_array + + #time_bnds + time_bnds_var = data_out_nc.createVariable('time_bnds', 'i4', + ('time', 'nv',)) + for time_index, time_element in enumerate(time_array): + time_bnds_var[time_index, 0] = time_element + time_bnds_var[time_index, 1] = time_element+simulation_time_step_seconds + + #longitude + lon_var = data_out_nc.createVariable('lon', 'f8', ('rivid',), + fill_value=-9999.0) + lon_var.long_name = 'longitude of a point related to each river reach' + lon_var.standard_name = 'longitude' + lon_var.units = 'degrees_east' + lon_var.axis = 'X' + + #latitude + lat_var = data_out_nc.createVariable('lat', 'f8', ('rivid',), + fill_value=-9999.0) + lat_var.long_name = 'latitude of a point related to each river reach' + lat_var.standard_name = 'latitude' + lat_var.units = 'degrees_north' + lat_var.axis = 'Y' + + crs_var = data_out_nc.createVariable('crs', 'i4') + crs_var.grid_mapping_name = 'latitude_longitude' + crs_var.epsg_code = 'EPSG:4326' # WGS 84 + crs_var.semi_major_axis = 6378137.0 + crs_var.inverse_flattening = 298.257223563 + + #add global attributes + data_out_nc.Conventions = 'CF-1.6' + data_out_nc.title = 'RAPID Inflow from {0}'.format(land_surface_model_description) + data_out_nc.history = 'date_created: {0}'.format(datetime.utcnow().replace(tzinfo=utc)) + data_out_nc.featureType = 'timeSeries' + data_out_nc.institution = modeling_institution + + #write lat lon data + self._write_lat_lon(data_out_nc, in_rivid_lat_lon_z_file) + + #close file + data_out_nc.close() + except RuntimeError: + print("File size too big to add data beforehand. Performing conversion after ...") + pass \ No newline at end of file diff --git a/RAPIDpy/inflow/CreateInflowFileFromLDASRunoff.py b/RAPIDpy/inflow/CreateInflowFileFromLDASRunoff.py new file mode 100644 index 0000000..3105a26 --- /dev/null +++ b/RAPIDpy/inflow/CreateInflowFileFromLDASRunoff.py @@ -0,0 +1,220 @@ +# -*- coding: utf-8 -*- +# +# CreateInflowFileFromLDASRunoff.py +# RAPIDpy +# +# Created by Alan D. Snow (adapted from CreateInflowFileFromECMWFRunoff.py). +# Copyright © 2015-2016 Alan D Snow. All rights reserved. +# License: BSD-3 Clause + +import netCDF4 as NET +import numpy as NUM +import os +from past.builtins import xrange + +from .CreateInflowFileFromGriddedRunoff import CreateInflowFileFromGriddedRunoff + + +class CreateInflowFileFromLDASRunoff(CreateInflowFileFromGriddedRunoff): + def __init__(self, lat_dim, # "g0_lat_0", + lon_dim, # "g0_lon_1", + lat_var, # "g0_lat_0", + lon_var, # "g0_lon_1", + runoff_vars, # ["Qsb_GDS0_SFC_ave1h", "Qs_GDS0_SFC_ave1h"], + ): + """Define the attributes to look for""" + self.dims_oi = [lon_dim, lat_dim] + self.vars_oi = [lon_var, lat_var] + runoff_vars + self.runoff_vars = runoff_vars + + self.length_time = {"Hourly": 1} + self.errorMessages = ["Missing Variable 'time'", + "Incorrect dimensions in the input runoff file.", + "Incorrect variables in the input runoff file.", + "Incorrect time variable in the input runoff file", + "Incorrect number of columns in the weight table", + "No or incorrect header in the weight table", + "Incorrect sequence of rows in the weight table"] + + super(CreateInflowFileFromLDASRunoff, self).__init__() + + def dataValidation(self, in_nc): + """Check the necessary dimensions and variables in the input netcdf data""" + data_nc = NET.Dataset(in_nc) + for dim in self.dims_oi: + if dim not in data_nc.dimensions.keys(): + data_nc.close() + raise Exception(self.errorMessages[1]) + + for var in self.vars_oi: + if var not in data_nc.variables.keys(): + data_nc.close() + raise Exception(self.errorMessages[2]) + + data_nc.close() + return + + def execute(self, nc_file_list, index_list, in_weight_table, + out_nc, grid_type, mp_lock): + + """The source code of the tool.""" + if not os.path.exists(out_nc): + print("ERROR: Outfile has not been created. You need to run: " + "generateOutputInflowFile function ...") + raise Exception("ERROR: Outfile has not been created. " + "You need to run: generateOutputInflowFile function ...") + + if len(nc_file_list) != len(index_list): + print("ERROR: Number of runoff files not equal to number of indices ...") + raise Exception("ERROR: Number of runoff files not equal to number of indices ...") + + self.readInWeightTable(in_weight_table) + + # get indices of subset of data + lon_ind_all = [int(i) for i in self.dict_list[self.header_wt[2]]] + lat_ind_all = [int(j) for j in self.dict_list[self.header_wt[3]]] + + # Obtain a subset of runoff data based on the indices in the weight table + min_lon_ind_all = min(lon_ind_all) + max_lon_ind_all = max(lon_ind_all) + min_lat_ind_all = min(lat_ind_all) + max_lat_ind_all = max(lat_ind_all) + lon_slice = slice(min_lon_ind_all, max_lon_ind_all + 1) + lat_slice = slice(min_lat_ind_all, max_lat_ind_all + 1) + index_new = [] + conversion_factor = None + + # combine inflow data + for nc_file_array_index, nc_file_array in enumerate(nc_file_list): + + index = index_list[nc_file_array_index] + + if not isinstance(nc_file_array, list): + nc_file_array = [nc_file_array] + else: + nc_file_array = nc_file_array + + data_subset_all = None + + for nc_file in nc_file_array: + # Validate the netcdf dataset + self.dataValidation(nc_file) + + ''' Read the netcdf dataset''' + data_in_nc = NET.Dataset(nc_file) + + '''Calculate water inflows''' + # print("Calculating water inflows for {0} {1} ...".format(os.path.basename(nc_file) , grid_type)) + runoff_dimension_size = len(data_in_nc.variables[self.vars_oi[2]].dimensions) + if runoff_dimension_size == 2: + # obtain subset of surface and subsurface runoff + data_subset_runoff = data_in_nc.variables[self.runoff_vars[0]][lat_slice, lon_slice] + for var_name in self.runoff_vars[1:]: + data_subset_runoff += data_in_nc.variables[var_name][lat_slice, lon_slice] + + # get runoff dims + len_time_subset = 1 + len_lat_subset = data_subset_runoff.shape[0] + len_lon_subset = data_subset_runoff.shape[1] + + # reshape the runoff + data_subset_runoff = data_subset_runoff.reshape(len_lat_subset * len_lon_subset) + + elif runoff_dimension_size == 3: + # obtain subset of surface and subsurface runoff + data_subset_runoff = data_in_nc.variables[self.runoff_vars[0]][:, lat_slice, lon_slice] + for var_name in self.runoff_vars[1:]: + data_subset_runoff += data_in_nc.variables[var_name][:, lat_slice, lon_slice] + + # get runoff dims + len_time_subset = data_subset_runoff.shape[0] + len_lat_subset = data_subset_runoff.shape[1] + len_lon_subset = data_subset_runoff.shape[2] + # reshape the runoff + data_subset_runoff = data_subset_runoff.reshape(len_time_subset, + (len_lat_subset * len_lon_subset)) + + if conversion_factor == None: + # get conversion_factor + conversion_factor = 0.001 #convert from kg/m^2 (i.e. mm) to m + if "s" in data_in_nc.variables[self.vars_oi[2]].getncattr("units"): + # that means kg/m^2/s in GLDAS v1 that is 3-hr avg, so multiply + # by 3 hr (ex. 3*3600). Assumed same for others (ex. 1*3600). + # ftp://hydro1.sci.gsfc.nasa.gov/data/s4pa/GLDAS_V1/README.GLDAS.pdf + # If combining files, need to take average of these, so divide by number of files + conversion_factor *= self.simulation_time_step_seconds/len(nc_file_array) + data_in_nc.close() + + if not index_new: + # compute new indices based on the data_subset_surface + for r in range(0,self.count): + ind_lat_orig = lat_ind_all[r] + ind_lon_orig = lon_ind_all[r] + index_new.append((ind_lat_orig - min_lat_ind_all)*len_lon_subset +\ + (ind_lon_orig - min_lon_ind_all)) + + # obtain a new subset of data + if runoff_dimension_size == 2: + data_subset_new = data_subset_runoff[index_new] + elif runoff_dimension_size == 3: + data_subset_new = data_subset_runoff[:, index_new] + + # FILTER DATA + try: + # set masked values to zero + data_subset_new = data_subset_new.filled(fill_value=0) + except AttributeError: + pass + # set negative values to zero + data_subset_new[data_subset_new<0] = 0 + + # combine data + if data_subset_all is None: + data_subset_all = data_subset_new + else: + data_subset_all = NUM.add(data_subset_all, data_subset_new) + + if runoff_dimension_size == 3 and len_time_subset > 1: + inflow_data = NUM.zeros((len_time_subset, self.size_streamID)) + else: + inflow_data = NUM.zeros(self.size_streamID) + + pointer = 0 + for stream_index in xrange(self.size_streamID): + npoints = int(self.dict_list[self.header_wt[4]][pointer]) + # Check if all npoints points correspond to the same streamID + if len(set(self.dict_list[self.header_wt[0]][pointer : (pointer + npoints)])) != 1: + print("ROW INDEX {0}".format(pointer)) + print("COMID {0}".format(self.dict_list[self.header_wt[0]][pointer])) + raise Exception(self.errorMessages[2]) + + area_sqm_npoints = \ + NUM.array([float(k) for k in \ + self.dict_list[self.header_wt[1]][pointer : (pointer + npoints)]]) + + # assume data is incremental + if runoff_dimension_size == 3: + data_goal = data_subset_all[:, pointer:(pointer + npoints)] + else: + data_goal = data_subset_all[pointer:(pointer + npoints)] + + ro_stream = data_goal * area_sqm_npoints * conversion_factor + # filter nan + ro_stream[NUM.isnan(ro_stream)] = 0 + + if ro_stream.any(): + if runoff_dimension_size == 3 and len_time_subset > 1: + inflow_data[:,stream_index] = ro_stream.sum(axis=1) + else: + inflow_data[stream_index] = ro_stream.sum() + + pointer += npoints + # only one process is allowed to write at a time to netcdf file + mp_lock.acquire() + data_out_nc = NET.Dataset(out_nc, "a", format = "NETCDF3_CLASSIC") + if runoff_dimension_size == 3 and len_time_subset > 1: + data_out_nc.variables['m3_riv'][index*len_time_subset:(index+1)*len_time_subset,:] = inflow_data + else: + data_out_nc.variables['m3_riv'][index] = inflow_data + data_out_nc.close() + mp_lock.release() diff --git a/RAPIDpy/inflow/CreateInflowFileFromWRFHydroRunoff.py b/RAPIDpy/inflow/CreateInflowFileFromWRFHydroRunoff.py new file mode 100644 index 0000000..94965b0 --- /dev/null +++ b/RAPIDpy/inflow/CreateInflowFileFromWRFHydroRunoff.py @@ -0,0 +1,27 @@ +'''------------------------------------------------------------------------------- + Source Name: CreateInflowFileFromWRFHydroRunoff.py + Author: Environmental Systems Research Institute Inc. + Updated by: Alan D. Snow, US Army ERDC + Description: Creates RAPID inflow file based on the WRF_Hydro land model output + and the weight table previously created. + History: Initial coding - 10/17/2014, version 1.0 + ------------------------------------------------------------------------------''' +from .CreateInflowFileFromLDASRunoff import CreateInflowFileFromLDASRunoff + + +class CreateInflowFileFromWRFHydroRunoff(CreateInflowFileFromLDASRunoff): + def __init__(self, lat_dim="south_north", + lon_dim="west_east", + lat_var="XLAT", + lon_var="XLONG", + surface_runoff_var="SFROFF", + subsurface_runoff_var="UDROFF"): + + """Define the tool (tool name is the name of the class).""" + + super(CreateInflowFileFromWRFHydroRunoff, self).__init__(lat_dim, lon_dim, lat_var, lon_var, + [surface_runoff_var, subsurface_runoff_var]) + + self.header_wt = ['rivid', 'area_sqm', 'west_east', 'south_north', 'npoints'] + # According to David Gochis, underground runoff is "a major fraction of total river flow in most places" + self.dims_oi = ['Time', lat_dim, lon_dim] diff --git a/RAPIDpy/inflow/__init__.py b/RAPIDpy/inflow/__init__.py new file mode 100644 index 0000000..9df5de6 --- /dev/null +++ b/RAPIDpy/inflow/__init__.py @@ -0,0 +1 @@ +from .lsm_rapid_process import run_lsm_rapid_process \ No newline at end of file diff --git a/RAPIDpy/inflow/lsm_rapid_process.py b/RAPIDpy/inflow/lsm_rapid_process.py new file mode 100644 index 0000000..0649723 --- /dev/null +++ b/RAPIDpy/inflow/lsm_rapid_process.py @@ -0,0 +1,951 @@ +# -*- coding: utf-8 -*- +# +# lsm_rapid_process.py +# RAPIDpy +# +# Created by Alan D. Snow. +# Copyright © 2015-2016 Alan D Snow. All rights reserved. +# License: BSD 3-Clause + +from datetime import datetime, timedelta +import multiprocessing +import os +import re +import traceback + +# external packages +import pandas as pd +import pangaea +from netCDF4 import Dataset +import numpy as np + +# local imports +from ..rapid import RAPID +from .CreateInflowFileFromERAInterimRunoff import CreateInflowFileFromERAInterimRunoff +from .CreateInflowFileFromLDASRunoff import CreateInflowFileFromLDASRunoff +from .CreateInflowFileFromWRFHydroRunoff import CreateInflowFileFromWRFHydroRunoff +from ..postprocess.generate_return_periods import generate_return_periods +from ..postprocess.generate_seasonal_averages import generate_seasonal_averages +from ..utilities import (case_insensitive_file_search, + get_valid_directory_list, + partition) + + +# ------------------------------------------------------------------------------ +# MULTIPROCESSING FUNCTION +# ------------------------------------------------------------------------------ +def generate_inflows_from_runoff(args): + """ + prepare runoff inflow file for rapid + """ + runoff_file_list = args[0] + file_index_list = args[1] + weight_table_file = args[2] + grid_type = args[3] + rapid_inflow_file = args[4] + RAPID_Inflow_Tool = args[5] + mp_lock = args[6] + + time_start_all = datetime.utcnow() + + if not isinstance(runoff_file_list, list): + runoff_file_list = [runoff_file_list] + else: + runoff_file_list = runoff_file_list + + if not isinstance(file_index_list, list): + file_index_list = [file_index_list] + else: + file_index_list = file_index_list + if runoff_file_list and file_index_list: + # prepare ECMWF file for RAPID + index_string = "Index: {0}".format(file_index_list[0]) + if len(file_index_list) > 1: + index_string += " to {0}".format(file_index_list[-1]) + print(index_string) + runoff_string = "File(s): {0}".format(runoff_file_list[0]) + if len(runoff_file_list) > 1: + runoff_string += " to {0}".format(runoff_file_list[-1]) + print(runoff_string) + print("Converting inflow ...") + try: + RAPID_Inflow_Tool.execute(nc_file_list=runoff_file_list, + index_list=file_index_list, + in_weight_table=weight_table_file, + out_nc=rapid_inflow_file, + grid_type=grid_type, + mp_lock=mp_lock, + ) + except Exception: + # This prints the type, value, and stack trace of the + # current exception being handled. + traceback.print_exc() + raise + + time_finish_ecmwf = datetime.utcnow() + print("Time to convert inflows: {0}".format(time_finish_ecmwf-time_start_all)) + +# ------------------------------------------------------------------------------ +# UTILITY FUNCTIONS +# ------------------------------------------------------------------------------ + +DEFAULT_LSM_INPUTS = { + 't255': { + 'file_datetime_re_pattern': r'\d{8}', + 'file_datetime_pattern': "%Y%m%d", + }, + 't511': { + 'file_datetime_re_pattern': r'\d{8}', + 'file_datetime_pattern': "%Y%m%d", + }, + 't159': { + 'file_datetime_re_pattern': r'\d{8}', + 'file_datetime_pattern': "%Y%m%d", + }, + 'gldas2': { + 'file_datetime_re_pattern': r'\d{8}\.\d{2}', + 'file_datetime_pattern': "%Y%m%d.%H", + }, + 'gldas': { + 'file_datetime_re_pattern': r'\d{8}\.\d{2}', + 'file_datetime_pattern': "%Y%m%d.%H", + }, + 'nldas': { + 'file_datetime_re_pattern': r'\d{8}\.\d{2}', + 'file_datetime_pattern': "%Y%m%d.%H", + }, + 'cmip5': { + 'file_datetime_re_pattern': r'\d{4}', + 'file_datetime_pattern': "%Y", + }, + 'lis': { + 'file_datetime_re_pattern': r'\d{10}', + 'file_datetime_pattern': "%Y%m%d%H", + }, + 'joules': { + 'file_datetime_re_pattern': r'\d{10}', + 'file_datetime_pattern': "%Y%m%d%H", + }, + 'wrf': { + 'file_datetime_re_pattern': r'\d{10}', + 'file_datetime_pattern': "%Y%m%d%H", + }, +} + + +def identify_lsm_grid(lsm_grid_path): + """ + This is used to idenfity the input LSM grid + """ + # check to see what kind of file we are dealing with + lsm_example_file = Dataset(lsm_grid_path) + + # INDENTIFY LAT/LON DIMENSIONS + dim_list = lsm_example_file.dimensions.keys() + + latitude_dim = "lat" + if 'latitude' in dim_list: + latitude_dim = 'latitude' + elif 'g0_lat_0' in dim_list: + # GLDAS/NLDAS MOSAIC + latitude_dim = 'g0_lat_0' + elif 'lat_110' in dim_list: + # NLDAS NOAH/VIC + latitude_dim = 'lat_110' + elif 'north_south' in dim_list: + # LIS/Joules + latitude_dim = 'north_south' + elif 'south_north' in dim_list: + # WRF Hydro + latitude_dim = 'south_north' + elif 'Y' in dim_list: + # FLDAS + latitude_dim = 'Y' + + longitude_dim = "lon" + if 'longitude' in dim_list: + longitude_dim = 'longitude' + elif 'g0_lon_1' in dim_list: + # GLDAS/NLDAS MOSAIC + longitude_dim = 'g0_lon_1' + elif 'lon_110' in dim_list: + # NLDAS NOAH/VIC + longitude_dim = 'lon_110' + elif 'east_west' in dim_list: + # LIS/Joules + longitude_dim = 'east_west' + elif 'west_east' in dim_list: + # WRF Hydro + longitude_dim = 'west_east' + elif 'X' in dim_list: + # FLDAS + longitude_dim = 'X' + + time_dim = None + if 'time' in dim_list: + time_dim = 'time' + elif 'Time' in dim_list: + time_dim = 'Time' + elif 'Times' in dim_list: + time_dim = 'Times' + elif 'times' in dim_list: + time_dim = 'times' + + + lat_dim_size = len(lsm_example_file.dimensions[latitude_dim]) + lon_dim_size = len(lsm_example_file.dimensions[longitude_dim]) + + # IDENTIFY VARIABLES + var_list = lsm_example_file.variables.keys() + + latitude_var = "lat" + if 'latitude' in var_list: + latitude_var = 'latitude' + elif 'g0_lat_0' in var_list: + latitude_var = 'g0_lat_0' + elif 'lat_110' in var_list: + latitude_var = 'lat_110' + elif 'north_south' in var_list: + latitude_var = 'north_south' + elif 'XLAT' in var_list: + # WRF + latitude_var = 'XLAT' + elif 'Y' in var_list: + # FLDAS + latitude_var = 'Y' + + longitude_var = "lon" + if 'longitude' in var_list: + longitude_var = 'longitude' + elif 'g0_lon_1' in var_list: + longitude_var = 'g0_lon_1' + elif 'lon_110' in var_list: + longitude_var = 'lon_110' + elif 'east_west' in var_list: + longitude_var = 'east_west' + elif 'XLONG' in var_list: + # WRF + longitude_var = 'XLONG' + elif 'X' in var_list: + # FLDAS + longitude_var = 'X' + + time_var = None + if 'time' in var_list: + time_var = 'time' + elif 'Time' in var_list: + time_var = 'Time' + elif 'Times' in var_list: + time_var = 'Times' + elif 'times' in var_list: + time_var = 'times' + + surface_runoff_var = "" + subsurface_runoff_var = "" + total_runoff_var = "" + for var in var_list: + if var.startswith("SSRUN"): + # NLDAS/GLDAS + surface_runoff_var = var + elif var.startswith("BGRUN"): + # NLDAS/GLDAS + subsurface_runoff_var = var + elif var == "Qs_acc": + # GLDAS v2 + surface_runoff_var = var + elif var == "Qsb_acc": + # GLDAS v2 + subsurface_runoff_var = var + elif var == "Qs_tavg": + # FLDAS + surface_runoff_var = var + elif var == "Qsb_tavg": + # FLDAS + subsurface_runoff_var = var + elif var == "Qs_inst": + # LIS + surface_runoff_var = var + elif var == "Qsb_inst": + # LIS + subsurface_runoff_var = var + elif var == "SFROFF": + # WRF Hydro + surface_runoff_var = var + elif var == "UDROFF": + # WRF Hydro + subsurface_runoff_var = var + elif var.lower() == "ro": + # ERA Interim + total_runoff_var = var + elif var == "total runoff": + # CMIP5 data + total_runoff_var = var + + # IDENTIFY GRID TYPE + lsm_file_data = { + "weight_file_name": "", + "grid_type": "", + "model_name": "", + "description": "", + "rapid_inflow_tool": None, + "latitude_var": latitude_var, + "longitude_var": longitude_var, + "time_var": time_var, + "latitude_dim": latitude_dim, + "longitude_dim": longitude_dim, + "time_dim": time_dim, + } + + institution = "" + title = "" + try: + institution = lsm_example_file.getncattr("institution") + except AttributeError: + pass + try: + title = lsm_example_file.getncattr("title") + except AttributeError: + pass + + runoff_vars = [surface_runoff_var, subsurface_runoff_var] + + if institution == "European Centre for Medium-Range Weather Forecasts" \ + or total_runoff_var.lower() == "ro": + # these are the ECMWF models + if lat_dim_size == 361 and lon_dim_size == 720: + print("Runoff file identified as ERA Interim Low Res (T255) GRID") + # A) ERA Interim Low Res (T255) + # Downloaded as 0.5 degree grid + # dimensions: + # longitude = 720 ; + # latitude = 361 ; + lsm_file_data["description"] = "ERA Interim (T255 Grid)" + lsm_file_data["model_name"] = "erai" + lsm_file_data["weight_file_name"] = r'weight_era_t255\.csv' + lsm_file_data["grid_type"] = 't255' + + elif lat_dim_size == 512 and lon_dim_size == 1024: + print("Runoff file identified as ERA Interim High Res (T511) GRID") + # B) ERA Interim High Res (T511) + # dimensions: + # lon = 1024 ; + # lat = 512 ; + lsm_file_data["description"] = "ERA Interim (T511 Grid)" + lsm_file_data["weight_file_name"]= r'weight_era_t511\.csv' + lsm_file_data["model_name"] = "erai" + lsm_file_data["grid_type"] = 't511' + elif lat_dim_size == 161 and lon_dim_size == 320: + print("Runoff file identified as ERA 20CM (T159) GRID") + # C) ERA 20CM (T159) - 3hr - 10 ensembles + # Downloaded as 1.125 degree grid + # dimensions: + # longitude = 320 ; + # latitude = 161 ; + lsm_file_data["description"] = "ERA 20CM (T159 Grid)" + lsm_file_data["weight_file_name"] = r'weight_era_t159\.csv' + lsm_file_data["model_name"] = "era_20cm" + lsm_file_data["grid_type"] = 't159' + else: + lsm_example_file.close() + raise Exception("Unsupported ECMWF grid.") + + lsm_file_data["rapid_inflow_tool"] = \ + CreateInflowFileFromERAInterimRunoff() + + elif institution == "NASA GSFC": + if title == "GLDAS2.0 LIS land surface model output": + print("Runoff file identified as GLDAS v2 LIS GRID") + # this is the LIS model + lsm_file_data["weight_file_name"] = r'weight_gldas2\.csv' + lsm_file_data["grid_type"] = 'gldas2' + lsm_file_data["description"] = "GLDAS2.0 LIS" + lsm_file_data["model_name"] = "nasa" + + else: + print("Runoff file identified as LIS GRID") + # this is the LIS model (can be FLDAS) + # THIS CASE CAN ALSO BE FOR FLDAS, however you will need to add + # the file_datetime_pattern && file_datetime_re_pattern for it to + # work if it is not 3-hourly time step. + lsm_file_data["weight_file_name"] = r'weight_lis\.csv' + lsm_file_data["grid_type"] = 'lis' + lsm_file_data["description"] = "NASA GSFC LIS" + lsm_file_data["model_name"] = "nasa" + + elif institution == "Met Office, UK": + print("Runoff file identified as Joules GRID") + lsm_file_data["weight_file_name"] = r'weight_joules\.csv' + lsm_file_data["grid_type"] = 'joules' + lsm_file_data["description"] = "Met Office Joules" + lsm_file_data["model_name"] = "met_office" + + elif institution == "NCAR, USACE, USBR": + print("Runoff file identified as CMIP5") + lsm_file_data["weight_file_name"] = r'weight_cmip5\.csv' + lsm_file_data["grid_type"] = 'cmip5' + lsm_file_data["description"] = "CMIP5 Runoff" + lsm_file_data["model_name"] = "cmip5" + + runoff_vars = [total_runoff_var] + + elif surface_runoff_var.startswith("SSRUN") \ + and subsurface_runoff_var.startswith("BGRUN"): + + lsm_file_data["model_name"] = "nasa" + if lat_dim_size == 600 and lon_dim_size == 1440: + print("Runoff file identified as GLDAS GRID") + # GLDAS NC FILE + # dimensions: + # g0_lat_0 = 600 ; + # g0_lon_1 = 1440 ; + # variables + # SSRUN_GDS0_SFC_ave1h (surface), BGRUN_GDS0_SFC_ave1h (subsurface) + # or + # SSRUNsfc_GDS0_SFC_ave1h (surface), BGRUNsfc_GDS0_SFC_ave1h (subsurface) + lsm_file_data["description"] = "GLDAS" + lsm_file_data["weight_file_name"] = r'weight_gldas\.csv' + lsm_file_data["grid_type"] = 'gldas' + + elif lat_dim_size <= 224 and lon_dim_size <= 464: + print("Runoff file identified as NLDAS GRID") + # NLDAS MOSAIC FILE + # dimensions: + # g0_lat_0 = 224 ; + # g0_lon_1 = 464 ; + # NLDAS NOAH/VIC FILE + # dimensions: + # lat_110 = 224 ; + # lon_110 = 464 ; + + lsm_file_data["description"] = "NLDAS" + lsm_file_data["weight_file_name"] = r'weight_nldas\.csv' + lsm_file_data["grid_type"] = 'nldas' + else: + lsm_example_file.close() + raise Exception("Unsupported runoff grid.") + + else: + title = "" + try: + title = lsm_example_file.getncattr("TITLE") + except AttributeError: + pass + + if "WRF" in title: + lsm_file_data["description"] = "WRF/WRF-Hydro Runoff" + lsm_file_data["weight_file_name"] = r'weight_wrf\.csv' + lsm_file_data["model_name"] = 'wrf' + lsm_file_data["grid_type"] = 'wrf' + + lsm_file_data['rapid_inflow_tool'] = \ + CreateInflowFileFromWRFHydroRunoff( + latitude_dim, + longitude_dim, + latitude_var, + longitude_var, + surface_runoff_var, + subsurface_runoff_var, + ) + else: + lsm_example_file.close() + raise Exception("Unsupported LSM grid.") + + lsm_example_file.close() + + # set the inflow tool to use the LDAS tool by default + if lsm_file_data["rapid_inflow_tool"] is None: + lsm_file_data["rapid_inflow_tool"] = \ + CreateInflowFileFromLDASRunoff( + latitude_dim, + longitude_dim, + latitude_var, + longitude_var, + runoff_vars, + ) + + return lsm_file_data + + +def determine_start_end_timestep(lsm_file_list, file_re_match=None, file_datetime_pattern=None, + expected_time_step=None, lsm_grid_info=None): + """ + Determine the start and end date from LSM input files + """ + + if lsm_grid_info is None: + lsm_grid_info = identify_lsm_grid(lsm_file_list[0]) + + if None in (lsm_grid_info['time_var'], lsm_grid_info['time_dim'])\ + or lsm_grid_info['model_name'] in ('era_20cm', 'erai'): + # NOTE: the ERA20CM and ERA 24hr time variables in the tests are erroneous + if None in (file_re_match, file_datetime_pattern): + raise ValueError("LSM files missing time dimension and/or variable." + "To mitigate this, add the 'file_re_match' and " + "'file_datetime_pattern' arguments.") + + if lsm_grid_info['time_dim'] is None: + print("Assuming time dimension is 1") + file_size_time = 1 + else: + lsm_example_file = Dataset(lsm_file_list[0]) + file_size_time = len(lsm_example_file.dimensions[lsm_grid_info['time_dim']]) + lsm_example_file.close() + + total_num_time_steps = int(file_size_time * len(lsm_file_list)) + + # determine the start time from the existing files + actual_simulation_start_datetime = datetime.strptime(file_re_match.search(lsm_file_list[0]).group(0), + file_datetime_pattern) + + # check to see if the time step matches expected + if len(lsm_file_list) > 1: + time_step = int((datetime.strptime(file_re_match.search(lsm_file_list[1]).group(0), file_datetime_pattern) + - actual_simulation_start_datetime).total_seconds() + / float(file_size_time)) + + elif expected_time_step is not None: + time_step = int(expected_time_step) + else: + raise ValueError("Only one LSM file with one timestep present. " + "'expected_time_step' parameter required to continue.") + + # determine the end datetime + actual_simulation_end_datetime = \ + datetime.strptime(file_re_match.search(lsm_file_list[-1]).group(0), + file_datetime_pattern) \ + + timedelta(seconds=(file_size_time-1) * time_step) + else: + with pangaea.open_mfdataset(lsm_file_list, + lat_var=lsm_grid_info['latitude_var'], + lon_var=lsm_grid_info['longitude_var'], + time_var=lsm_grid_info['time_var'], + lat_dim=lsm_grid_info['latitude_dim'], + lon_dim=lsm_grid_info['longitude_dim'], + time_dim=lsm_grid_info['time_dim']) as xds: + + datetime_arr = [pd.to_datetime(dval) for dval in xds.lsm.datetime.values] + actual_simulation_start_datetime = datetime_arr[0] + actual_simulation_end_datetime = datetime_arr[-1] + total_num_time_steps = len(datetime_arr) + + if total_num_time_steps <= 1: + if expected_time_step is not None: + time_step = int(expected_time_step) + else: + raise ValueError("Only one LSM file with one timestep present. " + "'expected_time_step' parameter required to continue.") + + else: + time_step = int(np.diff(xds.lsm.datetime.values)[0] / np.timedelta64(1, 's')) + + if expected_time_step is not None: + if time_step != int(expected_time_step): + print("WARNING: The time step used {0} is different than expected {1}".format(time_step, + expected_time_step)) + + return actual_simulation_start_datetime, actual_simulation_end_datetime, time_step, total_num_time_steps + +# ------------------------------------------------------------------------------ +# MAIN PROCESS +# ------------------------------------------------------------------------------ +def run_lsm_rapid_process(rapid_executable_location, + lsm_data_location, + rapid_io_files_location=None, + rapid_input_location=None, + rapid_output_location=None, + simulation_start_datetime=None, + simulation_end_datetime=datetime.utcnow(), + file_datetime_pattern=None, + file_datetime_re_pattern=None, + initial_flows_file=None, + ensemble_list=[None], + generate_rapid_namelist_file=True, + run_rapid_simulation=True, + generate_return_periods_file=False, + return_period_method='weibul', + generate_seasonal_averages_file=False, + generate_seasonal_initialization_file=False, + generate_initialization_file=False, + use_all_processors=True, + num_processors=1, + mpiexec_command="mpiexec", + cygwin_bin_location="", + modeling_institution="US Army Engineer Research and Development Center", + convert_one_hour_to_three=False, + expected_time_step=None, + ): + """ + This is the main process to generate inflow for RAPID and to run RAPID. + + Args: + rapid_executable_location(str): Path to the RAPID executable. + lsm_data_location(str): Path to the directory containing the Land Surface Model output files. + rapid_io_files_location(Optional[str]): Path to the directory containing the input and output folders for RAPID. This is for running multiple watersheds. + rapid_input_location(Optional[str]): Path to directory with RAPID simulation input data. Required if `rapid_io_files_location` is not set. + rapid_output_location(Optional[str]): Path to directory to put output. Required if `rapid_io_files_location` is not set. + simulation_start_datetime(Optional[datetime]): Datetime object with date bound of earliest simulation start. + simulation_end_datetime(Optional[datetime]): Datetime object with date bound of latest simulation end. Defaults to datetime.utcnow(). + file_datetime_pattern(Optional[str]): Datetime pattern for files (Ex. '%Y%m%d%H'). If set, file_datetime_re_pattern is required. Various defaults used by each model. + file_datetime_re_pattern(Optional[raw str]): Regex pattern to extract datetime (Ex. r'\d{10}'). If set, file_datetime_pattern is required. Various defaults used by each model. + initial_flows_file(Optional[str]): If given, this is the path to a file with initial flows for the simulaion. + ensemble_list(Optional[list]): This is the expexted ensemble name appended to the end of the file name. + generate_rapid_namelist_file(Optional[bool]): If True, this will create a RAPID namelist file for the run in your RAPID input directory. Default is True. + run_rapid_simulation(Optional[bool]): If True, the RAPID simulation will run after generating the inflow file. Default is True. + generate_return_periods_file(Optional[bool]): If True, the return period file will be generated in the output. Default is False. + return_period_method(Optional[str]): If True, the return period file will be generated in the output. Default is False. + generate_seasonal_averages_file(Optional[bool]): If True, the season average file will be generated. Default is False. + generate_seasonal_initialization_file(Optional[bool]): If True, an intialization based on the seasonal average for the current day of the year will be created. Default is False. + generate_initialization_file(Optional[bool]): If True, an initialization file from the last time step of the simulation willl be created. Default is False. + use_all_processors(Optional[bool]): If True, it will use all available processors to perform this operation. Default is True. + num_processors(Optional[int]): If use_all_processors is False, this argument will determine the number of processors to use. Default is 1. + mpiexec_command(Optional[str]): This is the command to execute RAPID. Default is "mpiexec". + cygwin_bin_location(Optional[str]): If using Windows, this is the path to the Cygwin bin location. Default is "". + modeling_institution(Optional[str]): This is the institution performing the modeling and is in the output files. Default is "US Army Engineer Research and Development Center". + convert_one_hour_to_three(Optional[bool]): If the time step is expected to be 1-hr it will convert to 3. Set to False if the LIS, NLDAS, or Joules grid time step is greater than 1-hr. + expected_time_step(Optional[int]): The time step in seconds of your LSM input data if only one file is given. Required if only one file is present. + + Returns: + list: A list of output file information. + + Example of regular run: + + .. code:: python + + from datetime import datetime + from RAPIDpy.inflow import run_lsm_rapid_process + #------------------------------------------------------------------------------ + #main process + #------------------------------------------------------------------------------ + if __name__ == "__main__": + run_lsm_rapid_process( + rapid_executable_location='/home/alan/rapid/src/rapid', + rapid_io_files_location='/home/alan/rapid-io', + lsm_data_location='/home/alan/era_data', + ) + + Example of single input/output run: + + .. code:: python + + from datetime import datetime + from RAPIDpy.inflow import run_lsm_rapid_process + #------------------------------------------------------------------------------ + #main process + #------------------------------------------------------------------------------ + if __name__ == "__main__": + run_lsm_rapid_process( + rapid_executable_location='/home/alan/rapid/src/rapid', + rapid_input_location='/home/alan/rapid-io/input/provo_watershed', + rapid_output_location='/home/alan/rapid-io/output/provo_watershed', + lsm_data_location='/home/alan/era_data', + ) + Example of run with FLDAS and datetime filter: + + .. note:: http://disc.sci.gsfc.nasa.gov/uui/datasets?keywords=FLDAS + + .. code:: python + + from datetime import datetime + from RAPIDpy.inflow import run_lsm_rapid_process + #------------------------------------------------------------------------------ + #main process + #------------------------------------------------------------------------------ + if __name__ == "__main__": + run_lsm_rapid_process( + rapid_executable_location='/home/alan/rapid/src/rapid', + rapid_io_files_location='/home/alan/rapid-io', + lsm_data_location='/home/alan/lsm_data', + simulation_start_datetime=datetime(1980, 1, 1), + file_datetime_re_pattern = r'\d{8}', + file_datetime_pattern = "%Y%m%d", + ) + + Example of run with CMIP5: + + .. note:: http://gdo-dcp.ucllnl.org/downscaled_cmip_projections/techmemo/BCSD5HydrologyMemo.pdf + + .. code:: python + + from datetime import datetime + from RAPIDpy.inflow import run_lsm_rapid_process + #------------------------------------------------------------------------------ + #main process + #------------------------------------------------------------------------------ + if __name__ == "__main__": + run_lsm_rapid_process( + rapid_executable_location='/home/jimwlewis/rapid/src/rapid', + rapid_io_files_location='/data/rapid-io4', + lsm_data_location='/data/rapid-io4/input/cmip5-jun01', + simulation_start_datetime=datetime(2001, 1, 1), + simulation_end_datetime=datetime(2002, 12, 31), + file_datetime_pattern="%Y", + file_datetime_re_pattern=r'\d{4}', + ) + """ + time_begin_all = datetime.utcnow() + + # use all processors makes precedent over num_processors arg + if use_all_processors == True: + NUM_CPUS = multiprocessing.cpu_count() + elif num_processors > multiprocessing.cpu_count(): + print("WARNING: Num processors requested exceeded max. Set to max ...") + NUM_CPUS = multiprocessing.cpu_count() + else: + NUM_CPUS = num_processors + + # get list of correclty formatted rapid input directories in rapid directory + + rapid_directories = [] + if rapid_io_files_location is not None: + main_rapid_input_directory = os.path.join(rapid_io_files_location, 'input') + for watershed_directory in get_valid_directory_list(main_rapid_input_directory): + watershed_input_path = os.path.join(main_rapid_input_directory, + watershed_directory) + watershed_output_path = os.path.join(rapid_io_files_location, + 'output', + watershed_directory) + rapid_directories.append((watershed_input_path, watershed_output_path)) + elif None not in (rapid_input_location, rapid_output_location): + rapid_directories = [(rapid_input_location, rapid_output_location)] + else: + raise ValueError("Need 'rapid_io_files_location' or 'rapid_input_location' " + "and 'rapid_output_location' set to continue.") + + all_output_file_information = [] + + for ensemble in ensemble_list: + output_file_information = { + 'ensemble' : ensemble, + } + ensemble_file_ending = ".nc" + ensemble_file_ending4 = ".nc4" + if ensemble != None: + ensemble_file_ending = "_{0}.nc".format(ensemble) + ensemble_file_ending4 = "_{0}.nc4".format(ensemble) + + # get list of files + lsm_file_list = [] + for subdir, dirs, files in os.walk(lsm_data_location, followlinks=True): + for lsm_file in files: + if lsm_file.endswith(ensemble_file_ending) or lsm_file.endswith(ensemble_file_ending4): + lsm_file_list.append(os.path.join(subdir, lsm_file)) + lsm_file_list = sorted(lsm_file_list) + + # IDENTIFY THE GRID + lsm_file_data = identify_lsm_grid(lsm_file_list[0]) + + # load in the datetime pattern + if file_datetime_pattern is None or file_datetime_re_pattern is None: + file_datetime_re_pattern = DEFAULT_LSM_INPUTS[lsm_file_data['grid_type']]['file_datetime_re_pattern'] + file_datetime_pattern = DEFAULT_LSM_INPUTS[lsm_file_data['grid_type']]['file_datetime_pattern'] + file_re_match = re.compile(file_datetime_re_pattern) + + # get subset based on time bounds + if simulation_start_datetime is not None: + print("Filtering files by datetime ...") + lsm_file_list_subset = [] + for lsm_file in lsm_file_list: + match = file_re_match.search(lsm_file) + file_date = datetime.strptime(match.group(0), file_datetime_pattern) + if file_date > simulation_end_datetime: + break + if file_date >= simulation_start_datetime: + lsm_file_list_subset.append(os.path.join(subdir, lsm_file)) + + lsm_file_list = sorted(lsm_file_list_subset) + + print("Running from {0} to {1}".format(lsm_file_list[0], + lsm_file_list[-1])) + + # get number of time steps in file + actual_simulation_start_datetime, actual_simulation_end_datetime, time_step, total_num_time_steps = \ + determine_start_end_timestep(lsm_file_list, + file_re_match=file_re_match, + file_datetime_pattern=file_datetime_pattern, + expected_time_step=expected_time_step, + lsm_grid_info=lsm_file_data) + + # VALIDATING INPUT IF DIVIDING BY 3 + time_step_multiply_factor = 1 + if (lsm_file_data['grid_type'] in ('nldas', 'lis', 'joules')) and convert_one_hour_to_three: + num_extra_files = total_num_time_steps % 3 + if num_extra_files != 0: + print("WARNING: Number of files needs to be divisible by 3. Remainder is {0}".format(num_extra_files)) + print("This means your simulation will be truncated") + total_num_time_steps /= 3 + time_step *= 3 + + # compile the file ending + out_file_ending = "{0}_{1}_{2}hr_{3:%Y%m%d}to{4:%Y%m%d}{5}".format(lsm_file_data['model_name'], + lsm_file_data['grid_type'], + int(time_step/3600), + actual_simulation_start_datetime, + actual_simulation_end_datetime, + ensemble_file_ending) + + # set up RAPID manager + rapid_manager = RAPID(rapid_executable_location=rapid_executable_location, + cygwin_bin_location=cygwin_bin_location, + num_processors=NUM_CPUS, + mpiexec_command=mpiexec_command, + ZS_TauR=time_step, # duration of routing procedure (time step of runoff data) + ZS_dtR=15*60, # internal routing time step + ZS_TauM=total_num_time_steps*time_step, # total simulation time + ZS_dtM=time_step # RAPID recommended internal time step (1 day) + ) + if initial_flows_file and os.path.exists(initial_flows_file): + rapid_manager.update_parameters( + Qinit_file=initial_flows_file, + BS_opt_Qinit=True + ) + + # run LSM processes + for master_watershed_input_directory, master_watershed_output_directory in rapid_directories: + print("Running from: {0}".format(master_watershed_input_directory)) + try: + os.makedirs(master_watershed_output_directory) + except OSError: + pass + + # create inflow to dump data into + master_rapid_runoff_file = os.path.join(master_watershed_output_directory, + 'm3_riv_bas_{0}'.format(out_file_ending)) + + weight_table_file = case_insensitive_file_search(master_watershed_input_directory, + lsm_file_data['weight_file_name']) + + try: + in_rivid_lat_lon_z_file = case_insensitive_file_search(master_watershed_input_directory, + r'comid_lat_lon_z\.csv') + except Exception: + in_rivid_lat_lon_z_file = "" + print("WARNING: comid_lat_lon_z file not found. The lat/lon will not be added ...") + pass + + print("Writing inflow file to: {0}".format(master_rapid_runoff_file)) + lsm_file_data['rapid_inflow_tool'].generateOutputInflowFile( + out_nc=master_rapid_runoff_file, + start_datetime_utc=actual_simulation_start_datetime, + number_of_timesteps=total_num_time_steps, + simulation_time_step_seconds=time_step, + in_rapid_connect_file=case_insensitive_file_search(master_watershed_input_directory, + r'rapid_connect\.csv'), + in_rivid_lat_lon_z_file=in_rivid_lat_lon_z_file, + land_surface_model_description=lsm_file_data['description'], + modeling_institution=modeling_institution + ) + + job_combinations = [] + if (lsm_file_data['grid_type'] in ('nldas', 'lis', 'joules')) and convert_one_hour_to_three: + print("Grouping {0} in threes".format(lsm_file_data['grid_type'])) + lsm_file_list = [lsm_file_list[nldas_index:nldas_index+3] + for nldas_index in range(0, len(lsm_file_list), 3) + if len(lsm_file_list[nldas_index:nldas_index+3]) == 3] + + if len(lsm_file_list) < NUM_CPUS: + NUM_CPUS = len(lsm_file_list) + mp_lock = multiprocessing.Manager().Lock() + partition_list, partition_index_list = partition(lsm_file_list, NUM_CPUS) + + for loop_index, cpu_grouped_file_list in enumerate(partition_list): + if cpu_grouped_file_list and partition_index_list[loop_index]: + job_combinations.append((cpu_grouped_file_list, + partition_index_list[loop_index], + weight_table_file, + lsm_file_data['grid_type'], + master_rapid_runoff_file, + lsm_file_data['rapid_inflow_tool'], + mp_lock)) + # COMMENTED CODE IS FOR DEBUGGING +# generate_inflows_from_runoff((cpu_grouped_file_list, +# partition_index_list[loop_index], +# lsm_file_data['weight_table_file'], +# lsm_file_data['grid_type'], +# master_rapid_runoff_file, +# lsm_file_data['rapid_inflow_tool'], +# mp_lock)) + pool = multiprocessing.Pool(NUM_CPUS) + pool.map(generate_inflows_from_runoff, + job_combinations) + pool.close() + pool.join() + + # run RAPID for the watershed + lsm_rapid_output_file = os.path.join(master_watershed_output_directory, + 'Qout_{0}'.format(out_file_ending)) + rapid_manager.update_parameters( + rapid_connect_file=case_insensitive_file_search(master_watershed_input_directory, + r'rapid_connect\.csv'), + Vlat_file=master_rapid_runoff_file, + riv_bas_id_file=case_insensitive_file_search(master_watershed_input_directory, + r'riv_bas_id\.csv'), + k_file=case_insensitive_file_search(master_watershed_input_directory, + r'k\.csv'), + x_file=case_insensitive_file_search(master_watershed_input_directory, + r'x\.csv'), + Qout_file=lsm_rapid_output_file + ) + + rapid_manager.update_reach_number_data() + + + output_file_information[os.path.basename(master_watershed_input_directory)] = { + 'm3_riv': master_rapid_runoff_file, + 'qout': lsm_rapid_output_file + } + + + if generate_rapid_namelist_file: + rapid_manager.generate_namelist_file(os.path.join(master_watershed_input_directory, + "rapid_namelist_{}".format(out_file_ending[:-3]))) + if run_rapid_simulation: + rapid_manager.run() + + rapid_manager.make_output_CF_compliant( + simulation_start_datetime=actual_simulation_start_datetime, + comid_lat_lon_z_file=in_rivid_lat_lon_z_file, + project_name="{0} Based Historical flows by {1}".format(lsm_file_data['description'], + modeling_institution) + ) + + # generate return periods + if generate_return_periods_file and os.path.exists(lsm_rapid_output_file) and lsm_rapid_output_file: + return_periods_file = os.path.join(master_watershed_output_directory, + 'return_periods_{0}'.format(out_file_ending)) + # assume storm has 3 day length + storm_length_days = 3 + generate_return_periods(qout_file=lsm_rapid_output_file, + return_period_file=return_periods_file, + num_cpus=NUM_CPUS, + storm_duration_days=storm_length_days, + method=return_period_method) + + # generate seasonal averages file + if generate_seasonal_averages_file and os.path.exists(lsm_rapid_output_file) and lsm_rapid_output_file: + seasonal_averages_file = os.path.join(master_watershed_output_directory, + 'seasonal_averages_{0}'.format(out_file_ending)) + generate_seasonal_averages(lsm_rapid_output_file, + seasonal_averages_file, + NUM_CPUS) + + # generate seasonal initialization file + if generate_seasonal_initialization_file and os.path.exists(lsm_rapid_output_file) and lsm_rapid_output_file: + seasonal_qinit_file = os.path.join(master_watershed_input_directory, + 'seasonal_qinit_{0}.csv'.format(out_file_ending[:-3])) + rapid_manager.generate_seasonal_intitialization(seasonal_qinit_file) + + # generate initialization file + if generate_initialization_file and os.path.exists(lsm_rapid_output_file) and lsm_rapid_output_file: + qinit_file = os.path.join(master_watershed_input_directory, + 'qinit_{0}.csv'.format(out_file_ending[:-3])) + rapid_manager.generate_qinit_from_past_qout(qinit_file) + + all_output_file_information.append(output_file_information) + + # print info to user + time_end = datetime.utcnow() + print("Time Begin All: {0}".format(time_begin_all)) + print("Time Finish All: {0}".format(time_end)) + print("TOTAL TIME: {0}".format(time_end-time_begin_all)) + + return all_output_file_information \ No newline at end of file diff --git a/RAPIDpy/postprocess/__init__.py b/RAPIDpy/postprocess/__init__.py new file mode 100644 index 0000000..74911ff --- /dev/null +++ b/RAPIDpy/postprocess/__init__.py @@ -0,0 +1,3 @@ +# -*- coding: utf-8 -*- +from .goodness_of_fit import find_goodness_of_fit, find_goodness_of_fit_csv +from .merge import ConvertRAPIDOutputToCF diff --git a/RAPIDpy/postprocess/generate_return_periods.py b/RAPIDpy/postprocess/generate_return_periods.py new file mode 100644 index 0000000..59bfe56 --- /dev/null +++ b/RAPIDpy/postprocess/generate_return_periods.py @@ -0,0 +1,244 @@ +# -*- coding: utf-8 -*- +## +## generate_return_periods.py +## RAPIDpy +## +## Created by Alan D. Snow and Scott D. Christensen. +## Copyright © 2015-2016 Alan D Snow and Scott D. Christensen. All rights reserved. +## License: BSD-3 Clause + +from datetime import datetime +import multiprocessing +import netCDF4 as nc +import numpy as np + +#local +from ..dataset import RAPIDDataset +from ..utilities import partition + +def generate_single_return_period(args): + """ + This function calculates a single return period for a single reach + """ + qout_file=args[0] + return_period_file=args[1] + rivid_index_list=args[2] + step=args[3] + num_years=args[4] + method=args[5] + mp_lock=args[6] + + skewvals = [-3.0, -2.8, -2.6, -2.4, -2.2, -2.0, -1.8, -1.6, -1.4, -1.2, -1.0, -0.8, -0.6, -0.4, -0.2, 0, 0.2, 0.4, + 0.6, 0.8, 1.0, 1.2, 1.4, 1.6, 1.8, 2.0, 2.2, 2.4, 2.6, 2.8, 3.0] + kfac2 = [0.396, 0.384, 0.368, 0.351, 0.33, 0.307, 0.282, 0.254, 0.225, 0.195, 0.164, 0.132, 0.099, 0.066, 0.033, 0, + -0.033, -0.066, -0.099, -0.132, -0.164, -0.195, -0.225, -0.254, -0.282, -0.307, -0.33, -0.351, -0.368, + -0.384, -0.396] + kfac10 = [0.66, 0.702, 0.747, 0.795, 0.844, 0.895, 0.945, 0.994, 1.041, 1.086, 1.128, 1.166, 1.2, 1.231, 1.258, + 1.282, 1.301, 1.317, 1.328, 1.336, 1.34, 1.34, 1.337, 1.329, 1.318, 1.302, 1.284, 1.262, 1.238, 1.21, + 1.18] + kfac25 = [.666, .712, .764, .823, .888, .959, 1.035, 1.116, 1.198, 1.282, 1.366, 1.448, 1.528, 1.606, 1.680, 1.751, + 1.818, 1.880, 1.939, 1.993, 2.043, 2.087, 2.128, 2.163, 2.193, 2.219, 2.240, 2.256, 2.267, 2.275, 2.278] + kfac50 = [0.666, 0.714, 0.768, 0.83, 0.9, 0.98, 1.069, 1.166, 1.27, 1.379, 1.492, 1.606, 1.72, 1.834, 1.945, 2.054, + 2.159, 2.261, 2.359, 2.453, 2.542, 2.626, 2.706, 2.78, 2.848, 2.912, 2.97, 3.023, 3.071, 3.114, 3.152] + kfac100 = [0.667, 0.714, 0.769, 0.832, 0.905, 0.99, 1.087, 1.197, 1.318, 1.499, 1.588, 1.733, 1.88, 2.029, 2.178, + 2.326, 2.472, 2.615, 2.755, 2.891, 3.022, 3.149, 3.271, 3.388, 3.499, 3.605, 3.705, 3.8, 3.889, 3.973, + 4.051] + + with RAPIDDataset(qout_file) as qout_nc_file: + #get index of return period data + if method == 'weibull': + rp_index_20 = int((num_years + 1)/20.0) + rp_index_10 = int((num_years + 1)/10.0) + rp_index_2 = int((num_years + 1)/2.0) + + if method == 'weibull': + return_20_array = np.zeros(len(rivid_index_list)) + elif method == 'gumble': + return_100_array = np.zeros(len(rivid_index_list)) + return_50_array = np.zeros(len(rivid_index_list)) + return_20_array = np.zeros(len(rivid_index_list)) + elif method == 'log_pearson': + return_100_array = np.zeros(len(rivid_index_list)) + return_50_array = np.zeros(len(rivid_index_list)) + return_25_array = np.zeros(len(rivid_index_list)) + return_10_array = np.zeros(len(rivid_index_list)) + return_2_array = np.zeros(len(rivid_index_list)) + max_flow_array = np.zeros(len(rivid_index_list)) + + #iterate through rivids to generate return periods + for iter_idx, rivid_index in enumerate(rivid_index_list): + filtered_flow_data = qout_nc_file.get_qout_index(rivid_index, + pd_filter="{0}D".format(step), + filter_mode="max") + sorted_flow_data = np.sort(filtered_flow_data)[:num_years:-1] + max_flow = sorted_flow_data[0] + if max_flow < 0.01: + print("WARNING: Return period data < 0.01 generated for rivid {0}" + .format(qout_nc_file.qout_nc.variables[qout_nc_file.river_id_dimension][rivid_index])) + max_flow_array[iter_idx] = max_flow + + if method == 'weibull': + return_20_array[iter_idx] = sorted_flow_data[rp_index_20] + return_10_array[iter_idx] = sorted_flow_data[rp_index_10] + return_2_array[iter_idx] = sorted_flow_data[rp_index_2] + + elif method == 'gumble': + mean_flow = np.mean(filtered_flow_data) + stddev = np.std(filtered_flow_data) + return_100_array[iter_idx] = mean_flow + 3.14*stddev + return_50_array[iter_idx] = mean_flow + 2.59*stddev + return_20_array[iter_idx] = mean_flow + 1.87*stddev + return_10_array[iter_idx] = mean_flow + 1.3*stddev + return_2_array[iter_idx] = mean_flow - .164*stddev + + elif method == 'log_pearson': + log_flow = np.log10(filtered_flow_data[filtered_flow_data>0]) + if len(log_flow)<= 0: + continue + mean_log_flow = np.mean(log_flow) + std_log_flow = np.std(log_flow) + log_flow_array = np.array(log_flow) + skew = (num_years * (np.sum(np.power((log_flow_array - mean_log_flow), 3)))) / ( + (num_years - 1) * (num_years - 2) * (std_log_flow) ** 3) + k2 = np.interp(skew, skewvals, kfac2) + k10 = np.interp(skew, skewvals, kfac10) + k25 = np.interp(skew, skewvals, kfac25) + k50 = np.interp(skew, skewvals, kfac50) + k100 = np.interp(skew, skewvals, kfac100) + return_100_array[iter_idx] = np.power(10, (mean_log_flow + k100*std_log_flow)) + return_50_array[iter_idx] = np.power(10, (mean_log_flow + k50*std_log_flow)) + return_25_array[iter_idx] = np.power(10, (mean_log_flow + k25*std_log_flow)) + return_10_array[iter_idx] = np.power(10, (mean_log_flow + k10*std_log_flow)) + return_2_array[iter_idx] = np.power(10, (mean_log_flow + k2*std_log_flow)) + + mp_lock.acquire() + return_period_nc = nc.Dataset(return_period_file, 'a') + return_period_nc.variables['max_flow'][rivid_index_list] = max_flow_array + if method == 'weibull': + return_period_nc.variables['return_period_20'][rivid_index_list] = return_20_array + elif method in 'gumble': + return_period_nc.variables['return_period_100'][rivid_index_list] = return_100_array + return_period_nc.variables['return_period_50'][rivid_index_list] = return_50_array + return_period_nc.variables['return_period_20'][rivid_index_list] = return_20_array + elif method == 'log_pearson': + return_period_nc.variables['return_period_100'][rivid_index_list] = return_100_array + return_period_nc.variables['return_period_50'][rivid_index_list] = return_50_array + return_period_nc.variables['return_period_25'][rivid_index_list] = return_25_array + return_period_nc.variables['return_period_10'][rivid_index_list] = return_10_array + return_period_nc.variables['return_period_2'][rivid_index_list] = return_2_array + return_period_nc.close() + mp_lock.release() + +def generate_return_periods(qout_file, return_period_file, num_cpus=multiprocessing.cpu_count(), storm_duration_days=7, method='weibull'): + """ + Generate return period from RAPID Qout file + """ + + #get ERA Interim Data Analyzed + with RAPIDDataset(qout_file) as qout_nc_file: + print("Setting up Return Periods File ...") + return_period_nc = nc.Dataset(return_period_file, 'w') + + return_period_nc.createDimension('rivid', qout_nc_file.size_river_id) + + timeSeries_var = return_period_nc.createVariable('rivid', 'i4', ('rivid',)) + timeSeries_var.long_name = ( + 'unique identifier for each river reach') + + max_flow_var = return_period_nc.createVariable('max_flow', 'f8', ('rivid',)) + max_flow_var.long_name = 'maximum streamflow' + max_flow_var.units = 'm3/s' + + if method == 'weibull': + + return_period_20_var = return_period_nc.createVariable('return_period_20', 'f8', ('rivid',)) + return_period_20_var.long_name = '20 year return period flow' + return_period_20_var.units = 'm3/s' + + if method == 'gumble': + + return_period_100_var = return_period_nc.createVariable('return_period_100', 'f8', ('rivid',)) + return_period_100_var.long_name = '100 year return period flow' + return_period_100_var.units = 'm3/s' + + return_period_50_var = return_period_nc.createVariable('return_period_50', 'f8', ('rivid',)) + return_period_50_var.long_name = '50 year return period flow' + return_period_50_var.units = 'm3/s' + + return_period_20_var = return_period_nc.createVariable('return_period_20', 'f8', ('rivid',)) + return_period_20_var.long_name = '20 year return period flow' + return_period_20_var.units = 'm3/s' + + if method == 'log_pearson': + + return_period_100_var = return_period_nc.createVariable('return_period_100', 'f8', ('rivid',)) + return_period_100_var.long_name = '100 year return period flow' + return_period_100_var.units = 'm3/s' + + return_period_50_var = return_period_nc.createVariable('return_period_50', 'f8', ('rivid',)) + return_period_50_var.long_name = '50 year return period flow' + return_period_50_var.units = 'm3/s' + + return_period_25_var = return_period_nc.createVariable('return_period_25', 'f8', ('rivid',)) + return_period_25_var.long_name = '25 year return period flow' + return_period_25_var.units = 'm3/s' + + return_period_10_var = return_period_nc.createVariable('return_period_10', 'f8', ('rivid',)) + return_period_10_var.long_name = '10 year return period flow' + return_period_10_var.units = 'm3/s' + + return_period_2_var = return_period_nc.createVariable('return_period_2', 'f8', ('rivid',)) + return_period_2_var.long_name = '2 year return period flow' + return_period_2_var.units = 'm3/s' + + lat_var = return_period_nc.createVariable('lat', 'f8', ('rivid',), + fill_value=-9999.0) + lat_var.long_name = 'latitude' + lat_var.standard_name = 'latitude' + lat_var.units = 'degrees_north' + lat_var.axis = 'Y' + + lon_var = return_period_nc.createVariable('lon', 'f8', ('rivid',), + fill_value=-9999.0) + lon_var.long_name = 'longitude' + lon_var.standard_name = 'longitude' + lon_var.units = 'degrees_east' + lon_var.axis = 'X' + + return_period_nc.variables['lat'][:] = qout_nc_file.qout_nc.variables['lat'][:] + return_period_nc.variables['lon'][:] = qout_nc_file.qout_nc.variables['lon'][:] + + river_id_list = qout_nc_file.get_river_id_array() + return_period_nc.variables['rivid'][:] = river_id_list + + return_period_nc.return_period_method = method + + return_period_nc.close() + + time_array = qout_nc_file.get_time_array() + + print("Extracting Data and Generating Return Periods ...") + num_years = int((datetime.utcfromtimestamp(time_array[-1])-datetime.utcfromtimestamp(time_array[0])).days/365.2425) + time_steps_per_day = (24*3600)/float((datetime.utcfromtimestamp(time_array[1])-datetime.utcfromtimestamp(time_array[0])).total_seconds()) + step = max(1,int(time_steps_per_day * storm_duration_days)) + + #generate multiprocessing jobs + mp_lock = multiprocessing.Manager().Lock() + job_combinations = [] + partition_list, partition_index_list = partition(river_id_list, num_cpus*2) + for sub_partition_index_list in partition_index_list: + if len(sub_partition_index_list) > 0: + job_combinations.append((qout_file, + return_period_file, + sub_partition_index_list, + step, + num_years, + method, + mp_lock + )) + + pool = multiprocessing.Pool(num_cpus) + pool.map(generate_single_return_period, + job_combinations) + pool.close() + pool.join() \ No newline at end of file diff --git a/RAPIDpy/postprocess/generate_seasonal_averages.py b/RAPIDpy/postprocess/generate_seasonal_averages.py new file mode 100644 index 0000000..2dea9c9 --- /dev/null +++ b/RAPIDpy/postprocess/generate_seasonal_averages.py @@ -0,0 +1,132 @@ +# -*- coding: utf-8 -*- +## +## generate_seasonal_averages.py +## RAPIDpy +## +## Created by Alan D. Snow +## License: BSD-3 Clause + +from calendar import isleap +import multiprocessing +from netCDF4 import Dataset +import numpy as np +from time import gmtime + +from ..dataset import RAPIDDataset + +def generate_single_seasonal_average(args): + """ + This function calculates the seasonal average for a single day of the year + for all river segments + """ + qout_file = args[0] + seasonal_average_file = args[1] + day_of_year = args[2] + mp_lock = args[3] + + min_day = day_of_year - 3 + max_day = day_of_year + 3 + + with RAPIDDataset(qout_file) as qout_nc_file: + time_indices = [] + for idx, t in enumerate(qout_nc_file.get_time_array()): + var_time = gmtime(t) + compare_yday = var_time.tm_yday + #move day back one past because of leap year adds + #a day after feb 29 (day 60) + if isleap(var_time.tm_year) and compare_yday > 60: + compare_yday -= 1 + #check if date within range of season + if compare_yday >= min_day and compare_yday < max_day: + time_indices.append(idx) + + if not time_indices: + raise IndexError("No time steps found within range ...") + + streamflow_array = qout_nc_file.get_qout(time_index_array=time_indices) + + avg_streamflow_array = np.mean(streamflow_array, axis=1) + std_streamflow_array = np.std(streamflow_array, axis=1) + max_streamflow_array = np.amax(streamflow_array, axis=1) + min_streamflow_array = np.min(streamflow_array, axis=1) + + mp_lock.acquire() + seasonal_avg_nc = Dataset(seasonal_average_file, 'a') + seasonal_avg_nc.variables['average_flow'][:, day_of_year-1] = avg_streamflow_array + seasonal_avg_nc.variables['std_dev_flow'][:, day_of_year-1] = std_streamflow_array + seasonal_avg_nc.variables['max_flow'][:, day_of_year-1] = max_streamflow_array + seasonal_avg_nc.variables['min_flow'][:, day_of_year-1] = min_streamflow_array + seasonal_avg_nc.close() + mp_lock.release() + +def generate_seasonal_averages(qout_file, seasonal_average_file, + num_cpus=multiprocessing.cpu_count()): + """ + This function loops through a CF compliant rapid streamflow + file to produce a netCDF file with a seasonal average for + 365 days a year + """ + + with RAPIDDataset(qout_file) as qout_nc_file: + print("Generating seasonal average file ...") + seasonal_avg_nc = Dataset(seasonal_average_file, 'w') + + seasonal_avg_nc.createDimension('rivid', qout_nc_file.size_river_id) + seasonal_avg_nc.createDimension('day_of_year', 365) + + timeSeries_var = seasonal_avg_nc.createVariable('rivid', 'i4', ('rivid',)) + timeSeries_var.long_name = ( + 'unique identifier for each river reach') + + average_flow_var = seasonal_avg_nc.createVariable('average_flow', 'f8', ('rivid','day_of_year')) + average_flow_var.long_name = 'seasonal average streamflow' + average_flow_var.units = 'm3/s' + + std_dev_flow_var = seasonal_avg_nc.createVariable('std_dev_flow', 'f8', ('rivid','day_of_year')) + std_dev_flow_var.long_name = 'seasonal std. dev. streamflow' + std_dev_flow_var.units = 'm3/s' + + std_dev_flow_var = seasonal_avg_nc.createVariable('max_flow', 'f8', ('rivid','day_of_year')) + std_dev_flow_var.long_name = 'seasonal max streamflow' + std_dev_flow_var.units = 'm3/s' + + std_dev_flow_var = seasonal_avg_nc.createVariable('min_flow', 'f8', ('rivid','day_of_year')) + std_dev_flow_var.long_name = 'seasonal min streamflow' + std_dev_flow_var.units = 'm3/s' + + lat_var = seasonal_avg_nc.createVariable('lat', 'f8', ('rivid',), + fill_value=-9999.0) + lat_var.long_name = 'latitude' + lat_var.standard_name = 'latitude' + lat_var.units = 'degrees_north' + lat_var.axis = 'Y' + + lon_var = seasonal_avg_nc.createVariable('lon', 'f8', ('rivid',), + fill_value=-9999.0) + lon_var.long_name = 'longitude' + lon_var.standard_name = 'longitude' + lon_var.units = 'degrees_east' + lon_var.axis = 'X' + + seasonal_avg_nc.variables['lat'][:] = qout_nc_file.qout_nc.variables['lat'][:] + seasonal_avg_nc.variables['lon'][:] = qout_nc_file.qout_nc.variables['lon'][:] + + river_id_list = qout_nc_file.get_river_id_array() + seasonal_avg_nc.variables['rivid'][:] = river_id_list + seasonal_avg_nc.close() + + #generate multiprocessing jobs + mp_lock = multiprocessing.Manager().Lock() + job_combinations = [] + for day_of_year in range(1, 366): + job_combinations.append((qout_file, + seasonal_average_file, + day_of_year, + mp_lock + )) + + pool = multiprocessing.Pool(num_cpus) + pool.map(generate_single_seasonal_average, + job_combinations) + pool.close() + pool.join() diff --git a/RAPIDpy/postprocess/goodness_of_fit.py b/RAPIDpy/postprocess/goodness_of_fit.py new file mode 100644 index 0000000..b53d5a7 --- /dev/null +++ b/RAPIDpy/postprocess/goodness_of_fit.py @@ -0,0 +1,302 @@ +# -*- coding: utf-8 -*- +# +# goodnessOfFit.py +# RAPIDpy +# +# Created by Alan D Snow 2015. +# License: BSD 3-Clause +# + +from __future__ import print_function +from csv import writer as csvwriter +import numpy as np + +from ..dataset import RAPIDDataset + + +# ------------------------------------------------------------------------------ +# statistic functions +# ------------------------------------------------------------------------------ +# FUNCTIONS FROM http://pydoc.net/Python/ambhas/0.4.0/ambhas.errlib/ +def filter_nan(s, o): + """ + this functions removed the data from simulated and observed data + whereever the observed data contains nan + + this is used by all other functions, otherwise they will produce nan as + output + """ + data = np.array([s.flatten(),o.flatten()]) + data = np.transpose(data) + data = data[~np.isnan(data).any(1)] + return data[:,0],data[:,1] + + +def pc_bias(s, o): + """ + Percent Bias + input: + s: simulated + o: observed + output: + pc_bias: percent bias + """ + # s,o = filter_nan(s,o) + return 100.0*np.sum(s-o)/np.sum(o) + + +def apb(s, o): + """ + Absolute Percent Bias + input: + s: simulated + o: observed + output: + apb_bias: absolute percent bias + """ + # s,o = filter_nan(s,o) + return 100.0*np.sum(np.abs(s-o))/np.sum(o) + + +def rmse(s, o): + """ + Root Mean Squared Error + input: + s: simulated + o: observed + output: + rmses: root mean squared error + """ + # s,o = filter_nan(s,o) + return np.sqrt(np.mean((s-o)**2)) + +def mae(s, o): + """ + Mean Absolute Error + input: + s: simulated + o: observed + output: + maes: mean absolute error + """ + # s,o = filter_nan(s,o) + return np.mean(np.abs(s-o)) + + +def bias(s, o): + """ + Bias + input: + s: simulated + o: observed + output: + bias: bias + """ + # s,o = filter_nan(s,o) + return np.mean(s-o) + + +def NS(s, o): + """ + Nash Sutcliffe efficiency coefficient + input: + s: simulated + o: observed + output: + ns: Nash Sutcliffe efficient coefficient + """ + # s,o = filter_nan(s,o) + return 1 - np.sum((s-o)**2)/np.sum((o-np.mean(o))**2) + + +def L(s, o, N=5): + """ + Likelihood + input: + s: simulated + o: observed + output: + L: likelihood + """ + # s,o = filter_nan(s,o) + return np.exp(-N*np.sum((s-o)**2)/np.sum((o-np.mean(o))**2)) + + +def correlation(s, o): + """ + correlation coefficient + input: + s: simulated + o: observed + output: + correlation: correlation coefficient + """ + # s,o = filter_nan(s,o) + if s.size == 0: + corr = np.NaN + else: + corr = np.corrcoef(o, s)[0,1] + + return corr + + +def index_agreement(s, o): + """ + index of agreement + input: + s: simulated + o: observed + output: + ia: index of agreement + """ + # s,o = filter_nan(s,o) + ia = 1 -(np.sum((o-s)**2))/(np.sum((np.abs(s-np.mean(o))+np.abs(o-np.mean(o)))**2)) + return ia + + +def KGE(s, o): + """ + Kling-Gupta Efficiency + input: + s: simulated + o: observed + output: + kge: Kling-Gupta Efficiency + cc: correlation + alpha: ratio of the standard deviation + beta: ratio of the mean + """ + # s,o = filter_nan(s,o) + cc = correlation(s,o) + alpha = np.std(s)/np.std(o) + beta = np.sum(s)/np.sum(o) + kge = 1- np.sqrt( (cc-1)**2 + (alpha-1)**2 + (beta-1)**2 ) + return kge, cc, alpha, beta + +# END FUNCTIONS FROM http://pydoc.net/Python/ambhas/0.4.0/ambhas.errlib/ + + +# ------------------------------------------------------------------------------ +# Time Series comparison functions +# ------------------------------------------------------------------------------ +def find_goodness_of_fit(rapid_qout_file, reach_id_file, observed_file, + out_analysis_file, daily=False, steps_per_group=1): + """ + Finds the goodness of fit comparing observed streamflow in a rapid Qout file + with simulated flows in a csv file. + + Args: + rapid_qout_file(str): Path to the RAPID Qout file. + reach_id_file(str): Path to file with river reach ID's associate with the RAPID Qout file. It is in the format of the RAPID observed flows reach ID file. + observed_file(str): Path to input csv with with observed flows corresponding to the RAPID Qout. It is in the format of the RAPID observed flows file. + out_analysis_file(str): Path to the analysis output csv file. + daily(Optional[bool]): If True and the file is CF-Compliant, it will compare the *observed_file* with daily average flow from Qout. Default is False. + + Example with CF-Compliant RAPID Qout file: + + .. code:: python + + import os + from RAPIDpy.postprocess import find_goodness_of_fit + + INPUT_DATA_PATH = '/path/to/data' + reach_id_file = os.path.join(INPUT_DATA_PATH, 'obs_reach_id.csv') + observed_file = os.path.join(INPUT_DATA_PATH, 'obs_flow.csv') + + cf_input_qout_file = os.path.join(COMPARE_DATA_PATH, 'Qout_nasa_lis_3hr_20020830_CF.nc') + cf_out_analysis_file = os.path.join(OUTPUT_DATA_PATH, 'cf_goodness_of_fit_results-daily.csv') + find_goodness_of_fit(cf_input_qout_file, reach_id_file, observed_file, + cf_out_analysis_file, daily=True) + + """ + reach_id_list = np.loadtxt(reach_id_file, delimiter=",", usecols=(0,), ndmin=1, dtype=np.int32) + + data_nc = RAPIDDataset(rapid_qout_file) + + # analyze and write + observed_table = np.loadtxt(observed_file, ndmin=2, delimiter=",", usecols=tuple(range(reach_id_list.size))) + with open(out_analysis_file, 'w') as outcsv: + writer = csvwriter(outcsv) + writer.writerow(["reach_id", + "percent_bias", + "abs_percent_bias", + "rmse", + "mae", + "bias", + "NSE", + "likelihood", + "correlation_coeff", + "index_agreement", + "KGE"]) + + for index, reach_id in enumerate(reach_id_list): + observed_array = observed_table[:, index] + simulated_array = data_nc.get_qout(reach_id, daily=daily) + # make sure they are the same length + simulated_array = simulated_array[:len(observed_array)] + observed_array = observed_array[:len(simulated_array)] + simulated_array,observed_array = filter_nan(simulated_array,observed_array) + writer.writerow([reach_id, + pc_bias(simulated_array, observed_array), + apb(simulated_array, observed_array), + rmse(simulated_array, observed_array), + mae(simulated_array, observed_array), + bias(simulated_array, observed_array), + NS(simulated_array, observed_array), + L(simulated_array, observed_array), + correlation(simulated_array, observed_array), + index_agreement(simulated_array, observed_array), + KGE(simulated_array, observed_array)[0]]) + + +def find_goodness_of_fit_csv(observed_simulated_file, out_file=None): + """ + Finds the goodness of fit comparing observed and simulated flows + In the file, the first column is the observed flows and the + second column is the simulated flows. + + Example:: + + 33.5, 77.2 + 34.7, 73.0 + + Args: + observed_simulated_file(str): Path to the csv file with the observed and simulated flows. + out_file(Optional[str]): Path to output file. If not provided, it will print to console. + + Example: + + .. code:: python + + from RAPIDpy.postprocess import find_goodness_of_fit_csv + + find_goodness_of_fit_csv('/united_kingdom-thames/flows_kingston_gage_noah.csv') + + """ + observed_simulated_table = np.loadtxt(observed_simulated_file, ndmin=2, delimiter=",", usecols=(0,1)) + + observed_array, simulated_array = filter_nan(observed_simulated_table[:, 0], + observed_simulated_table[:, 1]) + + # print error indices + if out_file: + print_file = open(out_file, 'w') + else: + print_file = None + + print("\n".join([ + "Percent Bias: {0}".format(pc_bias(simulated_array, observed_array)), + "Absolute Percent Bias: {0}".format(apb(simulated_array, observed_array)), + "Root Mean Squared Error: {0}".format(rmse(simulated_array, observed_array)), + "Mean Absolute Error: {0}".format(mae(simulated_array, observed_array)), + "Bias: {0}".format(bias(simulated_array, observed_array)), + "Nash Sutcliffe efficiency coefficient: {0}".format(NS(simulated_array, observed_array)), + "Likelihood: {0}".format(L(simulated_array, observed_array)), + "correlation coefficient: {0}".format(correlation(simulated_array, observed_array)), + "index of agreement: {0}".format(index_agreement(simulated_array, observed_array)), + "Kling-Gupta Efficiency: {0}".format(KGE(simulated_array, observed_array)[0]), + ]), + file=print_file) + + if print_file: + print_file.close() \ No newline at end of file diff --git a/RAPIDpy/postprocess/merge.py b/RAPIDpy/postprocess/merge.py new file mode 100644 index 0000000..50dcc7f --- /dev/null +++ b/RAPIDpy/postprocess/merge.py @@ -0,0 +1,505 @@ +# -*- coding: utf-8 -*- +## +## merge.py +## RAPIDpy +## +## Created by Tim Whitaker, 2015. +## Modified by Alan D Snow, 2015-2016 +## + +"""Copies data from RAPID netCDF output to a CF-compliant netCDF file. +Code originated from Tim Whitaker at University of Texas. The code was +modified by Alan Snow at US Army ERDC. + +Remarks: + A new netCDF file is created with data from RAPID [1] simulation model + output. The result follows CF conventions [2] with additional metadata + prescribed by the NODC timeSeries Orthogonal template [3] for time series + at discrete point feature locations. + + This script was created for the National Flood Interoperability Experiment, + and so metadata in the result reflects that. + +Requires: + netcdf4-python - https://github.com/Unidata/netcdf4-python + +Inputs: + Lookup CSV table with COMID, Lat, Lon, and Elev_m columns. Columns must + be in that order and these must be the first four columns. The order of + COMIDs in the table must match the order of features in the netCDF file. + + +/////////////////////////////////////////////////// +netcdf result_2014100520141101 { +dimensions: + Time = UNLIMITED ; // (224 currently) + COMID = 61818 ; +variables: + float Qout(Time, COMID) ; +/////////////////////////////////////////////////// + +Outputs: + CF-compliant netCDF file of RAPID results, named with original filename + with "_CF" appended to the filename. File is written to 'output' folder. + + Input netCDF file is archived or deleted, based on 'archive' config + parameter. + +Usage: + import the script, e.g., import ConvertRAPIDOutputToCF as cf. + + +References: + [1] http://rapid-hub.org/ + [2] http://cfconventions.org/ + [3] http://www.nodc.noaa.gov/data/formats/netcdf/v1.1/ +""" + + +from datetime import datetime +import os +from netCDF4 import Dataset +import numpy as np +from pytz import utc + +#local +from ..dataset import RAPIDDataset +from ..helper_functions import csv_to_list, remove_files, log + +#in Python 3 xrange is now range +try: + xrange +except NameError: + xrange = range + pass + +class ConvertRAPIDOutputToCF(object): + """ + Class to convert RAPID output to be CF compliant. You can also use this to + combine consecutive RAPID output files into one file. + + Attributes: + rapid_output_file(str or list): Path to a single RAPID Qout file or a list of RAPID Qout files. + start_datetime(datetime): Datetime object with the time of the start of the simulation. + time_step(int or list): Time step of simulation in seconds if single Qout file or a list of time steps corresponding to each Qout file in the *rapid_output_file*. + qinit_file(Optional[str]): Path to the Qinit file for the simulation. If used, it will use the values in the file for the flow at simulation time zero. + comid_lat_lon_z_file(Optional[str]): Path to comid_lat_lon_z file. If included, the spatial information will be added to the output NetCDF file. + rapid_connect_file(Optional[str]): Path to RAPID connect file. This is required if *qinit_file* is added. + project_name(Optional[str]): Name of your project in the output file. Default is "Default RAPID Project". + output_id_dim_name(Optional[str]): Name of the output river ID dimension name. Default is 'rivid'. + output_flow_var_name(Optional[str]): Name of streamflow variable in output file, typically 'Qout' or 'm3_riv'. Default is 'Qout'. + print_debug(Optional[bool]): If True, the debug output will be printed to the console. Default is False. + + .. warning:: This code replaces the first file with the combined output and + deletes the second file. BACK UP YOUR FILES!!!! + + Example: + + .. code:: python + + import datetime + from RAPIDpy.postprocess import ConvertRAPIDOutputToCF + + file1 = "/path/to/Qout_1980to1981.nc" + file2 = "/path/to/Qout_1981to1982.nc" + + cv = ConvertRAPIDOutputToCF(rapid_output_file=[file1, file2], + start_datetime=datetime.datetime(2005,1,1), + time_step=[3*3600, 3*3600], + project_name="NLDAS(VIC)-RAPID historical flows by US Army ERDC", + ) + cv.convert() + """ + def __init__(self, rapid_output_file, + start_datetime, + time_step, + qinit_file="", + comid_lat_lon_z_file="", + rapid_connect_file="", + project_name="Default RAPID Project", + output_id_dim_name='rivid', + output_flow_var_name='Qout', + print_debug=False + ): + + if not isinstance(rapid_output_file, list): + self.rapid_output_file_list = [rapid_output_file] + else: + self.rapid_output_file_list = rapid_output_file + self.start_datetime = start_datetime.replace(tzinfo=utc) + + if not isinstance(time_step, list): + self.time_step_array = [time_step] + else: + self.time_step_array = time_step + + self.qinit_file = qinit_file + self.comid_lat_lon_z_file = comid_lat_lon_z_file + self.rapid_connect_file = rapid_connect_file + self.project_name = project_name + self.output_id_dim_name = output_id_dim_name + self.output_flow_var_name = output_flow_var_name + self.print_debug = print_debug + self.cf_compliant_file = '%s_CF.nc' % os.path.splitext(self.rapid_output_file_list[0])[0] + + def _validate_raw_nc(self): + """Checks that raw netCDF file has the right dimensions and variables. + + Arguments: + nc -- netCDF dataset object representing raw RAPID output + + Returns: + name of ID dimension, + length of time dimension, + name of flow variable + + Remarks: Raises exception if file doesn't validate. + """ + + self.raw_nc_list = [] + total_time_len = 1 #add one for the first flow value RAPID + #does not include + id_len_list = [] + for rapid_output_file in self.rapid_output_file_list: + qout_nc = RAPIDDataset(rapid_output_file) + id_len_list.append(qout_nc.size_river_id) + total_time_len += qout_nc.size_time + self.raw_nc_list.append(qout_nc) + + #make sure river id lists are the same + for id_len_undex in range(1, len(id_len_list)): + if id_len_list[id_len_undex] != id_len_list[0]: + raise Exception("ERROR: River ID size is different in one of the files ...") + + for raw_nc_index in range(1, len(self.raw_nc_list)): + if not (self.raw_nc_list[raw_nc_index].get_river_id_array() == self.raw_nc_list[0].get_river_id_array()).all(): + raise Exception("ERROR: River IDs are different in files ...") + + return id_len_list[0], total_time_len + + + def _initialize_output(self, time_len, id_len): + """Creates netCDF file with CF dimensions and variables, but no data. + + Arguments: + filename -- full path and filename for output netCDF file + id_dim_name -- name of Id dimension and variable, e.g., COMID + time_len -- (integer) length of time dimension (number of time steps) + id_len -- (integer) length of Id dimension (number of time series) + time_step_seconds -- (integer) number of seconds per time step + """ + + log('Initializing new file %s' % self.cf_compliant_file, 'INFO') + + self.cf_nc = Dataset(self.cf_compliant_file, 'w', format='NETCDF3_CLASSIC') + + # Create global attributes + log(' globals', 'DEBUG', self.print_debug) + self.cf_nc.featureType = 'timeSeries' + self.cf_nc.Metadata_Conventions = 'Unidata Dataset Discovery v1.0' + self.cf_nc.Conventions = 'CF-1.6' + self.cf_nc.cdm_data_type = 'Station' + self.cf_nc.nodc_template_version = ( + 'NODC_NetCDF_TimeSeries_Orthogonal_Template_v1.1') + self.cf_nc.standard_name_vocabulary = ('NetCDF Climate and Forecast (CF) ' + + 'Metadata Convention Standard Name ' + + 'Table v28') + self.cf_nc.title = 'RAPID Result' + self.cf_nc.summary = ("Results of RAPID river routing simulation. Each river " + + "reach (i.e., feature) is represented by a point " + + "feature at its midpoint, and is identified by the " + + "reach's unique NHDPlus COMID identifier.") + self.cf_nc.time_coverage_resolution = 'point' + self.cf_nc.geospatial_lat_min = 0.0 + self.cf_nc.geospatial_lat_max = 0.0 + self.cf_nc.geospatial_lat_units = 'degrees_north' + self.cf_nc.geospatial_lat_resolution = 'midpoint of stream feature' + self.cf_nc.geospatial_lon_min = 0.0 + self.cf_nc.geospatial_lon_max = 0.0 + self.cf_nc.geospatial_lon_units = 'degrees_east' + self.cf_nc.geospatial_lon_resolution = 'midpoint of stream feature' + self.cf_nc.geospatial_vertical_min = 0.0 + self.cf_nc.geospatial_vertical_max = 0.0 + self.cf_nc.geospatial_vertical_units = 'm' + self.cf_nc.geospatial_vertical_resolution = 'midpoint of stream feature' + self.cf_nc.geospatial_vertical_positive = 'up' + self.cf_nc.project = self.project_name + self.cf_nc.processing_level = 'Raw simulation result' + self.cf_nc.keywords_vocabulary = ('NASA/Global Change Master Directory ' + + '(GCMD) Earth Science Keywords. Version ' + + '8.0.0.0.0') + self.cf_nc.keywords = 'DISCHARGE/FLOW' + self.cf_nc.comment = 'Result time step(s) (seconds): ' + str(self.time_step_array) + + timestamp = datetime.utcnow().isoformat() + 'Z' + self.cf_nc.date_created = timestamp + self.cf_nc.history = (timestamp + '; added time, lat, lon, z, crs variables; ' + + 'added metadata to conform to NODC_NetCDF_TimeSeries_' + + 'Orthogonal_Template_v1.1') + + # Create dimensions + log(' dimming', 'DEBUG', self.print_debug) + self.cf_nc.createDimension('time', time_len) + self.cf_nc.createDimension(self.output_id_dim_name, id_len) + + # Create variables + log(' timeSeries_var', 'DEBUG', self.print_debug) + timeSeries_var = self.cf_nc.createVariable(self.output_id_dim_name, 'i4', + (self.output_id_dim_name,)) + timeSeries_var.long_name = ( + 'Unique NHDPlus COMID identifier for each river reach feature') + timeSeries_var.cf_role = 'timeseries_id' + + log(' time_var', 'DEBUG', self.print_debug) + time_var = self.cf_nc.createVariable('time', 'i4', ('time',)) + time_var.long_name = 'time' + time_var.standard_name = 'time' + time_var.units = 'seconds since 1970-01-01 00:00:00 0:00' + time_var.axis = 'T' + + #only add if user adds + if self.comid_lat_lon_z_file and os.path.exists(self.comid_lat_lon_z_file): + log(' lat_var', 'DEBUG', self.print_debug) + lat_var = self.cf_nc.createVariable('lat', 'f8', (self.output_id_dim_name,), + fill_value=-9999.0) + lat_var.long_name = 'latitude' + lat_var.standard_name = 'latitude' + lat_var.units = 'degrees_north' + lat_var.axis = 'Y' + + log(' lon_var', 'DEBUG', self.print_debug) + lon_var = self.cf_nc.createVariable('lon', 'f8', (self.output_id_dim_name,), + fill_value=-9999.0) + lon_var.long_name = 'longitude' + lon_var.standard_name = 'longitude' + lon_var.units = 'degrees_east' + lon_var.axis = 'X' + + log(' z_var', 'DEBUG', self.print_debug) + z_var = self.cf_nc.createVariable('z', 'f8', (self.output_id_dim_name,), + fill_value=-9999.0) + z_var.long_name = ('Elevation referenced to the North American ' + + 'Vertical Datum of 1988 (NAVD88)') + z_var.standard_name = 'surface_altitude' + z_var.units = 'm' + z_var.axis = 'Z' + z_var.positive = 'up' + + log(' crs_var', 'DEBUG', self.print_debug) + crs_var = self.cf_nc.createVariable('crs', 'i4') + crs_var.grid_mapping_name = 'latitude_longitude' + crs_var.epsg_code = 'EPSG:4326' # WGS 84 + crs_var.semi_major_axis = 6378137.0 + crs_var.inverse_flattening = 298.257223563 + + def _write_comid_lat_lon_z(self): + """Add latitude, longitude, and z values for each netCDF feature + + Arguments: + cf_nc -- netCDF Dataset object to be modified + lookup_filename -- full path and filename for lookup table + id_var_name -- name of Id variable + + Remarks: + Lookup table is a CSV file with COMID, Lat, Lon, and Elev_m columns. + Columns must be in that order and these must be the first four columns. + """ + #only add if user adds + if self.comid_lat_lon_z_file and os.path.exists(self.comid_lat_lon_z_file): + #get list of COMIDS + lookup_table = csv_to_list(self.comid_lat_lon_z_file ) + lookup_comids = np.array([int(float(row[0])) for row in lookup_table[1:]]) + + # Get relevant arrays while we update them + nc_comids = self.cf_nc.variables[self.output_id_dim_name][:] + lats = self.cf_nc.variables['lat'][:] + lons = self.cf_nc.variables['lon'][:] + zs = self.cf_nc.variables['z'][:] + + lat_min = None + lat_max = None + lon_min = None + lon_max = None + z_min = None + z_max = None + + # Process each row in the lookup table + for nc_index, nc_comid in enumerate(nc_comids): + try: + lookup_index = np.where(lookup_comids == nc_comid)[0][0] + 1 + except Exception: + log('COMID %s misssing in comid_lat_lon_z file' % nc_comid, + 'ERROR') + + lat = float(lookup_table[lookup_index][1]) + lats[nc_index] = lat + if (lat_min) is None or lat < lat_min: + lat_min = lat + if (lat_max) is None or lat > lat_max: + lat_max = lat + + lon = float(lookup_table[lookup_index][2]) + lons[nc_index] = lon + if (lon_min) is None or lon < lon_min: + lon_min = lon + if (lon_max) is None or lon > lon_max: + lon_max = lon + + z = float(lookup_table[lookup_index][3]) + zs[nc_index] = z + if (z_min) is None or z < z_min: + z_min = z + if (z_max) is None or z > z_max: + z_max = z + + # Overwrite netCDF variable values + self.cf_nc.variables['lat'][:] = lats + self.cf_nc.variables['lon'][:] = lons + self.cf_nc.variables['z'][:] = zs + + # Update metadata + if lat_min is not None: + self.cf_nc.geospatial_lat_min = lat_min + if lat_max is not None: + self.cf_nc.geospatial_lat_max = lat_max + if lon_min is not None: + self.cf_nc.geospatial_lon_min = lon_min + if lon_max is not None: + self.cf_nc.geospatial_lon_max = lon_max + if z_min is not None: + self.cf_nc.geospatial_vertical_min = z_min + if z_max is not None: + self.cf_nc.geospatial_vertical_max = z_max + else: + log('No comid_lat_lon_z file. Not adding values ...', 'INFO') + + def _generate_time_values(self): + """ + Generates time values for out nc file + """ + # Populate time values + log('writing times', 'INFO') + d1970 = datetime(1970, 1, 1, tzinfo=utc) + time_array = [[int((self.start_datetime - d1970).total_seconds())]] + + datetime_nc_start_simulation = self.start_datetime + for raw_nc_index, raw_nc in enumerate(self.raw_nc_list): + + raw_nc_time = raw_nc.get_time_array(datetime_simulation_start=datetime_nc_start_simulation, + simulation_time_step_seconds=self.time_step_array[raw_nc_index]) + + time_array.append(raw_nc_time) + datetime_nc_start_simulation = datetime.utcfromtimestamp(raw_nc_time[-1]) + + self.cf_nc.variables['time'][:] = np.concatenate(time_array) + end_date = datetime.utcfromtimestamp(self.cf_nc.variables['time'][-1]) + self.cf_nc.time_coverage_start = self.start_datetime.isoformat() + 'Z' + self.cf_nc.time_coverage_end = end_date.isoformat() + 'Z' + + def _copy_streamflow_values(self): + """ + Copies streamflow values from raw output to CF file + """ + log('Creating streamflow variable', 'INFO') + q_var = self.cf_nc.createVariable( + self.output_flow_var_name, 'f4', (self.output_id_dim_name, 'time')) + q_var.long_name = 'Discharge' + q_var.units = 'm^3/s' + q_var.coordinates = 'time lat lon z' + q_var.grid_mapping = 'crs' + q_var.source = ('Generated by the Routing Application for Parallel ' + + 'computatIon of Discharge (RAPID) river routing model.') + q_var.references = 'http://rapid-hub.org/' + q_var.comment = ('lat, lon, and z values taken at midpoint of river ' + + 'reach feature') + + log('Copying streamflow values', 'INFO') + master_begin_time_step_index = 1 + master_end_time_step_index = len(self.cf_nc.dimensions['time']) + + #to reduce RAM, copy by chunks + max_2d_dimension = 1000000000 #~8GB Max + for raw_nc_index, raw_nc in enumerate(self.raw_nc_list): + max_time_step_size = min(raw_nc.size_time, max(1, int(float(max_2d_dimension)/float(raw_nc.size_river_id)))) + raw_nc_begin_time_step_index = 0 + raw_nc_end_time_step_index = raw_nc.size_time + for raw_nc_time_index in xrange(0, raw_nc.size_time, max_time_step_size): + time_interval_size = max(1, min(raw_nc.size_time-raw_nc_time_index, max_time_step_size)) + + raw_nc_end_time_step_index = raw_nc_begin_time_step_index + time_interval_size + master_end_time_step_index = master_begin_time_step_index + time_interval_size + + q_var[:,master_begin_time_step_index:master_end_time_step_index] = raw_nc.get_qout(time_index_start=raw_nc_begin_time_step_index, + time_index_end=raw_nc_end_time_step_index) + + master_begin_time_step_index = master_end_time_step_index + raw_nc_begin_time_step_index = raw_nc_end_time_step_index + + log('Adding initial streamflow values', 'INFO') + #add initial flow to RAPID output file + if self.qinit_file and self.rapid_connect_file: + lookup_table = csv_to_list(self.rapid_connect_file) + lookup_comids = np.array([int(float(row[0])) for row in lookup_table]) + + init_flow_table = csv_to_list(self.qinit_file) + + for index, comid in enumerate(self.cf_nc.variables[self.output_id_dim_name][:]): + try: + lookup_index = np.where(lookup_comids == comid)[0][0] + except Exception: + log('COMID %s misssing in rapid_connect file' % comid, + 'ERROR') + q_var[index,0] = float(init_flow_table[lookup_index][0]) + else: + for index, comid in enumerate(self.cf_nc.variables[self.output_id_dim_name][:]): + q_var[index,0] = 0 + + def convert(self): + """ + Copies data from RAPID netCDF output to a CF-compliant netCDF file. + """ + + try: + log('Processing %s ...' % self.rapid_output_file_list[0], 'INFO') + time_start_conversion = datetime.utcnow() + + # Validate the raw netCDF file + log('validating input netCDF file', 'INFO') + id_len, time_len = self._validate_raw_nc() + + # Initialize the output file (create dimensions and variables) + log('initializing output', 'INFO') + self._initialize_output(time_len, id_len) + + self._generate_time_values() + + #copy river ids over + self.cf_nc.variables[self.output_id_dim_name][:] = self.raw_nc_list[0].get_river_id_array() + + # Populate comid, lat, lon, z + log('writing comid lat lon z', 'INFO') + lookup_start = datetime.now() + self._write_comid_lat_lon_z() + duration = str((datetime.now() - lookup_start).total_seconds()) + log('Lookup Duration (s): ' + duration, 'INFO') + + # Create a variable for streamflow. This is big, and slows down + # previous steps if we do it earlier. + self._copy_streamflow_values() + + #close files + for raw_nc in self.raw_nc_list: + raw_nc.close() + self.cf_nc.close() + + #delete original RAPID output + remove_files(*self.rapid_output_file_list) + + #rename nc compliant file to original name + os.rename(self.cf_compliant_file, self.rapid_output_file_list[0]) + log('Time to process %s' % (datetime.utcnow()-time_start_conversion), 'INFO') + except Exception: + #delete cf RAPID output + remove_files(self.cf_compliant_file) + #log('Conversion Error %s' % e, 'ERROR') + raise diff --git a/RAPIDpy/rapid.py b/RAPIDpy/rapid.py new file mode 100644 index 0000000..bf228b7 --- /dev/null +++ b/RAPIDpy/rapid.py @@ -0,0 +1,1062 @@ +# -*- coding: utf-8 -*- +## +## rapid.py +## RAPIDpy +## +## Created by Alan D Snow, 2015. +## Copyright © 2015 Alan D Snow. All rights reserved. +## + +from calendar import isleap +from csv import writer as csvwriter +import datetime +from dateutil.parser import parse +#from dateutil.tz import tzoffset +from multiprocessing import cpu_count +import numpy as np +import os +#USGS not returning tzinfo, so this is no longer needed +#from pytz import utc +from requests import get +from subprocess import Popen, PIPE +from time import gmtime + +#local +from .dataset import RAPIDDataset +from .helper_functions import csv_to_list, log, open_csv +from .postprocess import ConvertRAPIDOutputToCF + +#------------------------------------------------------------------------------ +#Main RAPID Manager Class +#------------------------------------------------------------------------------ +class RAPID(object): + """ + This class is designed to prepare the rapid_namelist file and run + the RAPID program. There are also other utilities added. + + Attributes: + rapid_executable_location(Optional[str]): Path to the RAPID executable location. + num_processors(Optional[int]): Number of procesors to use. Default is 1. Overridden if *use_all_processors* is True. + use_all_processors(Optional[bool]): If set to True, the RAPID program will use all available processors. Default is False. + cygwin_bin_location(Optional[str]): If using Windows, this is the path to the Cygwin 'bin' directory. + mpiexec_command(Optional[str]): This is the mpi execute commmand. Default is "mpiexec". + ksp_type(Optional[str]): This is the solver type. Default is "richardson". + **kwargs(Optional[str]): Keyword arguments matching the input parameters in the RAPID namelist. + + Linux Example: + + .. code:: python + + from RAPIDpy import RAPID + + rapid_manager = RAPID(rapid_executable_location='~/work/rapid/run/rapid' + use_all_processors=True, + ZS_TauR=24*3600, #duration of routing procedure (time step of runoff data) + ZS_dtR=15*60, #internal routing time step + ZS_TauM=365*24*3600, #total simulation time + ZS_dtM=24*3600 #input time step + ) + + Windows with Cygwin Example: + + .. code:: python + + from RAPIDpy import RAPID + + rapid_manager = RAPID(rapid_executable_location='C:/cygwin64/home/username/work/rapid/run/rapid', + cygwin_bin_location='C:/cygwin64/bin', + use_all_processors=True, + ZS_TauR=24*3600, #duration of routing procedure (time step of runoff data) + ZS_dtR=15*60, #internal routing time step + ZS_TauM=365*24*3600, #total simulation time + ZS_dtM=24*3600 #input time step + ) + """ + def __init__(self, + rapid_executable_location="", + num_processors=1, + use_all_processors=False, + cygwin_bin_location="", + mpiexec_command="mpiexec", + ksp_type="richardson", + **kwargs): + """ + Initialize the class with variables given by the user + """ + if rapid_executable_location and not os.path.exists(rapid_executable_location): + raise Exception("Path to rapid_executable_location '{0}' invalid ...".format(rapid_executable_location)) + + if os.name == "nt" and (not cygwin_bin_location or not os.path.exists(cygwin_bin_location))\ + and rapid_executable_location: + raise Exception("Required to have cygwin_bin_location set if using windows!") + + self._rapid_executable_location = rapid_executable_location + self._cygwin_bin_location = cygwin_bin_location + self._cygwin_bash_exe_location = os.path.join(cygwin_bin_location, "bash.exe") + self._mpiexec_command = mpiexec_command + self._ksp_type = ksp_type + + #use all processors makes precedent over num_processors arg + if use_all_processors == True: + self._num_processors = cpu_count() + elif num_processors > cpu_count(): + log("Num processors requested exceeded max. Set to max ...", + "WARNING") + self._num_processors = cpu_count() + else: + self._num_processors = num_processors + + #******************************************************************************* + #Runtime options + #******************************************************************************* + self.BS_opt_Qinit = False + #!.false. --> no read initial flow .true. --> read initial flow + self.BS_opt_Qfinal = False + #!.false. --> no write final flow .true. --> write final flow + self.BS_opt_dam = False + #!.false. --> no dam model used .true. --> dam model used + self.BS_opt_for = False + #!.false. --> no forcing .true. --> forcing + self.BS_opt_influence = False + #!.false. --> no output influence .true. --> output influence + self.IS_opt_routing = 1 + #!1 --> matrix-based Muskingum 2 --> traditional Muskingum + #!3 --> Transbnd. matrix-based + self.IS_opt_run = 1 + #!1 --> regular run 2 --> parameter optimization + self.IS_opt_phi = 1 + #!1 --> phi1 2 --> phi2 + + #******************************************************************************* + #Temporal information + #******************************************************************************* + #NOTE: ALL TIME IN SECONDS! + #ALWAYS USED + self.ZS_TauR = 0 #duration of routing procedure (time step of runoff data) + self.ZS_dtR = 0 #internal routing time step + #ONLY FOR REGULAR RUN + self.ZS_TauM = 0 #total simulation time + self.ZS_dtM = 0 #input time step + #ONLY FOR OPTIMIZATION RUN + self.ZS_TauO = 0 #total optimization time + self.ZS_dtO = 0 #observation time step + #FORCING MODE (replace some values with observations) + self.ZS_dtF = 0 #time step of forcing data + + #******************************************************************************* + #Domain in which input data is available + #******************************************************************************* + self.IS_riv_tot = 0 #number of river reaches in rapid connect file + self.rapid_connect_file = '' #path to rapid_connect file + self.IS_max_up = 0 #maximum number of ustream segments + self.Vlat_file = '' #path to runoff file + + #******************************************************************************* + #Domain in which model runs + #******************************************************************************* + self.IS_riv_bas = 0 #number of river reaches in subbasin + self.riv_bas_id_file = '' #subbasin reach id file + + #******************************************************************************* + #Initial instantaneous flow file + #******************************************************************************* + self.Qinit_file = '' #initial flow file (same order as rapid_connect) + + #******************************************************************************* + #Final instantaneous flow file + #******************************************************************************* + self.Qfinal_file = '' #path to output final flow file + + #******************************************************************************* + #Available dam data + #******************************************************************************* + self.IS_dam_tot = 0 #number of dams + self.dam_tot_id_file = '' #ids of dam location + + #******************************************************************************* + #Dam data used + #******************************************************************************* + self.IS_dam_use = 0 #number in subset of dam data to use + self.dam_use_id_file = '' #ids of subset of dams + + #******************************************************************************* + #Available forcing data + #******************************************************************************* + self.IS_for_tot = 0 + self.for_tot_id_file = '' + self.Qfor_file = '' + + #******************************************************************************* + #Forcing data used as model runs + #******************************************************************************* + self.IS_for_use = 0 + self.for_use_id_file = '' + + #******************************************************************************* + #File where max (min) of absolute values of b (QoutR) are stored + #******************************************************************************* + self.babsmax_file = '' + self.QoutRabsmin_file = '' + self.QoutRabsmax_file = '' + + #******************************************************************************* + #Regular model run + #******************************************************************************* + self.k_file = '' + self.x_file = '' + self.Qout_file = '' + + #******************************************************************************* + #Optimization + #******************************************************************************* + self.ZS_phifac = 0 + #------------------------------------------------------------------------------ + #Routing parameters + #------------------------------------------------------------------------------ + self.kfac_file = '' + self.xfac_file = '' + self.ZS_knorm_init = 0 + self.ZS_xnorm_init = 0 + #------------------------------------------------------------------------------ + #Gage observations + #------------------------------------------------------------------------------ + self.IS_obs_tot = 0 + self.obs_tot_id_file = '' + self.Qobs_file = '' + self.Qobsbarrec_file = '' + self.IS_obs_use = 0 + self.obs_use_id_file = '' + self.IS_strt_opt = 0 + + + + self.update_parameters(**kwargs) + + + def _get_cygwin_path(self, windows_path): + """ + Convert windows path to cygpath + """ + conv_cmd = [os.path.join(self._cygwin_bin_location, "cygpath.exe"), + "-u", windows_path] + process = Popen(conv_cmd, + stdout=PIPE, stderr=PIPE, shell=False) + out, err = process.communicate() + if err: + print(err) + raise Exception(err) + + return out.strip() + + def _create_symlink_cygwin(self, initial_path, final_path): + """ + Use cygqin to generate symbolic link + """ + symlink_cmd = [os.path.join(self._cygwin_bin_location, "ln.exe"), + "-s", self._get_cygwin_path(initial_path), + self._get_cygwin_path(final_path)] + process = Popen(symlink_cmd, + stdout=PIPE, stderr=PIPE, shell=False) + out, err = process.communicate() + if err: + print(err) + raise Exception(err) + + return out.strip() + + def _dos2unix_cygwin(self, file_path): + """ + Use cygwin to convert file to unix format + """ + dos2unix_cmd = [os.path.join(self._cygwin_bin_location, "dos2unix.exe"), + self._get_cygwin_path(file_path)] + process = Popen(dos2unix_cmd, + stdout=PIPE, stderr=PIPE, shell=False) + process.communicate() + + def update_parameters(self, **kwargs): + """ + You can add or update rapid namelist parameters by using the name of + the variable in the rapid namelist file (this is case sensitive). + + Parameters: + **kwargs(Optional[str]): Keyword arguments matching the input parameters in the RAPID namelist. + + Example: + + .. code:: python + + from RAPIDpy import RAPID + + rapid_manager = RAPID( + #ADD PARAMETERS + ) + + rapid_manager.update_parameters(rapid_connect_file='../rapid-io/input/rapid_connect.csv', + Vlat_file='../rapid-io/input/m3_riv.nc', + riv_bas_id_file='../rapid-io/input/riv_bas_id.csv', + k_file='../rapid-io/input/k.csv', + x_file='../rapid-io/input/x.csv', + Qout_file='../rapid-io/output/Qout.nc', + ) + + + """ + #set arguments based off of user input + for key, value in list(kwargs.items()): + if key in dir(self) and not key.startswith('_'): + setattr(self, key, value) + else: + log("Invalid RAPID parameter %s." % key, + "ERROR") + + def update_reach_number_data(self): + """ + Update the reach number data for the namelist based on input files. + + .. warning:: You need to make sure you set *rapid_connect_file* and *riv_bas_id_file* before running this function. + + Example: + + .. code:: python + + from RAPIDpy import RAPID + + rapid_manager = RAPID( + #ADD PARAMETERS + rapid_connect_file='../rapid-io/input/rapid_connect.csv', + riv_bas_id_file='../rapid-io/input/riv_bas_id.csv', + ) + + rapid_manager.update_reach_number_data() + + """ + + if not self.rapid_connect_file or not self.rapid_connect_file: + log("Missing rapid_connect_file. Please set before running this function ...", + "ERROR") + + if not self.riv_bas_id_file or not self.riv_bas_id_file: + log("Missing riv_bas_id_file. Please set before running this function ...", + "ERROR") + + #get rapid connect info + rapid_connect_table = np.loadtxt(self.rapid_connect_file, ndmin=2, delimiter=",", dtype=int) + + self.IS_riv_tot = int(rapid_connect_table.shape[0]) + self.IS_max_up = int(rapid_connect_table[:,2].max()) + + #get riv_bas_id info + riv_bas_id_table = np.loadtxt(self.riv_bas_id_file, ndmin=1, delimiter=",", usecols=(0,), dtype=int) + self.IS_riv_bas = int(riv_bas_id_table.size) + + def update_simulation_runtime(self): + """ + Updates the total simulation duration from + the m3 file (Vlat_file) and the time step (ZS_TauR). + + .. warning:: You need to set the m3 file (Vlat_file) and the + time step (ZS_TauR) before runnning this function. + + Example: + + .. code:: python + + from RAPIDpy import RAPID + + rapid_manager = RAPID( + #ADD PARAMETERS + Vlat_file='../rapid-io/input/m3_riv.csv', + ZS_TauR=3*3600, + ) + + rapid_manager.update_simulation_runtime() + """ + if not self.Vlat_file or not os.path.exists(self.Vlat_file): + log("Need Vlat_file to proceed ...", + "ERROR") + + if self.ZS_TauR <= 0: + log("Missing routing time step ...", + "ERROR") + + try: + self.ZS_TauR = int(self.ZS_TauR) + except Exception: + log("Invalid routing time step: {0} ...".format(self.ZS_TauR), + "ERROR") + + with RAPIDDataset(self.Vlat_file) as m3_nc: + self.ZS_TauM = m3_nc.size_time*self.ZS_TauR + self.ZS_TauO = m3_nc.size_time*self.ZS_TauR + + def generate_namelist_file(self, rapid_namelist_file): + """ + Generate rapid_namelist file. + + Parameters: + rapid_namelist_file(str): Path of namelist file to generate from + parameters added to the RAPID manager. + """ + log("Generating RAPID namelist file ...", + "INFO") + try: + os.remove(rapid_namelist_file) + except OSError: + pass + + with open(rapid_namelist_file,'w') as new_file: + new_file.write('&NL_namelist\n') + for attr, value in sorted(list(self.__dict__.items())): + if not attr.startswith('_'): + if attr.startswith('BS'): + new_file.write("%s = .%s.\n" % (attr, str(value).lower())) + elif isinstance(value, int): + new_file.write("%s = %s\n" % (attr, value)) + else: + if value: + #file path + if os.name == "nt": + #if windows generate file with cygpath + value = self._get_cygwin_path(value) + new_file.write("%s = \'%s\'\n" % (attr, value)) + new_file.write("/\n") + + def update_namelist_file(self, rapid_namelist_file, new_namelist_file=None): + """ + Update existing namelist file with new parameters + + Parameters: + rapid_namelist_file(str): Path of namelist file to use in the simulation. + It will be updated with any parameters added to + the RAPID manager. + new_namelist_file(Optional[str]): Path to output the updated namelist file. + """ + if os.path.exists(rapid_namelist_file) and rapid_namelist_file: + log("Adding missing inputs from RAPID input file ...", + "INFO") + with open(rapid_namelist_file, 'r') as old_file: + for line in old_file: + line = line.strip() + if not line[:1].isalpha() or not line: + continue + line_split = line.split("=") + attr = line_split[0].strip() + value = None + if len(line_split)>1: + value = line_split[1].strip().replace("'", "").replace('"', "") + #convert integers to integers + try: + value = int(value) + except Exception: + pass + #remove dots from beginning & end of value + if attr.startswith('BS'): + value = value.replace(".", "") + elif attr in self._no_value_attr_list: + value = True + #add attribute if exists + if attr in dir(self) \ + and not attr.startswith('_'): + #set attribute if not set already + if not getattr(self, attr): + setattr(self, attr, value) + else: + log("Invalid argument {0}. Skipping ...".format(attr), + "INFO") + + if new_namelist_file is None: + new_namelist_file = rapid_namelist_file + + self.generate_namelist_file(new_namelist_file) + else: + log("RAPID namelist file to update not found.", + "ERROR") + + def make_output_CF_compliant(self, + simulation_start_datetime, + comid_lat_lon_z_file="", + project_name="Normal RAPID project"): + """ + This function converts the RAPID output to be CF compliant. This will require + a *comid_lat_lon_z.csv* file (See: :func:`~RAPIDpy.gis.centroid.FlowlineToPoint` + to generate the file). + + .. note:: It prepends time an initial flow to your simulation from the *qinit_file*. + If no qinit file is given, an initial value of zero is added. + + .. warning:: This will delete your original Qout file. + + Parameters: + simulation_start_datetime(datetime): Datetime object with the start date of the simulation. + comid_lat_lon_z_file(Optional[str]): Path to the *comid_lat_lon_z.csv* file. If none given, spatial information will be skipped. + project_name(Optional[str]): Name of project to add to the RAPID output file. + + Example: + + .. code:: python + + + from RAPIDpy import RAPID + + rapid_manager = RAPID(rapid_executable_location='~/work/rapid/run/rapid' + use_all_processors=True, + ZS_TauR=24*3600, + ZS_dtR=15*60, + ZS_TauM=365*24*3600, + ZS_dtM=24*3600 + rapid_connect_file='../rapid-io/input/rapid_connect.csv', + Vlat_file='../rapid-io/input/m3_riv.nc', + riv_bas_id_file='../rapid-io/input/riv_bas_id.csv', + k_file='../rapid-io/input/k.csv', + x_file='../rapid-io/input/x.csv', + Qout_file='../rapid-io/output/Qout.nc', + ) + + rapid_manager.run() + + rapid_manager.make_output_CF_compliant(simulation_start_datetime=datetime.datetime(1980, 1, 1), + comid_lat_lon_z_file='../rapid-io/input/comid_lat_lon_z.csv', + project_name="ERA Interim Historical flows by US Army ERDC") + """ + need_to_convert = True + with RAPIDDataset(self.Qout_file) as qout_nc: + need_to_convert = not qout_nc.is_time_variable_valid() + if not need_to_convert: + log("RAPID Qout file already CF compliant ...", + "INFO") + else: + cv = ConvertRAPIDOutputToCF(rapid_output_file=self.Qout_file, #location of timeseries output file + start_datetime=simulation_start_datetime, #time of the start of the simulation time + time_step=self.ZS_TauR, #time step of simulation in seconds + qinit_file=self.Qinit_file, #RAPID qinit file + comid_lat_lon_z_file=comid_lat_lon_z_file, #path to comid_lat_lon_z file + rapid_connect_file=self.rapid_connect_file, #path to RAPID connect file + project_name=project_name, #name of your project + output_id_dim_name='rivid', #name of ID dimension in output file, typically COMID or FEATUREID + output_flow_var_name='Qout', #name of streamflow variable in output file, typically Qout or m3_riv + print_debug=False) + cv.convert() + + def run(self, rapid_namelist_file=""): + """ + Run RAPID program and generate file based on inputs + This will generate your rapid_namelist file and run RAPID from wherever + you call this script (your working directory). + + Parameters: + rapid_namelist_file(Optional(str)): Path of namelist file to use in the simulation. + It will be updated with any parameters added to + the RAPID manager. + + Linux Example: + + .. code:: python + + from RAPIDpy import RAPID + + rapid_manager = RAPID(rapid_executable_location='~/work/rapid/src/rapid' + use_all_processors=True, + ) + + rapid_manager.update_parameters(rapid_connect_file='../rapid-io/input/rapid_connect.csv', + Vlat_file='../rapid-io/input/m3_riv.nc', + riv_bas_id_file='../rapid-io/input/riv_bas_id.csv', + k_file='../rapid-io/input/k.csv', + x_file='../rapid-io/input/x.csv', + Qout_file='../rapid-io/output/Qout.nc', + ) + + rapid_manager.update_reach_number_data() + rapid_manager.update_simulation_runtime() + rapid_manager.run(rapid_namelist_file='../rapid-io/input/rapid_namelist') + + Linux Reservoir Forcing Flows Example: + + .. code:: python + + from RAPIDpy import RAPID + + rapid_manager = RAPID(rapid_executable_location='~/work/rapid/src/rapid', + num_processors=4, + IS_for_tot=4, + IS_for_use=4, + for_tot_id_file='../rapid-io/input/dam_id.csv', + for_use_id_file='../rapid-io/input/dam_id.csv', + Qfor_file='../rapid-io/input/qout_dams.csv', + ZS_dtF=86400, + BS_opt_for=True, + ) + + rapid_manager.run(rapid_namelist_file='../rapid-io/input/rapid_namelist_regular_run') + + Windows with Cygwin Example: + + .. code:: python + + from RAPIDpy import RAPID + from os import path + + rapid_manager = RAPID(rapid_executable_location='C:/cygwin64/home/username/work/rapid/run/rapid', + cygwin_bin_location='C:/cygwin64/bin', + use_all_processors=True, + ZS_TauR=24*3600, + ZS_dtR=15*60, + ZS_TauM=365*24*3600, + ZS_dtM=24*3600 + ) + + rapid_input_folder = 'C:/cygwin64/home/username/work/rapid-io/input' + rapid_output_folder = 'C:/cygwin64/home/username/work/rapid-io/output' + rapid_manager.update_parameters(rapid_connect_file=path.join(rapid_input_folder, 'rapid_connect.csv'), + Vlat_file=path.join(rapid_input_folder, 'm3_riv.nc'), + riv_bas_id_file=path.join(rapid_input_folder, 'riv_bas_id.csv'), + k_file=path.join(rapid_input_folder, 'k.csv'), + x_file=path.join(rapid_input_folder, 'x.csv'), + Qout_file=path.join(rapid_output_folder, 'Qout.nc'), + ) + + rapid_manager.update_reach_number_data() + rapid_manager.update_simulation_runtime() + rapid_manager.run() + """ + + if not self._rapid_executable_location or not self._rapid_executable_location: + log("Missing rapid_executable_location. Please set before running this function ...", + "ERROR") + + time_start = datetime.datetime.utcnow() + temp_rapid_namelist_file = os.path.join(os.getcwd(), "rapid_namelist") + + if not rapid_namelist_file or not os.path.exists(rapid_namelist_file): + #generate input file if it does not exist + self.generate_namelist_file(temp_rapid_namelist_file) + else: + #update existing file + self.update_namelist_file(rapid_namelist_file, temp_rapid_namelist_file) + + local_rapid_executable_location = os.path.join(os.path.dirname(temp_rapid_namelist_file), "rapid_exe_symlink") + + def rapid_cleanup(*args): + """ + Cleans up the rapid files generated by the process + """ + for arg in args: + #remove files + try: + os.remove(arg) + except OSError: + pass + + #create link to RAPID if needed + temp_link_to_rapid = "" + if not self._rapid_executable_location == local_rapid_executable_location: + rapid_cleanup(local_rapid_executable_location) + if os.name == "nt": + self._create_symlink_cygwin(self._rapid_executable_location, + local_rapid_executable_location) + else: + os.symlink(self._rapid_executable_location, local_rapid_executable_location) + temp_link_to_rapid = local_rapid_executable_location + + + #run RAPID + log("Running RAPID ...", + "INFO") + run_rapid_script = "" + if os.name == "nt": + run_rapid_script = os.path.join(os.getcwd(), "run_rapid.sh") + with open(run_rapid_script, "w") as run_rapid: + run_rapid.write("#!/bin/sh\n") + run_rapid.write("cd {}\n".format(self._get_cygwin_path(os.getcwd()))) + if self._num_processors > 1: + run_rapid.write("{0} -np {1} {2} -ksp_type {3}\n".format(self._mpiexec_command, + self._num_processors, + self._get_cygwin_path(local_rapid_executable_location), + self._ksp_type)) + else: + #htcondor will not allow mpiexec for single processor jobs + #this was added for that purpose + run_rapid.write("{0} -ksp_type {1}\n".format(self._get_cygwin_path(local_rapid_executable_location), + self._ksp_type)) + + + self._dos2unix_cygwin(run_rapid_script) + run_rapid_command = [self._cygwin_bash_exe_location, "-l", "-c", + self._get_cygwin_path(run_rapid_script)] + + else: + #htcondor will not allow mpiexec for single processor jobs + #this was added for that purpose + run_rapid_command = [local_rapid_executable_location, + "-ksp_type", self._ksp_type] + + if self._num_processors > 1: + run_rapid_command = [self._mpiexec_command, "-n", str(self._num_processors), + local_rapid_executable_location, + "-ksp_type", self._ksp_type] + + process = Popen(run_rapid_command, + stdout=PIPE, stderr=PIPE, shell=False) + out, err = process.communicate() + if err: + rapid_cleanup(temp_link_to_rapid, temp_rapid_namelist_file, run_rapid_script) + raise Exception(err) + else: + log('RAPID output:', + "INFO") + for line in out.split(b'\n'): + print(line) + rapid_cleanup(temp_link_to_rapid, temp_rapid_namelist_file, run_rapid_script) + log("Time to run RAPID: %s" % (datetime.datetime.utcnow()-time_start), + "INFO") + + def generate_qinit_from_past_qout(self, qinit_file, time_index=-1): + """ + Generate qinit from a RAPID qout file + + Parameters: + qinit_file(str): Path to output qinit_file. + time_index(Optional[int]): Index of simulation to generate initial flow file. Default is the end. + + Example: + + .. code:: python + + from RAPIDpy import RAPID + + rapid_manager = RAPID(Qout_file='/output_mississippi-nfie/Qout_k2v1_2005to2009.nc', + rapid_connect_file='/input_mississippi_nfie/rapid_connect_ECMWF.csv' + ) + + rapid_manager.generate_qinit_from_past_qout(qinit_file='/input_mississippi_nfie/Qinit_2008_flood.csv', + time_index=10162) + """ + + if not self.Qout_file or not os.path.exists(self.Qout_file): + log('Missing Qout_file. Please set before running this function ...', + "ERROR") + + if not self.rapid_connect_file or not self.rapid_connect_file: + log('Missing rapid_connect file. Please set before running this function ...', + "ERROR") + + log("Generating qinit file from qout file ...", + "INFO") + #get information from dataset + with RAPIDDataset(self.Qout_file) as qout_nc: + log("Extracting data ...", + "INFO") + streamflow_values = qout_nc.get_qout(time_index=time_index) + + log("Reordering data ...", + "INFO") + + stream_id_array = np.loadtxt(self.rapid_connect_file, ndmin=1, delimiter=",", usecols=(0,), dtype=int) + init_flows_array = np.zeros(stream_id_array.size) + for riv_bas_index, riv_bas_id in enumerate(qout_nc.get_river_id_array()): + try: + data_index = np.where(stream_id_array==riv_bas_id)[0][0] + init_flows_array[data_index] = streamflow_values[riv_bas_index] + except Exception: + log('riv bas id {0} not found in connectivity list.'.format(riv_bas_id), + "WARNING") + + log("Writing to file ...", + "INFO") + with open_csv(qinit_file, 'w') as qinit_out: + for init_flow in init_flows_array: + qinit_out.write('{0}\n'.format(init_flow)) + + self.Qinit_file = qinit_file + self.BS_opt_Qinit = True + log("Initialization Complete!", + "INFO") + + def generate_seasonal_intitialization(self, + qinit_file, + datetime_start_initialization=datetime.datetime.utcnow()): + """ + This creates a seasonal qinit file from a RAPID qout file. This + requires a simulation Qout file with a longer time period of record and + to be CF compliant. It takes the average of the current date +- 3 days + and goes back as far as possible. + + Parameters: + qinit_file(str): Path to output qinit_file. + datetime_start_initialization(Optional[datetime]): Datetime object with date of simulation to + go back through the years and get a running average + to generate streamflow initialization. Default is utcnow. + + + This example shows how to use it: + + .. code:: python + + from RAPIDpy.rapid import RAPID + + rapid_manager = RAPID(Qout_file='/output_mississippi-nfie/Qout_2000to2015.nc', + rapid_connect_file='/input_mississippi_nfie/rapid_connect_ECMWF.csv' + ) + + rapid_manager.generate_seasonal_intitialization(qinit_file='/input_mississippi_nfie/Qinit_seasonal_avg_jan_1.csv') + """ + #get information from datasets + if not self.Qout_file or not os.path.exists(self.Qout_file): + log("Missing Qout_file. Please set before running this function ...", + "ERROR") + + if not self.rapid_connect_file or not self.rapid_connect_file: + log("Missing rapid_connect file. Please set before running this function ...", + "ERROR") + + day_of_year = datetime_start_initialization.timetuple().tm_yday + min_day = day_of_year - 3 + max_day = day_of_year + 3 + + with RAPIDDataset(self.Qout_file) as qout_hist_nc: + if not qout_hist_nc.is_time_variable_valid(): + log("File must be CF 1.6 compliant with valid time variable ...", + "ERROR") + + log("Generating seasonal average qinit file from qout file ...", + "INFO") + + log("Determining dates with streamflows of interest ...", + "INFO") + + time_indices = [] + for idx, t in enumerate(qout_hist_nc.get_time_array()): + var_time = gmtime(t) + compare_yday = var_time.tm_yday + #move day back one past because of leap year adds + #a day after feb 29 (day 60) + if isleap(var_time.tm_year) and compare_yday > 60: + compare_yday -= 1 + #check if date within range of season + if compare_yday >= min_day and compare_yday < max_day: + time_indices.append(idx) + + if not time_indices: + log("No time steps found within range ...", + "ERROR") + + log("Extracting data ...", + "INFO") + + streamflow_array = qout_hist_nc.get_qout(time_index_array=time_indices) + + log("Reordering data...", + "INFO") + stream_id_array = np.loadtxt(self.rapid_connect_file, ndmin=1, delimiter=",", usecols=(0,), dtype=int) + init_flows_array = np.zeros(stream_id_array.size) + for riv_bas_index, riv_bas_id in enumerate(qout_hist_nc.get_river_id_array()): + try: + data_index = np.where(stream_id_array==riv_bas_id)[0][0] + init_flows_array[data_index] = np.mean(streamflow_array[riv_bas_index]) + except Exception: + log('riv_bas_id {0} not found in connectivity list.'.format(riv_bas_id), + "WARNING") + + log("Writing to file ...", + "INFO") + with open_csv(qinit_file, 'w') as qinit_out: + for init_flow in init_flows_array: + qinit_out.write('{}\n'.format(init_flow)) + + log("Initialization Complete!", + "INFO") + + def generate_usgs_avg_daily_flows_opt(self, + reach_id_gage_id_file, + start_datetime, + end_datetime, + out_streamflow_file, + out_stream_id_file): + """ + Generate daily streamflow file and stream id file required for calibration + or for substituting flows based on USGS gage ids associated with stream ids. + + Parameters: + reach_id_gage_id_file(str): Path to reach_id_gage_id file. + start_datetime(datetime): A datetime object with the start date to download data. + end_datetime(datetime): A datetime object with the end date to download data. + out_streamflow_file(str): The path to output the streamflow file for RAPID. + out_stream_id_file(str): The path to output the stream ID file associated with the streamflow file for RAPID. + + Example *reach_id_gage_id_file*:: + + COMID, USGS_GAGE_ID + 2000, 503944 + ... + + .. warning:: Overuse will get you blocked from downloading data from USGS. + + .. warning:: This code does not clean the data in any way. Thus, you + are likely to run into issues if you simply use the raw data. + + .. warning:: The code skips gages that do not have data + for the entire time period. + + Simple Example: + + .. code:: python + + import datetime + from os.path import join + from RAPIDpy import RAPID + + main_path = "/home/username/data" + + rapid_manager = RAPID() + rapid_manager.generate_usgs_avg_daily_flows_opt(reach_id_gage_id_file=join(main_path,"mississippi_usgsgage_id_comid.csv"), + start_datetime=datetime.datetime(2000,1,1), + end_datetime=datetime.datetime(2014,12,31), + out_streamflow_file=join(main_path,"streamflow_2000_2014.csv"), + out_stream_id_file=join(main_path,"streamid_2000_2014.csv")) + + + Complex Example: + + .. code:: python + + import datetime + from os.path import join + from RAPIDpy import RAPID + + main_path = "/home/username/data" + + rapid_manager = RAPID(rapid_executable_location='~/work/rapid/run/rapid' + use_all_processors=True, + ZS_TauR=24*3600, + ZS_dtR=15*60, + ZS_TauM=365*24*3600, + ZS_dtM=24*3600 + ) + + rapid_manager.update_parameters(rapid_connect_file='../rapid-io/input/rapid_connect.csv', + Vlat_file='../rapid-io/input/m3_riv.nc', + riv_bas_id_file='../rapid-io/input/riv_bas_id.csv', + k_file='../rapid-io/input/k.csv', + x_file='../rapid-io/input/x.csv', + Qout_file='../rapid-io/output/Qout.nc', + ) + + rapid_manager.update_reach_number_data() + rapid_manager.update_simulation_runtime() + rapid_manager.generate_usgs_avg_daily_flows_opt(reach_id_gage_id_file=join(main_path,"mississippi_usgsgage_id_comid.csv"), + start_datetime=datetime.datetime(2000,1,1), + end_datetime=datetime.datetime(2014,12,31), + out_streamflow_file=join(main_path,"streamflow_2000_2014.csv"), + out_stream_id_file=join(main_path,"streamid_2000_2014.csv")) + rapid_manager.run() + + """ + log("Generating avg streamflow file and stream id file required for calibration ...", + "INFO") + log("Generating avg streamflow file and stream id file required for calibration ...", + "INFO") + reach_id_gage_id_list = csv_to_list(reach_id_gage_id_file) +# USGS not returning tzinfo anymore, so removed tzinfo operations +# if start_datetime.tzinfo is None or start_datetime.tzinfo.utcoffset(start_datetime) is None: +# start_datetime = start_datetime.replace(tzinfo=utc) +# if end_datetime.tzinfo is None or end_datetime.tzinfo.utcoffset(end_datetime) is None: +# end_datetime = end_datetime.replace(tzinfo=utc) + gage_data_matrix = [] + valid_comid_list = [] + + #add extra day as it includes the start date (e.g. 7-5 is 2 days, but have data for 5,6,7, so +1) + num_days_needed = (end_datetime-start_datetime).days + 1 + + gage_id_list = [] + for row in reach_id_gage_id_list[1:]: + station_id = row[1] + if len(row[1]) == 7: + station_id = '0' + row[1] + gage_id_list.append(station_id) + + num_gage_id_list = np.array(gage_id_list, dtype=np.int32) + log("Querying Server for Data ..." , + "INFO") + + query_params = { + 'format': 'json', + 'sites': ",".join(gage_id_list), +# USGS not returning tzinfo anymore, so removed tzinfo operations +# 'startDT': start_datetime.astimezone(tzoffset(None, -18000)).strftime("%Y-%m-%d"), +# 'endDT': end_datetime.astimezone(tzoffset(None, -18000)).strftime("%Y-%m-%d"), + 'startDT': start_datetime.strftime("%Y-%m-%d"), + 'endDT': end_datetime.strftime("%Y-%m-%d"), + 'parameterCd': '00060', #streamflow + 'statCd': '00003' #average + } + response = get("http://waterservices.usgs.gov/nwis/dv", params=query_params) + if response.ok: + data_valid = True + try: + requested_data = response.json()['value']['timeSeries'] + except IndexError: + data_valid = False + pass + + if data_valid: + for time_series in enumerate(requested_data): + usgs_station_full_name = time_series[1]['name'] + usgs_station_id = usgs_station_full_name.split(":")[1] + gage_data = [] + for time_step in time_series[1]['values'][0]['value']: + local_datetime = parse(time_step['dateTime']) + if local_datetime > end_datetime: + break + + if local_datetime >= start_datetime: + if not time_step['value']: + log("MISSING DATA for USGS Station {0} {1} {2}".format(station_id, + local_datetime, + time_step['value']), + "WARNING") + gage_data.append(float(time_step['value'])/35.3146667) + + try: + #get where streamids assocated with USGS sation id is + streamid_index = np.where(num_gage_id_list==int(float(usgs_station_id)))[0][0]+1 + except Exception: + log("USGS Station {0} not found in list ...".format(usgs_station_id), + "WARNING") + raise + + if len(gage_data) == num_days_needed: + gage_data_matrix.append(gage_data) + valid_comid_list.append(reach_id_gage_id_list[streamid_index][0]) + else: + log("StreamID {0} USGS Station {1} MISSING {2} DATA VALUES".format(reach_id_gage_id_list[streamid_index][0], + usgs_station_id, + num_days_needed-len(gage_data)), + "WARNING") + + if gage_data_matrix and valid_comid_list: + log("Writing Output ...", + "INFO") + np_array = np.array(gage_data_matrix).transpose() + with open_csv(out_streamflow_file, 'w') as gage_data: + wf = csvwriter(gage_data) + for row in np_array: + wf.writerow(row) + + with open_csv(out_stream_id_file, 'w') as comid_data: + cf = csvwriter(comid_data) + for row in valid_comid_list: + cf.writerow([int(float(row))]) + + #set parameters for RAPID run + self.IS_obs_tot = len(valid_comid_list) + self.obs_tot_id_file = out_stream_id_file + self.Qobs_file = out_streamflow_file + self.IS_obs_use = len(valid_comid_list) + self.obs_use_id_file = out_stream_id_file + else: + log("No valid data returned ...", + "WARNING") + else: + log("USGS query error ...", + "WARNING") \ No newline at end of file diff --git a/RAPIDpy/utilities.py b/RAPIDpy/utilities.py new file mode 100644 index 0000000..116d782 --- /dev/null +++ b/RAPIDpy/utilities.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +# +# utilities.py +# RAPIDpy +# +# Created by Alan D. Snow. +# Copyright © 2016 Alan D Snow. All rights reserved. +# + +import os +from past.builtins import xrange +import re + + +# ---------------------------------------------------------------------------------------- +# HELPER FUNCTIONS +# ---------------------------------------------------------------------------------------- +def case_insensitive_file_search(directory, pattern): + """ + Looks for file with pattern with case insensitive search + """ + try: + return os.path.join(directory, + [filename for filename in os.listdir(directory) \ + if re.search(pattern, filename, re.IGNORECASE)][0]) + except IndexError: + print("{0} not found".format(pattern)) + raise + + +def partition(lst, n): + """ + Divide list into n equal parts + """ + q, r = divmod(len(lst), n) + indices = [q*i + min(i,r) for i in xrange(n+1)] + return [lst[indices[i]:indices[i+1]] for i in xrange(n)], \ + [list(xrange(indices[i], indices[i+1])) for i in xrange(n)] + + +def get_valid_directory_list(input_directory): + """ + Get a list of folders + """ + valid_input_directories = [] + for directory in os.listdir(input_directory): + if os.path.isdir(os.path.join(input_directory, directory)): + valid_input_directories.append(directory) + else: + print("{0} not a directory. Skipping ...".format(directory)) + return valid_input_directories + + diff --git a/README.md b/README.md index ddebfa6..521014f 100644 --- a/README.md +++ b/README.md @@ -1 +1,18 @@ # RAPIDpy + +RAPIDpy is a python interface for RAPID that assists to prepare inputs, runs the RAPID program, and provides post-processing utilities. +More information about installation and the input parameters for RAPID can be found at http://rapid-hub.org. +The source code for RAPID is located at https://github.com/c-h-david/rapid/. Other tools to prepare input for RAPID based on the NHDPlus dataset are located at https://github.com/c-h-david/RRR. + +[![DOI](https://zenodo.org/badge/19918/erdc-cm/RAPIDpy.svg)](https://zenodo.org/badge/latestdoi/19918/erdc-cm/RAPIDpy) + +[![License (3-Clause BSD)](https://img.shields.io/badge/license-BSD%203--Clause-yellow.svg)](https://github.com/erdc-cm/RAPIDpy/blob/master/LICENSE) + +[![PyPI version](https://badge.fury.io/py/RAPIDpy.svg)](https://badge.fury.io/py/RAPIDpy) + +[![Build Status](https://travis-ci.org/erdc-cm/RAPIDpy.svg?branch=master)](https://travis-ci.org/erdc-cm/RAPIDpy) + +[![Docs](https://readthedocs.org/projects/rapidpy/badge/?version=latest)](http://rapidpy.readthedocs.io/en/latest) + +Documentation can be found at: http://rapidpy.readthedocs.io/en/latest + diff --git a/appveyor.yml b/appveyor.yml new file mode 100644 index 0000000..0d986ff --- /dev/null +++ b/appveyor.yml @@ -0,0 +1,53 @@ +#FROM: http://tjelvarolsson.com/blog/how-to-continuously-test-your-python-code-on-windows-using-appveyor/ +# and on: https://github.com/DynamicDevices/mono/blob/master/appveyor.yml +environment: + global: + CYG_ROOT: "C:/cygwin64" + CYG_MIRROR: "http://cygwin.mirror.constant.com" + CYG_CACHE: "C:/cygwin/var/cache/setup" + + matrix: + - PYTHON_VERSION: "2.7" + MINICONDA: "C:\\Miniconda-x64" + - PYTHON_VERSION: "3.5" + MINICONDA: "C:\\Miniconda3-x64" + +install: + - 'SET PATH=%MINICONDA%;%MINICONDA%\\Scripts;%PATH%' + #create environment in conda + - conda config --set always_yes yes + - conda update -q conda python + - "conda create --name rapid python=%PYTHON_VERSION%" + - activate rapid + # Install required python packages + - conda config --add channels conda-forge + - conda install --yes cmake gdal future netcdf4 numpy pandas pangaea pyproj pytz requests rtree scipy shapely + - conda install --yes pytest-cov + - pip install coveralls + - deactivate rapid + #install cygwin + #- '%CYG_ROOT%\setup-x86_64.exe -qnNdO -R "%CYG_ROOT%" -s "%CYG_MIRROR%" -l "%CYG_CACHE%" -P gcc-core,gcc-g++,gcc-fortran,gdb,git,make,time,wget,gdal,libgdal-devel,openmpi > NULL' + #Creating directory for installation of libraries used by RAPID + #- 'cd %APPVEYOR_BUILD_FOLDER%' + #- 'SET INSTALLZ_DIR=%APPVEYOR_BUILD_FOLDER%\..\installz' + #- 'mkdir %INSTALLZ_DIR%' + #- 'cd %INSTALLZ_DIR%' + #Installing RAPID Prereqs + #- 'appveyor DownloadFile "https://raw.githubusercontent.com/snowman2/rapid/master/rapid_install_prereqs.sh"' + #- '%CYG_ROOT%/bin/bash -lc "cd $(cygpath "$INSTALLZ_DIR"); chmod +x rapid_install_prereqs.sh"' + #- '%CYG_ROOT%/bin/bash -lc "cd $(cygpath "$INSTALLZ_DIR"); ./rapid_install_prereqs.sh -i=$(cygpath "$INSTALLZ_DIR") -b"' + #Installing RAPID + #- '%CYG_ROOT%/bin/bash -lc "cd $(cygpath "$APPVEYOR_BUILD_FOLDER\..); git clone https://github.com/c-h-david/rapid.git; cd rapid; source ./rapid_specify_varpath.sh $(cygpath "$INSTALLZ_DIR")"; cd src; make rapid"' + #Installing TauDEM + #- '%CYG_ROOT%/bin/bash -lc "cd $(cygpath "$APPVEYOR_BUILD_FOLDER\..); git clone https://github.com/dtarb/TauDEM.git; cd TauDEM/src; make"' + #Installing RAPIDpy + - activate rapid + - 'cd %APPVEYOR_BUILD_FOLDER%' + - python setup.py install + +build: false + +test_script: + - py.test --cov-report term-missing --cov=RAPIDpy +on_success: + - 'coveralls' diff --git a/conda-env.yml b/conda-env.yml new file mode 100644 index 0000000..7854cc2 --- /dev/null +++ b/conda-env.yml @@ -0,0 +1,23 @@ +# conda-env.yml +# Configuration file for creating a Conda Environment with dependencies needed for RAPIDpy. +# Create the environment by running the following command (after installing Miniconda): +# os: linux +# $ conda env create -f conda-env.yml + +name: rapid +channels: +- conda-forge +- defaults +dependencies: +- future +- gdal +- netcdf4 +- numpy +- pandas +- pangaea +- requests +- pyproj +- python-dateutil +- rtree +- shapely +- scipy diff --git a/docs/Makefile b/docs/Makefile new file mode 100644 index 0000000..db72f8d --- /dev/null +++ b/docs/Makefile @@ -0,0 +1,225 @@ +# Makefile for Sphinx documentation +# + +# You can set these variables from the command line. +SPHINXOPTS = +SPHINXBUILD = sphinx-build +PAPER = +BUILDDIR = _build + +# Internal variables. +PAPEROPT_a4 = -D latex_paper_size=a4 +PAPEROPT_letter = -D latex_paper_size=letter +ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . +# the i18n builder cannot share the environment and doctrees with the others +I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . + +.PHONY: help +help: + @echo "Please use \`make ' where is one of" + @echo " html to make standalone HTML files" + @echo " dirhtml to make HTML files named index.html in directories" + @echo " singlehtml to make a single large HTML file" + @echo " pickle to make pickle files" + @echo " json to make JSON files" + @echo " htmlhelp to make HTML files and a HTML help project" + @echo " qthelp to make HTML files and a qthelp project" + @echo " applehelp to make an Apple Help Book" + @echo " devhelp to make HTML files and a Devhelp project" + @echo " epub to make an epub" + @echo " epub3 to make an epub3" + @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" + @echo " latexpdf to make LaTeX files and run them through pdflatex" + @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx" + @echo " text to make text files" + @echo " man to make manual pages" + @echo " texinfo to make Texinfo files" + @echo " info to make Texinfo files and run them through makeinfo" + @echo " gettext to make PO message catalogs" + @echo " changes to make an overview of all changed/added/deprecated items" + @echo " xml to make Docutils-native XML files" + @echo " pseudoxml to make pseudoxml-XML files for display purposes" + @echo " linkcheck to check all external links for integrity" + @echo " doctest to run all doctests embedded in the documentation (if enabled)" + @echo " coverage to run coverage check of the documentation (if enabled)" + @echo " dummy to check syntax errors of document sources" + +.PHONY: clean +clean: + rm -rf $(BUILDDIR)/* + +.PHONY: html +html: + $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." + +.PHONY: dirhtml +dirhtml: + $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." + +.PHONY: singlehtml +singlehtml: + $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml + @echo + @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." + +.PHONY: pickle +pickle: + $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle + @echo + @echo "Build finished; now you can process the pickle files." + +.PHONY: json +json: + $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json + @echo + @echo "Build finished; now you can process the JSON files." + +.PHONY: htmlhelp +htmlhelp: + $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp + @echo + @echo "Build finished; now you can run HTML Help Workshop with the" \ + ".hhp project file in $(BUILDDIR)/htmlhelp." + +.PHONY: qthelp +qthelp: + $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp + @echo + @echo "Build finished; now you can run "qcollectiongenerator" with the" \ + ".qhcp project file in $(BUILDDIR)/qthelp, like this:" + @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/RAPIDpy.qhcp" + @echo "To view the help file:" + @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/RAPIDpy.qhc" + +.PHONY: applehelp +applehelp: + $(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp + @echo + @echo "Build finished. The help book is in $(BUILDDIR)/applehelp." + @echo "N.B. You won't be able to view it unless you put it in" \ + "~/Library/Documentation/Help or install it in your application" \ + "bundle." + +.PHONY: devhelp +devhelp: + $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp + @echo + @echo "Build finished." + @echo "To view the help file:" + @echo "# mkdir -p $$HOME/.local/share/devhelp/RAPIDpy" + @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/RAPIDpy" + @echo "# devhelp" + +.PHONY: epub +epub: + $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub + @echo + @echo "Build finished. The epub file is in $(BUILDDIR)/epub." + +.PHONY: epub3 +epub3: + $(SPHINXBUILD) -b epub3 $(ALLSPHINXOPTS) $(BUILDDIR)/epub3 + @echo + @echo "Build finished. The epub3 file is in $(BUILDDIR)/epub3." + +.PHONY: latex +latex: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo + @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." + @echo "Run \`make' in that directory to run these through (pdf)latex" \ + "(use \`make latexpdf' here to do that automatically)." + +.PHONY: latexpdf +latexpdf: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through pdflatex..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +.PHONY: latexpdfja +latexpdfja: + $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex + @echo "Running LaTeX files through platex and dvipdfmx..." + $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja + @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." + +.PHONY: text +text: + $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text + @echo + @echo "Build finished. The text files are in $(BUILDDIR)/text." + +.PHONY: man +man: + $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man + @echo + @echo "Build finished. The manual pages are in $(BUILDDIR)/man." + +.PHONY: texinfo +texinfo: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo + @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." + @echo "Run \`make' in that directory to run these through makeinfo" \ + "(use \`make info' here to do that automatically)." + +.PHONY: info +info: + $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo + @echo "Running Texinfo files through makeinfo..." + make -C $(BUILDDIR)/texinfo info + @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." + +.PHONY: gettext +gettext: + $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale + @echo + @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." + +.PHONY: changes +changes: + $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes + @echo + @echo "The overview file is in $(BUILDDIR)/changes." + +.PHONY: linkcheck +linkcheck: + $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck + @echo + @echo "Link check complete; look for any errors in the above output " \ + "or in $(BUILDDIR)/linkcheck/output.txt." + +.PHONY: doctest +doctest: + $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest + @echo "Testing of doctests in the sources finished, look at the " \ + "results in $(BUILDDIR)/doctest/output.txt." + +.PHONY: coverage +coverage: + $(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage + @echo "Testing of coverage in the sources finished, look at the " \ + "results in $(BUILDDIR)/coverage/python.txt." + +.PHONY: xml +xml: + $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml + @echo + @echo "Build finished. The XML files are in $(BUILDDIR)/xml." + +.PHONY: pseudoxml +pseudoxml: + $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml + @echo + @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml." + +.PHONY: dummy +dummy: + $(SPHINXBUILD) -b dummy $(ALLSPHINXOPTS) $(BUILDDIR)/dummy + @echo + @echo "Build finished. Dummy builder generates no files." diff --git a/docs/conf.py b/docs/conf.py new file mode 100644 index 0000000..38cbe1a --- /dev/null +++ b/docs/conf.py @@ -0,0 +1,357 @@ +# -*- coding: utf-8 -*- +# +# RAPIDpy documentation build configuration file, created by +# sphinx-quickstart on Fri Sep 23 11:35:54 2016. +# +# This file is execfile()d with the current directory set to its +# containing dir. +# +# Note that not all possible configuration values are present in this +# autogenerated file. +# +# All configuration values have a default; values that are commented out +# serve to show the default. + +# If extensions (or modules to document with autodoc) are in another directory, +# add these directories to sys.path here. If the directory is relative to the +# documentation root, use os.path.abspath to make it absolute, like shown here. +# +import os +import sys +sys.path.insert(0, os.path.abspath('..')) + +# -- General configuration ------------------------------------------------ +##TEMP SECTION UNTIL RTREE WORKS IN CONDA IN RTD +#SEE: http://docs.readthedocs.io/en/latest/faq.html#i-get-import-errors-on-libraries-that-depend-on-c-modules +from mock import Mock as MagicMock + +class Mock(MagicMock): + @classmethod + def __getattr__(cls, name): + return Mock() + +MOCK_MODULES = ['rtree'] +sys.modules.update((mod_name, Mock()) for mod_name in MOCK_MODULES) +##END TEMP SECTION UNTIL RTREE WORKS IN CONDA IN RTD + +# If your documentation needs a minimal Sphinx version, state it here. +# +# needs_sphinx = '1.0' + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ + 'sphinx.ext.autodoc', + 'sphinx.ext.todo', + 'sphinx.ext.coverage', + 'sphinx.ext.mathjax', + 'sphinx.ext.viewcode', + 'sphinxcontrib.napoleon', +] + +# Add any paths that contain templates here, relative to this directory. +templates_path = ['_templates'] + +# The suffix(es) of source filenames. +# You can specify multiple suffix as a list of string: +# +# source_suffix = ['.rst', '.md'] +source_suffix = '.rst' + +# The encoding of source files. +# +# source_encoding = 'utf-8-sig' + +# The master toctree document. +master_doc = 'index' + +# General information about the project. +project = u'RAPIDpy' +copyright = u'2016, Alan D. Snow' +author = u'Alan D. Snow' + +# The version info for the project you're documenting, acts as replacement for +# |version| and |release|, also used in various other places throughout the +# built documents. +# +# The short X.Y version. +version = u'2.4.3' +# The full version, including alpha/beta/rc tags. +release = u'2.4.3' + +# The language for content autogenerated by Sphinx. Refer to documentation +# for a list of supported languages. +# +# This is also used if you do content translation via gettext catalogs. +# Usually you set "language" from the command line for these cases. +language = None + +# There are two options for replacing |today|: either, you set today to some +# non-false value, then it is used: +# +# today = '' +# +# Else, today_fmt is used as the format for a strftime call. +# +# today_fmt = '%B %d, %Y' + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This patterns also effect to html_static_path and html_extra_path +exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] + +# The reST default role (used for this markup: `text`) to use for all +# documents. +# +# default_role = None + +# If true, '()' will be appended to :func: etc. cross-reference text. +# +# add_function_parentheses = True + +# If true, the current module name will be prepended to all description +# unit titles (such as .. function::). +# +# add_module_names = True + +# If true, sectionauthor and moduleauthor directives will be shown in the +# output. They are ignored by default. +# +# show_authors = False + +# The name of the Pygments (syntax highlighting) style to use. +pygments_style = 'sphinx' + +# A list of ignored prefixes for module index sorting. +# modindex_common_prefix = [] + +# If true, keep warnings as "system message" paragraphs in the built documents. +# keep_warnings = False + +# If true, `todo` and `todoList` produce output, else they produce nothing. +todo_include_todos = True + + +# -- Options for HTML output ---------------------------------------------- + +# The theme to use for HTML and HTML Help pages. See the documentation for +# a list of builtin themes. +# +html_theme = 'default' + +# Theme options are theme-specific and customize the look and feel of a theme +# further. For a list of options available for each theme, see the +# documentation. +# +# html_theme_options = {} + +# Add any paths that contain custom themes here, relative to this directory. +# html_theme_path = [] + +# The name for this set of Sphinx documents. +# " v documentation" by default. +# +# html_title = u'RAPIDpy v2.3.3' + +# A shorter title for the navigation bar. Default is the same as html_title. +# +# html_short_title = None + +# The name of an image file (relative to this directory) to place at the top +# of the sidebar. +# +# html_logo = None + +# The name of an image file (relative to this directory) to use as a favicon of +# the docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 +# pixels large. +# +# html_favicon = None + +# Add any paths that contain custom static files (such as style sheets) here, +# relative to this directory. They are copied after the builtin static files, +# so a file named "default.css" will overwrite the builtin "default.css". +html_static_path = ['_static'] + +# Add any extra paths that contain custom files (such as robots.txt or +# .htaccess) here, relative to this directory. These files are copied +# directly to the root of the documentation. +# +# html_extra_path = [] + +# If not None, a 'Last updated on:' timestamp is inserted at every page +# bottom, using the given strftime format. +# The empty string is equivalent to '%b %d, %Y'. +# +html_last_updated_fmt = '' + +# If true, SmartyPants will be used to convert quotes and dashes to +# typographically correct entities. +# +# html_use_smartypants = True + +# Custom sidebar templates, maps document names to template names. +# +# html_sidebars = {} + +# Additional templates that should be rendered to pages, maps page names to +# template names. +# +# html_additional_pages = {} + +# If false, no module index is generated. +# +# html_domain_indices = True + +# If false, no index is generated. +# +# html_use_index = True + +# If true, the index is split into individual pages for each letter. +# +# html_split_index = False + +# If true, links to the reST sources are added to the pages. +# +# html_show_sourcelink = True + +# If true, "Created using Sphinx" is shown in the HTML footer. Default is True. +# +# html_show_sphinx = True + +# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. +# +# html_show_copyright = True + +# If true, an OpenSearch description file will be output, and all pages will +# contain a tag referring to it. The value of this option must be the +# base URL from which the finished HTML is served. +# +# html_use_opensearch = '' + +# This is the file name suffix for HTML files (e.g. ".xhtml"). +# html_file_suffix = None + +# Language to be used for generating the HTML full-text search index. +# Sphinx supports the following languages: +# 'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja' +# 'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr', 'zh' +# +# html_search_language = 'en' + +# A dictionary with options for the search language support, empty by default. +# 'ja' uses this config value. +# 'zh' user can custom change `jieba` dictionary path. +# +# html_search_options = {'type': 'default'} + +# The name of a javascript file (relative to the configuration directory) that +# implements a search results scorer. If empty, the default will be used. +# +# html_search_scorer = 'scorer.js' + +# Output file base name for HTML help builder. +htmlhelp_basename = 'RAPIDpydoc' + +# -- Options for LaTeX output --------------------------------------------- + +latex_elements = { + # The paper size ('letterpaper' or 'a4paper'). + # + # 'papersize': 'letterpaper', + + # The font size ('10pt', '11pt' or '12pt'). + # + # 'pointsize': '10pt', + + # Additional stuff for the LaTeX preamble. + # + # 'preamble': '', + + # Latex figure (float) alignment + # + # 'figure_align': 'htbp', +} + +# Grouping the document tree into LaTeX files. List of tuples +# (source start file, target name, title, +# author, documentclass [howto, manual, or own class]). +latex_documents = [ + (master_doc, 'RAPIDpy.tex', u'RAPIDpy Documentation', + u'Alan D. Snow', 'manual'), +] + +# The name of an image file (relative to this directory) to place at the top of +# the title page. +# +# latex_logo = None + +# For "manual" documents, if this is true, then toplevel headings are parts, +# not chapters. +# +# latex_use_parts = False + +# If true, show page references after internal links. +# +# latex_show_pagerefs = False + +# If true, show URL addresses after external links. +# +# latex_show_urls = False + +# Documents to append as an appendix to all manuals. +# +# latex_appendices = [] + +# It false, will not define \strong, \code, itleref, \crossref ... but only +# \sphinxstrong, ..., \sphinxtitleref, ... To help avoid clash with user added +# packages. +# +# latex_keep_old_macro_names = True + +# If false, no module index is generated. +# +# latex_domain_indices = True + + +# -- Options for manual page output --------------------------------------- + +# One entry per manual page. List of tuples +# (source start file, name, description, authors, manual section). +man_pages = [ + (master_doc, 'rapidpy', u'RAPIDpy Documentation', + [author], 1) +] + +# If true, show URL addresses after external links. +# +# man_show_urls = False + + +# -- Options for Texinfo output ------------------------------------------- + +# Grouping the document tree into Texinfo files. List of tuples +# (source start file, target name, title, author, +# dir menu entry, description, category) +texinfo_documents = [ + (master_doc, 'RAPIDpy', u'RAPIDpy Documentation', + author, 'RAPIDpy', 'One line description of project.', + 'Miscellaneous'), +] + +# Documents to append as an appendix to all manuals. +# +# texinfo_appendices = [] + +# If false, no module index is generated. +# +# texinfo_domain_indices = True + +# How to display URL addresses: 'footnote', 'no', or 'inline'. +# +# texinfo_show_urls = 'footnote' + +# If true, do not generate a @detailmenu in the "Top" node's menu. +# +# texinfo_no_detailmenu = False diff --git a/docs/gis_stream_network.rst b/docs/gis_stream_network.rst new file mode 100644 index 0000000..45857ef --- /dev/null +++ b/docs/gis_stream_network.rst @@ -0,0 +1,70 @@ +Generating Stream Network +========================= + +Using ArcHydro to Generate Stream Network +----------------------------------------- + +See: + +- https://github.com/Esri/python-toolbox-for-rapid +- https://github.com/erdc-cm/python-toolbox-for-rapid + +Using TauDEM to Generate Stream Network +--------------------------------------- + +For more information about taudem, see: +http://hydrology.usu.edu/taudem/taudem5/index.html + +Installation +------------ + +Step 1: Install TauDEM +~~~~~~~~~~~~~~~~~~~~~~ + +:: + + $ cd /path/to/scripts + $ git clone https://github.com/dtarb/TauDEM.git + $ cd TauDEM/src + $ make + +Step 2: Install RAPIDpy with GIS Dependencies +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +See: :doc:`installation` + +How To Use +---------- + +Initialize TauDEM Manager +~~~~~~~~~~~~~~~~~~~~~~~~~ +.. autoclass:: RAPIDpy.gis.taudem.TauDEM + +Generate network from DEM +~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. automethod:: RAPIDpy.gis.taudem.TauDEM.demToStreamNetwork(output_directory,raw_elevation_dem="",pit_filled_elevation_grid="",flow_dir_grid_d8="",contributing_area_grid_d8="",flow_dir_grid_dinf="",contributing_area_grid_dinf="",use_dinf=False,threshold=1000,delineate=False) + +Add Length in meters attribute +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. automethod:: RAPIDpy.gis.taudem.TauDEM.addLengthMeters(stream_network) + +Extract Sub Network +~~~~~~~~~~~~~~~~~~~ + +STEP 1: Extract sub network from stream network +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +There are two options to do this. + +1. Choose your own outlet point: :func:`~RAPIDpy.gis.taudem.TauDEM.extractSubNetwork()` +2. Or let the code find the larges network: :func:`~RAPIDpy.gis.taudem.TauDEM.extractLargestSubNetwork()`. + +.. automethod:: RAPIDpy.gis.taudem.TauDEM.extractSubNetwork(network_file,out_subset_network_file,outlet_ids,river_id_field,next_down_id_field,river_magnitude_field,safe_mode=True) + +.. automethod:: RAPIDpy.gis.taudem.TauDEM.extractLargestSubNetwork(network_file,out_subset_network_file,river_id_field,next_down_id_field,river_magnitude_field,safe_mode=True) + +STEP 2: Extract sub network from catchments +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. automethod:: RAPIDpy.gis.taudem.TauDEM.extractSubsetFromWatershed(subset_network_file,subset_network_river_id_field,watershed_file,watershed_network_river_id_field,out_watershed_subset_file) diff --git a/docs/gis_tools.rst b/docs/gis_tools.rst new file mode 100644 index 0000000..402f8d0 --- /dev/null +++ b/docs/gis_tools.rst @@ -0,0 +1,80 @@ +RAPID GIS Tools +=============== + +These tools generate the RAPID input files and weight table files from the GIS stream networks. + + +.. note:: To generate your own network from a DEM see :doc:`gis_stream_network` + +.. note:: For these tools to work, you need GIS dependencies installed (See :doc:`installation`). + +There are also tools by Esri for ArcMap located here: + +- https://github.com/Esri/python-toolbox-for-rapid +- https://github.com/erdc-cm/python-toolbox-for-rapid + +Workflows +--------- + +Static RAPID Files +~~~~~~~~~~~~~~~~~~ + +.. autofunction:: RAPIDpy.gis.workflow.CreateAllStaticRAPIDFiles + + +Weight Table Files +~~~~~~~~~~~~~~~~~~ + +.. autofunction:: RAPIDpy.gis.workflow.CreateAllStaticECMWFFiles + +Static RAPID Files and Weight Table Files +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. autofunction:: RAPIDpy.gis.workflow.CreateAllStaticECMWFRAPIDFiles + + +Individual Tools +---------------- + +Static RAPID Files +~~~~~~~~~~~~~~~~~~ +.. autofunction:: RAPIDpy.gis.network.CreateNetworkConnectivity + +.. autofunction:: RAPIDpy.gis.network.CreateNetworkConnectivityNHDPlus + +.. autofunction:: RAPIDpy.gis.network.CreateSubsetFile + +.. autofunction:: RAPIDpy.gis.muskingum.CreateMuskingumKfacFile + +.. autofunction:: RAPIDpy.gis.muskingum.CreateMuskingumKFile + +.. autofunction:: RAPIDpy.gis.muskingum.CreateMuskingumXFileFromDranageLine + +.. autofunction:: RAPIDpy.gis.muskingum.CreateConstMuskingumXFile + +Weight Tables +~~~~~~~~~~~~~ +.. autofunction:: RAPIDpy.gis.weight.CreateWeightTableECMWF + +.. autofunction:: RAPIDpy.gis.weight.CreateWeightTableLDAS + + +Utilities +--------- + +.. autofunction:: RAPIDpy.gis.centroid.FlowlineToPoint + + +How it works: +------------- + +Snow, Alan D., Scott D. Christensen, Nathan R. Swain, E. James Nelson, +Daniel P. Ames, Norman L. Jones, Deng Ding, Nawajish S. Noman, Cedric H. +David, Florian Pappenberger, and Ervin Zsoter, 2016. A High-Resolution +National-Scale Hydrologic Forecast System from a Global Ensemble Land +Surface Model. *Journal of the American Water Resources Association +(JAWRA)* 1-15, DOI: 10.1111/1752-1688.12434 + +Snow, Alan Dee, "A New Global Forecasting Model to Produce +High-Resolution Stream Forecasts" (2015). All Theses and Dissertations. +Paper 5272. http://scholarsarchive.byu.edu/etd/5272 diff --git a/docs/index.rst b/docs/index.rst new file mode 100644 index 0000000..2b3af3d --- /dev/null +++ b/docs/index.rst @@ -0,0 +1,65 @@ +RAPIDpy +======= + +RAPIDpy is a python interface for RAPID that assists to prepare inputs, +runs the RAPID program, and provides post-processing utilities. More +information about installation and the input parameters for RAPID can be +found at http://rapid-hub.org. The source code for RAPID is located at +https://github.com/c-h-david/rapid. + +|DOI| + +|PyPI version| + +|Build Status| + +|Coverage Status| + +|License (3-Clause BSD)| + +.. |DOI| image:: https://zenodo.org/badge/19918/erdc-cm/RAPIDpy.svg + :target: https://zenodo.org/badge/latestdoi/19918/erdc-cm/RAPIDpy +.. |PyPI version| image:: https://badge.fury.io/py/RAPIDpy.svg + :target: https://badge.fury.io/py/RAPIDpy +.. |Build Status| image:: https://travis-ci.org/erdc-cm/RAPIDpy.svg?branch=master + :target: https://travis-ci.org/erdc-cm/RAPIDpy +.. |Coverage Status| image:: https://coveralls.io/repos/github/erdc-cm/RAPIDpy/badge.svg?branch=master + :target: https://coveralls.io/github/erdc-cm/RAPIDpy +.. |License (3-Clause BSD)| image:: https://img.shields.io/badge/license-BSD%203--Clause-yellow.svg + :target: https://github.com/erdc-cm/RAPIDpy/blob/master/LICENSE + +Publications: +============= + +Tavakoly, A. A., A. D. Snow, C. H. David, M. L. Follum, D. R. Maidment, and Z.-L. Yang, (2016) "Continental-Scale River Flow Modeling of the Mississippi River Basin Using High-Resolution NHDPlus Dataset", Journal of the American Water Resources Association (JAWRA) 1-22. DOI: 10.1111/1752-1688.12456 + +Datasets: +========= + +Ahmad A Tavakoly. (2017). RAPID input files corresponding to the Mississippi River Basin using the NHDPlus v2 Dataset [Data set]. Zenodo. http://doi.org/10.5281/zenodo.322886 |Mississippi Dataset DOI| + +.. |Mississippi Dataset DOI| image:: https://zenodo.org/badge/DOI/10.5281/zenodo.322886.svg + :target: https://doi.org/10.5281/zenodo.322886 + + +Contents: + +.. toctree:: + :maxdepth: 1 + + installation + gis_stream_network + gis_tools + running_rapid + lsm_inflow + rapid_dataset + postprocessing + rapid_to_gssha + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` + diff --git a/docs/installation.rst b/docs/installation.rst new file mode 100644 index 0000000..7b8c6af --- /dev/null +++ b/docs/installation.rst @@ -0,0 +1,108 @@ +Installation +============ + +Step 1: Install RAPID +--------------------- + +Before Installation Steps: +~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Ubuntu: +^^^^^^^ + +:: + + $ sudo apt-get install gfortran g++ + +RedHat/CentOS: +^^^^^^^^^^^^^^ + +:: + + $ sudo yum install gcc-c++ gcc-gfortran + +Windows with Cygwin: +^^^^^^^^^^^^^^^^^^^^ + +Downloaded Cygwin (64-bit) (https://www.cygwin.com/) with these +dependencies: + +- gcc-core +- gcc-fortran +- gcc-g++ +- gdb +- git +- make +- time +- wget + +Installation Steps: +~~~~~~~~~~~~~~~~~~~ + +Manual: +^^^^^^^ + +- See: http://rapid-hub.org + +Bash: +^^^^^ + +1. Clone RAPID repository:: + + $ git clone https://github.com/c-h-david/rapid.git + +2. Install Prereqs:: + + $ cd rapid + $ chmod u+x rapid_install_prereqs.sh + $ ./rapid_install_prereqs.sh + +3. Append *source rapid_specify_varpath.sh* to the ~/.bashrc or ~/.bash_profile:: + + source /path/to/cloned/rapid/rapid_specify_varpath.sh + +4. Restart Terminal + +5. Build RAPID:: + + $ cd rapid/src + $ make rapid + +Step 2: Install RAPIDpy +----------------------- + +Due to the dependencies required, we recommend using Anaconda or Miniconda. +They can be downloaded from https://www.continuum.io/downloads +or from https://conda.io/miniconda.html. + + +After installing Anaconda or Miniconda: + +:: + + $ conda install -c conda-forge rapidpy + + +Developer Installation +~~~~~~~~~~~~~~~~~~~~~~ + +This is how you get the most up-to-date version of the code. + +See: https://github.com/erdc-cm/RAPIDpy/blob/master/.travis.yml for a more detailed +list of installation steps. + +.. note:: If you don't have git, you can download the code from https://github.com/erdc-cm/RAPIDpy + +:: + + $ git clone https://github.com/erdc-cm/RAPIDpy.git + $ cd RAPIDpy + $ python setup.py install + +To develop on the latest version: + +:: + + $ git clone https://github.com/erdc-cm/RAPIDpy.git + $ cd RAPIDpy + $ python setup.py develop diff --git a/docs/lsm_inflow.rst b/docs/lsm_inflow.rst new file mode 100644 index 0000000..43fadb4 --- /dev/null +++ b/docs/lsm_inflow.rst @@ -0,0 +1,70 @@ +Inflow from Land Surface Models +=============================== + +Code to use to prepare input data for RAPID from Land Surface Models +(LSM) such as: + +- ECMWF's ERA Interim Data +- NASA's GLDAS/NLDAS/LIS Data +- CMIP5 Data (daily VIC data available from 1950 to 2099) + +Step 1: Retrieve Land Surface Model Runoff Output +------------------------------------------------- + +Download the data into a local directory. + +- http://apps.ecmwf.int/datasets +- http://ldas.gsfc.nasa.gov/index.php +- ftp://gdo-dcp.ucllnl.org/pub/dcp/archive/cmip5/hydro/BCSD_daily_VIC_nc/ + +Step 2: Create folders for RAPID input and output +------------------------------------------------- + +In this instance: + +:: + + $ cd $HOME + $ mkdir -p rapid-io/input rapid-io/output + +Step 3: Create script using LSM process +--------------------------------------- + +Here is the API for the function to use. Follow the example to create a script to use the code such as in ~/run\_lsm.py. + +.. autofunction:: RAPIDpy.inflow.lsm_rapid_process.run_lsm_rapid_process + +Step 4: Add RAPID files to the rapid-io/input directory +--------------------------------------------------------- + +Make sure the directory is in the format [watershed name]-[subbasin +name] with lowercase letters, numbers, and underscores only. No spaces! + +Example: + +:: + + $ ls /rapid-io/input + nfie_texas_gulf_region-huc_2_12 + + $ ls /rapid-io/input/nfie_texas_gulf_region-huc_2_12 + comid_lat_lon_z.csv + k.csv + rapid_connect.csv + riv_bas_id.csv + weight_era_t511.csv + weight_nldas.csv + weight_gldas.csv + weight_lis.csv + weight_wrf.csv + weight_cmip5.csv + x.csv + +If you have not generated these files yet, see :doc:`gis_tools` + +Step 5: Run the code +-------------------- + +:: + + $ python ~/run_lsm.py diff --git a/docs/make.bat b/docs/make.bat new file mode 100644 index 0000000..2b48a8c --- /dev/null +++ b/docs/make.bat @@ -0,0 +1,281 @@ +@ECHO OFF + +REM Command file for Sphinx documentation + +if "%SPHINXBUILD%" == "" ( + set SPHINXBUILD=sphinx-build +) +set BUILDDIR=_build +set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% . +set I18NSPHINXOPTS=%SPHINXOPTS% . +if NOT "%PAPER%" == "" ( + set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS% + set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS% +) + +if "%1" == "" goto help + +if "%1" == "help" ( + :help + echo.Please use `make ^` where ^ is one of + echo. html to make standalone HTML files + echo. dirhtml to make HTML files named index.html in directories + echo. singlehtml to make a single large HTML file + echo. pickle to make pickle files + echo. json to make JSON files + echo. htmlhelp to make HTML files and a HTML help project + echo. qthelp to make HTML files and a qthelp project + echo. devhelp to make HTML files and a Devhelp project + echo. epub to make an epub + echo. epub3 to make an epub3 + echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter + echo. text to make text files + echo. man to make manual pages + echo. texinfo to make Texinfo files + echo. gettext to make PO message catalogs + echo. changes to make an overview over all changed/added/deprecated items + echo. xml to make Docutils-native XML files + echo. pseudoxml to make pseudoxml-XML files for display purposes + echo. linkcheck to check all external links for integrity + echo. doctest to run all doctests embedded in the documentation if enabled + echo. coverage to run coverage check of the documentation if enabled + echo. dummy to check syntax errors of document sources + goto end +) + +if "%1" == "clean" ( + for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i + del /q /s %BUILDDIR%\* + goto end +) + + +REM Check if sphinx-build is available and fallback to Python version if any +%SPHINXBUILD% 1>NUL 2>NUL +if errorlevel 9009 goto sphinx_python +goto sphinx_ok + +:sphinx_python + +set SPHINXBUILD=python -m sphinx.__init__ +%SPHINXBUILD% 2> nul +if errorlevel 9009 ( + echo. + echo.The 'sphinx-build' command was not found. Make sure you have Sphinx + echo.installed, then set the SPHINXBUILD environment variable to point + echo.to the full path of the 'sphinx-build' executable. Alternatively you + echo.may add the Sphinx directory to PATH. + echo. + echo.If you don't have Sphinx installed, grab it from + echo.http://sphinx-doc.org/ + exit /b 1 +) + +:sphinx_ok + + +if "%1" == "html" ( + %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/html. + goto end +) + +if "%1" == "dirhtml" ( + %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml. + goto end +) + +if "%1" == "singlehtml" ( + %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml. + goto end +) + +if "%1" == "pickle" ( + %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can process the pickle files. + goto end +) + +if "%1" == "json" ( + %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can process the JSON files. + goto end +) + +if "%1" == "htmlhelp" ( + %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can run HTML Help Workshop with the ^ +.hhp project file in %BUILDDIR%/htmlhelp. + goto end +) + +if "%1" == "qthelp" ( + %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; now you can run "qcollectiongenerator" with the ^ +.qhcp project file in %BUILDDIR%/qthelp, like this: + echo.^> qcollectiongenerator %BUILDDIR%\qthelp\RAPIDpy.qhcp + echo.To view the help file: + echo.^> assistant -collectionFile %BUILDDIR%\qthelp\RAPIDpy.ghc + goto end +) + +if "%1" == "devhelp" ( + %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. + goto end +) + +if "%1" == "epub" ( + %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The epub file is in %BUILDDIR%/epub. + goto end +) + +if "%1" == "epub3" ( + %SPHINXBUILD% -b epub3 %ALLSPHINXOPTS% %BUILDDIR%/epub3 + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The epub3 file is in %BUILDDIR%/epub3. + goto end +) + +if "%1" == "latex" ( + %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex + if errorlevel 1 exit /b 1 + echo. + echo.Build finished; the LaTeX files are in %BUILDDIR%/latex. + goto end +) + +if "%1" == "latexpdf" ( + %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex + cd %BUILDDIR%/latex + make all-pdf + cd %~dp0 + echo. + echo.Build finished; the PDF files are in %BUILDDIR%/latex. + goto end +) + +if "%1" == "latexpdfja" ( + %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex + cd %BUILDDIR%/latex + make all-pdf-ja + cd %~dp0 + echo. + echo.Build finished; the PDF files are in %BUILDDIR%/latex. + goto end +) + +if "%1" == "text" ( + %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The text files are in %BUILDDIR%/text. + goto end +) + +if "%1" == "man" ( + %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The manual pages are in %BUILDDIR%/man. + goto end +) + +if "%1" == "texinfo" ( + %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo. + goto end +) + +if "%1" == "gettext" ( + %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The message catalogs are in %BUILDDIR%/locale. + goto end +) + +if "%1" == "changes" ( + %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes + if errorlevel 1 exit /b 1 + echo. + echo.The overview file is in %BUILDDIR%/changes. + goto end +) + +if "%1" == "linkcheck" ( + %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck + if errorlevel 1 exit /b 1 + echo. + echo.Link check complete; look for any errors in the above output ^ +or in %BUILDDIR%/linkcheck/output.txt. + goto end +) + +if "%1" == "doctest" ( + %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest + if errorlevel 1 exit /b 1 + echo. + echo.Testing of doctests in the sources finished, look at the ^ +results in %BUILDDIR%/doctest/output.txt. + goto end +) + +if "%1" == "coverage" ( + %SPHINXBUILD% -b coverage %ALLSPHINXOPTS% %BUILDDIR%/coverage + if errorlevel 1 exit /b 1 + echo. + echo.Testing of coverage in the sources finished, look at the ^ +results in %BUILDDIR%/coverage/python.txt. + goto end +) + +if "%1" == "xml" ( + %SPHINXBUILD% -b xml %ALLSPHINXOPTS% %BUILDDIR%/xml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The XML files are in %BUILDDIR%/xml. + goto end +) + +if "%1" == "pseudoxml" ( + %SPHINXBUILD% -b pseudoxml %ALLSPHINXOPTS% %BUILDDIR%/pseudoxml + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. The pseudo-XML files are in %BUILDDIR%/pseudoxml. + goto end +) + +if "%1" == "dummy" ( + %SPHINXBUILD% -b dummy %ALLSPHINXOPTS% %BUILDDIR%/dummy + if errorlevel 1 exit /b 1 + echo. + echo.Build finished. Dummy builder generates no files. + goto end +) + +:end diff --git a/docs/postprocessing.rst b/docs/postprocessing.rst new file mode 100644 index 0000000..19f9481 --- /dev/null +++ b/docs/postprocessing.rst @@ -0,0 +1,33 @@ +Postprocessing +============== + +Merge RAPID Output +------------------ + +.. autoclass:: RAPIDpy.postprocess.ConvertRAPIDOutputToCF + +Generate qinit from past qout +----------------------------- + +RAPIDpy also creates a qinit file from a RAPID qout file. This example +shows how. + +.. automethod:: RAPIDpy.rapid.RAPID.generate_qinit_from_past_qout + :noindex: + +Generate seasonal qinit from past qout +-------------------------------------- + +.. automethod:: RAPIDpy.rapid.RAPID.generate_seasonal_intitialization + :noindex: + +Goodness of Fit +--------------- + +To check how well your simulation performed versus observations, these +functions can help you. + +.. autofunction:: RAPIDpy.postprocess.find_goodness_of_fit_csv + +.. autofunction:: RAPIDpy.postprocess.find_goodness_of_fit + diff --git a/docs/rapid_dataset.rst b/docs/rapid_dataset.rst new file mode 100644 index 0000000..0656413 --- /dev/null +++ b/docs/rapid_dataset.rst @@ -0,0 +1,11 @@ +RAPIDDataset +============ + +This is a wrapper for the RAPID Qout netCDF file. Here are some basic +examples for useage. + +.. autoclass:: RAPIDpy.dataset.RAPIDDataset + :members: write_flows_to_csv, get_qout, get_river_index, + get_time_array, is_time_variable_valid, get_time_index_range, + get_river_id_array, write_flows_to_gssha_time_series_xys, + write_flows_to_gssha_time_series_ihg \ No newline at end of file diff --git a/docs/rapid_to_gssha.rst b/docs/rapid_to_gssha.rst new file mode 100644 index 0000000..47abaf4 --- /dev/null +++ b/docs/rapid_to_gssha.rst @@ -0,0 +1,67 @@ +RAPID to GSSHA +============== + +It is possible to use RAPID streamflow as an overland flow boundary condition +to the Gridded Surface Subsurface Hydrologic Analysis (GSSHA) model. + +What is GSSHA? +-------------- + +GSSHA is a physically-based, distributed hydrologic model. GSSHA is developed +and maintained by Coastal and Hydraulics Laboratory (CHL) which is +a member of the Engineer Research & Development Center of the United +States Army Corps of Engineers (USACE). + +.. note:: + + For more information about GSSHA please visit the the gsshawiki_ . + +.. _gsshawiki: http://www.gsshawiki.com/Main_Page + +Tutorial +-------- +There are two ways to input RAPID as a boundary condition for GSSHA. +One is to connect the GSSHA stream network link and node to the RAPID +river ID and generate the IHG file. The other is to generate an XYS +timeseries file and add it to the netork using WMS. + + +Method 1: Generate IHG File +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Step 1.1: Look at Stream Network in WMS to find Link & Node +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +1. Open GSSHA project in WMS + + - Switch to 2-D Grid Module + - In the top menu: *GSSHA -> Open Project File* + +2. Turn on *Stream Link Numbers* Display + + - In the top menu: *Display -> Display Options* + - Select *Map Data* in top left box + - In the center box, make sure *Stream Link Numbers* is checked under the Arcs subsection. + +3. Determine the Link ID by looking on model. + +Step 1.2: Connect RAPID river ID to GSSHA Link & Node and Generate IHG +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. automethod:: RAPIDpy.dataset.RAPIDDataset.write_flows_to_gssha_time_series_ihg + :noindex: + + +Method 2: Generate XYS File +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Step 2.1: Generate XYS File +^^^^^^^^^^^^^^^^^^^^^^^^^^^ +.. automethod:: RAPIDpy.dataset.RAPIDDataset.write_flows_to_gssha_time_series_xys + :noindex: + +Step 2.2: Add XYS File in WMS +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +In the Distributed Hydrology section, go to *Overland Flow Boundary Conditions in GSSHA (Tutorial 55)* at http://www.aquaveo.com/software/wms-learning-tutorials + +Here is a direct link to the document: http://wmstutorials-10.1.aquaveo.com/55%20Gssha-Applications-OverlandBoundaryConditions.pdf diff --git a/docs/running_rapid.rst b/docs/running_rapid.rst new file mode 100644 index 0000000..3af6169 --- /dev/null +++ b/docs/running_rapid.rst @@ -0,0 +1,49 @@ +Running RAPID +============= + +Tutorial +-------- + +Step 1: Initialize the RAPID manager class. +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +- First, add the path to you rapid executable location. +- Next, you need to either tell it how many processors to use using the + *num\_processors* input variable or to use all available processors + set *use\_all\_processors* to true. +- After that, add any other parameters you would like to use that would + normally be in the rapid namelist file (this is case sensitive). + +.. autoclass:: RAPIDpy.rapid.RAPID + + +Step 2 (optional): Add/update additional namelist parameters later +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. automethod:: RAPIDpy.rapid.RAPID.update_parameters + +Step 3 (optional): Update reach number data +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. automethod:: RAPIDpy.rapid.RAPID.update_reach_number_data + +Step 4 (optional): Update simulation runtime data +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. automethod:: RAPIDpy.rapid.RAPID.update_simulation_runtime + +Step 5: Run RAPID +~~~~~~~~~~~~~~~~~ + +.. automethod:: RAPIDpy.rapid.RAPID.run + +Step 6 (optional): Convert RAPID output to be CF Compliant +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +.. automethod:: RAPIDpy.rapid.RAPID.make_output_CF_compliant + + +Full API Description +-------------------- + +.. autoclass:: RAPIDpy.rapid.RAPID + :members: \ No newline at end of file diff --git a/readthedocs.yml b/readthedocs.yml new file mode 100644 index 0000000..6a76dfa --- /dev/null +++ b/readthedocs.yml @@ -0,0 +1,7 @@ +conda: + file: conda-env.yml +python: + version: 2 + pip_install: true + extra_requirements: + - docs diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..c0660e6 --- /dev/null +++ b/setup.py @@ -0,0 +1,47 @@ +from setuptools import setup, find_packages + +setup( + name='RAPIDpy', + version='2.4.3', + description='Python interface for RAPID (rapid-hub.org)', + long_description='RAPIDpy is a python interface for RAPID that assists ' + 'to prepare inputs, runs the RAPID program, and provides ' + 'post-processing utilities (http://rapidpy.readthedocs.io). ' + 'More information about installation and the input ' + 'parameters for RAPID can be found at http://rapid-hub.org.' + ' The source code for RAPID is located at ' + 'https://github.com/c-h-david/rapid/. \n\n' + '.. image:: https://zenodo.org/badge/19918/erdc-cm/RAPIDpy.svg \n' + ' :target: https://zenodo.org/badge/latestdoi/19918/erdc-cm/RAPIDpy', + keywords='RAPID', + author='Alan Dee Snow', + author_email='alan.d.snow@usace.army.mil', + url='https://github.com/erdc-cm/RAPIDpy', + license='BSD 3-Clause', + packages=find_packages(), + package_data={'': ['gis/lsm_grids/*.nc']}, + install_requires=['future', 'numpy', 'netcdf4', 'pandas', + 'python-dateutil', 'pytz', 'requests'], + classifiers=[ + 'Intended Audience :: Developers', + 'Intended Audience :: Science/Research', + 'Operating System :: OS Independent', + 'Programming Language :: Python', + 'Programming Language :: Python :: 2', + 'Programming Language :: Python :: 2.7', + 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 3.5', + ], + extras_require={ + 'tests': [ + 'pytest', + 'pytest-cov', + ], + 'docs': [ + 'mock', + 'sphinx', + 'sphinx_rtd_theme', + 'sphinxcontrib-napoleon', + ] + }, +) diff --git a/tests/compare/Qinit_seasonal_avg_jan_1.csv b/tests/compare/Qinit_seasonal_avg_jan_1.csv new file mode 100644 index 0000000..ff51500 --- /dev/null +++ b/tests/compare/Qinit_seasonal_avg_jan_1.csv @@ -0,0 +1,9 @@ +0.0 +8.836997585603967e-05 +0.00051118218107149 +0.0021298041101545095 +0.0026858358178287745 +0.0015686650294810534 +0.0004693640221375972 +0.00012480310397222638 +0.0002827169082593173 diff --git a/tests/compare/Qout_merge.nc b/tests/compare/Qout_merge.nc new file mode 100644 index 0000000..f7c8724 Binary files /dev/null and b/tests/compare/Qout_merge.nc differ diff --git a/tests/compare/Qout_nasa_lis_3hr_20020830.nc b/tests/compare/Qout_nasa_lis_3hr_20020830.nc new file mode 100644 index 0000000..349c97a Binary files /dev/null and b/tests/compare/Qout_nasa_lis_3hr_20020830.nc differ diff --git a/tests/compare/Qout_nasa_lis_3hr_20020830_CF.nc b/tests/compare/Qout_nasa_lis_3hr_20020830_CF.nc new file mode 100644 index 0000000..08b4f75 Binary files /dev/null and b/tests/compare/Qout_nasa_lis_3hr_20020830_CF.nc differ diff --git a/tests/compare/Qout_nasa_lis_3hr_20020830_CF_no_lat_lon_z.nc b/tests/compare/Qout_nasa_lis_3hr_20020830_CF_no_lat_lon_z.nc new file mode 100644 index 0000000..6ec7331 Binary files /dev/null and b/tests/compare/Qout_nasa_lis_3hr_20020830_CF_no_lat_lon_z.nc differ diff --git a/tests/compare/Qout_nasa_lis_3hr_20020830_original.nc b/tests/compare/Qout_nasa_lis_3hr_20020830_original.nc new file mode 100644 index 0000000..ba4cf69 Binary files /dev/null and b/tests/compare/Qout_nasa_lis_3hr_20020830_original.nc differ diff --git a/tests/compare/cf_goodness_of_fit_analysis.csv b/tests/compare/cf_goodness_of_fit_analysis.csv new file mode 100644 index 0000000..2961083 --- /dev/null +++ b/tests/compare/cf_goodness_of_fit_analysis.csv @@ -0,0 +1,3 @@ +reach_id,percent_bias,abs_percent_bias,rmse,mae,bias,NSE,likelihood,correlation_coeff,index_agreement,KGE +75224,-74.858501076018868,74.858501076018868,23.8914,23.1687,-23.1687,-1350.0041578222406,0.0,-1.0,0.039352893829345703,-6.2918931170236574 +75224,-74.858501076018868,74.858501076018868,23.8914,23.1687,-23.1687,-1350.0041578222406,0.0,-1.0,0.039352893829345703,-6.2918931170236574 diff --git a/tests/compare/cf_goodness_of_fit_analysis_1.csv b/tests/compare/cf_goodness_of_fit_analysis_1.csv new file mode 100644 index 0000000..6a9fd89 --- /dev/null +++ b/tests/compare/cf_goodness_of_fit_analysis_1.csv @@ -0,0 +1,2 @@ +reach_id,percent_bias,abs_percent_bias,rmse,mae,bias,NSE,likelihood,correlation_coeff,index_agreement,KGE +75224,-74.858501076018868,74.858501076018868,23.8914,23.1687,-23.1687,-1350.0041578222406,0.0,-1.0,0.039352893829345703,-6.2918931170236574 diff --git a/tests/compare/cf_timeseries.csv b/tests/compare/cf_timeseries.csv new file mode 100644 index 0000000..81abb67 --- /dev/null +++ b/tests/compare/cf_timeseries.csv @@ -0,0 +1,17 @@ +2002-08-30 00:00:00,0.0 +2002-08-30 03:00:00,0.033643104136 +2002-08-30 06:00:00,0.0587439239025 +2002-08-30 09:00:00,0.0518858879805 +2002-08-30 12:00:00,0.0516051016748 +2002-08-30 15:00:00,0.0518918484449 +2002-08-30 18:00:00,0.05222312361 +2002-08-30 21:00:00,0.0525727123022 +2002-08-31 00:00:00,0.0529390275478 +2002-08-31 03:00:00,0.0533189661801 +2002-08-31 06:00:00,0.0538823418319 +2002-08-31 09:00:00,0.054439779371 +2002-08-31 12:00:00,0.0547072961926 +2002-08-31 15:00:00,0.0555616356432 +2002-08-31 18:00:00,0.0562346354127 +2002-08-31 21:00:00,0.0560650490224 +2002-09-01 00:00:00,0.0561376847327 diff --git a/tests/compare/cf_timeseries.ihg b/tests/compare/cf_timeseries.ihg new file mode 100644 index 0000000..b815236 --- /dev/null +++ b/tests/compare/cf_timeseries.ihg @@ -0,0 +1,20 @@ +NUMPT 1 +POINT 1 599 0.0 +NRPDS 17 +INPUT 2002 08 30 00 00 0.00000 +INPUT 2002 08 30 03 00 0.10073 +INPUT 2002 08 30 06 00 0.87412 +INPUT 2002 08 30 09 00 1.80970 +INPUT 2002 08 30 12 00 2.72844 +INPUT 2002 08 30 15 00 3.83714 +INPUT 2002 08 30 18 00 5.07205 +INPUT 2002 08 30 21 00 6.37279 +INPUT 2002 08 31 00 00 7.72781 +INPUT 2002 08 31 03 00 9.08265 +INPUT 2002 08 31 06 00 10.43755 +INPUT 2002 08 31 09 00 12.04025 +INPUT 2002 08 31 12 00 13.78219 +INPUT 2002 08 31 15 00 15.36506 +INPUT 2002 08 31 18 00 16.90097 +INPUT 2002 08 31 21 00 18.36924 +INPUT 2002 09 01 00 00 19.49250 diff --git a/tests/compare/cf_timeseries.xys b/tests/compare/cf_timeseries.xys new file mode 100644 index 0000000..ca75509 --- /dev/null +++ b/tests/compare/cf_timeseries.xys @@ -0,0 +1,18 @@ +XYS 25 17 "RAPID_TO_GSSHA" +"08/30/2002 12:00:00 AM" 0.00000 +"08/30/2002 03:00:00 AM" 0.03364 +"08/30/2002 06:00:00 AM" 0.05874 +"08/30/2002 09:00:00 AM" 0.05189 +"08/30/2002 12:00:00 PM" 0.05161 +"08/30/2002 03:00:00 PM" 0.05189 +"08/30/2002 06:00:00 PM" 0.05222 +"08/30/2002 09:00:00 PM" 0.05257 +"08/31/2002 12:00:00 AM" 0.05294 +"08/31/2002 03:00:00 AM" 0.05332 +"08/31/2002 06:00:00 AM" 0.05388 +"08/31/2002 09:00:00 AM" 0.05444 +"08/31/2002 12:00:00 PM" 0.05471 +"08/31/2002 03:00:00 PM" 0.05556 +"08/31/2002 06:00:00 PM" 0.05623 +"08/31/2002 09:00:00 PM" 0.05607 +"09/01/2002 12:00:00 AM" 0.05614 diff --git a/tests/compare/cf_timeseries_daily.csv b/tests/compare/cf_timeseries_daily.csv new file mode 100644 index 0000000..065356c --- /dev/null +++ b/tests/compare/cf_timeseries_daily.csv @@ -0,0 +1,3 @@ +2002-08-30,0.044070713222 +2002-08-31,0.0546435900033 +2002-09-01,0.0561376847327 diff --git a/tests/compare/cf_timeseries_daily.ihg b/tests/compare/cf_timeseries_daily.ihg new file mode 100644 index 0000000..c1d6375 --- /dev/null +++ b/tests/compare/cf_timeseries_daily.ihg @@ -0,0 +1,8 @@ +NUMPT 3 +POINT 1 599 0.0 +POINT 1 603 0.0 +POINT 1 605 0.0 +NRPDS 3 +INPUT 2002 08 30 00 00 2.59937 0.20775 0.10355 +INPUT 2002 08 31 00 00 12.96322 0.33463 0.15873 +INPUT 2002 09 01 00 00 19.49250 0.33966 0.14055 diff --git a/tests/compare/cf_timeseries_daily.xys b/tests/compare/cf_timeseries_daily.xys new file mode 100644 index 0000000..42b0432 --- /dev/null +++ b/tests/compare/cf_timeseries_daily.xys @@ -0,0 +1,4 @@ +XYS 25 3 "RAPID_TO_GSSHA" +"08/30/2002 12:00:00 AM" 0.04407 +"08/31/2002 12:00:00 AM" 0.05464 +"09/01/2002 12:00:00 AM" 0.05614 diff --git a/tests/compare/cf_timeseries_daily_date.csv b/tests/compare/cf_timeseries_daily_date.csv new file mode 100644 index 0000000..37eadac --- /dev/null +++ b/tests/compare/cf_timeseries_daily_date.csv @@ -0,0 +1 @@ +2002-08-31,18.369239807128906 diff --git a/tests/compare/cf_timeseries_daily_date.ihg b/tests/compare/cf_timeseries_daily_date.ihg new file mode 100644 index 0000000..03fdf1a --- /dev/null +++ b/tests/compare/cf_timeseries_daily_date.ihg @@ -0,0 +1,4 @@ +NUMPT 1 +POINT 1 599 0.0 +NRPDS 1 +INPUT 2002 08 31 00 00 12.96322 diff --git a/tests/compare/cf_timeseries_daily_date.xys b/tests/compare/cf_timeseries_daily_date.xys new file mode 100644 index 0000000..d31d379 --- /dev/null +++ b/tests/compare/cf_timeseries_daily_date.xys @@ -0,0 +1,2 @@ +XYS 25 1 "RAPID_TO_GSSHA" +"08/31/2002 12:00:00 AM" 12.96322 diff --git a/tests/compare/cf_timeseries_daily_date_tz.ihg b/tests/compare/cf_timeseries_daily_date_tz.ihg new file mode 100644 index 0000000..3f97740 --- /dev/null +++ b/tests/compare/cf_timeseries_daily_date_tz.ihg @@ -0,0 +1,4 @@ +NUMPT 1 +POINT 1 599 0.0 +NRPDS 1 +INPUT 2002 08 31 00 00 15.19825 diff --git a/tests/compare/cf_timeseries_daily_tz.ihg b/tests/compare/cf_timeseries_daily_tz.ihg new file mode 100644 index 0000000..fb8cb79 --- /dev/null +++ b/tests/compare/cf_timeseries_daily_tz.ihg @@ -0,0 +1,8 @@ +NUMPT 3 +POINT 1 599 0.0 +POINT 1 603 0.0 +POINT 1 605 0.0 +NRPDS 3 +INPUT 2002 08 29 00 00 0.05037 0.04395 0.04525 +INPUT 2002 08 30 00 00 4.68809 0.26494 0.12365 +INPUT 2002 08 31 00 00 15.19825 0.35303 0.16558 diff --git a/tests/compare/cf_timeseries_date.csv b/tests/compare/cf_timeseries_date.csv new file mode 100644 index 0000000..f8774ee --- /dev/null +++ b/tests/compare/cf_timeseries_date.csv @@ -0,0 +1,9 @@ +2002-08-31 00:00:00,7.7278137207 +2002-08-31 03:00:00,9.08265399933 +2002-08-31 06:00:00,10.4375543594 +2002-08-31 09:00:00,12.0402488708 +2002-08-31 12:00:00,13.7821922302 +2002-08-31 15:00:00,15.3650617599 +2002-08-31 18:00:00,16.900970459 +2002-08-31 21:00:00,18.3692398071 +2002-09-01 00:00:00,19.4925003052 diff --git a/tests/compare/cf_timeseries_date.ihg b/tests/compare/cf_timeseries_date.ihg new file mode 100644 index 0000000..a2afbed --- /dev/null +++ b/tests/compare/cf_timeseries_date.ihg @@ -0,0 +1,14 @@ +NUMPT 3 +POINT 1 599 0.0 +POINT 1 603 0.0 +POINT 1 605 0.0 +NRPDS 9 +INPUT 2002 08 31 00 00 7.72781 0.27208 0.12537 +INPUT 2002 08 31 03 00 9.08265 0.27336 0.12599 +INPUT 2002 08 31 06 00 10.43755 0.31118 0.16547 +INPUT 2002 08 31 09 00 12.04025 0.38636 0.19409 +INPUT 2002 08 31 12 00 13.78219 0.38593 0.16310 +INPUT 2002 08 31 15 00 15.36506 0.31870 0.13426 +INPUT 2002 08 31 18 00 16.90097 0.33592 0.18490 +INPUT 2002 08 31 21 00 18.36924 0.39349 0.17665 +INPUT 2002 09 01 00 00 19.49250 0.33966 0.14055 diff --git a/tests/compare/cf_timeseries_date.xys b/tests/compare/cf_timeseries_date.xys new file mode 100644 index 0000000..6582cd6 --- /dev/null +++ b/tests/compare/cf_timeseries_date.xys @@ -0,0 +1,10 @@ +XYS 25 9 "RAPID_TO_GSSHA" +"08/31/2002 12:00:00 AM" 7.72781 +"08/31/2002 03:00:00 AM" 9.08265 +"08/31/2002 06:00:00 AM" 10.43755 +"08/31/2002 09:00:00 AM" 12.04025 +"08/31/2002 12:00:00 PM" 13.78219 +"08/31/2002 03:00:00 PM" 15.36506 +"08/31/2002 06:00:00 PM" 16.90097 +"08/31/2002 09:00:00 PM" 18.36924 +"09/01/2002 12:00:00 AM" 19.49250 diff --git a/tests/compare/cf_timeseries_date_tz.ihg b/tests/compare/cf_timeseries_date_tz.ihg new file mode 100644 index 0000000..c453857 --- /dev/null +++ b/tests/compare/cf_timeseries_date_tz.ihg @@ -0,0 +1,12 @@ +NUMPT 3 +POINT 1 599 0.0 +POINT 1 603 0.0 +POINT 1 605 0.0 +NRPDS 7 +INPUT 2002 08 31 01 00 10.43755 0.31118 0.16547 +INPUT 2002 08 31 04 00 12.04025 0.38636 0.19409 +INPUT 2002 08 31 07 00 13.78219 0.38593 0.16310 +INPUT 2002 08 31 10 00 15.36506 0.31870 0.13426 +INPUT 2002 08 31 13 00 16.90097 0.33592 0.18490 +INPUT 2002 08 31 16 00 18.36924 0.39349 0.17665 +INPUT 2002 08 31 19 00 19.49250 0.33966 0.14055 diff --git a/tests/compare/cf_timeseries_tz.ihg b/tests/compare/cf_timeseries_tz.ihg new file mode 100644 index 0000000..1f024dd --- /dev/null +++ b/tests/compare/cf_timeseries_tz.ihg @@ -0,0 +1,20 @@ +NUMPT 1 +POINT 1 599 0.0 +NRPDS 17 +INPUT 2002 08 29 19 00 0.00000 +INPUT 2002 08 29 22 00 0.10073 +INPUT 2002 08 30 01 00 0.87412 +INPUT 2002 08 30 04 00 1.80970 +INPUT 2002 08 30 07 00 2.72844 +INPUT 2002 08 30 10 00 3.83714 +INPUT 2002 08 30 13 00 5.07205 +INPUT 2002 08 30 16 00 6.37279 +INPUT 2002 08 30 19 00 7.72781 +INPUT 2002 08 30 22 00 9.08265 +INPUT 2002 08 31 01 00 10.43755 +INPUT 2002 08 31 04 00 12.04025 +INPUT 2002 08 31 07 00 13.78219 +INPUT 2002 08 31 10 00 15.36506 +INPUT 2002 08 31 13 00 16.90097 +INPUT 2002 08 31 16 00 18.36924 +INPUT 2002 08 31 19 00 19.49250 diff --git a/tests/compare/gage_rivid.csv b/tests/compare/gage_rivid.csv new file mode 100644 index 0000000..a5815d0 --- /dev/null +++ b/tests/compare/gage_rivid.csv @@ -0,0 +1,2 @@ +16039510 +22105603 diff --git a/tests/compare/gage_streamflow.csv b/tests/compare/gage_streamflow.csv new file mode 100644 index 0000000..5023bad --- /dev/null +++ b/tests/compare/gage_streamflow.csv @@ -0,0 +1,3 @@ +4.8704976167876453,0.31148531270153546 +4.8988144633968753,0.28316846609230495 +4.8421807701784152,0.31148531270153546 diff --git a/tests/compare/gis/ark-ms/k.csv b/tests/compare/gis/ark-ms/k.csv new file mode 100644 index 0000000..6f28edc --- /dev/null +++ b/tests/compare/gis/ark-ms/k.csv @@ -0,0 +1,7 @@ +355.554697 +334.484068 +312.0305712 +343.6241719 +255.3056717 +31.56296131 +336.3321576 \ No newline at end of file diff --git a/tests/compare/gis/ark-ms/rapid_connect.csv b/tests/compare/gis/ark-ms/rapid_connect.csv new file mode 100644 index 0000000..6f9e315 --- /dev/null +++ b/tests/compare/gis/ark-ms/rapid_connect.csv @@ -0,0 +1,7 @@ +22850939,22850949,0,0,0,0,0,0,0,0 +22850941,22850949,0,0,0,0,0,0,0,0 +22850947,22850951,0,0,0,0,0,0,0,0 +22850953,22850951,0,0,0,0,0,0,0,0 +22850949,22850969,2,22850939,22850941,0,0,0,0,0 +22850951,22850969,2,22850947,22850953,0,0,0,0,0 +22850969,22850977,2,22850949,22850951,0,0,0,0,0 diff --git a/tests/compare/gis/ark-ms/riv_bas_id.csv b/tests/compare/gis/ark-ms/riv_bas_id.csv new file mode 100644 index 0000000..4ffe7f4 --- /dev/null +++ b/tests/compare/gis/ark-ms/riv_bas_id.csv @@ -0,0 +1,7 @@ +22850939 +22850941 +22850947 +22850953 +22850949 +22850951 +22850969 diff --git a/tests/compare/gis/ark-ms/weight_cmip5.csv b/tests/compare/gis/ark-ms/weight_cmip5.csv new file mode 100644 index 0000000..4341fbd --- /dev/null +++ b/tests/compare/gis/ark-ms/weight_cmip5.csv @@ -0,0 +1,8 @@ +FEATUREID,area_sqm,lon_index,lat_index,npoints +22850969,409500.0268126891,260,73,1,1.0,-92.187499999999943,34.312500000000057 +22850949,354599.971597633,260,73,1,1.0,-92.187499999999943,34.312500000000057 +22850939,2155499.8197965883,260,73,1,1.0,-92.187499999999943,34.312500000000057 +22850941,1353600.1401073174,260,73,1,1.0,-92.187499999999943,34.312500000000057 +22850951,8099.9989194972195,260,73,1,1.0,-92.187499999999943,34.312500000000057 +22850947,1074599.9314731625,260,73,1,1.0,-92.187499999999943,34.312500000000057 +22850953,1800003.0099754902,260,73,1,1.0,-92.187499999999943,34.312500000000057 diff --git a/tests/compare/gis/ark-ms/x.csv b/tests/compare/gis/ark-ms/x.csv new file mode 100644 index 0000000..10472e7 --- /dev/null +++ b/tests/compare/gis/ark-ms/x.csv @@ -0,0 +1,7 @@ +0.3 +0.3 +0.3 +0.3 +0.3 +0.3 +0.3 \ No newline at end of file diff --git a/tests/compare/gis/m-s/comid_lat_lon_z.csv b/tests/compare/gis/m-s/comid_lat_lon_z.csv new file mode 100644 index 0000000..4b96181 --- /dev/null +++ b/tests/compare/gis/m-s/comid_lat_lon_z.csv @@ -0,0 +1,9 @@ +rivid,lat,lon,z +18445186,38.621052578327394,-86.30411332474645,0.0 +18445184,38.61901807619826,-86.27753353213048,0.0 +18445550,38.62140171663975,-86.24862407496275,0.0 +18445156,38.6314555031341,-86.22298121505749,0.0 +18445168,38.6264846589461,-86.26523046123323,0.0 +18445548,38.631645261648494,-86.23949953381434,0.0 +18445198,38.61599656291627,-86.27111950355311,0.0 +18445554,38.60965413546897,-86.2495465646815,0.0 diff --git a/tests/compare/gis/m-s/k.csv b/tests/compare/gis/m-s/k.csv new file mode 100644 index 0000000..e488dd1 --- /dev/null +++ b/tests/compare/gis/m-s/k.csv @@ -0,0 +1,8 @@ +699.3665 +3191.0024999999996 +861.7175 +7672.209999999999 +1875.7619999999997 +2753.5654999999997 +5732.65 +2987.026 diff --git a/tests/compare/gis/m-s/kfac.csv b/tests/compare/gis/m-s/kfac.csv new file mode 100644 index 0000000..1a2cf8b --- /dev/null +++ b/tests/compare/gis/m-s/kfac.csv @@ -0,0 +1,8 @@ +1998.19 +9117.15 +2462.05 +21920.6 +5359.32 +7867.33 +16379.0 +8534.36 diff --git a/tests/compare/gis/m-s/rapid_connect.csv b/tests/compare/gis/m-s/rapid_connect.csv new file mode 100644 index 0000000..d28177b --- /dev/null +++ b/tests/compare/gis/m-s/rapid_connect.csv @@ -0,0 +1,8 @@ +18445156,18445550,0,0,0 +18445168,18445184,1,18445548,0 +18445184,18445186,2,18445550,18445168 +18445186,18445182,2,18445184,18445198 +18445198,18445186,1,18445554,0 +18445548,18445168,0,0,0 +18445550,18445184,1,18445156,0 +18445554,18445198,0,0,0 diff --git a/tests/compare/gis/m-s/riv_bas_id.csv b/tests/compare/gis/m-s/riv_bas_id.csv new file mode 100644 index 0000000..c20828a --- /dev/null +++ b/tests/compare/gis/m-s/riv_bas_id.csv @@ -0,0 +1,8 @@ +18445156 +18445548 +18445554 +18445168 +18445198 +18445550 +18445184 +18445186 diff --git a/tests/compare/gis/m-s/weight_wrf.csv b/tests/compare/gis/m-s/weight_wrf.csv new file mode 100644 index 0000000..1372ab9 --- /dev/null +++ b/tests/compare/gis/m-s/weight_wrf.csv @@ -0,0 +1,12 @@ +FEATUREID,area_sqm,west_east,south_north,npoints,Lon,Lat,x,y +18445156,769582.8838445453,48,63,1,-86.2484,38.5932,-318002.08659800142,42074.305479621515 +18445168,4380750.241566651,48,63,2,-86.2484,38.5932,-318002.08659800142,42074.305479621515 +18445168,87501.08318384667,48,64,2,-86.2539,38.701,-318002.08659800142,54074.30547962524 +18445184,394681.37655812525,48,63,1,-86.2484,38.5932,-318002.08659800142,42074.305479621515 +18445186,814710.7710376007,47,63,3,-86.3864,38.5888,-330002.08659800142,42074.305479621515 +18445186,11017950.62998205,48,63,3,-86.2484,38.5932,-318002.08659800142,42074.305479621515 +18445186,523821.01315912406,48,64,3,-86.2539,38.701,-318002.08659800142,54074.30547962524 +18445198,1735163.7585762562,48,63,1,-86.2484,38.5932,-318002.08659800142,42074.305479621515 +18445548,4271359.666684006,48,63,1,-86.2484,38.5932,-318002.08659800142,42074.305479621515 +18445550,6553156.134220288,48,63,1,-86.2484,38.5932,-318002.08659800142,42074.305479621515 +18445554,2950679.0401786533,48,63,1,-86.2484,38.5932,-318002.08659800142,42074.305479621515 diff --git a/tests/compare/gis/m-s/x.csv b/tests/compare/gis/m-s/x.csv new file mode 100644 index 0000000..0dc279b --- /dev/null +++ b/tests/compare/gis/m-s/x.csv @@ -0,0 +1,8 @@ +0.3 +0.3 +0.3 +0.3 +0.3 +0.3 +0.3 +0.3 diff --git a/tests/compare/gis/u-k/comid_lat_lon_z.csv b/tests/compare/gis/u-k/comid_lat_lon_z.csv new file mode 100644 index 0000000..30ffefb --- /dev/null +++ b/tests/compare/gis/u-k/comid_lat_lon_z.csv @@ -0,0 +1,26 @@ +rivid,lat,lon,z +43575,52.02538887767525,-1.2866247223516292,0.0 +43462,52.05134769164849,-1.3124986432867014,0.0 +43289,52.10681732839724,-1.3626309727927888,0.0 +43290,52.07922662560284,-1.323555224292924,0.0 +43142,52.10403240964374,-1.3113799535953108,0.0 +42978,52.12308683126911,-1.311611139214227,0.0 +42918,52.13865832045047,-1.3165202308943316,0.0 +42830,52.1573964970162,-1.3276087506604428,0.0 +42831,52.15292122602174,-1.3116595413897194,0.0 +42919,52.16113021338286,-1.290934232232367,0.0 +42979,52.12552287341827,-1.279541513574388,0.0 +42928,52.129084663216304,-1.2403796461683272,0.0 +42911,52.132551628309955,-1.2321016642915124,0.0 +42891,52.14835448082867,-1.2305344560810734,0.0 +42747,52.1658673584567,-1.2279647734336623,0.0 +42748,52.18080780033363,-1.2075177897983205,0.0 +42892,52.141328954153266,-1.1979377130338815,0.0 +42841,52.14533441731961,-1.1560045443530949,0.0 +42846,52.143952203900895,-1.1652941172668776,0.0 +43028,52.12023783561234,-1.2236099540190455,0.0 +42932,52.12729167000005,-1.2456219474999553,0.0 +43145,52.09202930661136,-1.297878999134436,0.0 +43463,52.05118482343523,-1.268361382013925,0.0 +43316,52.06276156164178,-1.236774630094867,0.0 +43317,52.065208336906586,-1.226455281262579,0.0 diff --git a/tests/compare/gis/u-k/k.csv b/tests/compare/gis/u-k/k.csv new file mode 100644 index 0000000..6fe0030 --- /dev/null +++ b/tests/compare/gis/u-k/k.csv @@ -0,0 +1,25 @@ +1232.4969999999998 +7308.525 +3997.4549999999995 +2151.0335 +1935.1779999999999 +243.40575 +3762.6399999999994 +5947.025 +716.6145 +3317.454 +10491.074999999999 +1961.6869999999997 +243.40575 +2443.287 +8165.3949999999995 +2866.458 +5086.829999999999 +2674.5775 +10491.074999999999 +6727.0 +333.2308 +1624.7350000000001 +7775.879999999999 +8259.02 +4945.045 diff --git a/tests/compare/gis/u-k/kfac.csv b/tests/compare/gis/u-k/kfac.csv new file mode 100644 index 0000000..7506e3f --- /dev/null +++ b/tests/compare/gis/u-k/kfac.csv @@ -0,0 +1,25 @@ +3521.42 +20881.5 +11421.3 +6145.81 +5529.08 +695.445 +10750.4 +16991.5 +2047.47 +9478.44 +29974.5 +5604.82 +695.445 +6980.82 +23329.7 +8189.88 +14533.8 +7641.65 +29974.5 +19220.0 +952.088 +4642.1 +22216.8 +23597.2 +14128.7 diff --git a/tests/compare/gis/u-k/rapid_connect.csv b/tests/compare/gis/u-k/rapid_connect.csv new file mode 100644 index 0000000..13173bb --- /dev/null +++ b/tests/compare/gis/u-k/rapid_connect.csv @@ -0,0 +1,25 @@ +42747,42891,0,0,0 +42748,42891,0,0,0 +42830,42918,0,0,0 +42831,42918,0,0,0 +42841,42892,0,0,0 +42846,42892,0,0,0 +42891,42911,2,42747,42748 +42892,42911,2,42841,42846 +42911,42928,2,42891,42892 +42918,42978,2,42830,42831 +42919,42978,0,0,0 +42928,42979,2,42911,43028 +42932,42979,0,0,0 +42978,43142,2,42918,42919 +42979,43142,2,42928,42932 +43028,42928,0,0,0 +43142,43290,2,42978,42979 +43145,43290,0,0,0 +43289,43462,0,0,0 +43290,43462,2,43142,43145 +43316,43463,0,0,0 +43317,43463,0,0,0 +43462,43575,2,43289,43290 +43463,43575,2,43316,43317 +43575,43612,2,43462,43463 diff --git a/tests/compare/gis/u-k/riv_bas_id.csv b/tests/compare/gis/u-k/riv_bas_id.csv new file mode 100644 index 0000000..4b7327b --- /dev/null +++ b/tests/compare/gis/u-k/riv_bas_id.csv @@ -0,0 +1,25 @@ +42747 +42748 +42830 +42831 +42841 +42846 +42891 +42892 +42911 +42918 +42919 +42928 +42932 +42978 +42979 +43028 +43142 +43145 +43289 +43290 +43316 +43317 +43462 +43463 +43575 diff --git a/tests/compare/gis/u-k/weight_joules.csv b/tests/compare/gis/u-k/weight_joules.csv new file mode 100644 index 0000000..6058d4a --- /dev/null +++ b/tests/compare/gis/u-k/weight_joules.csv @@ -0,0 +1,627 @@ +rivid,area_sqm,lon_index,lat_index,npoints,lsm_grid_lon,lsm_grid_lat +42747,12.519273460734631,97,121,21,-1.255,52.165 +42747,264179.34809493046,97,122,21,-1.255,52.175 +42747,570555.3992738279,97,123,21,-1.255,52.185 +42747,412972.67234692554,98,121,21,-1.245,52.165 +42747,761962.2316247917,98,122,21,-1.245,52.175 +42747,761792.6558052772,98,123,21,-1.245,52.185 +42747,15942.688997493457,99,120,21,-1.23499,52.155 +42747,725261.7971284277,99,121,21,-1.23499,52.165 +42747,761962.2316247917,99,122,21,-1.23499,52.175 +42747,761792.655805277,99,123,21,-1.23499,52.185 +42747,10.895912481867278,100,120,21,-1.22498,52.155 +42747,379501.49819431046,100,121,21,-1.22498,52.165 +42747,474905.0912831301,100,122,21,-1.22498,52.175 +42747,670057.5167806229,100,123,21,-1.22498,52.185 +42747,10238.520298505944,101,122,21,-1.21497,52.175 +42747,5118.544964768609,101,123,21,-1.21497,52.185 +42747,157981.67535848916,100,124,21,-1.22498,52.195 +42747,332576.10329044267,97,124,21,-1.255,52.195 +42747,761522.2302120999,98,124,21,-1.245,52.195 +42747,116022.87675739192,98,125,21,-1.245,52.205 +42747,306232.78273024264,99,124,21,-1.23499,52.195 +42748,223623.61361777227,100,121,43,-1.22498,52.165 +42748,287060.84758033784,100,122,43,-1.22498,52.175 +42748,91731.74918324995,100,123,43,-1.22498,52.185 +42748,33.40051402739811,101,120,43,-1.21497,52.155 +42748,670485.2629870803,101,121,43,-1.21497,52.165 +42748,749400.6557550323,101,122,43,-1.21497,52.175 +42748,754351.5722692463,101,123,43,-1.21497,52.185 +42748,506753.7406617115,102,121,43,-1.20502,52.165 +42748,759639.1760535637,102,122,43,-1.20502,52.175 +42748,759470.1172339796,102,123,43,-1.20502,52.185 +42748,243829.45256944353,103,121,43,-1.19501,52.165 +42748,761962.2316247917,103,122,43,-1.19501,52.175 +42748,761792.6558052769,103,123,43,-1.19501,52.185 +42748,348368.2983851474,104,121,43,-1.185,52.165 +42748,759639.1760535486,104,122,43,-1.185,52.175 +42748,733498.1850416134,104,123,43,-1.185,52.185 +42748,170102.26731385905,105,121,43,-1.17505,52.165 +42748,414326.61423449113,105,122,43,-1.17505,52.175 +42748,344931.24411540746,105,123,43,-1.17505,52.185 +42748,603644.8107581999,100,124,43,-1.22498,52.195 +42748,761308.2155728173,100,125,43,-1.22498,52.205 +42748,756081.4594093226,100,126,43,-1.22498,52.215 +42748,450759.49020925706,100,127,43,-1.22498,52.225 +42748,10882.192655842797,100,128,43,-1.22498,52.235 +42748,759301.0343636076,101,124,43,-1.21497,52.195 +42748,706011.4876106505,101,125,43,-1.21497,52.205 +42748,568390.7051085007,101,126,43,-1.21497,52.215 +42748,341182.939645247,101,127,43,-1.21497,52.225 +42748,10217.676553981219,101,128,43,-1.21497,52.235 +42748,759301.0343636076,102,124,43,-1.20502,52.195 +42748,242430.92652851844,102,125,43,-1.20502,52.205 +42748,740350.1978927766,103,124,43,-1.19501,52.195 +42748,21126.611737032836,103,125,43,-1.19501,52.205 +42748,216955.94188001665,104,124,43,-1.185,52.195 +42748,10567.167660231053,104,125,43,-1.185,52.205 +42748,94970.65786533763,97,125,43,-1.255,52.205 +42748,216386.6734534044,97,126,43,-1.255,52.215 +42748,42.69975850752922,98,124,43,-1.245,52.195 +42748,645188.6746223527,98,125,43,-1.245,52.205 +42748,428168.4598455417,98,126,43,-1.245,52.215 +42748,455390.2731736781,99,124,43,-1.23499,52.195 +42748,761308.2155728325,99,125,43,-1.23499,52.205 +42748,534208.8555435215,99,126,43,-1.23499,52.215 +42830,5322.033432278323,85,119,30,-1.375,52.145 +42830,196240.46777083277,86,119,30,-1.36499,52.145 +42830,429069.30737294664,87,119,30,-1.35498,52.145 +42830,110204.865068665,88,119,30,-1.34497,52.145 +42830,63594.75466136331,89,119,30,-1.33496,52.145 +42830,15840.119026032133,90,119,30,-1.32501,52.145 +42830,15877.284940629123,91,119,30,-1.315,52.145 +42830,762301.3108111348,86,120,30,-1.36499,52.155 +42830,545306.0262511729,86,121,30,-1.36499,52.165 +42830,132551.59581517824,86,122,30,-1.36499,52.175 +42830,762301.3108111348,87,120,30,-1.35498,52.155 +42830,762131.7832929605,87,121,30,-1.35498,52.165 +42830,513529.9025313805,87,122,30,-1.35498,52.175 +42830,730214.9059487067,88,120,30,-1.34497,52.155 +42830,762131.7832929606,88,121,30,-1.34497,52.165 +42830,709232.3860327782,88,122,30,-1.34497,52.175 +42830,10739.85692914268,88,123,30,-1.34497,52.185 +42830,702255.3872527827,89,120,30,-1.33496,52.155 +42830,759808.2107959021,89,121,30,-1.33496,52.165 +42830,759353.666150304,89,122,30,-1.33496,52.175 +42830,31431.938205893308,89,123,30,-1.33496,52.185 +42830,670410.7466830587,90,120,30,-1.32501,52.155 +42830,743934.2440694508,90,121,30,-1.32501,52.165 +42830,126206.14625387437,90,122,30,-1.32501,52.175 +42830,249093.17363938992,91,120,30,-1.315,52.155 +42830,58865.56220948662,91,121,30,-1.315,52.165 +42830,354011.7447813397,84,120,30,-1.38501,52.155 +42830,216337.85353914596,84,121,30,-1.38501,52.165 +42830,561233.2522173974,85,120,30,-1.375,52.155 +42830,439174.28736420535,85,121,30,-1.375,52.165 +42831,31775.750437047114,92,119,19,-1.30499,52.145 +42831,42192.726836856054,91,124,19,-1.315,52.195 +42831,3.86055220291656,92,124,19,-1.30499,52.195 +42831,121699.83089577383,91,119,19,-1.315,52.145 +42831,197.4341284409783,89,122,19,-1.33496,52.175 +42831,15870.153250223624,90,121,19,-1.32501,52.165 +42831,633308.0349441373,90,122,19,-1.32501,52.175 +42831,26253.691395186215,90,123,19,-1.32501,52.185 +42831,412495.16127723164,91,120,19,-1.315,52.155 +42831,697996.3115285805,91,121,19,-1.315,52.165 +42831,761962.2316247916,91,122,19,-1.315,52.175 +42831,549632.479744256,91,123,19,-1.315,52.185 +42831,126943.46146020868,92,120,19,-1.30499,52.155 +42831,438755.6855786624,92,121,19,-1.30499,52.165 +42831,759639.1760535638,92,122,19,-1.30499,52.175 +42831,585433.0502661973,92,123,19,-1.30499,52.185 +42831,5608.502908128281,93,121,19,-1.29504,52.165 +42831,440420.6622772274,93,122,19,-1.29504,52.175 +42831,212393.97494854324,93,123,19,-1.29504,52.185 +42841,168298.9713726147,104,120,21,-1.185,52.155 +42841,252558.8506136799,104,121,21,-1.185,52.165 +42841,648012.2060768765,105,120,21,-1.17505,52.155 +42841,490679.12382551684,105,121,21,-1.17505,52.165 +42841,762301.3108111348,106,120,21,-1.16504,52.155 +42841,512709.4579833108,106,121,21,-1.16504,52.165 +42841,762301.3108111349,107,120,21,-1.15503,52.155 +42841,555776.7127590285,107,121,21,-1.15503,52.165 +42841,762301.3108111348,108,120,21,-1.14502,52.155 +42841,434275.0537802454,108,121,21,-1.14502,52.165 +42841,640953.764262802,109,120,21,-1.13501,52.155 +42841,79821.3240254559,109,121,21,-1.13501,52.165 +42841,42560.75454910433,110,120,21,-1.125,52.155 +42841,18.78593950793048,105,119,21,-1.17505,52.145 +42841,268223.8519442093,106,119,21,-1.16504,52.145 +42841,321237.65720182227,107,118,21,-1.15503,52.135 +42841,713706.6553049278,107,119,21,-1.15503,52.145 +42841,577570.9453851564,108,118,21,-1.14502,52.135 +42841,762470.8141974149,108,119,21,-1.14502,52.145 +42841,207199.3905582682,109,118,21,-1.13501,52.135 +42841,667867.9071269515,109,119,21,-1.13501,52.145 +42846,5.275994231999901,103,116,15,-1.19501,52.115 +42846,31539.155920861744,103,117,15,-1.19501,52.125 +42846,5319.54498130132,104,116,15,-1.185,52.115 +42846,665210.1620656817,104,117,15,-1.185,52.125 +42846,194872.87833268108,104,118,15,-1.185,52.135 +42846,655430.666629942,105,117,15,-1.17505,52.125 +42846,537444.1830511518,105,118,15,-1.17505,52.135 +42846,556051.0504078016,106,117,15,-1.16504,52.125 +42846,751417.4345294643,106,118,15,-1.16504,52.135 +42846,178620.8846428338,106,119,15,-1.16504,52.145 +42846,583335.3840224064,107,117,15,-1.15503,52.125 +42846,441399.7199276445,107,118,15,-1.15503,52.135 +42846,48767.07534241197,107,119,15,-1.15503,52.145 +42846,160013.0970254466,108,117,15,-1.14502,52.125 +42846,95725.02296616141,108,118,15,-1.14502,52.135 +42891,126482.94581818105,96,120,20,-1.26501,52.155 +42891,121072.22275140573,96,121,20,-1.26501,52.165 +42891,714255.5865304788,97,120,20,-1.255,52.155 +42891,428487.37907009403,97,121,20,-1.255,52.165 +42891,762301.3108111349,98,120,20,-1.245,52.155 +42891,333220.8028012988,98,121,20,-1.245,52.165 +42891,746354.8815378526,99,120,20,-1.23499,52.155 +42891,36873.72666455701,99,121,20,-1.23499,52.165 +42891,762289.260714416,100,120,20,-1.22498,52.155 +42891,159004.07843006632,100,121,20,-1.22498,52.165 +42891,431710.0301377497,101,120,20,-1.21497,52.155 +42891,89291.03626437408,101,121,20,-1.21497,52.165 +42891,339110.6508494664,99,118,20,-1.23499,52.135 +42891,762470.8141974149,99,119,20,-1.23499,52.145 +42891,99948.75987447711,100,118,20,-1.22498,52.135 +42891,639514.7940168536,100,119,20,-1.22498,52.145 +42891,78710.85021396031,101,119,20,-1.21497,52.145 +42891,74050.31366434642,97,119,20,-1.255,52.145 +42891,196053.34325274988,98,118,20,-1.245,52.135 +42891,709426.597845586,98,119,20,-1.245,52.145 +42892,328234.3035217343,101,120,28,-1.21497,52.155 +42892,34.781566349310495,101,121,28,-1.21497,52.165 +42892,759977.221462388,102,120,28,-1.20502,52.155 +42892,253054.4701534737,102,121,28,-1.20502,52.165 +42892,762301.3108111348,103,120,28,-1.19501,52.155 +42892,518302.3308311749,103,121,28,-1.19501,52.165 +42892,591674.5375736358,104,120,28,-1.185,52.155 +42892,158884.77461779522,104,121,28,-1.185,52.165 +42892,111967.09100512204,105,120,28,-1.17505,52.155 +42892,451587.13420486083,100,118,28,-1.22498,52.135 +42892,122959.77190042836,100,119,28,-1.22498,52.145 +42892,68937.3453091219,101,117,28,-1.21497,52.125 +42892,755198.135770582,101,118,28,-1.21497,52.135 +42892,681431.9754393627,101,119,28,-1.21497,52.145 +42892,300770.7321053969,102,117,28,-1.20502,52.125 +42892,760315.170584804,102,118,28,-1.20502,52.135 +42892,760146.2080693282,102,119,28,-1.20502,52.145 +42892,21.244032165731607,103,116,28,-1.19501,52.115 +42892,672804.5890818848,103,117,28,-1.19501,52.125 +42892,762640.2934175859,103,118,28,-1.19501,52.135 +42892,762470.8141974148,103,119,28,-1.19501,52.145 +42892,58431.425175177836,104,117,28,-1.185,52.125 +42892,565444.4232877577,104,118,28,-1.185,52.135 +42892,760146.208069313,104,119,28,-1.185,52.145 +42892,222870.98763332475,105,118,28,-1.17505,52.135 +42892,760125.346613911,105,119,28,-1.17505,52.145 +42892,11219.102249029595,106,118,28,-1.16504,52.135 +42892,315629.83453189814,106,119,28,-1.16504,52.145 +42911,5416.57498333164,99,117,4,-1.23499,52.125 +42911,212247.9325866588,99,118,4,-1.23499,52.135 +42911,5200.228521284634,100,117,4,-1.22498,52.125 +42911,121054.13843402507,100,118,4,-1.22498,52.135 +42918,21701.999966825722,87,119,15,-1.35498,52.145 +42918,149799.5904384809,88,118,15,-1.34497,52.135 +42918,641836.070987962,88,119,15,-1.34497,52.145 +42918,544117.7314144695,89,118,15,-1.33496,52.135 +42918,696547.6371224422,89,119,15,-1.33496,52.145 +42918,42241.227031182476,90,117,15,-1.32501,52.125 +42918,702286.9814040591,90,118,15,-1.32501,52.135 +42918,744302.6984817004,90,119,15,-1.32501,52.145 +42918,111309.40060658444,91,117,15,-1.315,52.125 +42918,487534.3163312004,91,118,15,-1.315,52.135 +42918,344622.45025064703,91,119,15,-1.315,52.145 +42918,32089.84276316338,88,120,15,-1.34497,52.155 +42918,57725.6507072804,89,120,15,-1.33496,52.155 +42918,89569.86551502235,90,120,15,-1.32501,52.155 +42918,100703.04093093723,91,120,15,-1.315,52.155 +42919,207321.15577313563,96,120,58,-1.26501,52.155 +42919,641063.2994502002,96,121,58,-1.26501,52.165 +42919,761962.2316247917,96,122,58,-1.26501,52.175 +42919,761792.6558052772,96,123,58,-1.26501,52.185 +42919,333630.71401589457,97,121,58,-1.255,52.165 +42919,497781.1612744529,97,122,58,-1.255,52.175 +42919,191237.2577664634,97,123,58,-1.255,52.185 +42919,15938.308185502252,98,121,58,-1.245,52.165 +42919,759301.0343635925,93,124,58,-1.29504,52.195 +42919,758987.1539529597,93,125,58,-1.29504,52.205 +42919,758691.8449129824,93,126,58,-1.29504,52.215 +42919,504421.59619752143,93,127,58,-1.29504,52.225 +42919,761623.0558619093,94,124,58,-1.28503,52.195 +42919,761308.2155728325,94,125,58,-1.28503,52.205 +42919,761275.2677806083,94,126,58,-1.28503,52.215 +42919,398345.6419365973,94,127,58,-1.28503,52.225 +42919,761623.0558619094,95,124,58,-1.27502,52.195 +42919,761308.2155728325,95,125,58,-1.27502,52.205 +42919,555800.36976694,95,126,58,-1.27502,52.215 +42919,761623.0558619094,96,124,58,-1.26501,52.195 +42919,761308.2155728325,96,125,58,-1.26501,52.205 +42919,412548.29511034157,96,126,58,-1.26501,52.215 +42919,429049.84493746725,97,124,58,-1.255,52.195 +42919,666334.1451365228,97,125,58,-1.255,52.205 +42919,190578.89311238402,97,126,58,-1.255,52.215 +42919,58.11090418378856,98,124,58,-1.245,52.195 +42919,96.67918087679483,98,125,58,-1.245,52.205 +42919,90050.4332158404,92,118,58,-1.30499,52.135 +42919,728367.5909249922,92,119,58,-1.30499,52.145 +42919,8.425241581553797,93,118,58,-1.29504,52.135 +42919,697292.1899088629,93,119,58,-1.29504,52.145 +42919,409257.65098497167,94,119,58,-1.28503,52.145 +42919,59061.202271684546,95,119,58,-1.27502,52.145 +42919,95088.11119846192,91,124,58,-1.315,52.195 +42919,10556.453501879045,91,125,58,-1.315,52.205 +42919,722258.360053817,92,124,58,-1.30499,52.195 +42919,711437.79008461,92,125,58,-1.30499,52.205 +42919,484473.3922523962,92,126,58,-1.30499,52.215 +42919,6.763154525913717,91,117,58,-1.315,52.125 +42919,158758.0485109592,91,118,58,-1.315,52.135 +42919,280270.8764542686,91,119,58,-1.315,52.145 +42919,11.107582509056657,91,120,58,-1.315,52.155 +42919,5272.856677495661,91,121,58,-1.315,52.165 +42919,633036.6268552216,92,120,58,-1.30499,52.155 +42919,321052.5252365329,92,121,58,-1.30499,52.165 +42919,174037.06618789356,92,123,58,-1.30499,52.185 +42919,759977.2214623729,93,120,58,-1.29504,52.155 +42919,754196.3038296711,93,121,58,-1.29504,52.165 +42919,319218.22053268517,93,122,58,-1.29504,52.175 +42919,547079.8399432373,93,123,58,-1.29504,52.185 +42919,762301.3108111349,94,120,58,-1.28503,52.155 +42919,762131.7832929604,94,121,58,-1.28503,52.165 +42919,761962.2316247916,94,122,58,-1.28503,52.175 +42919,761792.6558052772,94,123,58,-1.28503,52.185 +42919,620281.4139635654,95,120,58,-1.27502,52.155 +42919,762131.7832929604,95,121,58,-1.27502,52.165 +42919,761962.2316247916,95,122,58,-1.27502,52.175 +42919,761792.655805277,95,123,58,-1.27502,52.185 +42928,301479.89922747505,99,117,4,-1.23499,52.125 +42928,211284.6118052163,99,118,4,-1.23499,52.135 +42928,148419.5956435323,98,117,4,-1.245,52.125 +42928,190736.1662758745,98,118,4,-1.245,52.135 +42932,148253.37508882643,99,114,15,-1.23499,52.095 +42932,650766.8994171098,99,115,15,-1.23499,52.105 +42932,757423.4414017396,99,116,15,-1.23499,52.115 +42932,190171.31873062815,99,117,15,-1.23499,52.125 +42932,15.658766846560429,100,115,15,-1.22498,52.105 +42932,258196.8905189534,100,116,15,-1.22498,52.115 +42932,15.728958762997395,96,115,15,-1.26501,52.105 +42932,57805.606169820436,96,116,15,-1.26501,52.115 +42932,233015.99591310363,97,115,15,-1.255,52.105 +42932,592855.5103816033,97,116,15,-1.255,52.115 +42932,153308.6812793428,97,117,15,-1.255,52.125 +42932,42561.16568474794,98,114,15,-1.245,52.095 +42932,561941.0755347182,98,115,15,-1.245,52.105 +42932,762833.6398317235,98,116,15,-1.245,52.115 +42932,487248.7655092081,98,117,15,-1.245,52.125 +42978,10609.019362609826,92,116,21,-1.30499,52.115 +42978,418166.9189866125,92,117,21,-1.30499,52.125 +42978,659961.1275284266,92,118,21,-1.30499,52.135 +42978,38405.617011915565,93,118,21,-1.29504,52.135 +42978,10563.958124043893,93,119,21,-1.29504,52.145 +42978,0.0941142357177346,86,117,21,-1.36499,52.125 +42978,175336.16282678847,86,118,21,-1.36499,52.135 +42978,138344.74239989146,87,117,21,-1.35498,52.125 +42978,720394.7484104942,87,118,21,-1.35498,52.135 +42978,68872.96214337272,87,119,21,-1.35498,52.145 +42978,440204.8821000284,88,117,21,-1.34497,52.125 +42978,612838.5861800415,88,118,21,-1.34497,52.135 +42978,10428.557391121154,88,119,21,-1.34497,52.145 +42978,496391.9343185298,89,117,21,-1.33496,52.125 +42978,216197.43920151365,89,118,21,-1.33496,52.135 +42978,5.2448750504475505,90,116,21,-1.32501,52.115 +42978,517520.9933185104,90,117,21,-1.32501,52.125 +42978,58032.00862003008,90,118,21,-1.32501,52.135 +42978,111207.7649089774,91,116,21,-1.315,52.115 +42978,651490.0539039067,91,117,21,-1.315,52.125 +42978,116347.71206999471,91,118,21,-1.315,52.135 +42979,428493.47052416153,96,120,35,-1.26501,52.155 +42979,48049.15289233814,97,120,35,-1.255,52.155 +42979,26293.695338286198,92,115,35,-1.30499,52.105 +42979,538229.9276188291,92,116,35,-1.30499,52.115 +42979,342318.91823716805,92,117,35,-1.30499,52.125 +42979,10304.75195303494,92,118,35,-1.30499,52.135 +42979,126980.27168023693,93,115,35,-1.29504,52.105 +42979,760507.92752864,93,116,35,-1.29504,52.115 +42979,760484.1090179777,93,117,35,-1.29504,52.125 +42979,721898.1895737933,93,118,35,-1.29504,52.135 +42979,52292.99894061633,93,119,35,-1.29504,52.145 +42979,274786.7377961502,94,115,35,-1.28503,52.105 +42979,762833.6398317234,94,116,35,-1.28503,52.115 +42979,762809.7484820664,94,117,35,-1.28503,52.125 +42979,762640.293417586,94,118,35,-1.28503,52.135 +42979,353213.1632525356,94,119,35,-1.28503,52.145 +42979,250104.1829037072,95,115,35,-1.27502,52.105 +42979,762833.6398317235,95,116,35,-1.27502,52.115 +42979,762809.7484820663,95,117,35,-1.27502,52.125 +42979,762640.2934175859,95,118,35,-1.27502,52.135 +42979,703405.7605628768,95,119,35,-1.27502,52.145 +42979,10779.496888015303,96,115,35,-1.26501,52.105 +42979,583408.4174691567,96,116,35,-1.26501,52.115 +42979,762809.7484820663,96,117,35,-1.26501,52.125 +42979,762640.293417586,96,118,35,-1.26501,52.135 +42979,762470.8141974148,96,119,35,-1.26501,52.145 +42979,169974.27362695825,97,116,35,-1.255,52.115 +42979,609504.9232306959,97,117,35,-1.255,52.125 +42979,762640.293417586,97,118,35,-1.255,52.135 +42979,688417.0721378238,97,119,35,-1.255,52.145 +42979,127137.53296225658,98,117,35,-1.245,52.125 +42979,375853.4584229488,98,118,35,-1.245,52.135 +42979,53045.39656974576,98,119,35,-1.245,52.145 +42979,10582.178269636643,91,116,35,-1.315,52.115 +42979,142023.7484165171,95,120,35,-1.27502,52.155 +43028,52.676190213236104,100,113,24,-1.22498,52.085 +43028,51.85316660550099,101,113,24,-1.21497,52.085 +43028,324126.29300796986,99,114,24,-1.23499,52.095 +43028,112385.14861007631,99,115,24,-1.23499,52.105 +43028,5408.041071640592,99,116,24,-1.23499,52.115 +43028,265741.2241634687,99,117,24,-1.23499,52.125 +43028,715971.1346335092,100,114,24,-1.22498,52.095 +43028,763131.7449033366,100,115,24,-1.22498,52.105 +43028,504637.9374878538,100,116,24,-1.22498,52.115 +43028,757607.4036326954,100,117,24,-1.22498,52.125 +43028,90048.63852995561,100,118,24,-1.22498,52.135 +43028,649745.4590541938,101,114,24,-1.21497,52.095 +43028,760821.8813951913,101,115,24,-1.21497,52.105 +43028,760507.9275286552,101,116,24,-1.21497,52.115 +43028,691545.6345904187,101,117,24,-1.21497,52.125 +43028,5118.170495546501,101,118,24,-1.21497,52.135 +43028,491880.13220622437,102,114,24,-1.20502,52.095 +43028,760821.8813951915,102,115,24,-1.20502,52.105 +43028,760507.9275286552,102,116,24,-1.20502,52.115 +43028,459713.38320826157,102,117,24,-1.20502,52.125 +43028,11089.84112516724,103,114,24,-1.19501,52.095 +43028,59417.314959302304,103,115,24,-1.19501,52.105 +43028,223467.95996029524,103,116,24,-1.19501,52.115 +43028,47896.085808451666,103,117,24,-1.19501,52.125 +43142,349277.12053377595,92,114,20,-1.30499,52.095 +43142,734524.3639742916,92,115,20,-1.30499,52.105 +43142,211669.9455975424,92,116,20,-1.30499,52.115 +43142,16336.279562620202,93,114,20,-1.29504,52.095 +43142,498186.73647775676,93,115,20,-1.29504,52.105 +43142,27273.188645292983,94,115,20,-1.28503,52.105 +43142,0.13598205862337287,87,116,20,-1.35498,52.115 +43142,271.20434542452864,87,117,20,-1.35498,52.125 +43142,37897.147556767115,88,115,20,-1.34497,52.105 +43142,489353.8726733322,88,116,20,-1.34497,52.115 +43142,296822.4369025752,88,117,20,-1.34497,52.125 +43142,338552.1722023028,89,115,20,-1.33496,52.105 +43142,760507.9275286401,89,116,20,-1.33496,52.115 +43142,264092.1747356638,89,117,20,-1.33496,52.125 +43142,248617.09454378192,90,115,20,-1.32501,52.105 +43142,760501.5325334605,90,116,20,-1.32501,52.115 +43142,200719.21953957266,90,117,20,-1.32501,52.125 +43142,291354.33067024563,91,114,20,-1.315,52.095 +43142,566578.9189853063,91,115,20,-1.315,52.105 +43142,641043.7096009547,91,116,20,-1.315,52.115 +43145,89768.9401470169,99,114,26,-1.23499,52.095 +43145,57514.528576930046,93,112,26,-1.29504,52.075 +43145,532267.1577683656,93,113,26,-1.29504,52.085 +43145,138680.2113293679,94,112,26,-1.28503,52.075 +43145,763487.2947485155,94,113,26,-1.28503,52.085 +43145,35.31253019281789,95,112,26,-1.27502,52.075 +43145,510635.31110502605,95,113,26,-1.27502,52.085 +43145,127533.7539855453,96,113,26,-1.26501,52.085 +43145,10807.883332657326,97,113,26,-1.255,52.085 +43145,411713.55734612455,92,114,26,-1.30499,52.095 +43145,744651.5672077542,93,114,26,-1.29504,52.095 +43145,135657.73587727154,93,115,26,-1.29504,52.105 +43145,763317.9363630149,94,114,26,-1.28503,52.095 +43145,461088.6401877261,94,115,26,-1.28503,52.105 +43145,763317.9363630149,95,114,26,-1.27502,52.095 +43145,513044.3710155703,95,115,26,-1.27502,52.105 +43145,763317.9363630149,96,114,26,-1.26501,52.095 +43145,752349.7894594746,96,115,26,-1.26501,52.105 +43145,121623.15486682803,96,116,26,-1.26501,52.115 +43145,721076.7449270195,97,114,26,-1.255,52.095 +43145,530132.5580119358,97,115,26,-1.255,52.105 +43145,588367.3115725693,98,114,26,-1.245,52.095 +43145,201211.23069220313,98,115,26,-1.245,52.105 +43145,31834.832887133976,91,113,26,-1.315,52.085 +43145,100389.82416117829,92,113,26,-1.30499,52.085 +43145,100533.12681291779,91,114,26,-1.315,52.095 +43289,121985.21436542548,86,110,69,-1.36499,52.055 +43289,710669.6475380762,86,111,69,-1.36499,52.065 +43289,631303.0745322008,86,112,69,-1.36499,52.075 +43289,509433.0614378833,86,113,69,-1.36499,52.085 +43289,402580.3014850925,87,111,69,-1.35498,52.065 +43289,763656.6289446421,87,112,69,-1.35498,52.075 +43289,763487.2947485156,87,113,69,-1.35498,52.085 +43289,207356.04340515012,88,111,69,-1.34497,52.065 +43289,763656.628944642,88,112,69,-1.34497,52.075 +43289,763487.2947485155,88,113,69,-1.34497,52.085 +43289,205741.2351711953,89,111,69,-1.33496,52.065 +43289,506232.9909230169,89,112,69,-1.33496,52.075 +43289,389557.53536982817,89,113,69,-1.33496,52.085 +43289,376284.9837592672,85,114,69,-1.375,52.095 +43289,763148.5538018241,85,115,69,-1.375,52.105 +43289,762833.6398317235,85,116,69,-1.375,52.115 +43289,762809.7484820663,85,117,69,-1.375,52.125 +43289,762640.293417586,85,118,69,-1.375,52.135 +43289,757147.6026159881,85,119,69,-1.375,52.145 +43289,763317.9363630146,86,114,69,-1.36499,52.095 +43289,763148.5538018239,86,115,69,-1.36499,52.105 +43289,762833.6398317234,86,116,69,-1.36499,52.115 +43289,762809.636527135,86,117,69,-1.36499,52.125 +43289,587304.1484323597,86,118,69,-1.36499,52.135 +43289,566230.3464882296,86,119,69,-1.36499,52.145 +43289,763317.9363630147,87,114,69,-1.35498,52.095 +43289,763148.553801824,87,115,69,-1.35498,52.105 +43289,762833.470841757,87,116,69,-1.35498,52.115 +43289,624193.83472419,87,117,69,-1.35498,52.125 +43289,42242.110977978584,87,118,69,-1.35498,52.135 +43289,242829.97904467362,87,119,69,-1.35498,52.145 +43289,763317.9363630146,88,114,69,-1.34497,52.095 +43289,724655.196148976,88,115,69,-1.34497,52.105 +43289,273482.73323469923,88,116,69,-1.34497,52.115 +43289,25782.42320537449,88,117,69,-1.34497,52.125 +43289,405372.58620650694,89,114,69,-1.33496,52.095 +43289,57195.54531181437,89,115,69,-1.33496,52.105 +43289,614968.665418138,82,120,69,-1.40503,52.155 +43289,449743.10344886687,83,120,69,-1.39502,52.155 +43289,344346.8239041815,84,120,69,-1.38501,52.155 +43289,201069.23680180783,85,120,69,-1.375,52.155 +43289,0.019145439161464946,85,110,69,-1.375,52.055 +43289,63683.89284217385,85,111,69,-1.375,52.065 +43289,11.640264171832513,85,112,69,-1.375,52.075 +43289,0.028720007244656762,85,113,69,-1.375,52.085 +43289,25810.198303623576,80,120,69,-1.42505,52.155 +43289,568859.7342431326,81,120,69,-1.41504,52.155 +43289,26383.627652960633,81,121,69,-1.41504,52.165 +43289,25622.140060796693,79,118,69,-1.435,52.135 +43289,126178.98207164464,80,117,69,-1.42505,52.125 +43289,600364.8344050964,80,118,69,-1.42505,52.135 +43289,165703.39674402997,80,119,69,-1.42505,52.145 +43289,290132.15511377365,81,117,69,-1.41504,52.125 +43289,762640.2934175859,81,118,69,-1.41504,52.135 +43289,762470.8141974149,81,119,69,-1.41504,52.145 +43289,15360.001893925064,82,116,69,-1.40503,52.115 +43289,576692.562705609,82,117,69,-1.40503,52.125 +43289,762640.2934175706,82,118,69,-1.40503,52.135 +43289,762470.8141973997,82,119,69,-1.40503,52.145 +43289,502303.2573466741,83,116,69,-1.39502,52.115 +43289,762809.7484820663,83,117,69,-1.39502,52.125 +43289,762640.293417586,83,118,69,-1.39502,52.135 +43289,762470.8141974149,83,119,69,-1.39502,52.145 +43289,14.385622446523405,84,114,69,-1.38501,52.095 +43289,327781.64234620833,84,115,69,-1.38501,52.105 +43289,746762.1727138164,84,116,69,-1.38501,52.115 +43289,762809.7484820662,84,117,69,-1.38501,52.125 +43289,762640.2934175859,84,118,69,-1.38501,52.135 +43289,762470.8141974148,84,119,69,-1.38501,52.145 +43290,181161.21016664867,93,112,19,-1.29504,52.075 +43290,228895.8150848985,93,113,19,-1.29504,52.085 +43290,58391.623200195514,89,111,19,-1.33496,52.065 +43290,255095.4180560093,89,112,19,-1.33496,52.075 +43290,371601.7515404752,89,113,19,-1.33496,52.085 +43290,5242.578243374274,90,111,19,-1.32501,52.065 +43290,518121.6158595305,90,112,19,-1.32501,52.075 +43290,761159.5895950992,90,113,19,-1.32501,52.085 +43290,456102.38385514653,91,112,19,-1.315,52.075 +43290,731648.7101063863,91,113,19,-1.315,52.085 +43290,528997.417864512,92,112,19,-1.30499,52.075 +43290,660769.765617372,92,113,19,-1.30499,52.085 +43290,593.2887921357806,88,115,19,-1.34497,52.105 +43290,355618.48818859254,89,114,19,-1.33496,52.095 +43290,365077.52500943345,89,115,19,-1.33496,52.105 +43290,760990.7475461373,90,114,19,-1.32501,52.095 +43290,512204.7615674439,90,115,19,-1.32501,52.105 +43290,371431.3179734935,91,114,19,-1.315,52.095 +43290,196572.55419012552,91,115,19,-1.315,52.105 +43316,73981.93385012516,95,112,14,-1.27502,52.075 +43316,252854.9029621112,95,113,14,-1.27502,52.085 +43316,290984.62019046606,96,112,14,-1.26501,52.075 +43316,635953.5407642601,96,113,14,-1.26501,52.085 +43316,206655.06063879613,97,111,14,-1.255,52.065 +43316,752919.4496308649,97,112,14,-1.255,52.075 +43316,752675.9752335971,97,113,14,-1.255,52.085 +43316,572933.3866403099,98,111,14,-1.245,52.065 +43316,763656.524972735,98,112,14,-1.245,52.075 +43316,604037.2230308924,98,113,14,-1.245,52.085 +43316,354693.6597887641,99,111,14,-1.23499,52.065 +43316,386149.23452634894,99,112,14,-1.23499,52.075 +43316,42244.62779599658,97,114,14,-1.255,52.095 +43316,89932.14433231948,98,114,14,-1.245,52.095 +43317,388197.90916568047,100,110,25,-1.22498,52.055 +43317,763825.9389588326,100,111,25,-1.22498,52.065 +43317,763656.6289446268,100,112,25,-1.22498,52.075 +43317,763431.1499289301,100,113,25,-1.22498,52.085 +43317,348379.15078033786,101,110,25,-1.21497,52.055 +43317,729624.4103886377,101,111,25,-1.21497,52.065 +43317,761328.4075284355,101,112,25,-1.21497,52.075 +43317,761104.3211466427,101,113,25,-1.21497,52.085 +43317,359738.4302194569,102,111,25,-1.20502,52.065 +43317,761328.4075284355,102,112,25,-1.20502,52.075 +43317,761117.7503804835,102,113,25,-1.20502,52.085 +43317,48116.713811382135,103,111,25,-1.19501,52.065 +43317,287241.7496200205,103,112,25,-1.19501,52.075 +43317,234186.83773091144,103,113,25,-1.19501,52.085 +43317,201165.90411649834,99,114,25,-1.23499,52.095 +43317,47350.25126641107,100,114,25,-1.22498,52.095 +43317,111248.66601345221,101,114,25,-1.21497,52.095 +43317,121548.21637416213,102,114,25,-1.20502,52.095 +43317,0.09361865017365308,98,112,25,-1.245,52.075 +43317,159447.1836322948,98,113,25,-1.245,52.085 +43317,48056.3592833537,99,110,25,-1.23499,52.055 +43317,319189.8353834152,99,111,25,-1.23499,52.065 +43317,377510.3026908556,99,112,25,-1.23499,52.075 +43317,763487.2947485154,99,113,25,-1.23499,52.085 +43317,42456.46113282848,98,114,25,-1.245,52.095 +43462,171107.83962164575,93,108,33,-1.29504,52.035 +43462,335587.66390226246,93,109,33,-1.29504,52.045 +43462,441565.08042269596,93,110,33,-1.29504,52.055 +43462,551715.157770965,93,111,33,-1.29504,52.065 +43462,522649.2857298051,93,112,33,-1.29504,52.075 +43462,48789.79811614593,94,111,33,-1.28503,52.065 +43462,108340.67294649107,94,112,33,-1.28503,52.075 +43462,58610.12221453779,86,110,33,-1.36499,52.055 +43462,21401.734991959664,86,111,33,-1.36499,52.065 +43462,552520.4544964321,87,110,33,-1.35498,52.055 +43462,361245.6375363114,87,111,33,-1.35498,52.065 +43462,205.5362007410903,88,109,33,-1.34497,52.045 +43462,668802.2015487748,88,110,33,-1.34497,52.055 +43462,556469.8956943157,88,111,33,-1.34497,52.065 +43462,111543.85237648278,89,109,33,-1.33496,52.045 +43462,761665.9710530668,89,110,33,-1.33496,52.055 +43462,497360.9316518217,89,111,33,-1.33496,52.065 +43462,502652.7431290593,90,109,33,-1.32501,52.045 +43462,761665.9710530818,90,110,33,-1.32501,52.055 +43462,756253.4645502927,90,111,33,-1.32501,52.065 +43462,243207.9502862601,90,112,33,-1.32501,52.075 +43462,196243.595800608,91,108,33,-1.315,52.035 +43462,748103.8322952889,91,109,33,-1.315,52.045 +43462,763995.2247733971,91,110,33,-1.315,52.055 +43462,763825.9389588478,91,111,33,-1.315,52.065 +43462,307554.2451440633,91,112,33,-1.315,52.075 +43462,741116.3604374967,92,108,33,-1.30499,52.035 +43462,761689.395423562,92,109,33,-1.30499,52.045 +43462,761665.9710533244,92,110,33,-1.30499,52.055 +43462,761497.2013535763,92,111,33,-1.30499,52.065 +43462,232330.9897147461,92,112,33,-1.30499,52.075 +43462,68993.54135445457,91,107,33,-1.315,52.025 +43462,79714.49153330298,92,107,33,-1.30499,52.025 +43463,328017.93578822026,100,109,32,-1.22498,52.045 +43463,364703.80257440364,100,110,32,-1.22498,52.055 +43463,121289.5426125542,93,108,32,-1.29504,52.035 +43463,426101.328204376,93,109,32,-1.29504,52.045 +43463,320101.02628766303,93,110,32,-1.29504,52.055 +43463,209785.77704812927,93,111,32,-1.29504,52.065 +43463,270407.3460539397,94,108,32,-1.28503,52.035 +43463,764018.7207782788,94,109,32,-1.28503,52.045 +43463,763995.2247733971,94,110,32,-1.28503,52.055 +43463,715033.2258604463,94,111,32,-1.28503,52.065 +43463,516638.74236435274,94,112,32,-1.28503,52.075 +43463,123124.52158473656,95,108,32,-1.27502,52.035 +43463,722109.659113644,95,109,32,-1.27502,52.045 +43463,763995.2247733971,95,110,32,-1.27502,52.055 +43463,763825.9389588477,95,111,32,-1.27502,52.065 +43463,689636.4827745896,95,112,32,-1.27502,52.075 +43463,26618.202615577837,96,108,32,-1.26501,52.035 +43463,668267.3261622003,96,109,32,-1.26501,52.045 +43463,763995.2247733971,96,110,32,-1.26501,52.055 +43463,763825.9389588479,96,111,32,-1.26501,52.065 +43463,472672.00879258243,96,112,32,-1.26501,52.075 +43463,18.210619769267375,97,108,32,-1.255,52.035 +43463,615846.3655483376,97,109,32,-1.255,52.045 +43463,763995.224773397,97,110,32,-1.255,52.055 +43463,557168.7270799042,97,111,32,-1.255,52.065 +43463,10739.330737250004,97,112,32,-1.255,52.075 +43463,313138.65335297206,98,109,32,-1.245,52.045 +43463,763995.2247733971,98,110,32,-1.245,52.055 +43463,190892.5650770902,98,111,32,-1.245,52.065 +43463,308159.4461665453,99,109,32,-1.23499,52.045 +43463,715935.117981748,99,110,32,-1.23499,52.055 +43463,89943.31530150762,99,111,32,-1.23499,52.065 +43575,245369.07728473534,96,107,15,-1.26501,52.025 +43575,469602.55873696704,93,108,15,-1.29504,52.035 +43575,493926.33256467694,94,108,15,-1.28503,52.035 +43575,641205.720195733,95,108,15,-1.27502,52.035 +43575,41912.46725854986,95,109,15,-1.27502,52.045 +43575,420619.32269212714,96,108,15,-1.26501,52.035 +43575,95755.25567092911,96,109,15,-1.26501,52.045 +43575,20891.407743692835,92,108,15,-1.30499,52.035 +43575,168941.9667219839,92,107,15,-1.30499,52.025 +43575,46965.731262431094,93,106,15,-1.29504,52.015 +43575,591779.6622825318,93,107,15,-1.29504,52.025 +43575,254577.52137994752,94,106,15,-1.28503,52.015 +43575,764502.9047312506,94,107,15,-1.28503,52.025 +43575,112487.00555859857,95,106,15,-1.27502,52.015 +43575,706712.0300845064,95,107,15,-1.27502,52.025 diff --git a/tests/compare/gis/u-k/weight_lis.csv b/tests/compare/gis/u-k/weight_lis.csv new file mode 100644 index 0000000..253e528 --- /dev/null +++ b/tests/compare/gis/u-k/weight_lis.csv @@ -0,0 +1,627 @@ +rivid,area_sqm,lon_index,lat_index,npoints,lsm_grid_lon,lsm_grid_lat +42747,15942.688997493457,99,120,21,-1.23499,52.155 +42747,12.519273460734631,97,121,21,-1.255,52.165 +42747,412972.67234692554,98,121,21,-1.245,52.165 +42747,725261.7971284277,99,121,21,-1.23499,52.165 +42747,264179.34809493046,97,122,21,-1.255,52.175 +42747,761962.2316247917,98,122,21,-1.245,52.175 +42747,761962.2316247917,99,122,21,-1.23499,52.175 +42747,570555.3992738279,97,123,21,-1.255,52.185 +42747,761792.6558052772,98,123,21,-1.245,52.185 +42747,761792.655805277,99,123,21,-1.23499,52.185 +42747,332576.10329044267,97,124,21,-1.255,52.195 +42747,761522.2302120999,98,124,21,-1.245,52.195 +42747,306232.78273024264,99,124,21,-1.23499,52.195 +42747,116022.87675739192,98,125,21,-1.245,52.205 +42747,10.895912481867278,100,120,21,-1.22498,52.155 +42747,379501.49819431046,100,121,21,-1.22498,52.165 +42747,474905.0912831301,100,122,21,-1.22498,52.175 +42747,10238.520298505944,101,122,21,-1.21497,52.175 +42747,670057.5167806229,100,123,21,-1.22498,52.185 +42747,5118.544964768609,101,123,21,-1.21497,52.185 +42747,157981.67535848916,100,124,21,-1.22498,52.195 +42748,42.69975850752922,98,124,43,-1.245,52.195 +42748,455390.2731736781,99,124,43,-1.23499,52.195 +42748,94970.65786533763,97,125,43,-1.255,52.205 +42748,645188.6746223527,98,125,43,-1.245,52.205 +42748,761308.2155728325,99,125,43,-1.23499,52.205 +42748,216386.6734534044,97,126,43,-1.255,52.215 +42748,428168.4598455417,98,126,43,-1.245,52.215 +42748,534208.8555435215,99,126,43,-1.23499,52.215 +42748,170102.26731385905,105,121,43,-1.17505,52.165 +42748,414326.61423449113,105,122,43,-1.17505,52.175 +42748,344931.24411540746,105,123,43,-1.17505,52.185 +42748,33.40051402739811,101,120,43,-1.21497,52.155 +42748,223623.61361777227,100,121,43,-1.22498,52.165 +42748,670485.2629870803,101,121,43,-1.21497,52.165 +42748,506753.7406617115,102,121,43,-1.20502,52.165 +42748,243829.45256944353,103,121,43,-1.19501,52.165 +42748,348368.2983851474,104,121,43,-1.185,52.165 +42748,287060.84758033784,100,122,43,-1.22498,52.175 +42748,749400.6557550323,101,122,43,-1.21497,52.175 +42748,759639.1760535637,102,122,43,-1.20502,52.175 +42748,761962.2316247917,103,122,43,-1.19501,52.175 +42748,759639.1760535486,104,122,43,-1.185,52.175 +42748,91731.74918324995,100,123,43,-1.22498,52.185 +42748,754351.5722692463,101,123,43,-1.21497,52.185 +42748,759470.1172339796,102,123,43,-1.20502,52.185 +42748,761792.6558052769,103,123,43,-1.19501,52.185 +42748,733498.1850416134,104,123,43,-1.185,52.185 +42748,603644.8107581999,100,124,43,-1.22498,52.195 +42748,759301.0343636076,101,124,43,-1.21497,52.195 +42748,759301.0343636076,102,124,43,-1.20502,52.195 +42748,740350.1978927766,103,124,43,-1.19501,52.195 +42748,216955.94188001665,104,124,43,-1.185,52.195 +42748,761308.2155728173,100,125,43,-1.22498,52.205 +42748,706011.4876106505,101,125,43,-1.21497,52.205 +42748,242430.92652851844,102,125,43,-1.20502,52.205 +42748,21126.611737032836,103,125,43,-1.19501,52.205 +42748,10567.167660231053,104,125,43,-1.185,52.205 +42748,756081.4594093226,100,126,43,-1.22498,52.215 +42748,568390.7051085007,101,126,43,-1.21497,52.215 +42748,450759.49020925706,100,127,43,-1.22498,52.225 +42748,341182.939645247,101,127,43,-1.21497,52.225 +42748,10882.192655842797,100,128,43,-1.22498,52.235 +42748,10217.676553981219,101,128,43,-1.21497,52.235 +42830,5322.033432278323,85,119,30,-1.375,52.145 +42830,196240.46777083277,86,119,30,-1.36499,52.145 +42830,429069.30737294664,87,119,30,-1.35498,52.145 +42830,110204.865068665,88,119,30,-1.34497,52.145 +42830,63594.75466136331,89,119,30,-1.33496,52.145 +42830,15840.119026032133,90,119,30,-1.32501,52.145 +42830,15877.284940629123,91,119,30,-1.315,52.145 +42830,354011.7447813397,84,120,30,-1.38501,52.155 +42830,561233.2522173974,85,120,30,-1.375,52.155 +42830,762301.3108111348,86,120,30,-1.36499,52.155 +42830,762301.3108111348,87,120,30,-1.35498,52.155 +42830,730214.9059487067,88,120,30,-1.34497,52.155 +42830,702255.3872527827,89,120,30,-1.33496,52.155 +42830,670410.7466830587,90,120,30,-1.32501,52.155 +42830,249093.17363938992,91,120,30,-1.315,52.155 +42830,216337.85353914596,84,121,30,-1.38501,52.165 +42830,439174.28736420535,85,121,30,-1.375,52.165 +42830,545306.0262511729,86,121,30,-1.36499,52.165 +42830,762131.7832929605,87,121,30,-1.35498,52.165 +42830,762131.7832929606,88,121,30,-1.34497,52.165 +42830,759808.2107959021,89,121,30,-1.33496,52.165 +42830,743934.2440694508,90,121,30,-1.32501,52.165 +42830,58865.56220948662,91,121,30,-1.315,52.165 +42830,132551.59581517824,86,122,30,-1.36499,52.175 +42830,513529.9025313805,87,122,30,-1.35498,52.175 +42830,709232.3860327782,88,122,30,-1.34497,52.175 +42830,759353.666150304,89,122,30,-1.33496,52.175 +42830,126206.14625387437,90,122,30,-1.32501,52.175 +42830,10739.85692914268,88,123,30,-1.34497,52.185 +42830,31431.938205893308,89,123,30,-1.33496,52.185 +42831,31775.750437047114,92,119,19,-1.30499,52.145 +42831,126943.46146020868,92,120,19,-1.30499,52.155 +42831,438755.6855786624,92,121,19,-1.30499,52.165 +42831,5608.502908128281,93,121,19,-1.29504,52.165 +42831,759639.1760535638,92,122,19,-1.30499,52.175 +42831,440420.6622772274,93,122,19,-1.29504,52.175 +42831,585433.0502661973,92,123,19,-1.30499,52.185 +42831,212393.97494854324,93,123,19,-1.29504,52.185 +42831,3.86055220291656,92,124,19,-1.30499,52.195 +42831,121699.83089577383,91,119,19,-1.315,52.145 +42831,412495.16127723164,91,120,19,-1.315,52.155 +42831,15870.153250223624,90,121,19,-1.32501,52.165 +42831,697996.3115285805,91,121,19,-1.315,52.165 +42831,197.4341284409783,89,122,19,-1.33496,52.175 +42831,633308.0349441373,90,122,19,-1.32501,52.175 +42831,761962.2316247916,91,122,19,-1.315,52.175 +42831,26253.691395186215,90,123,19,-1.32501,52.185 +42831,549632.479744256,91,123,19,-1.315,52.185 +42831,42192.726836856054,91,124,19,-1.315,52.195 +42841,321237.65720182227,107,118,21,-1.15503,52.135 +42841,577570.9453851564,108,118,21,-1.14502,52.135 +42841,207199.3905582682,109,118,21,-1.13501,52.135 +42841,18.78593950793048,105,119,21,-1.17505,52.145 +42841,268223.8519442093,106,119,21,-1.16504,52.145 +42841,713706.6553049278,107,119,21,-1.15503,52.145 +42841,762470.8141974149,108,119,21,-1.14502,52.145 +42841,667867.9071269515,109,119,21,-1.13501,52.145 +42841,648012.2060768765,105,120,21,-1.17505,52.155 +42841,762301.3108111348,106,120,21,-1.16504,52.155 +42841,762301.3108111349,107,120,21,-1.15503,52.155 +42841,762301.3108111348,108,120,21,-1.14502,52.155 +42841,640953.764262802,109,120,21,-1.13501,52.155 +42841,42560.75454910433,110,120,21,-1.125,52.155 +42841,490679.12382551684,105,121,21,-1.17505,52.165 +42841,512709.4579833108,106,121,21,-1.16504,52.165 +42841,555776.7127590285,107,121,21,-1.15503,52.165 +42841,434275.0537802454,108,121,21,-1.14502,52.165 +42841,79821.3240254559,109,121,21,-1.13501,52.165 +42841,168298.9713726147,104,120,21,-1.185,52.155 +42841,252558.8506136799,104,121,21,-1.185,52.165 +42846,655430.666629942,105,117,15,-1.17505,52.125 +42846,556051.0504078016,106,117,15,-1.16504,52.125 +42846,583335.3840224064,107,117,15,-1.15503,52.125 +42846,160013.0970254466,108,117,15,-1.14502,52.125 +42846,537444.1830511518,105,118,15,-1.17505,52.135 +42846,751417.4345294643,106,118,15,-1.16504,52.135 +42846,441399.7199276445,107,118,15,-1.15503,52.135 +42846,95725.02296616141,108,118,15,-1.14502,52.135 +42846,178620.8846428338,106,119,15,-1.16504,52.145 +42846,48767.07534241197,107,119,15,-1.15503,52.145 +42846,5.275994231999901,103,116,15,-1.19501,52.115 +42846,5319.54498130132,104,116,15,-1.185,52.115 +42846,31539.155920861744,103,117,15,-1.19501,52.125 +42846,665210.1620656817,104,117,15,-1.185,52.125 +42846,194872.87833268108,104,118,15,-1.185,52.135 +42891,74050.31366434642,97,119,20,-1.255,52.145 +42891,709426.597845586,98,119,20,-1.245,52.145 +42891,762470.8141974149,99,119,20,-1.23499,52.145 +42891,126482.94581818105,96,120,20,-1.26501,52.155 +42891,714255.5865304788,97,120,20,-1.255,52.155 +42891,762301.3108111349,98,120,20,-1.245,52.155 +42891,746354.8815378526,99,120,20,-1.23499,52.155 +42891,121072.22275140573,96,121,20,-1.26501,52.165 +42891,428487.37907009403,97,121,20,-1.255,52.165 +42891,333220.8028012988,98,121,20,-1.245,52.165 +42891,36873.72666455701,99,121,20,-1.23499,52.165 +42891,99948.75987447711,100,118,20,-1.22498,52.135 +42891,639514.7940168536,100,119,20,-1.22498,52.145 +42891,78710.85021396031,101,119,20,-1.21497,52.145 +42891,762289.260714416,100,120,20,-1.22498,52.155 +42891,431710.0301377497,101,120,20,-1.21497,52.155 +42891,159004.07843006632,100,121,20,-1.22498,52.165 +42891,89291.03626437408,101,121,20,-1.21497,52.165 +42891,196053.34325274988,98,118,20,-1.245,52.135 +42891,339110.6508494664,99,118,20,-1.23499,52.135 +42892,222870.98763332475,105,118,28,-1.17505,52.135 +42892,11219.102249029595,106,118,28,-1.16504,52.135 +42892,760125.346613911,105,119,28,-1.17505,52.145 +42892,315629.83453189814,106,119,28,-1.16504,52.145 +42892,111967.09100512204,105,120,28,-1.17505,52.155 +42892,21.244032165731607,103,116,28,-1.19501,52.115 +42892,68937.3453091219,101,117,28,-1.21497,52.125 +42892,300770.7321053969,102,117,28,-1.20502,52.125 +42892,672804.5890818848,103,117,28,-1.19501,52.125 +42892,58431.425175177836,104,117,28,-1.185,52.125 +42892,451587.13420486083,100,118,28,-1.22498,52.135 +42892,755198.135770582,101,118,28,-1.21497,52.135 +42892,760315.170584804,102,118,28,-1.20502,52.135 +42892,762640.2934175859,103,118,28,-1.19501,52.135 +42892,565444.4232877577,104,118,28,-1.185,52.135 +42892,122959.77190042836,100,119,28,-1.22498,52.145 +42892,681431.9754393627,101,119,28,-1.21497,52.145 +42892,760146.2080693282,102,119,28,-1.20502,52.145 +42892,762470.8141974148,103,119,28,-1.19501,52.145 +42892,760146.208069313,104,119,28,-1.185,52.145 +42892,328234.3035217343,101,120,28,-1.21497,52.155 +42892,759977.221462388,102,120,28,-1.20502,52.155 +42892,762301.3108111348,103,120,28,-1.19501,52.155 +42892,591674.5375736358,104,120,28,-1.185,52.155 +42892,34.781566349310495,101,121,28,-1.21497,52.165 +42892,253054.4701534737,102,121,28,-1.20502,52.165 +42892,518302.3308311749,103,121,28,-1.19501,52.165 +42892,158884.77461779522,104,121,28,-1.185,52.165 +42911,5200.228521284634,100,117,4,-1.22498,52.125 +42911,121054.13843402507,100,118,4,-1.22498,52.135 +42911,5416.57498333164,99,117,4,-1.23499,52.125 +42911,212247.9325866588,99,118,4,-1.23499,52.135 +42918,21701.999966825722,87,119,15,-1.35498,52.145 +42918,641836.070987962,88,119,15,-1.34497,52.145 +42918,696547.6371224422,89,119,15,-1.33496,52.145 +42918,744302.6984817004,90,119,15,-1.32501,52.145 +42918,344622.45025064703,91,119,15,-1.315,52.145 +42918,32089.84276316338,88,120,15,-1.34497,52.155 +42918,57725.6507072804,89,120,15,-1.33496,52.155 +42918,89569.86551502235,90,120,15,-1.32501,52.155 +42918,100703.04093093723,91,120,15,-1.315,52.155 +42918,42241.227031182476,90,117,15,-1.32501,52.125 +42918,111309.40060658444,91,117,15,-1.315,52.125 +42918,149799.5904384809,88,118,15,-1.34497,52.135 +42918,544117.7314144695,89,118,15,-1.33496,52.135 +42918,702286.9814040591,90,118,15,-1.32501,52.135 +42918,487534.3163312004,91,118,15,-1.315,52.135 +42919,728367.5909249922,92,119,58,-1.30499,52.145 +42919,697292.1899088629,93,119,58,-1.29504,52.145 +42919,409257.65098497167,94,119,58,-1.28503,52.145 +42919,59061.202271684546,95,119,58,-1.27502,52.145 +42919,633036.6268552216,92,120,58,-1.30499,52.155 +42919,759977.2214623729,93,120,58,-1.29504,52.155 +42919,762301.3108111349,94,120,58,-1.28503,52.155 +42919,620281.4139635654,95,120,58,-1.27502,52.155 +42919,207321.15577313563,96,120,58,-1.26501,52.155 +42919,321052.5252365329,92,121,58,-1.30499,52.165 +42919,754196.3038296711,93,121,58,-1.29504,52.165 +42919,762131.7832929604,94,121,58,-1.28503,52.165 +42919,762131.7832929604,95,121,58,-1.27502,52.165 +42919,641063.2994502002,96,121,58,-1.26501,52.165 +42919,333630.71401589457,97,121,58,-1.255,52.165 +42919,15938.308185502252,98,121,58,-1.245,52.165 +42919,319218.22053268517,93,122,58,-1.29504,52.175 +42919,761962.2316247916,94,122,58,-1.28503,52.175 +42919,761962.2316247916,95,122,58,-1.27502,52.175 +42919,761962.2316247917,96,122,58,-1.26501,52.175 +42919,497781.1612744529,97,122,58,-1.255,52.175 +42919,174037.06618789356,92,123,58,-1.30499,52.185 +42919,547079.8399432373,93,123,58,-1.29504,52.185 +42919,761792.6558052772,94,123,58,-1.28503,52.185 +42919,761792.655805277,95,123,58,-1.27502,52.185 +42919,761792.6558052772,96,123,58,-1.26501,52.185 +42919,191237.2577664634,97,123,58,-1.255,52.185 +42919,722258.360053817,92,124,58,-1.30499,52.195 +42919,759301.0343635925,93,124,58,-1.29504,52.195 +42919,761623.0558619093,94,124,58,-1.28503,52.195 +42919,761623.0558619094,95,124,58,-1.27502,52.195 +42919,761623.0558619094,96,124,58,-1.26501,52.195 +42919,429049.84493746725,97,124,58,-1.255,52.195 +42919,58.11090418378856,98,124,58,-1.245,52.195 +42919,711437.79008461,92,125,58,-1.30499,52.205 +42919,758987.1539529597,93,125,58,-1.29504,52.205 +42919,761308.2155728325,94,125,58,-1.28503,52.205 +42919,761308.2155728325,95,125,58,-1.27502,52.205 +42919,761308.2155728325,96,125,58,-1.26501,52.205 +42919,666334.1451365228,97,125,58,-1.255,52.205 +42919,96.67918087679483,98,125,58,-1.245,52.205 +42919,484473.3922523962,92,126,58,-1.30499,52.215 +42919,758691.8449129824,93,126,58,-1.29504,52.215 +42919,761275.2677806083,94,126,58,-1.28503,52.215 +42919,555800.36976694,95,126,58,-1.27502,52.215 +42919,412548.29511034157,96,126,58,-1.26501,52.215 +42919,190578.89311238402,97,126,58,-1.255,52.215 +42919,504421.59619752143,93,127,58,-1.29504,52.225 +42919,398345.6419365973,94,127,58,-1.28503,52.225 +42919,280270.8764542686,91,119,58,-1.315,52.145 +42919,11.107582509056657,91,120,58,-1.315,52.155 +42919,5272.856677495661,91,121,58,-1.315,52.165 +42919,95088.11119846192,91,124,58,-1.315,52.195 +42919,10556.453501879045,91,125,58,-1.315,52.205 +42919,90050.4332158404,92,118,58,-1.30499,52.135 +42919,8.425241581553797,93,118,58,-1.29504,52.135 +42919,6.763154525913717,91,117,58,-1.315,52.125 +42919,158758.0485109592,91,118,58,-1.315,52.135 +42928,148419.5956435323,98,117,4,-1.245,52.125 +42928,301479.89922747505,99,117,4,-1.23499,52.125 +42928,190736.1662758745,98,118,4,-1.245,52.135 +42928,211284.6118052163,99,118,4,-1.23499,52.135 +42932,15.658766846560429,100,115,15,-1.22498,52.105 +42932,258196.8905189534,100,116,15,-1.22498,52.115 +42932,42561.16568474794,98,114,15,-1.245,52.095 +42932,148253.37508882643,99,114,15,-1.23499,52.095 +42932,15.728958762997395,96,115,15,-1.26501,52.105 +42932,233015.99591310363,97,115,15,-1.255,52.105 +42932,561941.0755347182,98,115,15,-1.245,52.105 +42932,650766.8994171098,99,115,15,-1.23499,52.105 +42932,57805.606169820436,96,116,15,-1.26501,52.115 +42932,592855.5103816033,97,116,15,-1.255,52.115 +42932,762833.6398317235,98,116,15,-1.245,52.115 +42932,757423.4414017396,99,116,15,-1.23499,52.115 +42932,153308.6812793428,97,117,15,-1.255,52.125 +42932,487248.7655092081,98,117,15,-1.245,52.125 +42932,190171.31873062815,99,117,15,-1.23499,52.125 +42978,10563.958124043893,93,119,21,-1.29504,52.145 +42978,68872.96214337272,87,119,21,-1.35498,52.145 +42978,10428.557391121154,88,119,21,-1.34497,52.145 +42978,10609.019362609826,92,116,21,-1.30499,52.115 +42978,418166.9189866125,92,117,21,-1.30499,52.125 +42978,659961.1275284266,92,118,21,-1.30499,52.135 +42978,38405.617011915565,93,118,21,-1.29504,52.135 +42978,5.2448750504475505,90,116,21,-1.32501,52.115 +42978,111207.7649089774,91,116,21,-1.315,52.115 +42978,0.0941142357177346,86,117,21,-1.36499,52.125 +42978,138344.74239989146,87,117,21,-1.35498,52.125 +42978,440204.8821000284,88,117,21,-1.34497,52.125 +42978,496391.9343185298,89,117,21,-1.33496,52.125 +42978,517520.9933185104,90,117,21,-1.32501,52.125 +42978,651490.0539039067,91,117,21,-1.315,52.125 +42978,175336.16282678847,86,118,21,-1.36499,52.135 +42978,720394.7484104942,87,118,21,-1.35498,52.135 +42978,612838.5861800415,88,118,21,-1.34497,52.135 +42978,216197.43920151365,89,118,21,-1.33496,52.135 +42978,58032.00862003008,90,118,21,-1.32501,52.135 +42978,116347.71206999471,91,118,21,-1.315,52.135 +42979,52292.99894061633,93,119,35,-1.29504,52.145 +42979,353213.1632525356,94,119,35,-1.28503,52.145 +42979,703405.7605628768,95,119,35,-1.27502,52.145 +42979,762470.8141974148,96,119,35,-1.26501,52.145 +42979,688417.0721378238,97,119,35,-1.255,52.145 +42979,53045.39656974576,98,119,35,-1.245,52.145 +42979,142023.7484165171,95,120,35,-1.27502,52.155 +42979,428493.47052416153,96,120,35,-1.26501,52.155 +42979,48049.15289233814,97,120,35,-1.255,52.155 +42979,26293.695338286198,92,115,35,-1.30499,52.105 +42979,126980.27168023693,93,115,35,-1.29504,52.105 +42979,274786.7377961502,94,115,35,-1.28503,52.105 +42979,250104.1829037072,95,115,35,-1.27502,52.105 +42979,10779.496888015303,96,115,35,-1.26501,52.105 +42979,538229.9276188291,92,116,35,-1.30499,52.115 +42979,760507.92752864,93,116,35,-1.29504,52.115 +42979,762833.6398317234,94,116,35,-1.28503,52.115 +42979,762833.6398317235,95,116,35,-1.27502,52.115 +42979,583408.4174691567,96,116,35,-1.26501,52.115 +42979,169974.27362695825,97,116,35,-1.255,52.115 +42979,342318.91823716805,92,117,35,-1.30499,52.125 +42979,760484.1090179777,93,117,35,-1.29504,52.125 +42979,762809.7484820664,94,117,35,-1.28503,52.125 +42979,762809.7484820663,95,117,35,-1.27502,52.125 +42979,762809.7484820663,96,117,35,-1.26501,52.125 +42979,609504.9232306959,97,117,35,-1.255,52.125 +42979,127137.53296225658,98,117,35,-1.245,52.125 +42979,10304.75195303494,92,118,35,-1.30499,52.135 +42979,721898.1895737933,93,118,35,-1.29504,52.135 +42979,762640.293417586,94,118,35,-1.28503,52.135 +42979,762640.2934175859,95,118,35,-1.27502,52.135 +42979,762640.293417586,96,118,35,-1.26501,52.135 +42979,762640.293417586,97,118,35,-1.255,52.135 +42979,375853.4584229488,98,118,35,-1.245,52.135 +42979,10582.178269636643,91,116,35,-1.315,52.115 +43028,52.676190213236104,100,113,24,-1.22498,52.085 +43028,51.85316660550099,101,113,24,-1.21497,52.085 +43028,715971.1346335092,100,114,24,-1.22498,52.095 +43028,649745.4590541938,101,114,24,-1.21497,52.095 +43028,491880.13220622437,102,114,24,-1.20502,52.095 +43028,11089.84112516724,103,114,24,-1.19501,52.095 +43028,763131.7449033366,100,115,24,-1.22498,52.105 +43028,760821.8813951913,101,115,24,-1.21497,52.105 +43028,760821.8813951915,102,115,24,-1.20502,52.105 +43028,59417.314959302304,103,115,24,-1.19501,52.105 +43028,504637.9374878538,100,116,24,-1.22498,52.115 +43028,760507.9275286552,101,116,24,-1.21497,52.115 +43028,760507.9275286552,102,116,24,-1.20502,52.115 +43028,223467.95996029524,103,116,24,-1.19501,52.115 +43028,757607.4036326954,100,117,24,-1.22498,52.125 +43028,691545.6345904187,101,117,24,-1.21497,52.125 +43028,459713.38320826157,102,117,24,-1.20502,52.125 +43028,47896.085808451666,103,117,24,-1.19501,52.125 +43028,90048.63852995561,100,118,24,-1.22498,52.135 +43028,5118.170495546501,101,118,24,-1.21497,52.135 +43028,324126.29300796986,99,114,24,-1.23499,52.095 +43028,112385.14861007631,99,115,24,-1.23499,52.105 +43028,5408.041071640592,99,116,24,-1.23499,52.115 +43028,265741.2241634687,99,117,24,-1.23499,52.125 +43142,349277.12053377595,92,114,20,-1.30499,52.095 +43142,16336.279562620202,93,114,20,-1.29504,52.095 +43142,734524.3639742916,92,115,20,-1.30499,52.105 +43142,498186.73647775676,93,115,20,-1.29504,52.105 +43142,27273.188645292983,94,115,20,-1.28503,52.105 +43142,211669.9455975424,92,116,20,-1.30499,52.115 +43142,291354.33067024563,91,114,20,-1.315,52.095 +43142,37897.147556767115,88,115,20,-1.34497,52.105 +43142,338552.1722023028,89,115,20,-1.33496,52.105 +43142,248617.09454378192,90,115,20,-1.32501,52.105 +43142,566578.9189853063,91,115,20,-1.315,52.105 +43142,0.13598205862337287,87,116,20,-1.35498,52.115 +43142,489353.8726733322,88,116,20,-1.34497,52.115 +43142,760507.9275286401,89,116,20,-1.33496,52.115 +43142,760501.5325334605,90,116,20,-1.32501,52.115 +43142,641043.7096009547,91,116,20,-1.315,52.115 +43142,271.20434542452864,87,117,20,-1.35498,52.125 +43142,296822.4369025752,88,117,20,-1.34497,52.125 +43142,264092.1747356638,89,117,20,-1.33496,52.125 +43142,200719.21953957266,90,117,20,-1.32501,52.125 +43145,411713.55734612455,92,114,26,-1.30499,52.095 +43145,744651.5672077542,93,114,26,-1.29504,52.095 +43145,763317.9363630149,94,114,26,-1.28503,52.095 +43145,763317.9363630149,95,114,26,-1.27502,52.095 +43145,763317.9363630149,96,114,26,-1.26501,52.095 +43145,721076.7449270195,97,114,26,-1.255,52.095 +43145,588367.3115725693,98,114,26,-1.245,52.095 +43145,89768.9401470169,99,114,26,-1.23499,52.095 +43145,135657.73587727154,93,115,26,-1.29504,52.105 +43145,461088.6401877261,94,115,26,-1.28503,52.105 +43145,513044.3710155703,95,115,26,-1.27502,52.105 +43145,752349.7894594746,96,115,26,-1.26501,52.105 +43145,530132.5580119358,97,115,26,-1.255,52.105 +43145,201211.23069220313,98,115,26,-1.245,52.105 +43145,121623.15486682803,96,116,26,-1.26501,52.115 +43145,100533.12681291779,91,114,26,-1.315,52.095 +43145,57514.528576930046,93,112,26,-1.29504,52.075 +43145,138680.2113293679,94,112,26,-1.28503,52.075 +43145,35.31253019281789,95,112,26,-1.27502,52.075 +43145,100389.82416117829,92,113,26,-1.30499,52.085 +43145,532267.1577683656,93,113,26,-1.29504,52.085 +43145,763487.2947485155,94,113,26,-1.28503,52.085 +43145,510635.31110502605,95,113,26,-1.27502,52.085 +43145,127533.7539855453,96,113,26,-1.26501,52.085 +43145,10807.883332657326,97,113,26,-1.255,52.085 +43145,31834.832887133976,91,113,26,-1.315,52.085 +43289,25622.140060796693,79,118,69,-1.435,52.135 +43289,600364.8344050964,80,118,69,-1.42505,52.135 +43289,762640.2934175859,81,118,69,-1.41504,52.135 +43289,762640.2934175706,82,118,69,-1.40503,52.135 +43289,762640.293417586,83,118,69,-1.39502,52.135 +43289,165703.39674402997,80,119,69,-1.42505,52.145 +43289,762470.8141974149,81,119,69,-1.41504,52.145 +43289,762470.8141973997,82,119,69,-1.40503,52.145 +43289,762470.8141974149,83,119,69,-1.39502,52.145 +43289,25810.198303623576,80,120,69,-1.42505,52.155 +43289,568859.7342431326,81,120,69,-1.41504,52.155 +43289,614968.665418138,82,120,69,-1.40503,52.155 +43289,449743.10344886687,83,120,69,-1.39502,52.155 +43289,26383.627652960633,81,121,69,-1.41504,52.165 +43289,762470.8141974148,84,119,69,-1.38501,52.145 +43289,757147.6026159881,85,119,69,-1.375,52.145 +43289,566230.3464882296,86,119,69,-1.36499,52.145 +43289,242829.97904467362,87,119,69,-1.35498,52.145 +43289,344346.8239041815,84,120,69,-1.38501,52.155 +43289,201069.23680180783,85,120,69,-1.375,52.155 +43289,14.385622446523405,84,114,69,-1.38501,52.095 +43289,376284.9837592672,85,114,69,-1.375,52.095 +43289,763317.9363630146,86,114,69,-1.36499,52.095 +43289,763317.9363630147,87,114,69,-1.35498,52.095 +43289,763317.9363630146,88,114,69,-1.34497,52.095 +43289,405372.58620650694,89,114,69,-1.33496,52.095 +43289,327781.64234620833,84,115,69,-1.38501,52.105 +43289,763148.5538018241,85,115,69,-1.375,52.105 +43289,763148.5538018239,86,115,69,-1.36499,52.105 +43289,763148.553801824,87,115,69,-1.35498,52.105 +43289,724655.196148976,88,115,69,-1.34497,52.105 +43289,57195.54531181437,89,115,69,-1.33496,52.105 +43289,746762.1727138164,84,116,69,-1.38501,52.115 +43289,762833.6398317235,85,116,69,-1.375,52.115 +43289,762833.6398317234,86,116,69,-1.36499,52.115 +43289,762833.470841757,87,116,69,-1.35498,52.115 +43289,273482.73323469923,88,116,69,-1.34497,52.115 +43289,762809.7484820662,84,117,69,-1.38501,52.125 +43289,762809.7484820663,85,117,69,-1.375,52.125 +43289,762809.636527135,86,117,69,-1.36499,52.125 +43289,624193.83472419,87,117,69,-1.35498,52.125 +43289,25782.42320537449,88,117,69,-1.34497,52.125 +43289,762640.2934175859,84,118,69,-1.38501,52.135 +43289,762640.293417586,85,118,69,-1.375,52.135 +43289,587304.1484323597,86,118,69,-1.36499,52.135 +43289,42242.110977978584,87,118,69,-1.35498,52.135 +43289,15360.001893925064,82,116,69,-1.40503,52.115 +43289,502303.2573466741,83,116,69,-1.39502,52.115 +43289,126178.98207164464,80,117,69,-1.42505,52.125 +43289,290132.15511377365,81,117,69,-1.41504,52.125 +43289,576692.562705609,82,117,69,-1.40503,52.125 +43289,762809.7484820663,83,117,69,-1.39502,52.125 +43289,0.019145439161464946,85,110,69,-1.375,52.055 +43289,121985.21436542548,86,110,69,-1.36499,52.055 +43289,63683.89284217385,85,111,69,-1.375,52.065 +43289,710669.6475380762,86,111,69,-1.36499,52.065 +43289,402580.3014850925,87,111,69,-1.35498,52.065 +43289,207356.04340515012,88,111,69,-1.34497,52.065 +43289,205741.2351711953,89,111,69,-1.33496,52.065 +43289,11.640264171832513,85,112,69,-1.375,52.075 +43289,631303.0745322008,86,112,69,-1.36499,52.075 +43289,763656.6289446421,87,112,69,-1.35498,52.075 +43289,763656.628944642,88,112,69,-1.34497,52.075 +43289,506232.9909230169,89,112,69,-1.33496,52.075 +43289,0.028720007244656762,85,113,69,-1.375,52.085 +43289,509433.0614378833,86,113,69,-1.36499,52.085 +43289,763487.2947485156,87,113,69,-1.35498,52.085 +43289,763487.2947485155,88,113,69,-1.34497,52.085 +43289,389557.53536982817,89,113,69,-1.33496,52.085 +43290,355618.48818859254,89,114,19,-1.33496,52.095 +43290,760990.7475461373,90,114,19,-1.32501,52.095 +43290,371431.3179734935,91,114,19,-1.315,52.095 +43290,593.2887921357806,88,115,19,-1.34497,52.105 +43290,365077.52500943345,89,115,19,-1.33496,52.105 +43290,512204.7615674439,90,115,19,-1.32501,52.105 +43290,196572.55419012552,91,115,19,-1.315,52.105 +43290,528997.417864512,92,112,19,-1.30499,52.075 +43290,181161.21016664867,93,112,19,-1.29504,52.075 +43290,660769.765617372,92,113,19,-1.30499,52.085 +43290,228895.8150848985,93,113,19,-1.29504,52.085 +43290,58391.623200195514,89,111,19,-1.33496,52.065 +43290,5242.578243374274,90,111,19,-1.32501,52.065 +43290,255095.4180560093,89,112,19,-1.33496,52.075 +43290,518121.6158595305,90,112,19,-1.32501,52.075 +43290,456102.38385514653,91,112,19,-1.315,52.075 +43290,371601.7515404752,89,113,19,-1.33496,52.085 +43290,761159.5895950992,90,113,19,-1.32501,52.085 +43290,731648.7101063863,91,113,19,-1.315,52.085 +43316,42244.62779599658,97,114,14,-1.255,52.095 +43316,89932.14433231948,98,114,14,-1.245,52.095 +43316,206655.06063879613,97,111,14,-1.255,52.065 +43316,572933.3866403099,98,111,14,-1.245,52.065 +43316,354693.6597887641,99,111,14,-1.23499,52.065 +43316,73981.93385012516,95,112,14,-1.27502,52.075 +43316,290984.62019046606,96,112,14,-1.26501,52.075 +43316,752919.4496308649,97,112,14,-1.255,52.075 +43316,763656.524972735,98,112,14,-1.245,52.075 +43316,386149.23452634894,99,112,14,-1.23499,52.075 +43316,252854.9029621112,95,113,14,-1.27502,52.085 +43316,635953.5407642601,96,113,14,-1.26501,52.085 +43316,752675.9752335971,97,113,14,-1.255,52.085 +43316,604037.2230308924,98,113,14,-1.245,52.085 +43317,763656.6289446268,100,112,25,-1.22498,52.075 +43317,761328.4075284355,101,112,25,-1.21497,52.075 +43317,761328.4075284355,102,112,25,-1.20502,52.075 +43317,287241.7496200205,103,112,25,-1.19501,52.075 +43317,763431.1499289301,100,113,25,-1.22498,52.085 +43317,761104.3211466427,101,113,25,-1.21497,52.085 +43317,761117.7503804835,102,113,25,-1.20502,52.085 +43317,234186.83773091144,103,113,25,-1.19501,52.085 +43317,47350.25126641107,100,114,25,-1.22498,52.095 +43317,111248.66601345221,101,114,25,-1.21497,52.095 +43317,121548.21637416213,102,114,25,-1.20502,52.095 +43317,42456.46113282848,98,114,25,-1.245,52.095 +43317,201165.90411649834,99,114,25,-1.23499,52.095 +43317,48056.3592833537,99,110,25,-1.23499,52.055 +43317,319189.8353834152,99,111,25,-1.23499,52.065 +43317,0.09361865017365308,98,112,25,-1.245,52.075 +43317,377510.3026908556,99,112,25,-1.23499,52.075 +43317,159447.1836322948,98,113,25,-1.245,52.085 +43317,763487.2947485154,99,113,25,-1.23499,52.085 +43317,388197.90916568047,100,110,25,-1.22498,52.055 +43317,348379.15078033786,101,110,25,-1.21497,52.055 +43317,763825.9389588326,100,111,25,-1.22498,52.065 +43317,729624.4103886377,101,111,25,-1.21497,52.065 +43317,359738.4302194569,102,111,25,-1.20502,52.065 +43317,48116.713811382135,103,111,25,-1.19501,52.065 +43462,761689.395423562,92,109,33,-1.30499,52.045 +43462,335587.66390226246,93,109,33,-1.29504,52.045 +43462,761665.9710533244,92,110,33,-1.30499,52.055 +43462,441565.08042269596,93,110,33,-1.29504,52.055 +43462,761497.2013535763,92,111,33,-1.30499,52.065 +43462,551715.157770965,93,111,33,-1.29504,52.065 +43462,48789.79811614593,94,111,33,-1.28503,52.065 +43462,232330.9897147461,92,112,33,-1.30499,52.075 +43462,522649.2857298051,93,112,33,-1.29504,52.075 +43462,108340.67294649107,94,112,33,-1.28503,52.075 +43462,205.5362007410903,88,109,33,-1.34497,52.045 +43462,111543.85237648278,89,109,33,-1.33496,52.045 +43462,502652.7431290593,90,109,33,-1.32501,52.045 +43462,748103.8322952889,91,109,33,-1.315,52.045 +43462,58610.12221453779,86,110,33,-1.36499,52.055 +43462,552520.4544964321,87,110,33,-1.35498,52.055 +43462,668802.2015487748,88,110,33,-1.34497,52.055 +43462,761665.9710530668,89,110,33,-1.33496,52.055 +43462,761665.9710530818,90,110,33,-1.32501,52.055 +43462,763995.2247733971,91,110,33,-1.315,52.055 +43462,21401.734991959664,86,111,33,-1.36499,52.065 +43462,361245.6375363114,87,111,33,-1.35498,52.065 +43462,556469.8956943157,88,111,33,-1.34497,52.065 +43462,497360.9316518217,89,111,33,-1.33496,52.065 +43462,756253.4645502927,90,111,33,-1.32501,52.065 +43462,763825.9389588478,91,111,33,-1.315,52.065 +43462,243207.9502862601,90,112,33,-1.32501,52.075 +43462,307554.2451440633,91,112,33,-1.315,52.075 +43462,68993.54135445457,91,107,33,-1.315,52.025 +43462,196243.595800608,91,108,33,-1.315,52.035 +43462,79714.49153330298,92,107,33,-1.30499,52.025 +43462,741116.3604374967,92,108,33,-1.30499,52.035 +43462,171107.83962164575,93,108,33,-1.29504,52.035 +43463,426101.328204376,93,109,32,-1.29504,52.045 +43463,764018.7207782788,94,109,32,-1.28503,52.045 +43463,722109.659113644,95,109,32,-1.27502,52.045 +43463,668267.3261622003,96,109,32,-1.26501,52.045 +43463,615846.3655483376,97,109,32,-1.255,52.045 +43463,313138.65335297206,98,109,32,-1.245,52.045 +43463,308159.4461665453,99,109,32,-1.23499,52.045 +43463,320101.02628766303,93,110,32,-1.29504,52.055 +43463,763995.2247733971,94,110,32,-1.28503,52.055 +43463,763995.2247733971,95,110,32,-1.27502,52.055 +43463,763995.2247733971,96,110,32,-1.26501,52.055 +43463,763995.224773397,97,110,32,-1.255,52.055 +43463,763995.2247733971,98,110,32,-1.245,52.055 +43463,715935.117981748,99,110,32,-1.23499,52.055 +43463,209785.77704812927,93,111,32,-1.29504,52.065 +43463,715033.2258604463,94,111,32,-1.28503,52.065 +43463,763825.9389588477,95,111,32,-1.27502,52.065 +43463,763825.9389588479,96,111,32,-1.26501,52.065 +43463,557168.7270799042,97,111,32,-1.255,52.065 +43463,190892.5650770902,98,111,32,-1.245,52.065 +43463,89943.31530150762,99,111,32,-1.23499,52.065 +43463,516638.74236435274,94,112,32,-1.28503,52.075 +43463,689636.4827745896,95,112,32,-1.27502,52.075 +43463,472672.00879258243,96,112,32,-1.26501,52.075 +43463,10739.330737250004,97,112,32,-1.255,52.075 +43463,328017.93578822026,100,109,32,-1.22498,52.045 +43463,364703.80257440364,100,110,32,-1.22498,52.055 +43463,121289.5426125542,93,108,32,-1.29504,52.035 +43463,270407.3460539397,94,108,32,-1.28503,52.035 +43463,123124.52158473656,95,108,32,-1.27502,52.035 +43463,26618.202615577837,96,108,32,-1.26501,52.035 +43463,18.210619769267375,97,108,32,-1.255,52.035 +43575,41912.46725854986,95,109,15,-1.27502,52.045 +43575,95755.25567092911,96,109,15,-1.26501,52.045 +43575,46965.731262431094,93,106,15,-1.29504,52.015 +43575,254577.52137994752,94,106,15,-1.28503,52.015 +43575,112487.00555859857,95,106,15,-1.27502,52.015 +43575,168941.9667219839,92,107,15,-1.30499,52.025 +43575,591779.6622825318,93,107,15,-1.29504,52.025 +43575,764502.9047312506,94,107,15,-1.28503,52.025 +43575,706712.0300845064,95,107,15,-1.27502,52.025 +43575,245369.07728473534,96,107,15,-1.26501,52.025 +43575,20891.407743692835,92,108,15,-1.30499,52.035 +43575,469602.55873696704,93,108,15,-1.29504,52.035 +43575,493926.33256467694,94,108,15,-1.28503,52.035 +43575,641205.720195733,95,108,15,-1.27502,52.035 +43575,420619.32269212714,96,108,15,-1.26501,52.035 diff --git a/tests/compare/gis/u-k/x.csv b/tests/compare/gis/u-k/x.csv new file mode 100644 index 0000000..be69a4a --- /dev/null +++ b/tests/compare/gis/u-k/x.csv @@ -0,0 +1,25 @@ +0.3 +0.3 +0.3 +0.3 +0.3 +0.3 +0.3 +0.3 +0.3 +0.3 +0.3 +0.3 +0.3 +0.3 +0.3 +0.3 +0.3 +0.3 +0.3 +0.3 +0.3 +0.3 +0.3 +0.3 +0.3 diff --git a/tests/compare/gis/u-k/x_drain.csv b/tests/compare/gis/u-k/x_drain.csv new file mode 100644 index 0000000..be69a4a --- /dev/null +++ b/tests/compare/gis/u-k/x_drain.csv @@ -0,0 +1,25 @@ +0.3 +0.3 +0.3 +0.3 +0.3 +0.3 +0.3 +0.3 +0.3 +0.3 +0.3 +0.3 +0.3 +0.3 +0.3 +0.3 +0.3 +0.3 +0.3 +0.3 +0.3 +0.3 +0.3 +0.3 +0.3 diff --git a/tests/compare/gis/uk-no_intersect/weight_lis_no_intersect.csv b/tests/compare/gis/uk-no_intersect/weight_lis_no_intersect.csv new file mode 100644 index 0000000..c1766a0 --- /dev/null +++ b/tests/compare/gis/uk-no_intersect/weight_lis_no_intersect.csv @@ -0,0 +1,48 @@ +rivid,area_sqm,lon_index,lat_index,npoints,lsm_grid_lon,lsm_grid_lat +45277,0,14,67,1,-2.08496,51.625 +45335,52434.357620913775,20,72,17,-2.02502,51.675 +45335,55.984554445453185,21,70,17,-2.01501,51.655 +45335,485581.85584087117,21,71,17,-2.01501,51.665 +45335,710823.8970164629,21,72,17,-2.01501,51.675 +45335,74470.03211707929,21,73,17,-2.01501,51.685 +45335,754576.2995381241,22,71,17,-2.005,51.665 +45335,770409.9489670037,22,72,17,-2.005,51.675 +45335,267111.06136320217,22,73,17,-2.005,51.685 +45335,770409.9489670037,23,72,17,-1.995,51.675 +45335,759427.3314299228,23,73,17,-1.995,51.685 +45335,770563.3771929154,24,71,17,-1.98499,51.665 +45335,673041.478416246,24,72,17,-1.98499,51.675 +45335,581842.3107594186,24,73,17,-1.98499,51.685 +45335,346145.7208203935,25,71,17,-1.97498,51.665 +45335,5227.110368987601,25,72,17,-1.97498,51.675 +45335,192496.39671867166,23,74,17,-1.995,51.695 +45335,90460.79386852724,24,74,17,-1.98499,51.695 +45379,491209.97686555184,19,69,27,-2.03503,51.645 +45379,770746.6014639866,19,70,27,-2.03503,51.655 +45379,571286.700777996,19,71,27,-2.03503,51.665 +45379,5390.720136128374,20,68,27,-2.02502,51.635 +45379,722921.3321565578,20,69,27,-2.02502,51.645 +45379,770746.6014639561,20,70,27,-2.02502,51.655 +45379,770563.8523377388,20,71,27,-2.02502,51.665 +45379,143887.2049118459,20,72,27,-2.02502,51.675 +45379,594468.1804785177,21,69,27,-2.01501,51.645 +45379,770686.7791778758,21,70,27,-2.01501,51.655 +45379,285000.18183772924,21,71,27,-2.01501,51.665 +45379,289.36473103138877,21,72,27,-2.01501,51.675 +45379,530182.1005530214,22,69,27,-2.005,51.645 +45379,16005.590343855169,22,71,27,-2.005,51.665 +45379,186596.95055956754,15,70,27,-2.07501,51.655 +45379,474996.7135691736,15,71,27,-2.07501,51.665 +45379,5382.963087961355,16,69,27,-2.065,51.645 +45379,690416.5784579928,16,70,27,-2.065,51.655 +45379,732988.4367404213,16,71,27,-2.065,51.665 +45379,21326.345845087126,16,72,27,-2.065,51.675 +45379,10758.399753626876,17,69,27,-2.05499,51.645 +45379,736510.5176222838,17,70,27,-2.05499,51.655 +45379,693821.9451396705,17,71,27,-2.05499,51.665 +45379,21346.70261572877,17,72,27,-2.05499,51.675 +45379,116370.01994454888,18,69,27,-2.04504,51.645 +45379,741574.5574108402,18,70,27,-2.04504,51.655 +45379,421412.42198868404,18,71,27,-2.04504,51.665 +45390,0,14,67,1,-2.08496,51.625 +45398,0,14,67,1,-2.08496,51.625 diff --git a/tests/compare/gis/x-x/comid_lat_lon_z.csv b/tests/compare/gis/x-x/comid_lat_lon_z.csv new file mode 100644 index 0000000..8948297 --- /dev/null +++ b/tests/compare/gis/x-x/comid_lat_lon_z.csv @@ -0,0 +1,10 @@ +rivid,lat,lon,z +17880830,38.27495900388607,-106.49661969412226,0.0 +17880268,38.26393714825848,-106.44347678466951,0.0 +17880832,38.262818826634984,-106.46992625081815,0.0 +17880258,38.2801335633626,-106.45474032038857,0.0 +17880298,38.21769269378019,-106.47094451961267,0.0 +17880284,38.23166800178719,-106.47629365649524,0.0 +17880282,38.233653357746064,-106.46758637698422,0.0 +17880836,38.25139225972157,-106.45604669355333,0.0 +17880834,38.260799322005575,-106.46167313145538,0.0 diff --git a/tests/compare/gis/x-x/k.csv b/tests/compare/gis/x-x/k.csv new file mode 100644 index 0000000..99d0a01 --- /dev/null +++ b/tests/compare/gis/x-x/k.csv @@ -0,0 +1,9 @@ +943.4425 +1542.6985 +3538.185 +3838.45 +2802.6145 +9644.39 +7143.045 +4714.1849999999995 +2540.5835 diff --git a/tests/compare/gis/x-x/kfac.csv b/tests/compare/gis/x-x/kfac.csv new file mode 100644 index 0000000..18fd739 --- /dev/null +++ b/tests/compare/gis/x-x/kfac.csv @@ -0,0 +1,9 @@ +2695.55 +4407.71 +10109.1 +10967.0 +8007.47 +27555.4 +20408.7 +13469.1 +7258.81 diff --git a/tests/compare/gis/x-x/kfac1.csv b/tests/compare/gis/x-x/kfac1.csv new file mode 100644 index 0000000..acfbc1a --- /dev/null +++ b/tests/compare/gis/x-x/kfac1.csv @@ -0,0 +1,9 @@ +2167.2 +5976.0 +9169.2 +7034.4 +5252.4 +32367.6 +20610.0 +14774.4 +7527.6 diff --git a/tests/compare/gis/x-x/kfac2.csv b/tests/compare/gis/x-x/kfac2.csv new file mode 100644 index 0000000..5abe4d8 --- /dev/null +++ b/tests/compare/gis/x-x/kfac2.csv @@ -0,0 +1,9 @@ +1502.21 +4260.52 +9771.51 +10600.8 +7740.09 +31240.7 +19727.2 +13019.3 +7016.43 diff --git a/tests/compare/gis/x-x/qinit_erai_t511_3hr_20030121to20030122.csv b/tests/compare/gis/x-x/qinit_erai_t511_3hr_20030121to20030122.csv new file mode 100644 index 0000000..7ddf29a --- /dev/null +++ b/tests/compare/gis/x-x/qinit_erai_t511_3hr_20030121to20030122.csv @@ -0,0 +1,9 @@ +0.0 +8.56029237184e-06 +0.000305152498186 +0.00545477913693 +0.00958865135908 +0.00229106796905 +0.000404788268497 +4.18915078626e-05 +3.08269300149e-05 diff --git a/tests/compare/gis/x-x/rapid_connect.csv b/tests/compare/gis/x-x/rapid_connect.csv new file mode 100644 index 0000000..5e2670e --- /dev/null +++ b/tests/compare/gis/x-x/rapid_connect.csv @@ -0,0 +1,9 @@ +17880258,17880834,0,0,0 +17880268,17880836,0,0,0 +17880282,17880298,2,17880836,17880834 +17880284,17880298,2,17880830,17880832 +17880298,-1,2,17880284,17880282 +17880830,17880284,0,0,0 +17880832,17880284,0,0,0 +17880834,17880282,1,17880258,0 +17880836,17880282,1,17880268,0 diff --git a/tests/compare/gis/x-x/rapid_connect_nhd.csv b/tests/compare/gis/x-x/rapid_connect_nhd.csv new file mode 100644 index 0000000..5e2670e --- /dev/null +++ b/tests/compare/gis/x-x/rapid_connect_nhd.csv @@ -0,0 +1,9 @@ +17880258,17880834,0,0,0 +17880268,17880836,0,0,0 +17880282,17880298,2,17880836,17880834 +17880284,17880298,2,17880830,17880832 +17880298,-1,2,17880284,17880282 +17880830,17880284,0,0,0 +17880832,17880284,0,0,0 +17880834,17880282,1,17880258,0 +17880836,17880282,1,17880268,0 diff --git a/tests/compare/gis/x-x/riv_bas_id.csv b/tests/compare/gis/x-x/riv_bas_id.csv new file mode 100644 index 0000000..21e90e3 --- /dev/null +++ b/tests/compare/gis/x-x/riv_bas_id.csv @@ -0,0 +1,9 @@ +17880834 +17880836 +17880282 +17880284 +17880298 +17880258 +17880832 +17880268 +17880830 diff --git a/tests/compare/gis/x-x/weight_area.csv b/tests/compare/gis/x-x/weight_area.csv new file mode 100644 index 0000000..a09ac13 --- /dev/null +++ b/tests/compare/gis/x-x/weight_area.csv @@ -0,0 +1,10 @@ +rivid,area_sqm,lon_index,lat_index,npoints,lsm_grid_lon,lsm_grid_lat +17880258,0,782,139,1,15.625,-25.125 +17880268,0,782,139,1,15.625,-25.125 +17880282,0,782,139,1,15.625,-25.125 +17880284,0,782,139,1,15.625,-25.125 +17880298,0,782,139,1,15.625,-25.125 +17880830,0,782,139,1,15.625,-25.125 +17880832,0,782,139,1,15.625,-25.125 +17880834,0,782,139,1,15.625,-25.125 +17880836,0,782,139,1,15.625,-25.125 diff --git a/tests/compare/gis/x-x/weight_ecmwf_t1279.csv b/tests/compare/gis/x-x/weight_ecmwf_t1279.csv new file mode 100644 index 0000000..c28282a --- /dev/null +++ b/tests/compare/gis/x-x/weight_ecmwf_t1279.csv @@ -0,0 +1,17 @@ +rivid,area_sqm,lon_index,lat_index,npoints,lsm_grid_lon,lsm_grid_lat +17880258,0,3604,733,1,-106.59375,38.418276813744853 +17880268,1790099.9932709397,3606,735,1,-106.453125,38.277679278560143 +17880282,153126.88768082776,3606,735,2,-106.453125,38.277679278560143 +17880282,1874573.1000156773,3606,736,2,-106.453125,38.20738051096145 +17880284,1539000.0578630047,3606,736,1,-106.453125,38.20738051096145 +17880298,603000.0084462471,3606,736,1,-106.453125,38.20738051096145 +17880830,462680.7952628888,3605,734,6,-106.5234375,38.347978046154616 +17880830,13561031.515948609,3605,735,6,-106.5234375,38.277679278560143 +17880830,2.036786097111665,3605,736,6,-106.5234375,38.20738051096145 +17880830,788785.3648360601,3606,734,6,-106.453125,38.347978046154616 +17880830,10195969.86965246,3606,735,6,-106.453125,38.277679278560143 +17880830,235630.26788878735,3606,736,6,-106.453125,38.20738051096145 +17880832,7959506.341078113,3606,735,2,-106.453125,38.277679278560143 +17880832,173793.59759493425,3606,736,2,-106.453125,38.20738051096145 +17880834,2515500.0234715943,3606,735,1,-106.453125,38.277679278560143 +17880836,3918600.033181359,3606,735,1,-106.453125,38.277679278560143 diff --git a/tests/compare/gis/x-x/weight_ecmwf_tco639.csv b/tests/compare/gis/x-x/weight_ecmwf_tco639.csv new file mode 100644 index 0000000..9154821 --- /dev/null +++ b/tests/compare/gis/x-x/weight_ecmwf_tco639.csv @@ -0,0 +1,12 @@ +rivid,area_sqm,lon_index,lat_index,npoints,lsm_grid_lon,lsm_grid_lat +17880258,0,1801,365,1,-106.734375,38.5864861673127 +17880268,1790099.9932709397,1803,367,1,-106.453125,38.305346022636385 +17880282,1369745.7895350915,1803,367,2,-106.453125,38.305346022636385 +17880282,657954.2012280006,1803,368,2,-106.453125,38.164775950196741 +17880284,635981.820088995,1803,367,2,-106.453125,38.305346022636385 +17880284,903018.2360333898,1803,368,2,-106.453125,38.164775950196741 +17880298,603000.0084462471,1803,368,1,-106.453125,38.164775950196741 +17880830,25244100.086063065,1803,367,1,-106.453125,38.305346022636385 +17880832,8133299.9384264555,1803,367,1,-106.453125,38.305346022636385 +17880834,2515500.0234715943,1803,367,1,-106.453125,38.305346022636385 +17880836,3918600.033181359,1803,367,1,-106.453125,38.305346022636385 diff --git a/tests/compare/gis/x-x/weight_era_t159.csv b/tests/compare/gis/x-x/weight_era_t159.csv new file mode 100644 index 0000000..1f63ad2 --- /dev/null +++ b/tests/compare/gis/x-x/weight_era_t159.csv @@ -0,0 +1,10 @@ +rivid,area_sqm,lon_index,lat_index,npoints,lsm_grid_lon,lsm_grid_lat +17880258,0,224,44,1,-108.0,40.5 +17880268,1790099.9932709397,225,46,1,-106.875,38.25 +17880282,2027699.9924406856,225,46,1,-106.875,38.25 +17880284,1539000.0578630047,225,46,1,-106.875,38.25 +17880298,603000.0084462471,225,46,1,-106.875,38.25 +17880830,25244100.086063065,225,46,1,-106.875,38.25 +17880832,8133299.9384264555,225,46,1,-106.875,38.25 +17880834,2515500.0234715943,225,46,1,-106.875,38.25 +17880836,3918600.033181359,225,46,1,-106.875,38.25 diff --git a/tests/compare/gis/x-x/weight_era_t255.csv b/tests/compare/gis/x-x/weight_era_t255.csv new file mode 100644 index 0000000..c1e79a1 --- /dev/null +++ b/tests/compare/gis/x-x/weight_era_t255.csv @@ -0,0 +1,14 @@ +rivid,area_sqm,lon_index,lat_index,npoints,lsm_grid_lon,lsm_grid_lat +17880258,0,505,102,1,-107.5,39.0 +17880268,1790099.9932709397,507,103,1,-106.5,38.5 +17880282,2027699.9924406856,507,104,1,-106.5,38.0 +17880284,1539000.0578630047,507,104,1,-106.5,38.0 +17880298,603000.0084462471,507,104,1,-106.5,38.0 +17880830,24277384.365009602,507,103,2,-106.5,38.5 +17880830,966715.7213738186,507,104,2,-106.5,38.0 +17880832,7220569.2090924345,507,103,2,-106.5,38.5 +17880832,912730.7286842655,507,104,2,-106.5,38.0 +17880834,2158260.5324247293,507,103,2,-106.5,38.5 +17880834,357239.48561025114,507,104,2,-106.5,38.0 +17880836,3354625.4548501438,507,103,2,-106.5,38.5 +17880836,563974.582995896,507,104,2,-106.5,38.0 diff --git a/tests/compare/gis/x-x/weight_era_t511.csv b/tests/compare/gis/x-x/weight_era_t511.csv new file mode 100644 index 0000000..95c6390 --- /dev/null +++ b/tests/compare/gis/x-x/weight_era_t511.csv @@ -0,0 +1,13 @@ +rivid,area_sqm,lon_index,lat_index,npoints,lsm_grid_lon,lsm_grid_lat +17880258,0,720,145,1,-106.875,38.809734166395877 +17880268,1790099.9932709397,721,147,1,-106.5234375,38.107295687204726 +17880282,2027699.9924406856,721,147,1,-106.5234375,38.107295687204726 +17880284,1539000.0578630047,721,147,1,-106.5234375,38.107295687204726 +17880298,603000.0084462471,721,147,1,-106.5234375,38.107295687204726 +17880830,14931602.816485418,721,146,2,-106.5234375,38.458514928127514 +17880830,10312496.9799969,721,147,2,-106.5234375,38.107295687204726 +17880832,3137213.5897901226,721,146,2,-106.5234375,38.458514928127514 +17880832,4996086.335566437,721,147,2,-106.5234375,38.107295687204726 +17880834,2515500.0234715943,721,147,1,-106.5234375,38.107295687204726 +17880836,4342.992958308709,721,146,2,-106.5234375,38.458514928127514 +17880836,3914256.613092825,721,147,2,-106.5234375,38.107295687204726 diff --git a/tests/compare/gis/x-x/weight_gldas2.csv b/tests/compare/gis/x-x/weight_gldas2.csv new file mode 100644 index 0000000..c6c42d8 --- /dev/null +++ b/tests/compare/gis/x-x/weight_gldas2.csv @@ -0,0 +1,15 @@ +rivid,area_sqm,lon_index,lat_index,npoints,lsm_grid_lon,lsm_grid_lat +17880258,0,292,391,1,-106.875,37.875 +17880268,1790099.9932709397,294,393,1,-106.375,38.375 +17880282,2027699.9924406856,294,392,1,-106.375,38.125 +17880284,1539000.0578630047,294,392,1,-106.375,38.125 +17880298,603000.0084462471,294,392,1,-106.375,38.125 +17880830,6862561.165398135,293,393,3,-106.625,38.375 +17880830,966715.7213738186,294,392,3,-106.375,38.125 +17880830,17414823.2660081,294,393,3,-106.375,38.375 +17880832,912730.7286842655,294,392,2,-106.375,38.125 +17880832,7220569.2090924345,294,393,2,-106.375,38.375 +17880834,357239.48561025114,294,392,2,-106.375,38.125 +17880834,2158260.5324247293,294,393,2,-106.375,38.375 +17880836,563974.582995896,294,392,2,-106.375,38.125 +17880836,3354625.4548501438,294,393,2,-106.375,38.375 diff --git a/tests/compare/gis/x-x/weight_nldas.csv b/tests/compare/gis/x-x/weight_nldas.csv new file mode 100644 index 0000000..2414e56 --- /dev/null +++ b/tests/compare/gis/x-x/weight_nldas.csv @@ -0,0 +1,15 @@ +FEATUREID,area_sqm,lon_index,lat_index,npoints +17880258,0,148,105,1 +17880268,1790100.0050404102,148,106,1 +17880282,2027699.7955933737,148,105,1 +17880284,1538999.6149864085,148,105,1 +17880298,602999.8625117091,148,105,1 +17880830,1022501.5475447015,148,105,3 +17880830,17630312.052612178,148,106,3 +17880830,6591285.597839415,147,106,3 +17880832,955363.1123615956,148,105,2 +17880832,7177937.130276213,148,106,2 +17880834,390518.92356583173,148,105,2 +17880834,2124981.0302708475,148,106,2 +17880836,620753.5064074501,148,105,2 +17880836,3297846.288935756,148,106,2 diff --git a/tests/compare/gis/x-x/weight_polygons.csv b/tests/compare/gis/x-x/weight_polygons.csv new file mode 100644 index 0000000..a09ac13 --- /dev/null +++ b/tests/compare/gis/x-x/weight_polygons.csv @@ -0,0 +1,10 @@ +rivid,area_sqm,lon_index,lat_index,npoints,lsm_grid_lon,lsm_grid_lat +17880258,0,782,139,1,15.625,-25.125 +17880268,0,782,139,1,15.625,-25.125 +17880282,0,782,139,1,15.625,-25.125 +17880284,0,782,139,1,15.625,-25.125 +17880298,0,782,139,1,15.625,-25.125 +17880830,0,782,139,1,15.625,-25.125 +17880832,0,782,139,1,15.625,-25.125 +17880834,0,782,139,1,15.625,-25.125 +17880836,0,782,139,1,15.625,-25.125 diff --git a/tests/compare/gis/x-x/x.csv b/tests/compare/gis/x-x/x.csv new file mode 100644 index 0000000..d916b69 --- /dev/null +++ b/tests/compare/gis/x-x/x.csv @@ -0,0 +1,9 @@ +0.3 +0.3 +0.3 +0.3 +0.3 +0.3 +0.3 +0.3 +0.3 diff --git a/tests/compare/inflow/Qout_erai_t511_3hr_20030121to20030122.nc b/tests/compare/inflow/Qout_erai_t511_3hr_20030121to20030122.nc new file mode 100644 index 0000000..58d581b Binary files /dev/null and b/tests/compare/inflow/Qout_erai_t511_3hr_20030121to20030122.nc differ diff --git a/tests/compare/inflow/Qout_erai_t511_3hr_20030121to20030122_init.nc b/tests/compare/inflow/Qout_erai_t511_3hr_20030121to20030122_init.nc new file mode 100644 index 0000000..4f3442d Binary files /dev/null and b/tests/compare/inflow/Qout_erai_t511_3hr_20030121to20030122_init.nc differ diff --git a/tests/compare/inflow/m3_riv_bas_cmip5_cmip5_24hr_20010101to20010103.nc b/tests/compare/inflow/m3_riv_bas_cmip5_cmip5_24hr_20010101to20010103.nc new file mode 100644 index 0000000..14e624e Binary files /dev/null and b/tests/compare/inflow/m3_riv_bas_cmip5_cmip5_24hr_20010101to20010103.nc differ diff --git a/tests/compare/inflow/m3_riv_bas_era_20cm_t159_3hr_20000129to20000130_0.nc b/tests/compare/inflow/m3_riv_bas_era_20cm_t159_3hr_20000129to20000130_0.nc new file mode 100644 index 0000000..ca5f339 Binary files /dev/null and b/tests/compare/inflow/m3_riv_bas_era_20cm_t159_3hr_20000129to20000130_0.nc differ diff --git a/tests/compare/inflow/m3_riv_bas_era_20cm_t159_3hr_20000129to20000130_1.nc b/tests/compare/inflow/m3_riv_bas_era_20cm_t159_3hr_20000129to20000130_1.nc new file mode 100644 index 0000000..f3cf372 Binary files /dev/null and b/tests/compare/inflow/m3_riv_bas_era_20cm_t159_3hr_20000129to20000130_1.nc differ diff --git a/tests/compare/inflow/m3_riv_bas_era_20cm_t159_3hr_20000129to20000130_2.nc b/tests/compare/inflow/m3_riv_bas_era_20cm_t159_3hr_20000129to20000130_2.nc new file mode 100644 index 0000000..066fd45 Binary files /dev/null and b/tests/compare/inflow/m3_riv_bas_era_20cm_t159_3hr_20000129to20000130_2.nc differ diff --git a/tests/compare/inflow/m3_riv_bas_era_20cm_t159_3hr_20000129to20000130_3.nc b/tests/compare/inflow/m3_riv_bas_era_20cm_t159_3hr_20000129to20000130_3.nc new file mode 100644 index 0000000..648679a Binary files /dev/null and b/tests/compare/inflow/m3_riv_bas_era_20cm_t159_3hr_20000129to20000130_3.nc differ diff --git a/tests/compare/inflow/m3_riv_bas_era_20cm_t159_3hr_20000129to20000130_4.nc b/tests/compare/inflow/m3_riv_bas_era_20cm_t159_3hr_20000129to20000130_4.nc new file mode 100644 index 0000000..079c78b Binary files /dev/null and b/tests/compare/inflow/m3_riv_bas_era_20cm_t159_3hr_20000129to20000130_4.nc differ diff --git a/tests/compare/inflow/m3_riv_bas_era_20cm_t159_3hr_20000129to20000130_5.nc b/tests/compare/inflow/m3_riv_bas_era_20cm_t159_3hr_20000129to20000130_5.nc new file mode 100644 index 0000000..2b90b49 Binary files /dev/null and b/tests/compare/inflow/m3_riv_bas_era_20cm_t159_3hr_20000129to20000130_5.nc differ diff --git a/tests/compare/inflow/m3_riv_bas_era_20cm_t159_3hr_20000129to20000130_6.nc b/tests/compare/inflow/m3_riv_bas_era_20cm_t159_3hr_20000129to20000130_6.nc new file mode 100644 index 0000000..cf98941 Binary files /dev/null and b/tests/compare/inflow/m3_riv_bas_era_20cm_t159_3hr_20000129to20000130_6.nc differ diff --git a/tests/compare/inflow/m3_riv_bas_era_20cm_t159_3hr_20000129to20000130_7.nc b/tests/compare/inflow/m3_riv_bas_era_20cm_t159_3hr_20000129to20000130_7.nc new file mode 100644 index 0000000..9839caf Binary files /dev/null and b/tests/compare/inflow/m3_riv_bas_era_20cm_t159_3hr_20000129to20000130_7.nc differ diff --git a/tests/compare/inflow/m3_riv_bas_era_20cm_t159_3hr_20000129to20000130_8.nc b/tests/compare/inflow/m3_riv_bas_era_20cm_t159_3hr_20000129to20000130_8.nc new file mode 100644 index 0000000..a782130 Binary files /dev/null and b/tests/compare/inflow/m3_riv_bas_era_20cm_t159_3hr_20000129to20000130_8.nc differ diff --git a/tests/compare/inflow/m3_riv_bas_era_20cm_t159_3hr_20000129to20000130_9.nc b/tests/compare/inflow/m3_riv_bas_era_20cm_t159_3hr_20000129to20000130_9.nc new file mode 100644 index 0000000..1d193c4 Binary files /dev/null and b/tests/compare/inflow/m3_riv_bas_era_20cm_t159_3hr_20000129to20000130_9.nc differ diff --git a/tests/compare/inflow/m3_riv_bas_erai_t255_3hr_20140820to20140821.nc b/tests/compare/inflow/m3_riv_bas_erai_t255_3hr_20140820to20140821.nc new file mode 100644 index 0000000..5161b2a Binary files /dev/null and b/tests/compare/inflow/m3_riv_bas_erai_t255_3hr_20140820to20140821.nc differ diff --git a/tests/compare/inflow/m3_riv_bas_erai_t511_24hr_19990109to19990110.nc b/tests/compare/inflow/m3_riv_bas_erai_t511_24hr_19990109to19990110.nc new file mode 100644 index 0000000..57abd56 Binary files /dev/null and b/tests/compare/inflow/m3_riv_bas_erai_t511_24hr_19990109to19990110.nc differ diff --git a/tests/compare/inflow/m3_riv_bas_erai_t511_3hr_20030121to20030122.nc b/tests/compare/inflow/m3_riv_bas_erai_t511_3hr_20030121to20030122.nc new file mode 100644 index 0000000..f7156d5 Binary files /dev/null and b/tests/compare/inflow/m3_riv_bas_erai_t511_3hr_20030121to20030122.nc differ diff --git a/tests/compare/inflow/m3_riv_bas_met_office_joules_3hr_20080803to20080803.nc b/tests/compare/inflow/m3_riv_bas_met_office_joules_3hr_20080803to20080803.nc new file mode 100644 index 0000000..b84c07a Binary files /dev/null and b/tests/compare/inflow/m3_riv_bas_met_office_joules_3hr_20080803to20080803.nc differ diff --git a/tests/compare/inflow/m3_riv_bas_nasa_gldas2_3hr_20101231to20101231.nc b/tests/compare/inflow/m3_riv_bas_nasa_gldas2_3hr_20101231to20101231.nc new file mode 100644 index 0000000..e08b21e Binary files /dev/null and b/tests/compare/inflow/m3_riv_bas_nasa_gldas2_3hr_20101231to20101231.nc differ diff --git a/tests/compare/inflow/m3_riv_bas_nasa_lis_3hr_20110121to20110121.nc b/tests/compare/inflow/m3_riv_bas_nasa_lis_3hr_20110121to20110121.nc new file mode 100644 index 0000000..de650b9 Binary files /dev/null and b/tests/compare/inflow/m3_riv_bas_nasa_lis_3hr_20110121to20110121.nc differ diff --git a/tests/compare/inflow/m3_riv_bas_nasa_nldas_3hr_20030121to20030121.nc b/tests/compare/inflow/m3_riv_bas_nasa_nldas_3hr_20030121to20030121.nc new file mode 100644 index 0000000..f66c963 Binary files /dev/null and b/tests/compare/inflow/m3_riv_bas_nasa_nldas_3hr_20030121to20030121.nc differ diff --git a/tests/compare/inflow/m3_riv_bas_wrf_wrf_1hr_20080601to20080601.nc b/tests/compare/inflow/m3_riv_bas_wrf_wrf_1hr_20080601to20080601.nc new file mode 100644 index 0000000..7db545a Binary files /dev/null and b/tests/compare/inflow/m3_riv_bas_wrf_wrf_1hr_20080601to20080601.nc differ diff --git a/tests/compare/inflow/qinit_erai_t511_3hr_20030121to20030122.csv b/tests/compare/inflow/qinit_erai_t511_3hr_20030121to20030122.csv new file mode 100644 index 0000000..a824d50 --- /dev/null +++ b/tests/compare/inflow/qinit_erai_t511_3hr_20030121to20030122.csv @@ -0,0 +1,9 @@ +0.0 +7.04012348477e-42 +5.09207197011e-16 +9.1273015812e-09 +1.48859635729e-08 +4.51591875006e-09 +6.52369781459e-12 +9.04366489872e-17 +4.44216450415e-26 diff --git a/tests/compare/new_timeseries_file.csv b/tests/compare/new_timeseries_file.csv new file mode 100644 index 0000000..15cc551 --- /dev/null +++ b/tests/compare/new_timeseries_file.csv @@ -0,0 +1,16 @@ +0,0.10073 +1,0.87412 +2,1.80970 +3,2.72844 +4,3.83714 +5,5.07205 +6,6.37279 +7,7.72781 +8,9.08265 +9,10.43755 +10,12.04025 +11,13.78219 +12,15.36506 +13,16.90097 +14,18.36924 +15,19.49250 diff --git a/tests/compare/original_timeseries-notime.csv b/tests/compare/original_timeseries-notime.csv new file mode 100644 index 0000000..2be02c5 --- /dev/null +++ b/tests/compare/original_timeseries-notime.csv @@ -0,0 +1,16 @@ +0,0.100733 +1,0.874117 +2,1.8097 +3,2.72844 +4,3.83714 +5,5.07205 +6,6.37279 +7,7.72781 +8,9.08265 +9,10.4376 +10,12.0402 +11,13.7822 +12,15.3651 +13,16.901 +14,18.3692 +15,19.4925 diff --git a/tests/compare/original_timeseries.csv b/tests/compare/original_timeseries.csv new file mode 100644 index 0000000..62fa580 --- /dev/null +++ b/tests/compare/original_timeseries.csv @@ -0,0 +1,16 @@ +1901/12/13 20:00,0.10073 +1901/12/13 20:00,0.87412 +1901/12/13 20:00,1.80970 +1901/12/13 20:00,2.72844 +1901/12/13 20:00,3.83714 +1901/12/13 20:00,5.07205 +1901/12/13 20:00,6.37279 +1901/12/13 20:00,7.72781 +1901/12/13 20:00,9.08265 +1901/12/13 20:00,10.43755 +1901/12/13 20:00,12.04025 +1901/12/13 20:00,13.78219 +1901/12/13 20:00,15.36506 +1901/12/13 20:00,16.90097 +1901/12/13 20:00,18.36922 +1901/12/13 20:00,19.49250 diff --git a/tests/compare/qinit_cf_rapid_qout.csv b/tests/compare/qinit_cf_rapid_qout.csv new file mode 100644 index 0000000..e900513 --- /dev/null +++ b/tests/compare/qinit_cf_rapid_qout.csv @@ -0,0 +1,4168 @@ +0.0709983110428 +0.0197978802025 +0.045647945255 +0.841656982899 +0.0273679923266 +0.0297174248844 +0.8930773139 +0.494201928377 +0.0239119809121 +0.0118896169588 +0.0311464462429 +0.434212744236 +0.412601292133 +0.0184035301208 +0.380826205015 +0.137718349695 +0.240628570318 +0.0836737006903 +0.144485831261 +0.0274386573583 +0.0518918484449 +0.0162808895111 +0.0219210516661 +0.101444676518 +0.129517823458 +0.0730053856969 +0.0188900865614 +0.022443074733 +0.0244337581098 +0.0157952532172 +0.153784543276 +0.0439427271485 +1.0311601162 +1.23936629295 +1.06454908848 +0.0466517098248 +0.205162554979 +0.0272792633623 +0.0316513441503 +0.076557919383 +0.0880836322904 +0.0182171687484 +0.337380468845 +0.0430749766529 +0.0220035258681 +0.0892419815063 +0.244373947382 +0.0383335389197 +0.0421962253749 +0.225243449211 +0.0261257272214 +0.286625564098 +0.405446618795 +0.417085111141 +0.0528923459351 +0.118865743279 +0.0526142381132 +0.449380248785 +0.540100634098 +0.0326075330377 +0.0115400161594 +0.0642992779613 +0.175647333264 +0.0250273812562 +0.014417745173 +0.330610215664 +0.0527734048665 +0.0113064739853 +0.00377331511118 +0.102631598711 +0.289518266916 +0.0275300275534 +0.2743935287 +0.0149571401998 +0.0405787043273 +0.0556639432907 +0.00527881504968 +0.0327134057879 +0.0446506142616 +0.0157618168741 +0.0728545635939 +0.0371651574969 +0.150915011764 +0.0115424990654 +0.187638178468 +0.760790765285 +0.0372349023819 +0.0241839922965 +0.00395673653111 +0.0289454758167 +0.0198397710919 +0.0489251054823 +0.449902266264 +0.498380661011 +0.0348210483789 +0.0159324668348 +0.058790192008 +0.307313889265 +0.045764323324 +1.32117879391 +1.28560352325 +0.0115650771186 +0.221572890878 +0.266303837299 +0.0260501280427 +0.0251840036362 +0.0386416465044 +0.0276631806046 +1.22602152824 +0.0893276408315 +1.23303556442 +0.0218224357814 +0.0256667565554 +0.0527608953416 +0.0778591930866 +0.0161910075694 +0.067379206419 +0.0107061220333 +0.0122497584671 +1.21515607834 +0.231862202287 +0.225810393691 +0.175977438688 +0.101323984563 +0.000438736111391 +0.144064441323 +0.0451430156827 +0.00820989627391 +1.16231954098 +0.762065887451 +0.00373007240705 +0.00734034040943 +0.213077709079 +0.0199580173939 +0.063537940383 +0.0240259878337 +0.0103235989809 +0.0172823686153 +0.0183451380581 +0.73485827446 +0.239456906915 +0.0899942442775 +0.0161919742823 +0.329440921545 +0.0233093611896 +0.0756803452969 +0.014086663723 +0.16657550633 +0.012425404042 +1.09587848186 +0.018269604072 +0.00512381549925 +0.0103986859322 +0.854921519756 +0.0926964432001 +0.191820710897 +0.0711583644152 +0.00162283040117 +0.0924101695418 +0.0102090714499 +0.214781805873 +0.103554010391 +0.127438470721 +0.0157192163169 +0.0225146822631 +0.0870939344168 +0.0807019323111 +0.404913216829 +0.0507109500468 +0.0386963747442 +0.0234905667603 +0.38859590888 +0.15437823534 +0.00183965626638 +0.00607554288581 +0.0126646114513 +0.0341171361506 +0.169635310769 +0.00370854744688 +0.00365698826499 +0.0405299328268 +0.0922705084085 +0.197741553187 +0.341524720192 +0.0343849435449 +0.0111126331612 +0.358335316181 +0.699371755123 +0.0445101968944 +0.0199910346419 +1.02079451084 +0.0157361105084 +0.0141076436266 +0.0232769437134 +0.037728741765 +0.0279603898525 +0.0286086462438 +0.00425340607762 +0.0650210976601 +0.0500482842326 +0.00464736716822 +0.867228746414 +0.0179378818721 +0.0224419906735 +0.0977216139436 +0.153153866529 +0.23859629035 +0.0391640588641 +0.011293345131 +0.0140362959355 +0.042512152344 +0.0151293762028 +0.00930892489851 +0.0100472280756 +0.0215833168477 +0.595284223557 +0.0157548766583 +0.115722432733 +0.0485178753734 +0.00143130833749 +0.0121061345562 +0.0207088980824 +0.373078495264 +0.440707623959 +0.0134744439274 +0.0231894738972 +0.145047783852 +0.00657830014825 +0.000633752031717 +0.000505367061123 +0.0813249498606 +0.0124613344669 +0.100127883255 +0.0559331290424 +0.0234905332327 +0.0140936970711 +0.0286117978394 +0.0185144729912 +0.0139243770391 +0.0122450562194 +0.00206585437991 +0.0418982356787 +0.00804909318686 +0.131959691644 +0.00563279958442 +0.0317778326571 +0.0208682864904 +0.0066173938103 +1.00743067265 +0.567532062531 +1.1124278307 +0.861221909523 +0.000498305482324 +0.0210799947381 +0.23765732348 +0.0244807172567 +0.0201742984354 +0.000840217689984 +0.0171110201627 +0.0250259656459 +0.837169289589 +0.0310136638582 +0.0382004156709 +0.047613248229 +0.75314027071 +0.138265803456 +0.0860472917557 +0.0201456118375 +0.00188990111928 +0.00656977528706 +0.0410005152225 +0.000947150634602 +0.433957785368 +0.0339418500662 +0.0032253137324 +1.13909482956 +0.0322107002139 +0.151200532913 +0.0201753936708 +0.0379396751523 +0.0281855259091 +0.465946704149 +1.29578852654 +0.99991196394 +1.07108187675 +0.0138227725402 +0.0180657338351 +0.521752357483 +0.00102967908606 +1.29279661179 +1.08964085579 +0.0921404659748 +1.12365496159 +0.0335802957416 +0.0093994922936 +0.21683755517 +0.0216733124107 +0.821944475174 +0.00867140013725 +0.00708232773468 +0.024304298684 +0.614727079868 +0.137469470501 +0.0732535421848 +0.472655564547 +0.0165965314955 +0.00912951584905 +1.03891468048 +0.0686317458749 +0.0528170950711 +0.111041881144 +0.00593349291012 +0.0149862328544 +0.0070166150108 +1.01517927647 +0.0681132301688 +0.0134548805654 +0.0304568689317 +0.572710573673 +0.0764412581921 +0.00960399582982 +0.0119328107685 +0.0136840185151 +0.00394827127457 +0.0324527099729 +0.0124828573316 +0.0167858209461 +0.0146099729463 +0.12418205291 +0.0104522006586 +0.0319104380906 +0.00417962390929 +0.209963932633 +0.051688361913 +0.15465579927 +0.0363972522318 +0.0476641841233 +0.003718650667 +0.810990512371 +0.0276516918093 +0.810962617397 +0.0978299453855 +0.0102732870728 +0.288969755173 +0.0511126592755 +0.230285167694 +0.0624335110188 +0.00239404453896 +0.0217351578176 +0.00561527255923 +0.059411816299 +0.0540627352893 +0.707280278206 +0.074561573565 +0.0570547319949 +0.011802079156 +0.0180434007198 +0.00281815719791 +0.759155094624 +0.0535522513092 +0.0655637606978 +0.0956346318126 +0.00288984016515 +0.00611599115655 +0.0032838168554 +0.0346723794937 +0.00133149884641 +0.161470204592 +0.00880058482289 +0.00341086182743 +0.545935630798 +0.00364819006063 +0.304688572884 +0.0176177471876 +0.00204837857746 +0.0676531717181 +0.135096251965 +0.0521751567721 +0.0366011150181 +0.294567853212 +0.0220196172595 +0.0601621195674 +0.0199210513383 +0.21992957592 +0.167963624001 +0.0626557469368 +0.0199570283294 +0.0774586647749 +0.000522330810782 +0.0503603108227 +0.761107027531 +0.0099085541442 +0.163222327828 +0.566372871399 +0.142121940851 +0.018353363499 +0.0305821038783 +0.0897674188018 +0.0734696835279 +0.0355025455356 +0.127376541495 +0.0273814089596 +0.0653802081943 +0.00322870328091 +0.0178567357361 +0.00609037000686 +0.0447516962886 +0.00866442639381 +0.0517644919455 +0.01425064262 +0.00260508083738 +0.0114963296801 +0.165154352784 +0.173846423626 +0.211228683591 +0.00265642767772 +0.0402544252574 +0.715344011784 +0.280917525291 +0.0217705424875 +0.0124482112005 +0.00794430356473 +0.0097623616457 +0.0228740461171 +0.0117510957643 +0.175951555371 +0.0095505528152 +0.702513456345 +0.774873435497 +0.0144350547343 +0.186074838042 +0.0277739930898 +0.124781444669 +0.0266541335732 +0.00146896659862 +0.0298305004835 +0.518418610096 +0.0168643947691 +0.0563420504332 +0.00830397661775 +0.201766893268 +0.0329899080098 +0.000617192476057 +0.00783964246511 +0.373466014862 +0.0425495915115 +0.00778345158324 +0.251046955585 +0.00478349113837 +0.00179450109135 +0.00160503492225 +0.00412564398721 +0.0613330900669 +0.0193490553647 +0.029420055449 +0.2943533957 +0.31510618329 +0.30194196105 +0.779199004173 +0.0106520643458 +0.153502196074 +0.00666301930323 +0.0358144566417 +0.0016266850289 +0.381449133158 +0.787429094315 +0.329350322485 +0.484567433596 +0.076060526073 +0.0309830382466 +0.0132922120392 +0.00696803256869 +0.09043879807 +0.0155349280685 +0.00438973447308 +0.00369286048226 +0.0167440306395 +0.0108480332419 +0.104863725603 +0.00742371426895 +0.0159252006561 +0.0142395747826 +0.016336036846 +0.00674164388329 +0.0803968757391 +0.021752692759 +0.0207069087774 +0.0538440831006 +0.0013399401214 +0.00989096518606 +0.0149778053164 +0.00511629739776 +0.018821131438 +0.203805059195 +0.750977993011 +0.453287601471 +0.0325144194067 +0.24962054193 +0.0780024006963 +0.00678111054003 +0.0218626745045 +0.102734051645 +0.0375643000007 +0.178210288286 +0.0263351276517 +1.17401647568 +0.36615100503 +0.0529323369265 +0.00924047641456 +0.144571453333 +0.0278743151575 +0.156874075532 +0.353759437799 +0.0179212093353 +0.151663795114 +0.001154639991 +0.012744223699 +1.1318256855 +0.0323897302151 +0.0152871962637 +0.0963712930679 +1.15984332561 +0.019416468218 +0.0179200936109 +0.120823413134 +0.0373211726546 +0.0405641421676 +0.0133387623355 +0.00149750080891 +0.326892346144 +0.0301174651831 +0.00529327895492 +0.0270854569972 +0.0132006825879 +0.0144911613315 +0.0112794972956 +0.0166609045118 +0.0215298049152 +0.0184261891991 +0.0104471119121 +0.0175043847412 +0.0458331480622 +0.01768656075 +0.0791800767183 +0.0633707344532 +1.14572775364 +0.0740377902985 +0.0196091663092 +0.0342793613672 +0.0857672020793 +0.0539175868034 +0.052245542407 +0.0519083365798 +0.028570106253 +0.00101933465339 +0.00407002307475 +0.0309950374067 +0.0165474824607 +0.0802854895592 +0.0148520907387 +0.176424890757 +0.0457576327026 +0.0079328995198 +0.029535189271 +0.309285759926 +0.138387992978 +0.0321011729538 +0.00391073198989 +0.00558831030503 +0.00497306371108 +0.00738537590951 +0.0408320426941 +0.0108137568459 +0.0310604255646 +0.000781912298407 +0.00261485995725 +0.0120864510536 +0.00893734954298 +0.010707709007 +0.296869248152 +0.00952963996679 +0.014516633004 +0.118718340993 +0.0113162752241 +0.00687953503802 +0.0596293099225 +0.0109870824963 +0.0246276352555 +0.0829287692904 +0.0119819352403 +0.013191848062 +0.0428018644452 +1.09972822666 +0.0703752338886 +0.065942004323 +0.00449569011107 +0.00127127708402 +0.00471914792433 +0.014844388701 +0.00253735366277 +0.103892251849 +0.16729336977 +0.0170807912946 +0.00218843249604 +0.0370243228972 +0.0338677279651 +0.00863955635577 +0.0127724017948 +0.0275088939816 +0.00260291760787 +0.0388505719602 +0.126794233918 +0.063649058342 +0.0072547532618 +0.0031144649256 +0.00136651145294 +0.00915141496807 +0.0560588091612 +0.0298155266792 +0.00283054099418 +0.00097140413709 +1.10525560379 +0.0359210930765 +0.0125106312335 +0.0869894549251 +0.00274031562731 +0.0937623977661 +0.000257675565081 +0.176229849458 +0.0174107607454 +0.0880624949932 +0.0208958238363 +0.0168943423778 +0.153265148401 +0.283819168806 +0.0382587201893 +0.00709416158497 +0.0272753946483 +0.00719663640484 +0.117243736982 +0.0351523756981 +0.030278980732 +0.0250368174165 +0.0148227317259 +0.0821450427175 +0.0203957576305 +0.0110615575686 +0.00472516426817 +0.0445612184703 +1.12211358547 +0.0267140995711 +0.196520462632 +0.0515575408936 +0.0128204505891 +0.0439139008522 +0.00339889386669 +0.0251236539334 +0.0 +0.0265208203346 +0.502661108971 +0.0461802519858 +0.0212293434888 +0.183879360557 +0.0723556652665 +0.00104970938992 +0.0669703185558 +0.0028421652969 +0.0345045626163 +0.114977613091 +0.0624715723097 +0.0512121580541 +0.0292695555836 +0.00545043405145 +0.00325616518967 +0.0117990430444 +0.0121251828969 +1.58573555946 +0.116698212922 +0.00152979220729 +0.0059439856559 +0.0844685733318 +0.0763523280621 +0.00523121096194 +0.0662430524826 +0.0154143692926 +0.00835380330682 +0.240797027946 +0.011645433493 +0.12496689707 +0.128131836653 +0.133097216487 +0.0597082562745 +0.029734544456 +0.366732954979 +0.204741746187 +0.00523705035448 +0.017629172653 +0.0344966724515 +0.266538441181 +0.00420864205807 +0.00835175253451 +0.0113049708307 +0.136893957853 +0.0070553412661 +0.0129614006728 +0.0322098657489 +0.0167714562267 +0.0392103865743 +0.0983525514603 +0.00802320428193 +0.124154515564 +0.0368443988264 +0.00816752947867 +0.106908932328 +0.0492798350751 +0.0109666921198 +0.274926185608 +0.0253741294146 +0.398229897022 +0.00765643781051 +0.01723960042 +0.0131818996742 +0.00262648402713 +0.00487173954025 +0.0601119846106 +0.14776982367 +0.122912146151 +0.0257156584412 +0.0351732745767 +0.1892272681 +0.0144047308713 +0.0280653741211 +0.00338616524823 +0.0010648969328 +0.0 +0.00384240876883 +0.00730443652719 +0.00553840585053 +0.425108522177 +0.0114835314453 +0.207683548331 +0.00999312289059 +0.100420668721 +0.0543926693499 +0.0122716696933 +0.00283889798447 +0.0744462460279 +0.0523874536157 +0.298205792904 +0.26540902257 +0.0661127492785 +0.0720976516604 +0.0773084536195 +0.043013241142 +0.476095974445 +0.0112618934363 +0.1604424119 +0.00280672661029 +0.0190823748708 +0.0123415719718 +0.0048144813627 +0.0475064106286 +0.0030994724948 +0.360454261303 +0.025296388194 +0.0861650258303 +0.0327582657337 +0.0443968065083 +0.0919532626867 +0.00858432799578 +0.0 +0.122560225427 +0.0300105605274 +0.00483387056738 +0.00146845343988 +0.137186408043 +0.0526675023139 +0.215515956283 +0.0136993015185 +0.330388605595 +0.018294442445 +0.00558115867898 +0.0412765331566 +0.0460604652762 +0.0584178604186 +0.036884509027 +0.00654362514615 +0.0120458751917 +1.48995637894 +0.623394310474 +0.293580949306 +0.0794032514095 +2.1095161438 +0.00106626516208 +0.126294493675 +0.148138940334 +0.219461023808 +0.0191335026175 +0.0221957266331 +0.127997472882 +0.00128947256599 +0.350903660059 +0.0143104698509 +0.0223321840167 +0.440809696913 +0.00249935104512 +0.0247329287231 +0.00156929786317 +0.0105859609321 +0.00763718551025 +0.0102941924706 +0.0108849806711 +0.0569303706288 +0.0244013927877 +0.00284702144563 +0.0179852116853 +0.485671788454 +0.464833170176 +0.0798062905669 +0.0420563966036 +0.0140088591725 +0.194700479507 +0.00948090106249 +0.00672561116517 +0.0062727574259 +0.00413028756157 +0.241198197007 +0.00237969728187 +0.0437827371061 +0.00115932000335 +0.113964043558 +0.0 +0.0 +0.00306848157197 +0.0832711458206 +0.00166037061717 +0.0215544011444 +0.0462037920952 +0.245912700891 +0.00570630142465 +0.0136181358248 +0.0101096099243 +0.0211105979979 +0.00157522654627 +0.0122865093872 +0.0148672601208 +2.25244760513 +0.0191057715565 +0.0221997089684 +0.0997875779867 +0.0708925649524 +0.050049982965 +0.070711247623 +0.00343680381775 +0.302799582481 +0.00330888177268 +0.0237915366888 +0.0212486758828 +0.0584958232939 +0.0475127063692 +0.0622828640044 +0.109914794564 +0.0134446807206 +0.00314453337342 +0.00761426892132 +0.0249064192176 +0.00194000033662 +0.00118387793191 +0.247545838356 +0.0278719048947 +0.0179187040776 +0.224266126752 +0.0157381538302 +0.217557534575 +0.0172012038529 +0.125863611698 +2.41553997993 +0.00660566100851 +0.687487602234 +0.0124911125749 +0.0473008453846 +0.313272386789 +0.0242668036371 +0.492961734533 +0.491816222668 +0.0010274448432 +0.138199076056 +0.0115206986666 +0.0133215347305 +0.0390704646707 +0.338364243507 +0.00713057303801 +0.00197517452762 +0.378203898668 +2.63080954552 +0.519653916359 +0.00641197524965 +0.00614814087749 +0.00363446213305 +0.104298464954 +0.129685521126 +0.00310178869404 +0.0667780786753 +0.0207955688238 +0.360043913126 +0.00393017008901 +0.0209176521748 +0.102862074971 +0.0705372542143 +0.114473588765 +1.28540766239 +0.00106671336107 +0.0113980136812 +0.585847318172 +0.425417542458 +0.236339822412 +0.0216526798904 +0.0279287490994 +0.0 +0.00556123116985 +0.0575764998794 +0.402156710625 +0.404690623283 +0.160665154457 +0.144311830401 +0.113600626588 +0.063593544066 +0.0643945634365 +0.256091356277 +2.72872066498 +0.239361792803 +0.0151600241661 +2.98819231987 +0.00141793990042 +0.0895265564322 +0.370505034924 +1.16814517975 +1.2810510397 +0.0321745499969 +0.0 +0.01790262945 +0.0080095063895 +0.00989725906402 +0.099216632545 +0.797364413738 +0.00138125824742 +0.223528400064 +0.13856330514 +0.0607262402773 +0.0558269247413 +0.157879635692 +0.173408329487 +0.0441291518509 +0.0139452619478 +0.00502120750025 +0.227472826838 +0.00572668295354 +0.00112443685066 +0.0456725396216 +0.511388003826 +0.0769248083234 +0.0342860668898 +0.0144218979403 +0.00939569808543 +0.247180730104 +0.071697704494 +0.0408170707524 +0.0285098440945 +0.00737059302628 +1.29160797596 +0.107232257724 +0.623469471931 +0.0099716829136 +0.0 +0.0 +0.0113775897771 +0.00782941002399 +0.429535150528 +0.51352506876 +0.00470771174878 +0.00113325507846 +0.00198734016158 +2.88711428642 +0.0290466081351 +0.0112119810656 +0.00307531654835 +0.0395762175322 +0.0135582983494 +0.0368311740458 +0.195843309164 +0.00238563446328 +0.0299189910293 +0.493610739708 +0.0136174252257 +0.0206767078489 +0.010808898136 +0.0209317784756 +0.414968878031 +0.00840398203582 +0.547018051147 +0.621453285217 +0.00482421182096 +0.0197707433254 +1.2761079073 +0.46202558279 +0.652574121952 +0.00862785894424 +0.0318227857351 +0.00434947712347 +0.0611625090241 +0.00803371705115 +0.00431066006422 +0.456771880388 +0.00830079242587 +0.563770830631 +0.173421666026 +0.0350933670998 +0.0246105324477 +0.145459786057 +2.84047007561 +0.0660370439291 +0.0941472128034 +0.0392650552094 +0.00194996967912 +0.00562708079815 +0.192867919803 +0.817269325256 +0.0341623462737 +0.127501875162 +0.904283225536 +0.002769298153 +0.173328757286 +0.1100987643 +0.0155957043171 +0.000759758870117 +0.000991156091914 +0.0390579178929 +0.523185372353 +2.38688278198 +0.0242650527507 +0.86848372221 +0.0609414540231 +0.405170291662 +0.0230553466827 +0.0180403701961 +0.010926364921 +0.0273634716868 +0.0256537310779 +0.00196490017697 +0.000982347060926 +0.349391579628 +0.0175305753946 +0.0336840488017 +0.129313111305 +0.0100401658565 +1.71803843975 +0.0009666782571 +0.0317595899105 +1.72765660286 +0.00767460977659 +0.00921918544918 +0.00290471315384 +0.0225506108254 +0.0559108145535 +0.00726942298934 +0.0639481842518 +0.0172392055392 +0.0207224972546 +0.0104014761746 +0.0310517288744 +0.0115506565198 +0.469331234694 +0.0185921266675 +0.00454807700589 +0.0190500784665 +1.72792565823 +0.0380359664559 +0.147433578968 +0.0192644465715 +0.001030254527 +0.0266316533089 +0.0367151908576 +0.0344579257071 +0.355855375528 +0.0457992441952 +0.775019943714 +0.0323929265141 +0.0761830955744 +0.0144751723856 +0.0284580942243 +0.255007952452 +0.123364672065 +0.268009394407 +0.0952454805374 +0.0300691779703 +0.020344728604 +0.595825016499 +0.0512450747192 +0.163236364722 +0.0032756968867 +0.0385081022978 +0.0444373264909 +0.191822215915 +0.482968300581 +0.0200688932091 +0.00640980899334 +0.0613467656076 +0.0103584174067 +0.00750132510439 +0.0872536078095 +1.81818413734 +0.462774783373 +0.133631646633 +0.0307051837444 +0.00376841425896 +0.00423789583147 +0.0240093823522 +0.59675014019 +0.188623473048 +0.105119459331 +1.70758640766 +0.00242745131254 +0.6363093853 +0.0547203458846 +0.00126688263845 +0.24269977212 +0.0 +0.710219502449 +0.00785388238728 +0.0679413229227 +0.0363599173725 +0.210677817464 +0.122348435223 +0.0 +0.0529282987118 +0.00380421220325 +0.0 +0.026494698599 +0.595292806625 +0.043984182179 +0.0489367619157 +0.636543273926 +0.0 +0.0 +0.54672908783 +0.118523150682 +0.010026040487 +0.0187365021557 +0.00150364742149 +0.0443900823593 +0.00972022023052 +0.00184426922351 +0.679658353329 +0.0461135208607 +0.0606503747404 +0.179756328464 +0.167990073562 +0.0317118763924 +0.00510462978855 +0.007401636336 +0.107960253954 +0.0414623245597 +0.00791775807738 +0.873817443848 +0.0360930636525 +0.00249352445826 +0.0505965277553 +0.0015818439424 +0.00693242298439 +0.0249009542167 +0.279456973076 +0.0369785167277 +0.00403274269775 +0.0267147645354 +0.00414790259674 +0.0171785857528 +0.0335150882602 +0.0 +0.00852947402745 +0.0365746356547 +0.14918461442 +0.664878189564 +0.00151356356218 +0.331346780062 +0.451641619205 +0.0759750902653 +0.0 +0.0169567223638 +4.01310062443e-05 +0.0905036851764 +0.0100737605244 +1.54666006565 +0.00504661491141 +0.0487652570009 +0.0602096132934 +0.00146208773367 +0.624643325806 +0.607337892056 +0.602353572845 +0.733287513256 +0.0 +0.0268425270915 +1.5195826292 +0.833124876022 +0.115255974233 +0.00836340710521 +1.31880962849 +0.116776555777 +0.0075526474975 +0.00375480088405 +0.0 +0.0484767854214 +0.0 +0.0246901791543 +0.0 +0.0419237315655 +0.12866024673 +0.195515021682 +0.0115739917383 +0.0327117070556 +0.0149654047564 +0.0152886519209 +0.00405504647642 +0.0 +0.128738179803 +0.12876778841 +0.365718394518 +0.0199451092631 +0.0401217192411 +0.0 +0.0164465531707 +0.0270719565451 +0.0253770109266 +0.00294368434697 +0.0255130194128 +1.46660673618 +0.00660614762455 +0.18703725934 +0.307099968195 +0.478752195835 +0.0774360820651 +0.137303069234 +0.090233206749 +0.247261196375 +0.00447082240134 +1.47769665718 +1.32558250427 +0.123281784356 +0.0602468438447 +0.00563212251291 +0.0441444888711 +0.0180977135897 +0.0139270005748 +0.0166937056929 +0.00962010957301 +0.00668240757659 +1.47123348713 +0.00379054294899 +0.129051819444 +0.00203690305352 +0.0 +0.00272447732277 +0.00114448950626 +0.0923162922263 +0.0083193583414 +0.00184874061961 +0.608689010143 +0.096603192389 +0.100942246616 +0.0206530466676 +0.0339963845909 +0.0438905507326 +0.259412318468 +0.375752717257 +0.647678077221 +0.602896869183 +0.479773253202 +0.0553657636046 +0.0581938512623 +0.00406051659957 +0.00333683961071 +0.0126776434481 +0.591428160667 +0.173206269741 +0.013816550374 +0.0717424601316 +1.39287948608 +0.0213111750782 +0.0131924916059 +0.0291412156075 +0.180847197771 +0.0318662375212 +0.0 +0.0 +0.189227551222 +0.0184259768575 +0.0165397413075 +0.591892957687 +0.0843571797013 +0.144045054913 +0.0225593447685 +0.0910666659474 +0.814591526985 +0.0118147619069 +0.0 +0.0177538059652 +0.840451955795 +0.0448504239321 +0.00330983381718 +0.944185554981 +0.0515717379749 +0.0288414042443 +0.00295419991016 +0.18628308177 +0.0267025996 +0.0503455027938 +0.020504469052 +0.0140084167942 +0.113726690412 +0.0 +0.0 +0.159684076905 +0.00510361744091 +0.103848010302 +0.0232063867152 +0.00516188144684 +0.0444328673184 +0.0 +0.110670983791 +0.209964424372 +0.154980674386 +0.00854762364179 +0.0 +0.0189219750464 +0.00966471806169 +0.154268354177 +6.16133766016e-05 +0.0 +0.0155036365613 +0.0387411080301 +0.16289691627 +0.0695155858994 +0.317834705114 +0.0351504050195 +0.00502913817763 +0.00362991727889 +0.566416084766 +0.325380951166 +0.0 +0.0 +0.317370951176 +0.0644705593586 +0.990253031254 +0.312797874212 +0.0 +1.37094938755 +0.319587022066 +0.318720400333 +1.12275600433 +0.0224105138332 +0.0184214673936 +0.945358455181 +0.01834266074 +0.100936368108 +0.0 +1.22048139572 +0.213610470295 +0.0295677110553 +0.325480908155 +0.152050182223 +0.00569653790444 +0.0078740073368 +0.0370367914438 +0.222704425454 +0.047045905143 +0.0211319923401 +0.0 +0.0 +0.0 +0.217935621738 +1.25509440899 +0.00639535486698 +0.00213913456537 +0.217946797609 +0.0122565152124 +0.0758495330811 +0.0 +0.0813623815775 +1.2440611124 +0.0 +0.225788235664 +0.0654172971845 +0.046901691705 +0.203333243728 +0.242957413197 +0.0302900522947 +0.00522027583793 +0.216928392649 +0.0444367863238 +0.021952746436 +0.0228795092553 +0.438294202089 +0.0102320108563 +0.00397822447121 +0.543034613132 +0.00986010488123 +1.03334879875 +0.0154510168359 +0.295100808144 +0.00867309980094 +0.009681484662 +0.0406680814922 +0.0684951543808 +0.0420298092067 +0.0160431098193 +0.0138895353302 +0.0150363408029 +0.0719815045595 +0.0587566047907 +0.495262384415 +0.00638300739229 +0.686606705189 +0.0584143064916 +0.0313209332526 +0.0661801770329 +0.0335613787174 +0.0212756525725 +0.0 +0.0405912436545 +0.00547194574028 +0.293718338013 +0.00150014064275 +0.00265082414262 +0.0132767418399 +0.0420323051512 +0.0198124200106 +0.0303546115756 +1.30684781075 +0.0188596621156 +0.335500657558 +0.895397782326 +1.09279537201 +0.0123200006783 +0.102489873767 +0.700936079025 +0.0496312715113 +1.09735119343 +0.243348881602 +0.182610362768 +0.47215333581 +0.0160538125783 +0.476262897253 +0.637192189693 +1.28664624691 +1.31631183624 +0.0163042061031 +0.176710233092 +0.00619141897187 +0.0 +0.0332410037518 +0.0121624637395 +0.166693627834 +1.78850889206 +0.583500623703 +1.20465326309 +0.0119909839705 +0.00397514505312 +0.0107001634315 +0.0 +0.478520870209 +0.0765352025628 +1.94045257568 +0.0354366973042 +0.926610291004 +0.0475306920707 +0.216700419784 +0.325619637966 +1.1938713789 +0.0168715044856 +0.838659286499 +0.0190346036106 +0.0765641182661 +0.104808181524 +0.00115785712842 +0.00234608724713 +0.0421704500914 +0.0510207265615 +1.17613935471 +0.00345447636209 +0.863668382168 +0.0196150746197 +2.00546622276 +0.0837747752666 +0.616019904613 +1.26483035088 +0.00981528591365 +0.211760982871 +0.0341424793005 +0.544045686722 +0.0 +0.00119985523634 +0.829257309437 +0.0 +0.00796626135707 +2.00008749962 +0.105664484203 +0.069759234786 +0.0 +0.199679434299 +0.0 +0.463880449533 +0.0230193175375 +0.0939266309142 +0.00948513206095 +0.0117166442797 +0.0317324660718 +0.0206022337079 +1.07483446598 +0.437797725201 +0.0648399218917 +0.0345859378576 +0.550415813923 +0.165210321546 +0.0118549503386 +0.396598398685 +0.010442356579 +0.0140800904483 +0.19010899961 +0.0428823418915 +0.291929036379 +0.0408163890243 +0.0989674776793 +0.012824524194 +0.830344736576 +0.748086512089 +0.827716290951 +0.113338328898 +0.105727486312 +0.0 +0.0435180254281 +0.142978489399 +0.468378454447 +0.0758878141642 +0.0198850277811 +0.0327001139522 +0.0579306930304 +1.41323769093 +0.170725852251 +0.0833499580622 +0.0573946721852 +0.0435904860497 +0.0643362626433 +0.223818555474 +0.0366006977856 +0.0241815391928 +0.0497014559805 +0.493775725365 +0.0 +0.0375725999475 +0.0180148836225 +0.51215493679 +0.0501729436219 +0.0219151675701 +0.211885482073 +0.0234865080565 +0.0951039269567 +0.0328523032367 +0.000273437879514 +1.31055963039 +0.0128555269912 +0.0276956558228 +0.0 +0.00027349346783 +0.043627653271 +0.00827171374112 +0.00450703594834 +0.050552982837 +0.0535227656364 +0.0319733247161 +0.0435004718602 +0.0 +0.174861967564 +0.0 +0.158958539367 +0.0364830307662 +0.023654486984 +1.93833112717 +0.0327669419348 +0.117973253131 +0.0939432606101 +0.0320199243724 +0.0128860706463 +0.105554871261 +0.0274490434676 +0.0329432524741 +0.0430376790464 +0.156334862113 +0.00427098479122 +0.0 +0.679489195347 +1.4949016571 +0.0556555464864 +0.0621339641511 +0.466484308243 +0.0156408026814 +0.00625780643895 +0.00860958080739 +0.00151766196359 +0.0581216327846 +0.120735943317 +0.0684511736035 +0.0477209575474 +0.291562348604 +0.0302334781736 +0.0229581184685 +0.208231717348 +0.100082933903 +0.0178800877184 +0.00587004981935 +0.442788153887 +0.00551757402718 +1.18115067482 +0.0101588778198 +1.18744778633 +0.00165185634978 +0.0118730515242 +0.00715308776125 +0.0184919144958 +0.0907016769052 +0.0810268968344 +0.021362459287 +0.0252064745873 +0.101700276136 +0.116227082908 +2.08768010139 +0.0171761065722 +0.0372643843293 +0.0511378459632 +0.0852039009333 +0.326108574867 +0.0465059913695 +0.0660559684038 +0.444322735071 +0.013380789198 +1.84839081764 +0.00516481138766 +0.343061774969 +0.423800289631 +0.0357680097222 +0.0265607181937 +0.0428965501487 +0.0485978424549 +0.143573611975 +0.0369180552661 +0.0161980912089 +0.250627428293 +0.0684530511498 +0.21123303473 +2.15109825134 +0.0572053678334 +0.0275904163718 +0.0414436236024 +0.0122625119984 +0.016431087628 +0.00779409939423 +0.0132701704279 +1.40551757812 +1.32254374027 +0.0159095097333 +2.20273661613 +0.364291101694 +0.0484465099871 +0.0550178848207 +0.015298304148 +0.0172623600811 +0.0182713568211 +0.0726974010468 +1.02379727364 +0.343000292778 +0.171793520451 +0.126419320703 +2.43849086761 +0.067036703229 +1.45985090733 +0.0243422761559 +0.0148909101263 +0.307820498943 +0.0557416602969 +0.323138862848 +0.821278750896 +0.0323760658503 +0.067778468132 +0.128989771008 +0.00561406603083 +0.288018792868 +0.0565455332398 +0.252181857824 +0.197430938482 +0.0289276540279 +0.046079158783 +0.051879119128 +0.0294719226658 +0.257025629282 +1.75016224384 +0.0015371813206 +0.0895794481039 +0.279757469893 +0.0207495205104 +0.0540255755186 +1.21784627438 +0.32590174675 +0.0 +0.0244710277766 +0.0101056974381 +0.0 +0.47821983695 +0.0091968504712 +0.0177787188441 +0.0139519050717 +0.0142254447564 +0.116399295628 +0.219828754663 +0.00387936481275 +1.52051126957 +0.105026938021 +0.00411290954798 +0.255938440561 +0.00162894814275 +0.37093102932 +0.275695741177 +0.758227109909 +0.219206020236 +0.713423728943 +0.0966385006905 +1.15474641323 +0.124368235469 +0.0214934255928 +0.463793367147 +0.019452508539 +0.0133992219344 +0.150763437152 +0.309445023537 +0.393505632877 +0.0529669970274 +0.955859303474 +0.0229755025357 +0.0474132336676 +0.0323321260512 +2.43992471695 +0.0677360519767 +0.0718857869506 +0.0179984923452 +0.0078362505883 +0.00857068318874 +1.50482320786 +0.0592296123505 +0.00225254241377 +0.224097803235 +0.0678251236677 +1.29902672768 +0.0684415400028 +0.106285996735 +0.193944901228 +1.63576388359 +0.0119635155424 +0.010371139273 +0.0527958236635 +0.113410748541 +0.33337020874 +0.00336536881514 +0.00408258987591 +0.493328392506 +0.112407311797 +0.0100502893329 +2.11807727814 +0.105030030012 +0.356091797352 +0.206557407975 +1.86806774139 +0.0153243662789 +0.0107117081061 +0.0035526282154 +0.0801105350256 +0.0444137118757 +0.0732044875622 +0.466775506735 +0.0097700888291 +2.00481796265 +0.0139165269211 +0.0146384062245 +2.27563500404 +0.0716019496322 +0.00126141414512 +0.00906522572041 +0.986357033253 +0.831704139709 +0.336910426617 +1.91458249092 +1.65054452419 +0.0560297071934 +0.00357040530071 +0.0121048474684 +0.127177670598 +0.0739091187716 +2.49898767471 +0.900430500507 +0.249728322029 +0.930444002151 +0.0913798734546 +0.0204413216561 +0.11451651901 +0.0046580163762 +0.841347813606 +0.00952470954508 +0.0693596750498 +1.16267061234 +7.70204782486 +0.465426534414 +0.103394530714 +1.09978032112 +0.0451045446098 +2.23493003845 +7.02516269684 +0.0467897616327 +0.199733138084 +0.128636270761 +8.0712518692 +0.784830510616 +0.0420259609818 +0.0340290814638 +0.0679584369063 +1.24825620651 +0.00645204959437 +0.0387848801911 +0.120481416583 +1.51143121719 +1.26997864246 +0.283683806658 +0.0804192498326 +1.83970606327 +0.0599539279938 +0.0378769747913 +0.0117392726243 +0.0108867660165 +0.753327429295 +0.0172377601266 +0.0105955349281 +0.00777198188007 +0.0317545793951 +0.0380176156759 +5.0560669899 +2.76382493973 +7.04227209091 +4.9735622406 +0.0713629424572 +4.91722536087 +0.0162847619504 +0.161740928888 +0.0417430996895 +0.0857211276889 +1.04701542854 +0.0185492839664 +2.30273509026 +0.00410887086764 +2.51604413986 +0.010733038187 +0.171770498157 +0.0386826507747 +0.0338845737278 +0.159665480256 +0.0606598183513 +0.0208344645798 +6.64455986023 +0.193572938442 +1.70410382748 +0.0165596343577 +0.0730975419283 +0.0973929166794 +0.0809741094708 +0.0813451707363 +0.0350600518286 +0.0651282146573 +0.0519015341997 +6.74740219116 +0.0424136035144 +1.56203866005 +0.0573550574481 +0.606648385525 +6.74081611633 +0.0980350598693 +0.638491690159 +0.180057242513 +0.282404005527 +0.0980246961117 +1.71845138073 +0.0583328679204 +0.0 +0.00600384920835 +0.120374292135 +4.56885051727 +6.05655241013 +1.71278572083 +0.00906990189105 +0.0440068617463 +0.0531429424882 +0.983445823193 +0.977696895599 +0.0835834890604 +0.00847897678614 +0.0310076437891 +0.46404543519 +0.00257699680515 +0.063824467361 +0.165606662631 +0.865341424942 +0.0374743975699 +0.0998578816652 +0.0120089966804 +5.94024658203 +0.0768888518214 +0.00191693217494 +8.03669452667 +0.0861560255289 +0.00111325574107 +1.01569640636 +0.000499915855471 +0.016709825024 +0.0322475805879 +0.0576782561839 +1.79387497902 +0.0568042881787 +0.0832927599549 +0.0210550706834 +0.0571292936802 +0.0294649451971 +0.0395907275379 +0.967624187469 +0.853942751884 +0.0834372714162 +0.081404812634 +1.67586028576 +0.038231626153 +0.850588440895 +1.10299921036 +0.0585305728018 +0.0135452542454 +0.00559676066041 +1.84838104248 +5.26966619492 +7.58406591415 +0.00108167168219 +1.53841745853 +0.0831042975187 +0.270676076412 +5.03558301926 +1.63216841221 +0.0491695441306 +0.0144290821627 +0.0643794834614 +0.0667834058404 +0.0256123766303 +0.0644544735551 +0.00139695266262 +4.90832853317 +0.545868635178 +6.7477312088 +6.76094722748 +0.008728871122 +5.43565893173 +0.0853262841702 +0.0225115716457 +1.79583144188 +0.0323909819126 +0.0167613327503 +0.000407976243878 +0.0 +0.475811630487 +1.14094388485 +0.0151150627062 +0.0829726830125 +3.72718453407 +0.0390455685556 +1.32003629208 +0.0 +0.014523149468 +0.0920013338327 +0.0261160824448 +0.00349742011167 +1.17536497116 +0.0231434106827 +4.72977256775 +0.0196708645672 +5.22029304504 +6.18964099884 +0.000408028427046 +0.00120232847985 +0.110843032598 +0.0106496643275 +0.0 +0.0896328017116 +0.00656254030764 +0.00219270354137 +0.0892027020454 +0.0182645954192 +0.0224594641477 +0.0762900114059 +0.327142119408 +0.00951278954744 +0.432346522808 +0.298176944256 +0.00268450542353 +0.0 +0.0957547426224 +0.00632489984855 +0.0499068126082 +0.0306418780237 +0.0636382997036 +0.0116456318647 +1.42910313606 +0.912590265274 +1.73668956757 +0.0826542824507 +0.0661150589585 +0.904105901718 +0.398027807474 +0.0161445643753 +0.0399042740464 +0.00142514239997 +0.916844427586 +1.08728742599 +0.0517493635416 +1.01490581036 +0.0346782431006 +0.0429844968021 +0.0192418862134 +0.0579926669598 +0.0499303378165 +0.0043195723556 +0.146061569452 +0.115288741887 +0.405164182186 +0.0131243979558 +0.0110994866118 +0.210941359401 +0.0390352457762 +0.937057614326 +1.21531188488 +0.10888825357 +0.132782325149 +0.0685928836465 +0.0484824888408 +0.019768986851 +3.62412142754 +0.0383100025356 +0.070398427546 +0.187479749322 +0.921945810318 +2.11402583122 +0.00828317925334 +0.00210587750189 +0.116608835757 +0.270522207022 +0.0480762943625 +1.26586556435 +0.969581067562 +0.0715228840709 +0.555420100689 +0.236363008618 +0.00843464583158 +1.28940105438 +0.929078280926 +0.0155651187524 +0.0667967945337 +0.00221231975593 +0.455562114716 +0.365285605192 +0.00636926433071 +2.00737452507 +0.0278465021402 +0.0406034477055 +0.0465905666351 +1.99922406673 +0.00290022068657 +0.0461045652628 +0.0407502390444 +0.0675864368677 +0.0288520865142 +0.25747525692 +0.242379531264 +0.0 +0.00151680328418 +1.81339013577 +0.36675915122 +1.33917152882 +0.00151547649875 +0.0548287406564 +0.00518454378471 +0.187142968178 +0.542625486851 +0.475025951862 +0.0269009340554 +2.25366139412 +0.0702937543392 +0.00405954988673 +0.748238801956 +0.0210004001856 +0.00455567985773 +0.114772476256 +0.00938682071865 +0.254236459732 +0.020391702652 +0.317820966244 +0.0117131434381 +0.210410058498 +1.81038117409 +0.501931071281 +0.00962400343269 +0.541905760765 +0.0 +0.00631687883288 +0.143514171243 +0.0070698321797 +0.0236782673746 +0.00322038610466 +0.0657365471125 +0.0756287053227 +0.0326224789023 +0.308469414711 +0.0320007205009 +2.17720413208 +0.501554608345 +0.178150862455 +0.0 +0.0747771859169 +0.18047401309 +0.202320843935 +0.0914044752717 +0.0637754276395 +0.0 +0.0 +0.118168689311 +0.182114526629 +0.00518011394888 +0.0 +0.0760545954108 +0.812527120113 +0.141774579883 +0.0 +0.00406843144447 +0.0178108345717 +3.83713841438 +0.267937332392 +0.123371727765 +0.0324425846338 +0.0340055674314 +0.070666603744 +0.593190908432 +0.0584201067686 +0.280367404222 +0.0 +0.191429764032 +0.037977989763 +0.176354721189 +0.0 +0.012111864984 +0.0220318213105 +0.511250734329 +0.0 +0.0133807035163 +0.0 +0.238153994083 +0.0548363626003 +0.0 +2.13597559929 +0.0388468950987 +0.0 +0.109653197229 +0.0624101571739 +0.714627742767 +0.0 +0.00894409138709 +1.41178917885 +0.0382224023342 +0.0738423392177 +1.41797423363 +1.53898620605 +0.0249803010374 +0.935643792152 +0.0385380722582 +0.0317572914064 +0.0574795491993 +0.132758185267 +0.0187826119363 +1.14458298683 +0.498592019081 +0.173800200224 +0.0 +0.0851671621203 +0.0869875103235 +0.0139522301033 +0.23043872416 +0.441226989031 +0.276734918356 +0.612591445446 +0.10429354012 +0.0424932651222 +0.110304869711 +0.12281255424 +0.00593230128288 +0.0 +0.559431493282 +3.2787065506 +0.115885734558 +0.112006299198 +0.490492790937 +0.0 +0.0 +0.371199935675 +0.0 +0.0218598227948 +0.949624478817 +2.79864764214 +2.66095781326 +3.42810940742 +0.0 +0.310629099607 +0.0640662536025 +0.112559109926 +0.0901287868619 +0.542409658432 +0.0694931373 +1.43027591705 +0.145473778248 +0.0916558355093 +1.35688459873 +0.323447406292 +0.195002511144 +0.0186903979629 +0.300414264202 +0.0181384328753 +0.0123041803017 +0.362621337175 +0.0115012824535 +0.33161765337 +0.0371173433959 +0.350179672241 +0.82419449091 +0.0182671155781 +0.572689831257 +0.0202112644911 +0.0192419905216 +0.207026928663 +0.0383675433695 +0.000973454560153 +0.147501572967 +0.0 +0.0655575618148 +1.9023116827 +0.37562584877 +0.0130033558235 +0.0125924553722 +0.00943014584482 +0.822415053844 +0.0474978797138 +0.0550518594682 +0.00777156976983 +0.00332838576287 +0.231979817152 +0.0200442522764 +0.0 +0.0642746537924 +0.0 +0.148329004645 +0.214822471142 +0.242870479822 +0.281574815512 +0.00825975835323 +0.0177731756121 +0.104628413916 +0.0607774965465 +1.60742938519 +0.00523784849793 +0.108098693192 +0.0657660663128 +0.832780480385 +0.0036766640842 +0.0181417949498 +0.0162658654153 +0.0165045317262 +0.0040099429898 +0.392377108335 +0.266958206892 +0.824472665787 +0.808746993542 +0.00359285413288 +0.00400591641665 +0.0095697697252 +0.0247655119747 +0.687178015709 +0.0182790886611 +0.305946290493 +2.43050479889 +0.369047790766 +0.0358887426555 +0.0140644097701 +0.00140545365866 +0.0100392252207 +1.00657498837 +0.026704210788 +0.00785663444549 +0.712745606899 +0.0355590134859 +0.0741148740053 +0.00335890124552 +0.00226596556604 +0.0185239631683 +0.00305626518093 +1.00855123997 +0.00766757596284 +0.0661667063832 +0.0894009172916 +0.0 +0.0 +0.00257871625945 +0.0 +0.403857320547 +0.0191019568592 +0.0 +1.47875487804 +0.0148843890056 +0.0 +0.0 +0.0 +0.0 +0.0 +0.500586211681 +0.0062853815034 +1.05736613274 +0.0 +0.0 +0.0118810795248 +0.00648037204519 +0.285736739635 +0.0 +0.0176104735583 +1.19250106812 +0.845315098763 +0.00877906382084 +0.0115365842357 +0.0124871050939 +0.0 +0.0 +1.6802200079 +0.0 +0.0448611229658 +0.0051441625692 +1.70323967934 +0.0357460789382 +0.0 +0.0106839956716 +1.70312058926 +0.0 +0.245381012559 +0.227223724127 +0.0686874836683 +0.029140362516 +0.0 +0.553322851658 +0.39615470171 +0.171742379665 +0.0698472335935 +0.0150951948017 +0.0415898300707 +0.0 +0.0 +0.0 +0.00714329630136 +0.0 +0.0663265734911 +0.375126212835 +0.0264023207128 +0.0546168424189 +1.23260605335 +0.0184048861265 +0.0171660836786 +0.0650831758976 +0.150251328945 +0.0349193699658 +0.00140841677785 +0.0 +0.0 +0.0 +0.0164858121425 +0.01796910353 +0.0 +0.0315062366426 +0.412916779518 +0.35268625617 +0.253173708916 +0.0123111661524 +0.285606175661 +0.334221303463 +0.0201788246632 +0.157708853483 +0.22605137527 +0.0236401390284 +0.0214001629502 +0.0 +0.0475192330778 +0.00141322624404 +0.0121519612148 +0.181609064341 +0.0 +0.0 +0.00132549204864 +0.022512126714 +0.875852286816 +0.0539923086762 +0.0209152568132 +0.275663524866 +0.790352106094 +0.0464885123074 +0.0251572299749 +0.186085984111 +0.949586629868 +0.0517667606473 +0.123749390244 +1.3824903965 +0.0608412250876 +0.0675869435072 +0.0 +0.0869154706597 +0.640257835388 +0.135127648711 +0.035874594003 +0.160950481892 +0.0 +0.0438119545579 +0.0989494472742 +1.48220419884 +0.0 +0.0230326894671 +0.436065018177 +0.0 +0.0405765846372 +0.0 +1.74095273018 +0.00354614714161 +0.0 +8.76489502843e-05 +0.0516715496778 +0.00971858296543 +0.032263495028 +0.0318603031337 +0.103742651641 +0.0216327533126 +0.0 +0.0 +0.018167629838 +0.0117444908246 +0.0767196789384 +0.325552016497 +0.0 +0.664486169815 +0.0344230756164 +1.42875182629 +0.0169857311994 +0.940752863884 +0.109612338245 +0.863266170025 +0.0140372114256 +0.0397207438946 +0.0120151694864 +0.0 +0.0220719408244 +0.0 +0.0 +0.0 +0.325752258301 +0.00442000199109 +0.0145106902346 +0.0 +0.0 +0.0857144668698 +0.0525935292244 +0.0190192367882 +0.67905908823 +0.00427908170968 +0.0 +0.107937254012 +0.0600397922099 +0.0 +0.0747265219688 +0.0149048520252 +0.278967499733 +0.00585980154574 +0.00632548285648 +0.0117613505572 +1.3253787756 +0.0221113171428 +0.00427014240995 +1.34484910965 +0.356420397758 +0.00167260295711 +0.924712657928 +0.0213319696486 +0.0293432846665 +0.0297843571752 +0.0953388735652 +0.0160690099001 +0.0 +0.0718543082476 +0.00266335252672 +0.694713413715 +0.0 +0.0627562627196 +0.0403740927577 +0.0048443377018 +0.0301392953843 +0.0 +1.45778036118 +1.94048511982 +0.0 +0.105721659958 +1.93702197075 +0.15595677495 +0.0 +0.0 +0.0 +0.0160254668444 +0.0365696772933 +0.0 +0.0513953119516 +0.0236993655562 +0.0 +0.0 +1.97921204567 +0.0579041056335 +0.0340447872877 +0.0585502162576 +0.980665445328 +0.843474209309 +0.104974135756 +0.00584580795839 +0.00350512284786 +0.712672293186 +0.138958871365 +0.042460590601 +0.0659100040793 +0.0379647612572 +1.61991131306 +0.0365023873746 +0.0139154763892 +0.276699185371 +0.539526581764 +0.0819055438042 +0.00525229796767 +0.230755969882 +0.0187085904181 +0.0803889259696 +0.0131052713841 +0.0274889059365 +0.0 +0.0519392602146 +0.072545312345 +0.0498175881803 +0.0240024551749 +0.028430711478 +0.00429505947977 +0.0425974279642 +0.10559566319 +0.214248418808 +0.0209165569395 +0.0510371141136 +0.0738727152348 +0.0468950010836 +0.742346823215 +0.0474388301373 +0.0 +0.00229658652097 +0.0216840058565 +0.0246631316841 +0.0986841619015 +0.0114871980622 +0.0117987720296 +1.66843819618 +0.0191581416875 +0.130784124136 +0.0162398926914 +0.127482011914 +0.21084395051 +0.0377855114639 +0.0247511379421 +0.0695144459605 +0.00634556915611 +0.0138188535348 +0.044524691999 +0.563193142414 +0.147109344602 +0.0137901576236 +1.46342146397 +1.47616612911 +0.0 +0.0403504148126 +0.0 +0.0 +0.0 +0.0 +0.142517983913 +0.0 +0.0 +0.0790311619639 +0.413877338171 +0.345973700285 +0.133971482515 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.32852986455 +0.0251774955541 +0.688352108002 +0.0202634353191 +0.0104622337967 +0.226848945022 +0.00714340852574 +0.0647711455822 +0.21194152534 +0.0652014538646 +0.122576475143 +0.0360801033676 +0.198085740209 +0.0154556082562 +0.0416138768196 +0.0312835350633 +0.0925042554736 +0.0 +0.0802727639675 +0.191013306379 +0.00566077092662 +0.0264161713421 +0.0 +0.0824865996838 +0.0 +0.0 +0.113716371357 +0.0 +0.0 +0.00468626292422 +0.0986275672913 +0.168721213937 +0.16301728785 +0.273694127798 +0.0 +0.239971250296 +0.0253609418869 +0.132611125708 +0.0370467342436 +0.0499405637383 +0.0 +0.0288203042001 +0.0184383820742 +0.025554722175 +0.015961162746 +0.102217331529 +0.0 +0.0235460996628 +0.0647225156426 +0.0 +0.0596675761044 +0.00539162987843 +0.101212911308 +0.0057599474676 +0.707776069641 +0.0 +0.0 +0.0149674192071 +0.915078878403 +0.122753553092 +0.0 +0.872149765491 +0.0932362303138 +0.0260925237089 +0.0 +1.48386704922 +0.0190851483494 +0.0410487875342 +0.00217751110904 +0.0192446932197 +0.0 +0.0756354257464 +0.00669225398451 +0.0 +0.278520494699 +0.0299879815429 +0.0767042115331 +0.0713149160147 +0.0264685750008 +0.0 +0.00487043615431 +0.0158336553723 +0.0520031899214 +0.0308009721339 +0.032978951931 +0.035226944834 +0.0138147762045 +0.00454974779859 +0.0297245774418 +0.00772592565045 +0.0114927254617 +0.0 +0.105646759272 +0.0693645551801 +0.00633628712967 +0.023210324347 +0.0192341059446 +0.00990866683424 +0.909198224545 +0.222196742892 +0.0 +0.176603123546 +0.0549804084003 +0.0611590594053 +0.163234293461 +0.0281180292368 +0.0 +0.0 +0.0 +0.0327824614942 +0.336893588305 +0.0 +0.0479654371738 +0.891070485115 +0.0 +0.0524958483875 +0.00202204822563 +0.0729859247804 +0.278557598591 +0.021052043885 +0.339110016823 +0.0080654611811 +0.06512670964 +0.651695966721 +0.0147645622492 +0.235652431846 +0.0229224581271 +0.0118424724787 +0.016821494326 +0.280492693186 +0.0477455742657 +0.0604237057269 +0.0158117767423 +0.0118527458981 +0.0270652975887 +0.0109156081453 +0.836768686771 +0.00794579368085 +0.00562275573611 +0.356113523245 +0.0028083762154 +0.721739113331 +0.0167549550533 +0.0 +0.0 +0.0 +0.803971290588 +0.0144035369158 +0.00270177959464 +0.0113508105278 +0.00569791859016 +0.00545038701966 +0.00557017000392 +0.0 +0.0111521426588 +0.790617346764 +0.0200697891414 +0.050152130425 +0.0380358099937 +0.0861191600561 +0.0 +0.788123011589 +0.281105518341 +0.0127799389884 +0.0 +0.0420222021639 +0.00631601456553 +0.0494014173746 +0.0152753023431 +0.0016345907934 +0.100934542716 +0.016454782337 +0.00433049257845 +1.64035832882 +0.360656201839 +0.0019379153382 +0.081857830286 +0.0419834628701 +0.00676999893039 +0.0118347313255 +0.0807629600167 +0.0599712431431 +0.69833034277 +0.0 +0.0064695617184 +0.0 +0.134180098772 +0.150190770626 +0.00163674249779 +0.0 +0.0 +0.0 +0.00764272781089 +0.0505711622536 +0.00749246077612 +0.014308928512 +0.00546044390649 +0.0380072556436 +0.152020439506 +0.00541505450383 +0.0 +0.770801126957 +0.0226149242371 +0.0 +0.0 +0.743829369545 +0.0517494492233 +0.0217889491469 +0.0184783171862 +0.0 +1.55548989773 +0.144088700414 +0.00406332779676 +0.0177589282393 +0.0350221395493 +0.0 +0.295317709446 +0.00454563740641 +0.0556297600269 +0.00168528722133 +0.0 +0.687614738941 +0.0369277857244 +0.0 +0.0292264129966 +0.494294583797 +0.0 +0.0347234979272 +0.778672337532 +0.0 +0.0706202536821 +0.0654581040144 +0.0208941884339 +0.00259682489559 +0.72516644001 +0.0177066400647 +0.0710542798042 +0.0 +0.0370702706277 +0.00830247532576 +0.00510704005137 +0.149562865496 +0.363763839006 +0.00346296583302 +0.0515837818384 +0.152049764991 +0.729464173317 +0.718875706196 +0.563202738762 +0.0 +0.0277004558593 +0.692123949528 +0.628818154335 +0.0156832132488 +0.0179909691215 +0.00208989507519 +0.0490446351469 +0.0 +0.0151292858645 +0.0540532916784 +0.0111833000556 +0.0172013901174 +0.0 +0.00628068298101 +0.0411707907915 +0.163173049688 +0.0 +0.0073386086151 +0.101672627032 +0.00767330918461 +0.0 +0.00730009935796 +0.00425152853131 +0.206912651658 +0.00603906018659 +0.00746893091127 +1.53797352314 +0.0474901795387 +0.0116551723331 +0.0122124264017 +0.044409904629 +0.225901797414 +0.026247812435 +0.267178595066 +0.0191238950938 +0.0623724348843 +0.0114052901044 +0.249933108687 +0.0188795048743 +0.0 +0.339762121439 +0.00719320261851 +0.0097838062793 +0.015207555145 +0.237720474601 +0.00261668581516 +0.0614698342979 +0.184553965926 +0.0822630301118 +0.0 +0.0849588513374 +0.0203761868179 +0.00779115594923 +0.0235897507519 +0.0109026795253 +0.399955511093 +0.00797717552632 +0.287458389997 +0.0196293517947 +0.0276132710278 +0.0027612419799 +0.00122986221686 +0.00393914058805 +0.0130048803985 +0.00299064465798 +0.0318399593234 +0.0797105357051 +0.120121985674 +7.03247569618e-05 +0.0948964357376 +0.0327474474907 +0.0171704255044 +0.0356381498277 +0.370145380497 +0.0167467184365 +0.000548504991457 +0.390077203512 +0.00252271094359 +0.19506663084 +0.0182670503855 +0.0 +0.0 +0.0 +0.0244464278221 +0.0528544746339 +0.0 +0.0506787821651 +0.000247735646553 +0.0233142506331 +0.00256029888988 +0.0 +0.0192806664854 +0.0 +0.331540435553 +0.03735723719 +0.307318866253 +0.224351748824 +0.0 +0.036005243659 +0.00938650965691 +0.698188781738 +1.21112060547 +0.0 +0.011466614902 +0.0 +1.11339116096 +0.0105436900631 +0.0123364822939 +0.0451065786183 +0.0278812684119 +0.00451305462047 +0.264393597841 +0.27867013216 +1.08271801472 +0.0406932532787 +0.0 +0.0130779910833 +0.0733624100685 +1.10234177113 +1.08252835274 +0.0 +0.00553470151499 +0.0798009037971 +0.0 +0.0 +0.0 +0.450909972191 +0.0 +1.01521253586 +1.05294215679 +0.0 +0.358193814754 +0.0 +0.0 +0.00461518578231 +0.0 +0.00660316180438 +0.0 +0.0 +0.18888810277 +0.483511388302 +0.106941148639 +0.00398948695511 +0.530536293983 +0.0703376755118 +0.0 +0.0110842231661 +0.257479131222 +0.0 +0.155881255865 +0.0 +0.0 +0.39822357893 +0.0197077672929 +0.535234987736 +0.0 +0.00462791137397 +0.0268343668431 +0.03262591362 +0.0397578850389 +0.55845528841 +0.00245648110285 +0.0151247624308 +0.00590792158619 +0.00736911874264 +0.0 +0.0384932756424 +0.0328874513507 +0.30802705884 +0.0532353594899 +0.517856240273 +0.0 +0.05190179497 +0.209153369069 +0.0 +0.0335858687758 +0.566393077374 +0.00929350685328 +0.0120848389342 +0.124364547431 +0.00625937478617 +0.187291875482 +0.0170657821 +0.0316658094525 +0.689939081669 +0.271735161543 +0.00135688076261 +0.410904198885 +0.0121065173298 +0.117548070848 +0.0459016337991 +0.00725625781342 +0.0 +0.0 +0.00330930063501 +0.11897200346 +0.469582080841 +0.0 +0.095799729228 +0.0 +0.00283919437788 +0.00420051207766 +0.107709392905 +0.0332302078605 +0.0341008901596 +0.0433597750962 +0.00331670441665 +0.0196705535054 +0.444839388132 +0.102131091058 +0.00311967870221 +0.0980613455176 +0.0197440739721 +0.0412754006684 +0.00763946771622 +0.00636423286051 +0.0438408106565 +0.0165476500988 +0.0 +0.0 +0.0 +0.237265989184 +0.0 +0.0 +0.0 +0.0115379607305 +0.0 +0.717781543732 +0.00823355745524 +0.0330583527684 +0.00186382909305 +0.142409697175 +0.0158018134534 +0.0339396446943 +0.0 +0.0 +0.0149522051215 +0.406888842583 +0.0 +0.204764068127 +0.00746006472036 +0.0 +0.389302104712 +0.047485422343 +0.00231838668697 +0.0802307352424 +0.0983114615083 +0.00987663120031 +0.0101797431707 +0.206483900547 +0.0130840959027 +0.0249849520624 +0.0782938227057 +0.33066368103 +0.725536286831 +0.0205879472196 +0.00299405865371 +0.0203367266804 +0.375638991594 +0.0142448572442 +0.0171624775976 +0.425152510405 +0.0646352171898 +0.0 +0.11726719141 +0.0 +0.0 +0.0147016802803 +0.0164620168507 +0.201303258538 +0.0219127554446 +0.0493484921753 +0.00164397573099 +0.00476580671966 +0.010194090195 +0.00890213064849 +0.00449317228049 +0.00570090487599 +0.228502839804 +0.0581699945033 +0.0652061030269 +0.042007163167 +0.0182768963277 +0.3745264709 +0.00975712947547 +0.0268249604851 +0.044597055763 +0.0167054273188 +0.00248909345828 +0.0276443716139 +1.04868924618 +0.0331764966249 +0.111883431673 +0.0208909399807 +0.0576735883951 +0.180315688252 +0.0022924519144 +0.00722337746993 +0.0217495243996 +0.0893235206604 +0.257679730654 +0.103037312627 +0.0 +0.00700845941901 +0.0945626199245 +0.016085324809 +0.011819739826 +0.005749668926 +0.00234237220138 +0.0255590621382 +0.0371618159115 +0.150275796652 +0.0144217414781 +0.142153173685 +0.159224882722 +0.122003115714 +0.104496851563 +0.00723817152902 +0.00720615126193 +0.19329443574 +0.0295893941075 +0.0116336047649 +0.111468337476 +0.15488769114 +0.0706880986691 +0.00900488812476 +0.0659050419927 +0.0721001625061 +0.0330464169383 +0.0069728884846 +0.00597691023722 +0.00552412122488 +0.391001373529 +0.00595608819276 +0.0481521897018 +0.0213343463838 +0.236226275563 +0.00340932467952 +0.00661745853722 +0.0237315557897 +0.0551673062146 +0.00997897423804 +0.0611907467246 +0.00622966932133 +0.0114744631574 +0.385304003954 +0.00948979239911 +0.054190825671 +0.0143591603264 +0.00465253554285 +0.0434296578169 +0.0741458386183 +0.170026630163 +0.0177025925368 +0.144547820091 +0.013478868641 +0.00476068537682 +0.020000634715 +0.00529455626383 +0.0207184124738 +0.00657836487517 +0.157619401813 +0.0233702920377 +0.0 +0.0 +0.023860450834 +0.000198597073904 +0.0 +0.020563274622 +0.0533518008888 +0.170902594924 +0.000198616093257 +0.0133939553052 +0.0715085193515 +0.0305395629257 +0.015566252172 +0.0953974053264 +0.0102577507496 +1.01031303406 +0.0731620490551 +0.137582495809 +0.0050532524474 +0.130713164806 +0.00573936384171 +0.0242591686547 +0.0157737303525 +0.0226811207831 +0.0905660390854 +0.00300550926477 +0.00234472099692 +0.0244823936373 +0.0978701487184 +0.0295103732497 +0.0182357076555 +0.0134819699451 +0.0552318915725 +0.0126482993364 +0.0125399418175 +0.00891999714077 +0.00834189914167 +0.029126662761 +0.0284059084952 +0.067400790751 +0.0742351561785 +0.0113687170669 +0.0 +0.0 +0.0531105361879 +0.0615017674863 +0.104534775019 +0.0216376576573 +0.0359650924802 +0.197950690985 +0.00708916736767 +0.0398863479495 +0.226541206241 +0.00166008202359 +0.0179694723338 +0.0176455825567 +0.29228374362 +0.0123362811282 +0.024491166696 +0.0211914367974 +0.0525473095477 +0.326010465622 +0.0179299116135 +0.00661986367777 +0.0142224859446 +0.00523677561432 +0.0465948805213 +0.0374590754509 +0.0 +0.0 +0.0593133941293 +0.233900770545 +0.0183188132942 +0.0184413120151 +0.0680891871452 +0.106867156923 +0.311562627554 +0.338732391596 +0.0605024769902 +0.0 +0.0 +0.0303984135389 +0.0 +0.0 +0.0145894261077 +0.0258388165385 +0.00238873856142 +0.044460259378 +0.928021669388 +0.0780205354095 +0.0167624801397 +0.0852024108171 +0.019900534302 +0.0178817622364 +0.17687471211 +0.146400243044 +0.96345603466 +0.00348594994284 +0.0312399342656 +0.0950807929039 +0.544192612171 +0.0118992011994 +0.00809101294726 +0.498710215092 +0.00649568671361 +0.0378067567945 +0.115889973938 +0.0349626541138 +0.0 +0.0 +0.0237998757511 +0.00680745346472 +0.00702292984352 +0.0188421774656 +0.0203975811601 +0.0168415755033 +0.0108049931005 +0.466665267944 +0.493362218142 +0.00768544711173 +0.0057573216036 +0.0 +0.0 +0.00242033135146 +0.0324518419802 +0.44766497612 +0.0190765652806 +0.020615151152 +0.0237979609519 +0.00164088164456 +0.0 +0.0 +0.112019315362 +0.0148113705218 +0.0200060009956 +0.0408688262105 +0.0134988417849 +0.0149419400841 +0.167036533356 +0.00885743368417 +0.109627731144 +0.623472929001 +0.0136036882177 +0.636819660664 +0.0 +0.580581009388 +0.00399342691526 +0.0122916791588 +0.0413439124823 +0.0178315322846 +0.0215288382024 +0.284453392029 +0.513234257698 +0.0562915876508 +0.0113674663007 +0.29458552599 +0.00100549729541 +0.593675971031 +0.0304649639875 +0.00441309437156 +0.00754004018381 +0.413050919771 +0.00412549264729 +0.333784341812 +0.0440739095211 +0.0460174381733 +0.035450771451 +0.0 +0.00757527397946 +0.87911438942 +0.195772349834 +0.0499304309487 +0.0409056134522 +0.0287364665419 +0.0 +0.0 +0.280287742615 +0.261983245611 +0.528907299042 +0.0 +0.0 +0.51909917593 +0.275155216455 +0.0 +0.0852106511593 +0.0 +0.0 +0.0258930698037 +0.138839110732 +0.0 +0.00295144924894 +0.0272819921374 +0.233262762427 +0.567674279213 +0.0 +0.0 +0.33164653182 +0.015215460211 +0.259646445513 +0.0 +0.0291686244309 +0.00670403148979 +0.00103547598701 +0.0114701539278 +0.0124132595956 +0.0377221442759 +0.01881916821 +0.0591308511794 +0.0234593618661 +0.0187796484679 +0.0872785896063 +0.0657687783241 +0.0155446762219 +0.957341313362 +0.0105573916808 +0.00849720370024 +0.010025119409 +0.00489204982296 +0.0904311239719 +0.00451984396204 +0.0821666195989 +0.0 +0.0277364961803 +0.0485755577683 +0.0305875316262 +0.0349185466766 +0.246134385467 +0.110057726502 +0.109490707517 +0.0439482443035 +0.363425850868 +0.0179383773357 +0.0501172542572 +0.10594765842 +0.0271714646369 +0.0 +0.2378616184 +0.0 +0.12424377352 +0.468535751104 +0.0 +0.00515774358064 +0.127246886492 +0.0368531830609 +0.937774956226 +0.448670148849 +0.178648009896 +0.0761383399367 +0.0230730697513 +0.011461189948 +0.0723143666983 +0.433996260166 +0.377807915211 +0.431144028902 +0.21684139967 +0.0311590246856 +0.652892947197 +0.000688359432388 +0.0 +0.13106380403 +0.649666905403 +0.0 +0.0164530370384 +0.0204639956355 +0.0142475739121 +0.00980409793556 +0.00273677078076 +0.0878867134452 +0.0076040928252 +0.168116942048 +0.0 +0.016177855432 +0.120316870511 +0.184905856848 +0.0114004332572 +0.4560354352 +0.0241335108876 +0.471220046282 +0.0100564146414 +0.00888760108501 +0.016927389428 +0.0 +0.0877951830626 +0.0104107400402 +0.000984268728644 +0.00137975905091 +0.0983328148723 +0.0102531574667 +0.210409030318 +0.203707933426 +0.908256947994 +0.0330119021237 +1.10630714893 +0.0401932522655 +0.00557402288541 +0.00522859953344 +0.00671993149444 +0.0872277617455 +0.00464141601697 +0.0734880566597 +0.963698863983 +0.0237603634596 +0.00181447039358 +0.0427809581161 +0.109015852213 +0.00416234694421 +0.0109000559896 +0.206533715129 +0.770479917526 +0.00662650028244 +0.22178556025 +0.00896940473467 +0.0966683253646 +0.0 +0.0680603086948 +0.0306291021407 +0.0035566133447 +0.00940400641412 +0.0172551982105 +0.0402070134878 +0.018072379753 +0.26245123148 +0.375772207975 +0.44874510169 +0.00842577219009 +0.316619217396 +0.00379728106782 +0.0420331992209 +0.0 +0.133576989174 +0.00378120178357 +0.0114371124655 +0.043985567987 +0.0239076185971 +0.0588451735675 +0.0133413225412 +0.0684951245785 +0.469652503729 +0.0 +0.035994797945 +0.00513439625502 +0.240840852261 +0.013297884725 +0.513748407364 +0.041171297431 +0.0100472038612 +0.0111555149779 +0.0591884143651 +0.0566883087158 +0.506917715073 +0.00850718282163 +0.00433002691716 +0.0063896542415 +0.162522748113 +0.00850769132376 +0.0114296162501 +0.0539259873331 +0.143714189529 +0.0278651081026 +0.0615538060665 +0.544369518757 +0.0531177148223 +0.0161353703588 +0.00267240963876 +0.00551486946642 +0.0178338959813 +0.52512127161 +0.0518406778574 +0.00850431527942 +0.0618431530893 +0.0165328774601 +0.0309756249189 +0.559932589531 +0.019207008183 +0.601057648659 +0.0431066527963 +0.00977804977447 +0.00401190249249 +0.0232901778072 +0.14705170691 +0.170399740338 +0.00248383707367 +0.00884180050343 +0.0149544831365 +0.0230982843786 +0.0278409365565 +0.0 +0.0245308950543 +0.0450780577958 +0.0462278239429 +0.00484431954101 +0.00808885041624 +0.234006434679 +0.031649466604 +0.0647368058562 +0.035979911685 +0.0955426096916 +0.626889944077 +0.0125767420977 +0.0141904298216 +0.0105106495321 +0.0224523209035 +0.404781669378 +0.0174656026065 +0.418615698814 +0.00489656627178 +0.150213956833 +0.00386926159263 +0.0938028991222 +0.0833228304982 +0.0169138442725 +0.653010368347 +0.0121739301831 +0.021656094119 +0.10908934474 +0.00523790344596 +0.0138216651976 +0.0350745096803 +0.255174577236 +0.154237046838 +0.0358561426401 +0.0444280728698 +0.0761571377516 +0.0441279374063 +0.0330719538033 +0.0380221195519 +0.0506639778614 +0.0578407980502 +0.65990114212 +0.00330008985475 +0.00514100119472 +0.0158188585192 +0.409317135811 +0.682610988617 +0.690526008606 +0.0119212102145 +0.0130801536143 +0.0134844146669 +0.0193734224886 +0.0151195339859 +0.0665834918618 +0.00375689566135 +0.700234115124 +0.0246549546719 +0.438427358866 +0.0051804902032 +0.00302525493316 +0.0240881089121 +0.644835114479 +0.0173668470234 +0.027276378125 +0.0163447111845 +0.00537287024781 +0.00810822471976 +0.00578411808237 +1.20496499538 +0.013698104769 +0.425044715405 +0.85160022974 +0.0730868428946 +0.00215442408808 +0.00312801753171 +0.877954304218 +0.00650885002688 +0.00626212311909 +0.653519809246 +0.00730985077098 +0.0790084972978 +0.471123069525 +1.12458336353 +0.0327515676618 +0.111840754747 +0.014065913856 +0.0215800143778 +0.0148886945099 +0.0279425419867 +0.0251998715103 +0.014043468982 +0.0230001378804 +0.00633921753615 +0.00576606439427 +0.0511542670429 +0.00326583487913 +0.00237933499739 +0.0182392150164 +0.0136428819969 +0.431535750628 +0.0257715396583 +0.0378507822752 +0.00754987169057 +0.877841234207 +0.137128263712 +0.0 +0.00742364674807 +0.00200226623565 +0.0549888238311 +0.00365709979087 +0.183041989803 +0.0128434579819 +0.0140326898545 +0.0145070133731 +0.134117305279 +0.434695780277 +0.00482128327712 +0.0448200553656 +0.0333653390408 +0.0174456723034 +0.0 +0.0319199152291 +0.0156712457538 +0.806094765663 +0.00264499662444 +0.18589605391 +0.00357478111982 +0.00194455124438 +0.00187984691001 +0.0190020333976 +0.00707121705636 +0.79739689827 +0.0691474750638 +0.0199960544705 +0.00573430722579 +0.0153842503205 +0.00209601549432 +0.00896623916924 +0.0105218468234 +0.132330656052 +0.0 +0.815654933453 +0.00964636728168 +0.549617826939 +0.0147212808952 +0.0450768992305 +0.0691942796111 +0.051380481571 +0.00240013562143 +0.00393331376836 +0.00304832588881 +0.978639185429 +0.015808230266 +0.0267386510968 +0.0395730063319 +0.00799293629825 +0.0270527619869 +0.0119952103123 +0.00246355240233 +0.563716888428 +0.0700305998325 +0.00476653128862 +0.568079829216 +0.016580266878 +0.0120670972392 +0.932082056999 +0.00231570890173 +0.0386687368155 +0.0170004032552 +0.0324713289738 +0.0657144784927 +0.00349173578434 +0.0126519855112 +0.131784707308 +0.0125215426087 +0.0489741973579 +0.0343283899128 +0.937202334404 +0.00228554918431 +0.13298946619 +0.0846225842834 +0.10391291976 +0.0575964190066 +0.0420611873269 +0.0350854285061 +0.0405654758215 +0.0526658929884 +0.70912784338 +0.0267875809222 +0.0407847724855 +0.10986930877 +0.00742309913039 +0.16258251667 +0.665579795837 +0.922581255436 +0.0122287673876 +0.0299445651472 +0.0690805390477 +0.00410513812676 +0.861977934837 +0.0233786124736 +0.00701803108677 +0.0433897599578 +0.00783510878682 +0.0155250402167 +0.0159965455532 +0.00588752236217 +0.562365353107 +0.00489791110158 +0.000474464613944 +0.0995383486152 +0.00159797049128 +0.00111840397585 +0.00400809757411 +0.0130755482242 +0.000798978842795 +0.010469276458 +0.880374193192 +0.0337802767754 +0.0335116349161 +0.00481885671616 +0.00177960901055 +0.00481887953356 +0.909634649754 +0.0129159521312 +0.550277113914 +0.0922031402588 +0.0287399981171 +0.121544569731 +0.0207431316376 +0.00326504907571 +0.907202899456 +9.96465314529e-06 +0.000622275227215 +0.0 +0.000748992490117 +0.161615073681 +0.224861547351 +0.0065996828489 +0.0958773270249 +0.0 +0.00395723013207 +0.00210485025309 +0.0 +0.0 +0.000307829206577 +0.0 +0.0295241437852 +0.0009378119139 +0.00653772382066 +0.00835073459893 +0.011366580613 +0.00592324649915 +0.0448499396443 +0.161613553762 +0.00351159647107 +0.00571464421228 +0.00153592368588 +0.0 +0.00283760251477 +0.00606292439625 +0.00890056788921 +0.00149452802725 +0.0 +0.000198310081032 +0.0319355688989 +0.0310683492571 +0.0461489260197 +0.0130348680541 +0.0216808505356 +0.0282391998917 +0.0187758263201 +0.856362044811 +0.883065223694 +0.0 +0.0 +0.0 +0.699194312096 +0.0739420056343 +0.0608627535403 +0.00927488226444 +0.0 +0.0 +0.00929500535131 +0.0520991869271 +0.0254762396216 +0.0 +0.519835531712 +0.0177529007196 +0.736156582832 +0.000459948932985 +0.0206713937223 +0.594504892826 +0.00128967151977 +0.0 +0.181299164891 +1.70115149021 +0.0877551957965 +0.0013390443055 +0.000435807480244 +0.00890532135963 +0.026591245085 +0.0 +0.507185041904 +0.00890665315092 +0.18123626709 +0.000252534926403 +0.169812902808 +0.190076500177 +0.189044699073 +0.188077911735 +0.0 +0.0 +0.0 +0.169646337628 +0.00477396091446 +0.000191884901142 +0.000702959077898 +0.0440387763083 +0.135894685984 +0.320467680693 +0.00029024539981 +0.000760377966799 +0.0 +0.0 +0.0 +0.513727426529 +0.0 +0.0772684291005 +0.0309409368783 +1.71707856655 +0.0 +0.0229990277439 +0.0877874344587 +0.00105067098048 +0.0 +0.0 +0.0 +0.110706076026 +0.0 +0.0 +0.0166498050094 +0.0 +0.0146244941279 +0.0 +0.000278873863863 +0.0311280284077 +0.0 +0.00211213971488 +0.0347543172538 +0.662024378777 +0.00090631947387 +0.0 +0.00576831493527 +0.117255166173 +0.0 +0.0 +0.0 +0.0 +0.000312390795443 +0.000312392658088 +0.430833756924 +0.463048607111 +0.00658711604774 +0.0314336009324 +0.497180700302 +0.0124178398401 +0.00177379150409 +0.0 +0.108223773539 +0.0 +0.0081611322239 +0.000283272005618 +0.0 +0.0 +0.00177644006908 +0.00423960899934 +0.0582326799631 +0.0 +0.0 +0.000283314846456 +0.014630863443 +0.149751976132 +0.0 +0.456582576036 +4.30969776062e-05 +0.0 +0.0 +0.0 +0.000312537798891 +0.180057749152 +0.0 +0.00158671289682 +0.00801551435143 +0.0226540863514 +0.0 +0.0 +0.000283372675767 +0.00158834841568 +0.0 +0.0205848868936 +0.58911472559 +0.0 +0.0 +0.0 +0.0 +0.0 +1.56295990944 +0.0 +0.0 +0.0 +1.53411209583 +0.11824119091 +0.0057634441182 +0.344337493181 +0.0 +0.167338132858 +0.0 +0.0227017905563 +0.0 +0.000895554665476 +0.0227108839899 +0.307035505772 +0.0205924808979 +0.166836842895 +0.330061376095 +0.0 +0.00105735321995 +0.0628401115537 +0.0 +0.0 +0.0 +0.0 +0.0227225925773 +0.0 +0.0 +0.0 +0.0 +0.0 +0.29913944006 +0.518089771271 +0.0 +0.0 +0.165525525808 +0.0 +0.00106704293285 +0.0630204901099 +0.33378726244 +0.0 +0.0 +0.179756179452 +0.0 +0.0368862450123 +0.0 +0.316150605679 +0.0368863604963 +0.351677268744 +0.0 +0.0 +0.0 +1.47282254696 +0.178776800632 +0.0588689148426 +0.160774484277 +0.0 +0.0 +0.173584446311 +0.0 +0.0 +0.0 +0.000289811112452 +0.0 +0.0 +0.0 +0.0229585301131 +0.0 +0.155187964439 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.139128640294 +0.0 +0.0 +0.122979819775 +0.0644243136048 +0.0 +0.0 +0.0 +0.023208193481 +0.0 +0.0 +0.0 +0.0 +0.0 +0.157013848424 +0.0 +0.0 +0.0233018007129 +0.0 +0.327222585678 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.302033662796 +0.116424232721 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 diff --git a/tests/compare/qinit_original_rapid_qout.csv b/tests/compare/qinit_original_rapid_qout.csv new file mode 100644 index 0000000..60b05a7 --- /dev/null +++ b/tests/compare/qinit_original_rapid_qout.csv @@ -0,0 +1,4168 @@ +0.0770861208439 +0.0214960929006 +0.0494805164635 +0.919386744499 +0.0296989735216 +0.03234532848 +0.982449352741 +0.536613404751 +0.0258912816644 +0.0128599619493 +0.0337810330093 +0.470758259296 +0.447159588337 +0.0199467781931 +0.412614971399 +0.149640828371 +0.260129123926 +0.0903832390904 +0.156087383628 +0.0297836773098 +0.0561376847327 +0.0176388602704 +0.0235862303525 +0.109185948968 +0.143808156252 +0.0783447027206 +0.0203930977732 +0.0242667421699 +0.0263077653944 +0.0169475674629 +0.169974505901 +0.0472427196801 +1.20047450066 +1.52003252506 +1.24737977982 +0.0503299459815 +0.225350722671 +0.0303858760744 +0.0339229516685 +0.08648943156 +0.0965685322881 +0.0195808317512 +0.367769569159 +0.046448584646 +0.0236852113158 +0.0960016995668 +0.268803805113 +0.0433833226562 +0.0453242026269 +0.240742117167 +0.0278027094901 +0.316826879978 +0.443922519684 +0.456535160542 +0.0566219575703 +0.127100840211 +0.0566186420619 +0.491203695536 +0.590150177479 +0.0349294282496 +0.0122330058366 +0.067802451551 +0.187527447939 +0.026794610545 +0.0151278423145 +0.351217657328 +0.0560674481094 +0.0119680678472 +0.00399377429858 +0.109467945993 +0.307448387146 +0.0293694734573 +0.290831744671 +0.01577071473 +0.0428205318749 +0.0594045072794 +0.00549107557163 +0.0339626260102 +0.0475804768503 +0.016802597791 +0.0757271200418 +0.0385198220611 +0.156709268689 +0.0117952749133 +0.194917500019 +1.01209938526 +0.0391938127577 +0.0257481597364 +0.00445935269818 +0.0302065201104 +0.0213484354317 +0.0517035573721 +0.490675866604 +0.542411804199 +0.0363632515073 +0.0168292447925 +0.0625756680965 +0.390313386917 +0.0718474462628 +1.6478856802 +1.55460834503 +0.0118758538738 +0.230238541961 +0.282098680735 +0.0272538512945 +0.0260050706565 +0.0397449880838 +0.0284712184221 +1.69468009472 +0.0928490683436 +1.73217427731 +0.0229804106057 +0.0271925218403 +0.0560871809721 +0.0804821625352 +0.0172062311321 +0.0717298015952 +0.0109919374809 +0.0126915788278 +1.81417226791 +0.362727463245 +0.23902387917 +0.186486676335 +0.107547909021 +0.000436497561168 +0.152686551213 +0.0478578209877 +0.00864882860333 +1.83238661289 +0.978933215141 +0.00418235827237 +0.0127187343314 +0.388464689255 +0.0209881458431 +0.0670896470547 +0.0253419894725 +0.0117323352024 +0.0216328483075 +0.0194400120527 +0.905383706093 +0.249194100499 +0.0928492546082 +0.0169804058969 +0.342041164637 +0.024081364274 +0.129545390606 +0.0154570434242 +0.252544641495 +0.0127686373889 +1.83200514317 +0.0192461442202 +0.00559637509286 +0.0113671962172 +1.00461399555 +0.0978367030621 +0.201498061419 +0.121607780457 +0.00213675992563 +0.149539902806 +0.0151029340923 +0.226082921028 +0.165721222758 +0.202096506953 +0.0171757005155 +0.034253295511 +0.092423081398 +0.0850968137383 +0.437884688377 +0.0796691328287 +0.040811419487 +0.0257608834654 +0.419527500868 +0.381499677896 +0.00255860714242 +0.00698497612029 +0.0129892751575 +0.035355899483 +0.179465562105 +0.00427013402805 +0.00484701478854 +0.0428646057844 +0.0981856510043 +0.208970427513 +0.367090463638 +0.0362863950431 +0.0114932255819 +0.385650783777 +0.864276111126 +0.0567264594138 +0.0204750727862 +1.8441439867 +0.0162943024188 +0.0148156108335 +0.02908167243 +0.0482026860118 +0.0350192785263 +0.0335494838655 +0.00474264798686 +0.0673105120659 +0.0521157756448 +0.00588226411492 +0.941221773624 +0.018813200295 +0.0235548354685 +0.102142110467 +0.162600085139 +0.252298235893 +0.0407460927963 +0.0117110162973 +0.0153156090528 +0.0670785307884 +0.0157391335815 +0.0124461315572 +0.0103677976876 +0.0311171840876 +0.747664868832 +0.0321453623474 +0.128276363015 +0.103522434831 +0.00411540037021 +0.0277154408395 +0.0312594473362 +0.389673262835 +0.479161113501 +0.0142233800143 +0.0243333876133 +0.385828822851 +0.00821780227125 +0.000901628576685 +0.00128300895449 +0.0857135802507 +0.0135498736054 +0.105467811227 +0.0583249814808 +0.0242429077625 +0.014495914802 +0.0301896594465 +0.0194474905729 +0.0144647285342 +0.0177611373365 +0.0131042450666 +0.0841474831104 +0.0169814676046 +0.368211328983 +0.00902465824038 +0.0331964641809 +0.0219530444592 +0.008619626984 +2.60111737251 +0.724232196808 +2.56751465797 +1.8736115694 +0.00128081138246 +0.0296237654984 +0.246802434325 +0.0256618689746 +0.0205756872892 +0.00200746045448 +0.0209168195724 +0.0261287409812 +0.88117146492 +0.0320202149451 +0.0393542051315 +0.0489497482777 +0.785437107086 +0.145421102643 +0.0885389968753 +0.0233013518155 +0.00187617051415 +0.010037467815 +0.0748645663261 +0.00494547467679 +0.460536956787 +0.0356614626944 +0.00452221883461 +2.55307126045 +0.0331933200359 +0.157470196486 +0.0211327821016 +0.0400577299297 +0.0306478347629 +0.51917463541 +1.56580734253 +2.1287355423 +2.22530865669 +0.014171470888 +0.0184822622687 +0.675892055035 +0.00543518643826 +1.60439181328 +1.74990665913 +0.0968705788255 +2.99984550476 +0.0343885757029 +0.00979329645634 +0.256349474192 +0.0235119387507 +1.02407646179 +0.0112384771928 +0.00735161593184 +0.024873489514 +0.639694929123 +0.143297880888 +0.0781781673431 +0.502101898193 +0.0172572731972 +0.00950024463236 +3.05999231339 +0.0713217481971 +0.0552126243711 +0.129269897938 +0.00651271035895 +0.01526512485 +0.0115978242829 +3.08488988876 +0.0695574507117 +0.0140630509704 +0.0318540222943 +0.612560451031 +0.0852469727397 +0.0145378066227 +0.0121423080564 +0.0139454081655 +0.0116655118763 +0.0338533446193 +0.0134962098673 +0.019092194736 +0.0158301442862 +0.350605726242 +0.0111846029758 +0.033129774034 +0.0095804091543 +0.246662884951 +0.0772993937135 +0.175453975797 +0.0547707155347 +0.0610918328166 +0.00409814948216 +0.970515012741 +0.0298546049744 +0.917238295078 +0.113401539624 +0.0110815549269 +0.403240501881 +0.0814867988229 +0.310447782278 +0.205943405628 +0.00563284615055 +0.0224585663527 +0.00829112716019 +0.184986412525 +0.0619084015489 +0.767874836922 +0.0778225809336 +0.0587792135775 +0.012166342698 +0.035177949816 +0.00329697853886 +0.856702744961 +0.170596778393 +0.0689257010818 +0.100649878383 +0.00417747348547 +0.0112444795668 +0.00394780747592 +0.0356711894274 +0.00628952961415 +0.169869273901 +0.0399510078132 +0.00449742469937 +0.56649440527 +0.0124162873253 +0.312341690063 +0.0402116328478 +0.00617616670206 +0.070710837841 +0.152684420347 +0.0597327649593 +0.0374346114695 +0.306195884943 +0.0242710318416 +0.0629146620631 +0.0205851234496 +0.226680636406 +0.231878623366 +0.0653225854039 +0.0215348415077 +0.0797885805368 +0.000796880107373 +0.0542320087552 +0.836765050888 +0.0102449776605 +0.170032680035 +0.795938134193 +0.148167967796 +0.0190168581903 +0.0361791029572 +0.093394741416 +0.0764994546771 +0.120099894702 +0.132005631924 +0.0806627571583 +0.0680228099227 +0.00351892178878 +0.0186623968184 +0.00621057860553 +0.0458926074207 +0.0093323206529 +0.05392787233 +0.0147955873981 +0.00406936462969 +0.0755984783173 +0.225880458951 +0.178981244564 +0.214843839407 +0.00453693792224 +0.0488695688546 +0.76903039217 +0.298936784267 +0.022522110492 +0.0128840757534 +0.00820632930845 +0.0104824267328 +0.0236230753362 +0.0121606774628 +0.183104828 +0.00988456513733 +0.749814867973 +0.8544947505 +0.0149875814095 +0.193593367934 +0.0319993086159 +0.130245521665 +0.027606992051 +0.00185274402611 +0.0351902917027 +0.612670660019 +0.0191971566528 +0.0575150549412 +0.00857122242451 +0.209890693426 +0.0458603873849 +0.000865539885126 +0.0100960815325 +0.39931344986 +0.0440963618457 +0.021145246923 +0.261004984379 +0.00597522500902 +0.00358328199945 +0.00355309061706 +0.00431278161705 +0.0772300213575 +0.0207354836166 +0.0301052294672 +0.305908352137 +0.327384233475 +0.322502434254 +0.869062662125 +0.0109757576138 +0.156211912632 +0.0164343416691 +0.0367668531835 +0.00450603105128 +0.407114654779 +0.879874050617 +0.349443584681 +0.567744076252 +0.0836237221956 +0.033775690943 +0.0199269205332 +0.00812157336622 +0.104567825794 +0.114021331072 +0.00759348738939 +0.00377647439018 +0.0173083543777 +0.0126442573965 +0.12306792289 +0.0200569704175 +0.0171460267156 +0.0414651706815 +0.0168217420578 +0.00811784621328 +0.0846054106951 +0.0224775765091 +0.0634809061885 +0.054983984679 +0.0039384290576 +0.0129141490906 +0.022252112627 +0.00732207112014 +0.144009947777 +0.207811892033 +3.20656013489 +0.462795197964 +0.0379966832697 +0.254888266325 +0.0792165249586 +0.00823504664004 +0.0225096344948 +0.106505483389 +0.0381830856204 +0.181878387928 +0.0267609823495 +3.66791701317 +0.426216155291 +0.0620444267988 +0.00950171705335 +0.146770089865 +0.0282691009343 +0.212856039405 +0.377499699593 +0.0182582829148 +0.157003134489 +0.00239748437889 +0.0380988642573 +1.28576016426 +0.0333022214472 +0.0171660855412 +0.0976548045874 +3.70196962357 +0.0196317788213 +0.018384302035 +0.157564252615 +0.0383831374347 +0.0415811426938 +0.0303985513747 +0.00502020167187 +0.377902179956 +0.0311352033168 +0.00692659057677 +0.032840564847 +0.013412643224 +0.0155526436865 +0.0142816426232 +0.0231919400394 +0.0220541302115 +0.0197827294469 +0.011213590391 +0.017997937277 +0.0471941009164 +0.0196611881256 +0.0812864899635 +0.0652276128531 +1.32105755806 +0.0983298048377 +0.0200584791601 +0.035127826035 +0.0875499844551 +0.0552163012326 +0.0537798777223 +0.0538485683501 +0.0498268790543 +0.00207552034408 +0.0049948929809 +0.0377639494836 +0.0170015040785 +0.0818120762706 +0.0159293226898 +0.188186064363 +0.0489305183291 +0.00853299442679 +0.0428156331182 +0.356984436512 +0.142891064286 +0.0351631455123 +0.00455568311736 +0.00733903283253 +0.00546005461365 +0.00813271012157 +0.0418479293585 +0.0111142313108 +0.0583872906864 +0.00172495923471 +0.0111372591928 +0.0617620386183 +0.00977599900216 +0.0116905411705 +0.340973615646 +0.0103243943304 +0.0149207795039 +0.121949717402 +0.0115041751415 +0.00743743078783 +0.061169128865 +0.011264863424 +0.0324863530695 +0.0839972421527 +0.0126571506262 +0.0140176415443 +0.0432292930782 +3.79148626328 +0.0718890205026 +0.27659496665 +0.00774880219251 +0.00240898923948 +0.0132753839716 +0.0827038884163 +0.0128547362983 +0.106665700674 +0.171854943037 +0.0174579974264 +0.00300413300283 +0.0620813034475 +0.0361207723618 +0.00927224103361 +0.0139989834279 +0.029970664531 +0.00270353350788 +0.0393529869616 +0.134859070182 +0.067670352757 +0.0112350285053 +0.0155202914029 +0.00519276876003 +0.00972001440823 +0.0577719882131 +0.0307001806796 +0.0168837811798 +0.00220781308599 +3.85511350632 +0.0362096987665 +0.013344168663 +0.296724885702 +0.00274288398214 +0.303373217583 +0.000900949700736 +0.182244956493 +0.017879800871 +0.0907302051783 +0.0215674918145 +0.0174125116318 +0.158884748816 +0.325259923935 +0.040588375181 +0.00826593022794 +0.0280445963144 +0.00718726078048 +0.139840856194 +0.0811375305057 +0.0741227939725 +0.0253507532179 +0.0157508533448 +0.0929771065712 +0.0764888226986 +0.0368383713067 +0.00537678739056 +0.0531804636121 +3.90198493004 +0.0283812973648 +0.233178168535 +0.0608520396054 +0.0131116481498 +0.0452945046127 +0.00345663260669 +0.0256365314126 +0.0 +0.027268178761 +0.538381755352 +0.0593353919685 +0.0225258450955 +0.208723694086 +0.0863551050425 +0.0027451668866 +0.168301850557 +0.0130794951692 +0.131655588746 +0.281354337931 +0.063545666635 +0.0523193068802 +0.0297262892127 +0.0055663282983 +0.00330339185894 +0.0119790909812 +0.0121942795813 +4.4510512352 +0.118934847414 +0.00264395563863 +0.0113846547902 +0.0985282361507 +0.0786034762859 +0.00533794332296 +0.0789653211832 +0.0193502213806 +0.0103095779195 +0.247137457132 +0.0117459213361 +0.128634259105 +0.133230119944 +0.152758657932 +0.0704416483641 +0.0303390342742 +0.376766890287 +0.252172261477 +0.00535332737491 +0.0179951246828 +0.0362907722592 +0.327313154936 +0.00973825901747 +0.00886075571179 +0.0235354285687 +0.139453738928 +0.00711055984721 +0.0139396125451 +0.206036686897 +0.0181976519525 +0.0419529490173 +0.113880701363 +0.0097966240719 +0.142475768924 +0.235082179308 +0.0723275393248 +0.123466745019 +0.0964294672012 +0.011628061533 +0.348821222782 +0.0258091762662 +0.408931940794 +0.00823519006371 +0.0188101045787 +0.0140683772042 +0.00264850142412 +0.00495174713433 +0.0610962919891 +0.154734075069 +0.229872912169 +0.0262680090964 +0.0368462428451 +0.19618947804 +0.0147768007591 +0.0307407137007 +0.023250726983 +0.00305828708224 +0.0 +0.0038862475194 +0.00745423231274 +0.00630003539845 +0.436286538839 +0.0116820679978 +0.215894460678 +0.0101516451687 +0.104274213314 +0.0566085241735 +0.0125357173383 +0.00404583197087 +0.195869103074 +0.0528089255095 +0.307547539473 +0.274039208889 +0.0684107244015 +0.0746062621474 +0.223031401634 +0.0627625361085 +0.507652819157 +0.011463901028 +0.165530920029 +0.00976888276637 +0.0195181015879 +0.0593846216798 +0.00490233581513 +0.0488205626607 +0.0143534578383 +0.370428770781 +0.0258253067732 +0.0887914225459 +0.0333663709462 +0.0453666374087 +0.0945367887616 +0.00945762917399 +0.0 +0.205519795418 +0.040753826499 +0.0374972037971 +0.00497891707346 +0.140767142177 +0.054097302258 +0.222884982824 +0.0139402002096 +0.476115822792 +0.0525848530233 +0.00591819034889 +0.0511206910014 +0.0596022754908 +0.0595254004002 +0.0379157997668 +0.0071964059025 +0.0127169266343 +4.47501850128 +0.639685511589 +0.310976088047 +0.0800854936242 +5.11750030518 +0.00244154664688 +0.3078327775 +0.152742370963 +0.228938296437 +0.0192832648754 +0.0223597027361 +0.31611353159 +0.00244728359394 +0.538195252419 +0.0143426116556 +0.022685771808 +0.452674329281 +0.00915508996695 +0.0250571258366 +0.00265951966867 +0.0115329278633 +0.0076835625805 +0.0108934510499 +0.011528163217 +0.0590863898396 +0.0257296673954 +0.0038242880255 +0.0182443689555 +0.532951235771 +0.495091557503 +0.111814036965 +0.042378410697 +0.01407866925 +0.199941188097 +0.00965265836567 +0.00678596412763 +0.00629546167329 +0.00420420616865 +0.251777291298 +0.00240401714109 +0.0468768589199 +0.011973656714 +0.159376755357 +0.0 +0.0 +0.00337562058121 +0.118948020041 +0.00418875832111 +0.0260458234698 +0.0493256598711 +0.256844431162 +0.0063953413628 +0.0138413235545 +0.010208630003 +0.155746757984 +0.00822438392788 +0.0131955640391 +0.0151312202215 +5.31973600388 +0.020160023123 +0.0234703104943 +0.108708284795 +0.0781644582748 +0.0561016239226 +0.0719376578927 +0.0034783880692 +0.318169772625 +0.0076874285005 +0.11097048223 +0.0216123890132 +0.0592600814998 +0.0501072481275 +0.0690867900848 +0.119363337755 +0.0136816371232 +0.00315137160942 +0.00770586822182 +0.025423232466 +0.00696774711832 +0.00318028219044 +0.253433376551 +0.0329370610416 +0.0216076821089 +0.228811487556 +0.0160006210208 +0.223514094949 +0.0178029257804 +0.144217506051 +5.56102514267 +0.0066867726855 +1.38457536697 +0.0126920137554 +0.0561717227101 +0.330751746893 +0.0246456507593 +0.574519813061 +0.584564387798 +0.00259638321586 +0.360011994839 +0.0116998385638 +0.0145251005888 +0.0397389046848 +0.356653213501 +0.0567258521914 +0.00359692983329 +0.397955596447 +5.85008049011 +0.68048453331 +0.00737501261756 +0.00686058588326 +0.00985319167376 +0.106248550117 +0.132061481476 +0.0260285995901 +0.379580587149 +0.0220158342272 +0.560829937458 +0.00661089411005 +0.154116734862 +0.142804637551 +0.407412797213 +0.20542024076 +2.17907238007 +0.00340063753538 +0.084337644279 +1.39019632339 +0.448930233717 +0.267334610224 +0.0238011777401 +0.0295665320009 +0.0 +0.00556351011619 +0.0585119277239 +0.425311565399 +0.60164731741 +0.18862092495 +0.373150110245 +0.116101175547 +0.192865759134 +0.0657879933715 +0.260904937983 +5.99600219727 +0.246759459376 +0.0154577922076 +6.26229906082 +0.00470136431977 +0.0902790799737 +0.574868202209 +1.94831204414 +2.2128663063 +0.137899205089 +0.0 +0.13555033505 +0.00851539429277 +0.0100349467248 +0.100873194635 +1.32606840134 +0.00488425604999 +0.598333775997 +0.170803979039 +0.0691717490554 +0.0635814741254 +0.236420363188 +0.258328586817 +0.0447260811925 +0.0140744335949 +0.0154753671959 +0.6075694561 +0.0579272285104 +0.00442837877199 +0.0561917945743 +0.56078094244 +0.0896469801664 +0.039968341589 +0.0145387509838 +0.0100147472695 +0.631283044815 +0.0720205381513 +0.0410793945193 +0.0328342579305 +0.0081742387265 +2.3473713398 +0.108341410756 +1.05293476582 +0.0121267987415 +0.0 +0.0 +0.0154936863109 +0.0135507369414 +0.870318949223 +0.583273172379 +0.00474938843399 +0.00434714974836 +0.0162163730711 +6.25593471527 +0.0293582100421 +0.0113254478201 +0.00309652741998 +0.0404475219548 +0.0142458733171 +0.0419213734567 +0.198938384652 +0.00239452254027 +0.0327910967171 +0.589854836464 +0.0147320646793 +0.0240348540246 +0.0118112759665 +0.0227535068989 +0.623201489449 +0.0114651946351 +0.77380412817 +1.01472568512 +0.00487825181335 +0.0210366975516 +2.35400104523 +0.884212911129 +0.937498569489 +0.00941427703947 +0.270536184311 +0.045326333493 +0.151777461171 +0.00870185066015 +0.00492139020935 +0.612185359001 +0.00837464444339 +0.850145816803 +0.232053726912 +0.0353243649006 +0.0259375870228 +0.173225969076 +6.27140283585 +0.0662955567241 +0.267732739449 +0.0455017462373 +0.0126767773181 +0.00569172622636 +0.624175727367 +1.86482024193 +0.0359247773886 +0.499093949795 +0.979128241539 +0.00298006855883 +0.174037337303 +0.1106178388 +0.0157198272645 +0.00141090806574 +0.00187326734886 +0.0391863621771 +0.865472614765 +6.12439775467 +0.0243286900222 +4.02193069458 +0.0627421811223 +0.519841253757 +0.179050609469 +0.0181822441518 +0.0109878461808 +0.0339147299528 +0.0269872192293 +0.00706759328023 +0.00285075325519 +0.632243275642 +0.0186549741775 +0.0337651334703 +0.153346061707 +0.0134620647877 +3.21839737892 +0.00266763824038 +0.0319919474423 +3.23188853264 +0.108232595026 +0.135002866387 +0.0281987283379 +0.0226049125195 +0.0560982637107 +0.00770605541766 +0.0790827274323 +0.279694855213 +0.311524152756 +0.0147374160588 +0.0334276854992 +0.0124570699409 +3.15893912315 +0.0187860243022 +0.0240215733647 +0.0287544410676 +3.24470567703 +0.0438104271889 +0.148236677051 +0.0193741749972 +0.00284212338738 +0.213105410337 +0.0373358428478 +0.0347134508193 +0.668259143829 +0.0494349375367 +1.90590429306 +0.0325079746544 +0.0764005407691 +0.0153420669958 +0.0301544014364 +1.27043700218 +0.451171964407 +0.842016041279 +0.113081373274 +0.0304550472647 +0.0205729138106 +1.6904425621 +0.0513663738966 +0.166749894619 +0.00325644854456 +0.0911737009883 +0.0532395616174 +0.907798171043 +3.14033794403 +0.0210177209228 +0.00659485207871 +0.0643307566643 +0.0103758405894 +0.00752124190331 +0.097451351583 +5.90267133713 +0.607287108898 +0.139766350389 +0.0310574471951 +0.0100791510195 +0.0103000560775 +0.0349480137229 +0.753595113754 +0.216915860772 +0.119894258678 +3.25794768333 +0.00961225107312 +0.946748614311 +0.0553756393492 +0.00420405948535 +0.593322277069 +0.0 +4.04519128799 +0.00837241765112 +0.0707521364093 +0.0543547533453 +0.283221006393 +0.177693560719 +0.0 +0.174442693591 +0.043483056128 +0.0 +0.0275421515107 +0.87311154604 +0.0516008548439 +0.0503388904035 +1.01855933666 +0.0 +0.0 +3.13501191139 +0.162321165204 +0.0128437913954 +0.0239602532238 +0.00661372859031 +0.177867308259 +0.00979739893228 +0.00188260839786 +1.07522749901 +0.123710483313 +0.0608591847122 +0.180799439549 +0.177150592208 +0.0331890955567 +0.00553051894531 +0.00809531100094 +0.135324552655 +0.265116453171 +0.0135090723634 +0.943499267101 +0.0361501686275 +0.00250215828419 +0.051036760211 +0.00460250815377 +0.00692991586402 +0.0292889811099 +0.343133062124 +0.0385545864701 +0.00428011314943 +0.0279123447835 +0.00418414641172 +0.0214864574373 +0.0520740412176 +0.0 +0.0214654412121 +0.0420172810555 +0.149607524276 +1.09352076054 +0.00156319828238 +0.480364620686 +0.458531856537 +0.0761424079537 +0.0 +0.0177918244153 +9.62497942965e-05 +0.110215850174 +0.0184788163751 +3.18159890175 +0.00835436489433 +0.227411836386 +0.301861792803 +0.00428125774488 +0.633547902107 +3.12632846832 +4.08536577225 +2.07806372643 +0.0 +0.0329346433282 +3.18289780617 +0.856086552143 +0.545933187008 +0.0133065450937 +6.16294908524 +0.125570133328 +0.00788880139589 +0.00401543732733 +0.0 +0.0539519451559 +0.0 +0.121347978711 +0.0 +0.0534211695194 +0.129268541932 +0.69223511219 +0.0115819629282 +0.0327736027539 +0.017020277679 +0.0240564327687 +0.00435064174235 +0.0 +0.129267767072 +0.129267275333 +0.532285094261 +0.0220534093678 +0.0453872121871 +0.0 +0.0172858163714 +0.0270255040377 +0.0266111884266 +0.00402102340013 +0.0331890173256 +3.18426442146 +0.0283486135304 +0.893531322479 +0.384873121977 +0.664300262928 +0.0775493085384 +0.138126984239 +0.090743035078 +0.248988643289 +0.0117567349225 +3.21619105339 +6.28984737396 +0.131675437093 +0.0675193145871 +0.00738256983459 +0.107354968786 +0.0584191717207 +0.0147732840851 +0.0176494568586 +0.00965985655785 +0.00670431321487 +3.21985650063 +0.0156606398523 +0.608180999756 +0.00446832366288 +0.0 +0.00285636214539 +0.00285570835695 +0.095708027482 +0.00832239631563 +0.00190248899162 +1.14189469814 +0.0967955067754 +0.104387030005 +0.0206543952227 +0.0343538336456 +0.0439396202564 +0.261618673801 +0.382310003042 +2.30840992928 +2.37014389038 +2.43291568756 +0.153666839004 +0.0589562691748 +0.00418772082776 +0.00347898667678 +0.0126447258517 +1.15731227398 +0.717664420605 +0.0138266663998 +0.0740062370896 +3.34795427322 +0.022190708667 +0.0192327722907 +0.0407209135592 +0.213746145368 +0.0564994513988 +0.0 +0.0 +0.189013272524 +0.0203038305044 +0.017232267186 +2.20126390457 +0.135071113706 +0.664483726025 +0.0225578844547 +0.103702500463 +1.11954021454 +0.0429060459137 +0.0 +0.017860962078 +2.12555265427 +0.0525242388248 +0.00333635671996 +2.10666680336 +0.053957272321 +0.0293601024896 +0.00813791621476 +0.229417994618 +0.0268181245774 +0.0504172444344 +0.0221041385084 +0.0139955738559 +0.130511507392 +0.0 +0.0 +0.55305480957 +0.0244080740958 +0.113982886076 +0.0232246499509 +0.0051543591544 +0.0716771930456 +0.0 +0.118928335607 +0.25665768981 +0.154812708497 +0.00908755231649 +0.0 +0.0362943895161 +0.0152747128159 +0.469283431768 +7.36617803341e-05 +0.0 +0.0421127006412 +0.0472500510514 +0.644074618816 +0.069484308362 +0.375682741404 +0.035153824836 +0.0488116778433 +0.00364605407231 +1.21724104881 +1.41889572144 +0.0 +0.0 +1.22578167915 +0.0711636021733 +2.10327172279 +1.10937678814 +0.0 +2.00697994232 +1.28918337822 +1.26433706284 +2.09024834633 +0.0233071036637 +0.019302835688 +1.28955698013 +0.0204935241491 +0.106909543276 +0.0 +2.08635282516 +0.688842654228 +0.0767575800419 +1.41370487213 +0.437983542681 +0.00574742769822 +0.00792856235057 +0.0443160273135 +0.701761841774 +0.207744836807 +0.0560889430344 +0.0 +0.0 +0.0 +0.217795133591 +3.42090535164 +0.00814066920429 +0.0116071458906 +0.217795044184 +0.0121938884258 +0.0757055655122 +0.0 +0.0921275615692 +3.42645049095 +0.0 +0.492143690586 +0.0653104260564 +0.046899612993 +0.456531316042 +0.553331673145 +0.0303130131215 +0.00521241500974 +0.217800617218 +0.045174986124 +0.0218923147768 +0.0236246958375 +0.452242344618 +0.0104300025851 +0.00409614667296 +1.28883183002 +0.0103540141135 +6.37925720215 +0.0158552210778 +1.260379076 +0.0133659103885 +0.00992249045521 +0.101321227849 +0.0685840398073 +0.124142862856 +0.0184449031949 +0.0140140727162 +0.0149986697361 +0.0844125151634 +0.0632233470678 +0.637004315853 +0.00640575960279 +0.942156255245 +0.0582359395921 +0.0312847867608 +0.0715178698301 +0.0335150025785 +0.0216965954751 +0.0 +0.0420745834708 +0.00547310430557 +1.1418774128 +0.012092275545 +0.00288263312541 +0.0138760125265 +0.0420407652855 +0.0199458748102 +0.0302486531436 +1.61288416386 +0.0246539134532 +0.802760362625 +1.05583548546 +1.51301431656 +0.0126575296745 +0.112080998719 +0.935940802097 +0.151071220636 +1.63060879707 +0.85337895155 +0.218183591962 +0.627280831337 +0.0161139201373 +0.649458289146 +0.829699933529 +1.54250514507 +1.59331822395 +0.0171107314527 +0.180285409093 +0.00613852916285 +0.0 +0.0347108356655 +0.0128436163068 +0.197118282318 +2.50093579292 +0.755247473717 +1.72345173359 +0.0124460840598 +0.00419307081029 +0.0106693245471 +0.0 +0.484501421452 +0.0833537727594 +2.74357295036 +0.0969193801284 +6.38665342331 +0.0604564510286 +0.603907823563 +0.381089359522 +3.54134249687 +0.0175417233258 +0.906987071037 +0.0189976841211 +0.0770821869373 +0.175222322345 +0.00656407512724 +0.00245384941809 +0.126873239875 +0.0537822730839 +7.25467634201 +0.00355227990076 +1.01378703117 +0.0195177253336 +2.86016345024 +0.0923157036304 +0.957638680935 +7.26183366776 +0.0104998173192 +0.211656451225 +0.0730139315128 +0.595951139927 +0.0 +0.00512652844191 +0.931395709515 +0.0 +0.00851422175765 +2.93745088577 +0.113724038005 +0.0738275572658 +0.0 +0.237294733524 +0.0 +0.490056544542 +0.0263011455536 +0.106143042445 +0.00972285028547 +0.0460872240365 +0.0457567833364 +0.0214241631329 +7.20366430283 +1.31516289711 +0.0721458941698 +0.0345303304493 +0.583031356335 +0.348712176085 +0.0118616949767 +0.493482410908 +0.010383611545 +0.0364009514451 +0.190479084849 +0.138762816787 +0.292200446129 +0.0406602025032 +0.0985375791788 +0.0127709275112 +0.895911812782 +0.782671511173 +0.865679979324 +0.130700841546 +0.145854592323 +0.0 +0.135754793882 +0.146328300238 +0.47412443161 +0.0757824480534 +0.0198107548058 +0.0429368242621 +0.132818713784 +3.90333008766 +0.222475335002 +0.0829228833318 +0.0650024041533 +0.129651367664 +0.0733803957701 +0.239126861095 +0.0414941608906 +0.0696234703064 +0.0516813732684 +0.64014339447 +0.0 +0.0374545231462 +0.0179118067026 +0.53561681509 +0.050068449229 +0.0217725019902 +0.211654126644 +0.0899219289422 +0.106432214379 +0.0559163019061 +0.00425632484257 +8.43221187592 +0.0129815991968 +0.0275671891868 +0.0 +0.00557836145163 +0.125441938639 +0.0086110336706 +0.00472891610116 +0.0502578541636 +0.0603653527796 +0.03180770576 +0.0975100696087 +0.0 +0.201451733708 +0.0 +0.158624768257 +0.0364316925406 +0.0255652014166 +3.07843828201 +0.0327208191156 +0.117683805525 +0.09370123595 +0.0330226719379 +0.0134377479553 +0.16378672421 +0.0755338072777 +0.0372643657029 +0.0447973273695 +0.196107953787 +0.00437971251085 +0.0 +0.899253308773 +4.09336280823 +0.0615789145231 +0.0806607082486 +0.483060240746 +0.0155580136925 +0.0204372927547 +0.00884717330337 +0.00159385812003 +0.0578462071717 +0.120470874012 +0.0683213919401 +0.0473998598754 +0.314251035452 +0.0320693776011 +0.0229154489934 +0.249777033925 +0.116175457835 +0.0176940485835 +0.00583745492622 +0.451917499304 +0.00548716122285 +8.36476135254 +0.0104723172262 +8.37292003632 +0.00173664500471 +0.0122336754575 +0.00742519879714 +0.0184460654855 +0.0994352474809 +0.0886116847396 +0.0212951861322 +0.0249796584249 +0.103302143514 +0.139152720571 +4.97931575775 +0.0170392282307 +0.072408080101 +0.0508583374321 +0.0849606618285 +0.386949747801 +0.0505928322673 +0.0722436383367 +0.547671437263 +0.0132641633973 +3.25342679024 +0.00554803013802 +0.348126590252 +0.432821273804 +0.0369283631444 +0.0276484340429 +0.0427921824157 +0.0501621514559 +0.165863797069 +0.0376657322049 +0.0161342732608 +0.249877944589 +0.0744281336665 +0.23793014884 +5.12846708298 +0.0631575137377 +0.0290705878288 +0.0427669286728 +0.0131844123825 +0.0171428248286 +0.0079874349758 +0.0131849981844 +11.2042121887 +11.0891113281 +0.0160857085139 +5.1912651062 +0.372997641563 +0.0483066961169 +0.0819923132658 +0.0293757040054 +0.0171531699598 +0.018174925819 +0.0742589011788 +8.26092433929 +0.351691961288 +0.299569517374 +0.177544236183 +5.54060983658 +0.0750806778669 +11.2800588608 +0.0241027344018 +0.0154813705012 +0.315509736538 +0.0553905665874 +0.36608093977 +1.02779746056 +0.0333564132452 +0.0675527155399 +0.128203764558 +0.00564513076097 +0.295860141516 +0.0579411126673 +0.256932854652 +0.196435049176 +0.0288618858904 +0.0473557934165 +0.0532222352922 +0.0302435681224 +0.335350096226 +3.36228370667 +0.0102242846042 +0.0916326344013 +0.27885016799 +0.020604910329 +0.0551822334528 +10.9489631653 +0.358774423599 +0.0 +0.0248702671379 +0.0103789493442 +0.0 +0.476291775703 +0.0092660645023 +0.0412578396499 +0.0375855006278 +0.0141422348097 +0.116678275168 +0.224759429693 +0.00398068828508 +11.2780809402 +0.108347557485 +0.00418529100716 +0.348953187466 +0.00173594884109 +0.369996964931 +0.28361427784 +0.75532501936 +0.21811658144 +1.23811745644 +0.115773499012 +1.4317907095 +0.144673883915 +0.0214179940522 +0.462062627077 +0.0192869585007 +0.0135716171935 +0.16501109302 +0.342369765043 +0.392442345619 +0.0530154109001 +8.22195243835 +0.023188713938 +0.116386063397 +0.130208939314 +5.61338710785 +0.0744882673025 +0.159604415298 +0.0369188524783 +0.00787299126387 +0.00912530347705 +11.3444252014 +0.0616272129118 +0.00231629167683 +0.485960066319 +0.0755860507488 +1.61377847195 +0.0683012381196 +0.109426259995 +0.199666813016 +11.520567894 +0.0118672298267 +0.0102869905531 +0.0686180144548 +0.113197848201 +0.332671701908 +0.0405777804554 +0.024496756494 +0.54651683569 +0.123454920948 +0.0103317853063 +12.0351324081 +0.143731832504 +0.617213010788 +0.251618087292 +3.81010603905 +0.0153455641121 +0.0108273820952 +0.00365841924213 +0.294737040997 +0.0443420149386 +0.0727598816156 +0.801118671894 +0.00993695482612 +11.9418668747 +0.0144011117518 +0.0150095904246 +12.1548156738 +0.0812304317951 +0.0168679002672 +0.0943202972412 +0.982367157936 +1.61354470253 +0.696413755417 +11.8515319824 +11.5398464203 +0.0558292157948 +0.0222414899617 +0.0272223316133 +0.131770014763 +0.0753928795457 +5.74196624756 +1.49499309063 +0.398013323545 +1.77476084232 +0.250875025988 +0.15586809814 +0.116066686809 +0.00473058130592 +8.11776733398 +0.0096224071458 +0.0860958397388 +1.95115685463 +31.3955745697 +0.670666277409 +0.102909713984 +1.09547054768 +0.0473832823336 +12.0837345123 +29.9551925659 +0.046710472554 +0.199329003692 +0.128367260098 +32.6168518066 +8.06086730957 +0.134756907821 +0.0339588224888 +0.067796997726 +10.9174423218 +0.00681622000411 +0.0384366773069 +0.137466788292 +1.95030486584 +1.27026546001 +0.285307556391 +0.0825354680419 +4.22239208221 +0.0657034739852 +0.0374901667237 +0.0165054239333 +0.0108595276251 +8.02684307098 +0.0174536351115 +0.0104633076116 +0.00769953522831 +0.0316726788878 +0.0388520769775 +22.8913784027 +6.39522886276 +29.9555473328 +24.3085632324 +0.0773153826594 +24.2473754883 +0.0172244999558 +0.202478140593 +0.0421785973012 +0.0879653692245 +10.585770607 +0.0183815471828 +12.0903110504 +0.00430337199941 +12.2165117264 +0.0483850166202 +0.171658486128 +0.0384114682674 +0.117919750512 +0.800555586815 +0.0605522878468 +0.0206577200443 +31.0605754852 +0.925015985966 +2.18894052505 +0.0166229642928 +0.075064510107 +0.114719651639 +0.0962618589401 +0.10740416497 +0.0348290018737 +0.0756198391318 +0.0569661743939 +31.8950119019 +0.0425206050277 +1.57839882374 +0.0637466385961 +0.807308375835 +31.8936672211 +0.111676648259 +7.88336801529 +0.21399769187 +0.356036782265 +0.0972277522087 +4.35886144638 +0.064275123179 +0.0 +0.00599367078394 +0.127766519785 +22.9735107422 +25.3140983582 +2.86272001266 +0.0093957465142 +0.0468176715076 +0.0562809295952 +10.4566497803 +10.1459684372 +0.0890088677406 +0.00854536611587 +0.0312510691583 +0.57796651125 +0.0555899478495 +0.073682628572 +0.167715340853 +10.0408306122 +0.0403438843787 +0.0996661260724 +0.0119522185996 +23.3776111603 +0.0808827057481 +0.00203225761652 +34.328327179 +0.0902941077948 +0.00847997982055 +10.4485340118 +0.00254680076614 +0.0165635440499 +0.0319559685886 +0.0573721565306 +2.30638313293 +0.0654153898358 +0.082623757422 +0.0210748687387 +0.0612637214363 +0.0314339511096 +0.0458590276539 +10.3479375839 +10.0692367554 +0.0943066254258 +0.0943607911468 +1.71232533455 +0.0446880273521 +0.991377949715 +9.2989654541 +0.0578738562763 +0.0137843694538 +0.00621440866962 +2.37553930283 +21.5429458618 +33.8208732605 +0.00481312256306 +4.47695159912 +0.144319072366 +0.330977588892 +21.2742576599 +2.74007153511 +0.0487792380154 +0.0142288738862 +0.0647787973285 +0.0763497874141 +0.0252477582544 +0.0701628178358 +0.0163241103292 +21.1364898682 +0.693950295448 +32.7649879456 +32.7981681824 +0.00937592610717 +21.8106136322 +0.0979026779532 +0.0222704298794 +2.53542351723 +0.0324526689947 +0.0169646013528 +0.00528087140992 +0.0 +7.60069131851 +9.78353595734 +0.0151369404048 +0.0824743881822 +19.4871387482 +0.0420413129032 +4.48529243469 +0.0 +0.0143822990358 +0.0981396213174 +0.025837559253 +0.00350107462145 +9.47461414337 +0.0251133088022 +30.2018489838 +0.0194740910083 +21.6091556549 +23.3811855316 +0.00672575179487 +0.00165856408421 +0.110240675509 +0.010796056129 +0.0 +0.0899229049683 +0.00662808353081 +0.00235031032935 +0.096085742116 +0.0200381949544 +0.0221404507756 +0.0879449173808 +0.370859891176 +0.00975160114467 +0.576660752296 +0.398290365934 +0.0270726904273 +0.0 +0.316915154457 +0.0067920726724 +0.0531923212111 +0.0303788390011 +0.0687454119325 +0.0114774517715 +2.92475652695 +9.65486049652 +1.82652318478 +0.0819148272276 +0.0704777017236 +9.4140958786 +0.439284265041 +0.0173214618117 +0.0739511549473 +0.00364688201807 +2.4492752552 +1.59324014187 +0.0512745976448 +9.62528705597 +0.0342198647559 +0.0424325950444 +0.0190944243222 +0.0902284085751 +0.0494414791465 +0.00438303640112 +0.178560420871 +0.136475205421 +0.536828756332 +0.0133639732376 +0.0110594034195 +0.238899379969 +0.0443523898721 +9.23918247223 +4.50937843323 +0.127284601331 +0.131990551949 +0.0681271851063 +0.0479849949479 +0.0195754487067 +19.3292655945 +0.0484250597656 +0.0724378749728 +0.224227800965 +9.46577548981 +13.6955890656 +0.00818379130214 +0.0280996914953 +0.132190734148 +0.339479595423 +0.0475934669375 +9.67285633087 +2.43547677994 +0.0796519964933 +1.12270331383 +0.263832956553 +0.00867034308612 +1.74516069889 +9.43463039398 +0.0941472575068 +0.0661547631025 +0.00222228746861 +0.973455369473 +0.4885597229 +0.00655911816284 +13.5376586914 +0.0275134611875 +0.0401309020817 +0.0508982911706 +13.5226783752 +0.00312510249205 +0.0542656034231 +0.058396011591 +0.0728790462017 +0.0288649275899 +0.272076189518 +0.253094404936 +0.0 +0.00731543777511 +1.97886240482 +0.674506902695 +2.34625649452 +0.0068966159597 +0.0602036267519 +0.005508269649 +0.200218990445 +0.76685333252 +0.498966276646 +0.02674956806 +2.51023340225 +0.069741524756 +0.00407017534599 +2.16014623642 +0.0212459564209 +0.0046949442476 +0.123782098293 +0.0093035902828 +0.252044528723 +0.0202493965626 +0.330728471279 +0.0116066774353 +0.219253137708 +2.35419249535 +0.630661606789 +0.00972642656416 +3.00299978256 +0.0 +0.076675221324 +0.142098724842 +0.00700280116871 +0.0233877021819 +0.00320887751877 +0.0650309771299 +0.0831305831671 +0.0322971902788 +0.360457926989 +0.0318000018597 +2.55790424347 +0.49918487668 +0.17638617754 +0.0 +0.0742661207914 +0.185605898499 +0.225194022059 +0.0941888466477 +0.13397026062 +0.0 +0.0 +0.119566403329 +0.194979831576 +0.00522934552282 +0.0 +0.266438990831 +1.14827537537 +0.158788591623 +0.0 +0.00404774490744 +0.0175545923412 +19.4924964905 +0.339664459229 +0.140549138188 +0.0338963866234 +0.0373056270182 +0.0699463710189 +2.95825457573 +0.0582074224949 +0.280318617821 +0.0 +0.216896399856 +0.0375596322119 +0.233182743192 +0.0 +0.0120235113427 +0.0217717345804 +0.531492233276 +0.0 +0.0134422574192 +0.0 +0.238520875573 +0.0619985871017 +0.0 +2.63161063194 +0.0385703779757 +0.0 +0.117956228554 +0.0666696429253 +0.933691620827 +0.0 +0.00908563472331 +2.22435522079 +0.0381994210184 +0.0750529915094 +12.4121608734 +12.3920917511 +0.0269581004977 +1.31937515736 +0.0381444431841 +0.0572129823267 +0.0568625666201 +0.131180301309 +0.0198146030307 +1.33377850056 +0.58126449585 +0.174347087741 +0.0 +0.084656573832 +0.0882479846478 +0.0140644237399 +0.238077938557 +0.544164955616 +0.276651889086 +0.687014818192 +0.104045450687 +0.0425693653524 +0.12816311419 +0.146000355482 +0.00945958215743 +0.0 +0.630674123764 +18.622171402 +0.128496646881 +0.110842362046 +0.494435220957 +0.0 +0.0 +0.368425041437 +0.0 +0.0218369234353 +1.38829660416 +16.4380779266 +16.3233299255 +18.7100105286 +0.0 +0.306088119745 +0.0665500536561 +0.114454850554 +0.0981963351369 +2.82696676254 +0.13638715446 +12.0576696396 +0.166883677244 +0.096164084971 +1.63457322121 +0.595674335957 +0.192750021815 +0.0184402689338 +0.296933323145 +0.0643359348178 +0.0121393464506 +0.365069061518 +0.011475305073 +0.327959358692 +0.168692082167 +0.346856325865 +2.14080405235 +0.0481823422015 +2.8047990799 +0.0438390150666 +0.0196066815406 +0.213443025947 +0.0383582115173 +0.0022259184625 +0.157528430223 +0.0 +0.0651264563203 +2.69670248032 +0.3799020648 +0.0129528325051 +0.0645610764623 +0.0199869573116 +0.940737605095 +0.0476790182292 +0.060391061008 +0.0136498017237 +0.00669862423092 +0.229353815317 +0.019975848496 +0.0 +0.0861117765307 +0.0 +0.14628636837 +0.211907237768 +0.239411771297 +0.278335422277 +0.0134779615328 +0.0190726611763 +0.103197485209 +0.0656896084547 +4.38593387604 +0.00822987500578 +0.117207847536 +0.0655201375484 +1.0373185873 +0.00382757768966 +0.0184311810881 +0.0172208584845 +0.0163249019533 +0.0100271077827 +0.397868663073 +0.263877511024 +0.983985304832 +2.42190098763 +0.00361210852861 +0.00792950298637 +0.037114251405 +0.0244309064001 +1.08245182037 +0.0184842906892 +0.523772835732 +15.6400566101 +0.458582431078 +0.038129016757 +0.0138481073081 +0.00929793063551 +0.0101703032851 +1.18675804138 +0.0264209378511 +0.0220663622022 +1.04666113853 +0.0368331447244 +0.0791280940175 +0.00333181256428 +0.00381661835127 +0.0184229314327 +0.00304685416631 +1.51306951046 +0.007576525677 +0.0653261318803 +0.0934315398335 +0.0 +0.0 +0.00266760145314 +0.0 +0.547943234444 +0.0188102200627 +0.0 +1.95690786839 +0.0158442426473 +0.0 +0.0 +0.0 +0.0 +0.0 +0.562189519405 +0.00621293950826 +2.1022644043 +0.0 +0.0 +0.0117395892739 +0.00733685400337 +0.48256200552 +0.0 +0.0173310767859 +2.07309556007 +1.64650285244 +0.0168413836509 +0.0114614032209 +0.0123437065631 +0.0 +0.0 +4.31663274765 +0.0 +0.0465133674443 +0.00921668671072 +2.82461929321 +0.0353904552758 +0.0 +0.0105904657394 +2.86463356018 +0.0 +0.272216677666 +0.261413663626 +0.0717049092054 +0.0288443621248 +0.0 +2.64037966728 +0.433740735054 +0.18207372725 +0.0995903909206 +0.0209056492895 +0.0410225614905 +0.0 +0.0 +0.0 +0.0128219556063 +0.0 +0.0654567852616 +0.402101814747 +0.0308141652495 +0.0695560574532 +1.45289325714 +0.0849085152149 +0.0491076000035 +0.0641062110662 +0.161580249667 +0.0375998392701 +0.0084771765396 +0.0 +0.0 +0.0 +0.0175556913018 +0.0345798842609 +0.0 +0.0309661496431 +0.410228610039 +0.365732818842 +0.275157481432 +0.0121228629723 +0.283905297518 +0.331702411175 +0.0200471747667 +0.166884765029 +0.225306138396 +0.0234111789614 +0.021238040179 +0.0 +0.0470071658492 +0.00324162887409 +0.0119636291638 +0.181399151683 +0.0 +0.0 +0.00228891288862 +0.0225796625018 +1.02652597427 +0.0536210797727 +0.0206464752555 +0.282115876675 +2.30156445503 +0.0573808290064 +0.0251856744289 +0.187802493572 +1.088560462 +0.0568476580083 +0.122867979109 +2.94206762314 +0.0606950223446 +0.0670947879553 +0.0 +0.0870243608952 +2.70834970474 +0.145933151245 +0.0354817025363 +0.162517115474 +0.0 +0.0433139801025 +0.104904405773 +3.0891597271 +0.0 +0.0228573065251 +0.483733028173 +0.0 +0.0400590635836 +0.0 +4.42968606949 +0.00351492711343 +0.0 +0.000179849681444 +0.0510303266346 +0.0307418797165 +0.169473737478 +0.0314947664738 +0.132557928562 +0.0213870853186 +0.0 +0.0 +0.0179609190673 +0.0115872351453 +0.0760655030608 +0.333140283823 +0.0 +2.58424162865 +0.0344289131463 +3.11789917946 +0.0171209257096 +0.996954441071 +0.11193587631 +0.890487730503 +0.0191310923547 +0.0408249758184 +0.0119236614555 +0.0 +0.105782233179 +0.0 +0.0 +0.0 +0.362366735935 +0.00695687253028 +0.0143399154767 +0.0 +0.0 +0.0931311696768 +0.052416946739 +0.0193915143609 +2.60235452652 +0.00690987380221 +0.0 +0.111522093415 +0.0633810684085 +0.0 +0.0738671794534 +0.0147330826148 +0.465955615044 +0.00735898502171 +0.011838177219 +0.029377406463 +3.1537361145 +0.0218946356326 +0.00452223932371 +3.17661905289 +0.372590601444 +0.00177070789505 +2.13341665268 +0.0209869705141 +0.0289455279708 +0.0293734967709 +0.0965984091163 +0.0738589167595 +0.0 +0.0756072625518 +0.0039823371917 +2.63564515114 +0.0 +0.0647937208414 +0.0398861020803 +0.0111411474645 +0.0329157672822 +0.0 +3.86425495148 +3.9915626049 +0.0 +0.107868239284 +4.29415559769 +0.200831547379 +0.0 +0.0 +0.0 +0.0158486831933 +0.0400936566293 +0.0 +0.0506504736841 +0.0233688335866 +0.0 +0.0 +4.17729139328 +0.0591096952558 +0.0397880747914 +0.0598700083792 +1.95402193069 +0.869693338871 +0.111713178456 +0.0143228955567 +0.0039285174571 +0.727761924267 +0.137492164969 +0.0427626185119 +0.0654498264194 +0.0375462472439 +3.42111539841 +0.0359998643398 +0.0137098878622 +0.277467608452 +0.558448016644 +0.0807459950447 +0.00623609730974 +0.264217108488 +0.0184185113758 +0.0945544689894 +0.0177263058722 +0.0482299253345 +0.0 +0.0525564104319 +0.0741766765714 +0.049198359251 +0.0252908058465 +0.0281867533922 +0.00514921918511 +0.0483240745962 +0.177142724395 +0.234676614404 +0.0239917580038 +0.0532515048981 +0.118877716362 +0.0479456186295 +2.72353577614 +0.0506787188351 +0.0 +0.00242185499519 +0.0214152187109 +0.0243599377573 +0.0975622534752 +0.0123279150575 +0.011668369174 +3.36987042427 +0.0190429296345 +0.129265919328 +0.0160670094192 +0.12570554018 +0.210222572088 +0.0371704883873 +0.0243389811367 +0.111515976489 +0.00626472383738 +0.0136034730822 +0.0453745983541 +0.561756312847 +0.145416155457 +0.0171803999692 +2.94477081299 +2.92257833481 +0.0 +0.0424353182316 +0.0 +0.0 +0.0 +0.0 +0.140560939908 +0.0 +0.0 +0.0824922770262 +0.414302796125 +0.347247481346 +0.136171519756 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.332287043333 +0.0287004057318 +2.62898683548 +0.0266726966947 +0.0103389183059 +0.227600544691 +0.00815317314118 +0.0695809274912 +0.211013704538 +0.0641521438956 +0.203225180507 +0.0358196124434 +0.218249857426 +0.0152274323627 +0.0413142219186 +0.0324874185026 +0.0930684059858 +0.0 +0.0812462344766 +0.190648272634 +0.00586850615218 +0.0262020397931 +0.0 +0.0884506329894 +0.0 +0.0 +0.112385541201 +0.0 +0.0 +0.00466295192018 +0.0974010750651 +0.166601672769 +0.160728573799 +0.282723784447 +0.0 +0.246476724744 +0.0250677503645 +0.13186866045 +0.0370660610497 +0.0493264608085 +0.0 +0.0284523945302 +0.0181731116027 +0.0252624303102 +0.0158527605236 +0.100906461477 +0.0 +0.0232479199767 +0.0639308542013 +0.0 +0.0891256406903 +0.00548610743135 +0.103590041399 +0.0106195425615 +2.64737963676 +0.0 +0.0 +0.0151925859973 +1.62259840965 +0.122679457068 +0.0 +2.85044384003 +0.0940083041787 +0.0257714129984 +0.0 +2.91019177437 +0.0192226413637 +0.0637531802058 +0.00226775044575 +0.0201857425272 +0.0 +0.0749391242862 +0.00664658704773 +0.0 +0.755243778229 +0.0792152583599 +0.0762685760856 +0.0704338103533 +0.0261475220323 +0.0 +0.00484668882564 +0.0158899612725 +0.0513765625656 +0.0303687341511 +0.0326225794852 +0.0367532372475 +0.0199383180588 +0.00524643156677 +0.0334665142 +0.00765648623928 +0.0113937249407 +0.0 +0.1042656973 +0.0683855041862 +0.00731381354854 +0.024970933795 +0.0524281263351 +0.010161338374 +1.21119475365 +0.228909909725 +0.0 +0.174256071448 +0.0543022640049 +0.0620845854282 +0.168752983212 +0.0289249811321 +0.0 +0.0 +0.0 +0.0323656611145 +0.332198888063 +0.0 +0.047327850014 +1.14014351368 +0.0 +0.0564736761153 +0.00200637150556 +0.0755437985063 +0.751271486282 +0.0207870192826 +0.334356725216 +0.00798820331693 +0.0643540248275 +2.12340474129 +0.029941920191 +0.232621982694 +0.0226022601128 +0.0117173120379 +0.0166353322566 +0.73411989212 +0.0493856370449 +0.0623919665813 +0.0157064050436 +0.0117817223072 +0.0268415957689 +0.0108615448698 +1.06613218784 +0.00996874924749 +0.00710258306935 +0.351149857044 +0.00279385526665 +2.0774576664 +0.0165368020535 +0.0 +0.0 +0.0 +0.999273478985 +0.0151484599337 +0.003896930255 +0.0113387741148 +0.00565006863326 +0.00585591094568 +0.0055170613341 +0.0 +0.011013686657 +0.980723261833 +0.0198553465307 +0.0500811003149 +0.0377796553075 +0.31351980567 +0.0 +0.965678989887 +0.27746462822 +0.0126141319051 +0.0 +0.0420814603567 +0.00626013847068 +0.0630264654756 +0.0218600071967 +0.00316061754711 +0.10071413219 +0.0163805000484 +0.00439938670024 +2.69682145119 +0.355681449175 +0.00192249799147 +0.0816400572658 +0.04169440642 +0.00670383311808 +0.0118621457368 +0.298602938652 +0.167828634381 +1.99584782124 +0.0 +0.0064060841687 +0.0 +0.134839966893 +0.168230369687 +0.00273226527497 +0.0 +0.0 +0.0 +0.00774588529021 +0.0534020103514 +0.00792834348977 +0.0186077710241 +0.00542173301801 +0.0376066118479 +0.172278657556 +0.00756179541349 +0.0 +0.944040477276 +0.0224209800363 +0.0 +0.0 +0.906678974628 +0.0545018129051 +0.0262779854238 +0.0202448070049 +0.0 +2.29076933861 +0.144832834601 +0.00406262977049 +0.0261600911617 +0.0367993786931 +0.0 +0.291580319405 +0.00451802462339 +0.0579674914479 +0.00691625056788 +0.0 +1.80494987965 +0.0367414839566 +0.0 +0.0358237102628 +0.511531531811 +0.0 +0.0627334117889 +1.66462826729 +0.0 +0.0713257193565 +0.067534185946 +0.0208548940718 +0.00260750786401 +1.47476911545 +0.0353006608784 +0.102661170065 +0.0 +0.0367102213204 +0.00824515428394 +0.00510325608775 +0.153435125947 +0.359134674072 +0.00868867710233 +0.0512136556208 +0.152836337686 +1.54927313328 +1.75692534447 +0.698584139347 +0.0 +0.0277142748237 +0.851833760738 +0.772038578987 +0.015531972982 +0.0189010240138 +0.00637429999188 +0.0493996478617 +0.0 +0.0149635057896 +0.217679917812 +0.0194550361484 +0.0217265374959 +0.0 +0.00623168097809 +0.0528527796268 +0.199652493 +0.0 +0.00754828052595 +0.101725250483 +0.00769590213895 +0.0 +0.00732590816915 +0.00421754550189 +0.207350030541 +0.00704983342439 +0.00737396022305 +2.22017669678 +0.047081630677 +0.0115186935291 +0.0121972011402 +0.0439002029598 +0.397300571203 +0.0262653641403 +0.481910794973 +0.0189424660057 +0.0618004463613 +0.0136105250567 +0.449782580137 +0.0186888407916 +0.0 +0.433650225401 +0.00948394648731 +0.00969902798533 +0.0150174265727 +0.426894187927 +0.00261747394688 +0.0728028938174 +0.339258909225 +0.0814651176333 +0.0 +0.0841386094689 +0.020132753998 +0.00769882509485 +0.0240245014429 +0.0110596604645 +0.495917677879 +0.00789619516581 +0.363449990749 +0.0193873271346 +0.153262674809 +0.00339533155784 +0.00616751657799 +0.00393453752622 +0.0216234102845 +0.00458242464811 +0.0321883633733 +0.130509242415 +0.242178216577 +0.000217860622797 +0.0939664691687 +0.0327234566212 +0.0169673971832 +0.0874100103974 +0.377921611071 +0.0362642221153 +0.00201522489078 +0.387203574181 +0.00251053553075 +0.422259032726 +0.0182156804949 +0.0 +0.0 +0.0 +0.132140234113 +0.0529648773372 +0.0 +0.0510531328619 +0.000707888742909 +0.119588188827 +0.00257330387831 +0.0 +0.0190721862018 +0.0 +0.334457755089 +0.0370194129646 +0.304893374443 +0.225243017077 +0.0 +0.0354989469051 +0.0164966545999 +1.41153597832 +1.81632626057 +0.0 +0.011333649978 +0.0 +1.39405143261 +0.0104515170678 +0.0354005694389 +0.0655952915549 +0.0305242519826 +0.00447535840794 +0.313272535801 +0.516669034958 +1.34944689274 +0.0459646731615 +0.0 +0.0237416047603 +0.0733018368483 +1.44518458843 +1.55901777744 +0.0 +0.00547400256619 +0.079697497189 +0.0 +0.0 +0.0 +0.602438807487 +0.0 +1.19433188438 +1.27831792831 +0.0 +0.441131561995 +0.0 +0.0 +0.0201797112823 +0.0 +0.00653218617663 +0.0 +0.0 +0.190272644162 +0.885297238827 +0.106489896774 +0.00399779202417 +0.532629430294 +0.101372681558 +0.0 +0.0109382327646 +0.282629102468 +0.0 +0.155694827437 +0.0 +0.0 +0.403177648783 +0.0195445008576 +0.538765132427 +0.0 +0.0046725384891 +0.0266178734601 +0.0334843024611 +0.0532753765583 +0.569848537445 +0.00364225869998 +0.0307877827436 +0.0311876162887 +0.00730747869238 +0.0 +0.0383677855134 +0.0325549058616 +0.364707797766 +0.0532175078988 +0.522500932217 +0.0 +0.0582666806877 +0.455523222685 +0.0 +0.0334056541324 +0.573456764221 +0.00925884116441 +0.0119622051716 +0.123528428376 +0.00623643631116 +0.218480408192 +0.0168724171817 +0.0325007587671 +0.697669625282 +0.27358391881 +0.00149430765305 +0.425273865461 +0.0119682764634 +0.116671569645 +0.0455995760858 +0.00716732535511 +0.0 +0.0 +0.0066154897213 +0.136669814587 +0.844700992107 +0.0 +0.095711953938 +0.0 +0.00795366987586 +0.00417725834996 +0.106858797371 +0.0329307690263 +0.0335605405271 +0.07496522367 +0.0033349993173 +0.0203366205096 +0.446649998426 +0.101219348609 +0.00310150836594 +0.0971431955695 +0.0195434466004 +0.0406735762954 +0.0181330814958 +0.00630762195215 +0.043151691556 +0.0163632053882 +0.0 +0.0 +0.0 +0.253328472376 +0.0 +0.0 +0.0 +0.011476165615 +0.0 +0.74958974123 +0.00813835766166 +0.0325383804739 +0.00185134983622 +0.144629284739 +0.0753774121404 +0.0374872088432 +0.0 +0.0 +0.0147485965863 +0.405378252268 +0.0 +0.204647496343 +0.0394150428474 +0.0 +0.436169266701 +0.0474060960114 +0.00229659723118 +0.079294718802 +0.0971248596907 +0.00983451586217 +0.0101644899696 +0.439715266228 +0.013032509014 +0.0249138232321 +0.0775757730007 +0.330685049295 +0.767918646336 +0.0205324888229 +0.00933412276208 +0.0200529620051 +0.373487442732 +0.014060869813 +0.0169630069286 +0.738816797733 +0.0639120265841 +0.0 +0.115477353334 +0.0 +0.0 +0.0145110441372 +0.0162637140602 +0.392889291048 +0.0215668044984 +0.0610163919628 +0.0041298372671 +0.0060081994161 +0.025007545948 +0.00881608948112 +0.00444688461721 +0.00590189732611 +0.342756062746 +0.0853963196278 +0.0708927810192 +0.0508254691958 +0.0240425951779 +0.439027518034 +0.00971955899149 +0.0264052059501 +0.0445225089788 +0.0164691377431 +0.00248608319089 +0.0273649599403 +1.10219144821 +0.0327691920102 +0.115315355361 +0.0419084765017 +0.0571985766292 +0.3412733078 +0.00703497324139 +0.00714246043935 +0.0214698463678 +0.0879700779915 +0.25695541501 +0.141848221421 +0.0 +0.00692245969549 +0.108444824815 +0.0158335119486 +0.0130928466097 +0.00571857206523 +0.00233547668904 +0.0253530927002 +0.0578367523849 +0.155426383018 +0.0142122516409 +0.141793772578 +0.28363391757 +0.14467266202 +0.103893771768 +0.00715994089842 +0.0112401591614 +0.345162123442 +0.0294092465192 +0.0231082458049 +0.194555014372 +0.261741220951 +0.0701692849398 +0.0108559094369 +0.0703349262476 +0.0709068626165 +0.0381657406688 +0.00688150012866 +0.005958288908 +0.00545267527923 +0.480900645256 +0.00642363866791 +0.077664040029 +0.0242922957987 +0.234808012843 +0.00479834340513 +0.00722551299259 +0.0233981255442 +0.0577535927296 +0.00993237551302 +0.0648015961051 +0.00904869567603 +0.0113265113905 +0.487355113029 +0.00946873798966 +0.0533550754189 +0.0143212126568 +0.00461459578946 +0.0660258159041 +0.13009904325 +0.250413894653 +0.0195913538337 +0.182482540607 +0.0187057927251 +0.00473699532449 +0.0211805664003 +0.00614091195166 +0.0204010307789 +0.00650203926489 +0.166232600808 +0.038068022579 +0.0 +0.0 +0.0356334932148 +0.00037025733036 +0.0 +0.0413093082607 +0.0523981601 +0.169645413756 +0.000439721770817 +0.0188091397285 +0.0712704882026 +0.0300828907639 +0.020025247708 +0.0937393009663 +0.010145819746 +1.17469882965 +0.0718853622675 +0.137331962585 +0.00501462444663 +0.158992558718 +0.00568345515057 +0.0239785369486 +0.0155335636809 +0.0260052401572 +0.0952926874161 +0.00490964576602 +0.00232222536579 +0.0243937540799 +0.0997663959861 +0.0291805267334 +0.0180326420814 +0.0149276703596 +0.0546546652913 +0.0136101432145 +0.0123431617394 +0.00991952978075 +0.00834634806961 +0.0371628552675 +0.028063217178 +0.0726700648665 +0.073443852365 +0.0112525764853 +0.0 +0.0 +0.05249793455 +0.0615489706397 +0.104177080095 +0.021380437538 +0.0355627052486 +0.207263737917 +0.00703564006835 +0.0392706170678 +0.24140265584 +0.00165142572951 +0.0177647974342 +0.0228893700987 +0.294714421034 +0.0121851274744 +0.0242598410696 +0.0209580343217 +0.0523136779666 +0.530675172806 +0.0176940765232 +0.00654792133719 +0.0140265068039 +0.005159126129 +0.0458571650088 +0.0526121407747 +0.0 +0.0 +0.0586546696723 +0.263470351696 +0.0181627254933 +0.0182177815586 +0.0673430785537 +0.115325637162 +0.319676727057 +0.427670747042 +0.0594337657094 +0.0 +0.0 +0.0343851819634 +0.0 +0.0 +0.0144239533693 +0.0253952555358 +0.0023950599134 +0.0440124459565 +1.20385789871 +0.122382946312 +0.0188491940498 +0.084271505475 +0.019622111693 +0.0175859611481 +0.201840847731 +0.164090007544 +1.2489002943 +0.00358167290688 +0.0308003909886 +0.0940372422338 +0.538574755192 +0.0145476907492 +0.0105347419158 +0.489224463701 +0.00642808433622 +0.0547181889415 +0.128200516105 +0.0367842391133 +0.0 +0.0 +0.0285919066519 +0.00737766316161 +0.00696737784892 +0.0185718908906 +0.0235471092165 +0.0188583228737 +0.0120914652944 +0.459040671587 +0.484504967928 +0.00986647978425 +0.00687903212383 +0.0 +0.0 +0.00258587789722 +0.0319531038404 +0.440385907888 +0.027430748567 +0.0243578739464 +0.0301469266415 +0.00287650944665 +0.0 +0.0 +0.192265972495 +0.019410520792 +0.0197133291513 +0.0401872210205 +0.0177971627563 +0.018655192107 +0.195072203875 +0.00887199677527 +0.10788103193 +0.968005418777 +0.0274182409048 +0.995416641235 +0.0 +0.589454948902 +0.00430628750473 +0.0162036530674 +0.0406335704029 +0.0253222864121 +0.0297089740634 +0.280167490244 +0.775979340076 +0.0594043284655 +0.0112157119438 +0.556316077709 +0.00121443229727 +0.618344724178 +0.0300962179899 +0.00436352798715 +0.00750605296344 +0.406446784735 +0.00407128129154 +0.380991011858 +0.0456854552031 +0.0622381232679 +0.0348341949284 +0.0 +0.00910562928766 +1.21721243858 +0.228387072682 +0.049230389297 +0.0424210987985 +0.0406110957265 +0.0 +0.0 +0.865602195263 +0.379855066538 +0.781574070454 +0.0 +0.0 +0.756011128426 +0.864250481129 +0.0 +0.122964404523 +0.0 +0.0 +0.0320838913321 +0.176738128066 +0.0 +0.00295295892283 +0.0272264461964 +0.335372507572 +0.957754313946 +0.0 +0.0 +0.882839918137 +0.0157599505037 +0.860969245434 +0.0 +0.0430599786341 +0.00742663163692 +0.00157425925136 +0.0117189474404 +0.0122635634616 +0.0371383242309 +0.0185940843076 +0.0581459850073 +0.023171082139 +0.0185021255165 +0.0859656110406 +0.0647703185678 +0.0153740216047 +1.37590801716 +0.010397455655 +0.00846082810313 +0.00997831579298 +0.00713993282989 +0.0890900194645 +0.00448858132586 +0.0808078348637 +0.0 +0.0272543299943 +0.0478184446692 +0.0324926264584 +0.0392027050257 +0.242455020547 +0.108685009181 +0.107632465661 +0.0434357747436 +0.5234618783 +0.0176575258374 +0.0753997787833 +0.130281150341 +0.0301373694092 +0.0 +0.85809981823 +0.0 +0.122005403042 +0.963667571545 +0.0 +0.00517053343356 +0.156572893262 +0.0559566095471 +1.39271783829 +0.874626338482 +0.175187990069 +0.0784897580743 +0.024183306843 +0.0123491808772 +0.0834839269519 +0.633064329624 +0.550611555576 +0.623381316662 +0.857077419758 +0.0325153283775 +0.938811123371 +0.000832598540001 +0.0 +0.130642384291 +0.961043536663 +0.0 +0.0161890890449 +0.0201215967536 +0.0140768373385 +0.00979450624436 +0.00271702790633 +0.0864465385675 +0.00749637419358 +0.228784635663 +0.0 +0.015951776877 +0.118506856263 +0.183288499713 +0.0157308336347 +0.879772007465 +0.02395648323 +0.55593842268 +0.010225773789 +0.00904476549476 +0.0167186632752 +0.0 +0.0864460542798 +0.0102841118351 +0.00120738602709 +0.00166081497446 +0.0971586331725 +0.0130036333576 +0.277698606253 +0.204204514623 +1.48092091084 +0.032642710954 +1.68517649174 +0.039711818099 +0.00550482794642 +0.00821709632874 +0.00831977464259 +0.107178978622 +0.00727480323985 +0.0726401880383 +1.58508372307 +0.0241883285344 +0.00194415601436 +0.0420330539346 +0.107453152537 +0.00422561261803 +0.0107579212636 +0.203830868006 +1.20842003822 +0.00683865090832 +0.295510739088 +0.0106969075277 +0.123589530587 +0.0 +0.0673847869039 +0.0329722724855 +0.00554868485779 +0.00938227586448 +0.017006656155 +0.0426530502737 +0.0177762545645 +0.259294569492 +0.376761108637 +0.453146249056 +0.0082933884114 +0.3138268888 +0.00597156677395 +0.0413638390601 +0.0 +0.167966604233 +0.00393135519698 +0.0125827929005 +0.050131380558 +0.02375080809 +0.0582017377019 +0.0131142213941 +0.0674290657043 +0.477713108063 +0.0 +0.0370619557798 +0.00550533598289 +0.324176430702 +0.0216325633228 +0.525455832481 +0.0426429435611 +0.00992662552744 +0.0124150831252 +0.0762367025018 +0.0560949444771 +0.633208334446 +0.0252250637859 +0.00530423084274 +0.00696214754134 +0.169557467103 +0.0211075134575 +0.011982023716 +0.0562690384686 +0.188586115837 +0.0296905897558 +0.0604784488678 +0.588323533535 +0.0527024716139 +0.0159920714796 +0.00277754827403 +0.00573735265061 +0.0175535064191 +0.544833123684 +0.0642533823848 +0.0257588475943 +0.126592487097 +0.0163059495389 +0.0304973684251 +0.703840911388 +0.0189680233598 +0.680503427982 +0.04245692119 +0.00967532768846 +0.00397612573579 +0.022912627086 +0.149259492755 +0.180464431643 +0.00257298815995 +0.0110492492095 +0.0147698521614 +0.0228214710951 +0.028719605878 +0.0 +0.0241317823529 +0.0450844354928 +0.0465644560754 +0.00479846075177 +0.00799657404423 +0.238859087229 +0.0310604777187 +0.0639314576983 +0.0355312265456 +0.87320971489 +0.761261105537 +0.0151104778051 +0.0140541819856 +0.0103782005608 +0.0221912413836 +0.423964560032 +0.0197692494839 +0.437939673662 +0.00756790395826 +0.203117266297 +0.00383095559664 +0.0927192717791 +0.0823628157377 +0.0166371427476 +0.820924520493 +0.0122030535713 +0.0213905796409 +0.107844367623 +0.00518183130771 +0.0139145031571 +0.0343871749938 +0.363779425621 +0.210052162409 +0.0351652689278 +0.0439010933042 +0.0752659365535 +0.0845334231853 +0.0476384870708 +0.0656953603029 +0.101580448449 +0.12927557528 +0.845310986042 +0.00378484185785 +0.0073162401095 +0.0197984594852 +0.576944887638 +0.873945355415 +0.901438295841 +0.01176104974 +0.013189278543 +0.0140284681693 +0.0190984401852 +0.0149093782529 +0.0761528760195 +0.00547845708206 +1.52479624748 +0.02435721457 +0.464605182409 +0.00534920534119 +0.00311791524291 +0.0236311685294 +1.00684034824 +0.0214712601155 +0.0269091594964 +0.0161298029125 +0.00532734720036 +0.00803290121257 +0.00607849564403 +2.80960631371 +0.0141778532416 +0.604598701 +1.68413066864 +0.0742437914014 +0.00223070010543 +0.00309665338136 +1.72084474564 +0.0121539067477 +0.0115258684382 +0.860278964043 +0.00723600853235 +0.0953192040324 +0.502667486668 +2.98477983475 +0.034774184227 +0.112324215472 +0.0138284917921 +0.0212518684566 +0.0147276883945 +0.030171463266 +0.0267620068043 +0.0169248282909 +0.0242289565504 +0.00904265325516 +0.00573093257844 +0.0524463243783 +0.00443286588416 +0.00245816679671 +0.0180021822453 +0.013526212424 +0.628794968128 +0.0280861388892 +0.0414718277752 +0.0078231645748 +1.75639605522 +0.135136917233 +0.0 +0.00981972832233 +0.00207094918005 +0.0566036850214 +0.00362962763757 +0.179437726736 +0.0126402955502 +0.0138094779104 +0.0146938646212 +0.143504425883 +0.637679457664 +0.00499906623736 +0.0521420165896 +0.0327928476036 +0.017159178853 +0.0 +0.0315667241812 +0.0154671575874 +1.73508119583 +0.00274190772325 +0.18800804019 +0.00428682286292 +0.00201445538551 +0.00286669214256 +0.018876388669 +0.00700421771035 +1.75071918964 +0.0783291980624 +0.0200414005667 +0.00566110014915 +0.0167504455894 +0.00215597380884 +0.00883700698614 +0.0103709604591 +0.135745421052 +0.0 +1.09308671951 +0.00954042188823 +0.620150625706 +0.0153598273173 +0.0510272942483 +0.0802894458175 +0.0506337732077 +0.00240460364148 +0.00394993508235 +0.00313497101888 +3.19854021072 +0.015594012104 +0.0266957040876 +0.0391521714628 +0.00789902359247 +0.0265510864556 +0.0147866746411 +0.00253523746505 +0.63953357935 +0.069022141397 +0.00575541006401 +0.823699712753 +0.0163903888315 +0.0119137605652 +3.2670443058 +0.00238999119028 +0.0379649810493 +0.0167692545801 +0.0320320278406 +0.0645858570933 +0.00342001020908 +0.0124811502174 +0.156085506082 +0.0130587862805 +0.05712717399 +0.0336518511176 +1.93071973324 +0.00227752351202 +0.130464464426 +0.0829089656472 +0.12497716397 +0.078698515892 +0.0413309372962 +0.034417707473 +0.039775390178 +0.0518460869789 +1.76395976543 +0.0263566281646 +0.0401590280235 +0.108182445168 +0.00735251279548 +0.160050421953 +1.77713501453 +1.93169677258 +0.012097960338 +0.0295319631696 +0.0685718283057 +0.00420680968091 +3.35656881332 +0.0230356436223 +0.00692462502047 +0.0429813414812 +0.00785439647734 +0.0186399500817 +0.0234871748835 +0.00611773133278 +0.684071719646 +0.00497653475031 +0.000483607931528 +0.0986086577177 +0.00162693543825 +0.00113812251948 +0.00401607202366 +0.0131874792278 +0.000814739614725 +0.01036834158 +1.97027313709 +0.0333859585226 +0.0331887416542 +0.00651418603957 +0.00196155160666 +0.00652830256149 +2.00557327271 +0.0127498982474 +0.913053691387 +0.0906989052892 +0.0282421577722 +0.119537003338 +0.0205863602459 +0.00322623876855 +2.02032113075 +1.58955244842e-05 +0.000665166531689 +0.0 +0.000951215915848 +0.213170990348 +0.221191912889 +0.00935621839017 +0.0941200405359 +0.0 +0.00406582094729 +0.00216569914483 +0.0 +0.0 +0.000311015406623 +0.0 +0.0295900441706 +0.00093036564067 +0.00647463137284 +0.00951193831861 +0.0112609816715 +0.00584352295846 +0.0441960096359 +0.213731512427 +0.00352523336187 +0.00584255671129 +0.00152217911091 +0.0 +0.00384774431586 +0.00635500671342 +0.0102149946615 +0.00149191182572 +0.0 +0.000304034911096 +0.0498803071678 +0.0313149988651 +0.0461041778326 +0.0127703770995 +0.0212343484163 +0.0291206520051 +0.0190355796367 +2.03411531448 +1.24749839306 +0.0 +0.0 +0.0 +1.94232320786 +0.072577804327 +0.0598764233291 +0.00948943383992 +0.0 +0.0 +0.00962751079351 +0.0512312874198 +0.0250360667706 +0.0 +0.977363348007 +0.0175196286291 +1.99371707439 +0.000460619514342 +0.0205890648067 +3.61673498154 +0.00132840010338 +0.0 +0.235192224383 +3.27622127533 +0.091758094728 +0.00138437491842 +0.000451673695352 +0.0112298810855 +0.0261898655444 +0.0 +0.998304009438 +0.0115038789809 +0.235845640302 +0.000249760050792 +0.220298409462 +0.247892126441 +0.243916124105 +0.238457262516 +0.0 +0.0 +0.0 +0.217296749353 +0.00469749839976 +0.000190033169929 +0.000696142204106 +0.043359067291 +0.133448138833 +0.325635284185 +0.000286608701572 +0.000751096114982 +0.0 +0.0 +0.0 +0.958231329918 +0.0 +0.0784206390381 +0.0315048135817 +3.3916041851 +0.0 +0.0230601802468 +0.0909491628408 +0.00103781244252 +0.0 +0.0 +0.0 +0.114405483007 +0.0 +0.0 +0.0163827892393 +0.0 +0.0144406752661 +0.0 +0.000276011938695 +0.036306001246 +0.0 +0.0020692658145 +0.0340369567275 +2.01179456711 +0.000894498196431 +0.0 +0.00612272834405 +0.117877565324 +0.0 +0.0 +0.0 +0.0 +0.000306766392896 +0.000306768313749 +3.72846221924 +1.04965269566 +0.0115254214033 +0.038085155189 +1.03703737259 +0.0121699012816 +0.00244702305645 +0.0 +0.110439613461 +0.0 +0.00800591148436 +0.000280372798443 +0.0 +0.0 +0.0020329633262 +0.00418275361881 +0.0569728091359 +0.0 +0.0 +0.000280401349301 +0.0144439060241 +0.151478841901 +0.0 +1.07358431816 +4.62683165097e-05 +0.0 +0.0 +0.0 +0.000306885282043 +0.176878392696 +0.0 +0.00260594743304 +0.00790710467845 +0.0223540421575 +0.0 +0.0 +0.000280431122519 +0.00251917820424 +0.0 +0.0201815944165 +2.01310539246 +0.0 +0.0 +0.0 +0.0 +0.0 +3.36151885986 +0.0 +0.0 +0.0 +3.3560628891 +0.11973991245 +0.00638242997229 +3.77146053314 +0.0 +0.204466804862 +0.0 +0.0223613604903 +0.0 +0.000887341331691 +0.0223621055484 +0.359300523996 +0.0201909858733 +0.202396765351 +3.78492236137 +0.0 +0.00103948777542 +0.0611721351743 +0.0 +0.0 +0.0 +0.0 +0.0223627518862 +0.0 +0.0 +0.0 +0.0 +0.0 +3.79278993607 +2.01345062256 +0.0 +0.0 +0.198351964355 +0.0 +0.0010395469144 +0.0611780509353 +1.12017607689 +0.0 +0.0 +0.177315622568 +0.0 +0.0362700633705 +0.0 +0.395337045193 +0.0362737253308 +0.433434247971 +0.0 +0.0 +0.0 +3.45277690887 +0.177386179566 +0.104393601418 +0.191796436906 +0.0 +0.0 +0.177513971925 +0.0 +0.0 +0.0 +0.000280296546407 +0.0 +0.0 +0.0 +0.0223639160395 +0.0 +0.177687242627 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.177782550454 +0.0 +0.0 +0.177857115865 +0.0622577741742 +0.0 +0.0 +0.0 +0.0223654936999 +0.0 +0.0 +0.0 +0.0 +0.0 +0.240255445242 +0.0 +0.0 +0.0223665181547 +0.0 +2.00784540176 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +2.00633192062 +0.240433752537 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 +0.0 diff --git a/tests/compare/rapid_namelist-GENERATE b/tests/compare/rapid_namelist-GENERATE new file mode 100644 index 0000000..8976df5 --- /dev/null +++ b/tests/compare/rapid_namelist-GENERATE @@ -0,0 +1,36 @@ +&NL_namelist +BS_opt_Qfinal = .false. +BS_opt_Qinit = .false. +BS_opt_dam = .false. +BS_opt_for = .false. +BS_opt_influence = .false. +IS_dam_tot = 0 +IS_dam_use = 0 +IS_for_tot = 0 +IS_for_use = 0 +IS_max_up = 0 +IS_obs_tot = 0 +IS_obs_use = 0 +IS_opt_phi = 1 +IS_opt_routing = 1 +IS_opt_run = 1 +IS_riv_bas = 0 +IS_riv_tot = 0 +IS_strt_opt = 0 +Qout_file = 'Qout.nc' +Vlat_file = 'm3_riv.nc' +ZS_TauM = 1036800 +ZS_TauO = 0 +ZS_TauR = 86400 +ZS_dtF = 0 +ZS_dtM = 86400 +ZS_dtO = 0 +ZS_dtR = 900 +ZS_knorm_init = 0 +ZS_phifac = 0 +ZS_xnorm_init = 0 +k_file = 'k.csv' +rapid_connect_file = 'rapid_connect.csv' +riv_bas_id_file = 'riv_bas_id.csv' +x_file = 'x.csv' +/ diff --git a/tests/compare/rapid_namelist-GENERATE-NUMBERS b/tests/compare/rapid_namelist-GENERATE-NUMBERS new file mode 100644 index 0000000..7c31737 --- /dev/null +++ b/tests/compare/rapid_namelist-GENERATE-NUMBERS @@ -0,0 +1,36 @@ +&NL_namelist +BS_opt_Qfinal = .false. +BS_opt_Qinit = .false. +BS_opt_dam = .false. +BS_opt_for = .false. +BS_opt_influence = .false. +IS_dam_tot = 0 +IS_dam_use = 0 +IS_for_tot = 0 +IS_for_use = 0 +IS_max_up = 3 +IS_obs_tot = 0 +IS_obs_use = 0 +IS_opt_phi = 1 +IS_opt_routing = 1 +IS_opt_run = 1 +IS_riv_bas = 4168 +IS_riv_tot = 4168 +IS_strt_opt = 0 +Qout_file = 'Qout.nc' +Vlat_file = 'm3_nasa_lis_3hr_20020830.nc' +ZS_TauM = 0 +ZS_TauO = 0 +ZS_TauR = 0 +ZS_dtF = 0 +ZS_dtM = 0 +ZS_dtO = 0 +ZS_dtR = 0 +ZS_knorm_init = 0 +ZS_phifac = 0 +ZS_xnorm_init = 0 +k_file = 'k.csv' +rapid_connect_file = 'rapid_connect.csv' +riv_bas_id_file = 'riv_bas_id.csv' +x_file = 'x.csv' +/ diff --git a/tests/compare/rapid_namelist-GENERATE-TIME b/tests/compare/rapid_namelist-GENERATE-TIME new file mode 100644 index 0000000..5b8e6e7 --- /dev/null +++ b/tests/compare/rapid_namelist-GENERATE-TIME @@ -0,0 +1,36 @@ +&NL_namelist +BS_opt_Qfinal = .false. +BS_opt_Qinit = .false. +BS_opt_dam = .false. +BS_opt_for = .false. +BS_opt_influence = .false. +IS_dam_tot = 0 +IS_dam_use = 0 +IS_for_tot = 0 +IS_for_use = 0 +IS_max_up = 3 +IS_obs_tot = 0 +IS_obs_use = 0 +IS_opt_phi = 1 +IS_opt_routing = 1 +IS_opt_run = 1 +IS_riv_bas = 4168 +IS_riv_tot = 4168 +IS_strt_opt = 0 +Qout_file = 'Qout.nc' +Vlat_file = 'm3_nasa_lis_3hr_20020830.nc' +ZS_TauM = 172800 +ZS_TauO = 172800 +ZS_TauR = 10800 +ZS_dtF = 0 +ZS_dtM = 0 +ZS_dtO = 0 +ZS_dtR = 0 +ZS_knorm_init = 0 +ZS_phifac = 0 +ZS_xnorm_init = 0 +k_file = 'k.csv' +rapid_connect_file = 'rapid_connect.csv' +riv_bas_id_file = 'riv_bas_id.csv' +x_file = 'x.csv' +/ diff --git a/tests/compare/rapid_namelist-UPDATE b/tests/compare/rapid_namelist-UPDATE new file mode 100644 index 0000000..401e859 --- /dev/null +++ b/tests/compare/rapid_namelist-UPDATE @@ -0,0 +1,36 @@ +&NL_namelist +BS_opt_Qfinal = .false. +BS_opt_Qinit = .false. +BS_opt_dam = .false. +BS_opt_for = .false. +BS_opt_influence = .false. +IS_dam_tot = 0 +IS_dam_use = 0 +IS_for_tot = 0 +IS_for_use = 0 +IS_max_up = 4 +IS_obs_tot = 0 +IS_obs_use = 0 +IS_opt_phi = 1 +IS_opt_routing = 1 +IS_opt_run = 1 +IS_riv_bas = 67313 +IS_riv_tot = 67313 +IS_strt_opt = 0 +Qout_file = 'Qout.nc' +Vlat_file = 'm3_riv.nc' +ZS_TauM = 2678400 +ZS_TauO = 0 +ZS_TauR = 10800 +ZS_dtF = 0 +ZS_dtM = 10800 +ZS_dtO = 86400 +ZS_dtR = 900 +ZS_knorm_init = '0.3' +ZS_phifac = 0 +ZS_xnorm_init = 3 +k_file = 'k.csv' +rapid_connect_file = 'rapid_connect.csv' +riv_bas_id_file = 'riv_bas_id.csv' +x_file = 'x.csv' +/ diff --git a/tests/compare/rapid_namelist-UPDATE-INVALID b/tests/compare/rapid_namelist-UPDATE-INVALID new file mode 100644 index 0000000..d5a766f --- /dev/null +++ b/tests/compare/rapid_namelist-UPDATE-INVALID @@ -0,0 +1,36 @@ +&NL_namelist +BS_opt_Qfinal = .false. +BS_opt_Qinit = .true. +BS_opt_dam = .true. +BS_opt_for = .false. +BS_opt_influence = .false. +IS_dam_tot = 0 +IS_dam_use = 0 +IS_for_tot = 0 +IS_for_use = 0 +IS_max_up = 4 +IS_obs_tot = 0 +IS_obs_use = 0 +IS_opt_phi = 1 +IS_opt_routing = 1 +IS_opt_run = 1 +IS_riv_bas = 67313 +IS_riv_tot = 67313 +IS_strt_opt = 0 +Qout_file = 'Qout.nc' +Vlat_file = 'm3_riv.nc' +ZS_TauM = 2678400 +ZS_TauO = 0 +ZS_TauR = 10800 +ZS_dtF = 0 +ZS_dtM = 10800 +ZS_dtO = 86400 +ZS_dtR = 900 +ZS_knorm_init = '0.3' +ZS_phifac = 0 +ZS_xnorm_init = 3 +k_file = 'k.csv' +rapid_connect_file = 'rapid_connect.csv' +riv_bas_id_file = 'riv_bas_id.csv' +x_file = 'x.csv' +/ diff --git a/tests/compare/raw_goodness_of_fit_analysis.csv b/tests/compare/raw_goodness_of_fit_analysis.csv new file mode 100644 index 0000000..5d4962a --- /dev/null +++ b/tests/compare/raw_goodness_of_fit_analysis.csv @@ -0,0 +1,3 @@ +reach_id,percent_bias,abs_percent_bias,rmse,mae,bias,NSE,likelihood,correlation_coeff,index_agreement,KGE +75224,-98.425120719511412,98.425120719511412,30.480209943223549,30.462574862688783,-30.462574862688783,-2197.918812267415,0.0,-1.0,0.040385246766002525,-1.2655788121180445 +75224,-98.425120719511412,98.425120719511412,30.480209943223549,30.462574862688783,-30.462574862688783,-2197.918812267415,0.0,-1.0,0.040385246766002525,-1.2655788121180445 diff --git a/tests/compare/return_periods_erai_t511_24hr_19800101to19861231.nc b/tests/compare/return_periods_erai_t511_24hr_19800101to19861231.nc new file mode 100644 index 0000000..06476b2 Binary files /dev/null and b/tests/compare/return_periods_erai_t511_24hr_19800101to19861231.nc differ diff --git a/tests/compare/return_periods_gumble_erai_t511_24hr_19800101to19861231.nc b/tests/compare/return_periods_gumble_erai_t511_24hr_19800101to19861231.nc new file mode 100644 index 0000000..fd66456 Binary files /dev/null and b/tests/compare/return_periods_gumble_erai_t511_24hr_19800101to19861231.nc differ diff --git a/tests/compare/return_periods_log_pearson_erai_t511_24hr_19800101to19861231.nc b/tests/compare/return_periods_log_pearson_erai_t511_24hr_19800101to19861231.nc new file mode 100644 index 0000000..7b8d613 Binary files /dev/null and b/tests/compare/return_periods_log_pearson_erai_t511_24hr_19800101to19861231.nc differ diff --git a/tests/compare/seasonal_averages_erai_t511_24hr_19800101to19861231.nc b/tests/compare/seasonal_averages_erai_t511_24hr_19800101to19861231.nc new file mode 100644 index 0000000..3619ab8 Binary files /dev/null and b/tests/compare/seasonal_averages_erai_t511_24hr_19800101to19861231.nc differ diff --git a/tests/data/Qout_erai_t511_24hr_19800101to19861231.nc b/tests/data/Qout_erai_t511_24hr_19800101to19861231.nc new file mode 100644 index 0000000..884fe88 Binary files /dev/null and b/tests/data/Qout_erai_t511_24hr_19800101to19861231.nc differ diff --git a/tests/data/Qout_merge_3hr.nc b/tests/data/Qout_merge_3hr.nc new file mode 100644 index 0000000..5386653 Binary files /dev/null and b/tests/data/Qout_merge_3hr.nc differ diff --git a/tests/data/Qout_merge_6hr.nc b/tests/data/Qout_merge_6hr.nc new file mode 100644 index 0000000..f4cafee Binary files /dev/null and b/tests/data/Qout_merge_6hr.nc differ diff --git a/tests/data/comid_lat_lon_z.csv b/tests/data/comid_lat_lon_z.csv new file mode 100644 index 0000000..8d3842c --- /dev/null +++ b/tests/data/comid_lat_lon_z.csv @@ -0,0 +1,4169 @@ +COMID,Lat,Lon,Elev_m +70563,52.34253211400005,-1.234219024999959,0.0 +70564,52.32829556000007,-1.2633557679999399,0.0 +70618,52.33654575700007,-1.413303515999928,0.0 +70625,52.32304104600007,-1.4180743519999623,0.0 +70626,52.31968298900006,-1.362774902999945,0.0 +70640,52.32383557900005,-1.4578481309999347,0.0 +70648,52.317254253000044,-1.4420616679999512,0.0 +70652,52.317163537000056,-1.3881903749999651,0.0 +70654,52.31645509300006,-1.1426339829999392,0.0 +70655,52.314746385000035,-1.1223945639999329,0.0 +70656,52.31325194000004,-1.3399126609999712,0.0 +70657,52.31468554600008,-1.3647180309999385,0.0 +70658,52.31136427300004,-1.3570904179999275,0.0 +70660,52.31111217900008,-1.3607626519999485,0.0 +70665,52.311227348000045,-1.3449193839999793,0.0 +70666,52.315475323000044,-1.296562397999935,0.0 +70688,52.30782174900003,-1.3257974469999567,0.0 +70707,52.30291709000005,-1.314924221999945,0.0 +70736,52.301594339000076,-1.287950852999927,0.0 +70737,52.29382603800008,-1.2593739809999533,0.0 +70748,52.29795642400006,-1.1187318519999394,0.0 +70750,52.29370939900008,-1.230452649999961,0.0 +70752,52.30689049800003,-1.0922347399999808,0.0 +70754,52.29064438800003,-1.246292129999972,0.0 +70755,52.28725769700003,-1.1004755669999327,0.0 +70761,52.28891205200006,-1.2274045399999522,0.0 +70766,52.28838148500006,-1.2106282569999394,0.0 +70773,52.29427798000006,-1.307734393999965,0.0 +70782,52.286362531000066,-1.0614658249999707,0.0 +70788,52.28233415500006,-1.0686725109999315,0.0 +70791,52.28457191100006,-1.0905163859999334,0.0 +70792,52.28320075900007,-1.0805444899999657,0.0 +70817,52.29812800900004,-1.4787558499999705,0.0 +70821,52.28640352800005,-1.533098056999961,0.0 +70822,52.28227033400003,-1.5006730069999321,0.0 +70867,52.28610037000004,-1.2957392079999295,0.0 +70871,52.27342718400007,-1.090336180999941,0.0 +70876,52.26607340700008,-1.0943731229999685,0.0 +70883,52.27709377100007,-1.4733624189999546,0.0 +70906,52.278669525000055,-1.1361491709999427,0.0 +70960,52.26936863800006,-1.510083376999944,0.0 +70961,52.25715344400004,-1.5033437119999462,0.0 +70963,52.28695743900005,-1.410178741999971,0.0 +70970,52.25640127100007,-1.3612576559999638,0.0 +70971,52.25585078900008,-1.505385131999958,0.0 +70986,52.25249581700007,-1.3909180689999516,0.0 +70990,52.255602527000065,-1.0819801099999609,0.0 +71017,52.24379513300005,-1.090641924999943,0.0 +71029,52.24716275900005,-1.352382843999976,0.0 +71043,52.24829112100008,-1.4109916379999277,0.0 +71060,52.23695790200003,-1.0400069439999697,0.0 +71078,52.23638506100008,-1.0747906449999505,0.0 +71082,52.22820640900005,-1.0633485649999557,0.0 +71083,52.22968494500003,-1.054506182999944,0.0 +71087,52.25653694300007,-1.2300344059999588,0.0 +71095,52.229225718000066,-1.0865610039999751,0.0 +71105,52.22836649200008,-1.1494130879999602,0.0 +71120,52.226305343000035,-1.0362569679999751,0.0 +71121,52.22800717400003,-0.9833951859999388,0.0 +71130,52.23423634900007,-1.3983944379999684,0.0 +71135,52.22470921400003,-1.0669344069999624,0.0 +71208,52.21202580100004,-1.017918940999948,0.0 +71209,52.22313853500003,-1.418407957999932,0.0 +71212,52.209704284000054,-1.3552087359999518,0.0 +71222,52.211107758000026,-1.6675718199999778,0.0 +71223,52.21149638700007,-1.6637691219999624,0.0 +71226,52.20986747200004,-1.132395944999928,0.0 +71235,52.20428012800005,-1.3553775799999244,0.0 +71238,52.20878780900006,-1.6270642519999683,0.0 +71244,52.20408710800007,-1.4159036959999298,0.0 +71246,52.206423415000074,-1.6458220679999727,0.0 +71247,52.203703337000036,-1.4228368999999361,0.0 +71258,52.20396613200006,-1.6233517909999478,0.0 +71259,52.19613585900004,-1.0182963709999626,0.0 +71263,52.19574881700004,-1.0509056079999368,0.0 +71271,52.20051073900004,-1.388161375999971,0.0 +71274,52.20011653900008,-1.6155223929999352,0.0 +71280,52.20579251000004,-2.026139258999933,0.0 +71293,52.196580975000074,-1.4125181779999707,0.0 +71296,52.19250101700004,-1.4094015889999696,0.0 +71301,52.21123578700008,-1.9540844149999543,0.0 +71308,52.19968963500003,-1.957526077999944,0.0 +71314,52.199504303000026,-1.9991477309999368,0.0 +71331,52.19903753400007,-2.070453137999948,0.0 +71332,52.196375197000066,-2.046180933999949,0.0 +71337,52.17221521400006,-0.3032099339999377,0.0 +71344,52.197915410000064,-1.6508926229999474,0.0 +71351,52.18869677600003,-1.3938438609999366,0.0 +71361,52.16450518900007,-0.3235758979999446,0.0 +71383,52.19755031300008,-1.7334407789999773,0.0 +71384,52.18108832900003,-1.72332946399996,0.0 +71387,52.179718223000066,-1.7275032319999468,0.0 +71388,52.19259844900006,-1.697420372999943,0.0 +71392,52.17907741100004,-1.729442484999936,0.0 +71407,52.182231063000074,-1.772804004999955,0.0 +71426,52.16856290700008,-1.2294300959999305,0.0 +71427,52.18057280800008,-1.2068924539999557,0.0 +71429,52.15373237800003,0.07550049000002446,0.0 +71430,52.138431523000065,0.17124590300005593,0.0 +71433,52.172745795000026,-1.7791456239999661,0.0 +71434,52.171620277000045,-1.7501063009999598,0.0 +71441,52.16882037600004,-2.0597960109999462,0.0 +71442,52.180858999000066,-2.059709879999957,0.0 +71450,52.18397328700007,-1.5903434569999604,0.0 +71457,52.16332902100004,-1.8152377179999348,0.0 +71458,52.17164201500003,-1.9984993959999429,0.0 +71462,52.164409042000045,-2.0010947999999757,0.0 +71463,52.16670781400006,-1.98620942499997,0.0 +71464,52.166228656000044,-1.8004847739999263,0.0 +71468,52.16387232400007,-1.763396463999925,0.0 +71471,52.16231253900003,-1.8255088519999276,0.0 +71481,52.15942890300005,-1.5936365589999468,0.0 +71483,52.17014994400006,-1.5463411839999708,0.0 +71487,52.16376999900007,-1.4789057909999315,0.0 +71488,52.16002359200007,-1.82343343499997,0.0 +71492,52.15871855100005,-1.3075640769999382,0.0 +71493,52.17422088200004,-1.2820856059999528,0.0 +71494,52.16153961600003,-1.99709370599993,0.0 +71495,52.16248803600007,-1.8665473239999528,0.0 +71496,52.16019639900003,-1.8450830229999724,0.0 +71497,52.12722513400007,0.0521481730000346,0.0 +71498,52.156723154000076,-1.5851974139999356,0.0 +71499,52.15410821800003,-1.5733391119999283,0.0 +71500,52.15384492100003,-1.521744440999953,0.0 +71502,52.15842636800005,-1.881226020999975,0.0 +71506,52.152660352000055,-1.55159409099997,0.0 +71507,52.15341573500007,-1.4894089419999545,0.0 +71508,52.15062333900005,-1.4740763009999682,0.0 +71509,52.155099791000055,-1.867172251999932,0.0 +71510,52.14593317200007,-0.3081942649999405,0.0 +71513,52.12810165900004,-0.3056969339999682,0.0 +71514,52.12136376400008,0.22211246700004494,0.0 +71519,52.12475624000007,0.14696909300005245,0.0 +71520,52.14491024100005,-1.1548508599999536,0.0 +71526,52.15182766600003,-1.0987655979999431,0.0 +71527,52.15273824700006,-1.0608215469999323,0.0 +71542,52.118612608000035,-0.03331961199995703,0.0 +71544,52.11376843200003,0.17027842700002793,0.0 +71549,52.147429439000064,-1.475136837999969,0.0 +71550,52.12603979600004,-0.3031151339999383,0.0 +71559,52.15965463900005,-2.058958102999952,0.0 +71560,52.16376258300005,-2.035503811999945,0.0 +71561,52.14516744100007,-1.0060803299999748,0.0 +71564,52.14888752200005,-2.056277553999962,0.0 +71565,52.15256661800004,-2.050910941999973,0.0 +71566,52.11811071400007,-0.043948684999975285,0.0 +71571,52.13983569100003,-0.8979951069999288,0.0 +71572,52.11914160300006,0.02207328900004768,0.0 +71573,52.15452880700008,-1.8985498009999446,0.0 +71574,52.15118179900003,-1.882087937999927,0.0 +71580,52.13986919600006,-1.1647988609999516,0.0 +71585,52.13557305200004,-0.8849536709999484,0.0 +71588,52.13342037500007,-0.8785109799999304,0.0 +71595,52.16293864100004,-1.7079181039999298,0.0 +71596,52.137037021000026,-1.0373538829999802,0.0 +71597,52.135193978000075,-1.0108018889999357,0.0 +71600,52.11643110300008,-0.06326333599997724,0.0 +71601,52.11387545700006,-0.054328817999930834,0.0 +71602,52.11387573500008,-0.01987734299996191,0.0 +71603,52.13469593800005,-0.02464521999996805,0.0 +71611,52.13369883900003,-0.9825538379999443,0.0 +71612,52.10991014600006,-0.0034531339999261945,0.0 +71613,52.11140330500007,0.0017822620000629286,0.0 +71615,52.13020617700005,-0.8871169599999575,0.0 +71617,52.10902186200008,-0.002772451999931036,0.0 +71618,52.147817383000074,-1.230754787999956,0.0 +71619,52.140748373000065,-1.1976248079999436,0.0 +71620,52.129923381000026,-0.895058904999928,0.0 +71622,52.11075105300006,-0.07462825799996153,0.0 +71623,52.144461755000066,-1.573889081999937,0.0 +71624,52.13925871100008,-0.9486004729999422,0.0 +71625,52.127760780000074,-0.9127325089999658,0.0 +71632,52.10827188500008,0.16832175500002222,0.0 +71634,52.10106736200004,0.17183676400003378,0.0 +71638,52.11575662800004,-0.2469335329999467,0.0 +71642,52.14693392400005,-1.8269476709999708,0.0 +71643,52.14702846100005,-1.7607196419999696,0.0 +71644,52.13036910500006,-1.2362593029999402,0.0 +71645,52.10900443600008,-0.16466938799993613,0.0 +71646,52.11305530300007,-0.15058258099998056,0.0 +71647,52.14678090500007,-1.3199190389999558,0.0 +71648,52.14079992200004,-1.3092522509999753,0.0 +71649,52.12824017200006,-1.2507482259999279,0.0 +71650,52.12798186200007,-0.9508706529999245,0.0 +71653,52.14161081100008,-1.5200771849999342,0.0 +71656,52.13468724300003,-1.7692763499999273,0.0 +71660,52.12342192500006,-0.929882804999977,0.0 +71664,52.11619113900008,-0.28498189199996204,0.0 +71665,52.10949131600006,-0.26493687999993654,0.0 +71666,52.13609192000007,-1.9092843659999517,0.0 +71667,52.14090692800005,-1.8922937659999661,0.0 +71668,52.13372663100006,-1.766534323999963,0.0 +71670,52.12729875600007,-1.2509700789999556,0.0 +71684,52.13338133900004,-0.1991381079999428,0.0 +71685,52.10657403400006,-0.24829305999998041,0.0 +71686,52.10105519700005,-0.24367141899995204,0.0 +71690,52.11229112600006,-0.30992823799994085,0.0 +71692,52.10164109500005,-0.32056433499997183,0.0 +71699,52.14045427500008,-1.7973291769999378,0.0 +71700,52.14231452000007,-1.7298234659999707,0.0 +71701,52.09919602100007,-0.22336826599996584,0.0 +71706,52.13146027700003,-1.66483120099997,0.0 +71707,52.12184586600006,-1.6363806509999677,0.0 +71716,52.11686136000003,-1.0789778829999364,0.0 +71717,52.12201757400004,-1.0426807909999525,0.0 +71718,52.12256112500006,-1.312489042999971,0.0 +71719,52.12438172700007,-1.285409933999972,0.0 +71720,52.13113519500007,-1.6943060709999713,0.0 +71724,52.12003555000007,-1.6976817839999399,0.0 +71728,52.11528961000005,-0.944374378999953,0.0 +71731,52.103912036000054,-0.11586250099992412,0.0 +71733,52.119386045000056,-1.6968733949999546,0.0 +71734,52.10005593300008,-0.16554044499997644,0.0 +71738,52.12148462600004,-1.7925507929999753,0.0 +71745,52.09147308000007,-0.15945408699997188,0.0 +71746,52.09943640600005,-0.27141900099996974,0.0 +71748,52.09995178500003,-0.07436881899997161,0.0 +71749,52.12233278900004,-0.9959722849999366,0.0 +71750,52.10344958400003,0.06201834900002723,0.0 +71751,52.09728046100008,-0.021312898999951813,0.0 +71752,52.109779907000075,0.09560916200007341,0.0 +71754,52.09972464500004,0.018803941000044233,0.0 +71757,52.13363584800004,-2.056940605999955,0.0 +71759,52.11565567700006,-0.877928039999972,0.0 +71765,52.106279449000056,-1.0139600809999365,0.0 +71766,52.120399977000034,-1.2255599409999718,0.0 +71768,52.08906673600006,0.1742689540000697,0.0 +71769,52.09560289800004,-0.23768287799993004,0.0 +71772,52.091515335000054,-0.28294077299995024,0.0 +71773,52.08147775600003,0.08435200800005305,0.0 +71779,52.11604656600008,-1.5588967709999793,0.0 +71780,52.10299795700007,-0.8915730779999649,0.0 +71784,52.10902280700003,-1.5811005079999632,0.0 +71800,52.10927213100007,-1.0916085049999538,0.0 +71801,52.12079470800006,-1.8815499319999276,0.0 +71802,52.11156601300007,-1.879852704999962,0.0 +71803,52.106876742000054,-1.5258966689999625,0.0 +71804,52.108091941000055,-1.5697495119999303,0.0 +71812,52.10635039500005,-1.1416816949999316,0.0 +71815,52.08739494000008,-0.17353844999996682,0.0 +71818,52.07461744900007,0.17412599400006457,0.0 +71831,52.07770947000006,0.07407522400006883,0.0 +71835,52.081182401000035,-0.07233314599994856,0.0 +71840,52.07275172800007,0.18532405300004484,0.0 +71841,52.06884959800004,0.2045701970000664,0.0 +71843,52.10036672900003,-1.0248088899999743,0.0 +71847,52.104119773000036,-1.5347118629999272,0.0 +71849,52.08054976300008,-0.0897587889999727,0.0 +71853,52.115472716000056,-2.041674463999925,0.0 +71854,52.085796438000045,-0.27297896199996785,0.0 +71857,52.10521647000007,-2.0130517679999684,0.0 +71858,52.120567202000075,-1.9173936399999434,0.0 +71860,52.069757279000044,0.0659961210000688,0.0 +71863,52.08998367100003,-0.008028933999923993,0.0 +71876,52.104262005000066,-1.9173682499999245,0.0 +71879,52.10228631500007,-1.5731520689999456,0.0 +71882,52.103035317000035,-2.0143149809999272,0.0 +71887,52.07140422700007,-0.056224949999943874,0.0 +71888,52.074742290000074,-0.2643026289999284,0.0 +71890,52.09196858400003,-1.1285597609999627,0.0 +71895,52.10733908000003,-1.6266346019999673,0.0 +71900,52.11015543900004,-1.7909149659999457,0.0 +71907,52.10344876900007,-1.8919429149999587,0.0 +71908,52.09905544600008,-1.8778470509999465,0.0 +71909,52.09409783700005,-1.6261902229999805,0.0 +71910,52.10124654800006,-1.6042436009999506,0.0 +71914,52.09726988400007,-1.9013757969999574,0.0 +71915,52.08062543300008,-0.32897759999997334,0.0 +71916,52.09804924600007,-2.0042221199999517,0.0 +71917,52.08865381100003,-0.10835852899992915,0.0 +71925,52.065419260000056,0.04992310000005773,0.0 +71927,52.06285791600004,0.15239782400004742,0.0 +71931,52.10066461100007,-1.3137631809999561,0.0 +71934,52.08944859600007,-1.2997434659999385,0.0 +71935,52.07109132200003,-0.19059815099996058,0.0 +71939,52.11033198800004,-1.9774831689999246,0.0 +71940,52.09489194000008,-1.8364805079999655,0.0 +71946,52.09469898700007,-1.9049918189999744,0.0 +71947,52.08709937300006,-1.3922274539999648,0.0 +71948,52.10244287800003,-1.3978759809999701,0.0 +71949,52.09433449100004,-0.8038093829999298,0.0 +71955,52.086510829000076,-0.8429082009999433,0.0 +71956,52.072838121000075,-0.8087697629999298,0.0 +71959,52.09438830600004,-1.9390178579999429,0.0 +71961,52.08874193200006,-1.9553189009999414,0.0 +71963,52.090754555000046,-1.8557675189999259,0.0 +71969,52.093194209000046,-2.0082869429999732,0.0 +71970,52.06778053200003,-0.2757575149999525,0.0 +71974,52.056835239000065,0.16689220400002114,0.0 +71975,52.07040868300004,-0.7973400919999563,0.0 +71976,52.08824916200007,-0.7538481939999429,0.0 +71977,52.08662123200003,-1.9454881689999297,0.0 +71983,52.10051118900003,-2.0825835249999614,0.0 +71984,52.090637610000044,-2.067970632999959,0.0 +71987,52.073691273000065,-1.0726222379999513,0.0 +71988,52.05731241900003,-0.28352306399995086,0.0 +71989,52.07603919300004,-0.8719200689999411,0.0 +71990,52.06965576400006,-0.824888557999941,0.0 +71996,52.06814634300008,-0.1718610549999653,0.0 +71997,52.07079393300006,-1.0813659189999498,0.0 +72001,52.09591743200008,-2.113098420999961,0.0 +72002,52.08444753300006,-1.6206424639999568,0.0 +72003,52.08340991800003,-1.9018532509999773,0.0 +72006,52.108239654000045,-1.364423889999955,0.0 +72007,52.07804505400003,-1.326031281999974,0.0 +72008,52.069059621000065,-1.0722058029999744,0.0 +72009,52.06716318800005,-1.0692364759999577,0.0 +72018,52.07894902000004,-2.0976458839999736,0.0 +72029,52.08356889200007,-1.6449765289999618,0.0 +72030,52.07244304100004,-1.6049523069999623,0.0 +72033,52.06739686800006,-0.7070789669999726,0.0 +72034,52.056263364000074,-0.68554355699996,0.0 +72035,52.09629372300003,-1.9821397299999717,0.0 +72041,52.05882883000004,-0.08291917099995771,0.0 +72051,52.07570892000007,-2.123305165999966,0.0 +72052,52.08587496800004,-2.1481902699999296,0.0 +72055,52.064451846000054,-1.239957487999959,0.0 +72056,52.06444940400007,-1.227231374999974,0.0 +72074,52.066065009000056,-1.3218042079999464,0.0 +72075,52.059218791000035,-1.3254505509999603,0.0 +72076,52.061845007000045,-0.1480747519999568,0.0 +72080,52.07307151100008,-1.8802920789999575,0.0 +72084,52.08022877500008,-1.8697401529999524,0.0 +72087,52.03621072100003,0.24362188700007437,0.0 +72089,52.05948712400004,-1.1136118369999508,0.0 +72090,52.05214304000003,-0.9028031579999265,0.0 +72092,52.05368094900007,-0.38021342399997593,0.0 +72093,52.059695841000064,-0.9616568109999548,0.0 +72094,52.04671175800007,0.20743812900002467,0.0 +72095,52.05286022900003,-0.9696384109999485,0.0 +72096,52.05839264000008,-1.0783411769999702,0.0 +72098,52.043771768000056,0.04360188700002254,0.0 +72100,52.04459972500007,-0.3112811419999275,0.0 +72101,52.02358081400007,0.2269069160000754,0.0 +72102,52.03747819200004,-0.3419441689999303,0.0 +72103,52.03900520700006,0.013953537000020333,0.0 +72104,52.023455857000044,0.2450194330000386,0.0 +72111,52.04517869000006,-0.6582820449999645,0.0 +72118,52.05811364700003,-0.8538447739999242,0.0 +72120,52.047166282000035,-0.8771539149999512,0.0 +72122,52.04499555800004,-0.8615913779999573,0.0 +72123,52.04616035400005,-0.6885100509999802,0.0 +72124,52.04792134300004,-0.8984701959999484,0.0 +72128,52.04374405200008,-0.27745421499997747,0.0 +72129,52.03097156900003,-0.2663212789999534,0.0 +72134,52.03038537000003,-0.26737608099995214,0.0 +72139,52.02012594000007,0.2191396070000451,0.0 +72147,52.01428056300006,0.3420035560000656,0.0 +72153,52.05407069700004,-1.7525153949999321,0.0 +72154,52.01561569100005,0.21051367900003015,0.0 +72155,52.014171572000066,0.21932296600004975,0.0 +72156,52.05390571700008,-0.7932087569999453,0.0 +72157,52.05032231200005,-1.3112876119999441,0.0 +72158,52.051707177000026,-1.268289695999954,0.0 +72167,52.048923165000076,-1.7409724349999465,0.0 +72168,52.05191819500004,-1.7278532269999687,0.0 +72175,52.02749332700006,-0.20532169199992722,0.0 +72178,52.03257720700003,-0.7852953469999306,0.0 +72179,52.039150188000065,-0.8720800779999536,0.0 +72183,52.009661304000076,0.21537940600006777,0.0 +72186,52.06362264900008,-1.4311014849999424,0.0 +72187,52.060740923000026,-1.3839333359999273,0.0 +72188,52.03622948800006,-0.28956658199996355,0.0 +72189,52.01736915100008,-0.133735842999954,0.0 +72190,52.01457338500006,-0.11722965399997065,0.0 +72195,52.049195757000064,-1.7744632789999741,0.0 +72196,52.00548682500005,0.3791265640000461,0.0 +72200,52.038238352000064,-1.3928746169999613,0.0 +72203,52.00387765100004,0.3580332550000662,0.0 +72205,52.01500087000005,-0.14738930299995445,0.0 +72211,52.05663350700007,-1.6176652529999274,0.0 +72212,52.00519371100006,0.32462781700002097,0.0 +72213,52.06473889100005,-1.9633276089999754,0.0 +72224,52.01272436100004,0.15987689000002092,0.0 +72233,52.00842057600005,0.2297300100000257,0.0 +72241,52.040848623000045,-1.4308563479999634,0.0 +72245,52.02838940500004,-0.4066044139999576,0.0 +72247,52.033589068000026,-0.8516261289999534,0.0 +72251,52.03973252000003,-1.93886684499995,0.0 +72252,52.03490984600006,-1.621098027999949,0.0 +72253,52.016132252000034,-0.5012783669999408,0.0 +72257,52.04407254000006,-1.5501106759999743,0.0 +72262,52.03562633400003,-1.6723278609999284,0.0 +72264,52.03494362200007,-1.6446673429999805,0.0 +72266,52.01797857300005,-0.2694681819999687,0.0 +72267,52.042455430000075,-1.1794205219999299,0.0 +72268,52.02677029000006,-0.7721046539999747,0.0 +72269,52.03650851700007,-1.7308598629999778,0.0 +72270,52.00559778200005,-0.2715548069999727,0.0 +72271,52.03392974800005,-0.9407870819999289,0.0 +72272,52.025410357000055,-0.8963590929999441,0.0 +72276,52.022020464000036,-1.161857548999933,0.0 +72277,52.02970102900008,-1.6122987869999292,0.0 +72278,52.04473205900007,-0.7135808019999672,0.0 +72279,52.02887694400005,-1.589122755999938,0.0 +72281,52.02724204900005,-1.6076088929999628,0.0 +72282,52.014205064000066,-0.6922046699999669,0.0 +72283,52.03991969300006,-1.1185548479999738,0.0 +72285,52.02133900900003,-1.143476676999967,0.0 +72286,51.998160433000066,0.2138143230000651,0.0 +72288,52.02863893600005,-1.620120007999958,0.0 +72289,51.99033935400007,0.2169014000000402,0.0 +72290,52.02736915700007,-1.5574924189999706,0.0 +72292,52.01425985000003,-0.7690272069999651,0.0 +72297,52.02743731800007,-1.4987334239999655,0.0 +72305,52.02621152300003,-1.7396549559999244,0.0 +72306,52.028310015000045,-1.726730067999938,0.0 +72307,52.02183681300005,-0.8695304009999631,0.0 +72309,52.025907922000044,-1.5211033899999507,0.0 +72312,52.02258113200003,-1.4873324119999438,0.0 +72313,51.98256845800006,0.3965988730000731,0.0 +72314,51.99206077600007,0.3895810680000409,0.0 +72317,52.00336370000008,-0.2802487089999772,0.0 +72318,52.02600289800006,-1.6895077579999338,0.0 +72320,52.034019054000055,-1.9501014939999664,0.0 +72321,52.00439583800005,-0.11461206399997081,0.0 +72324,52.02020248600007,-0.3579012679999778,0.0 +72325,52.01427137200005,-0.9254533429999583,0.0 +72326,52.03103594800007,-1.3504753489999644,0.0 +72331,52.01726019200004,-1.3221174359999281,0.0 +72332,52.017795051000064,-1.3544692599999735,0.0 +72333,52.01655359000006,-1.3265845289999447,0.0 +72335,52.01047780500005,-0.9417284799999379,0.0 +72340,52.02371507600003,-1.6327142429999526,0.0 +72341,52.021441690000074,-1.544328878999977,0.0 +72342,52.01604175600005,-1.1132058399999778,0.0 +72343,52.01733818800005,-1.0923539109999751,0.0 +72346,52.00988035700004,-0.9376190979999706,0.0 +72347,52.02805713300006,-1.2895426549999343,0.0 +72348,52.02087037700005,-1.264776943999948,0.0 +72354,52.01028369200003,-1.0918229189999806,0.0 +72355,51.99799233300007,-0.37952975099995,0.0 +72357,52.046710407000035,-1.8902855569999701,0.0 +72358,52.01504999000008,-1.0614484859999607,0.0 +72359,51.99626663200007,-0.396498385999962,0.0 +72366,52.00384349900003,-0.7170718049999323,0.0 +72367,52.00720997600007,-0.7061667659999671,0.0 +72368,51.994913584000074,-0.3870790489999649,0.0 +72370,52.02678662400007,-2.0151884899999573,0.0 +72374,52.00791439800008,-1.0925729649999312,0.0 +72375,52.007310509000035,-1.0766484119999404,0.0 +72377,52.01127495500003,-0.2126118909999377,0.0 +72378,51.98971443100004,-0.30762331299996504,0.0 +72379,51.99466433900005,-0.2948194969999349,0.0 +72382,52.00529811700005,-0.9418243479999546,0.0 +72383,52.02210615600006,-1.0283422409999616,0.0 +72384,51.983014999000034,0.18371837500006905,0.0 +72392,52.00342629700003,-1.0430570469999338,0.0 +72393,51.97933286700004,0.014667754000072364,0.0 +72394,51.982591021000076,0.021056940000050872,0.0 +72396,51.97301642000008,0.33091900300001953,0.0 +72401,52.00009331000007,-0.9965174339999407,0.0 +72402,52.006411093000054,-0.24272147799996446,0.0 +72404,52.00037788800006,-0.9256134239999483,0.0 +72407,52.02281476100006,-2.081120716999976,0.0 +72408,52.00040890900004,-1.0198949739999534,0.0 +72409,52.00046169800004,-1.0070270719999712,0.0 +72411,52.010073015000046,-1.3054646629999525,0.0 +72412,52.00833294800003,-1.2814020229999414,0.0 +72413,52.00809408200007,-1.2609108059999699,0.0 +72416,52.01417976000005,-2.0613368389999778,0.0 +72417,51.98091813700006,0.24048866700002236,0.0 +72420,52.016979942000034,-1.7517251919999808,0.0 +72422,51.967491590000066,0.3265441660000761,0.0 +72425,52.00144717500007,-1.2885531789999618,0.0 +72426,52.00116555400007,-1.282928596999966,0.0 +72427,52.00030721400003,-0.9700042379999445,0.0 +72430,51.99524788600007,-0.7098775279999359,0.0 +72431,51.99940011500007,-0.48769690699992907,0.0 +72433,51.990596707000066,-0.5380621969999311,0.0 +72435,51.97481594300007,0.01847232300002588,0.0 +72436,51.97320911500003,0.027581711000038922,0.0 +72440,52.02118234500006,-0.62491922199996,0.0 +72448,51.97183750700003,0.4116985060000502,0.0 +72452,51.97361715000005,0.1446625060000315,0.0 +72454,51.99715495700008,-1.215191764999929,0.0 +72455,51.995877103000055,-1.1992649949999645,0.0 +72460,51.98677306900004,-0.40333817799995586,0.0 +72461,51.98893580400005,-0.7255970939999656,0.0 +72462,51.97374206400008,0.11276350400004276,0.0 +72465,51.999095718000035,-0.7793607149999389,0.0 +72467,51.97289349700003,0.4500121690000469,0.0 +72470,51.99339121700007,-1.0237513489999515,0.0 +72471,51.98792074700003,-0.3685838649999482,0.0 +72472,51.99651655500003,-1.3655397399999742,0.0 +72475,51.99462695400007,-1.4521264829999723,0.0 +72476,51.97419156500007,0.2174195990000385,0.0 +72480,52.011426905000064,-1.9366889579999338,0.0 +72482,51.95520826300003,0.4160004240000603,0.0 +72485,51.96719221600006,-0.04091280699992694,0.0 +72486,51.98082949900004,-0.03639708699995481,0.0 +72488,51.95831691400008,0.20989807500006918,0.0 +72492,51.95411028800004,0.4328785220000668,0.0 +72494,52.00798500500008,-2.118337879999956,0.0 +72497,52.03315618600004,-2.1315634849999583,0.0 +72498,51.99831623400007,-2.154753414999959,0.0 +72499,51.98357524800008,-0.7565616899999554,0.0 +72501,51.99671400400007,-2.1475847619999513,0.0 +72502,52.00692403200003,-2.023043282999936,0.0 +72503,51.97881466700005,-0.311090533999959,0.0 +72506,51.98996155700007,-1.2281152529999417,0.0 +72510,52.00138243400005,-1.601885435999975,0.0 +72518,51.99380992700003,-2.0004103439999312,0.0 +72519,51.99457739700006,-2.141869991999954,0.0 +72523,52.005116085000054,-2.172053324999979,0.0 +72524,51.994086682000045,-2.162540018999948,0.0 +72525,51.98099303500004,-0.714683460999936,0.0 +72530,51.97744210500008,-0.7340495609999493,0.0 +72533,51.981767182000056,-1.2271809409999719,0.0 +72534,52.00688863600004,-1.952132651999932,0.0 +72537,51.99107352400006,-2.0087594489999674,0.0 +72538,51.97983855200005,-0.2758213679999244,0.0 +72542,51.98575271700008,-0.9514152719999629,0.0 +72544,51.98648521100006,-1.9515947259999393,0.0 +72545,51.97273881700005,-0.9722745709999572,0.0 +72549,51.94761652100004,0.15282799700003125,0.0 +72550,51.95592653700004,0.15127307100004828,0.0 +72557,51.98762639800003,-1.2824284309999712,0.0 +72558,51.98184798500006,-1.2637453229999664,0.0 +72560,51.98187201700006,-0.43874338399996304,0.0 +72561,51.98449948500007,-1.9537271129999567,0.0 +72562,51.98744073900008,-2.172687139999937,0.0 +72563,51.98482838800004,-2.1760976199999504,0.0 +72568,51.97832228000004,-1.709359334999931,0.0 +72569,51.957327398000075,-0.2623422749999804,0.0 +72572,51.98454942500007,-1.6955964839999638,0.0 +72575,51.97810074800003,-1.7006125889999453,0.0 +72576,51.947716237000066,0.21919604700002537,0.0 +72577,51.945794824000075,0.2382695770000396,0.0 +72580,51.96615562800008,-0.7120927759999631,0.0 +72583,51.980867699000044,-1.4612515029999713,0.0 +72585,51.93896388700006,0.2299485270000332,0.0 +72586,51.95380362800006,-0.24317210399993883,0.0 +72589,51.97935808900007,-1.9464966479999362,0.0 +72590,51.96584070100005,-0.9061928409999496,0.0 +72594,51.948900336000065,-0.12533700499994893,0.0 +72595,51.95431707200004,-0.10223142599994617,0.0 +72599,51.97483389000007,-1.717445275999978,0.0 +72600,51.96154421500006,-0.9080355299999496,0.0 +72601,51.96588970000005,-0.8908363049999366,0.0 +72605,51.97652049700008,-1.6831308819999435,0.0 +72608,51.97322311500005,-1.6584410999999477,0.0 +72609,51.96377627900006,-0.7325798399999712,0.0 +72611,51.97396052200003,-1.6890728859999626,0.0 +72612,51.97027075500006,-1.6872449139999617,0.0 +72615,51.969446367000046,-1.28418286699997,0.0 +72616,51.94868132900007,-0.25085610999997243,0.0 +72620,51.969553603000065,-1.7917254429999616,0.0 +72621,51.979987091000055,-1.8011556129999349,0.0 +72623,51.98130783200003,-2.130179822999935,0.0 +72624,51.96905897600004,-1.7894739389999472,0.0 +72625,51.986090484000044,-1.7912592239999299,0.0 +72628,51.96744984000003,-1.353460183999971,0.0 +72631,51.95043329100008,-0.020692472999940037,0.0 +72632,51.935832864000076,-0.022980769999946915,0.0 +72634,51.94499971000005,-0.3004410259999304,0.0 +72635,51.949963481000054,-0.27546726899993246,0.0 +72639,51.96733110900004,-1.1398510069999475,0.0 +72642,51.988017298000045,-2.0847228339999333,0.0 +72644,51.95515521900006,-0.714528196999936,0.0 +72647,51.95963582700006,-0.9675395389999721,0.0 +72648,51.95649238000004,-0.9319407469999419,0.0 +72649,51.95561465800006,-0.8884161669999457,0.0 +72650,51.93955309900008,-0.11778016699997806,0.0 +72654,51.95299890700005,-0.7033508639999582,0.0 +72655,51.96146175800004,-0.9788339229999679,0.0 +72656,51.96368684400005,-0.5091341599999737,0.0 +72662,51.93748931400006,-0.28922688299996935,0.0 +72663,51.93381820700006,-0.11017700199994351,0.0 +72664,51.94417057800007,-0.6213244049999389,0.0 +72665,51.942104828000026,-0.6142058049999264,0.0 +72668,51.955020844000046,-1.1025367409999376,0.0 +72669,51.95681072200006,-1.084243929999957,0.0 +72673,51.93075291900004,-0.014588942999978372,0.0 +72674,51.93061190800006,-0.010399369999959163,0.0 +72675,51.92135081200007,0.3118985390000262,0.0 +72676,51.94586123100004,0.3364832440000214,0.0 +72677,51.943609183000035,-0.5716483189999622,0.0 +72678,51.937952894000034,-0.5665265939999244,0.0 +72681,51.94184175300006,-0.6894975149999709,0.0 +72684,51.93925922600005,-0.6759114479999653,0.0 +72685,51.94757863500007,-1.0065745219999371,0.0 +72686,51.94705750700007,-0.9900659849999442,0.0 +72690,51.95110641600007,-1.1828194739999276,0.0 +72692,51.94159661300006,-0.7014885339999637,0.0 +72693,51.94615429100003,-1.0676940959999683,0.0 +72694,51.95242992400006,-1.057071900999972,0.0 +72695,51.932495912000036,-0.23390715199997203,0.0 +72702,51.96751021500006,-1.9559149209999305,0.0 +72704,51.945276997000065,-0.9885436529999652,0.0 +72705,51.95428554200004,-0.9708994329999427,0.0 +72708,51.967287284000065,-2.228473484999938,0.0 +72709,51.96856364100006,-2.20103822599998,0.0 +72710,51.96473756200004,-2.1253676739999605,0.0 +72715,51.93247131100003,0.5027132050000205,0.0 +72716,51.90385769000005,0.5517874770000617,0.0 +72718,51.91701159400003,0.08663731100006089,0.0 +72719,51.932142561000035,0.08800721300002579,0.0 +72725,51.911342313000034,0.33003665300003604,0.0 +72726,51.91573656400004,0.34563590800001975,0.0 +72732,51.93956174200008,-1.0264351859999579,0.0 +72738,51.95638170500007,-1.6830531939999673,0.0 +72741,51.94347275500007,-1.6777278569999794,0.0 +72742,51.91647681900008,-0.1310552249999546,0.0 +72743,51.92438762100005,-0.12175274699995953,0.0 +72745,51.93252645700005,-0.8532510729999672,0.0 +72746,51.930059776000064,-0.8279074719999358,0.0 +72752,51.93347457500005,-0.6242882729999337,0.0 +72753,51.93065110200007,-0.5998627139999257,0.0 +72761,51.934716094000066,-0.9961026169999627,0.0 +72765,51.947141772000066,-1.974438179999936,0.0 +72766,51.94222171100006,-0.9246224869999651,0.0 +72767,51.93072423500007,-0.8871475089999308,0.0 +72771,51.91021580100005,0.20129916400003367,0.0 +72772,51.90834666200004,0.22427223400006824,0.0 +72773,51.894537273000026,0.600605372000075,0.0 +72777,51.93212992000008,-0.9862003909999544,0.0 +72780,51.95445757300007,-1.5697243709999498,0.0 +72781,51.93656768500006,-1.5752214499999582,0.0 +72784,51.90668047100007,0.40015495700004067,0.0 +72785,51.89401083200005,0.405809348000048,0.0 +72794,51.946243475000074,-2.2285503009999275,0.0 +72795,51.94153648300005,-2.204855195999926,0.0 +72796,51.92500935500004,-0.8328389229999402,0.0 +72797,51.891174927000066,0.5695637290000377,0.0 +72798,51.93693100400003,-1.3513887389999582,0.0 +72799,51.88753580600007,0.6062698510000359,0.0 +72800,51.88739424800008,0.6159590860000321,0.0 +72801,51.94388075900008,-2.1334239889999367,0.0 +72802,51.93330931500003,-1.5937129079999295,0.0 +72803,51.93319074900006,-1.5914912129999266,0.0 +72804,51.93516369200006,-1.4599574279999388,0.0 +72805,51.930128987000046,-1.4685074649999592,0.0 +72808,51.93670179000003,-2.1069349139999645,0.0 +72809,51.92893407400004,-0.6714876299999446,0.0 +72812,51.92342395500003,-0.903399244999946,0.0 +72815,51.91289816500006,-0.4688455969999268,0.0 +72818,51.93565493800003,-1.3979587799999535,0.0 +72819,51.936790246000044,-2.096039032999954,0.0 +72820,51.911272060000044,-0.4675675449999517,0.0 +72821,51.913100256000064,0.007114380000075471,0.0 +72822,51.93489364100003,0.026787384000044767,0.0 +72825,51.94264685200005,-1.9559169799999268,0.0 +72826,51.91955078600006,-0.9094134549999353,0.0 +72836,51.91879737200003,-0.6491159249999328,0.0 +72838,51.91933667100005,0.16927870800003575,0.0 +72839,51.896990893000066,0.19176023300002498,0.0 +72843,51.910066020000045,-0.5439633009999625,0.0 +72849,51.908077794000064,-0.47538087299994913,0.0 +72852,51.93471443400006,-2.237850994999974,0.0 +72854,51.92325235900006,-0.864078658999972,0.0 +72859,51.907272704000036,-0.445909639999968,0.0 +72860,51.91555329100004,-0.43203783999996404,0.0 +72862,51.92035306200006,-1.1126176549999514,0.0 +72865,51.924153398000044,-1.4544520709999347,0.0 +72866,51.91667287000007,-1.1301860529999317,0.0 +72867,51.92893959100007,-2.08527885999996,0.0 +72874,51.87780941800003,0.679893087000039,0.0 +72878,51.92248025600003,-1.4810190699999453,0.0 +72879,51.92885509200005,-2.1963854139999626,0.0 +72881,51.91845067500003,-0.2538651879999634,0.0 +72882,51.91366743000003,-0.9013916539999514,0.0 +72883,51.90968292800005,-0.6706578929999409,0.0 +72884,51.90347001900005,-0.4713936779999699,0.0 +72885,51.88884352100007,0.01731453200005717,0.0 +72886,51.89278490200007,0.022439284000029147,0.0 +72888,51.89831405400008,0.15533373400006667,0.0 +72889,51.88708282700003,0.17546328500003483,0.0 +72890,51.87207581900003,0.6480586070000527,0.0 +72893,51.93009664200008,-1.8734392669999806,0.0 +72894,51.94965859700005,-1.865404587999933,0.0 +72898,51.93498359000006,-1.7915742149999687,0.0 +72902,51.911253601000055,-1.2216583079999737,0.0 +72903,51.91427678900004,-1.2147410769999283,0.0 +72908,51.91572345000003,-1.7833536939999703,0.0 +72909,51.924763159000065,-2.260445297999979,0.0 +72910,51.92529519300007,-2.252924054999937,0.0 +72913,51.91661218100006,-1.8561868719999666,0.0 +72920,51.88819217200006,-0.08422344099994916,0.0 +72921,51.897308527000064,-0.06760563499994987,0.0 +72924,51.89976461300006,-0.5741512329999523,0.0 +72928,51.91248824000007,-1.4280068449999703,0.0 +72929,51.91035594500005,-1.4049301019999803,0.0 +72936,51.89925406100008,-0.5344100619999494,0.0 +72939,51.90689899500006,-0.3403130669999541,0.0 +72940,51.89626665500003,-0.2958448269999394,0.0 +72944,51.92630232300007,-1.6504168379999555,0.0 +72946,51.91175194500005,-1.8681177479999747,0.0 +72948,51.91655750100006,-1.6109884669999701,0.0 +72950,51.92015008800007,-2.0923112679999463,0.0 +72951,51.896057357000075,-0.6647646769999369,0.0 +72952,51.881813469000065,-0.16330772299994578,0.0 +72953,51.91340810400004,-1.663795681999943,0.0 +72954,51.905620664000025,-1.6353187389999562,0.0 +72956,51.88972913200007,-0.19092755499997338,0.0 +72958,51.897757166000076,-1.1026943089999577,0.0 +72960,51.904223725000065,-1.1122832569999446,0.0 +72961,51.894812933000026,-1.1020940359999258,0.0 +72962,51.87662482800005,-0.15921604899995145,0.0 +72965,51.88190337700007,-0.05115693699997337,0.0 +72968,51.89208887900003,-0.9840000099999315,0.0 +72969,51.87693345100007,-0.07622250199995051,0.0 +72970,51.909176055000046,-1.8333679909999319,0.0 +72972,51.90152532800005,-1.8226470419999714,0.0 +72974,51.89632016300004,-0.7262827039999706,0.0 +72975,51.88029685600003,0.36129550300006485,0.0 +72977,51.89265128900007,-1.1094950289999588,0.0 +72978,51.890855843000054,-0.6908031769999639,0.0 +72979,51.88815198600008,-0.6136865939999439,0.0 +72980,51.87319572300004,-0.15813534099993376,0.0 +72981,51.88625619600003,-0.6497432749999348,0.0 +72983,51.85664470100005,0.408575494000047,0.0 +72984,51.87533307900003,0.42015455800003565,0.0 +72987,51.88209915400006,-0.6336952969999743,0.0 +72988,51.89241578000008,-0.1364570419999609,0.0 +73002,51.88892214200007,-0.9784583619999694,0.0 +73003,51.87138262700006,-0.1442545049999353,0.0 +73005,51.89658525600004,-1.6503358089999551,0.0 +73006,51.89993658700007,-1.6316718409999567,0.0 +73007,51.88444844000003,-0.6537828809999269,0.0 +73008,51.88106512600007,-0.6386089219999462,0.0 +73013,51.880719783000075,-0.734466202999954,0.0 +73016,51.894375110000055,-1.2535159699999667,0.0 +73017,51.897131623000064,-1.2409309509999389,0.0 +73018,51.90331258300006,-1.7635085279999316,0.0 +73019,51.93175004500006,-1.7526609089999283,0.0 +73026,51.856819216000076,0.6998794070000258,0.0 +73027,51.88886663400007,-1.0401698459999693,0.0 +73028,51.88543898100005,-1.0137638229999766,0.0 +73033,51.898630952000076,-2.149969366999926,0.0 +73034,51.89521088100008,-1.1915819589999614,0.0 +73035,51.89673477300005,-1.157163612999966,0.0 +73036,51.864617794000026,0.300327788000061,0.0 +73037,51.85273700800008,0.3100986980000471,0.0 +73038,51.84905379700007,0.7497087030000671,0.0 +73039,51.89165491700004,-1.5016920249999544,0.0 +73040,51.887659244000076,-1.49609518099993,0.0 +73041,51.88472313500006,-0.5845784689999505,0.0 +73046,51.890674372000035,-1.625716291999936,0.0 +73047,51.90076391600007,-1.6004264749999493,0.0 +73051,51.89002937600003,-1.7437324419999527,0.0 +73052,51.88900630100005,-1.7390012019999403,0.0 +73053,51.89292358200004,-2.10662343599995,0.0 +73055,51.888095828000075,-1.0817764459999353,0.0 +73057,51.88887591200006,-1.521495922999975,0.0 +73058,51.856084097000064,0.007642712000063057,0.0 +73059,51.87009714800007,0.019509340000070097,0.0 +73064,51.89875656100003,-2.233053684999959,0.0 +73066,51.88997008200005,-2.2394681449999325,0.0 +73067,51.89507624000004,-2.208035263999932,0.0 +73068,51.87908699600007,-1.0497044699999378,0.0 +73070,51.89061971900003,-2.1126895119999745,0.0 +73071,51.86551314800005,0.16521056800002043,0.0 +73072,51.85879775600006,0.18507826700005126,0.0 +73076,51.88244511200003,-1.5039197199999421,0.0 +73077,51.884018413000035,-1.5015800809999291,0.0 +73080,51.87647453800008,-1.0667416759999355,0.0 +73089,51.84917834600003,0.39329621400003134,0.0 +73090,51.88424100000003,-1.3929568989999552,0.0 +73091,51.881292133000045,0.08709596200003489,0.0 +73092,51.87907732300005,-1.355448115999934,0.0 +73093,51.90325116900004,-1.3447852109999303,0.0 +73094,51.85972882000004,0.09848017400003073,0.0 +73104,51.887079560000075,-2.2504672549999327,0.0 +73106,51.87608322400007,-1.3943038159999332,0.0 +73107,51.873855854000055,-1.0393742039999552,0.0 +73109,51.886033018000035,-2.221066318999931,0.0 +73110,51.87612342300008,-1.3822776559999284,0.0 +73111,51.89258832100006,-1.3894512379999355,0.0 +73115,51.871433737000075,-0.5976410529999612,0.0 +73116,51.82862323900008,0.6904668640000295,0.0 +73117,51.83187852100008,0.7026147020000622,0.0 +73119,51.86986747000003,-0.274875556999973,0.0 +73121,51.843098101000066,0.31122031900002867,0.0 +73122,51.84013517000005,0.3203487750000704,0.0 +73123,51.87324387900003,-1.3684040109999387,0.0 +73124,51.87406760500005,-1.3541290169999343,0.0 +73128,51.872426020000034,-1.079991315999962,0.0 +73129,51.868496460000074,-1.0748949119999338,0.0 +73130,51.858405667000056,-0.11230930199997147,0.0 +73131,51.85588101600007,-0.07323105399996166,0.0 +73134,51.86832597400007,-0.9728248179999355,0.0 +73135,51.87042817200006,-0.32430150499993715,0.0 +73136,51.851821518000065,-0.2788373779999347,0.0 +73140,51.88748323400006,-2.168802194999955,0.0 +73141,51.87882178600006,-2.149411089999944,0.0 +73142,51.86746122200003,-0.6311528269999371,0.0 +73145,51.86481548200004,-0.9618379059999711,0.0 +73147,51.89916874800008,-2.265791578999938,0.0 +73148,51.88108158500006,-2.260558929999945,0.0 +73149,51.90534243900004,-2.0916309769999657,0.0 +73154,51.88860530200003,-2.29705260999998,0.0 +73155,51.87695679800004,-2.2666818419999686,0.0 +73156,51.83653806900003,0.154628457000058,0.0 +73157,51.84237498200008,0.16229255300004297,0.0 +73163,51.88631161100005,-1.7726753769999277,0.0 +73164,51.879083570000034,-1.7406822199999397,0.0 +73168,51.88317304700007,-1.9798807039999247,0.0 +73169,51.88936828200008,-1.9566248779999569,0.0 +73170,51.83446653100003,0.1616155800000456,0.0 +73178,51.84354978400006,-0.09958050499994897,0.0 +73179,51.84279959500003,-0.09458349199996974,0.0 +73182,51.87458777400008,-2.1455050329999494,0.0 +73183,51.86408967400007,-1.0334751379999716,0.0 +73184,51.87693056900008,-1.6069561189999604,0.0 +73187,51.83399534800003,0.1755981200000747,0.0 +73194,51.86440638700003,-1.5987210449999338,0.0 +73195,51.84548309100006,-0.3173513269999262,0.0 +73198,51.86288736800003,-0.6400278849999381,0.0 +73199,51.87197075800003,-1.952373080999962,0.0 +73200,51.85762286500005,-0.8664191769999547,0.0 +73201,51.85543162600004,-0.8574698199999489,0.0 +73205,51.86007016700006,-1.0121459989999266,0.0 +73206,51.85763673200006,-0.980860436999933,0.0 +73207,51.83968357500004,-0.2232587169999647,0.0 +73208,51.864068419000034,-1.6172819759999584,0.0 +73215,51.87009963600008,-1.4891361179999762,0.0 +73216,51.87228649300005,-1.554902087999949,0.0 +73217,51.84186721800006,-0.24303695199995445,0.0 +73218,51.86780955200004,-1.9631595649999554,0.0 +73219,51.86512106600003,-1.9608832889999803,0.0 +73221,51.86414386300004,-1.3542228059999388,0.0 +73222,51.861308989000065,-1.3474552559999324,0.0 +73223,51.861578304000034,-1.6054058829999462,0.0 +73226,51.86580461800003,-1.9482362629999557,0.0 +73228,51.858341074000066,-1.1670299289999662,0.0 +73229,51.85916800600006,-1.1265584049999688,0.0 +73232,51.86414056800004,-1.1848694909999722,0.0 +73233,51.86695180900006,-1.1692377999999621,0.0 +73237,51.829254141000035,0.6510725020000336,0.0 +73238,51.816184914000075,0.6786051590000284,0.0 +73239,51.863645130000066,-2.4569347879999555,0.0 +73240,51.87063631600006,-2.4553732969999373,0.0 +73242,51.84570766500008,-0.7340215079999552,0.0 +73243,51.83316514100005,-0.21700695599997744,0.0 +73244,51.839482933000056,-0.1960934959999463,0.0 +73245,51.84309801900008,-0.46747279299995625,0.0 +73246,51.85052782000008,-1.1824355689999493,0.0 +73247,51.85055282600007,-1.1804240049999635,0.0 +73248,51.83768209100003,-0.4720658979999257,0.0 +73249,51.86799595300005,-1.2364977169999634,0.0 +73250,51.85991758000006,-1.8155057319999628,0.0 +73251,51.840787970000065,0.4918616290000273,0.0 +73252,51.81520956600008,0.5604241900000488,0.0 +73256,51.84148801400005,-0.7060794419999752,0.0 +73258,51.85095718200006,-1.239994577999937,0.0 +73261,51.86652362800004,-2.2693151349999425,0.0 +73264,51.85227281500005,-0.8812285379999594,0.0 +73265,51.84606817300005,-0.8664880559999801,0.0 +73266,51.84023000800005,-0.7452340779999531,0.0 +73268,51.83704086400007,-0.7427589829999306,0.0 +73269,51.83786146700004,-0.7337229459999435,0.0 +73277,51.86290315800005,-2.35568316399997,0.0 +73281,51.84876240300008,-1.2049045119999278,0.0 +73282,51.84512577100003,-1.1932526059999304,0.0 +73283,51.829011147000074,0.027237423000030958,0.0 +73284,51.83067024800005,0.05450569100003122,0.0 +73285,51.853409449000026,-1.4959212819999266,0.0 +73292,51.86481834800003,-1.8529565159999493,0.0 +73295,51.83657980900006,-0.8558826399999475,0.0 +73296,51.877635792000035,-0.8076746309999407,0.0 +73298,51.834208911000076,-0.8450582479999298,0.0 +73300,51.84302522200005,-1.428447407999954,0.0 +73302,51.84593571500005,-1.668868563999979,0.0 +73303,51.85389328700006,-1.663419762999979,0.0 +73304,51.85728129700004,-2.376999444999967,0.0 +73305,51.80679000200007,0.33017702400002236,0.0 +73306,51.806158348000054,0.3376097510000591,0.0 +73308,51.86803278500008,-2.216500445999941,0.0 +73311,51.82775826800008,-0.44161766599995644,0.0 +73312,51.83765972800006,-0.4355071409999596,0.0 +73315,51.854430265000076,-2.243414060999953,0.0 +73316,51.843352097000036,-1.3758295649999468,0.0 +73317,51.84831974600007,-1.3592071349999628,0.0 +73318,51.84193266900007,-0.9892279379999422,0.0 +73319,51.84189963500006,-0.7960420989999761,0.0 +73321,51.85101761400006,-2.2842993559999627,0.0 +73323,51.83702827700006,-1.297970242999952,0.0 +73324,51.90025280100008,-1.2948105099999339,0.0 +73326,51.836176590000036,-1.1905410969999366,0.0 +73327,51.82186414100005,-0.4193720999999755,0.0 +73329,51.83884898400004,-1.2167889079999554,0.0 +73330,51.83491596200008,-1.2180440279999516,0.0 +73335,51.847291221000035,-1.4573168089999626,0.0 +73336,51.84015476500008,-1.4325299379999592,0.0 +73337,51.80713764200004,0.1517468270000677,0.0 +73338,51.82013747600007,0.16181550000004563,0.0 +73339,51.83461661300004,-1.199977659999945,0.0 +73340,51.82773761800007,-0.4874164739999287,0.0 +73342,51.84105557300006,-1.2302295059999437,0.0 +73343,51.83380749100007,-1.2314079869999546,0.0 +73346,51.83940656100003,0.23951473200003193,0.0 +73347,51.81133573500006,-0.03618211999997811,0.0 +73348,51.832573453000066,-1.2381120709999323,0.0 +73351,51.84564604700006,-2.3192478699999697,0.0 +73352,51.84725594200006,-0.360697097999946,0.0 +73353,51.81462674200003,-0.26759766499992566,0.0 +73355,51.81863415400005,-0.46986255699994217,0.0 +73362,51.80045227900007,0.23453718500002196,0.0 +73363,51.84883094300005,-2.3410256079999385,0.0 +73364,51.85298181100006,-2.3311441579999723,0.0 +73367,51.799098454000045,0.4412294010000437,0.0 +73368,51.82406033700005,0.4465137770000638,0.0 +73375,51.82764272400004,-0.7183381389999681,0.0 +73376,51.82240873600006,-0.09636543499993877,0.0 +73377,51.807600681000054,-0.10727692299997216,0.0 +73378,51.86034749300006,0.558322012000076,0.0 +73379,51.79677488100003,0.6552140390000432,0.0 +73385,51.79093102400003,0.46879538000007415,0.0 +73386,51.83078631200004,-0.036922870999944735,0.0 +73387,51.805998016000046,-0.04820022399997015,0.0 +73388,51.789609720000044,0.4679269500000487,0.0 +73389,51.79933820000008,0.2082164040000407,0.0 +73391,51.83304685600007,-1.2791902499999424,0.0 +73392,51.83142438300007,-1.2532919379999612,0.0 +73393,51.826943173000075,-0.8539303189999714,0.0 +73394,51.81602344600003,-0.4407354379999333,0.0 +73395,51.82714483500007,-0.7493059589999689,0.0 +73396,51.84922575400003,-2.440587338999933,0.0 +73397,51.84270397500006,-1.9261678709999615,0.0 +73398,51.847586070000034,-2.1569783779999625,0.0 +73400,51.85102309700005,-1.7347974349999618,0.0 +73403,51.83259759300006,-1.3978010229999427,0.0 +73404,51.819925022000064,-0.8510446109999634,0.0 +73405,51.799471363000066,0.14831201600003396,0.0 +73406,51.84010761400003,-1.7754526619999638,0.0 +73407,51.795092477000026,0.1397214600000325,0.0 +73410,51.84164891800003,-2.188205481999944,0.0 +73411,51.83819786000004,-2.346261904999949,0.0 +73412,51.83831365700007,-2.3425878779999607,0.0 +73413,51.83128038600006,-1.359939509999947,0.0 +73414,51.83710393400003,-2.3545346689999747,0.0 +73415,51.83439347800004,-2.3510431569999355,0.0 +73416,51.79403495400004,0.20384038700007068,0.0 +73420,51.84371139600006,-1.951128710999967,0.0 +73421,51.80157953200006,-0.0900183769999785,0.0 +73422,51.80249611000005,-0.07138013399998044,0.0 +73423,51.80555506400003,-0.01959708099997215,0.0 +73424,51.808267656000055,0.006639217000042663,0.0 +73427,51.83663957500005,-2.4468327799999656,0.0 +73428,51.79464859700005,0.16933778300005997,0.0 +73429,51.81576617200005,-0.7564627539999265,0.0 +73431,51.82774856900005,-1.4461612179999292,0.0 +73432,51.83967380300004,-2.3110151869999527,0.0 +73434,51.796310221000056,-0.08425120499993,0.0 +73436,51.79783146400007,0.11057098000003407,0.0 +73437,51.79262155100008,0.12384963300002028,0.0 +73439,51.82995440600007,-0.37833083899994335,0.0 +73443,51.81117722700003,-0.8371050359999685,0.0 +73444,51.807877621000046,-0.8249241829999505,0.0 +73445,51.80774883300006,-0.15433729399995855,0.0 +73446,51.79302702800004,-0.08888475299994525,0.0 +73448,51.822853473000066,-1.2190659379999715,0.0 +73452,51.832005938000066,-1.6634793679999689,0.0 +73456,51.80252525700007,0.0951350490000209,0.0 +73457,51.78694940300005,0.10650976800002354,0.0 +73463,51.78752178500008,0.3474592050000638,0.0 +73464,51.77954119900005,0.3711665470000298,0.0 +73467,51.78782853800004,0.14243184400004338,0.0 +73469,51.81970279300003,-1.6999445789999754,0.0 +73470,51.80931061900003,-0.3970763609999608,0.0 +73471,51.79543960900003,-0.3202553089999469,0.0 +73473,51.815717637000034,-1.882276099999956,0.0 +73476,51.80827146200005,-0.7406201219999389,0.0 +73477,51.782361613000035,0.08583444900006043,0.0 +73478,51.826212706000035,-2.0309150059999297,0.0 +73479,51.832059627000035,-2.0003632409999454,0.0 +73482,51.792624800000056,-0.4006993879999641,0.0 +73483,51.79220844900004,-0.42078823099996043,0.0 +73484,51.788822957000036,-0.00020419299994500761,0.0 +73485,51.82101128800008,-1.9083412159999398,0.0 +73486,51.78821761800003,-0.08805132399993454,0.0 +73487,51.78095676000004,0.0005769430000555076,0.0 +73490,51.81969077900004,-2.425671432999934,0.0 +73491,51.82538766300007,-2.4124963149999417,0.0 +73496,51.78708372600005,-0.1090609069999573,0.0 +73501,51.78892622300003,0.045926264000058836,0.0 +73502,51.77967048800008,0.05602767800002084,0.0 +73508,51.812371848000055,-1.6461122369999543,0.0 +73509,51.81071447800008,-1.6269125849999568,0.0 +73514,51.762518500000056,0.5262749360000498,0.0 +73515,51.76868046300007,0.5406125920000591,0.0 +73521,51.823287021000056,-2.3517293389999736,0.0 +73522,51.81752984700006,-2.3511592809999797,0.0 +73523,51.81099759400007,-1.5931582059999414,0.0 +73524,51.806625462000056,-1.504297979999933,0.0 +73525,51.80919212500004,-0.9945135719999598,0.0 +73526,51.81201246000006,-0.963918792999948,0.0 +73529,51.81773678700006,-0.6829712399999721,0.0 +73531,51.83288758400005,-2.269015086999957,0.0 +73532,51.807635203000075,-1.5441050069999278,0.0 +73534,51.81096893400007,-0.5314397919999578,0.0 +73535,51.80383528200008,-1.612297817999945,0.0 +73538,51.79552459200005,-0.6105532529999778,0.0 +73540,51.78327611700007,-0.4242871589999595,0.0 +73545,51.79041581300004,-0.5388633419999564,0.0 +73546,51.78140197600004,-0.5065471229999616,0.0 +73554,51.80014755500008,-1.525863342999969,0.0 +73555,51.77643064800003,-0.0917398329999628,0.0 +73556,51.79421677100004,-0.23410906499992734,0.0 +73564,51.77448953600003,-0.12723915399993757,0.0 +73567,51.79592921300008,-1.3244036439999718,0.0 +73568,51.803662806000034,-1.2969109939999726,0.0 +73569,51.77364191400005,0.006440083000029517,0.0 +73570,51.77412573300006,0.02265936300005933,0.0 +73571,51.77293951100006,-0.18469598799993037,0.0 +73572,51.77848891200006,-0.5185992289999604,0.0 +73573,51.77760476600008,0.5845702170000209,0.0 +73575,51.75392602200003,0.5412767910000298,0.0 +73576,51.750537902000076,0.5822864890000687,0.0 +73577,51.78159065700004,-0.6156099229999654,0.0 +73580,51.79392783800006,-0.8159324129999277,0.0 +73583,51.799377066000034,-1.5688004899999441,0.0 +73584,51.79692236100004,-1.3716482989999577,0.0 +73585,51.80855626400006,-1.364811862999943,0.0 +73586,51.77228065000003,0.07523905500005412,0.0 +73587,51.79998636900007,-2.321279661999938,0.0 +73588,51.790902886000026,-1.3129827879999425,0.0 +73589,51.76370879800004,0.09739570200002845,0.0 +73590,51.80562838000003,-2.349627393999981,0.0 +73592,51.80130197700004,-2.3007224399999586,0.0 +73593,51.76507295500005,0.6492012650000447,0.0 +73596,51.770569927000054,-0.20863002899994854,0.0 +73597,51.757793942000035,0.3790476290000697,0.0 +73599,51.78932266600003,-1.245984238999938,0.0 +73600,51.74605324300006,0.6484077040000216,0.0 +73601,51.810574562000056,-1.2550446509999347,0.0 +73602,51.78742260000007,-1.2491989889999786,0.0 +73605,51.74496360000006,0.6169800600000599,0.0 +73608,51.79915651400006,-2.3423728769999457,0.0 +73609,51.77917378200004,-0.8326020669999252,0.0 +73614,51.79857148200006,-2.3353709999999523,0.0 +73615,51.79602486700003,-2.323277361999942,0.0 +73616,51.79085687400004,-1.6463478289999784,0.0 +73618,51.76596461500003,-0.24886059499993962,0.0 +73619,51.766352805000054,-0.24513520599992944,0.0 +73620,51.80045306300008,-2.176147728999979,0.0 +73621,51.78788816600007,-1.3600702069999784,0.0 +73622,51.80105856900008,-2.3884384569999497,0.0 +73623,51.79234604800007,-2.1726043939999613,0.0 +73624,51.785395236000056,-1.3309453739999526,0.0 +73625,51.786387442000034,-0.9706322629999704,0.0 +73626,51.80212769500008,-0.9160548799999333,0.0 +73627,51.79400568500006,0.29878355700003567,0.0 +73628,51.78879535300007,-1.776913044999958,0.0 +73629,51.78847365400003,-1.7675161959999741,0.0 +73630,51.75725990300003,0.07534381900006792,0.0 +73633,51.78095045400005,-0.8676301449999642,0.0 +73634,51.74693120100005,0.2976883710000493,0.0 +73635,51.74577904600005,0.3015075630000297,0.0 +73636,51.79309967300003,-1.4933142709999743,0.0 +73637,51.78473026900008,-1.4747567359999607,0.0 +73640,51.79243883100003,-2.340015059999928,0.0 +73641,51.77837344800008,-0.3776736899999378,0.0 +73642,51.75858022600005,-0.0027602709999428043,0.0 +73643,51.759427636000055,0.003761912000072698,0.0 +73644,51.74527151400008,0.2989147500000513,0.0 +73647,51.78793009700007,-1.6676511559999767,0.0 +73649,51.752278742000044,0.0015906430000427463,0.0 +73650,51.74547920300006,0.40623073200004,0.0 +73651,51.76125686100005,0.4041277000000605,0.0 +73652,51.75215955900006,0.43641366500003187,0.0 +73654,51.79016411100008,-2.0936782989999756,0.0 +73655,51.799446371000045,-2.078597302999981,0.0 +73656,51.773362716000065,-0.822258561999945,0.0 +73657,51.73920883800008,0.6244632160000378,0.0 +73659,51.73870097100007,0.4374181310000722,0.0 +73664,51.763458454000045,-0.1636177689999272,0.0 +73665,51.77182589200004,-0.5893656879999298,0.0 +73666,51.76876723200007,-0.5572766509999383,0.0 +73669,51.778981771000076,-1.354948062999938,0.0 +73675,51.78143517600006,-1.393834887999958,0.0 +73679,51.75744352700008,0.2180595260000473,0.0 +73681,51.75270509500007,-0.015812023999956182,0.0 +73682,51.749408680000045,0.00465404600004149,0.0 +73683,51.74880922700004,0.008856338000043706,0.0 +73684,51.797729066000045,-1.9835360379999543,0.0 +73685,51.78432163900004,-1.971170061999942,0.0 +73687,51.739238267000076,0.27381178000007367,0.0 +73688,51.743739911000034,0.28351320100006205,0.0 +73692,51.80497599000006,-1.8085545569999795,0.0 +73693,51.78207684000006,-1.77050380299994,0.0 +73694,51.776166276000026,-1.4776193029999263,0.0 +73695,51.774808301000064,-1.2534337169999503,0.0 +73696,51.77801871500003,-1.2519079489999285,0.0 +73697,51.782160978000036,-2.206441388999963,0.0 +73698,51.78420224700005,-2.1901276509999548,0.0 +73700,51.77108745000004,-1.4779921679999575,0.0 +73701,51.774965792000046,-1.2143970179999428,0.0 +73702,51.73272491300003,0.4662617640000235,0.0 +73703,51.758968236000044,0.478542811000068,0.0 +73704,51.733697875000075,0.6855992880000485,0.0 +73712,51.79731541600006,-0.7784500049999679,0.0 +73713,51.77723247200004,-1.0542549009999789,0.0 +73714,51.77271764800008,-1.0368780029999698,0.0 +73715,51.73586583800005,0.5186418730000355,0.0 +73719,51.78433677100003,-2.3119690459999447,0.0 +73720,51.79290197800003,-1.8771995939999329,0.0 +73721,51.782701744000065,-1.8530396219999261,0.0 +73723,51.737662561000036,0.19089830300003996,0.0 +73724,51.75294381200007,-0.3892205919999583,0.0 +73726,51.73228856000003,0.4403296100000489,0.0 +73730,51.76890140100005,-1.372548042999938,0.0 +73731,51.76631712400007,-0.8636727699999369,0.0 +73734,51.76764197600005,-1.3998998299999243,0.0 +73736,51.76374830800006,-0.9247770789999663,0.0 +73737,51.774525459000074,-1.9222742829999788,0.0 +73738,51.77184342000004,-1.90679262499998,0.0 +73739,51.75350488200007,-0.5414476919999629,0.0 +73740,51.79154642200007,-2.429879322999966,0.0 +73741,51.76715186400003,-0.9717914439999618,0.0 +73742,51.756987981000066,-0.9682959809999261,0.0 +73746,51.77370043800005,-1.0895443909999472,0.0 +73751,51.75078086100007,-0.2532226479999622,0.0 +73752,51.72250094700007,0.43677541800002473,0.0 +73753,51.73117062000006,0.1527267900000311,0.0 +73754,51.75363129800007,-0.9826877339999669,0.0 +73755,51.74454033100005,-0.4968175499999461,0.0 +73756,51.763988003000065,-0.4805438159999653,0.0 +73757,51.738333555000054,-0.004108566999946106,0.0 +73758,51.73520453300006,0.01674053700003242,0.0 +73760,51.755402020000076,-1.0720996169999353,0.0 +73761,51.75591692200004,-1.0503497629999288,0.0 +73762,51.73034228800003,0.16631672000005437,0.0 +73770,51.73210413800007,0.543250449000027,0.0 +73771,51.78983645500006,-2.5662090739999712,0.0 +73774,51.772293829000034,-1.2992201779999277,0.0 +73775,51.75730922900004,-1.2852751919999719,0.0 +73776,51.752009170000065,-0.9401488139999401,0.0 +73777,51.71022520900004,0.6727747370000543,0.0 +73778,51.76891824900008,-0.2874193719999312,0.0 +73779,51.737045325000054,-0.2691369519999398,0.0 +73782,51.76594440200006,-2.5661892599999305,0.0 +73784,51.711579345000075,0.5230683500000737,0.0 +73785,51.73521497000007,0.36613601800002016,0.0 +73787,51.80197347600006,-2.5001213579999444,0.0 +73788,51.74851305000004,-0.8920509089999769,0.0 +73790,51.75184449300008,-1.026864777999947,0.0 +73791,51.74149976100006,-0.5515589719999525,0.0 +73794,51.780747347000045,-1.1196323209999264,0.0 +73795,51.74761883800005,-1.0908658479999644,0.0 +73796,51.771903562000034,-2.508009632999972,0.0 +73799,51.76183607100006,-2.4526368709999247,0.0 +73800,51.75523618200003,-1.3763853769999628,0.0 +73801,51.73116707300005,-0.2455783539999743,0.0 +73802,51.727884173000064,-0.21654601399995954,0.0 +73803,51.70786504500006,0.510698226000045,0.0 +73805,51.71753884900005,0.2243033190000574,0.0 +73806,51.728209037000056,0.23278011900004003,0.0 +73807,51.74943221700005,-1.3600711499999534,0.0 +73813,51.74134184300004,-1.112436086999935,0.0 +73814,51.74236005300003,-1.1101912439999637,0.0 +73815,51.70589769900005,0.5582173090000424,0.0 +73818,51.77360241800005,-2.005321753999965,0.0 +73819,51.76486801200008,-1.9716333909999548,0.0 +73822,51.75864175100003,-1.8331739919999563,0.0 +73823,51.74157891600004,-0.9174324379999348,0.0 +73824,51.740797013000076,-0.6280193709999367,0.0 +73825,51.73826359100008,-0.6140535299999783,0.0 +73826,51.72346363300005,-0.2226068379999333,0.0 +73827,51.72272077900004,0.2674797670000544,0.0 +73828,51.70960144600008,0.26703592800004117,0.0 +73829,51.774755612000035,-2.3426319309999712,0.0 +73830,51.752861034000034,-2.314724703999957,0.0 +73831,51.74714507300007,-1.6193778689999476,0.0 +73832,51.76974109000008,-1.6144346839999457,0.0 +73835,51.69922649000006,0.5909822950000603,0.0 +73836,51.74905225400005,-1.8338456739999742,0.0 +73837,51.72177228500004,-0.34135461699997904,0.0 +73838,51.742432043000065,-0.34112475099993844,0.0 +73839,51.73934883600003,-0.9793074879999608,0.0 +73840,51.73396542100005,-0.909443979999935,0.0 +73842,51.75687978800005,-1.560647170999971,0.0 +73843,51.754726306000066,-1.5479602049999244,0.0 +73845,51.717490602000055,-0.20114735599997857,0.0 +73846,51.71418136500006,0.08880445900007317,0.0 +73847,51.698421376000056,0.6969946830000708,0.0 +73848,51.69853628000004,0.6092924470000298,0.0 +73853,51.716071975000034,-0.3048165839999797,0.0 +73855,51.76163029700007,-2.21786605799997,0.0 +73856,51.73623829100006,-1.1096610519999786,0.0 +73857,51.73223356600005,-1.1070646309999574,0.0 +73858,51.72200025300003,-0.28795967399997835,0.0 +73859,51.74410843700008,-2.2243242349999264,0.0 +73860,51.75725818800004,-2.1929753629999595,0.0 +73861,51.69027354600007,0.7457354000000578,0.0 +73862,51.731077783000046,-0.8810496069999658,0.0 +73864,51.69067073900004,0.6206361980000565,0.0 +73866,51.716156357000045,-0.21873066199992763,0.0 +73868,51.72255077500006,-0.02578040499997769,0.0 +73869,51.71836084100005,-0.005354065999938484,0.0 +73870,51.706563086000074,0.0732288380000341,0.0 +73871,51.70490729800008,0.24293503700005203,0.0 +73872,51.703376932000026,0.2561392870000532,0.0 +73875,51.68910221100003,0.6168262110000455,0.0 +73876,51.74190751000003,-2.2364968449999765,0.0 +73877,51.73854742800006,-1.3715790429999402,0.0 +73880,51.74092365400003,-1.266216505999978,0.0 +73881,51.74822453000007,-1.2463939539999274,0.0 +73882,51.68743324400003,0.7724092070000665,0.0 +73885,51.70750534700005,-0.01975448699994331,0.0 +73886,51.70453296200003,-0.015560344999926201,0.0 +73887,51.74103641500005,-2.2857140659999686,0.0 +73888,51.696236903000056,0.2558038800000304,0.0 +73889,51.69535603600008,0.2647293780000268,0.0 +73894,51.726926055000035,-1.2451109819999715,0.0 +73895,51.735807254000065,-1.2284824429999617,0.0 +73901,51.726671260000046,-0.9472820099999808,0.0 +73902,51.72269911700005,-0.8445305299999291,0.0 +73903,51.68283579800004,0.7246619150000697,0.0 +73904,51.706376988000045,-0.20855486299996073,0.0 +73905,51.681814512000074,0.7329269490000456,0.0 +73909,51.696327567000026,0.5192573500000321,0.0 +73910,51.673210984000036,0.8364306620000548,0.0 +73913,51.70667339600004,-0.219388783999932,0.0 +73917,51.73614821500007,-2.4134596359999705,0.0 +73918,51.74447186300006,-1.4268797089999339,0.0 +73919,51.731161015000055,-1.9195381629999702,0.0 +73920,51.74940378000008,-1.9117530089999377,0.0 +73922,51.69984029400007,-0.1154803279999328,0.0 +73923,51.71237309800006,-0.10799344499997687,0.0 +73924,51.71974488200004,-0.8506263279999757,0.0 +73925,51.671731675000046,0.8383941290000507,0.0 +73927,51.732053645000065,-2.4106500629999346,0.0 +73928,51.73859256800006,-2.382207386999937,0.0 +73929,51.70859495900004,-0.3178704819999325,0.0 +73931,51.72489173900004,-0.6383304059999659,0.0 +73932,51.71859107900008,-0.6078098569999497,0.0 +73933,51.730416631000026,-2.408306727999957,0.0 +73936,51.72041332100008,-0.719894022999938,0.0 +73937,51.738659563000056,-2.3362740539999436,0.0 +73938,51.714696590000074,-0.7462384699999802,0.0 +73940,51.69946790900008,-0.2339534569999273,0.0 +73942,51.699298483000064,-0.037975742999947215,0.0 +73943,51.69753464000007,-0.019108199999948283,0.0 +73944,51.68991555400004,0.40328722200007405,0.0 +73945,51.70129649900008,0.43976004900002863,0.0 +73948,51.71020737600003,-0.3358624079999686,0.0 +73949,51.70060538300004,-0.3325664229999461,0.0 +73954,51.74706432600004,-2.1039241259999244,0.0 +73955,51.75096024700008,-2.0779517249999344,0.0 +73958,51.74601664100004,-2.00871858499994,0.0 +73959,51.73738763100005,-1.9696393929999658,0.0 +73961,51.67907863200003,0.5071890130000725,0.0 +73962,51.691005483000026,-0.022827038999935212,0.0 +73963,51.71950921700005,-1.24099216999997,0.0 +73964,51.71806791000006,-1.2028246199999444,0.0 +73965,51.705384019000064,-0.6131582159999311,0.0 +73966,51.691315572000065,-0.031960837999974956,0.0 +73967,51.69860730400006,0.038171227000020735,0.0 +73968,51.678690947000064,0.5197624140000698,0.0 +73969,51.714192773000036,-0.6414031829999658,0.0 +73970,51.702718375000075,-0.6159871789999443,0.0 +73971,51.72923755800008,-1.6502073189999464,0.0 +73972,51.72935479500006,-1.628621194999937,0.0 +73973,51.68880134400007,-0.022255009999923914,0.0 +73976,51.68812171700006,0.216291462000072,0.0 +73977,51.687307600000054,0.24636632900006816,0.0 +73978,51.67263295400005,0.5272551100000555,0.0 +73979,51.72921547300007,-2.503255982999974,0.0 +73980,51.70100123600008,-0.6254797269999699,0.0 +73981,51.68679442300004,0.015442021000069417,0.0 +73983,51.72463524500006,-1.5377958969999668,0.0 +73986,51.713487119000035,-1.515654263999977,0.0 +73990,51.707099080000035,-1.1272653509999486,0.0 +73991,51.71843734400005,-1.1164583829999515,0.0 +73994,51.73056396700008,-2.3591464079999582,0.0 +73995,51.712107056000036,-1.5008856729999707,0.0 +73996,51.71918860900007,-2.3512403919999656,0.0 +73999,51.73603338000004,-1.4811000429999694,0.0 +74000,51.73115359500008,-2.1730443079999304,0.0 +74001,51.72187592800003,-2.143337548999966,0.0 +74002,51.72945324600005,-2.2023783389999494,0.0 +74003,51.71146618600005,-1.4793943339999487,0.0 +74004,51.71030229200005,-1.4545003289999272,0.0 +74008,51.71401819000005,-1.3965097239999409,0.0 +74009,51.68308087300005,-0.005259531999968203,0.0 +74015,51.70735543300003,-1.4749852159999364,0.0 +74016,51.70877386400008,-1.045622979999962,0.0 +74018,51.70183573400004,-1.0316967599999316,0.0 +74021,51.704460622000056,-1.4768853779999631,0.0 +74022,51.70265927100007,-1.1274330639999448,0.0 +74025,51.67149974900008,0.4111384940000562,0.0 +74026,51.70632307600005,-1.7499472099999593,0.0 +74027,51.722573004000026,-1.5946266729999365,0.0 +74028,51.680898608000064,-0.02501425899993137,0.0 +74029,51.71285541100008,-0.962710536999964,0.0 +74030,51.674757200000045,0.12966693500004567,0.0 +74031,51.67855847100003,0.13813214900005732,0.0 +74035,51.72230746400004,-1.7810411249999447,0.0 +74036,51.68472804500004,-0.09380709999993542,0.0 +74037,51.73616690600005,-2.539805271999967,0.0 +74042,51.71925605000007,-2.4112962109999785,0.0 +74043,51.72515812900008,-2.232858043999954,0.0 +74044,51.705215046000035,-0.4747134449999635,0.0 +74047,51.688820459000056,-0.4860643029999778,0.0 +74050,51.70324518900003,-1.5286130039999648,0.0 +74051,51.67358309100007,-0.049626468999974804,0.0 +74052,51.67315511000004,0.22321490000007316,0.0 +74053,51.70565848900003,-2.2361607189999404,0.0 +74054,51.70796758000006,-0.3757916269999555,0.0 +74055,51.691228642000056,-0.35317899499995065,0.0 +74056,51.66224756100007,0.37376680300002363,0.0 +74057,51.71068950600005,-2.566727642999979,0.0 +74059,51.70821491600003,-1.6134594019999327,0.0 +74060,51.70107158400003,-1.587561113999925,0.0 +74061,51.67637038300006,-0.10220930199994882,0.0 +74062,51.70012830600007,-1.6375261349999732,0.0 +74063,51.69701645300006,-1.6076633839999772,0.0 +74065,51.69354734400008,-0.6946402309999371,0.0 +74066,51.69324797400003,-1.0914059769999653,0.0 +74067,51.662242151000044,0.2215833920000705,0.0 +74070,51.698823091000065,-1.7342897149999317,0.0 +74071,51.72062634100007,-1.730899724999972,0.0 +74072,51.713190077000036,-1.896837545999972,0.0 +74073,51.69063479000005,-0.5467298259999325,0.0 +74074,51.697892024000055,-1.888598485999978,0.0 +74075,51.685989437000046,-0.31660023799997816,0.0 +74076,51.64097982100003,0.8648879590000433,0.0 +74077,51.71703412800008,-2.554357897999978,0.0 +74078,51.65744349400006,0.39966576100005113,0.0 +74079,51.653883310000026,0.41922011900004463,0.0 +74080,51.68770050400008,-0.5829162249999627,0.0 +74081,51.70626802800007,-1.861544050999953,0.0 +74082,51.69879128600007,-1.841578937999941,0.0 +74083,51.66388444100005,0.13636523200005968,0.0 +74084,51.65445766700003,0.8754799600000638,0.0 +74086,51.739830975000075,-1.716949854999939,0.0 +74087,51.69401434100007,-1.7122150169999486,0.0 +74088,51.70125260400005,-2.2238011799999526,0.0 +74090,51.67991904300004,-0.685272328999929,0.0 +74091,51.703137050000066,-2.5482737039999392,0.0 +74092,51.64897344100007,0.5854418540000665,0.0 +74093,51.651498194000055,0.5975666520000686,0.0 +74094,51.65093476700008,0.40171359200002144,0.0 +74095,51.64360866800007,0.6455574840000509,0.0 +74097,51.70445897400003,-2.5786408779999306,0.0 +74098,51.660856599000056,0.5031276450000632,0.0 +74099,51.68178228600004,-0.22214550499995767,0.0 +74100,51.65876316300006,0.1765389670000559,0.0 +74102,51.69528350400003,-2.218872312999963,0.0 +74103,51.69112224000003,-1.7051412009999467,0.0 +74104,51.694740538000076,-2.237085835999949,0.0 +74105,51.66814602900007,0.32470780800002785,0.0 +74106,51.69695544600006,-1.6677634429999557,0.0 +74107,51.68968190800007,-1.135428592999972,0.0 +74108,51.63983183600004,0.6457100510000373,0.0 +74112,51.63811447200004,0.718619057000069,0.0 +74114,51.64265440200006,0.6974643520000541,0.0 +74115,51.63582267400005,0.7250739920000342,0.0 +74118,51.66782113700003,-0.2871763149999538,0.0 +74121,51.69253959500003,-1.6208663699999306,0.0 +74124,51.63384775600008,0.7419855820000407,0.0 +74126,51.68666906000004,-1.6974461909999263,0.0 +74127,51.63570906500007,0.6793975380000461,0.0 +74128,51.63459590900004,0.7170149190000643,0.0 +74129,51.68541720800005,-1.6366384049999283,0.0 +74130,51.67826824400004,-0.7711829149999403,0.0 +74131,51.67322720100003,-0.7554507129999593,0.0 +74133,51.67007356900007,-0.3757858009999495,0.0 +74134,51.66253482800005,-0.37226217099993164,0.0 +74135,51.67525224900004,-0.644268130999933,0.0 +74136,51.69400841400005,-2.447248571999978,0.0 +74137,51.68460229300007,-1.6668153199999551,0.0 +74138,51.65361865500006,0.1174359050000362,0.0 +74139,51.63648455600003,0.6016909030000761,0.0 +74140,51.63666573000006,0.6295860540000717,0.0 +74141,51.64386722900008,0.3961866770000597,0.0 +74144,51.69033972600005,-1.3185000059999652,0.0 +74145,51.68325401900006,-1.2974948589999258,0.0 +74146,51.65078758700008,0.09260003900004676,0.0 +74147,51.64683260900006,0.09686454900003127,0.0 +74148,51.641916328000036,0.3663242180000452,0.0 +74149,51.644135135000056,0.3224040820000482,0.0 +74150,51.634846734000064,0.6440006220000214,0.0 +74151,51.63369858500005,0.846141613000043,0.0 +74152,51.63125267400005,0.8604915370000299,0.0 +74153,51.68599699400005,-2.4586144829999625,0.0 +74154,51.66266484300007,-0.01635551099997201,0.0 +74155,51.64937665100007,-0.014115174999972169,0.0 +74157,51.642682139000044,0.40358543700006067,0.0 +74158,51.68470857700004,-2.456365499999947,0.0 +74159,51.68127158400006,-1.624899389999939,0.0 +74163,51.69064691800003,-2.1945113619999574,0.0 +74168,51.63200363100003,0.7037763890000406,0.0 +74169,51.65497804900008,-0.020763062999947124,0.0 +74170,51.64751099500006,-0.017369833999964612,0.0 +74171,51.61985430000004,0.8926718820000588,0.0 +74172,51.62010981100008,0.9420693310000274,0.0 +74173,51.69619930200008,-2.036164165999935,0.0 +74174,51.70834216700007,-2.0115905779999252,0.0 +74175,51.62417134300006,0.8392265080000243,0.0 +74176,51.61831234600004,0.9322195300000544,0.0 +74177,51.68599920300005,-1.8343972239999289,0.0 +74178,51.69544166400004,-1.8177351379999322,0.0 +74181,51.685343250000074,-2.4884561169999415,0.0 +74182,51.69249202000003,-1.5390910309999413,0.0 +74183,51.68346262100005,-2.1580359469999735,0.0 +74185,51.68390089600007,-1.9644137549999527,0.0 +74186,51.700254363000056,-1.9551488389999463,0.0 +74187,51.67216894900008,-1.0103813689999583,0.0 +74189,51.68171552800004,-1.158020545999932,0.0 +74195,51.67258349200006,-1.1365026329999637,0.0 +74196,51.66953630800003,-1.2645574539999416,0.0 +74197,51.68594446800006,-1.2363438769999675,0.0 +74198,51.66114066600005,-0.6237641259999691,0.0 +74199,51.62953954800008,0.5993003370000451,0.0 +74200,51.64392941500006,0.10656190000003107,0.0 +74201,51.66480385700004,-1.0175887289999537,0.0 +74202,51.61640868500007,0.9083950250000612,0.0 +74203,51.69280518200003,-2.344275760999949,0.0 +74204,51.61593818500006,0.8805824280000252,0.0 +74206,51.659387206000076,-0.30227037199995266,0.0 +74207,51.67090246400005,-1.2976290539999695,0.0 +74208,51.675580686000046,-2.059030633999953,0.0 +74209,51.660075429000074,-0.1140211869999348,0.0 +74210,51.66530751300007,-0.4418930619999628,0.0 +74211,51.695771885000056,-0.4400835959999654,0.0 +74212,51.66435979400006,-1.311063264999973,0.0 +74213,51.66617498200003,-1.3026890699999285,0.0 +74215,51.67534044800004,-2.035967568999979,0.0 +74216,51.683182815000066,-2.2297269209999513,0.0 +74217,51.64105605000003,-0.09777096499993831,0.0 +74218,51.67706564000008,-2.184637294999959,0.0 +74219,51.66242887100003,-1.0364916909999806,0.0 +74220,51.68024056200005,-2.594568272999936,0.0 +74221,51.669528910000054,-1.0935411389999672,0.0 +74222,51.678971293000075,-1.7664810669999724,0.0 +74223,51.62329590200005,0.5738460170000508,0.0 +74224,51.62093156700007,0.5940094420000719,0.0 +74225,51.66792681600003,-0.8294910549999486,0.0 +74226,51.662658253000075,-0.847163529999932,0.0 +74228,51.67117050200005,-1.8220221319999723,0.0 +74229,51.68330467200008,-1.3659641619999547,0.0 +74230,51.672884579000026,-2.091383268999948,0.0 +74231,51.665776822000055,-1.7566815789999737,0.0 +74232,51.63860256300006,0.059605991000069025,0.0 +74233,51.63852724900005,0.07817718500007231,0.0 +74235,51.66390598100003,-1.8132874859999788,0.0 +74236,51.65000421600007,-0.39266001299995423,0.0 +74237,51.654273569000054,-1.0400015879999387,0.0 +74238,51.636059946000046,-0.05750944499993693,0.0 +74239,51.661207991000026,-1.3208711879999555,0.0 +74240,51.61664233300007,0.563148219000027,0.0 +74243,51.67326301800006,-1.722598345999927,0.0 +74244,51.61805892500007,0.5405399620000253,0.0 +74245,51.63311842500008,-0.0715172959999677,0.0 +74247,51.65982962500004,-1.3890808339999694,0.0 +74248,51.66153739300006,-1.4582956489999788,0.0 +74250,51.65522720400003,-1.3433838859999696,0.0 +74251,51.65556586100007,-1.3364460499999495,0.0 +74252,51.66337147200005,-1.7875479699999346,0.0 +74253,51.66007035400003,-1.7636464759999626,0.0 +74254,51.64754024500007,-0.8104437429999507,0.0 +74255,51.65307741500004,-1.348659783999949,0.0 +74256,51.67124816300003,-2.4058470119999242,0.0 +74257,51.60921024400005,0.829776268000046,0.0 +74258,51.643423949000066,-0.7998824499999273,0.0 +74259,51.65943371000003,-0.806636024999932,0.0 +74262,51.66335871600006,-0.49706624099997043,0.0 +74263,51.63530583900007,-0.4587861369999473,0.0 +74264,51.64020125800005,-0.4409435569999687,0.0 +74265,51.63705489700004,-0.4314478039999585,0.0 +74266,51.64232246300003,-0.8416566699999635,0.0 +74267,51.645330741000066,-0.8381013839999696,0.0 +74268,51.66053485900005,-1.8937770909999472,0.0 +74269,51.60736108800006,0.877420063000045,0.0 +74270,51.65916704600005,-1.8133649699999523,0.0 +74271,51.653002885000035,-0.5098756819999721,0.0 +74272,51.63453799300004,-0.4707962519999569,0.0 +74273,51.60999836500008,0.5658812410000564,0.0 +74276,51.65765522400005,-1.279142257999979,0.0 +74277,51.613653243000044,0.4624183530000323,0.0 +74278,51.61289796800003,0.49456601700006786,0.0 +74279,51.62655278500006,-0.046139575999973204,0.0 +74280,51.63354076000007,-0.0301694969999744,0.0 +74281,51.64129958900003,-0.8179661009999677,0.0 +74285,51.655219274000046,-1.8809899229999587,0.0 +74286,51.66639283500007,-1.8866720689999283,0.0 +74287,51.67507269200007,-1.8651614149999318,0.0 +74288,51.62192602700003,0.3774456050000481,0.0 +74291,51.60534767200005,0.5742333840000242,0.0 +74292,51.64670267900004,-1.0308356879999678,0.0 +74294,51.60384154700006,0.8669277570000418,0.0 +74295,51.63978224400006,-0.7882701759999691,0.0 +74296,51.64649880200005,-1.1920302199999355,0.0 +74297,51.65335382500007,-1.179781911999953,0.0 +74298,51.65698340300003,-1.8316232729999342,0.0 +74299,51.656529102000036,-1.750484399999948,0.0 +74300,51.63194289100005,-0.48452321599995685,0.0 +74301,51.63537747300006,-0.39333752299995695,0.0 +74306,51.65269540600008,-1.2912826899999459,0.0 +74307,51.64579790200003,-1.24492773999998,0.0 +74308,51.62921089900004,-0.48629218499996796,0.0 +74311,51.66732600200004,-2.4536381239999514,0.0 +74312,51.60400642600007,0.5665869390000466,0.0 +74313,51.64762823800004,-1.4434213939999267,0.0 +74316,51.593820066000035,0.8662106190000713,0.0 +74317,51.60018138100003,0.5663133060000405,0.0 +74321,51.65035383400004,-1.8610573859999704,0.0 +74323,51.66605678600007,-2.464595256999928,0.0 +74325,51.63225840100006,-0.7937573779999525,0.0 +74326,51.62892566200003,-0.49801114699994287,0.0 +74327,51.633871155000065,-0.7664362199999459,0.0 +74328,51.65001392000005,-0.7520350059999714,0.0 +74329,51.58973339500005,0.8788109410000402,0.0 +74330,51.63607749600004,-0.1504693929999803,0.0 +74332,51.65208028200004,-2.6245890619999273,0.0 +74333,51.66064203700006,-1.9586093759999699,0.0 +74335,51.61860186600006,-0.1939399069999581,0.0 +74336,51.633145927000044,-0.18902999699997736,0.0 +74337,51.64440381600008,-1.011555732999966,0.0 +74338,51.62178107500006,0.24467237800007524,0.0 +74339,51.60991906500004,0.26597192100007305,0.0 +74340,51.62896320600004,-0.518766262999975,0.0 +74341,51.63836471500008,-1.1587854409999636,0.0 +74342,51.653001698000025,-1.1480727969999407,0.0 +74343,51.61508063700006,-0.07849079899995104,0.0 +74344,51.641138124000065,-1.486343743999953,0.0 +74345,51.64345791400007,-1.4700565719999759,0.0 +74346,51.60361093800003,0.46221607200004655,0.0 +74347,51.64602746700007,-1.5090630379999652,0.0 +74348,51.614291051000066,-0.10022505999995701,0.0 +74351,51.647991165000064,-1.8118222989999708,0.0 +74352,51.60364326800004,0.5510354330000382,0.0 +74353,51.66231676400008,-1.9879496029999473,0.0 +74354,51.59191613100006,0.819868642000074,0.0 +74357,51.643139072000054,-1.9635816319999435,0.0 +74360,51.64725006100008,-2.014636211999971,0.0 +74361,51.64106275700004,-1.977650530999938,0.0 +74362,51.63828827200007,-1.4537548559999323,0.0 +74363,51.646622053000044,-1.899786530999961,0.0 +74364,51.640637162000075,-1.9424138969999376,0.0 +74365,51.63849568200004,-1.92641258499998,0.0 +74366,51.61236026600005,-0.13457706699995242,0.0 +74367,51.61563001800005,-0.0025082829999405476,0.0 +74368,51.586986841000055,0.7510615860000485,0.0 +74369,51.58322771200005,0.7784123710000586,0.0 +74370,51.646269851000056,-1.3951006899999356,0.0 +74372,51.645385985000075,-1.8209041439999396,0.0 +74373,51.65929893200007,-1.686137672999962,0.0 +74374,51.635095034000074,-1.5200098489999618,0.0 +74375,51.60211628400003,0.23331811000002745,0.0 +74376,51.600390993000076,0.24954986700004156,0.0 +74377,51.61158515200003,-0.04446025799995823,0.0 +74378,51.604259898000066,-0.04257783799994286,0.0 +74379,51.63626480200003,-1.932274520999954,0.0 +74380,51.611629622000066,-0.27025996599996915,0.0 +74381,51.58074803800008,0.7657080680000377,0.0 +74386,51.60268763900007,-0.03390795099994648,0.0 +74387,51.623321109000074,-0.7372546669999451,0.0 +74388,51.62002171700004,-0.7188561399999571,0.0 +74391,51.59939302200007,0.5142857210000216,0.0 +74392,51.63510118200003,-1.2250356209999609,0.0 +74393,51.60834455100007,-0.06309634899997718,0.0 +74394,51.58627923800003,0.6948015020000753,0.0 +74395,51.64743750200006,-2.1441493269999796,0.0 +74396,51.63529106100003,-1.9246646419999252,0.0 +74397,51.63199417700008,-1.4905226439999524,0.0 +74398,51.64405895500005,-2.176402358999951,0.0 +74399,51.63063442100008,-1.6559524799999394,0.0 +74401,51.64495483200005,-2.424134558999981,0.0 +74409,51.59362230800008,0.42823011400002997,0.0 +74410,51.607099721000054,-0.2918164659999434,0.0 +74411,51.592039182000065,0.5535846140000444,0.0 +74412,51.578586536000046,0.6745479840000712,0.0 +74413,51.62768960000005,-1.1327849869999795,0.0 +74414,51.63534922900004,-1.1186912599999346,0.0 +74415,51.63270163400006,-1.94364354399994,0.0 +74416,51.57655645300008,0.7596321520000515,0.0 +74417,51.57675857900006,0.710821175000035,0.0 +74418,51.57784305100006,0.7385499970000637,0.0 +74419,51.62277814600003,-0.8886973209999383,0.0 +74420,51.61365331700006,-0.8768925569999624,0.0 +74421,51.63951126200004,-1.7721944759999246,0.0 +74422,51.599235745000044,-0.25215826099997685,0.0 +74425,51.63549955500008,-1.3676845209999442,0.0 +74426,51.57213891100008,0.7143719380000562,0.0 +74427,51.577509758000076,0.8023719230000665,0.0 +74431,51.600746755000046,-0.26159986199996865,0.0 +74432,51.64082231800006,-2.450164660999974,0.0 +74433,51.63332522500008,-2.382316858999957,0.0 +74434,51.635010056000056,-2.3491753429999562,0.0 +74436,51.60584110900004,-0.5077835289999371,0.0 +74437,51.613490805000026,-0.5016069179999363,0.0 +74439,51.628415827000026,-2.169891934999953,0.0 +74440,51.62418288500004,-2.1517761559999258,0.0 +74441,51.62940883500005,-2.1524451019999447,0.0 +74443,51.62398857200003,-0.9116363239999714,0.0 +74444,51.60998615800003,-0.879377993999924,0.0 +74445,51.58419339500006,0.4575656490000597,0.0 +74446,51.60490030100004,0.16084792900005596,0.0 +74447,51.583928409000066,0.17405962900005534,0.0 +74448,51.61920172400005,-1.2322256569999581,0.0 +74449,51.59723174100003,-0.0805953129999466,0.0 +74453,51.620096087000036,-1.2625255619999507,0.0 +74454,51.58146272000005,0.8372805590000212,0.0 +74456,51.59443220300005,-0.04609465599997975,0.0 +74457,51.59544909200008,-0.043268726999940554,0.0 +74458,51.584006223000074,0.1099032860000193,0.0 +74459,51.59098931900007,0.11014089600007537,0.0 +74462,51.62488429900003,-1.5342446309999787,0.0 +74465,51.625112897000065,-1.6677307529999439,0.0 +74466,51.568477288000054,0.6744060020000688,0.0 +74467,51.61720900900008,-1.082270813999969,0.0 +74468,51.60770390400006,-1.114632032999964,0.0 +74469,51.629621959000076,-2.0058623449999686,0.0 +74470,51.62290666400003,-2.355772068999954,0.0 +74471,51.62785637500008,-2.3083765599999424,0.0 +74472,51.619029271000045,-1.5063160899999275,0.0 +74473,51.607918949000066,-0.7011639729999501,0.0 +74474,51.60429409800008,-0.677286808999952,0.0 +74476,51.623422367000046,-1.4449882029999799,0.0 +74478,51.60166920200004,-0.20350128199993378,0.0 +74480,51.58707341100006,-0.19590443399994228,0.0 +74482,51.61160959400007,-1.5632170949999704,0.0 +74483,51.60735520900005,-1.4613303109999265,0.0 +74484,51.61236166500004,-1.5720596529999398,0.0 +74485,51.60715746400007,-1.458611140999949,0.0 +74488,51.60962546600007,-1.118705039999952,0.0 +74489,51.60382753600004,-1.116106325999965,0.0 +74490,51.60025084600005,-1.1160243909999394,0.0 +74491,51.600283528000034,-1.1140009119999377,0.0 +74495,51.600008728000034,-0.9445513709999318,0.0 +74496,51.59882856200005,-0.9382687569999462,0.0 +74497,51.613162601000056,-2.225623834999965,0.0 +74503,51.59070517600003,-0.3818746119999332,0.0 +74504,51.58606182900007,-0.36800940399996307,0.0 +74505,51.60922517500006,-2.2412627899999507,0.0 +74509,51.60534458200004,-1.5267896249999353,0.0 +74510,51.62703531000005,-1.3383236999999326,0.0 +74515,51.57819839600006,-0.06037744199994677,0.0 +74516,51.577800022000076,-0.0467138209999689,0.0 +74518,51.60430893700004,-1.5056790469999441,0.0 +74519,51.554430221000075,0.677940703000047,0.0 +74520,51.61795280500007,-1.941725255999927,0.0 +74521,51.61001095700004,-2.188406888999964,0.0 +74522,51.58471392800004,-0.2451098799999727,0.0 +74523,51.58841038200006,-0.43482196199994405,0.0 +74524,51.57958154200003,-0.4299958939999442,0.0 +74525,51.576287096000044,-0.2244132329999502,0.0 +74526,51.601364111000066,-1.591536840999936,0.0 +74527,51.58886337800004,-0.49294099799993774,0.0 +74528,51.57882753600006,-0.47521310499996616,0.0 +74530,51.61613544900007,-1.8365645769999333,0.0 +74531,51.603003717000036,-1.6117839779999485,0.0 +74532,51.58880354400003,-1.218331664999937,0.0 +74534,51.589817045000075,-1.236693627999955,0.0 +74537,51.608795857000075,-2.325968719999935,0.0 +74538,51.59241754100003,-1.3661492589999398,0.0 +74539,51.62116018800003,-0.6292906749999361,0.0 +74540,51.59518904400005,-1.8211091009999336,0.0 +74541,51.596644008000055,-2.126848718999952,0.0 +74542,51.61254416300005,-2.130401350999932,0.0 +74543,51.568922963000034,-0.2927672249999773,0.0 +74544,51.58169184500008,-0.30082493099996555,0.0 +74547,51.56383408100004,-0.03365834199996698,0.0 +74548,51.560904623000056,-0.020851330999960282,0.0 +74549,51.57733638700006,-0.6136706569999433,0.0 +74550,51.58833053200004,-1.387926992999951,0.0 +74552,51.58676830600007,-0.7711043779999613,0.0 +74553,51.58420245900004,-0.7472162599999592,0.0 +74554,51.57853189200006,-0.7204972459999794,0.0 +74555,51.59950321600007,-1.6800617069999362,0.0 +74556,51.57621853900008,-0.7464016589999574,0.0 +74557,51.57564203100003,-0.7292661179999413,0.0 +74558,51.594259736000026,-1.1622047259999704,0.0 +74559,51.55984814100003,-0.019910769999967215,0.0 +74561,51.59153535100006,-1.6499082969999677,0.0 +74562,51.624042985000074,-2.062145062999946,0.0 +74563,51.554377600000066,0.30272423400003845,0.0 +74564,51.55500591500004,0.3135511150000525,0.0 +74567,51.59190202800005,-1.326747753999939,0.0 +74571,51.59228907800008,-2.071795546999965,0.0 +74572,51.581324143000074,-1.131153951999977,0.0 +74573,51.59044069400005,-1.1219871439999451,0.0 +74574,51.58890556000006,-1.6686406069999293,0.0 +74576,51.567421112000034,0.18159027800004424,0.0 +74577,51.56621745000007,0.20710634700003538,0.0 +74578,51.55728037800003,-0.016114341999980297,0.0 +74579,51.55918173100008,-0.009880642999974043,0.0 +74580,51.57381427300004,-0.7569500089999792,0.0 +74581,51.589592682000045,-1.6389584899999363,0.0 +74582,51.58006699900005,-0.7913276439999777,0.0 +74583,51.58528652000007,-1.6758449679999785,0.0 +74584,51.59742119900005,-2.034633104999955,0.0 +74585,51.56234976600007,-0.2779723669999612,0.0 +74586,51.56638250700007,-0.2556673479999745,0.0 +74587,51.588141707000034,-1.7077048239999613,0.0 +74591,51.589608293000026,-2.062075522999976,0.0 +74592,51.58658688400004,-2.0571027159999744,0.0 +74593,51.58200255300005,-1.2249726589999455,0.0 +74594,51.58248829200005,-1.6805020159999344,0.0 +74597,51.57925803200004,-1.1509231999999656,0.0 +74599,51.588499985000055,-1.8334058909999271,0.0 +74601,51.58484700000008,-2.064501203999953,0.0 +74603,51.58465969900004,-2.183790530999943,0.0 +74604,51.58359196100008,-1.1916022949999387,0.0 +74605,51.57260903100007,-1.164986451999937,0.0 +74606,51.58212699500007,-0.9396087689999604,0.0 +74607,51.609201572000075,-0.548149187999968,0.0 +74608,51.56796816600007,-0.4786153969999418,0.0 +74610,51.53343162300007,0.6089892470000677,0.0 +74611,51.60267259500006,-1.4294058019999625,0.0 +74612,51.588919633000046,-2.1050195969999663,0.0 +74613,51.58239241700005,-2.059214026999939,0.0 +74614,51.56732388900008,-0.936389366999947,0.0 +74615,51.56911413900008,-0.7146093339999311,0.0 +74616,51.580421811000065,-0.6947076199999742,0.0 +74617,51.52769411500003,0.7402444750000541,0.0 +74618,51.577756194000074,-0.9569707839999637,0.0 +74619,51.56617743500004,-0.9342513719999488,0.0 +74620,51.59745950400003,-2.450537504999943,0.0 +74622,51.581364026000074,-2.092345699999953,0.0 +74623,51.578161942000065,-1.2556483879999405,0.0 +74624,51.53929067200005,0.5369756940000343,0.0 +74625,51.536739098000055,0.5545682590000638,0.0 +74626,51.58004608600004,-2.098544148999963,0.0 +74627,51.61033607200005,-1.8779701939999427,0.0 +74628,51.578651293000064,-1.8208909619999645,0.0 +74629,51.579377358000045,-1.3775683049999543,0.0 +74630,51.56085369200008,-0.7120972759999518,0.0 +74631,51.57637770400004,-1.7987020379999308,0.0 +74632,51.57011532100006,-1.1781369449999488,0.0 +74633,51.555286685000056,-0.06365137399996001,0.0 +74636,51.55876357100004,-0.7155207159999577,0.0 +74637,51.582320210000034,-2.162148780999928,0.0 +74638,51.57717113600006,-1.689348827999936,0.0 +74639,51.579324642000074,-2.0835950319999483,0.0 +74640,51.579635633000066,-2.0745673829999305,0.0 +74641,51.58434534600008,0.05208945300006462,0.0 +74642,51.54566969800004,0.08236297700005935,0.0 +74643,51.55388375500007,-0.2661564569999655,0.0 +74644,51.551619713000036,-0.2553238609999653,0.0 +74645,51.57683670000006,-2.1476145749999773,0.0 +74646,51.58160159300007,-2.1166165999999293,0.0 +74647,51.575815273000046,-1.8329460719999702,0.0 +74648,51.58044563000004,-1.0835737079999603,0.0 +74649,51.56142842500003,-0.449101207999945,0.0 +74650,51.564032412000074,-0.40727853399994274,0.0 +74653,51.57537429900003,-2.1392538519999675,0.0 +74654,51.603916706000064,-2.384959955999932,0.0 +74656,51.570516723000026,-1.1285271149999403,0.0 +74657,51.56258584700004,-1.1193678719999411,0.0 +74658,51.53281542000008,0.49809232400002657,0.0 +74659,51.52843085900008,0.5302072450000423,0.0 +74660,51.54707823100006,-0.00916849199995795,0.0 +74661,51.54101069300003,-0.007493057999965913,0.0 +74662,51.539012901000035,0.32162280700003976,0.0 +74663,51.55165867300008,0.3268515340000704,0.0 +74664,51.561553986000035,-1.0966893949999417,0.0 +74665,51.55504403200007,-0.7802415759999803,0.0 +74666,51.56325402400006,-0.7704459979999569,0.0 +74667,51.58169293700007,-0.8730938059999289,0.0 +74669,51.56674583600005,-1.161994490999973,0.0 +74670,51.56256178000007,0.2353130170000668,0.0 +74671,51.54601686400008,-0.27888811899993016,0.0 +74672,51.545487207000065,-0.2726476869999601,0.0 +74673,51.579333965000046,-2.2404318479999574,0.0 +74674,51.56975495300003,-1.7470307239999556,0.0 +74675,51.572102295000036,-1.7185087149999276,0.0 +74676,51.55397360500007,-0.7793661799999541,0.0 +74677,51.57282438900006,-1.6750478269999576,0.0 +74679,51.57341801600006,-1.6837033829999655,0.0 +74680,51.53115588000003,0.22525902300003509,0.0 +74684,51.57037891900006,-2.2161137839999583,0.0 +74685,51.57677355900006,-2.1964661529999603,0.0 +74686,51.54694110500003,0.35713334400003305,0.0 +74687,51.52678779300004,0.3619656540000733,0.0 +74688,51.54734865300003,-0.4238611779999246,0.0 +74689,51.55025037900003,-0.4027509379999401,0.0 +74690,51.55479825300006,-0.8959411219999538,0.0 +74691,51.55527328100004,-0.8821302279999372,0.0 +74693,51.547039881000046,0.16054706500005977,0.0 +74694,51.539455512000075,0.17739785000003394,0.0 +74695,51.55910663100008,-0.5360926459999291,0.0 +74696,51.55221964700007,-0.4865575099999546,0.0 +74700,51.554172175000076,-1.0067375719999632,0.0 +74701,51.556880086000035,-1.0001690149999263,0.0 +74706,51.54996674000006,-0.7830124019999403,0.0 +74707,51.51917761100003,0.5239223140000604,0.0 +74710,51.56905851500005,-2.2484587439999473,0.0 +74711,51.57333209400008,-2.006120492999969,0.0 +74712,51.52568461100003,0.1679967650000549,0.0 +74713,51.54599592900007,-0.6457354849999319,0.0 +74716,51.55109661000006,-0.8570607009999662,0.0 +74717,51.556878064000045,-0.8301450919999525,0.0 +74718,51.54333725100008,-0.6528665179999393,0.0 +74719,51.54939106000006,-0.8947894179999594,0.0 +74720,51.52662997900006,0.140387904000022,0.0 +74721,51.540960373000075,0.34009942800003046,0.0 +74722,51.52058893700007,0.34318694600005983,0.0 +74723,51.567152186000044,-2.0775533449999557,0.0 +74724,51.522797972000035,0.1505070450000403,0.0 +74728,51.524031695000076,0.18725467200005141,0.0 +74729,51.54446837900008,-0.8363623659999462,0.0 +74730,51.55066164600004,-0.8059194319999392,0.0 +74732,51.56839759200005,-2.1466633789999605,0.0 +74733,51.52105083400005,0.41925141300004043,0.0 +74734,51.52093692900007,0.427949667000064,0.0 +74736,51.54484546900005,-0.8991152109999803,0.0 +74738,51.55193825500004,-0.9205555249999406,0.0 +74739,51.53085796600004,-0.0006506389999572093,0.0 +74741,51.52730588000003,0.07521393000007492,0.0 +74742,51.55273693100003,0.10749354700004687,0.0 +74745,51.51976223400004,0.13409344700005477,0.0 +74746,51.52054262000007,0.3272828370000411,0.0 +74747,51.514252095000074,0.3320584210000561,0.0 +74748,51.56440231100004,-1.813360472999932,0.0 +74750,51.547571306000066,-1.1501887749999469,0.0 +74751,51.553055474000075,-1.1402826879999566,0.0 +74752,51.53974831700003,-0.8341734809999366,0.0 +74753,51.50734287900008,0.46494744100004937,0.0 +74755,51.51437457600008,0.10037094000006164,0.0 +74756,51.51618425400005,0.12465656500006617,0.0 +74757,51.530375082000035,-0.07457004799994138,0.0 +74760,51.55689658700004,-2.103246191999972,0.0 +74763,51.554569178000065,-2.0621317619999786,0.0 +74764,51.538552467000045,-0.9313477319999492,0.0 +74768,51.53894661800007,-0.8957555959999581,0.0 +74769,51.51130414100004,0.11081147400005875,0.0 +74770,51.554351530000076,-2.2589742619999242,0.0 +74771,51.55967382400007,-2.228432482999949,0.0 +74772,51.54726800800006,-2.242513474999953,0.0 +74773,51.51179979800003,0.15022771700006388,0.0 +74774,51.53892756000005,-1.140466015999948,0.0 +74775,51.50403854800004,0.43686903500002927,0.0 +74777,51.55152693500003,-2.2736305049999714,0.0 +74779,51.545725411000035,-2.2543728239999723,0.0 +74780,51.542476445000034,-0.7164492059999361,0.0 +74781,51.52894596400006,-0.7115050449999671,0.0 +74782,51.54292417500005,-1.9410653939999634,0.0 +74786,51.527913151000064,-0.34681540599996197,0.0 +74787,51.53134846000006,-0.31561810199997353,0.0 +74788,51.54679854300008,-2.048532140999953,0.0 +74789,51.55161133800004,-1.9965634329999489,0.0 +74790,51.55564308700008,-1.7113861629999292,0.0 +74791,51.53031357800006,-0.4903658379999456,0.0 +74792,51.519325844000036,-0.4747607929999731,0.0 +74795,51.54222450300006,-1.8311541269999339,0.0 +74800,51.50456113600006,0.1550784130000693,0.0 +74801,51.53254489100004,-1.1542218149999712,0.0 +74802,51.53078596700004,-1.1404740789999437,0.0 +74803,51.543670527000074,-1.1218133669999588,0.0 +74805,51.53107752400007,-1.4255074639999634,0.0 +74806,51.53403063600007,-1.4229689919999373,0.0 +74807,51.542375769000046,-2.2724835969999617,0.0 +74813,51.54367262100004,-1.7933905959999379,0.0 +74815,51.506516960000056,-0.08908348899996099,0.0 +74816,51.508679897000036,0.041671895000035875,0.0 +74817,51.50571518100003,0.08848191500004532,0.0 +74821,51.49958467400006,0.02786524000003965,0.0 +74822,51.513306784000065,-0.6761554929999534,0.0 +74823,51.50837061500005,-0.14915040299996463,0.0 +74824,51.53033660700004,-0.9727004309999643,0.0 +74825,51.52262435200004,-0.9089138079999657,0.0 +74826,51.51657806900005,-0.6995585679999294,0.0 +74829,51.532125929000074,-1.5939975229999277,0.0 +74830,51.52375108000007,-0.8849981939999338,0.0 +74833,51.51424343600007,-0.8814356349999457,0.0 +74835,51.51413020000007,-0.8807635989999767,0.0 +74836,51.48803882000004,0.4123774010000716,0.0 +74838,51.536105690000056,-1.9189885309999681,0.0 +74839,51.528972699000064,-1.8844358099999567,0.0 +74842,51.51179118500005,0.23162286900003437,0.0 +74843,51.49636419300003,0.27525369500006036,0.0 +74844,51.53416243600003,-2.2612635969999246,0.0 +74845,51.536869231000026,-1.5592560189999745,0.0 +74847,51.492138546000035,0.18874863600007075,0.0 +74848,51.48670447500007,0.22192697400004135,0.0 +74849,51.50791507200006,-0.3448458239999468,0.0 +74850,51.53694050400003,-1.2547073419999606,0.0 +74851,51.54461651100007,-1.7391031599999565,0.0 +74856,51.50027823000005,-0.24805548899996666,0.0 +74857,51.50548528100006,-0.23319525299996258,0.0 +74858,51.49915173000005,0.10331691100003582,0.0 +74859,51.52170468200006,-1.5663547699999754,0.0 +74860,51.49899943200006,-0.34465087899997116,0.0 +74861,51.48400744800006,0.22396747500005176,0.0 +74862,51.48504890600003,0.22411711400002332,0.0 +74863,51.53270449000007,-1.3019542289999322,0.0 +74864,51.53229934700005,-2.0441914509999606,0.0 +74865,51.492822981000074,0.00046801900003856645,0.0 +74866,51.49701063600003,-0.06018047299994578,0.0 +74870,51.49148736600006,-0.06717123399994307,0.0 +74871,51.51812050900003,-1.137129922999975,0.0 +74872,51.494799131000036,-0.23281241799998043,0.0 +74873,51.513406563000046,-0.20815256199995247,0.0 +74874,51.52945425300004,-2.0215903229999412,0.0 +74875,51.507803858000045,-0.4852913689999241,0.0 +74876,51.50131802800007,-0.4783048389999749,0.0 +74879,51.46985041000005,0.6885324110000397,0.0 +74880,51.52119729900005,-1.5945035059999668,0.0 +74882,51.518860440000026,-0.6351400679999415,0.0 +74883,51.49708246200004,-0.031889649999925496,0.0 +74884,51.49078971200004,-0.0027147129999320896,0.0 +74886,51.48227656500006,0.21551188500006901,0.0 +74887,51.50240473300005,-0.7529497649999257,0.0 +74888,51.51127575800007,-0.7404082299999573,0.0 +74889,51.500898333000066,-0.7371811369999364,0.0 +74890,51.505554869000036,-0.6726639279999631,0.0 +74891,51.498813932000076,-0.6088198939999643,0.0 +74892,51.519131669000046,-0.6069229729999392,0.0 +74893,51.50892536600003,-1.1318540049999797,0.0 +74894,51.516282567000076,-0.9725212819999456,0.0 +74895,51.49141601200006,-0.23131481999996595,0.0 +74896,51.477352633000066,0.5461779270000306,0.0 +74899,51.489274359000035,-0.23941524699995398,0.0 +74900,51.53287193700004,-2.1184084279999524,0.0 +74901,51.498383783000065,-0.6132745599999794,0.0 +74902,51.49637659200005,-0.6168955959999494,0.0 +74905,51.525069518000066,-2.2176856699999803,0.0 +74907,51.51746800400008,-2.1841439309999373,0.0 +74910,51.493799211000066,-0.12565218199995343,0.0 +74911,51.49884280900005,-0.7340854869999589,0.0 +74912,51.49684922000006,-0.7347106879999501,0.0 +74913,51.47799204300003,0.2346563140000626,0.0 +74915,51.49823566300006,-0.7031894709999733,0.0 +74916,51.46700115900006,0.47244112200002064,0.0 +74920,51.49688514600007,-0.6709063519999745,0.0 +74921,51.46617574100003,0.536672028000055,0.0 +74922,51.51406477300003,-1.4420356639999454,0.0 +74923,51.518740440000045,-1.4257643409999332,0.0 +74925,51.51504562900004,-1.5374332789999698,0.0 +74926,51.49363863100007,-0.32938608499995325,0.0 +74927,51.48773758300007,-0.31821200599995336,0.0 +74928,51.50760573800005,-1.5284127979999766,0.0 +74929,51.531687745000056,-1.5278619769999295,0.0 +74930,51.50936432800006,-0.5734418569999775,0.0 +74931,51.50291387500005,-0.5607092349999334,0.0 +74932,51.473537829000065,0.23553762600005257,0.0 +74934,51.492334087000074,-0.6594309489999546,0.0 +74935,51.494316206000065,-0.6345651719999523,0.0 +74936,51.48405266300006,-0.05419292999994241,0.0 +74937,51.47366003800005,0.20221871600006125,0.0 +74940,51.516944384000055,-2.0673926459999734,0.0 +74941,51.487045237000075,-0.42400565799994183,0.0 +74942,51.51245073600006,-0.4060621909999327,0.0 +74943,51.50336290800004,-0.8846754519999536,0.0 +74944,51.51702472800008,-1.8868003229999317,0.0 +74945,51.49515494700006,-0.759729024999956,0.0 +74946,51.48981842200004,-0.5070229079999535,0.0 +74947,51.48408739300004,-0.31375306299997874,0.0 +74948,51.48519520100007,-0.29192776899992623,0.0 +74949,51.46958736100004,0.2507186360000446,0.0 +74950,51.46925820800004,0.25865590900002644,0.0 +74952,51.48870502700004,-0.4926813529999663,0.0 +74953,51.46616529000005,0.3923068360000457,0.0 +74954,51.48155468200008,-0.14171168799992984,0.0 +74956,51.480478927000036,-0.26067106099992543,0.0 +74957,51.47267288200004,0.2102612720000252,0.0 +74958,51.50326444700005,-1.4278905419999433,0.0 +74959,51.50019780500003,-1.4242708169999787,0.0 +74960,51.507727086000045,-1.2431122729999515,0.0 +74961,51.48201299600004,-0.2789344729999357,0.0 +74962,51.50320415500005,-1.5436553629999707,0.0 +74963,51.47525558600006,-0.14643955199994707,0.0 +74967,51.46360538400006,0.5220652830000745,0.0 +74969,51.478592691000074,-0.23515260699997498,0.0 +74970,51.48186618600005,-0.22735059899997623,0.0 +74971,51.461938614000076,0.27728501800004324,0.0 +74973,51.48741914800007,-0.6615795309999726,0.0 +74974,51.473721596000075,-0.22444857499993986,0.0 +74975,51.48153554100003,-0.2180614439999431,0.0 +74976,51.494878491000065,-1.2573116109999773,0.0 +74981,51.47654350300007,-0.01681516099995406,0.0 +74983,51.50078633800007,-1.0121296969999776,0.0 +74984,51.50428087000006,-0.9857095689999369,0.0 +74985,51.452278281000076,0.6343563450000715,0.0 +74986,51.44959885500003,0.651159276000044,0.0 +74987,51.496575120000045,-1.1066274889999477,0.0 +74991,51.48776963300003,-1.0611466149999274,0.0 +74992,51.49060100100007,-1.0356231789999697,0.0 +74993,51.503898510000056,-2.1081710439999597,0.0 +74994,51.47564990200004,-0.3106456219999245,0.0 +74996,51.48792991300007,-0.5462698629999636,0.0 +74997,51.48104113800008,-0.5233975529999384,0.0 +74998,51.43942194700003,0.7858021330000611,0.0 +74999,51.49760697200003,-1.9488255039999558,0.0 +75000,51.48161817100004,-0.5659974999999804,0.0 +75001,51.493954804000055,-1.9460995099999536,0.0 +75002,51.49648162900007,-1.7243071899999336,0.0 +75004,51.48619557100005,-0.9088121209999258,0.0 +75007,51.47970502800007,-0.9269752109999558,0.0 +75008,51.456177524000054,0.34075093000006973,0.0 +75009,51.49807248800005,-1.7473802259999616,0.0 +75011,51.466806252000026,-0.20855055699996683,0.0 +75012,51.47776984600006,-0.16653832899993404,0.0 +75014,51.442269605000035,0.653299812000057,0.0 +75015,51.447899678000056,0.3885270940000396,0.0 +75016,51.49513005400007,-1.5023422649999247,0.0 +75017,51.51194591900003,-1.4777396389999353,0.0 +75018,51.43638425900008,0.7808154040000659,0.0 +75019,51.49057962100005,-1.2380976879999253,0.0 +75022,51.474903717000075,-0.8440030119999733,0.0 +75023,51.47637857700005,-0.8398908239999514,0.0 +75024,51.45529443300006,0.026953686000069865,0.0 +75027,51.484100958000056,-0.908816336999962,0.0 +75028,51.49278636500003,-1.6448086299999432,0.0 +75029,51.463701581000066,-0.3295823889999383,0.0 +75030,51.46576293500004,-0.3201796959999683,0.0 +75031,51.47349278300004,-0.8462783219999324,0.0 +75032,51.45960498900007,-0.006023564999964037,0.0 +75033,51.45628800800006,0.014911180000069635,0.0 +75034,51.45141188800005,0.46628301600003397,0.0 +75036,51.43365521800007,0.7854113440000674,0.0 +75037,51.45237062500007,0.31090478900006246,0.0 +75038,51.485092931000054,-0.7009049969999523,0.0 +75040,51.471509870000034,-0.6079275249999796,0.0 +75041,51.49404167400007,-2.060840622999933,0.0 +75042,51.45232999400008,0.004590044000053695,0.0 +75043,51.48334456100008,-1.6399839379999435,0.0 +75044,51.490889981000066,-0.8789004469999782,0.0 +75045,51.48260063200007,-0.5919717799999376,0.0 +75046,51.49839550100006,-2.0665154459999258,0.0 +75047,51.485893900000065,-2.069786798999928,0.0 +75048,51.46497487800008,-0.5856658229999425,0.0 +75049,51.46910065000003,-0.5699396109999384,0.0 +75050,51.469764819000034,-0.8711041319999708,0.0 +75051,51.46550552300005,-0.5938014089999797,0.0 +75052,51.44285142500007,0.424788263000039,0.0 +75054,51.438288070000056,0.4297167520000471,0.0 +75056,51.47974551500005,-1.0811681709999448,0.0 +75057,51.453301801000066,0.1876669420000212,0.0 +75058,51.48616687100008,-2.0437075609999624,0.0 +75059,51.47717163900006,-1.0265323079999575,0.0 +75060,51.48122032600003,-1.6282063189999576,0.0 +75061,51.47910675000003,-1.6200958559999776,0.0 +75062,51.49935220300006,-1.6293842369999538,0.0 +75063,51.45265618600007,0.2791352450000204,0.0 +75064,51.48753996700003,-1.9669593009999744,0.0 +75065,51.471363575000055,-1.089417032999961,0.0 +75066,51.46696164300005,-0.2520054379999692,0.0 +75067,51.45190927800007,0.12159238400005279,0.0 +75068,51.44637811300004,0.1451932730000749,0.0 +75070,51.47077647700007,-1.02227195699993,0.0 +75071,51.47878717000003,-1.2488951689999794,0.0 +75072,51.46783156500004,-0.8583159349999505,0.0 +75073,51.45340014400006,-0.2595293599999309,0.0 +75077,51.46568668200007,-0.5494631839999329,0.0 +75078,51.46643850300006,-0.5417797319999522,0.0 +75079,51.444512950000046,0.08817936100007273,0.0 +75080,51.479493053000056,-1.4602458179999758,0.0 +75081,51.48630520900008,-1.437701112999946,0.0 +75082,51.49061853200004,-1.3606488599999693,0.0 +75083,51.478796491000026,-1.3382763509999336,0.0 +75084,51.45961498200006,-0.3097756839999306,0.0 +75085,51.43608498800006,0.42467246800003977,0.0 +75089,51.47471036400003,-0.9765412169999763,0.0 +75090,51.462998723000055,-0.16073549199995796,0.0 +75091,51.46622373100007,-0.9937832739999521,0.0 +75092,51.45693231900003,-0.5418412649999595,0.0 +75093,51.47588788500008,-1.627836608999928,0.0 +75094,51.43393778600006,0.5877084530000616,0.0 +75096,51.45575313300003,-0.3613974679999501,0.0 +75097,51.44181234900003,0.11682771800002456,0.0 +75098,51.47783071500004,-1.9680744379999737,0.0 +75099,51.469765204000055,-0.9440341199999693,0.0 +75100,51.46803095700005,-1.0813454329999672,0.0 +75101,51.44184699500005,0.09397407100004784,0.0 +75102,51.450736637000034,0.21710757900007138,0.0 +75104,51.452801399000066,-0.32893540399993526,0.0 +75105,51.45416094400008,-0.5551632429999245,0.0 +75106,51.45292152500008,-0.02007192799993618,0.0 +75107,51.46121032900004,-0.9662949539999772,0.0 +75110,51.43543247500003,0.3251622120000661,0.0 +75116,51.47196648400006,-1.6116552599999636,0.0 +75117,51.46726803200005,-1.599912212999925,0.0 +75118,51.431517245000066,0.22320634700002984,0.0 +75121,51.46717339300005,-0.09465202599994882,0.0 +75122,51.44766783700004,-0.5341082749999373,0.0 +75123,51.45196286800007,-0.5363170199999558,0.0 +75125,51.46829422700006,-1.8594457389999661,0.0 +75126,51.481034786000066,-1.8367091879999293,0.0 +75127,51.43176679600003,0.21028466300003856,0.0 +75131,51.44715000300005,-0.5320829129999538,0.0 +75132,51.44932200000005,-0.529667763999953,0.0 +75133,51.44769871800003,-0.25392259199992395,0.0 +75134,51.43546907900003,0.3900128490000725,0.0 +75136,51.446105138000064,-0.35054813699997567,0.0 +75137,51.47594720200004,-1.1588969289999795,0.0 +75138,51.458513466000056,-1.0898248569999396,0.0 +75139,51.45713299600004,-1.1101795099999663,0.0 +75143,51.40684674200003,0.9128654160000451,0.0 +75144,51.417021530000056,0.5795340340000621,0.0 +75145,51.47472233900004,-2.0789232119999497,0.0 +75146,51.42708778100007,0.23153279600006726,0.0 +75149,51.45889392400005,-0.8722614859999567,0.0 +75150,51.423828815000036,0.3244329910000374,0.0 +75151,51.44819396500003,-0.880355169999973,0.0 +75153,51.447464241000034,-0.8572189639999692,0.0 +75155,51.45641656000004,-0.8705790109999612,0.0 +75156,51.43373087700007,0.13877440900006377,0.0 +75159,51.454001908000066,-0.9654437059999736,0.0 +75163,51.46377906200007,-2.1275658279999448,0.0 +75167,51.45997175300005,-2.1045190869999715,0.0 +75168,51.458799947000045,-1.594626542999947,0.0 +75169,51.45445502100006,-1.5774192509999807,0.0 +75170,51.453899351000075,-1.0742668769999568,0.0 +75171,51.43824789200005,-0.7193790199999626,0.0 +75172,51.439412523000044,-0.696192936999978,0.0 +75174,51.43979546300005,-0.320772993999924,0.0 +75175,51.44223206500004,-1.0754744449999407,0.0 +75178,51.457774639000036,-1.415219939999929,0.0 +75179,51.46387488500005,-1.3816240949999496,0.0 +75180,51.44238788500007,-0.9823402449999321,0.0 +75181,51.44661692100004,-1.1720470369999703,0.0 +75182,51.448904465000055,-1.14036058399995,0.0 +75183,51.44327673600003,-0.1904728229999364,0.0 +75184,51.42800037400008,-0.03129801399995813,0.0 +75185,51.43322790000008,-0.6864756909999414,0.0 +75186,51.40758757200007,0.539771035000058,0.0 +75187,51.37762796000004,1.2326208540000607,0.0 +75188,51.41000677200003,0.4909506290000536,0.0 +75189,51.46636112200008,-2.007238005999966,0.0 +75190,51.44817694800008,-1.7728129959999706,0.0 +75191,51.45217592800003,-1.7650614959999302,0.0 +75192,51.45037381800006,-1.734177587999966,0.0 +75193,51.46743457900004,-1.7208474669999418,0.0 +75194,51.41583961200007,-0.04321437699996977,0.0 +75195,51.45121178100004,-2.0173399949999293,0.0 +75197,51.41449938100004,-0.03923303999994232,0.0 +75198,51.44868437900004,-2.1377993029999516,0.0 +75199,51.451680847000034,-2.1214506239999764,0.0 +75200,51.45472673300003,-2.0626649059999522,0.0 +75201,51.445644188000074,-2.0316698999999403,0.0 +75202,51.38941002000007,0.754013847000067,0.0 +75203,51.44543069300005,-1.5849052509999524,0.0 +75204,51.449288876000026,-1.212600790999943,0.0 +75205,51.45808258100004,-0.7890973029999486,0.0 +75206,51.43180217400004,-0.7530637179999644,0.0 +75208,51.42373801700006,0.35249162900004194,0.0 +75209,51.371762527000044,1.2145444200000384,0.0 +75210,51.37633467000006,1.2175736340000753,0.0 +75211,51.43442465900006,-0.9957503419999512,0.0 +75212,51.437269884000045,-0.8626853199999687,0.0 +75213,51.43036191200008,-1.0258617709999385,0.0 +75216,51.393216917000075,0.8054630640000369,0.0 +75218,51.41597279400003,0.26650798700006817,0.0 +75219,51.44988403700006,-0.4451707019999276,0.0 +75220,51.43905625000008,-0.4173061939999343,0.0 +75221,51.38373207700005,0.8163856500000293,0.0 +75222,51.43796725300007,-1.657479455999976,0.0 +75223,51.441632869000046,-1.6514194559999282,0.0 +75224,51.43266815000004,-0.3074205689999303,0.0 +75225,51.41675535600007,-0.16634793399992986,0.0 +75226,51.41300524600007,-0.13881515799994304,0.0 +75227,51.435954673000026,-0.9771726599999511,0.0 +75228,51.42557004300005,-0.8378560929999708,0.0 +75229,51.44063319500003,-1.73235314599998,0.0 +75232,51.39433842700004,0.5228135760000328,0.0 +75233,51.44516114400005,-1.9813738699999703,0.0 +75234,51.441336344000035,-2.0310866749999263,0.0 +75235,51.37367861900003,1.3653929760000665,0.0 +75236,51.407452920000026,-0.04033046399996465,0.0 +75237,51.43822493000005,-1.7499088679999772,0.0 +75238,51.42591138900008,0.03734075800002756,0.0 +75239,51.37835702700005,0.8803033290000712,0.0 +75240,51.44036347600007,-1.1230949229999396,0.0 +75241,51.43381652700003,-1.6429613909999716,0.0 +75242,51.43823818800007,-1.6123947329999737,0.0 +75243,51.36749601100007,1.2096757180000282,0.0 +75244,51.41809706600003,-0.6424175309999782,0.0 +75245,51.37549928300007,0.8909007840000527,0.0 +75246,51.435935587000074,-2.0156345699999747,0.0 +75247,51.44635227800006,-0.4877724519999447,0.0 +75248,51.36861357600003,1.2803645900000333,0.0 +75249,51.44004035700004,-2.129653444999974,0.0 +75250,51.43479507500007,-2.1091536069999393,0.0 +75251,51.36315180100007,1.2045742750000272,0.0 +75252,51.41153749000006,-0.3723722479999765,0.0 +75254,51.401425380000035,-0.040207226999939394,0.0 +75255,51.418987841000046,-0.005782167999939247,0.0 +75256,51.36839523100008,1.1249267180000402,0.0 +75259,51.419708953000054,-0.613454734999948,0.0 +75260,51.43315978500004,-0.8956314669999301,0.0 +75261,51.41339814200006,-0.6265669979999302,0.0 +75262,51.412036863000026,-0.6101215759999263,0.0 +75263,51.426565553000046,-0.5232042019999312,0.0 +75264,51.41060816000004,-0.4984360649999644,0.0 +75265,51.41187183400007,-0.43983643199993594,0.0 +75266,51.41253739200005,-0.43585744699993256,0.0 +75268,51.43395467400006,-2.0302309739999487,0.0 +75269,51.40995946000004,0.20054304100005993,0.0 +75270,51.44117822900006,-1.894273830999964,0.0 +75271,51.44790673000006,-1.8586830009999744,0.0 +75272,51.41228769200006,-0.5450445879999393,0.0 +75273,51.40606506100005,-0.2998298749999435,0.0 +75274,51.40800466600007,-0.2589126299999407,0.0 +75275,51.433779722000054,-1.9968190029999278,0.0 +75276,51.37744402100003,0.6726515290000634,0.0 +75277,51.44789371200005,-1.341641276999951,0.0 +75278,51.41063943800003,-0.6003305539999246,0.0 +75279,51.41347441600004,-0.5923505309999655,0.0 +75280,51.40903776600004,-0.5238907239999548,0.0 +75282,51.395313636000026,0.01695705400004499,0.0 +75284,51.429617919000066,-1.3727923469999723,0.0 +75285,51.401394964000076,-0.2800079019999657,0.0 +75286,51.427800604000026,-1.9913912809999488,0.0 +75287,51.42810343300005,-1.9803937109999765,0.0 +75289,51.40365489000004,-0.02632089199994425,0.0 +75292,51.40040621300005,-0.12608068699995556,0.0 +75293,51.37787234700005,0.6239491420000718,0.0 +75296,51.37562722400003,0.8048190670000395,0.0 +75297,51.43063435900007,-1.5459689779999621,0.0 +75298,51.40541383800007,-0.31471206099996607,0.0 +75299,51.39768046000006,-0.047953809999967234,0.0 +75301,51.42794217200003,-1.7235217009999246,0.0 +75302,51.425568482000074,-1.6748171819999698,0.0 +75303,51.371587195000075,0.7219161080000731,0.0 +75304,51.36401006500006,1.0939999540000258,0.0 +75305,51.42108708600006,-1.7146445759999551,0.0 +75306,51.37397598800004,0.8476667180000277,0.0 +75307,51.410525448000044,-0.6544901279999635,0.0 +75308,51.40299452200003,-0.42677149799993686,0.0 +75309,51.40540096700005,-0.38428153099994233,0.0 +75310,51.40082305200008,-0.3378408879999597,0.0 +75311,51.39673593800006,-0.32421831599992856,0.0 +75313,51.35619275700003,1.2052947350000522,0.0 +75314,51.41835910900005,-1.5180134459999408,0.0 +75315,51.42203426900005,-0.7320053559999451,0.0 +75316,51.403660168000044,-0.589533337999967,0.0 +75317,51.39919502300006,-0.24072426599997243,0.0 +75318,51.385680870000044,0.4967954040000677,0.0 +75319,51.379598541000064,0.5309290150000265,0.0 +75322,51.40609704700006,-0.47858324599997104,0.0 +75323,51.395776426000054,0.03434935300003872,0.0 +75325,51.414037517000054,-0.7671902569999247,0.0 +75326,51.40422751500006,-0.1769602429999395,0.0 +75327,51.400621416000035,0.23758336500003452,0.0 +75329,51.422946513000056,-1.8589609499999256,0.0 +75330,51.42121034400003,-1.7767635339999401,0.0 +75331,51.41753984400003,-1.7733350179999547,0.0 +75332,51.37289523700008,0.6617431680000436,0.0 +75333,51.41621715000008,-1.738484441999958,0.0 +75334,51.41479620000007,-1.336267497999927,0.0 +75335,51.432547584000076,-1.3196531409999466,0.0 +75337,51.41713648500007,-1.7546338329999571,0.0 +75338,51.37662820800006,0.4389606490000233,0.0 +75340,51.41767310400007,-1.728279319999956,0.0 +75341,51.424021227000026,-1.09481440899998,0.0 +75342,51.37540919800006,0.404376318000061,0.0 +75343,51.371854142000075,0.46566940900004283,0.0 +75345,51.36984406900007,0.5473752420000437,0.0 +75346,51.41732148300008,-1.7187224339999716,0.0 +75348,51.40028473400008,-0.5572802509999519,0.0 +75351,51.41914471700005,-1.979795979999949,0.0 +75352,51.36570354200006,0.6469255730000327,0.0 +75353,51.41196742000005,-0.8465226379999535,0.0 +75354,51.35135017300007,1.2159397790000526,0.0 +75356,51.422296636000056,-2.1572109119999254,0.0 +75357,51.42659145400006,-2.121589746999973,0.0 +75358,51.40822220700005,-1.3160157999999456,0.0 +75359,51.42267223700003,-1.3002131619999773,0.0 +75360,51.40071115300003,0.3428388100000461,0.0 +75361,51.36647029400007,0.5521118260000435,0.0 +75363,51.41305850900005,-1.4885814119999736,0.0 +75364,51.43634328500008,-1.488006931999962,0.0 +75365,51.38590254700006,0.027070232000028227,0.0 +75366,51.37334346200004,0.40624790100002883,0.0 +75368,51.36753986000008,0.5405494170000225,0.0 +75370,51.413788374000035,-1.8496529219999616,0.0 +75371,51.415969810000036,-1.0183147259999714,0.0 +75372,51.34925293900005,1.1882330510000543,0.0 +75375,51.40022145000006,0.13791687100007266,0.0 +75376,51.34595207900003,1.2125829160000308,0.0 +75379,51.41001416900008,-1.5905191699999364,0.0 +75380,51.40823212500004,-1.5620032849999461,0.0 +75381,51.41259380200006,-1.5424512839999807,0.0 +75382,51.415350946000046,-1.7840957359999265,0.0 +75384,51.36933617200003,0.397235007000063,0.0 +75385,51.395930029000056,-0.8069461439999372,0.0 +75386,51.40997340100006,-1.6263447879999262,0.0 +75387,51.39874824900005,-0.820417167999949,0.0 +75389,51.39475249900005,-0.48122645599994485,0.0 +75390,51.362781350000034,0.5546769680000239,0.0 +75391,51.389902309000036,-0.284764637999956,0.0 +75392,51.41781624400005,-1.9994965239999374,0.0 +75393,51.40788096400007,-1.4184462689999577,0.0 +75394,51.38862089100007,-0.5031019339999716,0.0 +75395,51.40635158500004,-0.9014402779999386,0.0 +75396,51.394708027000036,-0.8109539309999718,0.0 +75397,51.41008640900003,-2.010409281999955,0.0 +75398,51.36872176900005,0.4801886660000605,0.0 +75399,51.404313597000055,-1.3090558689999625,0.0 +75400,51.41145126100008,-1.8158826439999416,0.0 +75401,51.40526931100004,-1.4494875959999263,0.0 +75402,51.39230263600007,-0.3540523099999291,0.0 +75403,51.40193066100005,-1.1135328899999308,0.0 +75404,51.36127489900008,0.5630944630000272,0.0 +75405,51.382549321000056,0.28654631600005587,0.0 +75406,51.41198152100003,-1.7705569789999345,0.0 +75407,51.402747187000045,-1.323548844999948,0.0 +75408,51.39341275400005,-0.5921489979999706,0.0 +75409,51.372256976000074,0.2129221780000421,0.0 +75412,51.390133555000034,-0.4458945319999543,0.0 +75413,51.382411569000055,0.011610218000043915,0.0 +75414,51.38607132200008,-0.49367166199994017,0.0 +75416,51.40487071300004,-1.5627434599999788,0.0 +75417,51.35805492500003,0.7605350590000626,0.0 +75418,51.392836190000025,-0.8755635369999482,0.0 +75419,51.382810293000034,-0.14920683099995813,0.0 +75420,51.40706865200008,-2.0081698039999765,0.0 +75421,51.36816092600003,0.38060270400006857,0.0 +75422,51.40186587300008,-1.3697019369999452,0.0 +75423,51.39857408200004,-0.6318442269999309,0.0 +75424,51.381781981000074,-0.3925711789999582,0.0 +75425,51.40745281300008,-1.8457314169999677,0.0 +75426,51.36440619100006,0.2732519040000625,0.0 +75427,51.39848858000005,-1.272630645999925,0.0 +75428,51.40102101000008,-1.412272077999944,0.0 +75429,51.39893422400007,-1.289569098999948,0.0 +75430,51.39974260500003,-1.7061474829999383,0.0 +75431,51.40685719100003,-1.6712949899999785,0.0 +75432,51.37274573700006,-0.13466898799993032,0.0 +75433,51.35020335300004,0.8027330030000712,0.0 +75434,51.32410016100005,1.4099453900000753,0.0 +75437,51.390894865000064,-0.8867271879999521,0.0 +75438,51.34185119600005,0.9840997490000518,0.0 +75439,51.393383964000066,0.11011834500004625,0.0 +75442,51.40466384000007,-1.6249772119999761,0.0 +75443,51.34787401900007,0.743725381000047,0.0 +75444,51.40109922700003,-0.9368703849999633,0.0 +75445,51.38205798800004,-0.5067978799999651,0.0 +75448,51.326707621000025,1.2611811740000576,0.0 +75449,51.33051324100006,1.233126296000023,0.0 +75450,51.32655586300007,1.2594946030000642,0.0 +75451,51.326255057000026,1.259921949000045,0.0 +75452,51.32535652200005,1.2910843280000677,0.0 +75455,51.384789236000074,-0.26879894099994317,0.0 +75456,51.39756758800007,-1.7075811579999254,0.0 +75457,51.395357614000034,-1.132114066999975,0.0 +75458,51.324684862000026,1.2832433420000484,0.0 +75459,51.32509366800008,1.2683293390000472,0.0 +75460,51.403097374000026,-1.7978121129999636,0.0 +75461,51.35871210500005,0.19431014200006302,0.0 +75462,51.36377846600004,0.19814083500006063,0.0 +75463,51.32399402100003,1.2977519650000318,0.0 +75464,51.401106510000034,-1.641568240999959,0.0 +75465,51.38898540400004,-1.166649265999979,0.0 +75466,51.39202557600004,-1.2232066759999611,0.0 +75467,51.35805131300003,0.5401509540000689,0.0 +75468,51.38705412300004,-1.1571921779999457,0.0 +75469,51.39597541200004,-1.355388363999964,0.0 +75470,51.32826165900008,1.1612994350000463,0.0 +75471,51.33171186900006,1.2164511530000368,0.0 +75472,51.37984024900004,-0.47418752399994446,0.0 +75473,51.332315047000066,1.1919258740000487,0.0 +75474,51.389405432000046,-0.8285882789999732,0.0 +75477,51.35930375400005,0.28222151700003906,0.0 +75481,51.40458486800003,-2.141523362999976,0.0 +75482,51.40775690700008,-1.9059092899999541,0.0 +75483,51.33576015700004,0.9126704400000563,0.0 +75484,51.39345038100004,-2.176328807999937,0.0 +75485,51.39245545600005,-2.161900164999963,0.0 +75487,51.32101761800004,1.2903728820000424,0.0 +75488,51.38055233700004,-0.21255748599998014,0.0 +75489,51.36452544800005,-0.01611962399994127,0.0 +75490,51.36153187000008,-0.2479618709999727,0.0 +75492,51.39261760200003,-2.122582242999954,0.0 +75493,51.33616273500007,0.9582319450000227,0.0 +75494,51.35560802400005,0.45535649200002126,0.0 +75496,51.364470037000046,-0.2696593729999677,0.0 +75497,51.36032230500007,-0.2580348709999498,0.0 +75498,51.35762042400006,0.08958347100002584,0.0 +75499,51.35651248100004,0.20685071200006178,0.0 +75500,51.398839277000036,-1.4826102569999762,0.0 +75501,51.320623012000055,1.1031375870000488,0.0 +75502,51.31957842000003,1.1367696360000537,0.0 +75503,51.326724943000045,0.9063527690000228,0.0 +75506,51.33804709800006,0.45133978800004115,0.0 +75507,51.32213302400004,0.9623945990000493,0.0 +75509,51.39366188500003,-1.5816166919999546,0.0 +75512,51.37824264900007,-0.9724974969999494,0.0 +75513,51.34476355600003,0.12392216900002495,0.0 +75514,51.34544150800008,0.09766759300003969,0.0 +75516,51.376368797000055,-0.9517334609999466,0.0 +75517,51.371895368000025,0.31537782700002026,0.0 +75518,51.34303650000004,0.631902182000033,0.0 +75519,51.39509626600005,-1.5329337619999706,0.0 +75520,51.37556417900004,-0.338860183999941,0.0 +75521,51.36172208600004,-0.2881592319999413,0.0 +75522,51.34374739500004,0.7034198860000629,0.0 +75523,51.342962345000046,1.050847281000074,0.0 +75525,51.33745658300006,0.7598552980000477,0.0 +75526,51.31471085600003,1.1998651910000717,0.0 +75527,51.34216018700005,0.11061787500005948,0.0 +75528,51.35846982800007,0.23799078900003678,0.0 +75529,51.32206714300003,0.7357146380000472,0.0 +75530,51.37278443200006,-1.5412373899999352,0.0 +75531,51.380111431000046,-1.188813917999937,0.0 +75532,51.36309003800005,-0.4890171939999277,0.0 +75533,51.368408844000044,-0.16764097899994113,0.0 +75535,51.37516940800003,-1.590988399999958,0.0 +75538,51.36869900100004,-1.2543709229999536,0.0 +75539,51.366941937000036,-1.2187427709999383,0.0 +75540,51.36615712500003,-1.071324458999925,0.0 +75541,51.39509532000005,-1.0064889399999402,0.0 +75542,51.367587815000036,-1.2803456349999465,0.0 +75543,51.37097768600006,-1.3930907449999381,0.0 +75544,51.36638465900006,-1.0014959699999508,0.0 +75545,51.31328214800004,1.2528813050000736,0.0 +75548,51.366970243000026,-1.359810085999925,0.0 +75549,51.32321872300008,0.6544269420000433,0.0 +75550,51.371170231000065,-1.5474541329999738,0.0 +75551,51.36945276200004,-1.321251568999969,0.0 +75553,51.31758146800007,0.8999130940000555,0.0 +75554,51.321190080000065,0.9182539470000393,0.0 +75556,51.31895823100007,0.6468349300000682,0.0 +75558,51.35270976700008,-0.6213791309999692,0.0 +75560,51.362887217000036,-0.10955348399994591,0.0 +75561,51.38027387400007,-2.220392783999955,0.0 +75562,51.36559344900007,-1.3779691659999571,0.0 +75564,51.35159245700004,-0.5155357529999378,0.0 +75565,51.36207511900005,-0.3945856859999708,0.0 +75566,51.35052296100008,0.06251661500004957,0.0 +75567,51.350638005000064,-0.5653616009999496,0.0 +75568,51.34749155000003,-0.5366201279999245,0.0 +75569,51.35851614400008,-0.8964101709999568,0.0 +75572,51.34440963600008,-0.02722107199997481,0.0 +75573,51.37020276100003,-2.202621745999977,0.0 +75574,51.380110932000036,-2.1773208539999587,0.0 +75575,51.35768222100006,-0.6656895129999612,0.0 +75577,51.37036372600005,-2.232815442999936,0.0 +75578,51.30628938700005,1.0729243390000534,0.0 +75579,51.34829008600008,-0.6120903259999295,0.0 +75580,51.329573184000026,0.45535289500003273,0.0 +75581,51.34468474400006,-0.044976076999944326,0.0 +75582,51.375910383000075,-2.0273526619999416,0.0 +75583,51.34667961100007,-0.5748419639999724,0.0 +75584,51.325391472000035,0.7699228490000678,0.0 +75586,51.36438394000004,-2.0256261269999527,0.0 +75587,51.350001442000064,-0.23520044099996085,0.0 +75590,51.36636901800006,-2.197065436999935,0.0 +75591,51.30607409800007,1.2110632480000731,0.0 +75592,51.363487614000064,-2.140026427999942,0.0 +75593,51.33495645100004,-0.12062290299996903,0.0 +75594,51.332593548000034,0.8218781800000556,0.0 +75595,51.36830219500007,-1.6111572609999598,0.0 +75596,51.31707487700004,0.6668253950000462,0.0 +75597,51.38456759700006,-2.3147991479999632,0.0 +75598,51.357362497000054,-1.626487109999971,0.0 +75599,51.297301394000044,1.174650998000061,0.0 +75600,51.314058540000076,0.6504462290000674,0.0 +75601,51.35954125500007,-1.364955221999935,0.0 +75602,51.31484170700003,0.41996334800006707,0.0 +75603,51.31462798700005,0.44389590000002954,0.0 +75604,51.36363372900007,-1.9264188159999662,0.0 +75605,51.34999642100007,0.015463062000037553,0.0 +75606,51.358386264000046,-1.9374071369999797,0.0 +75607,51.282440602000065,1.3273274830000332,0.0 +75608,51.304591919000075,1.304102058000069,0.0 +75609,51.34750276800003,-0.8562145809999606,0.0 +75610,51.350752482000075,-1.376452727999947,0.0 +75611,51.356530959000054,-1.1969080539999482,0.0 +75612,51.355047831000036,-0.9390444769999249,0.0 +75613,51.28121733100005,1.3302619260000483,0.0 +75614,51.31335992800007,0.45701056600006496,0.0 +75616,51.34691063100007,-0.7834974499999703,0.0 +75617,51.36141737100007,-2.2038129929999286,0.0 +75618,51.357615199000065,-2.200949686999934,0.0 +75619,51.34750316600008,-0.82206894899997,0.0 +75621,51.35348760800008,-1.0629253709999489,0.0 +75623,51.33828521100003,-0.7895423059999302,0.0 +75624,51.33463924500006,0.07287194600002067,0.0 +75626,51.34439772700006,-1.0937863519999382,0.0 +75627,51.33914306600008,-0.7687538409999775,0.0 +75628,51.30802285200008,0.944398963000026,0.0 +75629,51.31039588400006,0.4301972030000343,0.0 +75630,51.31016489000007,0.8779944620000606,0.0 +75631,51.298201318000054,1.1328084030000696,0.0 +75632,51.30625192300005,0.7274158160000752,0.0 +75635,51.32522961700005,-0.13195285599994122,0.0 +75636,51.30736244500008,0.3665989840000634,0.0 +75637,51.342498903000035,-1.1875131579999447,0.0 +75638,51.28473505200003,1.2065225840000267,0.0 +75639,51.27753910000007,1.2084129500000245,0.0 +75640,51.31884530600007,-0.13882007899997006,0.0 +75642,51.33590966300005,-0.6328765889999772,0.0 +75643,51.33381471000007,-0.42090694799992434,0.0 +75644,51.30515985200003,0.468775828000048,0.0 +75645,51.30219583600007,0.4778909400000657,0.0 +75646,51.290606198000035,0.8567187860000445,0.0 +75647,51.337400255000034,-0.9401314099999354,0.0 +75648,51.33990350500005,-0.510969523999961,0.0 +75649,51.287986111000066,0.9363559930000633,0.0 +75651,51.35221522100005,-1.9189240709999353,0.0 +75652,51.35528231900008,-1.9053404089999617,0.0 +75654,51.333412019000036,0.1835877910000363,0.0 +75655,51.31741950800006,0.014268335000053867,0.0 +75656,51.30636900400003,0.35793330500007414,0.0 +75657,51.303545420000034,0.37181901800005335,0.0 +75658,51.35191085500003,-2.215722133999975,0.0 +75659,51.348034049000034,-2.172280611999952,0.0 +75660,51.33445080000007,-0.9549533849999534,0.0 +75661,51.34810658300006,-2.228352036999979,0.0 +75663,51.350920864000045,-1.0022706509999466,0.0 +75664,51.33260362000004,-0.9631030029999579,0.0 +75665,51.33276866600005,-0.4111488559999543,0.0 +75666,51.34353929100007,-1.7668057559999397,0.0 +75667,51.35773965000004,-1.735015232999956,0.0 +75668,51.34520600700006,-1.3710330889999796,0.0 +75669,51.35461462600006,-2.325044828999978,0.0 +75670,51.30272907800003,0.4048294990000727,0.0 +75671,51.275488342000074,1.2136495700000296,0.0 +75672,51.322238827000035,-0.11832456599995567,0.0 +75673,51.30178285300008,0.377804966000042,0.0 +75674,51.29853743600006,0.48922592500002793,0.0 +75675,51.281433280000044,1.0756501760000674,0.0 +75676,51.337278268000034,-0.5675155139999788,0.0 +75679,51.35079121000007,-1.2970973049999657,0.0 +75680,51.295558448000065,0.5187296410000499,0.0 +75681,51.314603559000034,0.0270481880000375,0.0 +75684,51.28614903300007,0.8642547640000657,0.0 +75685,51.34216763000006,-0.4736330639999551,0.0 +75686,51.34484157000003,-2.2494200249999494,0.0 +75687,51.275401758000044,1.0682576220000328,0.0 +75688,51.34250994900003,-2.2623180479999405,0.0 +75689,51.35164341900003,-2.309429598999941,0.0 +75690,51.302276799000026,0.2040832250000335,0.0 +75691,51.27919156200005,1.0431782340000382,0.0 +75692,51.27500349400003,1.0642941580000524,0.0 +75693,51.27293698400007,1.1999704300000644,0.0 +75694,51.34673438200008,-1.6037494759999618,0.0 +75695,51.31250155100008,-0.1415793739999458,0.0 +75696,51.309920642000066,0.847665735000021,0.0 +75697,51.33902196100007,-1.765787242999977,0.0 +75698,51.338596110000026,-1.7372566689999758,0.0 +75699,51.280787470000064,0.786750254000026,0.0 +75700,51.28402548100007,0.8459388850000664,0.0 +75701,51.340444425000044,-2.2865279519999717,0.0 +75702,51.34030149700004,-2.2510510589999626,0.0 +75704,51.296641142000055,0.23482653400003528,0.0 +75705,51.33161375200007,-1.0974681369999644,0.0 +75707,51.31328728400007,-0.381348629999934,0.0 +75708,51.32775375800003,-0.7717939739999338,0.0 +75709,51.31274001500003,-0.33367936599995573,0.0 +75710,51.29639303700003,0.4183774160000553,0.0 +75711,51.30551665000007,-0.14173642399993014,0.0 +75712,51.342158555000026,-2.1667788879999534,0.0 +75713,51.34673218100005,-2.068473370999925,0.0 +75714,51.319812840000054,-0.7466321359999597,0.0 +75715,51.32512680500008,-1.0445258669999475,0.0 +75716,51.34531791100005,-1.2423606959999347,0.0 +75717,51.313788138000064,-0.4889671609999482,0.0 +75719,51.34171747600004,-1.7953273059999333,0.0 +75720,51.32930386600003,-1.4685563359999492,0.0 +75721,51.31551104500005,-0.7652361019999603,0.0 +75722,51.31494497400007,-0.7595498369999518,0.0 +75724,51.33159967200004,-1.7782516349999469,0.0 +75725,51.28865177100005,0.2980267360000539,0.0 +75726,51.31858552800003,-0.09229852699996854,0.0 +75727,51.32776940000008,-1.4814118829999643,0.0 +75728,51.293992410000044,0.22001769000002014,0.0 +75729,51.289557555000044,0.2870494830000325,0.0 +75731,51.29518433000004,0.44707002100005866,0.0 +75732,51.26468568700005,1.2249542750000728,0.0 +75733,51.33376272500004,-2.0311862389999646,0.0 +75734,51.32966481900007,-2.0250315329999466,0.0 +75735,51.34129747900005,-1.2795859809999683,0.0 +75736,51.30272458300004,-0.1475506399999631,0.0 +75737,51.312750907000066,-0.769368849999978,0.0 +75738,51.29136694400006,0.16665598900004852,0.0 +75739,51.296405605000075,-0.06529782899997372,0.0 +75740,51.29775195800005,0.1842851060000612,0.0 +75741,51.31170524600003,-0.16373770099994545,0.0 +75742,51.299668377000046,-0.04196225399994091,0.0 +75743,51.29891795200007,-0.18700057199993125,0.0 +75744,51.28934690500006,0.17196003300006169,0.0 +75746,51.33124033300004,-1.9645156579999252,0.0 +75747,51.287638403000074,0.5121402290000674,0.0 +75748,51.30610733300006,-0.13196986799994193,0.0 +75749,51.27772032300004,0.756480295000074,0.0 +75750,51.32213806000004,-0.9641035229999488,0.0 +75751,51.32625855800006,-1.9611525739999252,0.0 +75752,51.32680933100005,-1.9054621899999802,0.0 +75753,51.336061820000054,-1.9078836559999672,0.0 +75754,51.29491576800007,-0.05482438599995021,0.0 +75755,51.328223569000045,-1.8346147069999574,0.0 +75756,51.30670176000007,-0.5076083829999334,0.0 +75757,51.31983625600003,-1.1066014479999353,0.0 +75758,51.32330785100004,-1.8873437829999489,0.0 +75759,51.341230661000054,-1.8785073949999287,0.0 +75760,51.32403435300006,-1.8021231669999338,0.0 +75761,51.32439552300008,-0.9102852379999717,0.0 +75762,51.31970658700004,-1.5415393299999778,0.0 +75763,51.32272938800003,-1.5324534179999318,0.0 +75764,51.28690265400007,0.15726777800006175,0.0 +75765,51.32088308800007,-1.6651456599999506,0.0 +75766,51.32049950000004,-1.656672900999979,0.0 +75768,51.33344202900008,-2.2351739089999683,0.0 +75769,51.32770954800003,-2.1037627579999594,0.0 +75770,51.32027456000003,-1.870928512999967,0.0 +75771,51.28550764700003,0.2240515770000684,0.0 +75773,51.29988817200007,-0.5230780209999466,0.0 +75774,51.298446848000026,-0.5269670489999498,0.0 +75777,51.26167331800008,1.0279436730000384,0.0 +75778,51.30639910700006,-0.4000330159999521,0.0 +75779,51.247548719000065,1.3371626130000323,0.0 +75780,51.24090266300004,1.365116674000035,0.0 +75781,51.24008466600003,1.3866025500000205,0.0 +75782,51.25360717900003,1.3709658730000456,0.0 +75783,51.31841139100004,-1.8166358359999322,0.0 +75784,51.23972334300004,1.393687410000041,0.0 +75785,51.24751359600003,1.3850287050000247,0.0 +75786,51.291587983000056,-0.07548669899995275,0.0 +75787,51.32049204300006,-2.0939217569999755,0.0 +75788,51.31777729300006,-2.081165281999972,0.0 +75789,51.32265096500004,-2.054263786999968,0.0 +75790,51.23878647500004,1.3952760680000438,0.0 +75791,51.238824908000026,1.4061814250000566,0.0 +75793,51.24141071500003,1.3441797360000578,0.0 +75794,51.238040012000056,1.3952428180000425,0.0 +75795,51.26922961200006,0.8199710030000347,0.0 +75796,51.27014090700004,1.1639675480000733,0.0 +75797,51.303394413000035,-0.5501855519999594,0.0 +75798,51.28258691000008,0.17644451200004596,0.0 +75800,51.271473815000036,0.5157174790000454,0.0 +75801,51.26908096200003,0.5833092810000267,0.0 +75802,51.315599063000036,-1.8774720819999402,0.0 +75803,51.30332169800005,-0.769634306999933,0.0 +75804,51.278959050000026,0.14500240300003497,0.0 +75805,51.282177690000026,0.2062124970000241,0.0 +75807,51.31529239000008,-2.059748610999975,0.0 +75808,51.31193802100006,-1.527891054999941,0.0 +75809,51.26833937200007,0.5426992260000247,0.0 +75810,51.30118560200003,-0.8619026549999376,0.0 +75811,51.32222518000003,-0.2663368059999698,0.0 +75815,51.314303109000036,-1.7906935929999577,0.0 +75816,51.31949343800005,-1.177787953999939,0.0 +75817,51.28971802400008,-0.3869461439999782,0.0 +75818,51.316955955000026,-2.0021343179999462,0.0 +75820,51.25005568100005,0.9601032610000289,0.0 +75821,51.30073072400006,-0.6112340719999452,0.0 +75822,51.29191227200005,-0.5822757259999776,0.0 +75823,51.28817424300007,-0.3975436079999781,0.0 +75824,51.308131692000075,-1.0893012829999407,0.0 +75825,51.25678722600003,1.2031886840000539,0.0 +75826,51.28536833900006,-0.19382730699993544,0.0 +75827,51.23713734800003,1.3625821670000278,0.0 +75828,51.24100092600003,1.309420052000064,0.0 +75829,51.31474334600006,-2.102440572999967,0.0 +75830,51.245033325000065,0.9690676530000246,0.0 +75831,51.24839738800006,0.9858454250000364,0.0 +75832,51.30262617300008,-1.538184082999976,0.0 +75833,51.308312588000035,-2.0326982229999544,0.0 +75834,51.30936340800008,-1.8390065989999584,0.0 +75835,51.309011901000076,-1.8084911129999455,0.0 +75837,51.31349292500005,-1.0132659349999358,0.0 +75838,51.26756306000004,0.9053642420000756,0.0 +75839,51.29055596000006,-1.0190940569999611,0.0 +75841,51.305512975000056,-2.1059271439999634,0.0 +75842,51.29480274000008,-0.8823769759999323,0.0 +75844,51.28547877800003,-0.8677424229999247,0.0 +75845,51.293178640000065,-0.6511108989999457,0.0 +75846,51.259232232000045,1.26233137600002,0.0 +75847,51.30714792100008,-1.4257118419999415,0.0 +75848,51.29446735400006,-1.416665830999932,0.0 +75849,51.28112140200005,-0.6465263669999786,0.0 +75850,51.292469349000044,-1.051818361999949,0.0 +75852,51.282803165000075,-0.6137219139999388,0.0 +75853,51.258380749000025,0.8310035560000415,0.0 +75854,51.30085921300008,-2.0268840829999704,0.0 +75855,51.30764714800006,-2.077266356999928,0.0 +75856,51.22650311400008,1.2315670700000396,0.0 +75857,51.27276578400006,0.09645676900004219,0.0 +75858,51.28622633200007,-0.523108165999929,0.0 +75859,51.30922964200005,-0.944105130999958,0.0 +75860,51.25154002700003,0.42225927500004445,0.0 +75861,51.25705459200003,0.4743026640000494,0.0 +75864,51.23998279400007,0.9442233080000619,0.0 +75865,51.22348816400006,1.3607408460000556,0.0 +75866,51.289833507000026,-0.47531256299993174,0.0 +75867,51.29004824900005,-0.3396064869999691,0.0 +75868,51.29135545500003,-0.811176952999972,0.0 +75869,51.25937202000006,0.8624156340000582,0.0 +75871,51.24741209200005,0.4260381290000623,0.0 +75872,51.28309242900008,-0.7748042829999804,0.0 +75874,51.30245806100004,-1.656347670999935,0.0 +75875,51.23231695700008,1.133337569000048,0.0 +75876,51.28636945000005,-0.5424397799999383,0.0 +75878,51.282608193000044,-1.0124507739999444,0.0 +75879,51.24965836800004,0.6281789360000403,0.0 +75881,51.27532677500005,-1.0089711459999648,0.0 +75882,51.26400623100005,-0.3164068359999419,0.0 +75883,51.21358639300007,1.3695655350000493,0.0 +75884,51.276338371000065,-0.5920261719999758,0.0 +75886,51.28792479300006,-1.627000708999958,0.0 +75887,51.21969430100006,1.2286504810000451,0.0 +75889,51.24212626600007,0.41639476400007425,0.0 +75890,51.265712988000075,0.30734561200006283,0.0 +75891,51.27752607700006,-0.8696775099999741,0.0 +75892,51.29519435100008,-2.0073998489999667,0.0 +75893,51.287255361000064,-1.9831662449999499,0.0 +75894,51.21778287500007,1.3452242240000487,0.0 +75895,51.26608161200005,-0.6298764979999305,0.0 +75897,51.27339458600005,-1.0125670639999385,0.0 +75898,51.29446109700007,-2.106977687999972,0.0 +75899,51.293879537000066,-1.6786599799999635,0.0 +75900,51.28243350400004,-1.6519298739999613,0.0 +75901,51.26414549900005,-0.5433344559999682,0.0 +75902,51.24430407800003,0.2985912220000273,0.0 +75903,51.25052620200006,-0.011091373999931875,0.0 +75904,51.25829326400003,0.0033091330000729613,0.0 +75905,51.279263161000074,-1.3539158629999406,0.0 +75906,51.28465307400006,-1.339426691999961,0.0 +75907,51.230746440000075,0.9651588850000508,0.0 +75908,51.29344788700007,-1.4856228099999385,0.0 +75909,51.30035193100008,-1.4526940189999777,0.0 +75910,51.25749264400008,-0.14630892099995663,0.0 +75911,51.25451393700007,-0.13433462399996188,0.0 +75912,51.241765187000055,0.5403630980000571,0.0 +75916,51.279825896000034,-0.506923383999947,0.0 +75918,51.25919286300007,-0.3281859209999425,0.0 +75919,51.27773803500003,-1.0453622189999692,0.0 +75921,51.208735353000066,1.3622637320000308,0.0 +75924,51.272675409000044,-1.447754411999938,0.0 +75925,51.28011189700004,-1.4244586899999376,0.0 +75926,51.30852950900004,-2.2878083919999312,0.0 +75927,51.26595428600007,-1.0778299349999543,0.0 +75928,51.25404561100004,-0.3559577959999274,0.0 +75929,51.21694184800003,1.2959268070000576,0.0 +75930,51.21781782700003,1.278864353000074,0.0 +75931,51.23039393200003,1.2773742960000618,0.0 +75932,51.264128440000036,-0.877096890999951,0.0 +75934,51.28623647000006,-1.8068097289999514,0.0 +75936,51.211868569000046,1.154780884000047,0.0 +75940,51.26354783000005,-0.6458262939999599,0.0 +75941,51.24936022900005,-0.3198459339999431,0.0 +75942,51.24810655400006,1.089336850000052,0.0 +75944,51.28561197600004,-0.44865000999993754,0.0 +75947,51.27069463200007,-1.799077539999928,0.0 +75949,51.26231426100003,-1.0941719549999789,0.0 +75952,51.23145310500007,0.4233648830000334,0.0 +75953,51.251884102000076,-0.6688006549999272,0.0 +75955,51.26909908300007,-1.8065490809999574,0.0 +75956,51.26782708600007,-1.671508557999971,0.0 +75957,51.27206376200007,-1.6571845519999329,0.0 +75959,51.23282220400006,0.41263996400005,0.0 +75960,51.23415343500005,0.377666606000048,0.0 +75962,51.26699425900006,-1.4299405519999482,0.0 +75963,51.26540911500007,-1.410884628999952,0.0 +75964,51.25109790000005,-0.6617176939999467,0.0 +75965,51.27093957000005,-1.8442846639999289,0.0 +75966,51.22186584800005,0.4334705720000329,0.0 +75967,51.26061701000003,-1.0711587759999475,0.0 +75970,51.262570735000054,-1.115430612999944,0.0 +75971,51.268655049000074,-1.198130095999943,0.0 +75972,51.26331583500007,-1.1841728079999712,0.0 +75974,51.26377375700008,-1.337564595999936,0.0 +75975,51.27158572500008,-1.3165988779999793,0.0 +75976,51.240518200000054,-0.30644381699994483,0.0 +75977,51.22261008100003,0.24747243400003072,0.0 +75978,51.22589932900007,0.2524878210000452,0.0 +75980,51.26376180400007,-1.7998112039999796,0.0 +75981,51.26523967400004,-1.7816247139999746,0.0 +75982,51.21988407500004,0.3992377550000583,0.0 +75985,51.27064827100003,-1.9962714689999643,0.0 +75986,51.211323090000064,0.969993177000049,0.0 +75987,51.23012940400008,1.031474653000032,0.0 +75988,51.19809177600007,1.1686328160000699,0.0 +75989,51.23474505200005,-0.2901897779999558,0.0 +75990,51.236844817000076,-0.2716973869999606,0.0 +75992,51.21640687800004,0.39148847100005923,0.0 +75993,51.261626328000034,-1.0336300549999464,0.0 +75994,51.26347543400004,-1.5931084519999672,0.0 +75995,51.23318622800008,-0.25075582299996313,0.0 +75996,51.25635469500003,-1.5779676709999535,0.0 +75997,51.19169705100006,1.3497846760000698,0.0 +75998,51.257006657000034,-1.6018189049999592,0.0 +75999,51.23217883900003,-0.2723437869999543,0.0 +76000,51.25490142700005,-1.586839303999966,0.0 +76001,51.26253627400007,-0.958116883999935,0.0 +76003,51.25054997800004,-1.2044868599999745,0.0 +76004,51.215620682000065,0.4424152890000528,0.0 +76005,51.19393358000008,1.0308975280000254,0.0 +76006,51.23055298200006,-0.2535267049999561,0.0 +76007,51.25561153600006,-1.4065396319999763,0.0 +76008,51.251777117000074,-1.3931844819999242,0.0 +76009,51.19043487300007,1.3327048530000525,0.0 +76010,51.25508856300007,-0.8632195489999503,0.0 +76011,51.24925840000003,-1.2663336269999377,0.0 +76012,51.23514428800007,-0.004826381999976093,0.0 +76013,51.23247012400003,-0.038675865999948655,0.0 +76015,51.20941417100005,0.4514105790000258,0.0 +76016,51.24883582100006,-1.2524182219999602,0.0 +76017,51.267740494000066,-1.247659409999926,0.0 +76018,51.25554246100006,-1.0172311139999692,0.0 +76019,51.25259489300004,-0.5668881089999331,0.0 +76020,51.255767150000054,-1.7963075069999377,0.0 +76021,51.252817924000055,-1.7868096549999564,0.0 +76023,51.245168456000044,-1.2295227339999428,0.0 +76024,51.25047525400004,-1.3207963039999413,0.0 +76025,51.245458760000076,-1.3174557459999505,0.0 +76026,51.241333386000065,-0.9831877379999696,0.0 +76027,51.206834438000044,0.4936831060000486,0.0 +76028,51.22062077500004,0.34166852300006667,0.0 +76029,51.21120057300004,0.38850901300003216,0.0 +76030,51.20544840000008,0.7553350520000208,0.0 +76031,51.23721068700007,-0.8586750899999629,0.0 +76032,51.20696197600006,0.7356695830000604,0.0 +76033,51.243770692000055,-1.273696341999937,0.0 +76034,51.23267607200006,-0.15619009899995717,0.0 +76035,51.22360356400003,-0.12688136499997427,0.0 +76036,51.184206783000036,1.1823915890000762,0.0 +76037,51.19293255500003,0.7601328690000742,0.0 +76038,51.19206153400006,0.7657542380000564,0.0 +76041,51.23993889900004,-1.282774169999925,0.0 +76044,51.223081309000065,0.03104388900004551,0.0 +76045,51.21316294300004,0.03512807000004159,0.0 +76048,51.21274316700004,0.21214362400002074,0.0 +76050,51.23490460900007,-0.8629111959999705,0.0 +76052,51.25717370900003,-0.9272738759999584,0.0 +76053,51.216128096000034,-0.1379459869999664,0.0 +76054,51.21438714900006,-0.12183845799995652,0.0 +76055,51.18636128400004,1.3837374020000652,0.0 +76057,51.22216992700004,-0.2410378399999331,0.0 +76058,51.238574303000064,-0.9711445579999349,0.0 +76059,51.20070986700006,0.9429374980000489,0.0 +76060,51.17391911800007,1.394286831000045,0.0 +76062,51.21576063700007,-0.2321294679999255,0.0 +76063,51.22448123400005,-0.2264123559999689,0.0 +76064,51.21428081600004,0.07969855600003939,0.0 +76065,51.212546588000066,0.09782818800005089,0.0 +76066,51.18707175000003,1.0351571440000384,0.0 +76067,51.22771828600003,-0.5753804139999374,0.0 +76068,51.23690963300004,-1.2926344309999536,0.0 +76069,51.23403024300006,-0.9829472699999542,0.0 +76070,51.20662185500004,0.1990077490000317,0.0 +76071,51.22423867700007,-0.2962223679999738,0.0 +76072,51.186447660000056,0.910233306000066,0.0 +76073,51.24251752300006,-1.3902685849999443,0.0 +76074,51.23855137400005,-1.378133469999966,0.0 +76075,51.23156934700006,-0.3500345129999687,0.0 +76077,51.21732377700005,0.4158309840000243,0.0 +76078,51.181132966000064,0.9280337720000489,0.0 +76079,51.20191153600007,0.37143691700003956,0.0 +76080,51.23999208600003,-1.2185025049999467,0.0 +76081,51.176875116000076,1.0391698070000643,0.0 +76082,51.204823059000034,0.3000178270000333,0.0 +76083,51.27002360900008,-0.7383505889999356,0.0 +76084,51.18756476300007,0.7887453090000349,0.0 +76085,51.20143660800005,0.24329743100003043,0.0 +76086,51.19813131600006,0.3078315010000665,0.0 +76089,51.21375732200005,1.0977167340000733,0.0 +76090,51.219537882000054,-0.47324705099993025,0.0 +76091,51.21374213800004,-0.19443040899994912,0.0 +76093,51.22968741200003,-1.2175891969999384,0.0 +76094,51.229463149000026,-1.2123057619999713,0.0 +76095,51.197191866000026,0.2674248040000293,0.0 +76096,51.20956219200008,0.2651526790000389,0.0 +76100,51.21241935000006,0.004300211000042964,0.0 +76101,51.18465788100008,0.7753034260000504,0.0 +76102,51.24358908800008,-1.570031189999952,0.0 +76103,51.25078560700007,-1.5535268549999728,0.0 +76104,51.22708638700004,-0.960358987999939,0.0 +76105,51.21945537300007,-0.5497950449999394,0.0 +76106,51.24303854800007,-1.790673978999962,0.0 +76108,51.207548829000075,-0.021643223999944894,0.0 +76109,51.23582733200004,-1.3227944599999546,0.0 +76110,51.23290089500006,-1.3113179689999583,0.0 +76112,51.19699974000008,0.28505016600007593,0.0 +76113,51.19546740700008,0.3394769000000224,0.0 +76114,51.20772318000007,-0.19465790799995375,0.0 +76115,51.176662864000036,0.9258274400000346,0.0 +76116,51.21259063700006,-0.41369159199996375,0.0 +76117,51.21057177200004,-0.2202206939999769,0.0 +76118,51.207728674000066,-0.2039590569999632,0.0 +76119,51.234887806000074,-1.8028626209999743,0.0 +76120,51.217023866000034,-0.2620438289999356,0.0 +76122,51.194173558000045,0.5252742090000311,0.0 +76123,51.21740338700005,-0.7793364339999584,0.0 +76124,51.17996300000004,0.8899637320000693,0.0 +76125,51.22765949700005,-1.2239873209999246,0.0 +76126,51.19321241200004,0.5478613000000223,0.0 +76127,51.188457577000065,0.5748204630000373,0.0 +76129,51.205594166000026,0.13808955200005357,0.0 +76130,51.174803276000034,0.9322853690000557,0.0 +76132,51.23609729000003,-1.8454595819999327,0.0 +76133,51.20152205200003,0.09582574900002783,0.0 +76136,51.20630147700007,-0.16603916599996182,0.0 +76137,51.17264700800007,1.0267557670000542,0.0 +76138,51.22874492100004,-1.6689587039999765,0.0 +76139,51.24645709100008,-1.6623127399999476,0.0 +76140,51.228857711000046,-0.9995738459999757,0.0 +76141,51.193659023000066,1.1173765440000238,0.0 +76144,51.22889439100004,-1.300922987999968,0.0 +76146,51.22497788900006,-1.3441681319999361,0.0 +76147,51.227910671000075,-1.3309629359999349,0.0 +76149,51.193579327000066,0.16098492000003262,0.0 +76150,51.23023409900003,-1.8162886829999252,0.0 +76151,51.215373733000035,-0.5761319279999384,0.0 +76153,51.227187435000076,-1.5588513059999514,0.0 +76154,51.22856748100003,-1.548088580999945,0.0 +76156,51.20895783200007,-0.4304654549999327,0.0 +76157,51.21124753200007,-0.498725856999954,0.0 +76160,51.19300548000007,0.09899159000002555,0.0 +76161,51.21166371500004,-0.593642230999933,0.0 +76162,51.19102768100004,0.15148390100006282,0.0 +76164,51.23886408300007,-1.5123206239999263,0.0 +76165,51.222045689000026,-1.5338924129999327,0.0 +76166,51.19597830400005,0.12475350200003277,0.0 +76168,51.19175634800007,0.1352758550000317,0.0 +76169,51.204677110000034,-0.463362851999932,0.0 +76170,51.18417875700004,0.6821946580000713,0.0 +76172,51.213237863000074,-0.7714178349999656,0.0 +76174,51.19080845800005,0.09068674400003829,0.0 +76177,51.23055240300005,-1.4795201799999518,0.0 +76178,51.203382041000054,-0.4760691569999267,0.0 +76179,51.188376051000034,0.11520053500004224,0.0 +76180,51.225113546000046,-1.49588694199997,0.0 +76181,51.19803273300005,0.0416732780000757,0.0 +76182,51.194078750000074,0.07498162600006708,0.0 +76183,51.22043701300004,-1.506608483999969,0.0 +76184,51.171226999000055,0.6861313580000683,0.0 +76185,51.21897019000005,-1.4887763829999585,0.0 +76189,51.226916147000054,-1.4650726289999625,0.0 +76190,51.21883128700006,-1.598420077999947,0.0 +76191,51.227733037000064,-1.606652305999944,0.0 +76192,51.21788856900008,-1.4605753219999542,0.0 +76195,51.199013638000054,-0.19265621699997837,0.0 +76196,51.20745900500003,-0.8182342279999375,0.0 +76197,51.21241378800005,-0.7973930069999255,0.0 +76198,51.22920189900003,-1.5924281199999655,0.0 +76199,51.177836425000066,0.5659664490000296,0.0 +76200,51.18770113100004,-0.022831924999934472,0.0 +76201,51.17991988500006,0.6069261950000282,0.0 +76202,51.21867840900006,-1.2828717789999473,0.0 +76203,51.18706322200006,-0.016644969999958903,0.0 +76204,51.19014825200003,-0.024244999999950778,0.0 +76205,51.21684185600003,-1.5922270299999468,0.0 +76206,51.19492776900006,0.022205095000060737,0.0 +76207,51.18646077100004,0.043515683000066474,0.0 +76208,51.17341247300004,0.6237822960000585,0.0 +76209,51.21682860800007,-1.4807209219999322,0.0 +76210,51.21597368700003,-1.477623681999944,0.0 +76213,51.218374416000074,-0.9688975989999449,0.0 +76215,51.185222182000075,0.023310968000032517,0.0 +76216,51.20299146800005,-0.5662381309999773,0.0 +76219,51.186017055000036,-0.0004099559999417579,0.0 +76220,51.16761152400005,0.6007234150000613,0.0 +76222,51.22489939600007,-1.7826831299999526,0.0 +76223,51.220754972000066,-1.7730651759999319,0.0 +76224,51.18955506300006,0.45168190100002903,0.0 +76225,51.216339520000076,-1.1904576889999703,0.0 +76226,51.17115407800003,0.8025008410000396,0.0 +76227,51.16374205800008,0.8246004530000732,0.0 +76228,51.15645437000006,0.8794746510000664,0.0 +76229,51.16730522700004,0.5798051950000627,0.0 +76230,51.21431115200005,-1.5800709349999806,0.0 +76233,51.16972636200006,0.653429650000021,0.0 +76234,51.20252639600005,-0.7793683389999728,0.0 +76235,51.16417067900005,0.6214705740000568,0.0 +76236,51.16462351000007,0.5930657150000229,0.0 +76237,51.21387298500008,-1.2981054689999496,0.0 +76239,51.16691129000003,1.1577268130000675,0.0 +76243,51.208907657000054,-1.5831745919999776,0.0 +76244,51.159708816000034,0.9060589950000235,0.0 +76245,51.192617029000075,-0.5496535549999635,0.0 +76246,51.193134315000066,-0.531644594999932,0.0 +76247,51.21884275000008,-1.374427151999953,0.0 +76248,51.214786737000054,-1.3580822859999557,0.0 +76249,51.14079897500005,1.2868088730000409,0.0 +76250,51.19916544800003,-0.6948912009999617,0.0 +76251,51.185127591000025,-0.04850169499997037,0.0 +76252,51.185792707000076,0.2209964330000389,0.0 +76254,51.196668801000044,-0.5909011909999435,0.0 +76257,51.17198937200004,1.1291840290000437,0.0 +76259,51.205767183000034,-1.5986275849999743,0.0 +76261,51.15843887200003,0.734161259000075,0.0 +76262,51.18889347600003,-0.6851030649999643,0.0 +76263,51.194456279000065,-0.6775322819999587,0.0 +76264,51.18096669300007,0.0006430060000752746,0.0 +76265,51.18703257300007,0.3809261520000291,0.0 +76266,51.19600862600004,-0.2662436439999283,0.0 +76268,51.19173565700004,-0.8640015229999563,0.0 +76269,51.196803328000044,-0.8360391889999619,0.0 +76270,51.17528774600004,0.1708451880000439,0.0 +76271,51.18975532700006,-0.6992119389999516,0.0 +76273,51.184960197000066,-0.15378535199994303,0.0 +76274,51.15270792600006,1.2247436900000253,0.0 +76275,51.177077919000055,0.3527557900000602,0.0 +76276,51.203432328000076,-1.57120759299994,0.0 +76277,51.18620663300004,-0.6675601939999751,0.0 +76278,51.18942395700003,-0.6319524789999491,0.0 +76279,51.13097235400005,1.3069543970000268,0.0 +76281,51.19802157200007,-1.564087709999967,0.0 +76282,51.19823112200004,-1.5566369449999797,0.0 +76283,51.150044136000076,0.7156356150000533,0.0 +76284,51.146045481000044,0.7802660890000652,0.0 +76285,51.13160750600008,1.2865159670000708,0.0 +76287,51.19535005200004,-0.7577581699999314,0.0 +76290,51.148632701000054,0.8793527610000638,0.0 +76291,51.18388859500004,-0.7381053159999738,0.0 +76292,51.186699211000075,-0.72269048499993,0.0 +76293,51.152372369000034,0.665820391000068,0.0 +76294,51.18076805800007,-0.18635565999994697,0.0 +76295,51.136267786000076,1.0922301360000688,0.0 +76296,51.14792583500008,0.8449955000000386,0.0 +76297,51.15823456800007,0.5002747600000248,0.0 +76298,51.13624932300007,1.0987891270000318,0.0 +76299,51.20048667800006,-1.5958500409999488,0.0 +76300,51.14636181900005,0.7558318070000496,0.0 +76301,51.14569209800004,0.7045929970000202,0.0 +76303,51.20369040400004,-1.4853646519999302,0.0 +76304,51.16387096900007,0.18727379800003519,0.0 +76306,51.194543174000046,-1.5209867779999513,0.0 +76307,51.203554559000054,-1.3986377319999406,0.0 +76308,51.195816885000056,-1.3764715659999638,0.0 +76309,51.17502563000005,0.2850739880000219,0.0 +76310,51.124572347000026,1.2912594990000343,0.0 +76312,51.18242977300008,-0.889840625999966,0.0 +76313,51.18387686300008,-0.8707934149999801,0.0 +76318,51.14200601500005,0.7837474280000265,0.0 +76319,51.18313063700003,-0.6201129089999426,0.0 +76324,51.13717724300005,0.8751995420000753,0.0 +76325,51.134788944000036,0.9222462050000217,0.0 +76326,51.20379225000005,-1.7712259199999494,0.0 +76327,51.235202721000064,-1.7288805559999787,0.0 +76330,51.18854103100006,-1.3955383479999455,0.0 +76331,51.12312185600007,1.316860001000066,0.0 +76332,51.186554149000074,-1.1374882479999542,0.0 +76333,51.190506707000054,-1.0980045629999609,0.0 +76334,51.18789149100007,-1.4074117959999626,0.0 +76337,51.167221607000045,-0.16086445399997729,0.0 +76339,51.180766507000044,-0.7559281929999315,0.0 +76346,51.16070413500006,-0.13224571699993248,0.0 +76347,51.15644177100006,0.21572244400005047,0.0 +76354,51.17218446100003,0.43130613300002096,0.0 +76356,51.17723911100006,-1.0561161689999494,0.0 +76360,51.13021920300008,0.8805129100000499,0.0 +76361,51.17018759600006,-0.6165488359999358,0.0 +76362,51.18280437800007,-0.5661212589999423,0.0 +76364,51.16383951200004,-0.18217388899995512,0.0 +76367,51.171004838000044,-0.7960936619999757,0.0 +76368,51.17193862800008,-0.7728293819999408,0.0 +76369,51.133805239000026,1.228753634000043,0.0 +76370,51.18055544900005,-0.2488375869999686,0.0 +76371,51.15392292700005,0.47103146900002457,0.0 +76374,51.13694814000007,0.7114615770000228,0.0 +76375,51.17763853900004,-1.1289133439999546,0.0 +76377,51.182022079000035,-1.4007337149999444,0.0 +76378,51.15788104100005,-0.2879774199999474,0.0 +76380,51.17315048200004,-1.1145222759999456,0.0 +76381,51.17752626500004,-1.3937086409999324,0.0 +76382,51.18531161700008,-1.3613973349999355,0.0 +76383,51.15506446200004,-0.1775925309999593,0.0 +76384,51.18737016500006,-1.561734433999959,0.0 +76386,51.17974509000004,-1.411243360999947,0.0 +76387,51.176635274000034,-1.4028934289999597,0.0 +76388,51.17454696900006,-0.5309944459999656,0.0 +76389,51.15647343100005,-0.293063482999969,0.0 +76391,51.186548739000045,-1.774365381999928,0.0 +76392,51.15983260300004,-0.5180853299999626,0.0 +76393,51.17540541500006,-1.3838263719999304,0.0 +76394,51.172232173000054,-1.1347045479999451,0.0 +76395,51.17987474800003,-1.7746040869999433,0.0 +76398,51.13377348100005,0.6960676790000662,0.0 +76400,51.12325117200004,0.8857090510000489,0.0 +76401,51.15823024100007,-0.010892496999929335,0.0 +76402,51.15388104800007,-0.19153231299992513,0.0 +76403,51.149481266000066,0.17859289900002295,0.0 +76404,51.11907234300003,0.8881468670000459,0.0 +76416,51.165683751000074,-0.6409097419999625,0.0 +76417,51.12679082600005,0.7172691270000655,0.0 +76418,51.13242194500003,0.4742325870000741,0.0 +76419,51.17175004100005,-1.334337059999939,0.0 +76421,51.172521420000066,-1.3623864629999503,0.0 +76422,51.16940787600004,-1.0381520479999722,0.0 +76424,51.16619627100005,-0.7684483979999754,0.0 +76425,51.143146149000074,0.1105444550000243,0.0 +76429,51.16825785900005,-1.129536322999968,0.0 +76430,51.14982012100006,-0.2138304109999467,0.0 +76432,51.16485979600003,-0.7980536029999712,0.0 +76433,51.16759536600006,-1.3395760549999522,0.0 +76434,51.16697217900003,-1.3244818609999243,0.0 +76436,51.16549269200004,-1.3360354159999588,0.0 +76437,51.16529000400004,-1.3320170479999547,0.0 +76438,51.17038315500008,-0.6755495919999248,0.0 +76439,51.15863598000004,-0.041288839999936044,0.0 +76441,51.16181153600007,-1.0257868219999295,0.0 +76445,51.169166863000044,-0.7122283299999594,0.0 +76447,51.16351273400005,-1.3127523849999534,0.0 +76451,51.12198240600003,0.7539231280000536,0.0 +76452,51.11658046400004,0.8160669810000627,0.0 +76453,51.11160807400006,0.9774130330000617,0.0 +76454,51.169222509000065,-0.9237181379999697,0.0 +76455,51.106485372000066,0.9661011530000678,0.0 +76457,51.11403965300008,0.8869778130000441,0.0 +76458,51.11393693000008,1.000076530000058,0.0 +76461,51.16489378700004,-1.0637392589999308,0.0 +76466,51.11105406000007,0.7907049030000621,0.0 +76467,51.167898609000076,-1.4245470009999508,0.0 +76468,51.16099023000004,-1.4395025659999305,0.0 +76469,51.166661583000064,-0.7459922629999483,0.0 +76471,51.16548262100008,-1.692119580999929,0.0 +76472,51.19444376700005,-1.67281677699998,0.0 +76475,51.13783820200007,0.6081274530000655,0.0 +76476,51.12835832900004,0.3225476800000706,0.0 +76477,51.10498220000005,0.9565076190000354,0.0 +76478,51.11337623400004,0.9183030100000451,0.0 +76483,51.15130668200004,-0.9871419699999251,0.0 +76484,51.15200263300005,-0.811863710999944,0.0 +76485,51.10748357400007,0.7906583130000513,0.0 +76486,51.14992594800003,-0.5162843659999794,0.0 +76487,51.139340477000076,0.561731481000038,0.0 +76488,51.10083193500003,0.9532064310000692,0.0 +76489,51.16992327100007,-1.7929551419999257,0.0 +76490,51.140282669000044,-0.4997125119999737,0.0 +76491,51.16048684700007,-1.794724573999929,0.0 +76492,51.14954857300006,-0.9764816519999613,0.0 +76493,51.15186772800007,-0.9652387689999387,0.0 +76494,51.16592447000005,-1.2448226599999543,0.0 +76495,51.161234154000056,-1.223209120999968,0.0 +76497,51.12679116400005,0.45071862300005705,0.0 +76499,51.14333539900008,-0.3718537259999266,0.0 +76501,51.14799456500003,-0.39498955399994884,0.0 +76502,51.155983108000044,-1.3254244279999625,0.0 +76504,51.17290027200005,-1.4776003739999624,0.0 +76505,51.15722342400005,-1.452703827999926,0.0 +76506,51.15176046300007,-1.2673237789999803,0.0 +76508,51.11872722700008,0.4211593700000549,0.0 +76512,51.15142991100004,-0.848448909999945,0.0 +76513,51.14419142100007,-0.8178911249999601,0.0 +76514,51.15119976900007,-1.3061024809999253,0.0 +76515,51.15072268600005,-1.253873978999934,0.0 +76516,51.13140536800006,0.15470801500003972,0.0 +76517,51.15309940800006,-1.002661519999947,0.0 +76518,51.08969965600005,1.1605754940000566,0.0 +76519,51.14249322500007,-0.8331972109999697,0.0 +76520,51.104165297000065,0.8053504070000486,0.0 +76521,51.098650132000046,1.0104573380000375,0.0 +76522,51.158966355000075,-1.8273915699999748,0.0 +76523,51.17209323000003,-1.8201237069999365,0.0 +76525,51.11200587400003,0.44009983000006514,0.0 +76528,51.14313047400003,-0.8120128189999605,0.0 +76529,51.12090441500004,0.21380409300002157,0.0 +76530,51.10961217900007,0.6102249720000259,0.0 +76534,51.11652903600003,0.1951143850000676,0.0 +76535,51.10948025000005,0.5960750300000655,0.0 +76536,51.15820844500007,-1.5122076949999723,0.0 +76538,51.14967818400004,-1.5018378069999585,0.0 +76539,51.139522217000035,-0.35499308399994334,0.0 +76540,51.117885873000034,0.15765745200002357,0.0 +76541,51.11598229400005,0.17416166700002123,0.0 +76543,51.13966824800008,-0.17455615699992677,0.0 +76546,51.118574797000065,0.3058478460000629,0.0 +76547,51.14095848800008,-0.13251987699993606,0.0 +76548,51.15544340000008,-1.805640908999976,0.0 +76549,51.16061170100005,-1.3777520219999246,0.0 +76551,51.14604455800003,-0.795070083999974,0.0 +76552,51.12927974200005,-0.37373278999996273,0.0 +76553,51.14402041100004,-0.9816253599999527,0.0 +76554,51.15434612900003,-1.3348621649999473,0.0 +76556,51.14959950300005,-1.4801892139999495,0.0 +76557,51.14944202300006,-1.4583693629999743,0.0 +76560,51.150715741000056,-1.8183143309999537,0.0 +76561,51.14590618200003,-0.9597271479999563,0.0 +76563,51.10547038900006,0.4426693410000553,0.0 +76564,51.14713880800008,-1.2869948579999573,0.0 +76566,51.10619779900003,0.4296683020000387,0.0 +76567,51.10366915600008,0.567858827000066,0.0 +76568,51.13665477200004,-0.8971819319999668,0.0 +76569,51.13290780300008,-0.8823329989999706,0.0 +76570,51.13772635400005,-0.857654881999963,0.0 +76571,51.137826000000075,-0.8303620559999558,0.0 +76572,51.11037391800005,0.3355014890000234,0.0 +76573,51.08612038800004,1.115657150000061,0.0 +76574,51.132796357000075,-0.8940829219999387,0.0 +76575,51.133679879000056,-0.2112632239999357,0.0 +76576,51.13116773300004,-0.8280355019999774,0.0 +76578,51.11911671100006,-0.24452971099992737,0.0 +76580,51.14444666700007,-1.5989615989999493,0.0 +76581,51.14551788600005,-1.5836400699999444,0.0 +76582,51.12592820400005,-0.47177931399994577,0.0 +76583,51.12079459500006,0.07567454000002272,0.0 +76586,51.15212083800003,-1.703004324999938,0.0 +76587,51.12620100400005,-0.6565637549999792,0.0 +76590,51.13023340800004,-0.5128134739999268,0.0 +76591,51.10198174400006,0.3876900650000721,0.0 +76593,51.13468093800003,-0.16268415399997593,0.0 +76596,51.122120762000065,-0.4960757529999569,0.0 +76601,51.14057913800008,-1.7078891169999793,0.0 +76602,51.09805490900004,0.5806309500000566,0.0 +76605,51.11095459000006,0.1437730280000551,0.0 +76606,51.132888851000075,-0.4345197549999398,0.0 +76607,51.09996672500006,0.46058525200004397,0.0 +76609,51.10517762300003,0.12521622200006277,0.0 +76610,51.10408132800006,0.13138998700003413,0.0 +76615,51.118807470000036,-0.47008848799993075,0.0 +76619,51.09892115100007,0.4470271790000311,0.0 +76622,51.11495063500007,-0.22386522799996555,0.0 +76624,51.12196248300006,-0.6214065969999751,0.0 +76626,51.11111189400003,-0.15933736399995269,0.0 +76627,51.12280530000004,-0.6564548789999662,0.0 +76628,51.118659208000054,-0.5094242009999448,0.0 +76629,51.138790235000045,-1.816950153999926,0.0 +76630,51.14319029500007,-1.8092948369999249,0.0 +76632,51.10796685200006,-0.15455434799997647,0.0 +76633,51.097718704000044,0.3430361330000551,0.0 +76636,51.107538058000046,0.00402119000005996,0.0 +76637,51.12579544000005,-0.8389505749999557,0.0 +76638,51.09085152200004,0.4645863000000645,0.0 +76639,51.10844741600005,-0.22573529099997813,0.0 +76641,51.114196175000075,-0.43336286899995,0.0 +76642,51.10828935700005,-0.22104169699997556,0.0 +76646,51.12874614700007,-0.9658219059999738,0.0 +76647,51.10784551000006,-0.16973662999993167,0.0 +76650,51.08881831300005,0.4740458090000743,0.0 +76655,51.134000134000075,-1.8322700659999782,0.0 +76656,51.13388968600003,-1.8198912989999485,0.0 +76657,51.13359512300008,-1.5795438599999443,0.0 +76658,51.12511816700004,-0.8844009619999724,0.0 +76664,51.12716310700006,-1.5680010109999785,0.0 +76665,51.13333178600004,-1.5629433219999669,0.0 +76666,51.098663403000046,0.12642018800005417,0.0 +76668,51.10102191300007,0.06463080600002513,0.0 +76670,51.103547184000035,0.17816703500005815,0.0 +76671,51.09057401800004,0.32666471200002434,0.0 +76674,51.08946536900004,0.20027222600003824,0.0 +76675,51.09098288300004,0.2179275620000567,0.0 +76681,51.12435194200003,-1.5899224199999367,0.0 +76683,51.088649958000076,0.1958028780000518,0.0 +76684,51.09075608100005,0.1232477290000702,0.0 +76688,51.11373962400006,-0.8911316059999308,0.0 +76689,51.12393657500007,-1.747778412999935,0.0 +76690,51.13104455800004,-1.7298144599999432,0.0 +76691,51.097710316000075,-0.025799819999974716,0.0 +76696,51.068990187000054,0.7817548550000311,0.0 +76697,51.066519388000074,0.7857726590000311,0.0 +76701,51.08915663800008,0.3078645130000268,0.0 +76702,51.071189031000074,0.6584874990000458,0.0 +76703,51.07437743500003,0.665999093000039,0.0 +76706,51.08961979800006,0.410968265000065,0.0 +76711,51.10226675100006,-0.5868047529999671,0.0 +76712,51.11277765700004,-0.5765271029999326,0.0 +76714,51.06579291400004,0.6587037050000504,0.0 +76715,51.06751829700005,0.6375261760000512,0.0 +76716,51.10580803800008,-0.6262713929999677,0.0 +76723,51.10749296500006,-0.916764819999969,0.0 +76724,51.071418537000056,0.3849761280000621,0.0 +76729,51.10821280000005,-0.8516147709999586,0.0 +76733,51.10830019400004,-1.5031562669999516,0.0 +76734,51.12635700300007,-1.4831792369999448,0.0 +76736,51.09522835800004,-0.8457900809999614,0.0 +76737,51.10629374600006,-0.8324906009999609,0.0 +76738,51.09544125800005,-0.7994068979999724,0.0 +76740,51.07918380400008,0.20891118900004813,0.0 +76742,51.10242356100008,-1.311493025999937,0.0 +76743,51.11616258600003,-1.2850837979999596,0.0 +76744,51.09411572400006,-0.852942230999929,0.0 +76747,51.09140690100003,-0.1601305849999335,0.0 +76748,51.10381649400006,-0.37451177899993127,0.0 +76749,51.06766464100008,0.4059995520000257,0.0 +76754,51.10209303100004,-1.5641058369999428,0.0 +76755,51.11408739900003,-1.5637682549999568,0.0 +76756,51.12053248800004,-0.9876852479999343,0.0 +76758,51.10313885000005,-1.129944724999973,0.0 +76759,51.10979806200004,-1.1558702159999257,0.0 +76760,51.100783394000075,-0.3269083599999476,0.0 +76761,51.09525639600008,-1.1639896049999265,0.0 +76764,51.08471618600004,-0.3136050149999505,0.0 +76771,51.090786655000045,-0.8406576399999608,0.0 +76772,51.05504907200003,0.5322985080000535,0.0 +76775,51.085684093000054,-0.7325203079999483,0.0 +76776,51.05440789700003,0.5151244410000686,0.0 +76780,51.09988928100006,-1.401196802999948,0.0 +76786,51.13155291900006,-1.1784864969999376,0.0 +76787,51.091142724000065,-1.177185920999932,0.0 +76790,51.10231386800007,-1.444575833999977,0.0 +76791,51.068828816000064,0.7373717330000318,0.0 +76792,51.05354724100005,0.763582007000025,0.0 +76793,51.092561000000046,-1.4349871849999545,0.0 +76794,51.08117127300005,-0.729645975999972,0.0 +76796,51.08426652600008,-0.7782990919999406,0.0 +76797,51.08979050200003,-1.3255291949999446,0.0 +76798,51.09391056800007,-1.3042663299999617,0.0 +76799,51.085703763000026,-1.1960953859999677,0.0 +76800,51.084818606000056,-1.098885265999968,0.0 +76801,51.10627203200005,-2.101566810999941,0.0 +76802,51.08951609300004,-1.2252312689999485,0.0 +76803,51.091115313000046,-1.691170647999968,0.0 +76804,51.101523403000044,-1.6767134589999273,0.0 +76806,51.061494475000075,0.22297381600003519,0.0 +76810,51.08220262700007,-0.541558590999955,0.0 +76811,51.07275934900008,-0.5137488819999589,0.0 +76812,51.08578956700006,-1.1330421849999652,0.0 +76813,51.09058606100007,-1.0282455809999647,0.0 +76814,51.086078470000075,-1.0005145549999384,0.0 +76815,51.112775670000076,-1.8227094969999484,0.0 +76816,51.09661860700004,-1.8138673369999765,0.0 +76819,51.08092179700003,-1.0974889199999325,0.0 +76820,51.09092307700007,-1.9650600529999451,0.0 +76821,51.092587896000055,-1.9590803529999334,0.0 +76823,51.094772825000064,-2.1182158239999467,0.0 +76824,51.078845364000074,0.1338882840000224,0.0 +76825,51.04023455600003,0.7079197700000464,0.0 +76826,51.035038394000026,0.6947366530000636,0.0 +76827,51.084228317000054,-1.3032273969999437,0.0 +76828,51.08775786000007,-1.2762764389999575,0.0 +76829,51.08498480600008,-0.985882518999972,0.0 +76830,51.088478956000074,-1.4132328569999686,0.0 +76833,51.08751326300006,-1.4659937269999546,0.0 +76834,51.05720467900005,0.20461066800004346,0.0 +76835,51.06736712500003,-0.4929542779999565,0.0 +76836,51.07852887900003,-0.45041462099993623,0.0 +76838,51.08456154600003,-0.8261414899999409,0.0 +76839,51.03443858600008,0.9317562170000429,0.0 +76840,51.02983146300005,0.9325113310000575,0.0 +76841,51.06927273900004,-0.3433446289999438,0.0 +76842,51.05451014300007,1.0108424230000423,0.0 +76843,51.022496716000035,0.9667281260000209,0.0 +76844,51.08049493900006,-1.4669150269999705,0.0 +76845,51.068732967000074,-0.8253802589999282,0.0 +76846,51.08172155600005,-1.248136866999971,0.0 +76850,51.08658954900005,-1.539588136999953,0.0 +76851,51.09094587200008,-1.5056177579999712,0.0 +76852,51.042578467000055,0.5649042050000617,0.0 +76853,51.03482107000008,0.5944376210000542,0.0 +76854,51.078653779000035,-1.4835454399999435,0.0 +76855,51.08380961200004,-1.9549001369999246,0.0 +76856,51.067416782000066,-0.8294285739999623,0.0 +76857,51.07138682000004,-0.384086277999927,0.0 +76859,51.05668189700003,-0.3612333139999464,0.0 +76863,51.075402189000044,-1.5115035749999493,0.0 +76864,51.05443034700005,-0.3680246629999715,0.0 +76866,51.10436497100005,-1.8797141659999284,0.0 +76867,51.07416776800005,-1.502240919999963,0.0 +76868,51.07927095400004,-1.9063539029999674,0.0 +76869,51.05652214700007,-0.1159693449999395,0.0 +76870,51.060706279000044,-0.10127737099998058,0.0 +76871,51.07841354000004,-1.9530248389999656,0.0 +76873,51.07429728500006,-1.4879458749999799,0.0 +76874,51.07107862200007,0.08271707400007244,0.0 +76877,51.05788451700005,-0.3352915029999508,0.0 +76878,51.05465182100005,-0.3061517539999272,0.0 +76879,51.02288174100005,0.8501286130000381,0.0 +76880,51.03571026900005,0.8451639480000495,0.0 +76881,51.04998859700004,-0.29341839699992533,0.0 +76882,51.05519210300008,-0.26121920899993256,0.0 +76883,51.07481647700007,-1.20759314299994,0.0 +76884,51.08458613700003,-2.0136626229999592,0.0 +76885,51.029929921000075,0.4965411940000308,0.0 +76886,51.02873807200007,0.5146423140000707,0.0 +76887,51.049061883000036,-0.25395931699995344,0.0 +76892,51.07421743300006,-2.0049718349999353,0.0 +76893,51.07585904300004,-1.9822903659999724,0.0 +76903,51.04680393400008,-0.06682192599993186,0.0 +76904,51.04371564600007,-0.04968143099995359,0.0 +76905,51.01325937100006,0.8807048440000358,0.0 +76906,51.03895893300006,0.8657596880000256,0.0 +76907,51.03968036900005,-0.12572509999995418,0.0 +76909,51.087237368000046,-2.0401049109999576,0.0 +76910,51.07308062200008,-2.01459631299997,0.0 +76912,51.03255986900007,0.31716406300006383,0.0 +76913,51.03518616400004,0.33828516900007344,0.0 +76914,51.02767438400008,0.424676876000035,0.0 +76915,51.02624982000003,0.4489214460000426,0.0 +76917,51.01520038400008,0.8988390970000637,0.0 +76918,51.008431862000066,0.9017058820000443,0.0 +76919,51.02449345400004,0.6290238330000761,0.0 +76920,51.037597875000074,-0.12360597999997935,0.0 +76921,51.06449409000004,-0.9100282509999715,0.0 +76922,51.06248253900003,-0.8906713719999289,0.0 +76925,51.035978914000054,-0.0528580949999764,0.0 +76926,51.04429144200003,-0.02775777099992638,0.0 +76927,51.09367755200003,-1.7653572379999787,0.0 +76928,51.07015849700008,-1.7546146339999495,0.0 +76929,51.07701463800004,-2.0843168649999484,0.0 +76930,51.01369919800004,0.664479697000047,0.0 +76931,51.03944195500003,0.6643555170000468,0.0 +76932,51.012902772000075,0.6656224680000378,0.0 +76933,51.02771906500004,0.6748986280000508,0.0 +76934,51.07172747300007,-1.8448779729999387,0.0 +76935,51.03874785600004,-0.16348036699997692,0.0 +76936,51.03752891500005,-0.14342191599996568,0.0 +76938,51.062096488000066,-0.617995060999931,0.0 +76939,51.036438202000056,-0.10714850799996611,0.0 +76940,51.04047562200003,-0.0967567549999444,0.0 +76941,51.06646567800004,-2.0655904529999702,0.0 +76942,51.01541771900003,0.6445264700000735,0.0 +76943,51.07181191500007,-1.1806911309999464,0.0 +76944,51.06379564900004,-1.8310057859999347,0.0 +76946,51.076892171000054,-1.807263607999971,0.0 +76950,51.03544011400004,-0.12711609099994803,0.0 +76954,51.06337584600004,-1.816869573999952,0.0 +76955,51.07109248900008,-1.6066443289999484,0.0 +76956,51.05928732500007,-1.5883541429999468,0.0 +76957,51.04507395300004,-0.6241010849999498,0.0 +76958,51.06660657300006,-2.036811658999966,0.0 +76960,51.069626705000076,-1.9595189599999685,0.0 +76961,51.067205340000044,-1.3047619439999494,0.0 +76965,51.05406005000003,-1.308871394999926,0.0 +76966,51.02161872100004,0.3496742110000355,0.0 +76967,51.05135487700005,-0.5873621819999357,0.0 +76968,51.01836865800004,0.7951111090000609,0.0 +76972,51.03342438400006,-0.18586465799995722,0.0 +76973,51.05989556700007,-1.7897725659999537,0.0 +76974,51.06106660800003,-1.7784945229999494,0.0 +76977,51.041668335000054,-0.5997661959999618,0.0 +76978,51.051534367000045,-1.1681329689999416,0.0 +76979,51.01684125200006,0.4463976820000539,0.0 +76980,51.009160259000055,0.9477752290000581,0.0 +76981,50.996617411000045,0.9311566340000468,0.0 +76982,51.00066058400006,0.8845082050000315,0.0 +76983,51.01118667700007,0.4465806220000559,0.0 +76984,51.00923884200006,0.6048827720000531,0.0 +76985,51.00955336200008,0.9252857110000718,0.0 +76986,51.01361722200005,0.93040181300006,0.0 +76987,51.00618570800003,0.5819173370000499,0.0 +76988,50.99625486700006,0.9012391640000601,0.0 +76989,51.00306033700008,0.8941472190000468,0.0 +76991,51.01511687000004,0.5425149280000596,0.0 +76992,51.001114673000075,0.9062354660000551,0.0 +76993,51.02643126000004,0.9167084220000561,0.0 +76996,51.01910123700003,0.30436732000003985,0.0 +76997,51.01513132900004,0.34309492500005945,0.0 +76998,50.99824339400004,0.7911684670000341,0.0 +76999,51.049901549000026,-1.1755950689999395,0.0 +77000,51.05693950600005,-1.0222237139999493,0.0 +77005,51.012689857000055,0.3956931940000459,0.0 +77006,51.00211628100004,0.6979909840000573,0.0 +77007,50.99365101600006,0.9206336680000504,0.0 +77008,50.993981803000054,0.924543055000072,0.0 +77011,50.99878119600004,0.8289144090000491,0.0 +77014,51.01405091700008,0.18854800500002966,0.0 +77016,50.99316556000008,0.9061790990000418,0.0 +77017,50.99253941900008,0.9091123380000568,0.0 +77021,51.025510558000065,-0.04506988399992906,0.0 +77022,51.02237268500005,-0.029423928999960935,0.0 +77023,51.00542126400006,0.6276940970000737,0.0 +77025,51.01199593600006,0.18658299300005865,0.0 +77026,51.05067382400006,-1.671214726999949,0.0 +77027,51.05749915900003,-2.0661143519999428,0.0 +77028,51.05479204000005,-1.6554734959999564,0.0 +77029,51.05350029300007,-2.1507039959999474,0.0 +77030,51.05582057600003,-1.62816900699994,0.0 +77033,51.05901165300003,-2.0000016799999685,0.0 +77034,51.04426638600006,-1.646995110999967,0.0 +77037,51.044700215000034,-1.663321046999954,0.0 +77038,51.05297075800007,-1.5337952899999436,0.0 +77039,51.05862817700006,-1.5189760709999405,0.0 +77045,51.04802233000004,-2.0598370569999247,0.0 +77046,51.040814236000074,-1.1529973729999483,0.0 +77047,51.02927603900008,-0.5381448619999674,0.0 +77048,51.00048486500003,0.578605408000044,0.0 +77049,51.031684143000064,-0.5786746169999333,0.0 +77050,51.04150567700003,-0.9106416389999481,0.0 +77051,51.04171306400008,-0.8954079949999709,0.0 +77052,50.992537404000075,0.7912664170000312,0.0 +77054,51.049551070000064,-2.1524128109999765,0.0 +77055,51.05963957000006,-1.6994700949999242,0.0 +77056,51.014119341000026,0.1539393210000526,0.0 +77057,51.010299502000066,0.17014100700004064,0.0 +77058,51.05516722700003,-2.0911258739999425,0.0 +77059,51.02397805500004,-0.5479892089999794,0.0 +77062,51.04592930700005,-2.1279337349999423,0.0 +77063,51.05127560900007,-1.5755517689999579,0.0 +77064,51.00269701500008,0.45423490500002117,0.0 +77065,51.04647831800003,-2.065004642999952,0.0 +77066,51.021441218000064,-0.0746279509999681,0.0 +77067,51.006164012000056,0.29931711500006486,0.0 +77068,51.00636820100004,0.25055735600005846,0.0 +77069,50.994345759000055,0.7157840440000314,0.0 +77070,50.986005402000046,0.9110596720000217,0.0 +77071,50.98609668300003,0.9167786340000248,0.0 +77073,51.04065891700003,-1.603588727999977,0.0 +77077,50.99164633700008,0.7818288040000425,0.0 +77079,50.99185069600003,0.8666110140000569,0.0 +77080,51.02162929900004,-0.5692257089999657,0.0 +77081,51.00815447300005,-0.048749595999936446,0.0 +77082,51.01211772600004,-0.040092270999934954,0.0 +77086,51.03814506600003,-1.5277467739999793,0.0 +77088,50.98308810200007,0.7719363100000578,0.0 +77089,51.034752913000034,-1.5523746269999492,0.0 +77092,51.00808867500007,-0.07512015199995403,0.0 +77093,50.998331912000026,0.25984072100004596,0.0 +77094,51.00371309800005,0.13416069700002708,0.0 +77095,51.00261442200008,0.14615185800005293,0.0 +77096,50.99587143600007,0.5357467470000756,0.0 +77098,50.992740714000035,0.46867238000004363,0.0 +77099,50.98870362300005,0.48327996000006124,0.0 +77106,50.97755464800008,0.907161919000032,0.0 +77109,51.03789455700007,-1.0912215139999262,0.0 +77110,51.03694103600003,-0.4787714189999406,0.0 +77111,51.012638673000026,-0.4779442609999478,0.0 +77112,50.97848992200005,0.8314995200000226,0.0 +77114,51.02017003600008,-0.5107268809999255,0.0 +77115,51.01056108000006,-0.4932589429999439,0.0 +77116,50.977844084000026,0.8374940430000493,0.0 +77120,51.02959650000008,-0.8162872649999713,0.0 +77121,51.02703908500007,-0.801661724999974,0.0 +77123,51.033225566000056,-1.3922502959999292,0.0 +77124,51.02743571900004,-1.3837896459999683,0.0 +77126,51.01763791900004,-0.9226265529999296,0.0 +77127,51.023509868000076,-0.9114203219999695,0.0 +77129,51.03433621500005,-1.926573785999949,0.0 +77130,51.002534946000026,-0.021810813999934453,0.0 +77131,50.975454081000066,0.9222063040000421,0.0 +77133,51.030282240000076,-1.946399084999939,0.0 +77136,51.02966841500006,-1.937495720999948,0.0 +77139,51.03462510300005,-1.8679644199999643,0.0 +77140,50.99002494100006,0.44207511100006514,0.0 +77141,50.985470029000055,0.7561261850000278,0.0 +77143,51.02223189100005,-1.3894207299999266,0.0 +77144,51.03734445300006,-1.3181677339999283,0.0 +77145,51.01932016300003,-0.4226470049999307,0.0 +77146,51.015392665000036,-0.4030572549999647,0.0 +77148,51.02208777300007,-1.295890295999925,0.0 +77150,50.97555171400006,0.7715065600000344,0.0 +77151,51.02803451600005,-1.9505125819999307,0.0 +77153,51.01922512600004,-1.3893724679999764,0.0 +77154,51.00758042900003,-0.33218243499993605,0.0 +77155,51.00618403300007,-0.31787739999992937,0.0 +77161,51.03519636900006,-2.114978353999959,0.0 +77163,51.00578032000004,0.01784564000007549,0.0 +77177,50.990258862000076,0.008011039000052733,0.0 +77178,51.03250815300004,-1.7734769829999664,0.0 +77179,51.04062844200007,-1.7569898559999615,0.0 +77182,51.02266941200003,-1.4834028439999543,0.0 +77183,51.01950005300006,-1.749703654999962,0.0 +77184,51.020828186000074,-1.4532869919999598,0.0 +77186,51.02836715700005,-1.8061405909999735,0.0 +77191,51.00035668700008,0.07315978900004438,0.0 +77192,50.99289879300005,0.09001474600006532,0.0 +77193,50.99038612000004,0.12731648000004725,0.0 +77194,50.97951476000003,0.49366811800007326,0.0 +77196,51.014647085000036,-1.4948831319999272,0.0 +77199,51.02073648700008,-1.5148129509999535,0.0 +77202,50.99758579100006,-0.39901439499993785,0.0 +77204,50.99554268900005,-0.48694460999996636,0.0 +77207,51.00812048900008,-0.7984326419999661,0.0 +77208,51.00812250400003,-0.9081822419999526,0.0 +77210,50.99354204800005,-0.48928725999996914,0.0 +77212,51.01557354800008,-1.757284052999978,0.0 +77213,51.002567827000064,-0.8735957949999715,0.0 +77214,51.00261424900003,-0.5097736049999639,0.0 +77215,50.995692734000045,-0.5028334469999436,0.0 +77216,50.987331391000055,0.02707456600006708,0.0 +77217,50.99027409800004,0.04605561700003591,0.0 +77218,50.99225158000007,0.39685273900005313,0.0 +77219,50.977123016000064,0.7887153130000684,0.0 +77222,51.02076563400004,-2.124083918999929,0.0 +77224,50.97197680700003,0.33185302800006866,0.0 +77227,50.96917154800008,0.6151835640000627,0.0 +77229,50.99102266800003,-0.41295782399993186,0.0 +77234,51.01708929100005,-1.9649303549999786,0.0 +77235,50.98561657000005,-0.03139544299995123,0.0 +77236,51.01941016100005,-2.1111628909999354,0.0 +77237,50.998585106000064,-0.8373904069999298,0.0 +77240,50.998711728000046,-0.7732694299999707,0.0 +77244,50.996197014000074,-0.747117818999925,0.0 +77245,50.99415359500006,-0.7360738839999499,0.0 +77248,50.99742867700007,-0.807643293999945,0.0 +77249,50.96057792400006,0.5955431700000418,0.0 +77257,50.994720173000076,-0.8283214719999705,0.0 +77258,50.955978637000044,0.719503646000021,0.0 +77262,50.97538541800003,0.11268580800003747,0.0 +77263,50.98347637400008,-0.2716167529999325,0.0 +77264,50.99722624800006,-0.2597143669999582,0.0 +77265,50.97503146400004,0.154402985000047,0.0 +77268,50.998297121000064,-0.9478895269999725,0.0 +77269,50.99565284100004,-0.9113194589999694,0.0 +77273,51.01110753300003,-2.119805699999972,0.0 +77274,51.017613262000054,-2.01164853399996,0.0 +77275,50.98862338300006,-0.7331433059999313,0.0 +77277,50.95838700400003,0.6634564130000626,0.0 +77281,50.98458217900003,-0.3726762969999413,0.0 +77282,50.99483986800004,-0.35572375999993255,0.0 +77284,50.971891138000046,0.040115351000054034,0.0 +77285,50.97444435600005,0.06867368000007446,0.0 +77288,50.98602071700003,-0.7214358899999525,0.0 +77289,50.976742201000036,-0.3538332939999691,0.0 +77290,51.00018117600007,-1.0746058709999602,0.0 +77291,50.98702060800008,-0.1471967939999672,0.0 +77292,51.02533969800004,-0.6952386169999727,0.0 +77293,51.01098206900008,-1.3556653329999335,0.0 +77294,51.00643444000008,-1.3286450399999694,0.0 +77296,50.950331590000076,0.6955233950000661,0.0 +77298,50.98681307000004,-0.33151831299994683,0.0 +77300,50.98148632700003,-0.21104589399993756,0.0 +77301,50.97375264200008,-0.18381350499993232,0.0 +77302,50.95203545700008,0.6342606710000496,0.0 +77303,50.97599235900003,-0.3577621019999242,0.0 +77304,50.97497603900007,-0.34751761999996233,0.0 +77306,50.968184447000056,0.09070589400005247,0.0 +77307,50.96328260200005,0.35062410800003363,0.0 +77310,50.988965516000064,-0.7679482219999727,0.0 +77311,50.98194166300004,-0.6826587829999653,0.0 +77312,51.007495996000046,-2.1309522179999476,0.0 +77313,51.00205450000004,-1.0472174929999483,0.0 +77314,50.97624898300006,-0.3899509769999554,0.0 +77316,50.97448689300006,-0.3700673279999478,0.0 +77317,50.98734252500003,-0.8276412519999781,0.0 +77319,50.981335726000054,-0.7077843969999549,0.0 +77324,50.96787057300003,0.4459857730000749,0.0 +77329,50.94504568000008,0.7285170890000359,0.0 +77330,50.95750555200004,0.7664007150000316,0.0 +77333,50.988023198000064,-0.9387365569999702,0.0 +77334,50.99154893600007,-0.8847142679999251,0.0 +77336,50.98947616300006,-1.3367809789999683,0.0 +77338,51.00672903100008,-1.2796370689999321,0.0 +77339,50.97790262900003,-0.6575617169999646,0.0 +77342,50.98145770500008,-0.7404588849999527,0.0 +77344,50.99629965100007,-1.5928624079999736,0.0 +77345,50.99069882200007,-1.5740254049999294,0.0 +77346,50.98452133600006,-0.8495597469999439,0.0 +77347,50.97121159800008,-0.12364476799996282,0.0 +77348,50.966786841000044,-0.22272671999996874,0.0 +77349,50.971129946000076,-0.38384732899993423,0.0 +77352,50.95887576700005,0.12150745200005986,0.0 +77354,50.988200885000026,-1.393522194999946,0.0 +77355,50.98347292900007,-1.3830057789999728,0.0 +77356,50.98516062700003,-1.3823711489999368,0.0 +77357,50.92995520200003,0.9134848600000396,0.0 +77358,50.97781001800007,-0.7934123039999577,0.0 +77359,50.96401407600007,-0.17877610699997604,0.0 +77363,50.99790181000003,-1.110864097999979,0.0 +77364,50.97952023000005,-1.1235302159999492,0.0 +77365,50.98244442300006,-1.3908248469999762,0.0 +77366,50.96103354500008,-0.21470967499993776,0.0 +77367,50.97624559500008,-0.7778047769999716,0.0 +77370,50.98339838600003,-1.3231740249999575,0.0 +77371,50.987752028000045,-1.2591688039999553,0.0 +77374,50.950316824000026,0.8772796790000257,0.0 +77376,50.97150169500003,-0.6326134059999617,0.0 +77377,50.94597001400007,0.4949712590000672,0.0 +77381,50.983672969000054,-1.5746562559999688,0.0 +77382,50.97612802900005,-0.7267677599999729,0.0 +77384,50.99476320400004,-1.6542762449999486,0.0 +77386,50.960133331000065,-0.25446277499997905,0.0 +77387,50.96701490700008,-0.26640049799993903,0.0 +77388,50.95583001700004,-0.2695822839999664,0.0 +77389,50.937868223000066,0.5643260490000443,0.0 +77391,50.95557000100007,0.07478731500003732,0.0 +77392,50.99175507700005,-1.6237225629999443,0.0 +77393,50.97989037600007,-1.5886287579999703,0.0 +77394,50.98047387200006,-1.6102566119999437,0.0 +77395,50.97269394800003,-0.7052586199999382,0.0 +77398,50.96395212400006,-0.6112284209999643,0.0 +77399,50.97604263100004,-0.6010242449999623,0.0 +77400,50.97916458000003,-1.6673373419999393,0.0 +77402,50.97791183800007,-1.5707996959999377,0.0 +77404,50.97777057600007,-1.6023260049999521,0.0 +77405,50.955442479000055,-0.24472824399992987,0.0 +77406,50.96433658800004,-0.6292239659999268,0.0 +77407,50.95496028300005,0.05124782000007144,0.0 +77408,50.944562407000035,0.06584197200004382,0.0 +77409,50.96572486200006,-0.658533772999931,0.0 +77411,50.978210628000056,-1.6430595379999318,0.0 +77412,50.977129035000075,-1.6299660859999676,0.0 +77413,50.92920716700007,0.5883622060000562,0.0 +77414,50.93307830900005,0.5184095150000303,0.0 +77415,50.93240228900004,0.5524714960000665,0.0 +77416,50.92709791000004,0.6113972390000413,0.0 +77417,50.93023647700005,0.6789540420000435,0.0 +77419,50.95896603300008,-0.5996543909999446,0.0 +77422,50.94440724900005,0.08218941000006907,0.0 +77423,50.95177458900008,0.10496413000004168,0.0 +77424,50.953842500000064,0.003436955000040598,0.0 +77425,50.94239130600005,0.05360025000004498,0.0 +77426,50.956406979000064,-0.5946100799999385,0.0 +77429,50.95488480200004,-0.58842550199995,0.0 +77430,50.96184343200008,-0.5808327749999762,0.0 +77431,50.935814633000064,0.2236954330000458,0.0 +77434,50.93550669900003,0.21599897100003318,0.0 +77437,50.978551819000074,-1.908152604999941,0.0 +77438,50.97912474200007,-1.8910084579999307,0.0 +77439,50.96158301300005,-0.3243154739999454,0.0 +77440,50.927458149000074,0.5242763500000365,0.0 +77441,50.97138216400003,-0.5263904439999578,0.0 +77443,50.97208538000007,-1.654217439999968,0.0 +77445,50.95036032300004,-0.28259555899995803,0.0 +77449,50.94784369200005,-0.4826253369999449,0.0 +77450,50.94883776100005,-0.474772608999956,0.0 +77453,50.953586451000035,-0.6060010509999643,0.0 +77456,50.95234742300005,-0.5556224929999303,0.0 +77457,50.93283405400007,0.4861697220000565,0.0 +77459,50.97938583200005,-1.8587557259999699,0.0 +77460,50.97739145500003,-1.8432359749999705,0.0 +77461,50.96976584300006,-1.2011505189999525,0.0 +77462,50.96806804100004,-1.185004527999979,0.0 +77463,50.96065655700005,-0.3830238469999472,0.0 +77464,50.951894914000036,-0.5097682929999792,0.0 +77465,50.95056515400006,-0.4910819679999463,0.0 +77466,50.93698788000006,0.05249904000004335,0.0 +77467,50.98867477300007,-1.5021334119999779,0.0 +77468,50.98228183000003,-1.4779524979999792,0.0 +77473,50.94604140200005,-0.4755962099999351,0.0 +77474,50.96621386100003,-1.7664495239999383,0.0 +77475,50.98993696100007,-1.750769585999933,0.0 +77477,50.92346993600006,0.5788993570000684,0.0 +77481,50.92024055700006,0.6102745480000635,0.0 +77482,50.97210923200004,-1.339687137999931,0.0 +77488,50.969466476000036,-1.5789676699999404,0.0 +77490,50.94084883200003,-0.30580639399994425,0.0 +77491,50.940045972000064,-0.2988306929999567,0.0 +77493,50.940616231000035,-0.5124119719999385,0.0 +77496,50.939376769000035,-0.2508237349999263,0.0 +77498,50.93113554700005,-0.07354919899995593,0.0 +77499,50.964668593000056,-2.0108341899999687,0.0 +77500,50.963702460000036,-1.9968479649999722,0.0 +77501,50.94732909500004,-0.5982971549999547,0.0 +77502,50.92197727700005,0.39905795200002103,0.0 +77503,50.91746149800008,0.41484149000007164,0.0 +77505,50.92963763000006,0.2813933370000541,0.0 +77506,50.924023989000034,0.29279499000006126,0.0 +77508,50.92777882400003,0.08653940700003204,0.0 +77509,50.92971748600007,-0.2064196949999655,0.0 +77511,50.95356549100006,-1.3225073399999587,0.0 +77512,50.90994237800004,0.6013602020000235,0.0 +77519,50.93646586800003,-0.5194999519999328,0.0 +77521,50.966592253000044,-1.2331078959999786,0.0 +77522,50.95253437400004,-1.2189446219999809,0.0 +77523,50.92685666400007,0.050342613000054826,0.0 +77525,50.92939160200007,0.19629433300002574,0.0 +77526,50.925645591000034,0.2186359190000644,0.0 +77528,50.939062275000026,-0.48008381099992903,0.0 +77529,50.956144625000036,-1.5009135329999594,0.0 +77532,50.96405370800005,-1.5433953989999623,0.0 +77533,50.904556779000075,0.6874474850000638,0.0 +77534,50.92510154300004,0.2664241310000648,0.0 +77535,50.931028344000026,-0.47302159399993116,0.0 +77536,50.96014947400005,-1.1332335989999365,0.0 +77537,50.94478541700005,-1.1325912359999393,0.0 +77539,50.95004527700007,-1.5145904649999693,0.0 +77542,50.94274905000003,-0.9503655119999621,0.0 +77543,50.940503224000054,-0.9472912969999356,0.0 +77544,50.92362301600008,-0.05214357399995606,0.0 +77545,50.927005982000026,0.0015360970000415364,0.0 +77546,50.91876422800004,0.04489745400002221,0.0 +77547,50.92996594400006,-0.467195735999951,0.0 +77548,50.91241255600005,0.2867323440000291,0.0 +77549,50.95919575400006,-2.079250135999928,0.0 +77550,50.95407473200004,-2.0684390049999593,0.0 +77551,50.89831152600004,0.7016815660000475,0.0 +77553,50.94403394900007,-1.2301211909999665,0.0 +77554,50.962113386000055,-1.7924637039999425,0.0 +77555,50.95548796600008,-1.7677769939999735,0.0 +77556,50.93039808200007,-0.4505890749999253,0.0 +77557,50.94276294000008,-0.1588838149999674,0.0 +77558,50.918961265000064,0.05939962800005105,0.0 +77560,50.92809919900003,-0.45972613599997203,0.0 +77561,50.905045124000026,0.6075385530000403,0.0 +77567,50.92418685300004,-0.20468154099995672,0.0 +77575,50.94144532800004,-1.2023230279999666,0.0 +77577,50.94604617500005,-1.7763353079999433,0.0 +77580,50.90987630300003,0.2130791130000489,0.0 +77583,50.94446981600004,-1.2853732919999743,0.0 +77584,50.93729724800005,-1.2686192639999376,0.0 +77589,50.90410819200008,0.19331954500006532,0.0 +77594,50.91585794500003,-0.29325687399995104,0.0 +77595,50.94365406400004,-1.964390929999979,0.0 +77596,50.948280029000045,-1.9577721719999772,0.0 +77597,50.95803898200006,-1.370793841999955,0.0 +77598,50.892692028000056,0.6827184610000359,0.0 +77600,50.94350307800005,-1.3537843359999329,0.0 +77601,50.94323648100004,-1.7511908099999687,0.0 +77603,50.924201303000075,-0.3045836019999797,0.0 +77604,50.914055070000074,-0.2960857769999734,0.0 +77605,50.90627490600008,0.3635120900000288,0.0 +77606,50.904141139000046,0.3959003000000507,0.0 +77608,50.95590386600003,-1.8709133999999494,0.0 +77610,50.935781545000054,-1.0905055039999638,0.0 +77611,50.93356615600004,-1.0771497129999261,0.0 +77612,50.919451809000066,-0.5448545579999404,0.0 +77613,50.929637942000056,-0.5389018899999769,0.0 +77614,50.93732843600003,-1.8569394509999597,0.0 +77615,50.93216605300006,-1.2701071539999589,0.0 +77616,50.93503392200006,-1.2500302479999732,0.0 +77617,50.92540046700003,-0.8259211659999437,0.0 +77618,50.92351260600003,-0.8126653919999285,0.0 +77619,50.93360940000008,-0.3637358379999682,0.0 +77626,50.91239171500007,-0.30240456599995014,0.0 +77627,50.911423574000025,-0.2990696799999455,0.0 +77633,50.935322548000045,-1.845758276999959,0.0 +77639,50.905642777000025,0.005788228000028539,0.0 +77640,50.90781170000008,0.03237363300002016,0.0 +77648,50.93837853700006,-1.4400491509999256,0.0 +77649,50.92717206900005,-1.4381543819999365,0.0 +77650,50.91305291400005,-0.5418567039999402,0.0 +77651,50.91127092700003,-0.5404442879999465,0.0 +77657,50.91933895600005,-0.7565570379999258,0.0 +77661,50.929132208000055,-1.8700155889999337,0.0 +77662,50.929785467000045,-1.8482943469999782,0.0 +77663,50.939037807000034,-2.052851946999965,0.0 +77664,50.94055074900007,-2.033012170999939,0.0 +77668,50.92651209400003,-1.8562065289999623,0.0 +77669,50.889266520000035,0.38168953600006716,0.0 +77670,50.90744596900004,-0.2585654579999641,0.0 +77671,50.89717405300007,0.347893870000064,0.0 +77675,50.91720593300005,-0.7103465919999508,0.0 +77677,50.93534148100008,-1.4902831999999648,0.0 +77678,50.92218782100008,-1.4758439179999527,0.0 +77679,50.90969498100003,-0.7337329299999737,0.0 +77680,50.90948446200008,-0.6811101539999527,0.0 +77681,50.89507512800003,0.2304263090000518,0.0 +77682,50.899708376000035,0.2601073530000235,0.0 +77686,50.914474505000044,-0.8156178549999709,0.0 +77687,50.912148915000046,-0.805719020999959,0.0 +77689,50.93403704600007,-1.5786487039999315,0.0 +77693,50.94376544000005,-1.8136288759999388,0.0 +77694,50.93119804000003,-1.7768258619999528,0.0 +77695,50.92769792100006,-0.9672341829999596,0.0 +77696,50.923482629000034,-0.9489089829999671,0.0 +77698,50.92634660900006,-1.8177049929999498,0.0 +77700,50.91843912000007,-1.4935396599999535,0.0 +77703,50.91925614000007,-1.797935926999969,0.0 +77704,50.92209055500007,-1.7879924989999267,0.0 +77705,50.916815333000045,-1.475608953999938,0.0 +77706,50.92253846700004,-1.7573766749999322,0.0 +77707,50.91405808900004,-1.2775121669999407,0.0 +77708,50.91985493400006,-1.2665323149999494,0.0 +77714,50.90937699800003,-0.5539549219999458,0.0 +77715,50.90373724500006,-0.5487621569999419,0.0 +77718,50.926030198000035,-1.9350613939999448,0.0 +77719,50.923687881000035,-1.9083070339999608,0.0 +77720,50.91268067200008,-1.4837884479999275,0.0 +77723,50.91579402100007,-1.0931140689999665,0.0 +77724,50.87634382300007,0.4697432950000575,0.0 +77725,50.88614468700007,0.4894009700000197,0.0 +77729,50.895124759000055,-0.3193836109999779,0.0 +77730,50.89783083200007,-0.2979972679999605,0.0 +77731,50.91693210300008,-1.0641844779999587,0.0 +77738,50.91113274200006,-1.2485409639999716,0.0 +77739,50.90659141400005,-1.265118144999974,0.0 +77740,50.90266943900008,-1.2606568089999541,0.0 +77741,50.90296541400005,-1.2565606709999315,0.0 +77744,50.90482308400004,-1.118456852999941,0.0 +77745,50.90250494400004,-1.107230948999927,0.0 +77748,50.90459593500003,-1.2350363209999387,0.0 +77749,50.90793070800004,-1.5372615109999401,0.0 +77751,50.90612315000004,-1.4526532659999702,0.0 +77752,50.912682647000054,-1.443188103999944,0.0 +77757,50.91044235000004,-1.50730312099995,0.0 +77759,50.882224042000075,0.11244515300006697,0.0 +77760,50.87442468100005,0.09533701000003703,0.0 +77761,50.87105728800003,0.09530033300006835,0.0 +77762,50.902173205000054,-1.4265994349999573,0.0 +77763,50.90234359400006,-1.4250513089999686,0.0 +77769,50.88473877200005,0.009999121000021205,0.0 +77777,50.91639007200007,-0.8972115979999558,0.0 +77778,50.89674020100006,-0.8753283729999453,0.0 +77790,50.88911123300005,-0.8829672839999603,0.0 +77791,50.90713472600004,-0.8586225679999302,0.0 +77792,50.896005452000054,-1.420270468999945,0.0 +77793,50.89858344700008,-1.4211600479999333,0.0 +77797,50.859439026000075,0.579912863000061,0.0 +77799,50.868890804000046,-0.031588848999945185,0.0 +77800,50.869957776000035,0.11708553600004734,0.0 +77801,50.86883261100007,-0.003713604999973086,0.0 +77802,50.872092113000065,0.22947128100003056,0.0 +77806,50.899187091000044,-0.7779896029999804,0.0 +77807,50.86660246500003,0.08764471400002094,0.0 +77809,50.89300200100007,-0.8066134779999743,0.0 +77810,50.865555037000036,-0.037967752999975346,0.0 +77811,50.85809666200004,0.3178508700000293,0.0 +77812,50.85892615000006,0.3215153820000296,0.0 +77813,50.85364169500008,0.41082352600005834,0.0 +77814,50.85272610200008,0.41545756300007497,0.0 +77817,50.89525127500008,-1.2450183579999248,0.0 +77818,50.85881954400003,0.21339097200007018,0.0 +77819,50.878003439000054,-0.16304250299992873,0.0 +77820,50.89210671400008,-1.5712623569999664,0.0 +77821,50.894160302000046,-1.5752652359999502,0.0 +77823,50.869174662000034,0.1933477790000211,0.0 +77825,50.89646617400007,-1.545832799999971,0.0 +77827,50.894757973000026,-1.8984003849999453,0.0 +77828,50.905671631000075,-1.894364960999951,0.0 +77829,50.858346107000045,0.20437086100002944,0.0 +77830,50.89230710500004,-1.0595457179999244,0.0 +77831,50.90070295700008,-1.0349823479999714,0.0 +77832,50.86653606900006,-0.16248446199995215,0.0 +77836,50.86040101900005,0.08744214900002589,0.0 +77837,50.86467780300006,0.29555866500004413,0.0 +77838,50.85284818000008,0.3241793420000363,0.0 +77839,50.85027922900008,0.3251727630000687,0.0 +77843,50.88290960000006,-1.1428022049999527,0.0 +77844,50.84954091100008,0.32002332900003694,0.0 +77845,50.849084023000046,0.5273870140000554,0.0 +77848,50.855811835000054,0.5173060950000377,0.0 +77851,50.86187706700008,-0.15216106999997692,0.0 +77852,50.86723267200006,-0.1462301919999618,0.0 +77855,50.86797393400008,-0.6488487169999644,0.0 +77856,50.87296575200003,-0.6385571439999467,0.0 +77857,50.87891035300004,-1.133502256999975,0.0 +77858,50.88597139800004,-1.109337987999936,0.0 +77859,50.886835305000034,-1.4022431939999365,0.0 +77860,50.909492285000056,-1.3828226729999642,0.0 +77861,50.84553000400007,0.30989692000002833,0.0 +77863,50.84673983700003,0.39697981500006563,0.0 +77864,50.84577168000004,0.29465698700005305,0.0 +77865,50.900195120000035,-1.7921339979999402,0.0 +77872,50.902523916000064,-2.0120781609999767,0.0 +77873,50.91919852900003,-1.9803777569999284,0.0 +77874,50.876355697000065,-1.078365261999977,0.0 +77875,50.836132973000076,0.46669726200002515,0.0 +77876,50.871084720000056,-1.0900065069999414,0.0 +77879,50.87163402200008,-1.1079713139999399,0.0 +77882,50.88160637300007,-1.7944146499999647,0.0 +77883,50.90468788800007,-1.7467000679999387,0.0 +77884,50.848744586000066,0.012664805000042634,0.0 +77885,50.86021894800007,0.016337992000046597,0.0 +77888,50.88897110500005,-1.8208866659999785,0.0 +77889,50.880579201000046,-1.8002607109999644,0.0 +77890,50.874526597000056,-1.0145333819999678,0.0 +77891,50.89592139600006,-0.9962118919999625,0.0 +77894,50.87827237600004,-0.5429521969999769,0.0 +77895,50.865835410000045,-0.5261200869999243,0.0 +77897,50.836485089000064,0.3538533450000614,0.0 +77898,50.858992612000065,0.373759193000069,0.0 +77901,50.87532302900007,-1.381240380999941,0.0 +77902,50.88502732000006,-1.3728063809999753,0.0 +77903,50.86616518900007,-0.4671152089999282,0.0 +77904,50.858342314000026,-0.4384889089999433,0.0 +77907,50.84246146900006,0.3381235810000476,0.0 +77913,50.89180214600003,-1.7389449729999455,0.0 +77914,50.834434455000064,0.34596483700005365,0.0 +77917,50.84306500100007,0.020931349000022692,0.0 +77918,50.83205073000005,0.3523638250000545,0.0 +77919,50.83279782800008,0.35573266900001954,0.0 +77920,50.87433033000008,-1.5202534299999684,0.0 +77921,50.84590069400008,0.187261172000035,0.0 +77927,50.82961352500007,0.3593591530000708,0.0 +77928,50.83661747600007,0.37924353300002167,0.0 +77929,50.83368785400006,0.40505822900007615,0.0 +77932,50.83257152600004,0.1925586230000249,0.0 +77941,50.86434836800004,-1.5288880449999738,0.0 +77942,50.82977766300007,0.16713933600004793,0.0 +77943,50.83035959000006,0.1768273700000691,0.0 +77945,50.85245261100005,-0.7368326939999292,0.0 +77946,50.854527759000064,-0.850511001999962,0.0 +77947,50.85330868800003,-0.8318814009999755,0.0 +77950,50.89412368600006,-2.0337132219999603,0.0 +77951,50.87236957600004,-1.989559136999958,0.0 +77953,50.85833493600006,-0.7658662719999256,0.0 +77956,50.86411562200004,-1.930265565999946,0.0 +77957,50.865639025000064,-1.9224258409999493,0.0 +77958,50.84815047500007,-0.22713371099996493,0.0 +77959,50.83783165300008,-0.2078439189999699,0.0 +77960,50.832601286000056,0.01576254200006133,0.0 +77961,50.86000953300004,-0.29835055499995633,0.0 +77962,50.83341150800004,-0.2928876699999705,0.0 +77964,50.84173037700003,-0.14660510499993507,0.0 +77965,50.85365348700003,-0.10649185599993416,0.0 +77966,50.862022323000076,-1.3611286199999313,0.0 +77967,50.85235365900007,-1.3569544929999324,0.0 +77969,50.85677319300004,-0.9951446429999464,0.0 +77970,50.87223671100003,-0.9667782759999568,0.0 +77972,50.85917107600005,-1.92699220399993,0.0 +77973,50.858647004000034,-1.9351262989999327,0.0 +77975,50.83543355000006,-0.5028646659999367,0.0 +77976,50.83444121800005,-0.5001796419999778,0.0 +77978,50.844666360000076,-0.9991986749999455,0.0 +77979,50.82914509700004,-0.21596496699993395,0.0 +77981,50.83257933600004,-0.24992201099996691,0.0 +77986,50.86311396600007,-0.9274197599999638,0.0 +77987,50.85437052300006,-1.6150077969999757,0.0 +77988,50.87002024700007,-1.6266508719999706,0.0 +77991,50.83081088900008,-0.17405638099995713,0.0 +77994,50.86093558500005,-1.4842016119999357,0.0 +77995,50.86332539700004,-1.1664131779999707,0.0 +77998,50.84285482700005,-1.1780591519999462,0.0 +77999,50.83973057000003,-0.6680120949999377,0.0 +78000,50.849788938000074,-0.6553429529999448,0.0 +78001,50.86445432000005,-1.7982679979999716,0.0 +78002,50.86137016500004,-1.7632895349999558,0.0 +78003,50.83921519000006,-0.5878696009999658,0.0 +78004,50.856007530000056,-0.6053305609999597,0.0 +78005,50.877914479000026,-1.2951471509999806,0.0 +78006,50.844762615000036,-1.2970472099999597,0.0 +78008,50.84708211100008,-1.472821693999947,0.0 +78011,50.831252207000034,-0.5061908649999509,0.0 +78012,50.85307898600007,-2.0390118319999715,0.0 +78013,50.86029429700005,-2.0283220439999354,0.0 +78016,50.850528703000066,-2.034381848999942,0.0 +78017,50.84337951800006,-0.5519717939999396,0.0 +78018,50.82683517900006,0.026384447000054934,0.0 +78019,50.84362786200006,0.045685029000026134,0.0 +78020,50.840311832000054,-1.1679034039999578,0.0 +78021,50.827975181000056,-0.2934267339999792,0.0 +78025,50.85209945300005,-0.6931420249999292,0.0 +78029,50.82934800500004,-0.5363681469999619,0.0 +78030,50.826377824000076,-0.3584696259999305,0.0 +78031,50.823667570000055,-0.1360430159999737,0.0 +78036,50.84948468600004,-2.0371354389999397,0.0 +78037,50.84053013400006,-0.7024470009999391,0.0 +78039,50.84487059200006,-1.4623167169999647,0.0 +78040,50.84737038700007,-1.4582128519999742,0.0 +78041,50.81673217400004,0.34548370300007036,0.0 +78043,50.83556407300006,-0.4736324889999537,0.0 +78044,50.85554083000005,-1.8526046099999576,0.0 +78046,50.867447748000075,-1.8811011829999416,0.0 +78047,50.83361715700005,-0.8098231759999521,0.0 +78049,50.84067465600003,-1.4905364879999752,0.0 +78050,50.84148699000008,-1.4639882909999642,0.0 +78054,50.84541530800004,-1.6113607399999523,0.0 +78055,50.86050564100003,-0.9058289409999247,0.0 +78056,50.82969344700007,-0.8180705839999405,0.0 +78057,50.812589814000034,0.03411691200005862,0.0 +78059,50.84191370700006,-0.34674651299997095,0.0 +78060,50.81004339000003,0.03619759600002226,0.0 +78061,50.83649280000003,-0.9014432959999681,0.0 +78064,50.839304576000075,-1.474677326999938,0.0 +78065,50.84817037100004,-2.0240736609999317,0.0 +78066,50.853690132000054,-2.0094133619999752,0.0 +78067,50.83927947300003,-1.4851094919999355,0.0 +78068,50.82065083600003,-0.3496158089999426,0.0 +78072,50.85001851800007,-1.6493886439999415,0.0 +78073,50.84052691900007,-1.6043766279999545,0.0 +78074,50.84001167100007,-1.5992766849999498,0.0 +78078,50.83619349000003,-1.4633839809999358,0.0 +78079,50.83801956700006,-1.4632826679999766,0.0 +78080,50.837405905000026,-0.39233161899994684,0.0 +78087,50.822857845000044,-0.699648189999948,0.0 +78088,50.82569509000007,-0.6883722279999347,0.0 +78089,50.842889702000036,-1.7961801639999635,0.0 +78090,50.83744147600004,-1.7812960669999711,0.0 +78095,50.82624501600003,-0.81363500599997,0.0 +78096,50.82441806500003,-0.8123333939999497,0.0 +78103,50.807675379000045,-0.06042340299995885,0.0 +78105,50.80792763900007,0.2823593920000462,0.0 +78106,50.839897851000046,-1.3299508699999478,0.0 +78107,50.827319156000044,-1.3242343399999754,0.0 +78113,50.81733865500007,-0.03771824499995091,0.0 +78123,50.82020522800008,-0.4410206719999792,0.0 +78124,50.82492935400006,-1.3124627789999295,0.0 +78125,50.83314552200005,-1.3088648589999252,0.0 +78130,50.82068304200004,-0.5742058679999786,0.0 +78131,50.81923358700004,-0.5670852409999725,0.0 +78132,50.793827520000036,0.1443761100000529,0.0 +78133,50.80873186800005,0.1620982930000423,0.0 +78134,50.78954259100004,0.31571661700002096,0.0 +78135,50.83176238000004,-1.5822899549999647,0.0 +78138,50.83021805700008,-1.641390332999947,0.0 +78140,50.82959272800008,-0.8621675549999281,0.0 +78141,50.82254668100006,-1.5601085899999703,0.0 +78144,50.82116244000008,-0.7172779939999714,0.0 +78145,50.81282926100005,-0.6858736919999728,0.0 +78146,50.78897941000008,0.15165039100003241,0.0 +78148,50.80603711500004,-0.5674363539999376,0.0 +78149,50.80449929100007,-0.565738936999935,0.0 +78151,50.84174211900006,-1.9079878419999545,0.0 +78156,50.834406356000045,-1.8596419629999446,0.0 +78157,50.82424072800006,-1.854129458999978,0.0 +78158,50.82340103400003,-0.643325094999966,0.0 +78159,50.805862570000045,-0.6435891149999406,0.0 +78162,50.81345330500005,-0.8253055739999695,0.0 +78164,50.818769375000045,-1.5543738979999375,0.0 +78165,50.82227945200003,-1.547572220999939,0.0 +78166,50.78462282300006,0.15840787400003364,0.0 +78168,50.82466961400007,-1.9247262249999721,0.0 +78170,50.80574033900007,-0.8302680909999367,0.0 +78173,50.80576064400003,-0.8558696089999671,0.0 +78177,50.80003288300003,-0.5683946979999632,0.0 +78178,50.825944650000054,-1.7968963269999563,0.0 +78188,50.81749889500003,-1.580226591999974,0.0 +78189,50.815934008000056,-1.7671076789999347,0.0 +78192,50.78086145700007,0.14889531800002942,0.0 +78193,50.78250724000003,0.2958311540000409,0.0 +78194,50.81763965400006,-1.8805127639999455,0.0 +78195,50.816396463000046,-1.8620941009999683,0.0 +78196,50.79298101900008,0.05671375400004308,0.0 +78197,50.79545529100005,0.07978790800007118,0.0 +78199,50.814431282000044,-2.011459807999927,0.0 +78200,50.82955751600008,-2.000881495999977,0.0 +78213,50.77403805000006,0.1823179010000331,0.0 +78214,50.810173950000035,-0.6597052819999476,0.0 +78215,50.79468712600004,-0.6582680209999694,0.0 +78216,50.79631715200003,-0.6687209449999614,0.0 +78217,50.78575643500005,-0.6604484769999317,0.0 +78222,50.78478530500007,-0.6588938419999408,0.0 +78223,50.79517495200008,-0.7430909609999503,0.0 +78224,50.78563470300003,-0.7408669579999696,0.0 +78231,50.79893193600003,-1.3344712919999324,0.0 +78239,50.806648392000056,-1.3058561769999528,0.0 +78247,50.80373529800005,-1.988925242999926,0.0 +78249,50.86988949800008,-1.2058760349999602,0.0 +78252,50.76510156200004,0.14793632200002094,0.0 +78257,50.80836742500003,-1.3803895479999255,0.0 +78264,50.80044919300008,-1.1808263509999506,0.0 +78266,50.79305659600004,-1.9567021649999674,0.0 +78269,50.79219106900007,-0.7727414219999673,0.0 +78270,50.77910996900005,-0.7541212989999622,0.0 +78271,50.79346828000007,-2.0110122339999634,0.0 +78277,50.80302378400006,-1.424610156999961,0.0 +78282,50.75395534100005,0.20797882700003356,0.0 +78289,50.76640476000006,-0.7586314359999733,0.0 +78294,50.78460590000003,-1.4235962809999592,0.0 +78298,50.79570655600003,-1.5477218939999489,0.0 +78301,50.77451674400004,-1.559804073999942,0.0 +78305,50.781384983000066,-1.91730317899993,0.0 +78318,50.75999276400006,-0.7633820139999443,0.0 +78320,50.78165288100007,-1.9580935629999772,0.0 +78325,50.77803437800003,-1.7744337379999706,0.0 +78326,50.77577920200008,-1.7663087529999757,0.0 +78333,50.78115109600003,-1.8692285249999259,0.0 +78334,50.77395910000007,-1.896480338999936,0.0 +78343,50.76907787200008,-1.8728528699999742,0.0 +78348,50.75664888100005,-0.8482421139999587,0.0 +78351,50.775574938000034,-1.4819922379999753,0.0 +78352,50.76840348400003,-1.846565208999948,0.0 +78353,50.787766462000036,-1.8469801439999287,0.0 +78360,50.75590715200008,-0.8230548579999777,0.0 +78363,50.744985805000056,-0.8077916709999613,0.0 +78364,50.766615830000035,-1.4915879039999709,0.0 +78372,50.76136822500007,-1.5358532449999416,0.0 +78373,50.74045584600003,-0.8246423779999645,0.0 +78374,50.749788505000026,-1.525506815999961,0.0 +78375,50.76473491000007,-1.7421515839999415,0.0 +78376,50.754167694000046,-1.732039125999961,0.0 +78385,50.760028513000066,-1.7633361979999336,0.0 +78388,50.757172567000055,-1.8189359869999748,0.0 +78389,50.74983485200005,-1.7510544219999247,0.0 +78392,50.75115841300004,-1.329751976999944,0.0 +78401,50.74575042600003,-1.5241404319999674,0.0 +78410,50.74849490200006,-1.8268753939999556,0.0 +78413,50.77799810600004,-1.7908216089999769,0.0 +78414,50.74477220700004,-1.7671849739999743,0.0 +78421,50.750995954000075,-1.6821186619999366,0.0 +78425,50.750833674000035,-1.2891931229999614,0.0 +78434,50.73703814900006,-1.6533487469999386,0.0 +78438,50.77825747300005,-1.6186279459999469,0.0 +78439,50.743976376000035,-1.6266928019999796,0.0 +78442,50.73001354500008,-1.5704345179999564,0.0 +78443,50.73578443800005,-1.7473767269999598,0.0 +78448,50.728726503000075,-1.4157220979999465,0.0 +78451,50.734445710000045,-1.771804374999931,0.0 +78454,50.73714568200006,-1.7943514149999373,0.0 +78473,50.72479956600006,-1.2655289319999383,0.0 +78477,50.71900166900008,-1.3934905249999474,0.0 +78483,50.72048360000008,-1.4118741229999614,0.0 +78484,50.71514804700007,-1.4131112769999277,0.0 +78488,50.71545750400003,-1.3649299999999585,0.0 +78491,50.72538158800006,-1.8954701379999506,0.0 +78494,50.72950820900007,-1.2172787599999424,0.0 +78497,50.72276024300004,-1.1562004549999756,0.0 +78498,50.711699268000075,-1.4058267679999403,0.0 +78499,50.718763816000035,-1.2858301209999468,0.0 +78507,50.710100675000035,-1.4219287139999324,0.0 +78511,50.702927008000074,-1.293093613999929,0.0 +78514,50.702828526000076,-1.3051501129999679,0.0 +78516,50.701916640000036,-1.5023415869999326,0.0 +78519,50.70062430000007,-1.2900996879999411,0.0 +78521,50.69548960600008,-1.2863090409999245,0.0 +78525,50.700635883000075,-1.4836185329999694,0.0 +78528,50.689643140000044,-1.1012992919999647,0.0 +78529,50.69781476600008,-1.0909315299999776,0.0 +78530,50.70645776900005,-1.3678378799999678,0.0 +78565,50.69339793200004,-1.502982412999927,0.0 +78570,50.69786782400007,-1.4149058039999431,0.0 +78598,50.68396768300005,-1.2888513749999788,0.0 +78608,50.66923919100003,-1.2807541009999568,0.0 +78612,50.674612592000074,-1.1365295679999576,0.0 +78630,50.682891287000075,-1.3247208749999686,0.0 +78646,50.666172277000044,-1.2119334059999574,0.0 +78652,50.65500841100004,-1.1785183629999665,0.0 +78677,50.63566855600004,-1.3906661329999679,0.0 +78679,50.65101074200004,-1.2931349239999577,0.0 +78708,50.61901820500003,-1.3535174619999566,0.0 +78709,50.63843803800006,-1.2277642919999607,0.0 +78723,50.632650487000035,-1.2640093649999358,0.0 +74867,51.483265989000074,0.22673152200002278,0.0 +74972,51.460960055000044,0.297282310000071,0.0 +74819,51.49696806700007,0.07054673400006095,0.0 +74820,51.49619541900006,0.06920043200005921,0.0 +73660,51.737782623000044,0.45168040400005793,0.0 +74125,51.63309151200008,0.7544947650000609,0.0 diff --git a/tests/data/gis/catchment.dbf b/tests/data/gis/catchment.dbf new file mode 100644 index 0000000..c0ad833 Binary files /dev/null and b/tests/data/gis/catchment.dbf differ diff --git a/tests/data/gis/catchment.prj b/tests/data/gis/catchment.prj new file mode 100644 index 0000000..5ded4bc --- /dev/null +++ b/tests/data/gis/catchment.prj @@ -0,0 +1 @@ +GEOGCS["GCS_North_American_1983",DATUM["D_North_American_1983",SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]] \ No newline at end of file diff --git a/tests/data/gis/catchment.shp b/tests/data/gis/catchment.shp new file mode 100644 index 0000000..6eea2fb Binary files /dev/null and b/tests/data/gis/catchment.shp differ diff --git a/tests/data/gis/catchment.shx b/tests/data/gis/catchment.shx new file mode 100644 index 0000000..c20d4e0 Binary files /dev/null and b/tests/data/gis/catchment.shx differ diff --git a/tests/data/gis/flowline.dbf b/tests/data/gis/flowline.dbf new file mode 100644 index 0000000..457bf8e Binary files /dev/null and b/tests/data/gis/flowline.dbf differ diff --git a/tests/data/gis/flowline.prj b/tests/data/gis/flowline.prj new file mode 100644 index 0000000..5ded4bc --- /dev/null +++ b/tests/data/gis/flowline.prj @@ -0,0 +1 @@ +GEOGCS["GCS_North_American_1983",DATUM["D_North_American_1983",SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]] \ No newline at end of file diff --git a/tests/data/gis/flowline.shp b/tests/data/gis/flowline.shp new file mode 100644 index 0000000..ea52fe7 Binary files /dev/null and b/tests/data/gis/flowline.shp differ diff --git a/tests/data/gis/flowline.shx b/tests/data/gis/flowline.shx new file mode 100644 index 0000000..e6f441e Binary files /dev/null and b/tests/data/gis/flowline.shx differ diff --git a/tests/data/gis/jamaica_dem.tif b/tests/data/gis/jamaica_dem.tif new file mode 100644 index 0000000..1a66843 Binary files /dev/null and b/tests/data/gis/jamaica_dem.tif differ diff --git a/tests/data/gis/m-s/catchment_subset.dbf b/tests/data/gis/m-s/catchment_subset.dbf new file mode 100755 index 0000000..64483f4 Binary files /dev/null and b/tests/data/gis/m-s/catchment_subset.dbf differ diff --git a/tests/data/gis/m-s/catchment_subset.prj b/tests/data/gis/m-s/catchment_subset.prj new file mode 100755 index 0000000..747df58 --- /dev/null +++ b/tests/data/gis/m-s/catchment_subset.prj @@ -0,0 +1 @@ +GEOGCS["GCS_North_American_1983",DATUM["D_North_American_1983",SPHEROID["GRS_1980",6378137,298.257222101]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]] \ No newline at end of file diff --git a/tests/data/gis/m-s/catchment_subset.shp b/tests/data/gis/m-s/catchment_subset.shp new file mode 100755 index 0000000..3207413 Binary files /dev/null and b/tests/data/gis/m-s/catchment_subset.shp differ diff --git a/tests/data/gis/m-s/catchment_subset.shx b/tests/data/gis/m-s/catchment_subset.shx new file mode 100755 index 0000000..15455c8 Binary files /dev/null and b/tests/data/gis/m-s/catchment_subset.shx differ diff --git a/tests/data/gis/m-s/flowline_subset.dbf b/tests/data/gis/m-s/flowline_subset.dbf new file mode 100755 index 0000000..22afc9b Binary files /dev/null and b/tests/data/gis/m-s/flowline_subset.dbf differ diff --git a/tests/data/gis/m-s/flowline_subset.prj b/tests/data/gis/m-s/flowline_subset.prj new file mode 100755 index 0000000..747df58 --- /dev/null +++ b/tests/data/gis/m-s/flowline_subset.prj @@ -0,0 +1 @@ +GEOGCS["GCS_North_American_1983",DATUM["D_North_American_1983",SPHEROID["GRS_1980",6378137,298.257222101]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]] \ No newline at end of file diff --git a/tests/data/gis/m-s/flowline_subset.shp b/tests/data/gis/m-s/flowline_subset.shp new file mode 100755 index 0000000..6a4f6f1 Binary files /dev/null and b/tests/data/gis/m-s/flowline_subset.shp differ diff --git a/tests/data/gis/m-s/flowline_subset.shx b/tests/data/gis/m-s/flowline_subset.shx new file mode 100755 index 0000000..c202888 Binary files /dev/null and b/tests/data/gis/m-s/flowline_subset.shx differ diff --git a/tests/data/gis/test_catchments.cpg b/tests/data/gis/test_catchments.cpg new file mode 100644 index 0000000..cd89cb9 --- /dev/null +++ b/tests/data/gis/test_catchments.cpg @@ -0,0 +1 @@ +ISO-8859-1 \ No newline at end of file diff --git a/tests/data/gis/test_catchments.dbf b/tests/data/gis/test_catchments.dbf new file mode 100644 index 0000000..efbc61e Binary files /dev/null and b/tests/data/gis/test_catchments.dbf differ diff --git a/tests/data/gis/test_catchments.prj b/tests/data/gis/test_catchments.prj new file mode 100644 index 0000000..a30c00a --- /dev/null +++ b/tests/data/gis/test_catchments.prj @@ -0,0 +1 @@ +GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137,298.257223563]],PRIMEM["Greenwich",0],UNIT["Degree",0.017453292519943295]] \ No newline at end of file diff --git a/tests/data/gis/test_catchments.shp b/tests/data/gis/test_catchments.shp new file mode 100644 index 0000000..c15edba Binary files /dev/null and b/tests/data/gis/test_catchments.shp differ diff --git a/tests/data/gis/test_catchments.shx b/tests/data/gis/test_catchments.shx new file mode 100644 index 0000000..5d7cf9b Binary files /dev/null and b/tests/data/gis/test_catchments.shx differ diff --git a/tests/data/gis/u-k/CatchmentSubset.dbf b/tests/data/gis/u-k/CatchmentSubset.dbf new file mode 100644 index 0000000..e6faebc Binary files /dev/null and b/tests/data/gis/u-k/CatchmentSubset.dbf differ diff --git a/tests/data/gis/u-k/CatchmentSubset.prj b/tests/data/gis/u-k/CatchmentSubset.prj new file mode 100644 index 0000000..b13a717 --- /dev/null +++ b/tests/data/gis/u-k/CatchmentSubset.prj @@ -0,0 +1 @@ +GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.017453292519943295]] \ No newline at end of file diff --git a/tests/data/gis/u-k/CatchmentSubset.shp b/tests/data/gis/u-k/CatchmentSubset.shp new file mode 100644 index 0000000..cc6a970 Binary files /dev/null and b/tests/data/gis/u-k/CatchmentSubset.shp differ diff --git a/tests/data/gis/u-k/CatchmentSubset.shx b/tests/data/gis/u-k/CatchmentSubset.shx new file mode 100644 index 0000000..3de261a Binary files /dev/null and b/tests/data/gis/u-k/CatchmentSubset.shx differ diff --git a/tests/data/gis/u-k/DrainageLineSubset.dbf b/tests/data/gis/u-k/DrainageLineSubset.dbf new file mode 100644 index 0000000..e4db4a7 Binary files /dev/null and b/tests/data/gis/u-k/DrainageLineSubset.dbf differ diff --git a/tests/data/gis/u-k/DrainageLineSubset.prj b/tests/data/gis/u-k/DrainageLineSubset.prj new file mode 100644 index 0000000..b13a717 --- /dev/null +++ b/tests/data/gis/u-k/DrainageLineSubset.prj @@ -0,0 +1 @@ +GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.017453292519943295]] \ No newline at end of file diff --git a/tests/data/gis/u-k/DrainageLineSubset.shp b/tests/data/gis/u-k/DrainageLineSubset.shp new file mode 100644 index 0000000..43f6723 Binary files /dev/null and b/tests/data/gis/u-k/DrainageLineSubset.shp differ diff --git a/tests/data/gis/u-k/DrainageLineSubset.shx b/tests/data/gis/u-k/DrainageLineSubset.shx new file mode 100644 index 0000000..383a01e Binary files /dev/null and b/tests/data/gis/u-k/DrainageLineSubset.shx differ diff --git a/tests/data/gis/uk-no_intersect/Catchment_thames_drainID45390.dbf b/tests/data/gis/uk-no_intersect/Catchment_thames_drainID45390.dbf new file mode 100644 index 0000000..3ca7239 Binary files /dev/null and b/tests/data/gis/uk-no_intersect/Catchment_thames_drainID45390.dbf differ diff --git a/tests/data/gis/uk-no_intersect/Catchment_thames_drainID45390.prj b/tests/data/gis/uk-no_intersect/Catchment_thames_drainID45390.prj new file mode 100644 index 0000000..9855fcc --- /dev/null +++ b/tests/data/gis/uk-no_intersect/Catchment_thames_drainID45390.prj @@ -0,0 +1 @@ +PROJCS["WGS_1984_UTM_Zone_30N",GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],PROJECTION["Transverse_Mercator"],PARAMETER["False_Easting",500000.0],PARAMETER["False_Northing",0.0],PARAMETER["Central_Meridian",-3.0],PARAMETER["Scale_Factor",0.9996],PARAMETER["Latitude_Of_Origin",0.0],UNIT["Meter",1.0]] \ No newline at end of file diff --git a/tests/data/gis/uk-no_intersect/Catchment_thames_drainID45390.shp b/tests/data/gis/uk-no_intersect/Catchment_thames_drainID45390.shp new file mode 100644 index 0000000..02793b7 Binary files /dev/null and b/tests/data/gis/uk-no_intersect/Catchment_thames_drainID45390.shp differ diff --git a/tests/data/gis/uk-no_intersect/Catchment_thames_drainID45390.shx b/tests/data/gis/uk-no_intersect/Catchment_thames_drainID45390.shx new file mode 100644 index 0000000..557a16b Binary files /dev/null and b/tests/data/gis/uk-no_intersect/Catchment_thames_drainID45390.shx differ diff --git a/tests/data/gis/uk-no_intersect/rapid_connect_45390.csv b/tests/data/gis/uk-no_intersect/rapid_connect_45390.csv new file mode 100644 index 0000000..10360a5 --- /dev/null +++ b/tests/data/gis/uk-no_intersect/rapid_connect_45390.csv @@ -0,0 +1,5 @@ +45277,45335,0,0,0,0 +45335,45390,3,45226,45227,45277 +45379,45390,0,0,0,0 +45390,45398,2,45335,45379,0 +45398,45423,2,45390,45490,0 diff --git a/tests/data/k.csv b/tests/data/k.csv new file mode 100644 index 0000000..ec775eb --- /dev/null +++ b/tests/data/k.csv @@ -0,0 +1,4168 @@ +8265.950531429184 +253.03887592270559 +6921.322781728495 +3000.319909478301 +1340.7196489071698 +2397.068178432014 +3483.5770407404507 +4138.417920002835 +4152.480520434225 +1654.7576991649585 +2565.9729251578415 +1265.9359981907135 +687.9699241148335 +56.503843657228096 +1451.27509134853 +8337.99481442263 +2240.425470640154 +782.6910927720255 +6385.9944414629645 +495.59901465541594 +4458.13809647332 +1307.586539741531 +7522.444771007285 +3440.1004031958723 +1042.541576313678 +754.1490886791574 +2361.9638507153986 +2505.438033899171 +2074.58737439611 +624.1821222839335 +1146.4012338847424 +1807.695520336944 +9114.849526199934 +5296.838884246875 +1114.1769659265349 +6448.970017161944 +2491.0616126316686 +1041.2016503420768 +4644.96934128283 +6987.921373561135 +4351.600764835345 +825.3501164966085 +12169.109401668939 +2934.643423557811 +491.05123363631293 +3104.955883464624 +3352.8298187374335 +3043.697461958111 +5388.94704069631 +2557.4199425799707 +2299.630467599402 +3230.6833550822917 +246.17338766016954 +1734.243088738307 +10750.934407835053 +4530.111709950925 +7662.006801562259 +2572.8266895866254 +9223.927579471745 +4216.2095568586 +1618.0155824500218 +3920.455356937945 +6027.27266021692 +3069.5505658975217 +959.5060289942714 +1614.9646140632165 +8339.20843487753 +2623.036542022109 +1798.7398612187617 +1108.0213951759365 +2738.6283896581153 +1127.6417048532403 +2027.4413328776493 +1578.4379307640052 +6600.247871872095 +5580.88488054258 +601.2329612497144 +1369.3836596120098 +1481.7145420477643 +190.63272824852902 +7326.031433589295 +2827.410289936645 +6025.897083033694 +2598.5678029482533 +4407.09707705792 +2758.7247453200994 +5019.299067436745 +4117.690631483344 +3228.9313377666135 +7213.910986404325 +726.2375654417765 +150.6860150487174 +7492.94622638884 +257.2371902424933 +4953.0240067757395 +2735.1919269273058 +7958.5735295788045 +6576.758727162261 +8137.47668980771 +2435.414613886145 +4184.687892066885 +169.5289181798597 +5045.652733584119 +7571.62377958413 +1230.4778469894188 +2892.5196331766 +508.0289311015975 +2998.2858600563186 +4991.1066780159545 +1971.530580335274 +936.1212467829495 +1923.1676864453584 +6027.959496277389 +6156.178465309425 +1288.8803279529204 +2723.2547401871525 +9770.546362578225 +825.4082192088739 +2289.8790847680543 +2935.099159048336 +2996.46444409641 +1373.316409840207 +2156.04014883278 +3396.138967932669 +1368.0210462059224 +2687.989097131429 +2817.3585674716405 +586.5616466109365 +2021.0486964205475 +6658.26485322355 +56.489002616361695 +4668.262459300405 +5240.43890335749 +2061.701370408281 +11021.382252717445 +4610.8653465315 +131.7957497702293 +932.4239696817709 +1077.0558418619194 +777.9216051590164 +3330.187613542643 +7476.2368275259 +3605.793747775345 +37.6730768540861 +1946.1391306976675 +1989.7703089610077 +2646.733627969123 +4016.6461903018144 +3653.34220119834 +1856.6521625397443 +1165.2517700990038 +1119.1574301859455 +1787.9910852597814 +7372.3705454202645 +2925.534169794866 +2683.915834175604 +2387.621190575943 +635.032759044208 +3064.2808225599993 +9984.972392107826 +3122.183853766869 +534.421970155164 +724.5908624553164 +605.3221792047115 +416.8868759727735 +4895.1123832699195 +7228.600236360895 +1771.058248211777 +680.492335810273 +3942.392028254155 +7393.127698963265 +3136.6250765857835 +2230.3530877583094 +136.35423960976578 +2717.9462427146677 +4052.09610352218 +4545.481676228815 +1410.1128411589168 +494.5089905969605 +3429.4053466630826 +6792.583537695795 +3629.26718331919 +1349.2740449394114 +3780.7593747194596 +5724.51420842252 +200.7311210693824 +1184.023166853415 +5769.211850764495 +1465.6918655983588 +3612.8346587911547 +2438.1284354606723 +610.5495798145134 +1371.8941966111024 +14627.083480417414 +2944.290558505212 +37.65852346709425 +4389.892093550705 +56.48923436808819 +7893.406886492994 +8939.223127753134 +4084.32871193508 +6485.710755766584 +616.838502519925 +3649.8192490260544 +5434.3888922201195 +1985.8747413425515 +6777.487808596155 +3925.5241393897545 +119.86943118205684 +4195.307065981605 +9016.99124408264 +302.7091945873982 +3137.0682736075028 +997.1951341548139 +931.191826706757 +2719.1421718630854 +3933.8947015650447 +6465.489410559129 +8201.284896233345 +5534.977339196619 +13412.325539273848 +7743.639008031149 +5325.75110587499 +4852.489243814484 +564.4424521412145 +4762.32075854052 +4471.723228823865 +2659.9490911433404 +1806.9147970880335 +912.2868250502929 +6014.489734372314 +4566.39147102894 +450.154697940801 +5677.619997642704 +3903.0037378669745 +1468.50242669095 +2187.621658328967 +1841.355079682125 +6151.202695346905 +2755.9303639987525 +1440.7391240835145 +2732.8563952364184 +3061.657122142713 +2006.311442324063 +2974.46876084687 +3529.5280624337997 +1487.6542373632765 +2954.7740468612133 +5222.189030757545 +2876.239665623849 +1559.8687548800929 +5654.79153197084 +976.5730235995089 +7590.086238153439 +2916.05981889978 +2915.3602848355645 +1457.1001695986959 +2231.0817448839953 +1603.9573777535632 +4838.503741830849 +5686.550662272829 +5923.20000704838 +2408.8125399187006 +4203.041288888365 +321.54144049095004 +5101.294268099469 +1339.492712879489 +9223.945458335264 +989.973993993047 +9466.72612769646 +3608.859743363245 +4970.940288244805 +5797.350295715544 +3965.9926586302395 +3451.669025925834 +9241.45035716931 +5371.082359299405 +1735.2832539610258 +2267.6407632769447 +6919.562181349755 +8506.710641571415 +7126.373334325945 +619.018480675588 +3494.867516186672 +702.8529623226615 +2854.7956922894778 +2320.9651685980234 +3276.7823234317257 +5201.238196171535 +1840.6648405510084 +11340.61124695471 +1435.4123414315825 +9160.532773873949 +3106.5991945195897 +778.4725241324114 +1070.833930423894 +8175.112632451799 +2547.9525298550257 +6608.56254757349 +1464.673421909705 +5588.386345188849 +3234.800668875954 +1757.350959946218 +13999.409394119239 +2625.46708449123 +809.2846994102604 +120.80178217153795 +4645.761790559364 +5614.456005041729 +2019.6323665304708 +4076.1567521198995 +2765.877705773798 +8564.35941579974 +6932.785725131735 +1517.6431755345175 +6955.12941621463 +1471.1855249084103 +2137.2297342389666 +3396.0139447851398 +789.5462586349485 +11497.962222989374 +5112.92419808793 +8653.620089199574 +4417.015477198695 +5777.16665334487 +2200.2647786038847 +8659.9674423136 +2946.2065922625975 +7567.991207498364 +1517.90369687383 +3135.174448322661 +5219.739763782915 +6328.4629866130745 +1101.8380176235248 +1304.056169290553 +8765.198315656438 +2623.739919555433 +3256.261287521305 +4482.26964264856 +3439.809149537187 +150.6602319116391 +3679.656134886935 +1475.642906271702 +5046.425881882629 +319.54502193233617 +230.52129756992278 +1369.9760943380259 +1184.88863753827 +1653.2110898475094 +1948.0810881071995 +598.6548714008904 +6677.444311074215 +3432.1069082969793 +7429.642085961795 +1279.7242667122794 +2664.6560773555207 +12423.303309074943 +846.3388115228339 +3139.59205478156 +1044.0255719186055 +11474.304648376008 +7354.470291765869 +7300.538191702454 +3159.8726978390528 +280.53457652852484 +5451.733542403715 +2665.8216376963287 +301.3550756246646 +3844.26441725102 +912.3579622139324 +6156.8721192515595 +4311.491380992669 +8146.708376880569 +12444.970533193764 +3372.231518517078 +8697.159382711308 +12791.872453140024 +5648.541098442444 +3729.32629120772 +1228.319254589217 +7781.135829899494 +6241.83939104411 +2566.2775202672333 +4054.893388388045 +3535.4907725548946 +7925.421055564319 +3902.7197350778697 +3879.515680300785 +461.4351733487265 +8061.071770063095 +4215.19605885021 +1861.3848559768314 +1046.4265943297144 +11405.565558255785 +3791.16246160554 +94.1769600022384 +2479.3907307231507 +7522.23930269147 +1823.3179208140816 +2315.534024477961 +1152.977179552009 +112.9573431489979 +2573.085618798597 +1331.400075525625 +1339.80343413791 +1093.651242686954 +1723.422779403332 +3659.8848639049193 +4688.742233184064 +2275.8725466360834 +495.35359629895646 +3906.9207013709597 +1894.75871961838 +6095.308435263285 +2894.786890105635 +3322.8469414655797 +7338.120580281015 +2256.936670564303 +8180.924370710665 +763.3017624318134 +5062.519853618464 +94.1722632970091 +1200.0187535842344 +2081.2720665296315 +1044.9139241117605 +4311.697510626449 +1939.5302375556694 +758.6686174300485 +5182.020285295 +3660.2078628018394 +580.608468014911 +1070.8645289724025 +12501.87132630114 +3784.8666112825745 +528.5816549079709 +1803.3533975017258 +1940.6863139683178 +1547.525775042751 +5141.70148160508 +716.0665819650104 +3262.6657639094888 +13952.72527646746 +339.3249608064379 +2746.894253061105 +1089.3061152218315 +7463.694430729704 +8261.94782229824 +4295.243135160495 +382.4582078168005 +1499.189524650734 +1264.7618353671348 +94.16563941216285 +10565.031573289445 +3431.100861096072 +3863.52806908971 +970.9727302339925 +2108.991125056207 +4789.420637831375 +2201.9483623647266 +4701.83236499585 +5224.5514395674945 +5760.353683365925 +4260.583959031715 +1375.9864461223406 +1364.1016356288474 +454.69996552941797 +8114.3921401697335 +1849.760054526902 +7455.954691940895 +4961.7991144770995 +1540.8598706757025 +878.2699500992584 +16740.21554567523 +4462.168731800185 +3397.0670281670605 +1060.4519485723133 +2777.246375607193 +6630.308675944695 +2646.059325364451 +8334.46652166338 +7268.7831635076 +6196.700286767165 +2192.1329515739358 +4764.113805780525 +15250.74459031809 +3749.387659052385 +4964.57917683819 +5111.228578365594 +1532.8333729473031 +2698.2085471258188 +5810.395165654694 +1253.790917931188 +3222.7028633510545 +7359.034241461699 +12584.743450773758 +1206.3346418831295 +4654.31927017015 +561.3150751272855 +4999.600483401089 +4213.171188160864 +3215.179156279433 +11227.329207194764 +1757.9256858067101 +678.1213745282935 +4463.43269061081 +966.583154847814 +2741.548685429484 +2039.4287062375204 +3018.873710243097 +6056.745235561894 +1251.6288390119043 +7310.19073157667 +8050.055750894115 +646.3436929936139 +112.99809541805084 +984.7296478582253 +3208.2366821669884 +4247.54385589464 +4694.9794212486195 +10520.75781910363 +960.8816706215509 +1635.5663171770088 +685.926065327923 +189.69546319344565 +1748.6804601557408 +2289.660154325334 +1561.6966240505942 +3700.312129024595 +2903.8475408809363 +1986.7064859164736 +6799.217017499655 +270.41745409462595 +3020.147758870655 +1385.9212813463184 +2184.6630568819523 +2889.4077225299015 +4723.5336489005695 +2278.79625001896 +1020.4282086946639 +3081.2131764776636 +1695.4348761325568 +5719.9057020154 +4931.02204134505 +1550.6603795986869 +352.75218182445144 +1861.0387595959705 +1886.385323718644 +371.593348159432 +4363.216897895065 +3960.178473201615 +75.3436127837078 +6392.75673645392 +14167.050560962985 +4565.602540983855 +954.54239594784 +3020.0397264236917 +3416.379895574226 +5819.594649785279 +13778.931422528123 +2914.8193742740136 +4277.34701305548 +4486.134859889865 +3653.43637380134 +1762.303007100496 +2875.8089107252117 +3513.32932793927 +8067.947888699824 +1443.246040973093 +1500.0390711435396 +1260.5900447529898 +991.4338765787959 +5919.230773925174 +2716.660924683324 +1611.6186389434495 +1466.9008234883345 +3502.3967229983195 +10092.223735320615 +2107.253715321737 +1093.3758627790983 +1886.627889702927 +1180.7130121507594 +3273.090039549767 +1374.261295443232 +11890.59711102438 +1921.8505167451412 +3064.399587403798 +3232.0000483552285 +7911.902446107974 +4669.647978344019 +1714.0403815745244 +5352.399850254625 +4766.64342328377 +5749.24297713808 +13514.16692372292 +13960.96833844328 +713.8007564463825 +893.8473102536319 +5914.744735039385 +1403.78098589365 +5111.700901057415 +6409.577092677745 +4306.796644564155 +975.1103006171625 +1083.145848474592 +3292.9912584457315 +4312.540228050109 +1290.914799858999 +3196.108558660262 +6314.497005565734 +1790.7142915279414 +3194.838038131502 +6521.636883152579 +3324.1408283092733 +2699.0797159360927 +5127.85752452855 +1409.694691256383 +3239.9774994179875 +7809.984335697284 +2889.6679566264265 +4544.49378841591 +56.47450966928504 +2508.99316319722 +5121.30065324878 +1688.6808297942273 +6100.53504823693 +2924.544673881985 +1872.8677406056204 +1012.1146335968325 +6894.3614271150145 +649.9343871673135 +807.471933052652 +1768.8185359979643 +1977.1816942380508 +219.57595036339796 +5320.562458010204 +1554.204537059706 +953.7313115727145 +9107.67855894505 +2539.7783467120503 +465.6387948274965 +5474.1729042558945 +11830.53146960692 +3531.9912676237345 +313.69390753835995 +5599.77010135774 +9546.329688940064 +2035.9223620603557 +928.0675789581385 +1586.563399635746 +1393.9285738367043 +3852.7701085088947 +4096.016877336299 +4832.112089670425 +2243.551607976042 +2024.7036290251713 +4117.46426636671 +5415.377234501289 +2924.270624169265 +6477.70521924582 +9140.917161562025 +9580.901647783094 +2520.970613139888 +1968.0811760518404 +2844.8123588578014 +1630.426671762336 +2075.2693295783015 +6351.000086100739 +2236.010926486869 +7699.725014284625 +5059.01879688289 +10821.561031783354 +6571.649205650235 +850.209055538563 +2009.3988675623061 +757.4514671291574 +1746.937262623567 +2344.91638569426 +339.0493724036849 +1217.209658226884 +5082.3820714002695 +6704.452876242694 +4846.587341188844 +611.2968084141485 +4742.278332479765 +11920.294428102305 +4530.7993626602 +6942.6374484411 +2865.832404425977 +6473.83140066103 +6555.503214468599 +2598.427193550664 +1131.843440123221 +6502.80832366459 +352.74919290442296 +7866.09907896722 +979.5750777870888 +4189.550613613645 +214.97025528307105 +713.5968254613939 +4780.32003934926 +569.006945792628 +2922.0513940320952 +5103.356400923724 +1630.9961907711568 +5199.84633184163 +11378.675951486059 +1637.413684625831 +6107.731743645069 +3230.2992881868026 +586.364547171032 +1571.595010398805 +2051.8047754070717 +7023.866287433485 +1989.3387398368677 +8017.76220511161 +1199.0811107564343 +3048.0116880441446 +4601.908445391635 +1770.2080579952756 +1686.707889665981 +1235.301614191267 +4299.8738613705 +3244.897908443849 +3936.6276360571646 +5862.878537357029 +15714.03523853786 +6921.922761346459 +3626.93046501618 +6449.11410278429 +7930.296218113325 +7290.201908595969 +5524.8971423494795 +6916.82081020154 +912.2049888534939 +10765.787367625919 +1726.590906094334 +916.2910110638514 +7074.077013761274 +1332.191371618044 +6039.985034904939 +824.9879978856076 +523.2232306124985 +2456.239929450489 +5168.86220805227 +3783.3148287751246 +900.3315777708943 +5681.150965961904 +3557.002367766505 +1049.9693887404364 +5221.949613209979 +1510.1279594849452 +1251.8053017721334 +5415.71369648113 +5158.17195695788 +414.37128099282296 +785.3928645641505 +2433.9846633297057 +2962.262235056316 +2838.1948570179784 +12243.998935106783 +943.849650375926 +9447.160488141635 +6176.884709861599 +1194.526751701458 +1945.9479995471108 +3452.860068353451 +2897.317088612114 +454.7084221877085 +7140.270789828434 +6872.406496016564 +885.4437486235948 +2690.7334883740955 +6469.866903749445 +2178.8630505978454 +1293.277079418926 +2491.195019300529 +771.6618615769664 +1827.0757742176938 +544.2770698805124 +5622.01603575269 +5370.9446368571 +1119.177883762855 +8712.264708738288 +3338.05880529716 +4453.180093795684 +644.4643120669319 +4160.295810262165 +2340.8693307941758 +6321.440793852169 +1243.2358187966186 +18389.56409190544 +8064.708129283645 +359.2401787905245 +851.6022312479535 +2123.8436650167205 +10371.023599410144 +2766.8697792672647 +4771.41455239757 +6309.974825048755 +771.3336918906849 +2057.3097242857357 +1239.6633588759419 +1915.110235923899 +2469.509965867882 +4352.770537153745 +2445.774263886191 +379.384161072532 +4376.56586621681 +5923.508308775994 +2346.802889037351 +2078.106053998439 +1999.148320967917 +4998.7262024231695 +2801.457338632897 +710.3806758151389 +3368.995724851771 +4085.532522443015 +10353.17517079188 +5299.71314266373 +1293.4727303633729 +627.5077543916825 +2700.8152621672075 +1712.6692273750884 +1209.479722041808 +2955.0799631711607 +2542.5658140717483 +9760.347798771463 +4002.6142901253943 +5372.90091046947 +8078.2823419935685 +5006.958167292654 +1065.1999341840885 +2401.1384579263863 +3307.852229608433 +1638.3529156391457 +4046.613293659965 +2986.474196609379 +450.12025767275696 +655.9542782606135 +2859.4630732663168 +6287.7212641355345 +1540.208670929824 +23943.78903188916 +2184.3866738090005 +4607.608927168169 +2790.3545446139615 +3029.9718400488423 +4899.6744018131 +2005.060506596735 +1006.6765193584014 +112.99145565122274 +1630.2473230243268 +3300.7299041747765 +1754.857898357494 +2186.3033705313496 +4215.360256383255 +7017.2568781674445 +3901.04008483287 +11011.95614980433 +2807.833981899744 +19493.014432129068 +263.653744939879 +244.85238118013012 +490.11666286664547 +2954.9629794948864 +7829.016907395145 +1339.111140634589 +527.499403946571 +10463.29833381574 +4004.3012465867246 +5467.933964741675 +5858.241395095494 +2385.20770233698 +3013.987639644058 +5749.574120491845 +12563.127212268113 +3648.3627711786144 +94.17161031987659 +23828.538678963338 +2984.802688356188 +629.1960882518115 +2627.297588974677 +1977.4769366756004 +5212.600653957059 +1375.1706689475684 +1079.413607478864 +4989.393919374164 +1236.8074786170075 +4765.216040097555 +2958.746582720792 +487.792937232734 +13096.60369608577 +1174.9633475005753 +823.0214864514754 +3057.407966790625 +22058.430248892866 +489.00763457098344 +710.4347159979825 +2833.8878941710745 +2114.7773203188694 +4149.4032856228405 +5915.038197029115 +11928.19523525448 +6318.706558576405 +5021.045053123469 +2733.402806550409 +32445.425317005538 +4043.0278516373196 +396.64761616323545 +14195.047626663503 +2017.494269523985 +425.5532722414855 +2525.061016419039 +4005.9223407398995 +2423.3731032069472 +2491.236642063127 +5404.9878190035 +4114.961607493275 +5469.375677291015 +2897.0620764138407 +6374.425590757979 +6636.457128764504 +8779.4509371058 +2260.3511161718166 +2620.588042289938 +11611.190750204569 +128.5565041380991 +3545.7904972904043 +1338.768271074262 +1844.1358268878298 +4063.827743454605 +1207.6941119242229 +75.34825053275975 +1533.897766894612 +9461.770890712034 +1775.2029457845936 +2573.999396263953 +4167.296848982505 +5530.872445483315 +5725.91746435156 +5794.900660253389 +1754.834264663053 +6088.200147842926 +4862.983982268614 +686.950708932936 +2998.4994769885957 +3355.0850553284363 +16263.90518864139 +2625.9585600380087 +456.93686123319145 +13291.047512419564 +589.580367765137 +5184.385323700484 +4225.75981428629 +6644.948964729075 +729.1263861515199 +6639.977450071734 +1282.221763595514 +2492.5908213812095 +7320.64352573897 +5786.870060577409 +1720.7397153673019 +94.1806484310916 +4171.28442904516 +3822.5761698313695 +8424.74343166414 +5494.13191414416 +1432.6535162541034 +2632.508811920813 +2456.401145575153 +6226.004311152465 +1933.855057364279 +413.6529839719515 +837.4211916490525 +5467.472214739885 +4052.95270959726 +4259.443485072965 +2616.10611606351 +3961.2668804339046 +1189.1470657578222 +769.8845644247695 +4130.87809174649 +3390.8029315956946 +1741.2699658877948 +1836.7893148957519 +1204.888608244867 +4767.1227788755195 +6023.60966842964 +12959.321556582694 +9949.069427515295 +2015.0392043096908 +11226.661974159555 +3765.6440414986046 +4723.149849026279 +4441.94131164301 +5895.297319628045 +1545.6823629204018 +4150.64805507534 +2174.055417966964 +9103.953677217349 +7503.767707450769 +2410.8728245290745 +5834.432685817645 +2368.163227137106 +4416.78697407563 +4142.466453916315 +982.2664522686854 +10941.768957114378 +3615.392168483795 +4864.59107503152 +1227.4917647433244 +5812.056590536805 +5849.31246275208 +1780.605234320738 +5432.521161193979 +3657.4845157507993 +185.13813327344616 +528.1465764552249 +3590.729067205385 +2029.5049599148201 +4680.45210000284 +8614.21573521929 +1111.6906233302554 +3399.420147611544 +696.8625316848335 +3963.9577331308496 +7456.703207583 +75.3365190558379 +2593.478576164882 +749.6947424458309 +624.1437984234459 +2033.2891663584326 +1663.7951444451119 +1604.4780296114884 +957.286877265222 +1041.90206406146 +2717.1313157963027 +3482.403310369469 +8797.287482906893 +1344.494998448595 +3905.881061354615 +3620.1761055168795 +12113.73004349725 +16912.659872573007 +537.883388716464 +1642.963101917557 +1995.901100910031 +7259.232676318665 +465.5161134696484 +381.469673957554 +5136.967534880615 +1196.5259984974973 +1525.6368771653658 +5589.395640624284 +1887.559411290903 +2181.7811792516914 +248.3534555731995 +6152.73458431149 +214.9019890813453 +4488.770093549735 +9463.2118994623 +6271.044046021405 +2623.4800650740917 +4602.167649425394 +3058.143753043274 +2369.877227242899 +2452.993227476015 +150.59506405482767 +3185.014387978244 +5947.304237424305 +2710.775905212123 +1842.781791285589 +7370.627636346694 +6443.458685178025 +5637.806321516495 +1162.4158485826458 +1226.4656341851269 +5971.49350925351 +2080.421575782896 +543.1069845755784 +2930.797028773932 +16196.382018834815 +2767.9897767789785 +1807.8308574334853 +1920.203935751822 +2740.779436208009 +1271.0452561295824 +3348.8364868904855 +675.6108955188355 +8245.86834824655 +3356.528723528449 +10684.837261506484 +6353.57116960587 +19453.453540435916 +6487.225856928109 +4087.115075974035 +9538.061104083574 +4757.8599697193595 +8246.24406521979 +3808.4124220692543 +4988.545205873775 +5204.22929818827 +3207.076522523408 +3552.395234073175 +7148.18926451315 +4064.41119993335 +6146.0775480419 +3348.183032714597 +901.6894328099629 +4797.985541522809 +9516.03143340689 +4033.3929852966744 +2763.780045694654 +7043.304672359654 +4905.97080349649 +1689.8651378773534 +2805.6146813879695 +780.7389214567634 +4650.73816087202 +7031.392122617065 +3319.7957587389033 +4071.99123993039 +2067.5647519716663 +2741.768394296085 +1578.9758987973107 +6651.57767084349 +7826.268263485665 +6553.694232350579 +1052.1092227730314 +3508.71928822863 +7817.103305754225 +14222.835962539084 +1592.365031214867 +1965.6103430881012 +1369.80040419418 +8065.49812503568 +16626.728014022945 +6507.145242136629 +9572.89636863245 +7224.966876570275 +16430.17022343459 +3945.2434108688294 +9508.504766949824 +5973.412850944979 +3048.9875696448134 +4546.081258751725 +2322.0986502341634 +1374.9287523469086 +2300.628000505842 +5707.63714223255 +2791.202997992258 +324.74055463225596 +627.416077230271 +7808.0215764460345 +10361.799256140954 +4742.3219445614595 +7487.399587908589 +2871.3886657057346 +5522.437952504165 +3193.1841806191915 +1174.6428234999078 +4792.897927396495 +1837.7447699594584 +8937.244189888313 +1668.9193040286025 +2422.9792509364397 +8488.338108421955 +1036.0635026577988 +5858.754495747019 +743.496258506148 +8521.086648708095 +6495.073484988515 +1526.0693609628563 +5763.942755337794 +4923.36473973729 +3704.0679593461596 +4842.452688242504 +7341.498638208 +3109.504155274678 +622.157025102018 +5937.752714385309 +1621.2547642307554 +537.817439433162 +4446.87198793838 +277.4275028587265 +7409.13160535128 +2121.2122910481335 +7467.424387535979 +415.444586446442 +1487.7182998272663 +6940.788485115205 +4584.15133523137 +1551.29431834188 +3615.8150760238145 +1678.4019537439137 +1040.6190771405309 +2129.579480401303 +2651.010951050469 +5978.374796544149 +7119.106077684544 +2492.339817679047 +1723.2414060140998 +909.0805208564835 +7801.766013610939 +567.4499116393799 +1618.296846500866 +319.625358675413 +4894.701215345025 +3018.056538837879 +1905.3688383560389 +2980.4309594795463 +3313.7918551873026 +2101.8474974187952 +4351.669207824119 +765.9961279536825 +1523.48381030146 +993.6345633023179 +15857.71792713059 +2306.280280362786 +8308.69708364367 +1830.5907065640563 +4555.2391100686045 +2163.5093527467593 +592.5916376578905 +418.98737375755394 +6017.751638557819 +3147.443371750118 +7556.860240248199 +3506.5214624388545 +207.20837171826923 +4230.983022313005 +5435.676372891729 +7475.127514434859 +2364.1748750697066 +3862.8379555089446 +1824.6235553561469 +4766.57110463184 +8322.56534052503 +3316.04925261779 +547.3979826712599 +7342.535418956395 +11738.358937998208 +10440.934802369646 +4859.1249487244095 +2545.471283409068 +410.4252189187115 +2246.056493106713 +7013.0528914271 +904.6824386137089 +2098.6950889441287 +6606.0751122578795 +1504.797134430884 +5597.781758805845 +618.9836190015379 +6522.0162806206445 +4036.9880183794 +268.1562630683363 +4664.825792120025 +3154.068396811472 +1130.600854442108 +1860.3828937253838 +1327.5578068879524 +1146.420690757748 +7345.51681910242 +275.1163691991512 +94.16814949731734 +4590.960875740539 +4662.5825162845595 +2609.6171753290587 +94.1851912960441 +13239.02912894842 +4600.48051764287 +7354.93774925476 +6242.919475041515 +1499.224286186613 +3740.4720700796397 +8847.208878657764 +4953.130229840624 +727.5450444094524 +4306.4952152816295 +5288.485951352065 +378.03745699916345 +1353.0199040514449 +3579.03346792775 +699.6010712502559 +10290.03690211182 +2820.0496459969645 +9121.637647729809 +2555.7651584900677 +3341.9074881188185 +11521.815370052818 +5127.858578108455 +9970.54161398575 +4914.89316688811 +6098.381008055944 +9098.38481406071 +6573.55480684105 +9014.487324207925 +6234.28588035463 +4890.332467453265 +1733.058585566959 +11745.62726077293 +5394.58565722776 +6018.986686568869 +3238.1896697613433 +4264.50345414408 +2936.8735238643567 +6887.709411942345 +5156.708965825829 +1169.3608412970818 +5845.187195411585 +8072.356019624014 +2302.3567076420118 +3494.4410664643024 +11437.34254444719 +6929.624494857924 +4416.247613985164 +1820.3175577059337 +5935.457108583939 +1226.822097701312 +6233.938053827889 +1804.173076677055 +4307.340303607844 +8137.49984353439 +6219.108646171365 +1515.3058791087838 +1747.3217438244085 +11439.26550639481 +19216.72910116904 +1068.508520176356 +1731.8803220237226 +2278.296869619631 +1928.0964043434378 +4254.7506006687845 +2781.3316682117606 +662.8781092120565 +805.596851487582 +6795.83313598231 +5884.783343715919 +6883.416639734565 +8599.11065418097 +541.1430330880839 +745.0697179635674 +3253.5570663015596 +8092.236369118054 +5216.796641999145 +3384.840172054523 +481.04184170154343 +3028.7794009837 +7111.89805704476 +900.4631822264855 +2777.5138894264683 +3471.5282257988392 +2255.3163427609325 +56.4656913351272 +1326.5259304510464 +6035.284949661064 +658.223289115861 +2491.309179187101 +3691.1420168002096 +1003.4458772554405 +2718.4248945564477 +1756.3680389754063 +6478.9098640700695 +3934.425537255465 +6038.216837663254 +4278.1461975188295 +3241.4993681761284 +3456.634329815019 +2063.937204626206 +6857.025439488035 +2861.7723646693894 +1685.3539961762908 +112.96132943045578 +4950.545565133385 +5256.957935249299 +1762.3307633908794 +3719.24689353546 +2628.158060785029 +354.67453849439494 +4419.511957411005 +357.72508418712795 +2140.5678896001573 +188.37185055547178 +1753.2618872723885 +5068.569550104865 +3020.6100188671226 +2856.982426892937 +414.20862517919494 +7028.65337139854 +1818.7858665855408 +6968.91508351115 +10719.92707352378 +16532.126901191543 +117.48896600759043 +3909.9917385624894 +6798.645506145919 +5697.5608023152 +17144.40301002338 +4154.85573326796 +2041.8000773033568 +9779.865367030185 +4748.5299572043195 +6793.441493900564 +3752.3743636299546 +619.6349381731915 +10076.725131696508 +2328.84392610681 +2811.0150667060557 +2163.8141476241603 +1402.0764112915804 +4319.410925063605 +11943.014244255988 +682.899858491494 +4335.248600354209 +1439.4379673419585 +580.1460245194215 +7155.277717709625 +6066.94139631643 +16550.546050529818 +542.410248966026 +1279.624902394244 +4577.1692968372 +3659.933490789345 +779.2001763055089 +2375.3935718740954 +2479.2004951211993 +2570.8552277941153 +11080.496515270104 +7802.640814317929 +2805.6934617891616 +2268.1478870339797 +5231.497616339855 +6657.102973853815 +2712.8393063862545 +11938.7667557998 +8771.42817034134 +1442.2293878533765 +2828.5444209557186 +4107.7492409467495 +802.9278753678035 +4799.657834300559 +2051.1615213502805 +2681.8223932740484 +2661.2323257303874 +893.282240624214 +8605.277985317369 +4538.288797873985 +5608.988491560649 +9633.677403640395 +7198.74811650995 +1348.5098651782205 +1102.3217160929223 +5368.91500189926 +1135.50357610613 +2132.8376863067574 +1770.1172955327713 +11990.045118976679 +9758.581543597145 +279.2510577469242 +5657.589964528494 +12462.784170282215 +703.4142453650304 +3254.862488734269 +4367.63225602886 +1256.8730344440444 +1177.135481078242 +2555.4828420876893 +3220.1608965378155 +1448.7043697675256 +11068.672647115858 +1665.8902899694056 +1263.290008405558 +4373.46161598647 +1957.0027322159754 +5745.459311011105 +1561.0480624375946 +4966.08910561162 +3380.013750583526 +429.99900622172197 +4645.412302272595 +9052.946992404804 +6786.614527363055 +1066.3092418334825 +1774.1750047020964 +4162.789551759615 +2237.462794006097 +3786.3003360400044 +3653.6696593008146 +4144.378440820939 +3442.836592792334 +1116.906658908215 +3677.6584103157497 +5297.365612656599 +6612.69988165983 +669.9360934036645 +5074.02850749942 +1207.3733802981653 +3575.2900027122946 +1462.9119300142968 +357.64469605769096 +4029.4851450666047 +6415.718591784459 +3761.5963733031595 +1820.3334372982079 +2456.9716732958736 +6678.122290814379 +3662.952493280255 +8912.941771500793 +971.1850103535195 +5700.192516488015 +1000.6016429918844 +6146.891622601799 +4675.874435699109 +6603.896548065075 +2285.9349828188824 +4264.615542496294 +3046.957223277114 +6218.7200170634 +697.4214754438365 +1541.4655706280564 +2692.5135111992877 +2001.5017196595259 +4568.856615311484 +4553.879179727044 +3001.8378853155555 +4176.05248566765 +9643.707788147054 +6691.851027899204 +2484.175924046173 +8923.77463165076 +492.4222879086069 +2275.069378289351 +4991.489163759735 +2584.25984715192 +1033.545147385149 +2624.230651390789 +8861.90853420985 +4500.459519521909 +1589.0458431238787 +9853.69982338672 +3327.407634321564 +11298.624728927514 +7314.513506635265 +2489.8182151937463 +2100.9208454491704 +3596.80287739269 +352.60564169685745 +489.742323206843 +1357.8275096067919 +926.2795617678574 +1643.2041117833214 +4203.972695343715 +1067.7309644658544 +4505.484814405225 +4116.5234865496695 +4158.987951443045 +3243.8098580999576 +5825.24416178159 +1394.110166551312 +3224.472742931492 +5706.5623668088 +1380.346303219394 +4645.430149628065 +7229.744081105384 +4647.36731176522 +4033.484685451725 +6249.44113261587 +3984.836272527145 +6087.627610547035 +1959.201728773016 +1214.9056135884498 +1806.60882557673 +4234.52926605191 +4008.010126797635 +351.35529747923147 +8792.359346883279 +772.7781694102679 +6234.047194995164 +826.2846964620815 +4735.022019976849 +2983.824580180864 +4794.471951294865 +4812.17764170605 +4488.47489450724 +1993.4362624183418 +3746.08325045696 +3784.5891149975996 +37.673410570258746 +1641.7008751504409 +8991.025402034198 +913.8840459090579 +4856.39698437418 +9593.949491979334 +301.613150221362 +2593.648670926306 +7785.094525902295 +6911.16258465703 +7003.405708345829 +2267.0428645917113 +2588.4514150952555 +409.06674701186347 +3447.4886012489196 +7203.96777148454 +3147.724936701212 +8286.675692173165 +10254.077183371453 +233.80392732016705 +7299.913370147089 +1829.3164074314884 +8234.245688753384 +2979.0716218458156 +4347.33857186713 +2779.886672797437 +5319.91140437372 +5420.162015838359 +3293.6033387113284 +1453.7730041685898 +794.1341570536989 +2901.087042159789 +708.7075329350554 +2761.9786685215863 +954.2790496306304 +75.33425881186344 +381.633063710864 +1799.0411243080114 +851.8827402553859 +1113.8886201161529 +3167.896935135555 +2980.6934841903094 +2893.372024650873 +3808.2184098752846 +11480.60097193555 +4317.565711421829 +2720.802420778316 +3269.0059931302444 +11385.813592707224 +6440.798285405189 +8807.063719707889 +4301.5186630934695 +4202.271034132465 +2533.394772838944 +4159.211330279075 +2297.1903386998474 +4136.714289513575 +1773.912675898426 +7684.575350725525 +6068.5842597088795 +208.512347047249 +3559.933223406035 +5481.864747051979 +3846.1672848702246 +22262.011779243352 +2252.1889213873806 +414.79875261647544 +7239.553827344195 +816.9079046008754 +5524.399212567269 +2642.018483626893 +136.36184588022638 +6542.4223975633595 +796.9626124999734 +5633.5765880553945 +3271.135158055247 +1009.8973076762464 +4086.2104638668247 +1260.0719616109345 +1859.6817566541756 +7992.015500671335 +225.93162362482667 +3051.8075497426507 +13543.410487895573 +3816.336096565125 +2094.014428714201 +5060.12468849727 +1607.2457771882607 +1091.2416121422898 +3273.7186602958072 +1066.607907893304 +5948.125571410995 +6957.6627190259 +753.1045400830735 +1435.6933786826048 +1148.1926045303455 +1640.2524462411186 +7222.422977280944 +602.7379670653879 +6760.37242176079 +2773.48542041292 +2890.2255420737015 +6565.88025205882 +940.71753336666 +816.6636495613855 +2838.8781175016916 +527.396030364385 +2942.30392226694 +2991.366758228789 +678.115295493139 +846.5455480076804 +6963.773745451109 +407.8802196314999 +4471.30722504137 +22973.052875425135 +2985.5915924863766 +1415.739701613965 +13138.649791409764 +4568.846223459244 +1493.277722233416 +343.5594793181474 +2091.3327371702676 +7783.170964096114 +798.5475380296924 +6339.241006346884 +221.8155496982663 +5099.328221872534 +1025.2078846545305 +8817.250024496654 +3836.134952465795 +3074.195920932878 +233.84166778514916 +15086.72187813105 +1165.9365012025569 +3840.267033456665 +421.54319494397595 +3554.7660551404397 +2198.4997939515447 +15126.47064573134 +771.9375217234029 +4506.45302235282 +1619.8615053861029 +922.4376147394798 +1675.8988999333699 +15589.29868400912 +3594.51314365857 +1951.4508889784822 +3204.642324181081 +745.5030948060465 +4331.77756076219 +2530.5539085321775 +7311.35744906539 +6109.173194090399 +8864.418394591408 +1073.136514949765 +12602.73978731677 +2872.3084568343656 +3322.415324278463 +5946.202398534125 +3237.0177206763897 +2766.772901181667 +903.1680395556104 +3033.4440726318853 +6324.038088059055 +1491.3058585843912 +424.78186708299995 +2921.8636690832222 +8536.508596992775 +2121.426520745035 +11647.58232488354 +1166.860756548165 +950.5993398833295 +4729.29702683004 +1894.8395428054714 +4113.5607486719555 +338.9765532729835 +3828.3225998029593 +2259.2281881382673 +3060.734404680123 +1060.216905074173 +3945.93491809237 +7041.365338031779 +2552.068598660028 +2080.127162100533 +3939.55344619487 +854.712704810713 +2464.288300132508 +6816.30537695891 +3825.4238947186495 +11029.41571289943 +3321.0860166457323 +1143.1399818665259 +1331.306563868078 +1099.896526466192 +1595.2837587653469 +5711.3330454313345 +10482.223536270603 +1352.4958231954224 +1023.583958739153 +2729.0350369881407 +5278.13265318913 +1127.4359513261495 +1181.3285847320649 +1290.6784633271618 +6780.211226556495 +1430.7052856065584 +3659.3226685770296 +2615.999194916429 +5136.457780629629 +1672.5188607503915 +4865.2922801122495 +4889.873592222884 +3201.1775630978705 +2871.461713133965 +541.0212921278725 +5585.645681963934 +3652.99380873217 +4587.458321715744 +13126.544872915565 +1678.470602535139 +2601.7942924520576 +1204.809394338648 +4146.719013177265 +3125.3526766718933 +2879.562181583769 +1794.25867442472 +1360.68920880557 +2535.063282920549 +2405.7006542187182 +22959.09432669849 +7989.440430403425 +2129.5414973105035 +8482.805267109565 +2224.596636504735 +564.8020250851545 +4157.733754274835 +4583.722002358099 +113.0211878296291 +2761.2586604742787 +1366.7311668315199 +4187.26286640459 +2535.2489195446383 +2218.6415602645416 +5509.6996880919 +1300.953818431372 +597.635330850005 +3612.9848356849097 +9266.270156706674 +2841.5387907331983 +12532.05008916175 +7747.729598811755 +5072.554601660105 +1146.7624122448653 +6669.087865061264 +1774.4811751826214 +3466.2548174731714 +938.681275326214 +6658.15062788274 +232.87203687200176 +1147.8102095987308 +1651.576989013812 +4426.892837543434 +6400.244788075809 +10419.186418872034 +3989.0824127564897 +112.961991166318 +207.09725928551973 +7842.34318556388 +569.906022384958 +8538.237598023035 +9316.66251783036 +5349.38785361757 +5575.076154093949 +3462.9240737050854 +2814.306421686921 +189.66342794714663 +257.19272283756237 +5461.1402044302595 +6059.713339087905 +2920.0582379428106 +11724.223964129003 +11124.834032689685 +6788.73344255631 +5280.84498273381 +6641.43623595543 +203.8552416909022 +2706.576879259701 +6809.95923936874 +8249.308825916585 +3566.3982891798096 +4265.175391882824 +4820.18152699153 +3644.2421483981097 +934.4668123425424 +306.1744690188051 +414.17015780605493 +13604.052559244243 +4246.4721602932295 +1413.6281799803344 +2831.1013796690763 +263.56273010542577 +2183.1598613907177 +3326.996879119721 +385.71695681766096 +11012.294476143905 +8858.52132412891 +3365.988954453594 +2030.2922578609578 +984.111963614591 +3020.9637009949356 +9263.691228690464 +7056.963772965365 +1847.4457433324128 +2268.7126511007905 +2913.7227065279303 +3490.6456592715085 +37.66359465696485 +2141.894083309897 +268.20516353423557 +8402.50931370046 +1394.863802675532 +10291.174195165358 +716.284434472887 +5004.898156546189 +1449.509200100577 +14597.461244005779 +800.0471312838725 +56.49352084882414 +8836.30865767839 +169.53094275521914 +3415.0719650090646 +753.27133719313 +636.8874754613314 +1774.1969323870926 +5352.56166699121 +1819.5415028646519 +1229.9526153529685 +774.44132214379 +4724.99319936672 +4041.01940890627 +2835.193061005907 +2990.3443432049494 +495.473718104176 +37.6701800400205 +7977.76323262674 +7282.81767123617 +5883.952081628495 +1138.915315775377 +1319.7659198541683 +3409.14867629883 +1891.9872400077809 +2056.285274569078 +3062.228468931688 +906.9136915657315 +12060.156516667454 +3115.62601528892 +4326.534711894989 +4808.896632797389 +1869.5803426221355 +1680.6204453793473 +3547.618386441465 +2063.2609123182137 +1107.876090660458 +4279.781118451229 +5725.509441388134 +2272.7885516929528 +2971.6782842442535 +2101.7286455212916 +1080.2735733373534 +1041.2650606996083 +4025.2712729148147 +1481.833510147291 +3405.050083837923 +307.16150056573974 +3884.82329041989 +2666.9295347911407 +2330.678395043663 +3481.5182778979606 +188.25372001384056 +2448.1505817747857 +188.28910078259887 +3099.6542938892826 +3790.5250767142497 +4160.800710435809 +10498.337783262768 +8854.21940720618 +4472.156080480095 +1381.1318631493739 +5737.663044108695 +4898.6893171835845 +2359.3420966124763 +9631.461054848149 +2455.8563512990954 +4963.8267325138795 +3835.4537953672148 +474.15883832181896 +1264.7076475843774 +3642.6228929934196 +1369.2057348252008 +1731.220341148984 +3610.1866574388296 +307.2314598128597 +9436.349408146745 +6267.54672999952 +3467.6370712831435 +6769.735724538955 +1192.120800065958 +150.59756536322644 +6416.962893093095 +9147.350201166695 +1020.3761905843589 +2657.3982687143252 +77.61401199572265 +953.0387697652253 +136.3591933993044 +4121.3443527390045 +3531.830722480935 +1169.553930674563 +1970.8651969893808 +489.6407015082554 +2522.560702632124 +3492.10305852394 +3725.7381071802147 +1289.2255107883445 +4100.583990598269 +9949.268276854269 +5080.522836481015 +2828.3855096433367 +714.8880445657195 +1100.0952177014694 +6623.952382234425 +6673.568579286699 +4079.8602159416846 +192.93588827339153 +1037.8272239636315 +3246.622709082378 +112.99467339639395 +967.6290400448454 +2625.4036616405356 +56.4730972063006 +2254.004660278161 +7375.098188169739 +5441.03953643747 +3085.6368997329364 +1547.9647534499784 +235.1650017264975 +7475.575474193189 +5855.65015256949 +3383.748524564856 +1712.5711569210018 +4600.10780706631 +3704.5745023949194 +2463.495564415991 +1555.417009231106 +2568.9122415770307 +2709.6463443675148 +357.75324801911796 +2791.9876016332682 +2473.1965300025095 +3060.884264111807 +3510.2067775897144 +4662.805105576869 +8427.651234666158 +2420.0138886287873 +3456.7203752794576 +1405.2088780956065 +3514.417857189505 +6239.616319080795 +4043.324496419285 +483.1379916681395 +1685.329121687414 +5517.43257333513 +5111.1837209878895 +3502.217159798525 +2888.8795877384764 +4873.027970582204 +1348.4331805752217 +1605.4689453560484 +5182.0691714409095 +3948.985463206665 +2906.3148570668377 +4349.86277977321 +1905.0282323745994 +2297.9119585164362 +2563.1765856322672 +678.463576240947 +1547.1832104091438 +14498.748351938093 +226.36050934633533 +1472.2573305753424 +169.5244579331513 +6314.601406050875 +1949.7806505646313 +188.30700590489795 +1096.9789922343768 +2140.121889938704 +4097.615055420145 +2233.94429782615 +10365.997173323749 +2937.690814129207 +1765.4562239703619 +1031.8922973306605 +986.048324284695 +3605.26055860131 +1547.1780935208815 +3146.492538280801 +1383.2095441602548 +872.9863894503394 +2010.1701144329525 +3716.8179977056097 +5202.708698003705 +3416.2279309510873 +2862.292595438381 +3179.8305938499793 +2756.0924608548867 +2161.1583171819407 +3439.948292097999 +4446.307055111215 +1346.96480771286 +4607.38490754486 +163.037693236243 +7502.02507041274 +6727.379494707164 +1435.8745884447474 +2936.2431277777882 +4880.49546903156 +7924.242262292265 +4185.55167888032 +2679.6595132799976 +4278.7434397312845 +968.268017544513 +11092.10119202304 +7411.428595364184 +1836.9997942868317 +2532.421341076361 +1925.096560010883 +7745.290295240294 +1100.5909529706348 +2553.6271845766637 +904.5136365897029 +3828.87517465124 +3338.8860143340453 +6576.988812611069 +915.9683775743864 +451.72176520640744 +1859.2421796953163 +14100.00598677209 +15671.80423327918 +3336.930154875996 +9670.385750232059 +249.194929102861 +1622.162982733083 +1807.969638604262 +4263.0445119191645 +3967.14199133357 +4222.33543386368 +9544.607214714739 +16149.160486399884 +10370.600907065244 +965.2318395564389 +2177.5748662986566 +2165.7547483797716 +5965.50067852578 +4616.35452060573 +3262.332288707503 +2856.8324243711068 +3110.462248716056 +1255.759083332446 +1545.887828343712 +5179.183475174064 +1314.765748841202 +5390.07058800819 +1478.482014065994 +3716.2290217383797 +10650.55569297517 +847.7127510071779 +6431.846375960705 +1141.9445523151155 +5700.2292154292445 +1712.636745675485 +962.1260950872864 +2405.4775315146835 +2659.6268742895495 +16345.470907118184 +6833.606466811635 +2660.769151814403 +3132.9225827556543 +212.89800102420148 +4645.41389936624 +870.0886337304523 +8409.464146890274 +1812.7045042071836 +3061.5802518866913 +6375.786866834945 +2555.041356548275 +656.642156250402 +9384.718988349843 +2210.6444171468333 +1620.4085110337423 +1893.7209326703326 +1303.17703864033 +8947.535849759219 +9047.850193364498 +6752.25670247303 +1936.5676264285223 +3463.950955743481 +6605.594194705974 +1774.0814380356549 +650.825322845607 +9743.904999915205 +1243.6342867389662 +1782.1606084910213 +3289.1314105480806 +953.1785224614798 +5967.4541785640595 +915.6167523721783 +383.975220448029 +2379.910378770022 +4364.126764732139 +7562.70308969448 +1897.711236560902 +3918.3558095055846 +7771.706001407425 +2786.43235637873 +2388.907785297775 +3232.9496718235705 +7439.294664850229 +1077.8123122882919 +2864.527077076245 +645.766831392522 +8024.376173884175 +3419.181219161435 +2710.1008368498715 +6551.489518214725 +2796.6987689081875 +359.09846867376996 +1826.3292096407258 +1455.0985803316548 +6882.376671328026 +1813.913374282821 +2411.907467802259 +7186.266039651019 +3632.0660850536997 +3256.7791922593196 +4904.897991556535 +3970.9950557486295 +6826.005320654309 +7732.083303552859 +1776.7275262433304 +1339.8589352600409 +552.147941057489 +2912.4320215725 +39.9566013917147 +3295.142686290647 +7684.454248377514 +3183.9344504375063 +6454.4106376785 +2148.8378289509737 +9555.843914406265 +1212.012894971753 +1030.985009714667 +706.9386800282905 +1013.7321111461774 +6306.799219668009 +3990.207183548355 +1186.6078582394714 +5184.1461062472545 +4564.78469122298 +6725.300096278889 +6019.504160699925 +1414.69767139554 +5431.260801431675 +9990.833213032174 +802.3917258040634 +5088.248286231495 +16201.367739058178 +3115.307681571669 +1594.245286438546 +1411.5975622664193 +1867.67352734809 +5059.942141816485 +5922.082589244605 +8997.04741879538 +1563.9827893042882 +5324.28608126338 +379.38101678501494 +3768.26930376834 +2000.8458589847105 +1317.9499752126715 +899.602017298446 +1938.3822292714108 +2248.5064743196017 +2519.1645360864813 +567.7677598192565 +3713.2822064497595 +3248.674751721584 +3153.657063733547 +227.30459781520014 +4938.05557405048 +308.1684647486858 +94.18203500727175 +2799.7126386347018 +818.4608283195679 +5656.270323087055 +3348.4864692919496 +5753.3347599902645 +1858.6778651821166 +1851.370101348075 +5695.328504649035 +2276.915681434299 +3281.0994097614566 +2758.696182701914 +2895.0863467675586 +8021.476398038984 +4080.87158491964 +2196.9332628627894 +1058.78668278887 +3153.7558679347353 +2149.8060980362293 +3527.2775109061 +1221.3642001366504 +4288.15332276737 +7661.123578567444 +5914.478810819005 +3233.293496664612 +1830.5549937075484 +1031.6184129931714 +1219.4883707027805 +1955.250950329579 +4514.996012134509 +206.2455041811969 +6982.66701569955 +1409.1225724947662 +3556.7383451637447 +3026.2322474018597 +1329.536861792496 +2043.2284835685657 +10344.698623790473 +2524.956002891392 +1774.9909171574368 +6752.5042416857195 +2886.101625035601 +349.17730964672705 +5582.676879417995 +75.26859995663015 +37.63429128609675 +275.7958996359129 +5415.68556610438 +679.421563182131 +5553.59938832181 +1199.393019987876 +1562.8294811159972 +3142.4289925017533 +408.10523967675 +1571.9273309579244 +1534.8578584939983 +2470.7416120133526 +2785.176086727471 +10834.601960363228 +3608.4962828643747 +758.3099517605605 +3533.53972026587 +1088.0578465598448 +2786.242284171689 +3612.4279456176796 +7146.790621585229 +5886.267041927089 +2640.1957157947 +6169.425200079785 +11013.74705052062 +2580.7367099934 +2498.3363532251246 +754.252921207926 +2885.8943313931113 +9269.326165131795 +4673.146134788005 +960.1174228370094 +6353.572985543069 +3596.01233224009 +5696.046779071775 +2396.884351698473 +1111.1452555046724 +2125.441808345747 +3791.562334112735 +7603.996650942195 +1656.2673256645774 +5802.304292427825 +1276.7866564736044 +1173.78595371275 +2340.353491330288 +5720.697271578135 +4263.15732712646 +2637.515719295541 +2713.4026522787763 +4242.96442411324 +11850.910798225274 +9633.64783056627 +7022.853485838749 +8969.215027235225 +3999.2785011375345 +11110.67431594309 +11814.72461032983 +6547.0694959894 +3890.9291479822045 +725.886952728903 +7698.597694116244 +606.3119352912929 +790.5206719373774 +5500.72223542534 +3489.9977876201688 +7956.865279666345 +1692.7278694493334 +4247.499162569215 +3349.900558058001 +3877.5175021828695 +14839.418978199023 +1457.709314870074 +5603.938809850465 +2617.4663241991598 +4233.222229817105 +1102.3245394469245 +1116.4332989300785 +1107.487298996946 +6460.220548470079 +2164.9712230576324 +3723.6447650135296 +906.5509021505264 +850.0787925215775 +10558.518483601689 +5952.0168494370155 +2715.8669322005094 +3829.75899563201 +8895.550336793749 +7897.292354308244 +4848.64093705705 +687.827296328361 +8720.291207015045 +4018.927258035445 +1224.6213813791019 +7678.7394726638395 +10805.31323478068 +5828.589748104339 +8058.302271567204 +1743.1683616987148 +3491.500126227347 +4309.95055508948 +3668.8336682085896 +6329.346849258965 +7182.957050737159 +1957.1640877818293 +5740.904634891825 +944.516468173838 +5481.957900016289 +10068.235360769284 +1420.6979253796069 +12160.44255481139 +4217.68336687138 +3182.3925589032324 +7669.368101639475 +399.1669207837044 +4307.873509984415 +1997.9324063604988 +3097.6747875493697 +4336.754192684444 +2247.551124120351 +2074.8907319552122 +8886.759368736515 +2479.0408576404657 +719.037222156337 +11502.070752606698 +2001.8122122109087 +395.525461432038 +3638.625771286205 +3861.4011704965897 +131.71499099269315 +2272.2681813341824 +2831.328549257733 +1645.494653020568 +1318.642722693023 +7525.112776286945 +3824.9571796219348 +629.2572911535925 +5797.322836385255 +5013.05811473012 +4374.263670108395 +6200.505469472125 +1855.483156170252 +7060.771672745349 +12150.906055062356 +6062.12482361738 +2380.3908166905685 +500.86328946265496 +1560.98946792474 +2447.8572230890713 +37.635183966814346 +412.33047531894397 +7177.180203780719 +3845.8021194807898 +1418.4882231994038 +1142.5832873009062 +660.065182909097 +1871.9176801074993 +6523.30630472164 +1050.5339098647714 +2191.137378211579 +3356.3654903538754 +8812.00786717853 +2309.9193056591957 +1840.4964444523227 +1686.6584197893114 +2860.978006198291 +9811.179626423875 +1563.3531071533127 +75.3474280569871 +6344.743345518969 +207.16129680337488 +4529.577240904764 +207.19375752617393 +8040.928212597944 +2328.1394336098288 +3975.6199590859846 +5359.206256087705 +1183.060134432519 +3176.9073452580274 +724.865481294157 +3277.3722109288406 +2111.1675385154376 +7445.57229093426 +6685.1855561126295 +2610.4793365303517 +2849.8292061489947 +2053.025722432881 +9587.820818048374 +4155.281415730585 +564.0129335626905 +1524.909308919808 +3468.0306484156413 +3926.180667207435 +4964.047462001599 +918.8988658970469 +2217.094421918544 +5679.652511938824 +1964.2824119372192 +14963.653790508533 +1306.3630237031814 +6485.98936943412 +94.1069909963372 +2152.8220958318093 +3037.2220694467396 +712.56946522216 +2573.1263161283014 +8972.950964401689 +4844.516999942024 +4143.484333483425 +5563.19671823657 +3957.59116885153 +804.8872573559789 +12819.896670664579 +10183.490177954345 +2127.66902877137 +5495.646916257295 +7760.610332724655 +1640.368972865875 +5505.957423478715 +1284.624678569099 +567.6335451594325 +1279.4581419812394 +2366.52640164031 +94.1263727633901 +7844.40046975739 +3324.937197461418 +1866.6648022416414 +2375.684496852548 +6801.788992074299 +2894.330868894171 +1714.7388771631302 +1503.3585720639148 +9003.563750177604 +1566.2141826905456 +561.7265076402699 +781.0116259051924 +1123.9927175690955 +3794.981348383085 +5617.479445045825 +4009.8073423795095 +1726.7847392099814 +427.88033254402103 +1833.2602024684743 +3034.2947621040175 +3783.831843147405 +6065.498270132139 +3547.727562637405 +982.5565986449885 +836.5932938833574 +3960.6250894728696 +1156.5214235090634 +4260.29815916775 +3766.5645064645146 +7555.495626080499 +3016.915005936737 +7206.78617795549 +3994.4533010865343 +7733.642190972285 +1782.7104764086625 +1736.518866790568 +2558.1597844217695 +1221.3059243865584 +1506.1216194698063 +4667.102717135739 +3549.4482231459997 +829.5714821535365 +2603.544125954625 +658.5170333675429 +385.75083350684645 +7919.486312226055 +5027.166377420074 +3338.743845214939 +2565.57439289151 +1224.0424115098444 +5721.079250328925 +1732.5810152661288 +37.6315338289555 +2810.803529825802 +2171.3434540768912 +2290.9500005210666 +692.6117999113354 +4937.975218594284 +358.8365394248845 +1691.5844145553149 +1193.4476526692088 +355.60817082213146 +4522.641918798115 +10101.85110379088 +6625.56116481833 +2488.7422220075973 +2156.5926225926705 +2539.842754979614 +2757.5466025111587 +3290.5960333206276 +1409.924185407409 +3052.5463799692716 +3760.9734560572297 +1880.5053068152854 +6800.9572177632745 +4270.512521332085 +13180.392243737844 +4920.86503763491 +9965.229835576574 +1660.8771410909578 +8863.621013169824 +1311.323363105567 +5901.51218540254 +2015.1394539358948 +2349.6265080962485 +5306.3550996440945 +7259.56424541145 +5872.0646094923395 +3795.6326274948547 +3446.3411032226645 +3060.804778984298 +1192.3327882477163 +2829.076532974062 +3574.00460329829 +2170.99243823126 +7621.368264917225 +2369.213755390125 +8789.730047612815 +8727.49378788812 +1526.4942984202974 +1073.5242107844379 +5084.11582224826 +207.1564512696315 +6199.093566311904 +16132.531974396004 +5006.9388058204895 +646.2880912092639 +1860.1862993561363 +6533.2129847774995 +5061.685963723375 +6607.70647849053 +1099.2068582795964 +4610.35644269872 +1716.61852302899 +10834.60583365657 +4023.97690250626 +9228.32007925954 +2977.769097691881 +8078.500566754695 +4499.219099819605 +2275.8672380835646 +7390.21096342641 +9668.73529223056 +9565.025021043799 +9713.880707673135 +2001.5093882956164 +4156.6389968166695 +5344.51478921143 +5407.986632503174 +7568.648069908029 +3339.035142478812 +13081.54725745812 +94.16520680874089 +3990.79125398793 +1356.8714000330965 +7579.0028418783 +5729.16102259445 +3164.219462444078 +736.2714499011585 +8246.813627326539 +2438.423478471029 +4510.945022833795 +2550.77580887136 +5001.076757449569 +1821.7308053961203 +853.3958370478275 +4683.202373352089 +7588.640468099845 +1027.039482054425 +1176.088044893475 +3746.5217944151195 +683.694339664091 +4095.1311980410997 +2474.236247505396 +3490.17811170462 +4352.626880319165 +9552.8087758593 +8791.32792686855 +2183.208163969983 +2399.2174910675926 +12095.03114754886 +8157.82916741198 +2489.7340200814338 +5735.677588126464 +2835.779732564474 +1397.235963106165 +4737.342015259384 +12574.336277899654 +2704.1057326233718 +8038.954808754835 +5104.810587404954 +6083.332663358195 +12185.823199787403 +2084.5592674638233 +5097.64681059179 +2803.010107746656 +5239.79595404874 +1199.4051410516174 +14892.27512247027 +14920.926010577614 +1626.4166285635868 +978.7832301274789 +2760.942033643311 +737.100594835458 +1146.542446318738 +2429.457145016818 +3060.947345950406 +3571.41590586816 +7085.513518205289 +3370.5375969678594 +1902.138548668484 +1469.0746272692209 +8603.58927461523 +628.9963203479269 +2503.560030308645 +4842.076346060205 +4211.11600469154 +2947.278862029033 +3822.1780767380346 +5227.32658627368 +3117.7744817382445 +1227.1244726609225 +1340.0758680948309 +1080.3384977611345 +4081.993805123115 +1067.8734782203426 +4827.208564213595 +5117.764561389165 +13328.175823638094 +2889.2838243019974 +787.0428399550674 +3168.711638312269 +858.914960143674 +5183.658809008435 +2990.6982240176544 +1792.9977394106993 +450.5445468456415 +3457.512398870159 +1770.748140375284 +2785.2763370297807 +1770.1893277688828 +7381.487940183384 +3138.6989850184214 +1731.8211316873494 +709.062467382822 +1102.003472123141 +2913.921053570471 +1127.6285610842594 +5378.69917472384 +5051.77737771175 +1134.0626445620255 +4788.75378383059 +7563.391428916155 +621.194333784283 +2957.9618882170735 +8757.64297131948 +5008.232382302065 +7964.6999725323785 +1567.3935747737994 +1002.7078239563839 +2588.515139693588 +2029.212855530924 +593.003713356859 +1139.898639401788 +8934.530259774 +9503.621598491894 +2186.324033071727 +4285.554182302155 +857.378137967169 +7615.38243686367 +2281.8385064903537 +8416.655067550904 +3354.000163284746 +2829.9720892206187 +764.6709719361439 +634.8101514449414 +415.69052451155596 +3628.259844360935 +619.4025681662839 +3817.38005412302 +1695.141821742705 +9337.09496783455 +550.033962472197 +2919.4456668782823 +8195.32125399981 +2431.0528200745534 +3079.9102675185563 +6227.09815441217 +2985.469700022747 +112.97325223177874 +4215.671308930339 +4335.585124068974 +2009.5620874363683 +2801.2799370791827 +1561.299910778426 +1953.8642914613163 +1302.9322547518443 +5333.232805852245 +4298.16705670744 +4305.566446062455 +2563.07190908643 +1573.1912802961283 +8742.321502532413 +6307.209585451879 +421.28329727556445 +2214.5279933152387 +2978.113055498077 +767.7995271832199 +4728.885840228025 +17082.205444790885 +1917.1646552032516 +4311.75924131505 +1587.4484431352014 +14323.230516613408 +8751.236909817604 +1821.4835763755118 +465.723831993609 +834.600075187816 +826.4280254695465 +4738.803798128434 +3808.1469346027798 +4008.866052865205 +3774.7470036055497 +6299.497911460914 +1237.679375591589 +7489.87295047516 +2819.3746945996413 +7717.582971287839 +2917.658531141662 +2007.1428470222709 +3252.118547126183 +5277.246884461474 +633.712363388188 +983.9952655297274 +3356.9904849149198 +2789.012149430395 +1343.52720018671 +3022.233528295751 +5801.60390875688 +3378.2128493432897 +56.495817673250194 +8005.72964163735 +1450.214151472786 +3758.6595191298998 +4103.336067187245 +4021.18469054211 +2252.960106968858 +6534.95599114785 +2119.293068226628 +6133.638429558814 +2629.404254855462 +361.4985303718845 +5995.95899170695 +4327.870236584895 +10787.764865479176 +2353.402280415263 +1006.2551083827584 +3246.4329747392862 +1009.601888070265 +1024.7795984864235 +2114.870595023921 +2598.9277401033028 +1533.6769478599554 +1703.1262314775727 +4946.634882644665 +790.7198919737949 +5735.22649436828 +2600.3795497954716 +5972.563990403884 +2944.086656919296 +2364.014055824708 +1697.8364109206009 +2491.9586116292558 +4893.676238615395 +2075.7539094028134 +2052.571716941508 +3918.3479802464194 +606.584892705127 +2716.0500825517884 +2529.4676979725614 +4855.624446667959 +3927.14385646023 +2834.848120712692 +1643.6615953455423 +918.5711270403639 +4203.145530232285 +233.82535514590487 +3794.5519174933293 +3085.1940906948034 +2358.3743016012127 +1420.4401172563769 +3893.5660924416547 +4071.7849541784444 +2466.0612828951503 +748.7612151457059 +8080.930859333779 +3367.045074554455 +405.8511045038275 +2114.262482600709 +1288.8298551351263 +4547.17914539077 +2862.1699573727606 +3012.640538178246 +891.1490595592198 +603.500504885411 +4052.9832619962694 +1669.3882918358695 +3706.899803081545 +3307.6112677500932 +2159.1825791489587 +3780.5533574634696 +1968.2944681127105 +10796.925438645254 +8085.977701545554 +7316.125033333689 +2220.158984684746 +564.0608052849385 +2034.4539613941408 +1492.7830346974474 +5381.456370090779 +3223.559971579752 +2535.6167598820207 +910.7426523398734 +2739.6171092870754 +8215.700818543259 +1257.6205117776299 +7260.9724027956845 +1498.8877702794205 +3095.5353739119946 +5588.864039585469 +4544.365061952554 +3796.87158014724 +3453.8709250707234 +6481.64976865847 +10855.411438903078 +4353.640411745205 +11428.066103398665 +2125.223421655775 +2280.7274991388404 +687.070740881196 +2949.7456928906818 +3928.3574110880745 +9989.347123533084 +11820.422467436552 +1249.6272390729505 +4996.904944103099 +6108.942050300565 +2117.9450366984456 +7527.137739574879 +12632.371671511619 +7351.174276854204 +2335.2402163368456 +2697.3588553417553 +5013.795509398689 +1341.8757388675028 +131.84621962269904 +1410.9731376716184 +3364.4569316148 +421.865554399065 +3476.986395609874 +5253.20122678204 +2469.172193130055 +1069.0687198828034 +2688.2612647176893 +7088.80858037037 +3493.110003159822 +2407.1141350534704 +8220.157227785965 +6332.679454093265 +1383.6663059081554 +2430.3729415372854 +5137.864321614569 +1136.561177332826 +4121.7497038661995 +1968.6097266711995 +6370.62173458123 +4697.5248911241 +3466.0129009224215 +8967.34882821288 +4297.345124251375 +1022.6992373366788 +3222.135286975017 +1449.0787290657788 +3195.285623939318 +1110.6399841408163 +9184.86949254623 +4525.297150347995 +19631.500034013137 +991.2162296223563 +1776.2127086170915 +2887.514336261128 +7467.537602861875 +2094.106410966654 +4892.057215373719 +2936.3298193207193 +2306.245399461675 +5044.114569400374 +18487.865380004125 +479.97042860710997 +1218.2096373929578 +3130.5964072438824 +6085.947824208454 +2186.4608441765704 +2839.3617363759654 +1826.9238772500414 +9153.746182601684 +12478.742832176564 +5333.982160241944 +2971.64732019624 +1486.1871071651135 +1421.9659732283844 +264.000645895406 +3589.92188538242 +1646.0861609378585 +5571.122901828575 +1237.003677481712 +4167.602014426935 +2581.753556730726 +669.6904326999914 +5138.770907984 +1429.357698928355 +2895.494684892792 +249.3660264462563 +381.26115560261746 +696.287781369726 +1103.740279168982 +4011.12248058242 +1106.0672481922838 +4449.308175650275 +1844.092798078153 +4044.8359617585147 +244.66511036369917 +3966.5994521640196 +1659.2289070392137 +3011.882464557995 +1946.0782276644622 +4117.0829294818295 +3995.7648846111147 +2851.481042848935 +11338.49271492966 +1725.5072546759636 +3371.584938752282 +3540.87970434282 +800.1843301234649 +902.5470979680364 +75.337486160482 +661.325200343997 +7295.1315780632085 +8240.395534396725 +1037.5508260561955 +6309.3386771539945 +3301.8138129469885 +7213.585129338279 +5892.67941700501 +3168.216258124515 +8197.12878146855 +379.0686290819715 +1611.2174620445433 +7196.773278650269 +4061.4278638169944 +686.6979736475564 +5076.363346609695 +1119.28162763186 +6781.528661263755 +749.082372767456 +12472.842607890103 +13480.51104597582 +1929.5158750557234 +1571.4034818114008 +9123.23069349503 +1188.9886470020194 +1866.4992095549308 +913.8901396694334 +3160.202807732908 +13377.530522236475 +570.4978771464349 +5070.2125802571945 +2389.247850053106 +1293.0487226103019 +1161.9597668731044 +1631.4387466748487 +6132.22457576463 +8765.458091033908 +4676.060499811855 +3248.8578708859977 +5373.096972960395 +4152.827938179759 +7845.046944505505 +1644.5359976133548 +301.34568990101553 +4727.859386688654 +2785.5126669080587 +824.827764998888 +301.7402603247035 +2599.788790601502 +4116.391369642195 +5616.936132865505 +921.5224729582025 +2238.2592263979323 +2881.978849635378 +10401.65727651393 +1180.9856555695765 +5220.20277931243 +902.4486248483929 +1499.5504009686829 +4663.975407877379 +2560.905961192442 +733.1033747986969 +1945.4426366752684 +3471.2243047449833 +221.84156761686216 +4533.49617570297 +651.9030752702439 +3286.1194941629633 +5892.337472277164 +3838.3391168986495 +7338.469527847989 +2022.1337405519319 +4934.22699340907 +4361.5214754861745 +2834.051396280741 +2644.865627365031 +3319.1615697162547 +4305.523114358794 +1445.940390315407 +2246.2752367081284 +3063.187975648766 +1895.0019850962267 +5361.96918340363 +1952.0387395668563 +4097.66134589119 +1442.5314751830288 +1985.6648574574313 +3246.0789111780573 +2814.2539798400367 +5131.535081460935 +2876.592773575647 +276.02492500768744 +6240.233995365895 +131.82521252046544 +3987.8481262079245 +2857.5138553627294 +1563.9464499573842 +2685.9420739968004 +11197.316973237255 +6394.774200396155 +2058.5851845225798 +3045.3228040543804 +7285.120706839044 +7557.794662474875 +2869.142351672569 +2248.3609602012334 +2768.544496772789 +3998.8802714675844 +9156.014901738494 +2360.4642201283045 +1225.84010087791 +155.17925096795588 +2814.751007629925 +1628.231871396123 +1246.159170598636 +5810.818600688184 +1083.6917673787134 +1648.244190320105 +841.69391925269 +682.1090202908449 +2454.8058424380574 +207.11168251360263 +3484.391940947144 +2647.861261252151 +2595.0604321175306 +1211.4182979540353 +962.9441964791318 +4445.362594903964 +936.3148094775825 +2718.2932881566 +2503.856134862194 +2405.8947228966576 +2826.408195980852 +1051.0258343017229 +2581.439161702289 +3347.279423601043 +603.5099973563674 +2006.6819814216767 +1830.960835478915 +11623.91449824983 +6257.629739618635 +1430.9262716913358 +689.54377294082 +2803.6059290367275 +3806.35664121426 +597.3074453899314 +994.0173465088054 +1538.0294503419088 +1266.401941388717 +4158.80382753423 +8941.7529871838 +1013.903330441785 +1023.0351015163229 +4404.9779049544795 +1109.4085286704594 +2808.596850531178 +5100.185492845694 +4184.15085729354 +5290.7245804655195 +682.953920618123 +4653.85664236563 +10879.856654919875 +5377.669647606899 +3122.0968001248757 +3560.772744107495 +2514.8128118175473 +7848.05468359836 +771.5676544593815 +6152.025027772225 +2278.348928247091 +3321.0478725433377 +1437.1509161749702 +6457.41659380188 +1327.628090713162 +5476.970012225775 +10622.89147509163 +2522.69105052811 +488.21343445179195 +3714.6785423704596 +9267.63332477031 +6585.803228759194 +5420.99481488362 +7648.562750345334 +654.0546271156765 +4130.37871030008 +1210.0608536757438 +491.690336535132 +832.6086251719179 +3656.064682827305 +3167.9049127018366 +16468.022192800254 +2346.091237849982 +3930.4617275559644 +9639.240151645965 +5066.65079858602 +4050.1554562485094 +1839.2699161066228 +8868.75823293145 +3853.92412787361 +2251.4287146835436 +1854.5287036172888 +1122.987337848404 +6384.4675191206 +4366.14591499331 +249.43263078056538 +4575.435321776655 +3489.513865017278 +8036.940831928889 +1111.7827457536973 +6200.38799861565 +6045.3959743888545 +2388.231155710274 +8284.943914614114 +2458.822904147092 +1289.256098967774 +873.1626177384809 +741.8626322142629 +5055.20565177943 +9181.62843488709 +3782.3875776714644 +94.10994360077835 +1191.356735142616 +6068.97095222775 +3190.6288731932227 +2263.848801079635 +2543.7166599359093 +4491.3212511271995 +3940.02154204505 +9389.162694050754 +5333.646365628035 +3245.9053592863797 +2062.0724151429604 +3950.0842041731344 +14711.930115945685 +207.01583700130126 +1726.5718005327049 +185.09024578257745 +2608.464696510305 +7017.49532491784 +5423.49773942851 +7345.373146305775 +1490.4618515369486 +2046.7702610510398 +2560.298673193709 +961.223988606322 +6840.911944549865 +1347.3771147202729 +448.2538482922045 +243.83908075031678 +8850.551147639844 +1872.1379074940885 +8332.310145503188 +4221.012544555695 +4156.383762134589 +1911.832993725844 +1264.453905897175 +11076.28679349759 +4610.441817606345 +2790.4207223749254 +5356.778802590915 +8380.239596828049 +4878.23095974032 +3073.206304454706 +3048.3130207843915 +3391.403927214152 +2473.756767171609 +1702.5299824969659 +3356.0244850127556 +663.2892308890365 +4174.552065531155 +3754.4220810545044 +1893.0738230341804 +1182.454628367565 +9480.856581193375 +131.79678503660304 +7438.481079585395 +1537.0124661909115 +6322.8873735568095 +3540.866695381015 +4966.486253514765 +1382.177159749561 +2452.045727131637 +332.69711831749396 +7663.809894496349 +642.8316349996064 +5108.323869754385 +3345.619110128844 +782.4076383074839 +5647.03670383916 +9964.16563858912 +4678.417189623835 +6095.605502975975 +263.5111840567549 +7749.360399501594 +37.64443477318755 +5192.0491479619695 +5311.8839192961495 +1234.710423330713 +3477.4505080905096 +6646.390719208274 +3038.7809841369017 +2097.373924260041 +1009.5991898593825 +3624.2773369961546 +5983.587937195015 +532.369144090504 +5072.11407860437 +1152.9216368022114 +2943.4326678038274 +6103.001991469495 +131.8466706474344 +3465.7717390650378 +4928.82144368558 +2769.392296333418 +4296.235121073175 +739.8899851348459 +1314.7319354708839 +4124.0998367121 +17353.93987439861 +5340.413776890255 +2848.687523899168 +1419.3790626420089 +2624.9786562531276 +1298.970489394543 +1711.321341930697 +5009.519205261165 +350.17462219985 +3163.058593679148 +684.906684745836 +4413.785299997884 +4175.170126269135 +5684.76817885571 +37.645805256962696 +321.28055141524646 +2626.485485113903 +9080.308808441185 +2049.7333351520097 +9570.684853198 +6556.061777386134 +1761.9626483153486 +79.8514736405631 +1651.13474332324 +9752.889059111625 +9933.86937428935 +7106.15382128414 +620.5062288969809 +1111.715895649163 +8353.578734911234 +769.025311296137 +972.1890350451195 +618.6181043063594 +2823.8117774319917 +2132.8563204103434 +2412.026538502707 +399.91303337294744 +2306.192055046502 +2711.0244470196267 +4027.852194817115 +2128.220830373351 +4715.047626478559 +5511.780785826455 +1797.6265994762844 +1277.8103207907695 +4754.372224654745 +5474.1061370444395 +885.1533395027469 +3773.0930732798797 +2244.303403947311 +2007.2699600449719 +3442.4879682627766 +4457.93127066707 +3968.986899808595 +1692.2407463568811 +2186.069942614988 +12258.67828603712 +2713.7142558213272 +3050.282514822732 +5270.912077281059 +3557.0081440363397 +3245.7163926373582 +5057.108539277795 +2701.969406127369 +890.6707248104574 +5683.445340495369 +7470.93524132228 +3431.6562848377703 +3921.2953693001195 +1387.795544844219 +1766.0840707037569 +6702.170785524971 +2655.913647427551 +7496.496586828235 +1105.338478473726 +966.1137299393615 +1984.3655032270194 +1421.213857280784 +503.05427316382344 +4361.526894953375 +4594.664402001415 +1669.785434636116 +1664.190071706771 +2315.856956500307 +9874.690907002809 +1963.8105981281794 +1780.1287125119188 +1366.856324537193 +15209.634438835445 +8711.99704639733 +2222.984947991549 +1188.3844674687614 +5123.9111740593 +902.7483955623594 +1238.7768206398828 +5122.690751422265 +3541.2689603786253 +2573.385507683336 +1459.236750901636 +1029.167957032915 +2705.0991630313138 +1654.1910681187253 +4865.95855547585 +4360.79043622292 +890.658056208249 +1279.7542226539979 +13457.698278732783 +5231.08898501714 +8295.72708876821 +967.255052957606 +5390.98656438881 +6590.06207197786 +4640.397631257675 +4784.413783569419 +1779.348767347886 +1559.068133338436 +752.8278812619529 +3453.4855043741813 +2492.9445363104132 +2970.965165565134 +5773.606082759655 +2640.0516518411278 +7236.216360613554 +8359.88044233363 +2597.389052920263 +219.5652843210582 +7638.7679597947545 +3429.7671057153457 +6640.302204834865 +3984.6908351413795 +3002.758024567091 +3145.8922297714803 +960.0268514046315 +6740.06138743441 +2558.635950230451 +1307.3209021342504 +3099.152984020996 +3899.02152585799 +612.1003998502889 +2490.9564659620164 +4477.6659895177 +3604.090211474585 +2326.291259380186 +2452.546333879386 +5596.303574345085 +12100.32264835093 +6517.83329685418 +1819.026208686722 +3348.8367636809116 +3199.748917281738 +4688.77505692442 +3159.830949043531 +7901.114770270225 +2730.9832741890577 +3099.9684523168517 +4417.037203591144 +2420.383517691363 +403.65738970247594 +3253.2769268598304 +2779.377671699041 +1421.778400767158 +1483.1333315550849 +2484.7686154634102 +2691.117196215224 +6284.666197397245 +8354.45116311638 +5459.173275897565 +4115.091235066525 +1903.120963254504 +10736.134130296574 +1509.9927321731348 +2927.03464194561 +4908.763860513345 +6394.054827122374 +3606.88506283826 +3756.6774889272297 +1312.5334630822329 +177.26513312548389 +4326.828009550374 +7325.723051075799 +20091.03186095285 +7094.15569644481 +4969.719574458554 +5766.562097934645 +4432.057429246055 +3623.1951447825 +5095.633570229475 +6461.02845161326 +860.4817806856285 +1148.828270446199 +2835.479810005052 +2495.0097821069958 +2598.467902119873 +3628.6847509381 +2625.217050316378 +7788.613643450289 +2695.9509466875716 +1647.5443211941945 +1713.399204501985 +1891.1815915618463 +9335.782622609975 +2673.132651148365 +9678.675439228915 +2586.9967745565996 +7274.24320596813 +1885.003510894182 +9330.900532974509 +1799.4457662362124 +3021.329455262559 +4941.041326196219 +1201.111537591105 +5392.845767163085 +9025.377204676279 +3283.115908324252 +2299.9674739414204 +5323.27343499273 +2377.9550552301425 +144.2131927024306 +531.382277600104 +525.0692357886744 +4200.76925838927 +3457.0913744115137 +9714.863639341525 +1268.1443447138724 +1478.464940641878 +4426.207073161369 +2199.219307088692 +3650.5278185244047 +11359.87985385127 +9890.74026459939 +3933.7155643251544 +3071.5387866453398 +1532.3433769680505 +3239.105117518445 +4710.333889967579 +3428.1045412498324 +3885.3668327648993 +37.657994739001 +2564.5632613683774 +2866.6889936059897 +4452.13194706203 +2302.1440101780117 +2211.207722881465 +3019.5696718336344 +1980.1609472014788 +5471.58543779407 +4295.963112658034 +1659.0638365503685 +886.0422827033855 +4852.691164127729 +1915.48579520137 +3879.581295697765 +2020.0468801009138 +2890.9418340638813 +1068.4935101388903 +2415.172191204038 +3059.671460649363 +3312.264578987297 +3964.7951665058795 +1246.5351171848574 +11981.47148540223 +926.7305830994644 +1869.975457504952 +7149.868788846595 +11261.848972831274 +562.913782727037 +327.92533512697486 +965.1732031453294 +2350.6901916748247 +297.0342160314781 +1856.0137164961386 +3340.920858501933 +2883.330169989066 +6336.389928472519 +1935.8022806799004 +7832.985676294694 +3373.7338866975515 +2934.335608958327 +64.29056258659826 +1796.9010097515888 +2910.120525451226 +6048.8002415550145 +4590.03350877673 +4780.468218721475 +3301.1642305607734 +3861.3918000834396 +7204.617790383475 +6636.77041139203 +4813.479044103099 +2726.84136271288 +1266.198032551802 +9349.65133984644 +9338.346515695188 +1433.219792351935 +553.4850125966069 +9994.698067339019 +5185.560454603725 +2501.7464027529677 +5646.65749905096 +4228.914778623325 +2039.6921160515897 +1798.138798310785 +2811.3183747783537 +9948.377535776295 +5290.563336595599 +2786.9064527129244 +1808.5200663731807 +2955.8053749115215 +3225.8756297466966 +2135.159584899491 +4980.463618609115 +2449.0627700022924 +8177.876687660365 +628.588374273489 +3029.157436076163 +1202.20602497492 +1446.9457204419348 +6957.107197051829 +2984.5690397699536 +2064.171764076359 +5100.207333159855 +3424.8397631938697 +2743.215061634964 +2140.3956718769796 +5627.80981211176 +3227.365510037424 +5258.858839767085 +238.33121407530993 +5607.632102536905 +1213.930782811992 +3100.4304888170877 +1232.1565501845319 +791.3652219551504 +1528.493996973398 +12017.384682027934 +631.7625719572754 +1205.9155574293309 +2121.0131250419718 +3351.07812780594 +693.1647143110515 +767.9121999383484 +865.2519809562509 +6809.63622108721 +3337.6231338958373 +2690.484504227982 +10232.384892339189 +2933.427908334294 +714.990775403387 +2424.0113787340465 +2290.693171790975 +5800.23332054908 +973.782054492016 +2026.391916170237 +4745.94827891576 +1223.1066322000083 +3348.2303567352988 +384.381875451182 +1117.6418065403884 +2101.37243232182 +9874.430545061774 +4543.478205679385 +5799.240420287229 +5669.687981420854 +3765.5165786160296 +338.92472722981563 +5924.362312463314 +3672.540182025155 +7440.60459424821 +2595.282807624255 +2849.963508912163 +905.2079205942184 +3991.43515434846 +1307.7166981950154 +926.8858311502123 +4228.41708481787 +2484.9589540765987 +1257.9613048048338 +12224.578521117235 +1075.9400184254014 +625.3769448537205 +1112.6617731180945 +4700.86055274822 +3838.4901300058596 +4922.461297025335 +1274.527645994407 +1296.8644629467765 +1069.558547342075 +2354.428817064877 +2845.4867375741237 +1625.2498975863537 +5652.97232756151 +4317.465613012125 +169.524069984787 +1969.2264004449994 +8113.0168657808545 +9028.64742798753 +3322.443604521471 +6314.62676854618 +750.9466807606364 +4704.257855227034 +6428.873697794169 +5538.31211088638 +5901.0519844550745 +2064.738909358881 +2400.478288720533 +13759.334242233685 +9834.04212611135 +4279.41715934901 +7436.083079221124 +5024.12504631422 +5276.866244001134 +1323.243628590303 +418.9590670376824 +2519.1057676463033 +871.757350185708 +5307.79765851258 +1968.1173105950159 +3180.1861614513195 +3965.050704853875 +1847.753996393277 +7242.05538318465 +2793.1710973595063 +2309.347707822603 +4116.05322340219 +8264.831772057945 +7442.528450390355 +3955.6228631878 +3750.69192932462 +9671.960618164983 +3573.0108194487348 +1469.841106217148 +75.3361693346717 +738.5426213635294 +3110.6566498598777 +1503.6710458544703 +5107.918902462565 +3169.8739094321877 +4682.190294811679 +4935.944090019775 +4066.133264858735 +5575.985459383534 +972.7493566392525 +37.6530676991742 +376.6934195800545 +322.8663891144937 +6082.6385872357 +9347.39845723915 +2983.770123482256 +294.855731923585 +9033.22574133546 +546.0425087159945 +1017.0713289348043 +2945.95473025694 +1127.1984949565235 +4444.4989472312445 +4541.510533947135 +5221.046992769825 +6268.6963537957845 +1807.352608277349 +5144.502174988224 +2204.2178472466917 +1179.5088220168434 +1217.9405657724935 +393.415762054574 +1032.3277043325643 +2765.5937975904976 +435.66633144291603 +3859.150784298215 +94.17592264233998 +1469.374004732998 +5348.170700079304 +5620.2379179285845 +574.6164446008034 +3730.0087929991946 +2310.120128029959 +3298.945720618359 +10320.24764556779 +1497.3554291292448 +1564.17437005655 +7266.219763156725 +760.2372561371945 +37.64966829440845 +1121.1035398277434 +1021.8948484910619 +2484.1822061439666 +5539.154358696244 +1970.7315500773668 +4284.376727351664 +346.7613003176297 +2686.063863545118 +2681.281450796872 +5183.6637309758 +3741.064954805465 +10347.89532952434 +1221.7297706522438 +3555.01888278845 +3960.25009751147 +6228.563090674014 +10048.976208382825 +15120.382560776638 +3287.69798219023 +320.3952414853466 +322.84352855887647 +3121.126130871427 +938.7901006180584 +13815.65976201292 +809.5655369511289 +4175.962877416295 +5602.43304008556 +723.010158164812 +4768.504723597265 +10586.650918574185 +7248.250500954505 +4119.606571453344 +459.588069300234 +9244.746215932324 +1356.0844062928818 +3965.0689964825797 +4919.537023883895 +2967.635449581453 +3294.558119607891 +12538.927125504673 +702.8100519558334 +1355.547359072669 +957.6094889788945 +742.7402423855959 +2775.6673754798903 +3546.9652709292895 +689.4951725153975 +4692.535666819 +2573.8627472198687 +2461.1274428326246 +4119.6511360153445 +1986.4875346057347 +1808.8569170368967 +3362.9676048680913 +2640.2002242500917 +3905.9539806465496 +13631.616300752483 +3816.4335368880697 +9418.055463966379 +1672.472721115364 +1849.7988183863017 +5928.334433215005 +2388.0647744733637 +3081.247376906198 +8934.745692715394 +340.2619899548562 +5122.18115070746 +9916.281265596685 +3804.5547155720296 +1894.379008814698 +3880.036627125785 +13394.060372677808 +326.12418640317213 +1735.053893013343 +426.636697755457 +462.4042908018835 +831.7170848206185 +991.2932563001369 +2244.482971871854 +8461.38625639475 +1258.963530620894 +7962.590649935914 +2550.084920123391 +5800.4913983128 +8336.885305939295 +776.5891055310954 +2590.4279228200517 +5841.268640015375 +4468.24745781827 +9694.218855876345 +2511.4219608760236 +10861.14954675324 +11142.206002100424 +2363.0876518463165 +1632.005028920007 +1101.2996856304135 +1298.6058730924299 +3340.8077063180644 +37.672867571157 +4962.284088197975 +3628.6230344314645 +9341.074213217495 +1802.5820200210899 +1863.9189446919543 +6999.02320730102 +5283.392517206335 +1446.0867696640819 +1800.3198245375313 +624.2799324482595 +5108.027718538815 +869.0777141034835 +1635.6240785380087 +5100.051145266139 +8507.269043463644 +3098.1491529244445 +9946.499411768955 +1246.927243090333 +1359.0190651660698 +711.9364228184214 +1643.4706670416822 +11177.069576808519 +964.8414295184244 +941.3471765998895 +8474.623406807776 +280.5117363519709 +2559.158883439011 +1807.8196836750365 +2403.1637286452597 +3739.9879412453593 +497.50847102517395 +1019.85824979556 +10357.92138858792 +1116.081028576087 +779.4929212882909 +276.0588325901245 +887.3581467971745 +15424.44877114456 +2505.0399039188706 +1639.3431263696548 +3783.232259972865 +2010.5357139410512 +1198.4625173698728 +798.5826806255865 +1620.7399350303594 +7748.294082954495 +4621.098016819024 +1583.0936486348269 +6204.673547391059 +5719.7205511363745 +828.7064946499185 +2903.282307096507 +3886.8400286355145 +3052.6026739920567 +2895.510090565134 +5560.502552898404 +894.688213467755 +4350.836136089834 +17065.006236651378 +6294.9094059931795 +678.0646058147464 +10235.15562250566 +2182.2201875095157 +819.995968855063 +741.08900131336 +443.19060836681393 +8420.90259543169 +4196.55000294117 +1948.139750180799 +6693.216437358745 +2543.770441269806 +3408.835551778314 +791.074529816515 +1903.9117855749387 +1809.2595986236308 +7531.83380739307 +1667.37727143099 +3248.18680444888 +1208.2341649979403 +4038.5778031239897 +4573.30026141436 +7286.5719690046135 +1641.5608325131504 +6135.42998534452 +4529.1474436780245 +1659.1380286268723 +7191.569921516154 +7707.530094789315 +2728.2736664531703 +6672.45212029522 +8515.006218270264 +6990.66578641417 +2524.6247401359565 +3670.4332638020596 +117.55648697591923 +383.477881128195 +3314.2761640269396 +269.55067966109146 +2382.7234406281354 +4802.3709600363345 +3328.580933546298 +27499.682924860717 +3433.663339441296 +9712.567358786215 +8050.38660730136 +5440.58067312564 +7450.188315140655 +3263.46844705371 +6227.63407532889 +14702.534799501918 +3597.49913342708 +2056.9029479273763 +6152.047364916005 +6790.3639110104705 +3048.354806181979 +6960.831797429999 +1296.159659710587 +3978.53382435565 +2931.0386597960087 +2147.505906099015 +6573.586508185969 +2653.510604166023 +3809.91097676224 +2619.6327778059317 +7511.84832446209 +3017.217605292916 +9012.547999242444 +4282.25670755092 +2898.460756969949 +5366.576735489305 +4190.97839919066 +712.3871120565709 +227.35855548910837 +5077.805496367625 +2095.9498609295783 +3550.7202259566097 +4685.1491407626145 +2341.766697426765 +3544.9301360148897 +1302.129592200283 +4377.086102938885 +14195.693316098454 +1869.53983200922 +4796.171004727655 +5914.90490359062 +1445.0400467049817 +19255.769729201493 +4173.54723556015 +53.2738425454914 +1886.084804750076 +1148.9114031873974 +2142.7748057808153 +5828.7630620696045 +5863.658665597565 +4290.946473031575 +1515.583158434464 +150.6767920096194 +2591.8082677966113 +4457.59706167209 +8163.12504501683 +6364.4535616459 +1701.8044657230714 +3995.64473476462 +2344.8645095441825 +1093.94860925336 +1555.666193377471 +243.90748034961976 +1592.7751200259954 +590.1582856034249 +4212.448956878645 +298.102173064179 +3166.11706831085 +5023.41179813053 +2672.7329103811558 +5696.7719633923 +3883.7503173580994 +1338.0045218880618 +8472.98983544664 +8186.414746512204 +8416.860443830896 +3465.3002739945905 +4131.90950346209 +7562.385514839294 +2398.4950234605185 +8275.748621336279 +9893.48340281231 diff --git a/tests/data/lsm_grids/cmip5/conus_c5.ccsm4_rcp60_r1i1p1.daily.total_runoff.2001_subset.nc b/tests/data/lsm_grids/cmip5/conus_c5.ccsm4_rcp60_r1i1p1.daily.total_runoff.2001_subset.nc new file mode 100644 index 0000000..760c67e Binary files /dev/null and b/tests/data/lsm_grids/cmip5/conus_c5.ccsm4_rcp60_r1i1p1.daily.total_runoff.2001_subset.nc differ diff --git a/tests/data/lsm_grids/era20cm/era_20cm_runoff_20000129_0.nc b/tests/data/lsm_grids/era20cm/era_20cm_runoff_20000129_0.nc new file mode 100755 index 0000000..671a372 Binary files /dev/null and b/tests/data/lsm_grids/era20cm/era_20cm_runoff_20000129_0.nc differ diff --git a/tests/data/lsm_grids/era20cm/era_20cm_runoff_20000129_1.nc b/tests/data/lsm_grids/era20cm/era_20cm_runoff_20000129_1.nc new file mode 100755 index 0000000..4a2650e Binary files /dev/null and b/tests/data/lsm_grids/era20cm/era_20cm_runoff_20000129_1.nc differ diff --git a/tests/data/lsm_grids/era20cm/era_20cm_runoff_20000129_2.nc b/tests/data/lsm_grids/era20cm/era_20cm_runoff_20000129_2.nc new file mode 100755 index 0000000..d93703d Binary files /dev/null and b/tests/data/lsm_grids/era20cm/era_20cm_runoff_20000129_2.nc differ diff --git a/tests/data/lsm_grids/era20cm/era_20cm_runoff_20000129_3.nc b/tests/data/lsm_grids/era20cm/era_20cm_runoff_20000129_3.nc new file mode 100755 index 0000000..0a8eecf Binary files /dev/null and b/tests/data/lsm_grids/era20cm/era_20cm_runoff_20000129_3.nc differ diff --git a/tests/data/lsm_grids/era20cm/era_20cm_runoff_20000129_4.nc b/tests/data/lsm_grids/era20cm/era_20cm_runoff_20000129_4.nc new file mode 100755 index 0000000..959adb3 Binary files /dev/null and b/tests/data/lsm_grids/era20cm/era_20cm_runoff_20000129_4.nc differ diff --git a/tests/data/lsm_grids/era20cm/era_20cm_runoff_20000129_5.nc b/tests/data/lsm_grids/era20cm/era_20cm_runoff_20000129_5.nc new file mode 100755 index 0000000..dcf836b Binary files /dev/null and b/tests/data/lsm_grids/era20cm/era_20cm_runoff_20000129_5.nc differ diff --git a/tests/data/lsm_grids/era20cm/era_20cm_runoff_20000129_6.nc b/tests/data/lsm_grids/era20cm/era_20cm_runoff_20000129_6.nc new file mode 100755 index 0000000..d26a0e7 Binary files /dev/null and b/tests/data/lsm_grids/era20cm/era_20cm_runoff_20000129_6.nc differ diff --git a/tests/data/lsm_grids/era20cm/era_20cm_runoff_20000129_7.nc b/tests/data/lsm_grids/era20cm/era_20cm_runoff_20000129_7.nc new file mode 100755 index 0000000..8d63662 Binary files /dev/null and b/tests/data/lsm_grids/era20cm/era_20cm_runoff_20000129_7.nc differ diff --git a/tests/data/lsm_grids/era20cm/era_20cm_runoff_20000129_8.nc b/tests/data/lsm_grids/era20cm/era_20cm_runoff_20000129_8.nc new file mode 100755 index 0000000..8b58808 Binary files /dev/null and b/tests/data/lsm_grids/era20cm/era_20cm_runoff_20000129_8.nc differ diff --git a/tests/data/lsm_grids/era20cm/era_20cm_runoff_20000129_9.nc b/tests/data/lsm_grids/era20cm/era_20cm_runoff_20000129_9.nc new file mode 100755 index 0000000..365788c Binary files /dev/null and b/tests/data/lsm_grids/era20cm/era_20cm_runoff_20000129_9.nc differ diff --git a/tests/data/lsm_grids/era20cm/era_20cm_runoff_20000130_0.nc b/tests/data/lsm_grids/era20cm/era_20cm_runoff_20000130_0.nc new file mode 100755 index 0000000..3e89cc2 Binary files /dev/null and b/tests/data/lsm_grids/era20cm/era_20cm_runoff_20000130_0.nc differ diff --git a/tests/data/lsm_grids/era20cm/era_20cm_runoff_20000130_1.nc b/tests/data/lsm_grids/era20cm/era_20cm_runoff_20000130_1.nc new file mode 100755 index 0000000..79fb62c Binary files /dev/null and b/tests/data/lsm_grids/era20cm/era_20cm_runoff_20000130_1.nc differ diff --git a/tests/data/lsm_grids/era20cm/era_20cm_runoff_20000130_2.nc b/tests/data/lsm_grids/era20cm/era_20cm_runoff_20000130_2.nc new file mode 100755 index 0000000..8d53a12 Binary files /dev/null and b/tests/data/lsm_grids/era20cm/era_20cm_runoff_20000130_2.nc differ diff --git a/tests/data/lsm_grids/era20cm/era_20cm_runoff_20000130_3.nc b/tests/data/lsm_grids/era20cm/era_20cm_runoff_20000130_3.nc new file mode 100755 index 0000000..fcd1274 Binary files /dev/null and b/tests/data/lsm_grids/era20cm/era_20cm_runoff_20000130_3.nc differ diff --git a/tests/data/lsm_grids/era20cm/era_20cm_runoff_20000130_4.nc b/tests/data/lsm_grids/era20cm/era_20cm_runoff_20000130_4.nc new file mode 100755 index 0000000..325a50a Binary files /dev/null and b/tests/data/lsm_grids/era20cm/era_20cm_runoff_20000130_4.nc differ diff --git a/tests/data/lsm_grids/era20cm/era_20cm_runoff_20000130_5.nc b/tests/data/lsm_grids/era20cm/era_20cm_runoff_20000130_5.nc new file mode 100755 index 0000000..458532c Binary files /dev/null and b/tests/data/lsm_grids/era20cm/era_20cm_runoff_20000130_5.nc differ diff --git a/tests/data/lsm_grids/era20cm/era_20cm_runoff_20000130_6.nc b/tests/data/lsm_grids/era20cm/era_20cm_runoff_20000130_6.nc new file mode 100755 index 0000000..b36f5c4 Binary files /dev/null and b/tests/data/lsm_grids/era20cm/era_20cm_runoff_20000130_6.nc differ diff --git a/tests/data/lsm_grids/era20cm/era_20cm_runoff_20000130_7.nc b/tests/data/lsm_grids/era20cm/era_20cm_runoff_20000130_7.nc new file mode 100755 index 0000000..7de36b9 Binary files /dev/null and b/tests/data/lsm_grids/era20cm/era_20cm_runoff_20000130_7.nc differ diff --git a/tests/data/lsm_grids/era20cm/era_20cm_runoff_20000130_8.nc b/tests/data/lsm_grids/era20cm/era_20cm_runoff_20000130_8.nc new file mode 100755 index 0000000..1977eb4 Binary files /dev/null and b/tests/data/lsm_grids/era20cm/era_20cm_runoff_20000130_8.nc differ diff --git a/tests/data/lsm_grids/era20cm/era_20cm_runoff_20000130_9.nc b/tests/data/lsm_grids/era20cm/era_20cm_runoff_20000130_9.nc new file mode 100755 index 0000000..483ebdb Binary files /dev/null and b/tests/data/lsm_grids/era20cm/era_20cm_runoff_20000130_9.nc differ diff --git a/tests/data/lsm_grids/erai24/19990109_erai_runoff.grib.nc b/tests/data/lsm_grids/erai24/19990109_erai_runoff.grib.nc new file mode 100755 index 0000000..d728329 Binary files /dev/null and b/tests/data/lsm_grids/erai24/19990109_erai_runoff.grib.nc differ diff --git a/tests/data/lsm_grids/erai24/19990110_erai_runoff.grib.nc b/tests/data/lsm_grids/erai24/19990110_erai_runoff.grib.nc new file mode 100755 index 0000000..1321d93 Binary files /dev/null and b/tests/data/lsm_grids/erai24/19990110_erai_runoff.grib.nc differ diff --git a/tests/data/lsm_grids/erai3/20030121_erai3h_ro.nc b/tests/data/lsm_grids/erai3/20030121_erai3h_ro.nc new file mode 100755 index 0000000..4f22440 Binary files /dev/null and b/tests/data/lsm_grids/erai3/20030121_erai3h_ro.nc differ diff --git a/tests/data/lsm_grids/erai3/20030122_erai3h_ro.nc b/tests/data/lsm_grids/erai3/20030122_erai3h_ro.nc new file mode 100755 index 0000000..7b29c14 Binary files /dev/null and b/tests/data/lsm_grids/erai3/20030122_erai3h_ro.nc differ diff --git a/tests/data/lsm_grids/erai3t255/era_interim_runoff_20140820.nc b/tests/data/lsm_grids/erai3t255/era_interim_runoff_20140820.nc new file mode 100755 index 0000000..629b004 Binary files /dev/null and b/tests/data/lsm_grids/erai3t255/era_interim_runoff_20140820.nc differ diff --git a/tests/data/lsm_grids/erai3t255/era_interim_runoff_20140821.nc b/tests/data/lsm_grids/erai3t255/era_interim_runoff_20140821.nc new file mode 100755 index 0000000..1a351a8 Binary files /dev/null and b/tests/data/lsm_grids/erai3t255/era_interim_runoff_20140821.nc differ diff --git a/tests/data/lsm_grids/gldas2/GLDAS_NOAH025_3H.A20101231.0000.020.nc4 b/tests/data/lsm_grids/gldas2/GLDAS_NOAH025_3H.A20101231.0000.020.nc4 new file mode 100755 index 0000000..203e321 Binary files /dev/null and b/tests/data/lsm_grids/gldas2/GLDAS_NOAH025_3H.A20101231.0000.020.nc4 differ diff --git a/tests/data/lsm_grids/gldas2/GLDAS_NOAH025_3H.A20101231.0300.020.nc4 b/tests/data/lsm_grids/gldas2/GLDAS_NOAH025_3H.A20101231.0300.020.nc4 new file mode 100755 index 0000000..2ab50da Binary files /dev/null and b/tests/data/lsm_grids/gldas2/GLDAS_NOAH025_3H.A20101231.0300.020.nc4 differ diff --git a/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_00.nc b/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_00.nc new file mode 100755 index 0000000..773b43d Binary files /dev/null and b/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_00.nc differ diff --git a/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_01.nc b/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_01.nc new file mode 100755 index 0000000..cfefc57 Binary files /dev/null and b/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_01.nc differ diff --git a/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_02.nc b/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_02.nc new file mode 100755 index 0000000..3068ba3 Binary files /dev/null and b/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_02.nc differ diff --git a/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_03.nc b/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_03.nc new file mode 100755 index 0000000..bf9c0d2 Binary files /dev/null and b/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_03.nc differ diff --git a/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_04.nc b/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_04.nc new file mode 100755 index 0000000..295f30e Binary files /dev/null and b/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_04.nc differ diff --git a/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_05.nc b/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_05.nc new file mode 100755 index 0000000..8c307c4 Binary files /dev/null and b/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_05.nc differ diff --git a/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_06.nc b/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_06.nc new file mode 100755 index 0000000..8754a21 Binary files /dev/null and b/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_06.nc differ diff --git a/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_07.nc b/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_07.nc new file mode 100755 index 0000000..957c494 Binary files /dev/null and b/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_07.nc differ diff --git a/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_08.nc b/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_08.nc new file mode 100755 index 0000000..841d360 Binary files /dev/null and b/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_08.nc differ diff --git a/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_09.nc b/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_09.nc new file mode 100755 index 0000000..b7ca32f Binary files /dev/null and b/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_09.nc differ diff --git a/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_10.nc b/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_10.nc new file mode 100755 index 0000000..7bf1c91 Binary files /dev/null and b/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_10.nc differ diff --git a/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_11.nc b/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_11.nc new file mode 100755 index 0000000..3249d91 Binary files /dev/null and b/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_11.nc differ diff --git a/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_12.nc b/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_12.nc new file mode 100755 index 0000000..ca3d828 Binary files /dev/null and b/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_12.nc differ diff --git a/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_13.nc b/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_13.nc new file mode 100755 index 0000000..9c945ec Binary files /dev/null and b/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_13.nc differ diff --git a/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_14.nc b/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_14.nc new file mode 100755 index 0000000..a739eec Binary files /dev/null and b/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_14.nc differ diff --git a/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_15.nc b/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_15.nc new file mode 100755 index 0000000..7b4185a Binary files /dev/null and b/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_15.nc differ diff --git a/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_16.nc b/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_16.nc new file mode 100755 index 0000000..f5eeebd Binary files /dev/null and b/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_16.nc differ diff --git a/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_17.nc b/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_17.nc new file mode 100755 index 0000000..4188bab Binary files /dev/null and b/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_17.nc differ diff --git a/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_18.nc b/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_18.nc new file mode 100755 index 0000000..25e9e21 Binary files /dev/null and b/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_18.nc differ diff --git a/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_19.nc b/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_19.nc new file mode 100755 index 0000000..009a4f3 Binary files /dev/null and b/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_19.nc differ diff --git a/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_20.nc b/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_20.nc new file mode 100755 index 0000000..4026bf4 Binary files /dev/null and b/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_20.nc differ diff --git a/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_21.nc b/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_21.nc new file mode 100755 index 0000000..75be699 Binary files /dev/null and b/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_21.nc differ diff --git a/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_22.nc b/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_22.nc new file mode 100755 index 0000000..7e748f3 Binary files /dev/null and b/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_22.nc differ diff --git a/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_23.nc b/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_23.nc new file mode 100755 index 0000000..721d694 Binary files /dev/null and b/tests/data/lsm_grids/joules/ukv_test.runoff.20080803_23.nc differ diff --git a/tests/data/lsm_grids/lis/LIS_HIST_201101210000.d01.nc b/tests/data/lsm_grids/lis/LIS_HIST_201101210000.d01.nc new file mode 100755 index 0000000..f07ec8d Binary files /dev/null and b/tests/data/lsm_grids/lis/LIS_HIST_201101210000.d01.nc differ diff --git a/tests/data/lsm_grids/lis/LIS_HIST_201101210100.d01.nc b/tests/data/lsm_grids/lis/LIS_HIST_201101210100.d01.nc new file mode 100755 index 0000000..dbce1b3 Binary files /dev/null and b/tests/data/lsm_grids/lis/LIS_HIST_201101210100.d01.nc differ diff --git a/tests/data/lsm_grids/lis/LIS_HIST_201101210200.d01.nc b/tests/data/lsm_grids/lis/LIS_HIST_201101210200.d01.nc new file mode 100755 index 0000000..4be621f Binary files /dev/null and b/tests/data/lsm_grids/lis/LIS_HIST_201101210200.d01.nc differ diff --git a/tests/data/lsm_grids/lis/LIS_HIST_201101210300.d01.nc b/tests/data/lsm_grids/lis/LIS_HIST_201101210300.d01.nc new file mode 100755 index 0000000..3c437df Binary files /dev/null and b/tests/data/lsm_grids/lis/LIS_HIST_201101210300.d01.nc differ diff --git a/tests/data/lsm_grids/lis/LIS_HIST_201101210400.d01.nc b/tests/data/lsm_grids/lis/LIS_HIST_201101210400.d01.nc new file mode 100755 index 0000000..88e144d Binary files /dev/null and b/tests/data/lsm_grids/lis/LIS_HIST_201101210400.d01.nc differ diff --git a/tests/data/lsm_grids/lis/LIS_HIST_201101210500.d01.nc b/tests/data/lsm_grids/lis/LIS_HIST_201101210500.d01.nc new file mode 100755 index 0000000..5209c8f Binary files /dev/null and b/tests/data/lsm_grids/lis/LIS_HIST_201101210500.d01.nc differ diff --git a/tests/data/lsm_grids/lis/LIS_HIST_201101210600.d01.nc b/tests/data/lsm_grids/lis/LIS_HIST_201101210600.d01.nc new file mode 100755 index 0000000..dbe1765 Binary files /dev/null and b/tests/data/lsm_grids/lis/LIS_HIST_201101210600.d01.nc differ diff --git a/tests/data/lsm_grids/lis/LIS_HIST_201101210700.d01.nc b/tests/data/lsm_grids/lis/LIS_HIST_201101210700.d01.nc new file mode 100755 index 0000000..7cf7443 Binary files /dev/null and b/tests/data/lsm_grids/lis/LIS_HIST_201101210700.d01.nc differ diff --git a/tests/data/lsm_grids/lis/LIS_HIST_201101210800.d01.nc b/tests/data/lsm_grids/lis/LIS_HIST_201101210800.d01.nc new file mode 100755 index 0000000..f101f2d Binary files /dev/null and b/tests/data/lsm_grids/lis/LIS_HIST_201101210800.d01.nc differ diff --git a/tests/data/lsm_grids/lis/LIS_HIST_201101210900.d01.nc b/tests/data/lsm_grids/lis/LIS_HIST_201101210900.d01.nc new file mode 100755 index 0000000..c38c610 Binary files /dev/null and b/tests/data/lsm_grids/lis/LIS_HIST_201101210900.d01.nc differ diff --git a/tests/data/lsm_grids/lis/LIS_HIST_201101211000.d01.nc b/tests/data/lsm_grids/lis/LIS_HIST_201101211000.d01.nc new file mode 100755 index 0000000..5980c0e Binary files /dev/null and b/tests/data/lsm_grids/lis/LIS_HIST_201101211000.d01.nc differ diff --git a/tests/data/lsm_grids/lis/LIS_HIST_201101211100.d01.nc b/tests/data/lsm_grids/lis/LIS_HIST_201101211100.d01.nc new file mode 100755 index 0000000..af25d99 Binary files /dev/null and b/tests/data/lsm_grids/lis/LIS_HIST_201101211100.d01.nc differ diff --git a/tests/data/lsm_grids/lis/LIS_HIST_201101211200.d01.nc b/tests/data/lsm_grids/lis/LIS_HIST_201101211200.d01.nc new file mode 100755 index 0000000..15f992c Binary files /dev/null and b/tests/data/lsm_grids/lis/LIS_HIST_201101211200.d01.nc differ diff --git a/tests/data/lsm_grids/lis/LIS_HIST_201101211300.d01.nc b/tests/data/lsm_grids/lis/LIS_HIST_201101211300.d01.nc new file mode 100755 index 0000000..09f62a8 Binary files /dev/null and b/tests/data/lsm_grids/lis/LIS_HIST_201101211300.d01.nc differ diff --git a/tests/data/lsm_grids/lis/LIS_HIST_201101211400.d01.nc b/tests/data/lsm_grids/lis/LIS_HIST_201101211400.d01.nc new file mode 100755 index 0000000..e5a3ead Binary files /dev/null and b/tests/data/lsm_grids/lis/LIS_HIST_201101211400.d01.nc differ diff --git a/tests/data/lsm_grids/lis/LIS_HIST_201101211500.d01.nc b/tests/data/lsm_grids/lis/LIS_HIST_201101211500.d01.nc new file mode 100755 index 0000000..66610bf Binary files /dev/null and b/tests/data/lsm_grids/lis/LIS_HIST_201101211500.d01.nc differ diff --git a/tests/data/lsm_grids/lis/LIS_HIST_201101211600.d01.nc b/tests/data/lsm_grids/lis/LIS_HIST_201101211600.d01.nc new file mode 100755 index 0000000..fb5dba4 Binary files /dev/null and b/tests/data/lsm_grids/lis/LIS_HIST_201101211600.d01.nc differ diff --git a/tests/data/lsm_grids/lis/LIS_HIST_201101211700.d01.nc b/tests/data/lsm_grids/lis/LIS_HIST_201101211700.d01.nc new file mode 100755 index 0000000..0655537 Binary files /dev/null and b/tests/data/lsm_grids/lis/LIS_HIST_201101211700.d01.nc differ diff --git a/tests/data/lsm_grids/lis/LIS_HIST_201101211800.d01.nc b/tests/data/lsm_grids/lis/LIS_HIST_201101211800.d01.nc new file mode 100755 index 0000000..2097b4e Binary files /dev/null and b/tests/data/lsm_grids/lis/LIS_HIST_201101211800.d01.nc differ diff --git a/tests/data/lsm_grids/lis/LIS_HIST_201101211900.d01.nc b/tests/data/lsm_grids/lis/LIS_HIST_201101211900.d01.nc new file mode 100755 index 0000000..e5a0dd6 Binary files /dev/null and b/tests/data/lsm_grids/lis/LIS_HIST_201101211900.d01.nc differ diff --git a/tests/data/lsm_grids/lis/LIS_HIST_201101212000.d01.nc b/tests/data/lsm_grids/lis/LIS_HIST_201101212000.d01.nc new file mode 100755 index 0000000..ec974d9 Binary files /dev/null and b/tests/data/lsm_grids/lis/LIS_HIST_201101212000.d01.nc differ diff --git a/tests/data/lsm_grids/lis/LIS_HIST_201101212100.d01.nc b/tests/data/lsm_grids/lis/LIS_HIST_201101212100.d01.nc new file mode 100755 index 0000000..f96d80a Binary files /dev/null and b/tests/data/lsm_grids/lis/LIS_HIST_201101212100.d01.nc differ diff --git a/tests/data/lsm_grids/lis/LIS_HIST_201101212200.d01.nc b/tests/data/lsm_grids/lis/LIS_HIST_201101212200.d01.nc new file mode 100755 index 0000000..91cc51d Binary files /dev/null and b/tests/data/lsm_grids/lis/LIS_HIST_201101212200.d01.nc differ diff --git a/tests/data/lsm_grids/lis/LIS_HIST_201101212300.d01.nc b/tests/data/lsm_grids/lis/LIS_HIST_201101212300.d01.nc new file mode 100755 index 0000000..b1eb634 Binary files /dev/null and b/tests/data/lsm_grids/lis/LIS_HIST_201101212300.d01.nc differ diff --git a/tests/data/lsm_grids/nldas2/NLDAS_VIC0125_H.A20030121.2100.002.nc b/tests/data/lsm_grids/nldas2/NLDAS_VIC0125_H.A20030121.2100.002.nc new file mode 100755 index 0000000..8fb34b2 Binary files /dev/null and b/tests/data/lsm_grids/nldas2/NLDAS_VIC0125_H.A20030121.2100.002.nc differ diff --git a/tests/data/lsm_grids/nldas2/NLDAS_VIC0125_H.A20030121.2200.002.nc b/tests/data/lsm_grids/nldas2/NLDAS_VIC0125_H.A20030121.2200.002.nc new file mode 100755 index 0000000..ae45e07 Binary files /dev/null and b/tests/data/lsm_grids/nldas2/NLDAS_VIC0125_H.A20030121.2200.002.nc differ diff --git a/tests/data/lsm_grids/nldas2/NLDAS_VIC0125_H.A20030121.2300.002.nc b/tests/data/lsm_grids/nldas2/NLDAS_VIC0125_H.A20030121.2300.002.nc new file mode 100755 index 0000000..00be945 Binary files /dev/null and b/tests/data/lsm_grids/nldas2/NLDAS_VIC0125_H.A20030121.2300.002.nc differ diff --git a/tests/data/lsm_grids/wrf/diffro_d02_20080601010000.nc b/tests/data/lsm_grids/wrf/diffro_d02_20080601010000.nc new file mode 100755 index 0000000..8a1f5d7 Binary files /dev/null and b/tests/data/lsm_grids/wrf/diffro_d02_20080601010000.nc differ diff --git a/tests/data/lsm_grids/wrf/diffro_d02_20080601020000.nc b/tests/data/lsm_grids/wrf/diffro_d02_20080601020000.nc new file mode 100755 index 0000000..b8f3e25 Binary files /dev/null and b/tests/data/lsm_grids/wrf/diffro_d02_20080601020000.nc differ diff --git a/tests/data/lsm_grids/wrf/diffro_d02_20080601030000.nc b/tests/data/lsm_grids/wrf/diffro_d02_20080601030000.nc new file mode 100755 index 0000000..dbdff30 Binary files /dev/null and b/tests/data/lsm_grids/wrf/diffro_d02_20080601030000.nc differ diff --git a/tests/data/lsm_grids/wrf/diffro_d02_20080601040000.nc b/tests/data/lsm_grids/wrf/diffro_d02_20080601040000.nc new file mode 100755 index 0000000..50cc269 Binary files /dev/null and b/tests/data/lsm_grids/wrf/diffro_d02_20080601040000.nc differ diff --git a/tests/data/lsm_grids/wrf/diffro_d02_20080601050000.nc b/tests/data/lsm_grids/wrf/diffro_d02_20080601050000.nc new file mode 100755 index 0000000..8190090 Binary files /dev/null and b/tests/data/lsm_grids/wrf/diffro_d02_20080601050000.nc differ diff --git a/tests/data/lsm_grids/wrf/diffro_d02_20080601060000.nc b/tests/data/lsm_grids/wrf/diffro_d02_20080601060000.nc new file mode 100755 index 0000000..25b7e01 Binary files /dev/null and b/tests/data/lsm_grids/wrf/diffro_d02_20080601060000.nc differ diff --git a/tests/data/lsm_grids/wrf/diffro_d02_20080601070000.nc b/tests/data/lsm_grids/wrf/diffro_d02_20080601070000.nc new file mode 100755 index 0000000..e945598 Binary files /dev/null and b/tests/data/lsm_grids/wrf/diffro_d02_20080601070000.nc differ diff --git a/tests/data/lsm_grids/wrf/diffro_d02_20080601080000.nc b/tests/data/lsm_grids/wrf/diffro_d02_20080601080000.nc new file mode 100755 index 0000000..03bb5a9 Binary files /dev/null and b/tests/data/lsm_grids/wrf/diffro_d02_20080601080000.nc differ diff --git a/tests/data/lsm_grids/wrf/diffro_d02_20080601090000.nc b/tests/data/lsm_grids/wrf/diffro_d02_20080601090000.nc new file mode 100755 index 0000000..7fdcab6 Binary files /dev/null and b/tests/data/lsm_grids/wrf/diffro_d02_20080601090000.nc differ diff --git a/tests/data/lsm_grids/wrf/diffro_d02_20080601100000.nc b/tests/data/lsm_grids/wrf/diffro_d02_20080601100000.nc new file mode 100755 index 0000000..e0c1466 Binary files /dev/null and b/tests/data/lsm_grids/wrf/diffro_d02_20080601100000.nc differ diff --git a/tests/data/lsm_grids/wrf/diffro_d02_20080601110000.nc b/tests/data/lsm_grids/wrf/diffro_d02_20080601110000.nc new file mode 100755 index 0000000..5d5f177 Binary files /dev/null and b/tests/data/lsm_grids/wrf/diffro_d02_20080601110000.nc differ diff --git a/tests/data/lsm_grids/wrf/diffro_d02_20080601120000.nc b/tests/data/lsm_grids/wrf/diffro_d02_20080601120000.nc new file mode 100755 index 0000000..5ce638b Binary files /dev/null and b/tests/data/lsm_grids/wrf/diffro_d02_20080601120000.nc differ diff --git a/tests/data/lsm_grids/wrf/diffro_d02_20080601130000.nc b/tests/data/lsm_grids/wrf/diffro_d02_20080601130000.nc new file mode 100755 index 0000000..5dba853 Binary files /dev/null and b/tests/data/lsm_grids/wrf/diffro_d02_20080601130000.nc differ diff --git a/tests/data/lsm_grids/wrf/diffro_d02_20080601140000.nc b/tests/data/lsm_grids/wrf/diffro_d02_20080601140000.nc new file mode 100755 index 0000000..48f1385 Binary files /dev/null and b/tests/data/lsm_grids/wrf/diffro_d02_20080601140000.nc differ diff --git a/tests/data/lsm_grids/wrf/diffro_d02_20080601150000.nc b/tests/data/lsm_grids/wrf/diffro_d02_20080601150000.nc new file mode 100755 index 0000000..f2474d7 Binary files /dev/null and b/tests/data/lsm_grids/wrf/diffro_d02_20080601150000.nc differ diff --git a/tests/data/lsm_grids/wrf/diffro_d02_20080601160000.nc b/tests/data/lsm_grids/wrf/diffro_d02_20080601160000.nc new file mode 100755 index 0000000..4ca4019 Binary files /dev/null and b/tests/data/lsm_grids/wrf/diffro_d02_20080601160000.nc differ diff --git a/tests/data/lsm_grids/wrf/diffro_d02_20080601170000.nc b/tests/data/lsm_grids/wrf/diffro_d02_20080601170000.nc new file mode 100755 index 0000000..b2a8a0a Binary files /dev/null and b/tests/data/lsm_grids/wrf/diffro_d02_20080601170000.nc differ diff --git a/tests/data/lsm_grids/wrf/diffro_d02_20080601180000.nc b/tests/data/lsm_grids/wrf/diffro_d02_20080601180000.nc new file mode 100755 index 0000000..c31d1d4 Binary files /dev/null and b/tests/data/lsm_grids/wrf/diffro_d02_20080601180000.nc differ diff --git a/tests/data/lsm_grids/wrf/diffro_d02_20080601190000.nc b/tests/data/lsm_grids/wrf/diffro_d02_20080601190000.nc new file mode 100755 index 0000000..9e9c8b7 Binary files /dev/null and b/tests/data/lsm_grids/wrf/diffro_d02_20080601190000.nc differ diff --git a/tests/data/lsm_grids/wrf/diffro_d02_20080601200000.nc b/tests/data/lsm_grids/wrf/diffro_d02_20080601200000.nc new file mode 100755 index 0000000..e807b39 Binary files /dev/null and b/tests/data/lsm_grids/wrf/diffro_d02_20080601200000.nc differ diff --git a/tests/data/lsm_grids/wrf/diffro_d02_20080601210000.nc b/tests/data/lsm_grids/wrf/diffro_d02_20080601210000.nc new file mode 100755 index 0000000..4351169 Binary files /dev/null and b/tests/data/lsm_grids/wrf/diffro_d02_20080601210000.nc differ diff --git a/tests/data/lsm_grids/wrf/diffro_d02_20080601220000.nc b/tests/data/lsm_grids/wrf/diffro_d02_20080601220000.nc new file mode 100755 index 0000000..c23acab Binary files /dev/null and b/tests/data/lsm_grids/wrf/diffro_d02_20080601220000.nc differ diff --git a/tests/data/lsm_grids/wrf/diffro_d02_20080601230000.nc b/tests/data/lsm_grids/wrf/diffro_d02_20080601230000.nc new file mode 100755 index 0000000..d84709e Binary files /dev/null and b/tests/data/lsm_grids/wrf/diffro_d02_20080601230000.nc differ diff --git a/tests/data/m3_nasa_lis_3hr_20020830.nc b/tests/data/m3_nasa_lis_3hr_20020830.nc new file mode 100644 index 0000000..b33b43f Binary files /dev/null and b/tests/data/m3_nasa_lis_3hr_20020830.nc differ diff --git a/tests/data/obs_flow.csv b/tests/data/obs_flow.csv new file mode 100644 index 0000000..f8cba05 --- /dev/null +++ b/tests/data/obs_flow.csv @@ -0,0 +1,2 @@ +31.60,31.60 +30.30,30.30 diff --git a/tests/data/obs_flow_1.csv b/tests/data/obs_flow_1.csv new file mode 100644 index 0000000..43dbd73 --- /dev/null +++ b/tests/data/obs_flow_1.csv @@ -0,0 +1,2 @@ +31.6,,,,,, +30.3,,,,,, diff --git a/tests/data/obs_reach_id.csv b/tests/data/obs_reach_id.csv new file mode 100644 index 0000000..1d2d7f5 --- /dev/null +++ b/tests/data/obs_reach_id.csv @@ -0,0 +1,2 @@ +75224 +75224 diff --git a/tests/data/obs_reach_id_1.csv b/tests/data/obs_reach_id_1.csv new file mode 100644 index 0000000..719c61e --- /dev/null +++ b/tests/data/obs_reach_id_1.csv @@ -0,0 +1 @@ +75224,,,,,, diff --git a/tests/data/rapid_connect.csv b/tests/data/rapid_connect.csv new file mode 100644 index 0000000..476ed67 --- /dev/null +++ b/tests/data/rapid_connect.csv @@ -0,0 +1,4168 @@ +70563,70666,0,0,0,0 +70564,70666,0,0,0,0 +70618,70648,0,0,0,0 +70625,70648,2,70652,70963,0 +70626,70652,0,0,0,0 +70640,70817,0,0,0,0 +70648,70817,2,70618,70625,0 +70652,70625,2,70626,70657,0 +70654,70748,0,0,0,0 +70655,70748,0,0,0,0 +70656,70658,0,0,0,0 +70657,70652,2,70658,70660,0 +70658,70657,2,70656,70665,0 +70660,70657,0,0,0,0 +70665,70658,2,70666,70688,0 +70666,70665,2,70563,70564,0 +70688,70665,2,70707,70736,0 +70707,70688,2,70773,70867,0 +70736,70688,2,70737,70754,0 +70737,70736,0,0,0,0 +70748,70755,2,70654,70655,0 +70750,70754,0,0,0,0 +70752,70791,0,0,0,0 +70754,70736,2,70750,70761,0 +70755,70791,2,70748,70906,0 +70761,70754,2,70766,71087,0 +70766,70761,0,0,0,0 +70773,70707,0,0,0,0 +70782,70792,0,0,0,0 +70788,70792,0,0,0,0 +70791,70871,2,70752,70755,0 +70792,70871,2,70782,70788,0 +70817,70822,2,70640,70648,0 +70821,70833,2,70822,70960,0 +70822,70821,2,70817,70883,0 +70867,70707,0,0,0,0 +70871,70990,2,70791,70792,0 +70876,70990,0,0,0,0 +70883,70822,0,0,0,0 +70906,70755,0,0,0,0 +70960,70821,2,70961,70971,0 +70961,70960,0,0,0,0 +70963,70625,2,70986,71043,0 +70970,70986,0,0,0,0 +70971,70960,0,0,0,0 +70986,70963,2,70970,71029,0 +70990,71078,2,70871,70876,0 +71017,71078,0,0,0,0 +71029,70986,0,0,0,0 +71043,70963,2,71130,71209,0 +71060,71120,0,0,0,0 +71078,71082,2,70990,71017,0 +71082,71083,2,71078,71095,0 +71083,71120,2,71082,71135,0 +71087,70761,0,0,0,0 +71095,71082,2,71105,71226,0 +71105,71095,0,0,0,0 +71120,71121,2,71060,71083,0 +71121,71093,2,71120,71208,0 +71130,71043,0,0,0,0 +71135,71083,0,0,0,0 +71208,71121,2,71259,71263,0 +71209,71043,2,71244,71247,0 +71212,71271,0,0,0,0 +71222,71388,0,0,0,0 +71223,71388,2,71246,71344,0 +71226,71095,0,0,0,0 +71235,71271,0,0,0,0 +71238,71246,0,0,0,0 +71244,71209,2,71271,71293,0 +71246,71223,2,71238,71258,0 +71247,71209,0,0,0,0 +71258,71246,2,71274,71450,0 +71259,71208,0,0,0,0 +71263,71208,0,0,0,0 +71271,71244,2,71212,71235,0 +71274,71258,0,0,0,0 +71280,71332,0,0,0,0 +71293,71244,2,71296,71351,0 +71296,71293,0,0,0,0 +71301,71314,0,0,0,0 +71308,71314,0,0,0,0 +71314,71332,2,71301,71308,0 +71331,71442,0,0,0,0 +71332,71442,2,71280,71314,0 +71337,71250,2,71361,71510,0 +71344,71223,0,0,0,0 +71351,71293,0,0,0,0 +71361,71337,0,0,0,0 +71383,71387,0,0,0,0 +71384,71387,0,0,0,0 +71387,71392,2,71383,71384,0 +71388,71392,2,71222,71223,0 +71392,71434,2,71387,71388,0 +71407,71464,0,0,0,0 +71426,71618,0,0,0,0 +71427,71618,0,0,0,0 +71429,71239,2,71497,71752,0 +71430,71415,1,71514,0,0 +71433,71464,2,71434,71468,0 +71434,71433,2,71392,71595,0 +71441,71559,0,0,0,0 +71442,71559,2,71331,71332,0 +71450,71258,2,71481,71498,0 +71457,71471,0,0,0,0 +71458,71560,0,0,0,0 +71462,71560,2,71463,71494,0 +71463,71462,0,0,0,0 +71464,71471,2,71407,71433,0 +71468,71433,2,71643,71700,0 +71471,71496,2,71457,71464,0 +71481,71450,0,0,0,0 +71483,71499,0,0,0,0 +71487,71500,0,0,0,0 +71488,71496,2,71642,71699,0 +71492,71648,0,0,0,0 +71493,71648,0,0,0,0 +71494,71462,0,0,0,0 +71495,71509,0,0,0,0 +71496,71509,2,71471,71488,0 +71497,71429,2,71572,71750,0 +71498,71450,2,71499,71623,0 +71499,71498,2,71483,71506,0 +71500,71506,2,71487,71507,0 +71502,71574,0,0,0,0 +71506,71499,2,71500,71653,0 +71507,71500,2,71508,71549,0 +71508,71507,0,0,0,0 +71509,71574,2,71495,71496,0 +71510,71337,2,71513,71550,0 +71513,71510,0,0,0,0 +71514,71430,0,0,0,0 +71519,71415,2,71544,71632,0 +71520,71619,0,0,0,0 +71526,71596,0,0,0,0 +71527,71596,0,0,0,0 +71542,71602,0,0,0,0 +71544,71519,0,0,0,0 +71549,71507,0,0,0,0 +71550,71510,2,71664,71690,0 +71559,71564,2,71441,71442,0 +71560,71564,2,71458,71462,0 +71561,71611,0,0,0,0 +71564,71757,2,71559,71560,0 +71565,71757,0,0,0,0 +71566,71602,2,71600,71601,0 +71571,71620,0,0,0,0 +71572,71497,2,71613,71754,0 +71573,71667,0,0,0,0 +71574,71667,2,71502,71509,0 +71580,71619,0,0,0,0 +71585,71615,0,0,0,0 +71588,71615,0,0,0,0 +71595,71434,2,71706,71720,0 +71596,71597,2,71526,71527,0 +71597,71611,2,71596,71717,0 +71600,71566,2,71622,71748,0 +71601,71566,0,0,0,0 +71602,71612,2,71542,71566,0 +71603,71612,0,0,0,0 +71611,71650,2,71561,71597,0 +71612,71613,2,71602,71603,0 +71613,71572,2,71612,71617,0 +71615,71759,2,71585,71588,0 +71617,71613,2,71751,71863,0 +71618,71644,2,71426,71427,0 +71619,71644,2,71520,71580,0 +71620,71759,2,71571,71625,0 +71622,71600,2,71731,71917,0 +71623,71498,0,0,0,0 +71624,71625,0,0,0,0 +71625,71620,2,71624,71660,0 +71632,71519,2,71634,71768,0 +71634,71632,0,0,0,0 +71638,71665,0,0,0,0 +71642,71488,0,0,0,0 +71643,71468,2,71656,71668,0 +71644,71649,2,71618,71619,0 +71645,71734,0,0,0,0 +71646,71734,0,0,0,0 +71647,71718,0,0,0,0 +71648,71718,2,71492,71493,0 +71649,71719,2,71644,71766,0 +71650,71660,2,71611,71749,0 +71653,71506,0,0,0,0 +71656,71643,0,0,0,0 +71660,71625,2,71650,71728,0 +71664,71550,2,71665,71746,0 +71665,71664,2,71638,71685,0 +71666,71858,0,0,0,0 +71667,71858,2,71573,71574,0 +71668,71643,0,0,0,0 +71670,71719,0,0,0,0 +71684,71686,0,0,0,0 +71685,71665,2,71686,71769,0 +71686,71685,2,71684,71701,0 +71690,71550,2,71692,71915,0 +71692,71690,0,0,0,0 +71699,71488,2,71738,71900,0 +71700,71468,0,0,0,0 +71701,71686,0,0,0,0 +71706,71595,2,71707,71895,0 +71707,71706,0,0,0,0 +71716,71717,0,0,0,0 +71717,71597,2,71716,71800,0 +71718,71931,2,71647,71648,0 +71719,71931,2,71649,71670,0 +71720,71595,2,71724,71733,0 +71724,71720,0,0,0,0 +71728,71660,0,0,0,0 +71731,71622,2,71745,72076,0 +71733,71720,0,0,0,0 +71734,71745,2,71645,71646,0 +71738,71699,0,0,0,0 +71745,71731,2,71734,71815,0 +71746,71664,2,71772,71854,0 +71748,71600,2,71835,71849,0 +71749,71650,2,71765,71843,0 +71750,71497,2,71773,71831,0 +71751,71617,0,0,0,0 +71752,71429,0,0,0,0 +71754,71572,0,0,0,0 +71757,71983,2,71564,71565,0 +71759,71955,2,71615,71620,0 +71765,71749,0,0,0,0 +71766,71649,0,0,0,0 +71768,71632,2,71818,71840,0 +71769,71685,0,0,0,0 +71772,71746,0,0,0,0 +71773,71750,0,0,0,0 +71779,71784,2,71803,71847,0 +71780,71955,0,0,0,0 +71784,71910,2,71779,71804,0 +71800,71717,2,71812,71890,0 +71801,71907,0,0,0,0 +71802,71907,0,0,0,0 +71803,71779,0,0,0,0 +71804,71784,0,0,0,0 +71812,71800,0,0,0,0 +71815,71745,2,71935,71996,0 +71818,71768,2,71927,71974,0 +71831,71750,2,71860,71925,0 +71835,71748,2,71887,72041,0 +71840,71768,2,71841,72094,0 +71841,71840,0,0,0,0 +71843,71749,0,0,0,0 +71847,71779,0,0,0,0 +71849,71748,0,0,0,0 +71853,71983,2,71857,71882,0 +71854,71746,2,71888,71970,0 +71857,71853,2,71939,72035,0 +71858,71959,2,71666,71667,0 +71860,71831,0,0,0,0 +71863,71617,0,0,0,0 +71876,71959,2,71914,71946,0 +71879,71910,0,0,0,0 +71882,71853,2,71916,71969,0 +71887,71835,0,0,0,0 +71888,71854,0,0,0,0 +71890,71800,0,0,0,0 +71895,71706,2,71909,72029,0 +71900,71699,0,0,0,0 +71907,71914,2,71801,71802,0 +71908,71914,2,71940,71963,0 +71909,71895,2,71910,72002,0 +71910,71909,2,71784,71879,0 +71914,71876,2,71907,71908,0 +71915,71690,0,0,0,0 +71916,71882,0,0,0,0 +71917,71622,0,0,0,0 +71925,71831,2,72098,72103,0 +71927,71818,0,0,0,0 +71931,72007,2,71718,71719,0 +71934,72007,0,0,0,0 +71935,71815,0,0,0,0 +71939,71857,2,71961,72213,0 +71940,71908,0,0,0,0 +71946,71876,2,72003,72084,0 +71947,72187,0,0,0,0 +71948,72187,0,0,0,0 +71949,71975,0,0,0,0 +71955,71956,2,71759,71780,0 +71956,71975,2,71955,71990,0 +71959,71961,2,71858,71876,0 +71961,71939,2,71959,71977,0 +71963,71908,0,0,0,0 +71969,71882,0,0,0,0 +71970,71854,2,71988,72128,0 +71974,71818,0,0,0,0 +71975,71976,2,71949,71956,0 +71976,71822,2,71975,72156,0 +71977,71961,0,0,0,0 +71983,72018,2,71757,71853,0 +71984,72018,0,0,0,0 +71987,72008,0,0,0,0 +71988,71970,2,72100,72188,0 +71989,71990,0,0,0,0 +71990,71956,2,71989,72118,0 +71996,71815,0,0,0,0 +71997,72008,0,0,0,0 +72001,72051,0,0,0,0 +72002,71909,2,72030,72211,0 +72003,71946,2,72080,72357,0 +72006,72074,0,0,0,0 +72007,72074,2,71931,71934,0 +72008,72096,2,71987,71997,0 +72009,72096,0,0,0,0 +72018,72051,2,71983,71984,0 +72029,71895,0,0,0,0 +72030,72002,0,0,0,0 +72033,71901,2,72034,72123,0 +72034,72033,0,0,0,0 +72035,71857,0,0,0,0 +72041,71835,0,0,0,0 +72051,72497,2,72001,72018,0 +72052,72497,0,0,0,0 +72055,72158,0,0,0,0 +72056,72158,0,0,0,0 +72074,72157,2,72006,72007,0 +72075,72157,0,0,0,0 +72076,71731,0,0,0,0 +72080,72003,0,0,0,0 +72084,71946,0,0,0,0 +72087,72101,0,0,0,0 +72089,72283,0,0,0,0 +72090,72120,0,0,0,0 +72092,72102,0,0,0,0 +72093,72271,0,0,0,0 +72094,71840,2,72101,72139,0 +72095,72271,0,0,0,0 +72096,72283,2,72008,72009,0 +72098,71925,0,0,0,0 +72100,71988,2,72102,72324,0 +72101,72094,2,72087,72104,0 +72102,72100,2,72092,72245,0 +72103,71925,0,0,0,0 +72104,72101,0,0,0,0 +72111,72123,0,0,0,0 +72118,71990,2,72120,72122,0 +72120,72118,2,72090,72124,0 +72122,72118,2,72179,72247,0 +72123,72033,2,72111,72440,0 +72124,72120,0,0,0,0 +72128,71970,2,72129,72134,0 +72129,72128,2,72175,72377,0 +72134,72128,2,72266,72402,0 +72139,72094,2,72155,72233,0 +72147,72203,0,0,0,0 +72153,72167,0,0,0,0 +72154,72155,0,0,0,0 +72155,72139,2,72154,72183,0 +72156,71976,2,72178,72268,0 +72157,72347,2,72074,72075,0 +72158,72347,2,72055,72056,0 +72167,72269,2,72153,72195,0 +72168,72269,0,0,0,0 +72175,72129,2,72189,72205,0 +72178,72156,0,0,0,0 +72179,72122,2,72272,72307,0 +72183,72155,2,72224,72286,0 +72186,72200,0,0,0,0 +72187,72200,2,71947,71948,0 +72188,71988,0,0,0,0 +72189,72175,2,72190,72321,0 +72190,72189,0,0,0,0 +72195,72167,0,0,0,0 +72196,72314,0,0,0,0 +72200,72326,2,72186,72187,0 +72203,72314,2,72147,72212,0 +72205,72175,0,0,0,0 +72211,72002,2,72252,72264,0 +72212,72203,0,0,0,0 +72213,71939,2,72251,72320,0 +72224,72183,0,0,0,0 +72233,72139,0,0,0,0 +72241,72326,0,0,0,0 +72245,72102,2,72253,72431,0 +72247,72122,0,0,0,0 +72251,72213,0,0,0,0 +72252,72211,2,72277,72288,0 +72253,72245,0,0,0,0 +72257,72279,0,0,0,0 +72262,72264,0,0,0,0 +72264,72211,2,72262,72318,0 +72266,72134,2,72270,72317,0 +72267,72285,0,0,0,0 +72268,72156,2,72292,72465,0 +72269,72318,2,72167,72168,0 +72270,72266,0,0,0,0 +72271,72272,2,72093,72095,0 +72272,72179,2,72271,72325,0 +72276,72285,0,0,0,0 +72277,72252,2,72279,72281,0 +72278,71901,2,72282,72367,0 +72279,72277,2,72257,72290,0 +72281,72277,0,0,0,0 +72282,72278,0,0,0,0 +72283,72342,2,72089,72096,0 +72285,72342,2,72267,72276,0 +72286,72183,2,72289,72384,0 +72288,72252,2,72340,72510,0 +72289,72286,2,72417,72476,0 +72290,72279,2,72309,72341,0 +72292,72268,0,0,0,0 +72297,72309,0,0,0,0 +72305,72306,0,0,0,0 +72306,72318,2,72305,72420,0 +72307,72179,0,0,0,0 +72309,72290,2,72297,72312,0 +72312,72309,0,0,0,0 +72313,72448,0,0,0,0 +72314,72448,2,72196,72203,0 +72317,72266,2,72379,72538,0 +72318,72264,2,72269,72306,0 +72320,72213,2,72480,72534,0 +72321,72189,0,0,0,0 +72324,72100,2,72355,72471,0 +72325,72272,2,72335,72346,0 +72326,72411,2,72200,72241,0 +72331,72411,2,72332,72333,0 +72332,72331,0,0,0,0 +72333,72331,0,0,0,0 +72335,72325,0,0,0,0 +72340,72288,0,0,0,0 +72341,72290,0,0,0,0 +72342,72354,2,72283,72285,0 +72343,72354,0,0,0,0 +72346,72325,2,72382,72427,0 +72347,72412,2,72157,72158,0 +72348,72412,0,0,0,0 +72354,72375,2,72342,72343,0 +72355,72324,2,72368,72460,0 +72357,72003,0,0,0,0 +72358,72392,0,0,0,0 +72359,72368,0,0,0,0 +72366,72367,0,0,0,0 +72367,72278,2,72366,72430,0 +72368,72355,2,72359,72560,0 +72370,72416,0,0,0,0 +72374,72375,0,0,0,0 +72375,72392,2,72354,72374,0 +72377,72129,0,0,0,0 +72378,72379,0,0,0,0 +72379,72317,2,72378,72503,0 +72382,72346,2,72404,72542,0 +72383,72408,0,0,0,0 +72384,72286,0,0,0,0 +72392,72408,2,72358,72375,0 +72393,72435,0,0,0,0 +72394,72435,0,0,0,0 +72396,72676,0,0,0,0 +72401,72427,0,0,0,0 +72402,72134,0,0,0,0 +72404,72382,0,0,0,0 +72407,72494,0,0,0,0 +72408,72409,2,72383,72392,0 +72409,72427,2,72408,72470,0 +72411,72425,2,72326,72331,0 +72412,72426,2,72347,72348,0 +72413,72426,0,0,0,0 +72416,72494,2,72370,72502,0 +72417,72289,0,0,0,0 +72420,72306,0,0,0,0 +72422,72676,0,0,0,0 +72425,72557,2,72411,72472,0 +72426,72557,2,72412,72413,0 +72427,72346,2,72401,72409,0 +72430,72367,2,72461,72525,0 +72431,72245,2,72433,72656,0 +72433,72431,0,0,0,0 +72435,72822,2,72393,72394,0 +72436,72822,0,0,0,0 +72440,72123,0,0,0,0 +72448,72492,2,72313,72314,0 +72452,72550,0,0,0,0 +72454,72506,0,0,0,0 +72455,72506,0,0,0,0 +72460,72355,0,0,0,0 +72461,72430,2,72499,72530,0 +72462,72550,0,0,0,0 +72465,72268,0,0,0,0 +72467,72715,0,0,0,0 +72470,72409,0,0,0,0 +72471,72324,0,0,0,0 +72472,72425,2,72475,72583,0 +72475,72472,0,0,0,0 +72476,72289,2,72488,72576,0 +72480,72320,0,0,0,0 +72482,72492,0,0,0,0 +72485,72631,0,0,0,0 +72486,72631,0,0,0,0 +72488,72476,0,0,0,0 +72492,72715,2,72448,72482,0 +72494,72498,2,72407,72416,0 +72497,72524,2,72051,72052,0 +72498,72524,2,72494,72501,0 +72499,72461,0,0,0,0 +72501,72498,2,72519,72710,0 +72502,72416,2,72518,72537,0 +72503,72379,0,0,0,0 +72506,72558,2,72454,72455,0 +72510,72288,0,0,0,0 +72518,72502,0,0,0,0 +72519,72501,2,72623,72642,0 +72523,72562,0,0,0,0 +72524,72562,2,72497,72498,0 +72525,72430,2,72580,72609,0 +72530,72461,0,0,0,0 +72533,72558,0,0,0,0 +72534,72320,2,72544,72561,0 +72537,72502,0,0,0,0 +72538,72317,2,72569,72635,0 +72542,72382,2,72545,72647,0 +72544,72534,0,0,0,0 +72545,72542,2,72655,72705,0 +72549,72838,0,0,0,0 +72550,72838,2,72452,72462,0 +72557,72615,2,72425,72426,0 +72558,72615,2,72506,72533,0 +72560,72368,0,0,0,0 +72561,72534,2,72589,72702,0 +72562,72709,2,72523,72524,0 +72563,72709,0,0,0,0 +72568,72575,0,0,0,0 +72569,72538,2,72586,72616,0 +72572,72611,0,0,0,0 +72575,72611,2,72568,72599,0 +72576,72476,2,72577,72585,0 +72577,72576,0,0,0,0 +72580,72525,2,72644,72654,0 +72583,72472,0,0,0,0 +72585,72576,0,0,0,0 +72586,72569,0,0,0,0 +72589,72561,0,0,0,0 +72590,72648,0,0,0,0 +72594,72650,0,0,0,0 +72595,72650,0,0,0,0 +72599,72575,0,0,0,0 +72600,72648,2,72601,72649,0 +72601,72600,0,0,0,0 +72605,72612,0,0,0,0 +72608,72612,0,0,0,0 +72609,72525,0,0,0,0 +72611,72738,2,72572,72575,0 +72612,72738,2,72605,72608,0 +72615,73324,2,72557,72558,0 +72616,72569,2,72695,72881,0 +72620,72624,0,0,0,0 +72621,72624,0,0,0,0 +72623,72519,0,0,0,0 +72624,73019,2,72620,72621,0 +72625,73019,0,0,0,0 +72628,73324,0,0,0,0 +72631,72673,2,72485,72486,0 +72632,72673,0,0,0,0 +72634,72635,0,0,0,0 +72635,72538,2,72634,72662,0 +72639,72668,0,0,0,0 +72642,72519,0,0,0,0 +72644,72580,0,0,0,0 +72647,72542,2,72648,72766,0 +72648,72647,2,72590,72600,0 +72649,72600,0,0,0,0 +72650,72743,2,72594,72595,0 +72654,72580,2,72681,72692,0 +72655,72545,2,72686,72704,0 +72656,72431,0,0,0,0 +72662,72635,0,0,0,0 +72663,72743,0,0,0,0 +72664,72752,0,0,0,0 +72665,72752,0,0,0,0 +72668,72693,2,72639,72690,0 +72669,72693,0,0,0,0 +72673,72821,2,72631,72632,0 +72674,72821,0,0,0,0 +72675,72725,0,0,0,0 +72676,72725,2,72396,72422,0 +72677,72753,0,0,0,0 +72678,72753,0,0,0,0 +72681,72654,2,72684,72809,0 +72684,72681,0,0,0,0 +72685,72686,0,0,0,0 +72686,72655,2,72685,72732,0 +72690,72668,0,0,0,0 +72692,72654,0,0,0,0 +72693,72732,2,72668,72669,0 +72694,72732,0,0,0,0 +72695,72616,0,0,0,0 +72702,72561,2,72765,72825,0 +72704,72655,2,72761,72777,0 +72705,72545,0,0,0,0 +72708,72794,0,0,0,0 +72709,72794,2,72562,72563,0 +72710,72501,0,0,0,0 +72715,72797,2,72467,72492,0 +72716,72797,0,0,0,0 +72718,73091,0,0,0,0 +72719,73091,0,0,0,0 +72725,72975,2,72675,72676,0 +72726,72975,0,0,0,0 +72732,72686,2,72693,72694,0 +72738,72944,2,72611,72612,0 +72741,72944,0,0,0,0 +72742,72988,0,0,0,0 +72743,72988,2,72650,72663,0 +72745,72767,2,72746,72796,0 +72746,72745,0,0,0,0 +72752,72836,2,72664,72665,0 +72753,72836,2,72677,72678,0 +72761,72704,0,0,0,0 +72765,72702,0,0,0,0 +72766,72647,2,72767,72812,0 +72767,72766,2,72745,72854,0 +72771,72839,0,0,0,0 +72772,72839,0,0,0,0 +72773,72799,0,0,0,0 +72777,72704,0,0,0,0 +72780,72803,0,0,0,0 +72781,72803,0,0,0,0 +72784,72984,0,0,0,0 +72785,72984,0,0,0,0 +72794,72852,2,72708,72709,0 +72795,72852,0,0,0,0 +72796,72745,0,0,0,0 +72797,72799,2,72715,72716,0 +72798,73093,0,0,0,0 +72799,72890,2,72773,72797,0 +72800,72890,0,0,0,0 +72801,72879,2,72808,72819,0 +72802,72948,0,0,0,0 +72803,72948,2,72780,72781,0 +72804,72865,0,0,0,0 +72805,72865,0,0,0,0 +72808,72801,2,72867,72950,0 +72809,72681,2,72836,72883,0 +72812,72766,2,72826,72882,0 +72815,72859,0,0,0,0 +72818,73093,0,0,0,0 +72819,72801,0,0,0,0 +72820,72859,2,72849,72884,0 +72821,72886,2,72673,72674,0 +72822,72886,2,72435,72436,0 +72825,72702,0,0,0,0 +72826,72812,0,0,0,0 +72836,72809,2,72752,72753,0 +72838,72889,2,72549,72550,0 +72839,72889,2,72771,72772,0 +72843,72924,0,0,0,0 +72849,72820,0,0,0,0 +72852,72910,2,72794,72795,0 +72854,72767,0,0,0,0 +72859,73352,2,72815,72820,0 +72860,73352,0,0,0,0 +72862,72960,0,0,0,0 +72865,72928,2,72804,72805,0 +72866,72960,0,0,0,0 +72867,72808,0,0,0,0 +72874,73026,0,0,0,0 +72878,72928,0,0,0,0 +72879,72910,2,72801,73149,0 +72881,72616,0,0,0,0 +72882,72812,0,0,0,0 +72883,72809,2,72951,72978,0 +72884,72820,0,0,0,0 +72885,73059,0,0,0,0 +72886,73059,2,72821,72822,0 +72888,73071,0,0,0,0 +72889,73071,2,72838,72839,0 +72890,73026,2,72799,72800,0 +72893,72913,0,0,0,0 +72894,72913,0,0,0,0 +72898,73018,0,0,0,0 +72902,73034,0,0,0,0 +72903,73034,0,0,0,0 +72908,73018,0,0,0,0 +72909,73147,0,0,0,0 +72910,73147,2,72852,72879,0 +72913,72970,2,72893,72894,0 +72920,72969,0,0,0,0 +72921,72969,0,0,0,0 +72924,72979,2,72843,72936,0 +72928,73111,2,72865,72878,0 +72929,73111,0,0,0,0 +72936,72924,0,0,0,0 +72939,73119,0,0,0,0 +72940,73119,0,0,0,0 +72944,72954,2,72738,72741,0 +72946,72970,0,0,0,0 +72948,72954,2,72802,72803,0 +72950,72808,0,0,0,0 +72951,72883,2,72981,73007,0 +72952,72962,0,0,0,0 +72953,73006,0,0,0,0 +72954,73006,2,72944,72948,0 +72956,72962,0,0,0,0 +72958,73055,0,0,0,0 +72960,72961,2,72862,72866,0 +72961,73055,2,72960,72977,0 +72962,73003,2,72952,72956,0 +72965,73131,0,0,0,0 +72968,73028,0,0,0,0 +72969,73131,2,72920,72921,0 +72970,73163,2,72913,72946,0 +72972,73163,0,0,0,0 +72974,72978,0,0,0,0 +72975,72983,2,72725,72726,0 +72977,72961,0,0,0,0 +72978,72883,2,72974,73013,0 +72979,72987,2,72924,73041,0 +72980,73003,0,0,0,0 +72981,72951,2,72987,73008,0 +72983,73368,2,72975,73089,0 +72984,73368,2,72784,72785,0 +72987,72981,2,72979,73115,0 +72988,73130,2,72742,72743,0 +73002,73028,0,0,0,0 +73003,73130,2,72962,72980,0 +73005,73046,0,0,0,0 +73006,73046,2,72953,72954,0 +73007,72951,0,0,0,0 +73008,72981,2,73142,73198,0 +73013,72978,0,0,0,0 +73016,73249,0,0,0,0 +73017,73249,0,0,0,0 +73018,73051,2,72898,72908,0 +73019,73051,2,72624,72625,0 +73026,73117,2,72874,72890,0 +73027,73068,0,0,0,0 +73028,73068,2,72968,73002,0 +73033,73067,2,73053,73070,0 +73034,73233,2,72902,72903,0 +73035,73233,0,0,0,0 +73036,73121,0,0,0,0 +73037,73121,0,0,0,0 +73038,73117,0,0,0,0 +73039,73077,0,0,0,0 +73040,73077,0,0,0,0 +73041,72979,0,0,0,0 +73046,73184,2,73005,73006,0 +73047,73184,0,0,0,0 +73051,73164,2,73018,73019,0 +73052,73164,0,0,0,0 +73053,73033,0,0,0,0 +73055,73128,2,72958,72961,0 +73057,73076,0,0,0,0 +73058,73386,0,0,0,0 +73059,73386,2,72885,72886,0 +73064,73104,0,0,0,0 +73066,73104,2,73067,73109,0 +73067,73066,2,73033,73140,0 +73068,73080,2,73027,73028,0 +73070,73033,0,0,0,0 +73071,73157,2,72888,72889,0 +73072,73157,0,0,0,0 +73076,73215,2,73057,73216,0 +73077,73215,2,73039,73040,0 +73080,73128,2,73068,73107,0 +73089,72983,0,0,0,0 +73090,73110,0,0,0,0 +73091,73284,2,72718,72719,0 +73092,73124,0,0,0,0 +73093,73124,2,72798,72818,0 +73094,73284,0,0,0,0 +73104,73148,2,73064,73066,0 +73106,73110,0,0,0,0 +73107,73080,2,73183,73205,0 +73109,73066,0,0,0,0 +73110,73123,2,73090,73106,0 +73111,73123,2,72928,72929,0 +73115,72987,0,0,0,0 +73116,73238,0,0,0,0 +73117,73238,2,73026,73038,0 +73119,73217,2,72939,72940,0 +73121,73627,2,73036,73037,0 +73122,73627,0,0,0,0 +73123,73221,2,73110,73111,0 +73124,73221,2,73092,73093,0 +73128,73229,2,73055,73080,0 +73129,73229,0,0,0,0 +73130,73179,2,72988,73003,0 +73131,73179,2,72965,72969,0 +73134,73206,0,0,0,0 +73135,73136,0,0,0,0 +73136,73217,2,73135,73195,0 +73140,73067,2,73141,73182,0 +73141,73140,0,0,0,0 +73142,73008,0,0,0,0 +73145,73206,0,0,0,0 +73147,73155,2,72909,72910,0 +73148,73155,2,73104,73308,0 +73149,72879,0,0,0,0 +73154,73261,0,0,0,0 +73155,73261,2,73147,73148,0 +73156,73170,0,0,0,0 +73157,73170,2,73071,73072,0 +73163,73400,2,72970,72972,0 +73164,73400,2,73051,73052,0 +73168,73218,0,0,0,0 +73169,73218,0,0,0,0 +73170,73338,2,73156,73157,0 +73178,73376,0,0,0,0 +73179,73376,2,73130,73131,0 +73182,73140,0,0,0,0 +73183,73107,0,0,0,0 +73184,73216,2,73046,73047,0 +73187,73338,0,0,0,0 +73194,73216,2,73208,73223,0 +73195,73136,0,0,0,0 +73198,73008,0,0,0,0 +73199,73219,0,0,0,0 +73200,73265,0,0,0,0 +73201,73265,0,0,0,0 +73205,73107,2,73206,73318,0 +73206,73205,2,73134,73145,0 +73207,73243,0,0,0,0 +73208,73194,0,0,0,0 +73215,73335,2,73076,73077,0 +73216,73076,2,73184,73194,0 +73217,73243,2,73119,73136,0 +73218,73420,2,73168,73169,0 +73219,73420,2,73199,73226,0 +73221,73317,2,73123,73124,0 +73222,73317,0,0,0,0 +73223,73194,0,0,0,0 +73226,73219,0,0,0,0 +73228,73247,0,0,0,0 +73229,73247,2,73128,73129,0 +73232,73246,0,0,0,0 +73233,73246,2,73034,73035,0 +73237,73379,0,0,0,0 +73238,73379,2,73116,73117,0 +73239,73396,0,0,0,0 +73240,73396,0,0,0,0 +73242,73319,0,0,0,0 +73243,73445,2,73207,73217,0 +73244,73445,0,0,0,0 +73245,73311,0,0,0,0 +73246,73282,2,73232,73233,0 +73247,73282,2,73228,73229,0 +73248,73311,0,0,0,0 +73249,73342,2,73016,73017,0 +73250,73406,0,0,0,0 +73251,73573,0,0,0,0 +73252,73573,0,0,0,0 +73256,73269,0,0,0,0 +73258,73342,0,0,0,0 +73261,73321,2,73154,73155,0 +73264,73295,0,0,0,0 +73265,73295,2,73200,73201,0 +73266,73319,2,73268,73395,0 +73268,73266,2,73269,73375,0 +73269,73268,2,73256,73529,0 +73277,73363,0,0,0,0 +73281,73329,0,0,0,0 +73282,73329,2,73246,73247,0 +73283,73424,0,0,0,0 +73284,73424,2,73091,73094,0 +73285,73335,0,0,0,0 +73292,73406,0,0,0,0 +73295,73298,2,73264,73265,0 +73296,73298,0,0,0,0 +73298,73393,2,73295,73296,0 +73300,73403,0,0,0,0 +73302,73452,0,0,0,0 +73303,73452,0,0,0,0 +73304,73363,0,0,0,0 +73305,73463,0,0,0,0 +73306,73463,0,0,0,0 +73308,73148,2,73398,73410,0 +73311,73327,2,73245,73248,0 +73312,73327,0,0,0,0 +73315,73321,0,0,0,0 +73316,73413,0,0,0,0 +73317,73413,2,73221,73222,0 +73318,73205,0,0,0,0 +73319,73393,2,73242,73266,0 +73321,73351,2,73261,73315,0 +73323,73391,0,0,0,0 +73324,73391,2,72615,72628,0 +73326,73330,0,0,0,0 +73327,73470,2,73311,73312,0 +73329,73343,2,73281,73282,0 +73330,73343,2,73326,73339,0 +73335,73336,2,73215,73285,0 +73336,73403,2,73335,73431,0 +73337,73405,0,0,0,0 +73338,73405,2,73170,73187,0 +73339,73330,0,0,0,0 +73340,73394,0,0,0,0 +73342,73348,2,73249,73258,0 +73343,73348,2,73329,73330,0 +73346,73389,0,0,0,0 +73347,73423,0,0,0,0 +73348,73392,2,73342,73343,0 +73351,73412,2,73321,73531,0 +73352,73556,2,72859,72860,0 +73353,73556,0,0,0,0 +73355,73394,0,0,0,0 +73362,73389,0,0,0,0 +73363,73411,2,73277,73304,0 +73364,73411,0,0,0,0 +73367,73385,0,0,0,0 +73368,73385,2,72983,72984,0 +73375,73268,0,0,0,0 +73376,73421,2,73178,73179,0 +73377,73421,0,0,0,0 +73378,73593,0,0,0,0 +73379,73593,2,73237,73238,0 +73385,73703,2,73367,73368,0 +73386,73387,2,73058,73059,0 +73387,73423,2,73386,73422,0 +73388,73703,0,0,0,0 +73389,73428,2,73346,73362,0 +73391,73601,2,73323,73324,0 +73392,73601,2,73348,73448,0 +73393,73626,2,73298,73319,0 +73394,73470,2,73340,73355,0 +73395,73266,2,73429,73476,0 +73396,73491,2,73239,73240,0 +73397,73485,0,0,0,0 +73398,73308,0,0,0,0 +73400,73469,2,73163,73164,0 +73403,73585,2,73300,73336,0 +73404,73626,2,73443,73712,0 +73405,73437,2,73337,73338,0 +73406,73469,2,73250,73292,0 +73407,73437,2,73428,73467,0 +73410,73308,0,0,0,0 +73411,73415,2,73363,73364,0 +73412,73415,2,73351,73432,0 +73413,73585,2,73316,73317,0 +73414,73521,0,0,0,0 +73415,73521,2,73411,73412,0 +73416,73428,0,0,0,0 +73420,73485,2,73218,73219,0 +73421,73422,2,73376,73377,0 +73422,73387,2,73421,73434,0 +73423,73484,2,73347,73387,0 +73424,73484,2,73283,73284,0 +73427,73491,0,0,0,0 +73428,73407,2,73389,73416,0 +73429,73395,0,0,0,0 +73431,73336,0,0,0,0 +73432,73412,0,0,0,0 +73434,73422,2,73446,73486,0 +73436,73457,0,0,0,0 +73437,73457,2,73405,73407,0 +73439,73778,0,0,0,0 +73443,73404,2,73444,73580,0 +73444,73443,0,0,0,0 +73445,73446,2,73243,73244,0 +73446,73434,2,73445,73496,0 +73448,73392,0,0,0,0 +73452,73508,2,73302,73303,0 +73456,73477,0,0,0,0 +73457,73477,2,73436,73437,0 +73463,73651,2,73305,73306,0 +73464,73651,0,0,0,0 +73467,73407,0,0,0,0 +73469,73508,2,73400,73406,0 +73470,73641,2,73327,73394,0 +73471,73778,0,0,0,0 +73473,73720,0,0,0,0 +73476,73395,0,0,0,0 +73477,73502,2,73456,73457,0 +73478,73684,0,0,0,0 +73479,73684,0,0,0,0 +73482,73641,2,73483,73540,0 +73483,73482,0,0,0,0 +73484,73569,2,73423,73424,0 +73485,73720,2,73397,73420,0 +73486,73434,2,73555,73564,0 +73487,73569,0,0,0,0 +73490,73504,0,0,0,0 +73491,73504,2,73396,73427,0 +73496,73446,0,0,0,0 +73501,73570,0,0,0,0 +73502,73570,2,73477,73586,0 +73508,73535,2,73452,73469,0 +73509,73535,0,0,0,0 +73514,73575,0,0,0,0 +73515,73575,0,0,0,0 +73521,73590,2,73414,73415,0 +73522,73590,0,0,0,0 +73523,73583,0,0,0,0 +73524,73636,0,0,0,0 +73525,73625,0,0,0,0 +73526,73625,0,0,0,0 +73529,73269,0,0,0,0 +73531,73351,0,0,0,0 +73532,73554,0,0,0,0 +73534,73756,0,0,0,0 +73535,73583,2,73508,73509,0 +73538,73665,0,0,0,0 +73540,73482,0,0,0,0 +73545,73546,0,0,0,0 +73546,73756,2,73545,73572,0 +73554,73636,2,73532,73583,0 +73555,73486,0,0,0,0 +73556,73571,2,73352,73353,0 +73564,73486,2,73571,73664,0 +73567,73588,0,0,0,0 +73568,73588,0,0,0,0 +73569,73643,2,73484,73487,0 +73570,73643,2,73501,73502,0 +73571,73564,2,73556,73596,0 +73572,73546,0,0,0,0 +73573,73605,2,73251,73252,0 +73575,73576,2,73514,73515,0 +73576,73605,1,73575,0,0 +73577,73665,0,0,0,0 +73580,73443,0,0,0,0 +73583,73554,2,73523,73535,0 +73584,73621,0,0,0,0 +73585,73621,2,73403,73413,0 +73586,73502,2,73589,73630,0 +73587,73615,0,0,0,0 +73588,73774,2,73567,73568,0 +73589,73586,0,0,0,0 +73590,73622,2,73521,73522,0 +73592,73615,0,0,0,0 +73593,73704,2,73378,73379,0 +73596,73571,0,0,0,0 +73597,73650,0,0,0,0 +73599,73602,0,0,0,0 +73600,73704,2,73605,73657,0 +73601,73696,2,73391,73392,0 +73602,73696,2,73599,73701,0 +73605,73600,2,73573,73576,0 +73608,73591,2,73640,73829,0 +73609,73633,0,0,0,0 +73614,73591,2,73615,73719,0 +73615,73614,2,73587,73592,0 +73616,73832,0,0,0,0 +73618,73751,0,0,0,0 +73619,73751,0,0,0,0 +73620,73698,0,0,0,0 +73621,73624,2,73584,73585,0 +73622,73740,1,73590,0,0 +73623,73698,0,0,0,0 +73624,73774,2,73621,73669,0 +73625,73741,2,73525,73526,0 +73626,73741,2,73393,73404,0 +73627,73688,2,73121,73122,0 +73628,73693,0,0,0,0 +73629,73693,0,0,0,0 +73630,73586,0,0,0,0 +73633,73736,2,73609,73656,0 +73634,73688,2,73635,73644,0 +73635,73634,0,0,0,0 +73636,73694,2,73524,73554,0 +73637,73694,0,0,0,0 +73640,73608,0,0,0,0 +73641,73838,2,73470,73482,0 +73642,73649,0,0,0,0 +73643,73649,2,73569,73570,0 +73644,73634,0,0,0,0 +73647,73832,0,0,0,0 +73649,73682,2,73642,73643,0 +73650,73659,2,73597,73785,0 +73651,73659,2,73463,73464,0 +73652,73660,0,0,0,0 +73654,73955,0,0,0,0 +73655,73955,0,0,0,0 +73656,73633,0,0,0,0 +73657,73600,0,0,0,0 +73659,73660,2,73650,73651,0 +73660,73702,2,73652,73659,0 +73664,73564,0,0,0,0 +73665,73739,2,73538,73577,0 +73666,73739,0,0,0,0 +73669,73624,2,73675,73730,0 +73675,73669,0,0,0,0 +73679,73806,0,0,0,0 +73681,73682,0,0,0,0 +73682,73757,2,73649,73681,0 +73683,73757,0,0,0,0 +73684,73819,2,73478,73479,0 +73685,73819,0,0,0,0 +73687,73827,0,0,0,0 +73688,73827,2,73627,73634,0 +73692,74086,0,0,0,0 +73693,74086,2,73628,73629,0 +73694,73918,2,73636,73637,0 +73695,73881,0,0,0,0 +73696,73881,2,73601,73602,0 +73697,73855,0,0,0,0 +73698,73855,2,73620,73623,0 +73700,73918,0,0,0,0 +73701,73602,0,0,0,0 +73702,73715,2,73726,73660,0 +73703,73715,2,73385,73388,0 +73704,0,2,73593,73600,0 +73712,73404,0,0,0,0 +73713,73761,0,0,0,0 +73714,73761,0,0,0,0 +73715,73581,2,73702,73703,0 +73719,73614,0,0,0,0 +73720,73822,2,73473,73485,0 +73721,73822,0,0,0,0 +73723,73806,2,73753,73762,0 +73724,73838,0,0,0,0 +73726,73702,2,73752,73945,0 +73730,73669,2,73734,73800,0 +73731,73736,0,0,0,0 +73734,73730,0,0,0,0 +73736,73742,2,73633,73731,0 +73737,73920,0,0,0,0 +73738,73920,0,0,0,0 +73739,73755,2,73665,73666,0 +73740,0,1,73622,0,0 +73741,73754,2,73625,73626,0 +73742,73754,2,73736,73776,0 +73746,73795,0,0,0,0 +73751,73779,2,73618,73619,0 +73752,73726,0,0,0,0 +73753,73723,0,0,0,0 +73754,73790,2,73741,73742,0 +73755,74211,2,73739,73791,0 +73756,74211,2,73534,73546,0 +73757,73869,2,73682,73683,0 +73758,73869,0,0,0,0 +73760,73795,2,73761,73790,0 +73761,73760,2,73713,73714,0 +73762,73723,0,0,0,0 +73770,73581,2,73784,73815,0 +73771,74037,0,0,0,0 +73774,73880,2,73588,73624,0 +73775,73880,0,0,0,0 +73776,73742,2,73788,73823,0 +73777,0,0,0,0,0 +73778,73858,2,73439,73471,0 +73779,73858,2,73751,73801,0 +73782,74037,0,0,0,0 +73784,73770,2,73803,73909,0 +73785,73650,0,0,0,0 +73787,73799,0,0,0,0 +73788,73776,0,0,0,0 +73790,73760,2,73754,73839,0 +73791,73755,0,0,0,0 +73794,73814,0,0,0,0 +73795,73814,2,73746,73760,0 +73796,73799,0,0,0,0 +73799,0,2,73787,73796,0 +73800,73730,2,73807,73877,0 +73801,73779,2,73802,73826,0 +73802,73801,0,0,0,0 +73803,73784,0,0,0,0 +73805,73871,0,0,0,0 +73806,73871,2,73679,73723,0 +73807,73800,0,0,0,0 +73813,73856,0,0,0,0 +73814,73856,2,73794,73795,0 +73815,73770,2,73835,73848,0 +73818,73959,0,0,0,0 +73819,73959,2,73684,73685,0 +73822,74035,2,73720,73721,0 +73823,73776,2,73840,73862,0 +73824,73932,0,0,0,0 +73825,73932,0,0,0,0 +73826,73801,2,73845,73866,0 +73827,73872,2,73687,73688,0 +73828,73872,0,0,0,0 +73829,73608,2,73830,73887,0 +73830,73829,0,0,0,0 +73831,74027,0,0,0,0 +73832,74027,2,73616,73647,0 +73835,73815,0,0,0,0 +73836,74035,0,0,0,0 +73837,73948,0,0,0,0 +73838,73948,2,73641,73724,0 +73839,73790,2,73901,74029,0 +73840,73823,0,0,0,0 +73842,73983,0,0,0,0 +73843,73983,0,0,0,0 +73845,73826,0,0,0,0 +73846,73967,0,0,0,0 +73847,0,0,0,0,0 +73848,73815,2,73864,73875,0 +73853,73929,0,0,0,0 +73855,73876,2,73697,73698,0 +73856,73991,2,73813,73814,0 +73857,73991,0,0,0,0 +73858,73929,2,73778,73779,0 +73859,73876,2,73860,74002,0 +73860,73859,0,0,0,0 +73861,0,2,73903,73905,0 +73862,73823,2,73902,73924,0 +73864,73848,0,0,0,0 +73866,73826,2,73904,73913,0 +73868,73886,0,0,0,0 +73869,73886,2,73757,73758,0 +73870,73967,0,0,0,0 +73871,73888,2,73805,73806,0 +73872,73888,2,73827,73828,0 +73875,73848,0,0,0,0 +73876,73887,2,73855,73859,0 +73877,73800,2,73918,74008,0 +73880,73894,2,73774,73775,0 +73881,73894,2,73695,73696,0 +73882,0,0,0,0,0 +73885,73943,0,0,0,0 +73886,73943,2,73868,73869,0 +73887,73829,2,73876,74043,0 +73888,73977,2,73871,73872,0 +73889,73977,0,0,0,0 +73894,73963,2,73880,73881,0 +73895,73963,0,0,0,0 +73901,73839,0,0,0,0 +73902,73862,0,0,0,0 +73903,73861,0,0,0,0 +73904,73866,0,0,0,0 +73905,73861,0,0,0,0 +73909,73784,2,73961,73968,0 +73910,74084,0,0,0,0 +73913,73866,2,73940,74099,0 +73917,0,2,73927,74042,0 +73918,73877,2,73694,73700,0 +73919,74072,0,0,0,0 +73920,74072,2,73737,73738,0 +73922,74036,0,0,0,0 +73923,74036,0,0,0,0 +73924,73862,0,0,0,0 +73925,74084,0,0,0,0 +73927,73917,2,73928,73933,0 +73928,73927,2,73937,73994,0 +73929,73949,2,73853,73858,0 +73931,73965,0,0,0,0 +73932,73965,2,73824,73825,0 +73933,73927,0,0,0,0 +73936,74065,0,0,0,0 +73937,73928,0,0,0,0 +73938,74065,0,0,0,0 +73940,73913,0,0,0,0 +73942,73962,0,0,0,0 +73943,73962,2,73885,73886,0 +73944,73945,0,0,0,0 +73945,73726,2,73944,74025,0 +73948,74055,2,73837,73838,0 +73949,74055,2,73929,74075,0 +73954,74001,0,0,0,0 +73955,74001,2,73654,73655,0 +73958,74186,0,0,0,0 +73959,74186,2,73818,73819,0 +73961,73909,0,0,0,0 +73962,73973,2,73942,73943,0 +73963,74197,2,73894,73895,0 +73964,74197,0,0,0,0 +73965,74080,2,73931,73932,0 +73966,73973,0,0,0,0 +73967,74009,2,73846,73870,0 +73968,73909,2,73978,74098,0 +73969,73970,0,0,0,0 +73970,74080,2,73969,73980,0 +73971,74059,0,0,0,0 +73972,74059,0,0,0,0 +73973,74028,2,73962,73966,0 +73976,74052,0,0,0,0 +73977,74052,2,73888,73889,0 +73978,73968,0,0,0,0 +73979,0,0,0,0,0 +73980,73970,0,0,0,0 +73981,74009,0,0,0,0 +73983,73995,2,73842,73843,0 +73986,73995,0,0,0,0 +73990,74022,0,0,0,0 +73991,74022,2,73856,73857,0 +73994,73928,2,73996,74203,0 +73995,74003,2,73983,73986,0 +73996,73994,0,0,0,0 +73999,74008,0,0,0,0 +74000,74002,0,0,0,0 +74001,74002,2,73954,73955,0 +74002,73859,2,74000,74001,0 +74003,74004,2,73995,74050,0 +74004,74008,2,74003,74015,0 +74008,73877,2,73999,74004,0 +74009,74028,2,73967,73981,0 +74015,74004,2,74021,74182,0 +74016,74066,0,0,0,0 +74018,74066,0,0,0,0 +74021,74015,0,0,0,0 +74022,74107,2,73990,73991,0 +74025,73945,2,74056,74078,0 +74026,74070,0,0,0,0 +74027,74050,2,73831,73832,0 +74028,74154,2,73973,74009,0 +74029,73839,0,0,0,0 +74030,74083,0,0,0,0 +74031,74083,0,0,0,0 +74035,74070,2,73822,73836,0 +74036,74051,2,73922,73923,0 +74037,0,2,73771,73782,0 +74042,73917,0,0,0,0 +74043,73887,2,74053,74088,0 +74044,74210,0,0,0,0 +74047,74210,0,0,0,0 +74050,74003,2,74027,74060,0 +74051,74154,2,74036,74061,0 +74052,74100,2,73976,73977,0 +74053,74043,0,0,0,0 +74054,74133,0,0,0,0 +74055,74133,2,73948,73949,0 +74056,74025,0,0,0,0 +74057,74091,0,0,0,0 +74059,74060,2,73971,73972,0 +74060,74050,2,74059,74063,0 +74061,74051,0,0,0,0 +74062,74063,0,0,0,0 +74063,74060,2,74062,74121,0 +74065,74135,2,73936,73938,0 +74066,74107,2,74016,74018,0 +74067,74100,0,0,0,0 +74070,74087,2,74026,74035,0 +74071,74087,0,0,0,0 +74072,74287,2,73919,73920,0 +74073,74262,0,0,0,0 +74074,74287,0,0,0,0 +74075,73949,2,74118,74206,0 +74076,74152,0,0,0,0 +74077,0,0,0,0,0 +74078,74025,2,74079,74094,0 +74079,74078,0,0,0,0 +74080,74262,2,73965,73970,0 +74081,74177,0,0,0,0 +74082,74177,0,0,0,0 +74083,74138,2,74030,74031,0 +74084,74152,2,73910,73925,0 +74086,74103,2,73692,73693,0 +74087,74103,2,74070,74071,0 +74088,74043,2,74102,74163,0 +74090,74135,0,0,0,0 +74091,0,2,74057,74097,0 +74092,74139,0,0,0,0 +74093,74139,0,0,0,0 +74094,74078,2,74141,74157,0 +74095,74108,0,0,0,0 +74097,74091,0,0,0,0 +74098,73968,0,0,0,0 +74099,73913,0,0,0,0 +74100,74138,2,74052,74067,0 +74102,74088,2,74104,74216,0 +74103,74126,2,74086,74087,0 +74104,74102,0,0,0,0 +74105,74148,0,0,0,0 +74106,74129,0,0,0,0 +74107,74195,2,74022,74066,0 +74108,74127,2,74095,74140,0 +74112,74124,0,0,0,0 +74114,74115,0,0,0,0 +74115,74124,2,74114,74128,0 +74118,74075,0,0,0,0 +74121,74063,2,74129,74159,0 +74124,74175,2,74112,74115,0 +74125,74175,0,0,0,0 +74126,74137,2,74103,74243,0 +74127,74128,2,74108,74150,0 +74128,74115,2,74127,74168,0 +74129,74121,2,74106,74137,0 +74130,74328,0,0,0,0 +74131,74328,0,0,0,0 +74133,74236,2,74054,74055,0 +74134,74236,0,0,0,0 +74135,74607,2,74065,74090,0 +74136,74181,0,0,0,0 +74137,74129,2,74126,74373,0 +74138,74147,2,74083,74100,0 +74139,74140,2,74092,74093,0 +74140,74108,2,74139,74199,0 +74141,74094,2,74148,74288,0 +74144,74207,0,0,0,0 +74145,74207,0,0,0,0 +74146,74233,0,0,0,0 +74147,74233,2,74138,74200,0 +74148,74141,2,74105,74149,0 +74149,74148,0,0,0,0 +74150,74127,0,0,0,0 +74151,74171,0,0,0,0 +74152,74171,2,74076,74084,0 +74153,74181,2,74158,74323,0 +74154,74170,2,74028,74051,0 +74155,74170,0,0,0,0 +74157,74094,0,0,0,0 +74158,74153,2,74256,74311,0 +74159,74121,0,0,0,0 +74163,74088,2,74183,74218,0 +74168,74128,0,0,0,0 +74169,74280,0,0,0,0 +74170,74280,2,74154,74155,0 +74171,74172,2,74151,74152,0 +74172,0,2,74171,74176,0 +74173,74353,0,0,0,0 +74174,74353,0,0,0,0 +74175,74176,2,74124,74125,0 +74176,74172,2,74175,74202,0 +74177,74228,2,74081,74082,0 +74178,74228,0,0,0,0 +74181,0,2,74136,74153,0 +74182,74015,0,0,0,0 +74183,74163,0,0,0,0 +74185,74333,0,0,0,0 +74186,74333,2,73958,73959,0 +74187,74219,0,0,0,0 +74189,74342,0,0,0,0 +74195,74342,2,74107,74221,0 +74196,74276,0,0,0,0 +74197,74276,2,73963,73964,0 +74198,74607,0,0,0,0 +74199,74140,2,74223,74224,0 +74200,74147,0,0,0,0 +74201,74219,0,0,0,0 +74202,74176,2,74204,74269,0 +74203,73994,0,0,0,0 +74204,74202,2,74257,74294,0 +74206,74075,0,0,0,0 +74207,74306,2,74144,74145,0 +74208,74215,0,0,0,0 +74209,74245,0,0,0,0 +74210,74264,2,74044,74047,0 +74211,74264,2,73755,73756,0 +74212,74213,0,0,0,0 +74213,74306,2,74212,74239,0 +74215,74353,2,74208,74230,0 +74216,74102,0,0,0,0 +74217,74245,0,0,0,0 +74218,74163,0,0,0,0 +74219,74221,2,74187,74201,0 +74220,0,0,0,0,0 +74221,74195,2,74219,74237,0 +74222,74243,0,0,0,0 +74223,74199,2,74240,74244,0 +74224,74199,0,0,0,0 +74225,74254,0,0,0,0 +74226,74254,0,0,0,0 +74228,74235,2,74177,74178,0 +74229,74250,0,0,0,0 +74230,74215,0,0,0,0 +74231,74243,2,74253,74299,0 +74232,74641,0,0,0,0 +74233,74641,2,74146,74147,0 +74235,74252,2,74228,74298,0 +74236,74265,2,74133,74134,0 +74237,74221,2,74292,74337,0 +74238,74279,0,0,0,0 +74239,74213,2,74251,74510,0 +74240,74223,2,74273,74352,0 +74243,74126,2,74222,74231,0 +74244,74223,2,74278,74391,0 +74245,74279,2,74209,74217,0 +74247,74250,2,74248,74313,0 +74248,74247,0,0,0,0 +74250,74251,2,74229,74247,0 +74251,74239,2,74250,74255,0 +74252,74253,2,74235,74270,0 +74253,74231,2,74252,74421,0 +74254,74258,2,74225,74226,0 +74255,74251,2,74370,74425,0 +74256,74158,0,0,0,0 +74257,74204,0,0,0,0 +74258,74295,2,74254,74281,0 +74259,74295,0,0,0,0 +74262,74272,2,74073,74080,0 +74263,74272,2,74264,74265,0 +74264,74263,2,74210,74211,0 +74265,74263,2,74236,74301,0 +74266,74281,0,0,0,0 +74267,74281,0,0,0,0 +74268,74285,0,0,0,0 +74269,74202,2,74316,74329,0 +74270,74252,2,74351,74372,0 +74271,74300,0,0,0,0 +74272,74300,2,74262,74263,0 +74273,74240,2,74291,74312,0 +74276,74307,2,74196,74197,0 +74277,74278,0,0,0,0 +74278,74244,2,74277,74346,0 +74279,74377,2,74238,74245,0 +74280,74377,2,74169,74170,0 +74281,74258,2,74266,74267,0 +74285,74321,2,74268,74363,0 +74286,74321,0,0,0,0 +74287,74298,2,74072,74074,0 +74288,74141,0,0,0,0 +74291,74273,0,0,0,0 +74292,74237,0,0,0,0 +74294,74204,2,74354,74454,0 +74295,74327,2,74258,74259,0 +74296,74341,2,74307,74392,0 +74297,74341,0,0,0,0 +74298,74235,2,74287,74321,0 +74299,74231,0,0,0,0 +74300,74326,2,74271,74272,0 +74301,74265,0,0,0,0 +74306,74307,2,74207,74213,0 +74307,74296,2,74276,74306,0 +74308,74326,0,0,0,0 +74311,74158,2,74401,74432,0 +74312,74273,2,74317,74411,0 +74313,74247,2,74345,74362,0 +74316,74269,0,0,0,0 +74317,74312,0,0,0,0 +74321,74298,2,74285,74286,0 +74323,74153,0,0,0,0 +74325,74327,0,0,0,0 +74326,74437,2,74300,74308,0 +74327,74387,2,74295,74325,0 +74328,74387,2,74130,74131,0 +74329,74269,0,0,0,0 +74330,74348,0,0,0,0 +74332,0,0,0,0,0 +74333,74364,2,74185,74186,0 +74335,74478,0,0,0,0 +74336,74478,0,0,0,0 +74337,74237,0,0,0,0 +74338,74376,0,0,0,0 +74339,74376,0,0,0,0 +74340,74437,0,0,0,0 +74341,74413,2,74296,74297,0 +74342,74413,2,74189,74195,0 +74343,74393,0,0,0,0 +74344,74345,2,74347,74374,0 +74345,74313,2,74344,74397,0 +74346,74278,2,74409,74445,0 +74347,74344,0,0,0,0 +74348,74393,2,74330,74366,0 +74351,74270,0,0,0,0 +74352,74240,0,0,0,0 +74353,74357,3,74173,74174,74215 +74354,74294,2,74369,74427,0 +74357,74364,2,74353,74361,0 +74360,74361,0,0,0,0 +74361,74357,2,74360,74469,0 +74362,74313,0,0,0,0 +74363,74285,2,74365,74396,0 +74364,74365,2,74333,74357,0 +74365,74363,2,74364,74379,0 +74366,74348,0,0,0,0 +74367,74378,0,0,0,0 +74368,74369,0,0,0,0 +74369,74354,2,74368,74381,0 +74370,74255,2,74476,74611,0 +74372,74270,2,74530,74627,0 +74373,74137,2,74399,74465,0 +74374,74344,0,0,0,0 +74375,74670,0,0,0,0 +74376,74670,2,74338,74339,0 +74377,74457,2,74279,74280,0 +74378,74457,2,74367,74386,0 +74379,74365,2,74415,74520,0 +74380,74431,0,0,0,0 +74381,74369,2,74416,74418,0 +74386,74378,0,0,0,0 +74387,74473,2,74327,74328,0 +74388,74473,0,0,0,0 +74391,74244,0,0,0,0 +74392,74296,2,74448,74453,0 +74393,74456,2,74343,74348,0 +74394,74417,0,0,0,0 +74395,74441,0,0,0,0 +74396,74363,0,0,0,0 +74397,74345,2,74462,74472,0 +74398,74441,0,0,0,0 +74399,74373,0,0,0,0 +74401,74311,2,74433,74654,0 +74409,74346,0,0,0,0 +74410,74431,0,0,0,0 +74411,74312,0,0,0,0 +74412,74417,0,0,0,0 +74413,74488,2,74341,74342,0 +74414,74488,0,0,0,0 +74415,74379,0,0,0,0 +74416,74381,0,0,0,0 +74417,74418,2,74394,74412,0 +74418,74381,2,74417,74426,0 +74419,74444,0,0,0,0 +74420,74444,0,0,0,0 +74421,74253,0,0,0,0 +74422,74522,0,0,0,0 +74425,74255,0,0,0,0 +74426,74418,2,74466,74519,0 +74427,74354,0,0,0,0 +74431,74522,2,74380,74410,0 +74432,74311,0,0,0,0 +74433,74401,2,74434,74470,0 +74434,74433,0,0,0,0 +74436,74527,0,0,0,0 +74437,74527,2,74326,74340,0 +74439,74440,0,0,0,0 +74440,74542,2,74439,74521,0 +74441,74542,2,74395,74398,0 +74443,74667,0,0,0,0 +74444,74667,2,74419,74420,0 +74445,74346,0,0,0,0 +74446,74576,0,0,0,0 +74447,74576,0,0,0,0 +74448,74392,0,0,0,0 +74449,74456,0,0,0,0 +74453,74392,0,0,0,0 +74454,74294,0,0,0,0 +74456,74516,2,74393,74449,0 +74457,74516,2,74377,74378,0 +74458,74742,0,0,0,0 +74459,74742,0,0,0,0 +74462,74397,2,74482,74484,0 +74465,74373,0,0,0,0 +74466,74426,0,0,0,0 +74467,74489,0,0,0,0 +74468,74489,0,0,0,0 +74469,74361,0,0,0,0 +74470,74433,2,74471,74537,0 +74471,74470,0,0,0,0 +74472,74397,2,74509,74518,0 +74473,74616,2,74387,74388,0 +74474,74616,0,0,0,0 +74476,74370,2,74483,74485,0 +74478,74525,2,74335,74336,0 +74480,74525,0,0,0,0 +74482,74462,0,0,0,0 +74483,74476,0,0,0,0 +74484,74462,2,74526,74531,0 +74485,74476,0,0,0,0 +74488,74490,2,74413,74414,0 +74489,74490,2,74467,74468,0 +74490,74573,2,74488,74489,0 +74491,74573,0,0,0,0 +74495,74606,0,0,0,0 +74496,74606,0,0,0,0 +74497,74521,0,0,0,0 +74503,74650,0,0,0,0 +74504,74650,0,0,0,0 +74505,74521,0,0,0,0 +74509,74472,0,0,0,0 +74510,74239,2,74538,74567,0 +74515,74547,0,0,0,0 +74516,74547,2,74456,74457,0 +74518,74472,0,0,0,0 +74519,74426,0,0,0,0 +74520,74379,0,0,0,0 +74521,74440,2,74497,74505,0 +74522,74586,2,74422,74431,0 +74523,74649,0,0,0,0 +74524,74649,0,0,0,0 +74525,74586,2,74478,74480,0 +74526,74484,0,0,0,0 +74527,74608,2,74436,74437,0 +74528,74608,0,0,0,0 +74530,74372,2,74540,74599,0 +74531,74484,2,74561,74581,0 +74532,74604,2,74534,74623,0 +74534,74532,0,0,0,0 +74537,74470,0,0,0,0 +74538,74510,2,74550,74629,0 +74539,74695,0,0,0,0 +74540,74530,0,0,0,0 +74541,74612,0,0,0,0 +74542,74612,2,74440,74441,0 +74543,74585,0,0,0,0 +74544,74585,0,0,0,0 +74547,74559,2,74515,74516,0 +74548,74559,0,0,0,0 +74549,74695,0,0,0,0 +74550,74538,0,0,0,0 +74552,74556,0,0,0,0 +74553,74557,0,0,0,0 +74554,74615,0,0,0,0 +74555,74561,0,0,0,0 +74556,74557,2,74552,74580,0 +74557,74615,2,74553,74556,0 +74558,74572,0,0,0,0 +74559,74578,2,74547,74548,0 +74561,74531,2,74555,74574,0 +74562,74591,0,0,0,0 +74563,74662,0,0,0,0 +74564,74662,0,0,0,0 +74567,74510,0,0,0,0 +74571,74591,0,0,0,0 +74572,74656,2,74558,74597,0 +74573,74656,2,74490,74491,0 +74574,74561,2,74583,74587,0 +74576,74694,2,74446,74447,0 +74577,74694,0,0,0,0 +74578,74660,2,74559,74633,0 +74579,74660,0,0,0,0 +74580,74556,2,74582,74666,0 +74581,74531,0,0,0,0 +74582,74580,0,0,0,0 +74583,74574,2,74594,74677,0 +74584,74592,0,0,0,0 +74585,74643,2,74543,74544,0 +74586,74643,2,74522,74525,0 +74587,74574,0,0,0,0 +74591,74601,2,74562,74571,0 +74592,74601,2,74584,74711,0 +74593,74604,0,0,0,0 +74594,74583,2,74638,74679,0 +74597,74572,2,74605,74669,0 +74599,74530,2,74628,74647,0 +74601,74640,2,74591,74592,0 +74603,74637,0,0,0,0 +74604,74605,2,74532,74593,0 +74605,74597,2,74604,74632,0 +74606,74614,2,74495,74496,0 +74607,74696,2,74135,74198,0 +74608,74696,2,74527,74528,0 +74610,0,0,0,0,0 +74611,74370,0,0,0,0 +74612,74639,2,74541,74542,0 +74613,74640,0,0,0,0 +74614,74738,2,74606,74618,0 +74615,74630,2,74554,74557,0 +74616,74630,2,74473,74474,0 +74617,0,0,0,0,0 +74618,74614,0,0,0,0 +74619,74738,0,0,0,0 +74620,74683,0,0,0,0 +74622,74639,2,74626,74646,0 +74623,74532,0,0,0,0 +74624,74659,0,0,0,0 +74625,74659,0,0,0,0 +74626,74622,0,0,0,0 +74627,74372,0,0,0,0 +74628,74599,2,74631,74748,0 +74629,74538,0,0,0,0 +74630,74780,2,74615,74616,0 +74631,74628,0,0,0,0 +74632,74605,0,0,0,0 +74633,74578,0,0,0,0 +74636,74780,0,0,0,0 +74637,74653,2,74603,74685,0 +74638,74594,2,74675,74790,0 +74639,74723,2,74612,74622,0 +74640,74723,2,74601,74613,0 +74641,74741,2,74232,74233,0 +74642,74741,0,0,0,0 +74643,74672,2,74585,74586,0 +74644,74672,0,0,0,0 +74645,74653,0,0,0,0 +74646,74622,2,74653,74732,0 +74647,74599,0,0,0,0 +74648,74657,0,0,0,0 +74649,74688,2,74523,74524,0 +74650,74688,2,74503,74504,0 +74653,74646,2,74637,74645,0 +74654,74401,0,0,0,0 +74656,74751,2,74572,74573,0 +74657,74751,2,74648,74664,0 +74658,74707,0,0,0,0 +74659,74707,2,74624,74625,0 +74660,74739,2,74578,74579,0 +74661,74739,0,0,0,0 +74662,74746,2,74563,74564,0 +74663,74746,0,0,0,0 +74664,74657,0,0,0,0 +74665,74666,0,0,0,0 +74666,74580,2,74665,74676,0 +74667,74716,2,74443,74444,0 +74669,74597,0,0,0,0 +74670,74728,2,74375,74376,0 +74671,74787,0,0,0,0 +74672,74787,2,74643,74644,0 +74673,74684,0,0,0,0 +74674,74675,0,0,0,0 +74675,74638,2,74674,74851,0 +74676,74666,2,74706,74730,0 +74677,74583,0,0,0,0 +74679,74594,0,0,0,0 +74680,74728,0,0,0,0 +74684,74685,2,74673,74710,0 +74685,74637,2,74684,74771,0 +74686,74722,0,0,0,0 +74687,74722,0,0,0,0 +74688,74942,2,74649,74650,0 +74689,74942,0,0,0,0 +74690,74691,0,0,0,0 +74691,74716,2,74690,74719,0 +74693,74712,0,0,0,0 +74694,74712,2,74576,74577,0 +74695,74791,2,74539,74549,0 +74696,74791,2,74607,74608,0 +74700,74824,0,0,0,0 +74701,74824,0,0,0,0 +74706,74676,0,0,0,0 +74707,0,2,74658,74659,0 +74710,74684,0,0,0,0 +74711,74592,0,0,0,0 +74712,74724,2,74693,74694,0 +74713,74882,0,0,0,0 +74716,74729,2,74667,74691,0 +74717,74729,0,0,0,0 +74718,74882,0,0,0,0 +74719,74691,2,74736,74768,0 +74720,74745,0,0,0,0 +74721,74747,0,0,0,0 +74722,74747,2,74686,74687,0 +74723,74763,2,74639,74640,0 +74724,74745,2,74712,74728,0 +74728,74724,2,74670,74680,0 +74729,74730,2,74716,74717,0 +74730,74676,2,74729,74752,0 +74732,74646,0,0,0,0 +74733,74775,0,0,0,0 +74734,74775,0,0,0,0 +74736,74719,2,74738,74764,0 +74738,74736,2,74614,74619,0 +74739,74816,2,74660,74661,0 +74741,74755,2,74641,74642,0 +74742,74755,2,74458,74459,0 +74745,74773,2,74720,74724,0 +74746,74843,2,74662,74663,0 +74747,74843,2,74721,74722,0 +74748,74628,2,74795,74813,0 +74750,74774,0,0,0,0 +74751,74774,2,74656,74657,0 +74752,74730,0,0,0,0 +74753,0,0,0,0,0 +74755,74756,2,74741,74742,0 +74756,74773,2,74755,74769,0 +74757,74816,0,0,0,0 +74760,74763,0,0,0,0 +74763,74788,2,74723,74760,0 +74764,74736,0,0,0,0 +74768,74719,2,74825,74830,0 +74769,74756,2,74817,74858,0 +74770,74771,0,0,0,0 +74771,74685,2,74770,74772,0 +74772,74771,2,74779,74844,0 +74773,74847,2,74745,74756,0 +74774,74802,2,74750,74751,0 +74775,0,2,74733,74734,0 +74777,74779,0,0,0,0 +74779,74772,2,74777,74807,0 +74780,74826,2,74630,74636,0 +74781,74826,0,0,0,0 +74782,74789,0,0,0,0 +74786,74849,0,0,0,0 +74787,74849,2,74671,74672,0 +74788,74864,2,74763,74900,0 +74789,74864,2,74782,74838,0 +74790,74638,0,0,0,0 +74791,74875,2,74695,74696,0 +74792,74875,0,0,0,0 +74795,74748,0,0,0,0 +74800,74847,0,0,0,0 +74801,74802,0,0,0,0 +74802,74871,2,74774,74801,0 +74803,74871,0,0,0,0 +74805,74923,0,0,0,0 +74806,74923,0,0,0,0 +74807,74779,0,0,0,0 +74813,74748,0,0,0,0 +74815,74883,2,74823,74910,0 +74816,74817,2,74739,74757,0 +74817,74769,2,74816,74819,0 +74819,74817,2,74821,74820,0 +74820,74819,0,0,0,0 +74821,74819,2,74865,74884,0 +74822,74890,0,0,0,0 +74823,74815,0,0,0,0 +74824,74825,2,74700,74701,0 +74825,74768,2,74824,74894,0 +74826,74890,2,74780,74781,0 +74829,74859,0,0,0,0 +74830,74768,2,74833,74835,0 +74833,74830,0,0,0,0 +74835,74830,2,74943,75044,0 +74836,0,0,0,0,0 +74838,74789,2,74839,74944,0 +74839,74838,0,0,0,0 +74842,74848,0,0,0,0 +74843,74848,2,74746,74747,0 +74844,74772,0,0,0,0 +74845,74925,0,0,0,0 +74847,74862,2,74773,74800,0 +74848,74862,2,74842,74843,0 +74849,74926,2,74786,74787,0 +74850,74960,0,0,0,0 +74851,74675,0,0,0,0 +74856,74872,0,0,0,0 +74857,74872,0,0,0,0 +74858,74769,0,0,0,0 +74859,74925,2,74829,74880,0 +74860,74926,0,0,0,0 +74861,74867,0,0,0,0 +74862,74867,2,74847,74848,0 +74863,74960,0,0,0,0 +74864,74940,2,74788,74789,0 +74865,74821,0,0,0,0 +74866,74883,3,74870,74936,75121 +74867,74913,2,74861,74862,0 +74870,74866,0,0,0,0 +74871,74987,2,74802,74803,0 +74872,74895,2,74856,74857,0 +74873,74895,0,0,0,0 +74874,74940,0,0,0,0 +74875,74952,2,74791,74792,0 +74876,74952,0,0,0,0 +74879,0,0,0,0,0 +74880,74859,0,0,0,0 +74882,74891,2,74713,74718,0 +74883,74884,2,74815,74866,0 +74884,74821,2,74883,74981,0 +74886,74913,2,74937,74957,0 +74887,74889,0,0,0,0 +74888,74889,0,0,0,0 +74889,74911,2,74887,74888,0 +74890,74920,2,74822,74826,0 +74891,75045,2,74882,74901,0 +74892,75045,0,0,0,0 +74893,74987,0,0,0,0 +74894,74825,0,0,0,0 +74895,74970,2,74872,74873,0 +74896,0,2,74921,74967,0 +74899,74970,0,0,0,0 +74900,74788,2,74905,74907,0 +74901,74891,2,74902,74935,0 +74902,74901,0,0,0,0 +74905,74900,0,0,0,0 +74907,74900,0,0,0,0 +74910,74815,2,74954,75012,0 +74911,74915,2,74889,74945,0 +74912,74915,0,0,0,0 +74913,74949,2,74886,74867,0 +74915,74920,2,74911,74912,0 +74916,0,0,0,0,0 +74920,74934,2,74890,74915,0 +74921,74896,0,0,0,0 +74922,74958,0,0,0,0 +74923,74958,2,74805,74806,0 +74925,74928,2,74845,74859,0 +74926,74947,2,74849,74860,0 +74927,74947,0,0,0,0 +74928,75016,2,74925,74962,0 +74929,75016,0,0,0,0 +74930,75000,0,0,0,0 +74931,75000,0,0,0,0 +74932,74949,0,0,0,0 +74934,74935,2,74920,75038,0 +74935,74901,2,74934,74973,0 +74936,74866,0,0,0,0 +74937,74886,0,0,0,0 +74940,75046,2,74864,74874,0 +74941,75219,0,0,0,0 +74942,75219,2,74688,74689,0 +74943,74835,2,75004,75027,0 +74944,74838,0,0,0,0 +74945,74911,0,0,0,0 +74946,74997,0,0,0,0 +74947,74948,2,74926,74927,0 +74948,74956,2,74947,74994,0 +74949,74971,2,74913,74932,0 +74950,74971,0,0,0,0 +74952,74997,2,74875,74876,0 +74953,0,0,0,0,0 +74954,74910,2,74963,75090,0 +74956,74969,2,74948,74961,0 +74957,74886,2,75057,75102,0 +74958,75081,2,74922,74923,0 +74959,75081,0,0,0,0 +74960,75019,2,74850,74863,0 +74961,74956,0,0,0,0 +74962,74928,0,0,0,0 +74963,74954,0,0,0,0 +74967,74896,0,0,0,0 +74969,74974,2,74956,75066,0 +74970,74974,2,74895,74899,0 +74971,74972,2,74949,74950,0 +74972,75008,2,74971,75063,0 +74973,74935,0,0,0,0 +74974,75011,2,74969,74970,0 +74975,75011,0,0,0,0 +74976,75019,0,0,0,0 +74981,74884,2,75032,75106,0 +74983,75089,0,0,0,0 +74984,75089,0,0,0,0 +74985,75014,0,0,0,0 +74986,75014,0,0,0,0 +74987,74991,2,74871,74893,0 +74991,75059,2,74987,75056,0 +74992,75059,0,0,0,0 +74993,75046,0,0,0,0 +74994,74948,2,75030,75084,0 +74996,75078,0,0,0,0 +74997,75078,2,74946,74952,0 +74998,0,2,75018,75036,0 +74999,75064,0,0,0,0 +75000,75077,2,74930,74931,0 +75001,75064,0,0,0,0 +75002,75193,0,0,0,0 +75004,74943,2,75007,75099,0 +75007,75004,0,0,0,0 +75008,0,2,75037,74972,0 +75009,75193,0,0,0,0 +75011,75012,2,74974,74975,0 +75012,74910,2,75011,75183,0 +75014,0,2,74985,74986,0 +75015,0,0,0,0,0 +75016,75080,2,74928,74929,0 +75017,75080,0,0,0,0 +75018,74998,0,0,0,0 +75019,75204,2,74960,74976,0 +75022,75031,0,0,0,0 +75023,75031,0,0,0,0 +75024,75033,0,0,0,0 +75027,74943,0,0,0,0 +75028,75060,0,0,0,0 +75029,75030,0,0,0,0 +75030,74994,2,75029,75104,0 +75031,75072,2,75022,75023,0 +75032,74981,2,75033,75042,0 +75033,75032,2,75024,75238,0 +75034,0,0,0,0,0 +75036,74998,0,0,0,0 +75037,75008,2,75110,75208,0 +75038,74934,0,0,0,0 +75040,75048,0,0,0,0 +75041,75047,0,0,0,0 +75042,75032,0,0,0,0 +75043,75060,0,0,0,0 +75044,74835,2,75050,75149,0 +75045,75049,2,74891,74892,0 +75046,75145,2,74940,74993,0 +75047,75145,2,75041,75058,0 +75048,75049,2,75040,75051,0 +75049,75077,2,75045,75048,0 +75050,75044,2,75072,75155,0 +75051,75048,0,0,0,0 +75052,0,2,75054,75085,0 +75054,75052,0,0,0,0 +75056,74991,2,75065,75100,0 +75057,74957,2,75068,75156,0 +75058,75047,0,0,0,0 +75059,75091,2,74991,74992,0 +75060,75061,2,75028,75043,0 +75061,75116,2,75060,75093,0 +75062,75116,0,0,0,0 +75063,74972,0,0,0,0 +75064,75189,2,74999,75001,0 +75065,75056,0,0,0,0 +75066,74969,2,75073,75133,0 +75067,75068,0,0,0,0 +75068,75057,2,75067,75097,0 +75070,75091,0,0,0,0 +75071,75204,0,0,0,0 +75072,75050,2,75031,75205,0 +75073,75066,0,0,0,0 +75077,75092,2,75000,75049,0 +75078,75092,2,74996,74997,0 +75079,75097,0,0,0,0 +75080,75178,2,75016,75017,0 +75081,75178,2,74958,74959,0 +75082,75277,0,0,0,0 +75083,75277,0,0,0,0 +75084,74994,2,75174,75224,0 +75085,75052,0,0,0,0 +75089,75107,2,74983,74984,0 +75090,74954,0,0,0,0 +75091,75107,2,75059,75070,0 +75092,75123,2,75077,75078,0 +75093,75061,0,0,0,0 +75094,0,0,0,0,0 +75096,75104,0,0,0,0 +75097,75068,2,75079,75101,0 +75098,75189,0,0,0,0 +75099,75004,2,75107,75159,0 +75100,75056,2,75138,75170,0 +75101,75097,0,0,0,0 +75102,74957,2,75118,75127,0 +75104,75030,2,75096,75136,0 +75105,75123,0,0,0,0 +75106,74981,2,75184,75255,0 +75107,75099,2,75089,75091,0 +75110,75037,2,75150,75360,0 +75116,75168,2,75061,75062,0 +75117,75168,0,0,0,0 +75118,75102,2,75146,75218,0 +75121,74866,0,0,0,0 +75122,75131,0,0,0,0 +75123,75131,2,75092,75105,0 +75125,75271,0,0,0,0 +75126,75271,0,0,0,0 +75127,75102,0,0,0,0 +75131,75263,2,75122,75123,0 +75132,75263,0,0,0,0 +75133,75066,0,0,0,0 +75134,0,0,0,0,0 +75136,75104,0,0,0,0 +75137,75139,0,0,0,0 +75138,75100,2,75139,75240,0 +75139,75138,2,75137,75182,0 +75143,0,0,0,0,0 +75144,0,0,0,0,0 +75145,75167,2,75046,75047,0 +75146,75118,2,75269,75327,0 +75149,75044,2,75151,75260,0 +75150,75110,0,0,0,0 +75151,75149,0,0,0,0 +75153,75155,0,0,0,0 +75155,75050,2,75153,75212,0 +75156,75057,2,75375,75439,0 +75159,75099,2,75180,75227,0 +75163,75199,0,0,0,0 +75167,75199,2,75145,75200,0 +75168,75203,2,75116,75117,0 +75169,75203,0,0,0,0 +75170,75100,2,75175,75341,0 +75171,75206,2,75172,75185,0 +75172,75171,0,0,0,0 +75174,75084,0,0,0,0 +75175,75170,0,0,0,0 +75178,75284,2,75080,75081,0 +75179,75284,0,0,0,0 +75180,75159,2,75211,75541,0 +75181,75182,0,0,0,0 +75182,75139,2,75181,75204,0 +75183,75012,2,75225,75326,0 +75184,75106,2,75194,75197,0 +75185,75171,0,0,0,0 +75186,0,2,75188,75232,0 +75187,0,0,0,0,0 +75188,75186,0,0,0,0 +75189,75201,2,75064,75098,0 +75190,75237,0,0,0,0 +75191,75237,0,0,0,0 +75192,75229,0,0,0,0 +75193,75229,2,75002,75009,0 +75194,75184,0,0,0,0 +75195,75201,0,0,0,0 +75197,75184,2,75236,75289,0 +75198,75249,0,0,0,0 +75199,75249,2,75163,75167,0 +75200,75167,2,75201,75234,0 +75201,75200,2,75189,75195,0 +75202,0,0,0,0,0 +75203,75297,2,75168,75169,0 +75204,75182,2,75019,75071,0 +75205,75072,2,75206,75325,0 +75206,75205,2,75171,75315,0 +75208,75037,0,0,0,0 +75209,75210,0,0,0,0 +75210,0,2,75209,75243,0 +75211,75180,2,75213,75371,0 +75212,75155,2,75228,75353,0 +75213,75211,0,0,0,0 +75216,75296,0,0,0,0 +75218,75118,2,75405,75517,0 +75219,75266,2,74941,74942,0 +75220,75266,0,0,0,0 +75221,75296,0,0,0,0 +75222,75241,0,0,0,0 +75223,75241,0,0,0,0 +75224,75084,2,75273,75298,0 +75225,75183,2,75226,75292,0 +75226,75225,0,0,0,0 +75227,75159,0,0,0,0 +75228,75212,0,0,0,0 +75229,75301,2,75192,75193,0 +75232,75186,2,75318,75319,0 +75233,75246,0,0,0,0 +75234,75200,2,75246,75268,0 +75235,0,0,0,0,0 +75236,75197,2,75254,75299,0 +75237,75301,2,75190,75191,0 +75238,75033,0,0,0,0 +75239,75306,0,0,0,0 +75240,75138,0,0,0,0 +75241,75242,2,75222,75223,0 +75242,75297,2,75241,75302,0 +75243,75210,2,75251,75354,0 +75244,75261,0,0,0,0 +75245,75306,0,0,0,0 +75246,75234,2,75233,75275,0 +75247,75322,0,0,0,0 +75248,0,0,0,0,0 +75249,75357,2,75198,75199,0 +75250,75357,0,0,0,0 +75251,75243,2,75313,75372,0 +75252,75310,0,0,0,0 +75254,75236,0,0,0,0 +75255,75106,2,75282,75323,0 +75256,0,0,0,0,0 +75259,75278,0,0,0,0 +75260,75149,2,75395,75444,0 +75261,75262,2,75244,75307,0 +75262,75278,2,75261,75423,0 +75263,75264,2,75131,75132,0 +75264,75322,2,75263,75280,0 +75265,75308,0,0,0,0 +75266,75308,2,75219,75220,0 +75268,75234,0,0,0,0 +75269,75146,0,0,0,0 +75270,75329,0,0,0,0 +75271,75329,2,75125,75126,0 +75272,75280,0,0,0,0 +75273,75224,2,75274,75285,0 +75274,75273,2,75317,75488,0 +75275,75246,2,75286,75287,0 +75276,0,0,0,0,0 +75277,75334,2,75082,75083,0 +75278,75316,2,75259,75262,0 +75279,75316,0,0,0,0 +75280,75264,2,75272,75348,0 +75282,75255,2,75365,75413,0 +75284,75334,2,75178,75179,0 +75285,75273,2,75391,75455,0 +75286,75275,2,75351,75392,0 +75287,75275,0,0,0,0 +75289,75197,0,0,0,0 +75292,75225,0,0,0,0 +75293,0,0,0,0,0 +75296,0,2,75216,75221,0 +75297,75363,2,75203,75242,0 +75298,75224,2,75311,75520,0 +75299,75236,0,0,0,0 +75301,75302,2,75229,75237,0 +75302,75242,2,75301,75305,0 +75303,0,0,0,0,0 +75304,0,0,0,0,0 +75305,75302,2,75340,75346,0 +75306,0,2,75239,75245,0 +75307,75261,0,0,0,0 +75308,75309,2,75265,75266,0 +75309,75310,2,75308,75412,0 +75310,75311,2,75252,75309,0 +75311,75298,2,75310,75402,0 +75313,75251,2,75376,75473,0 +75314,75363,2,75381,75519,0 +75315,75206,0,0,0,0 +75316,75348,2,75278,75279,0 +75317,75274,0,0,0,0 +75318,75232,2,75343,75398,0 +75319,75232,2,75345,75368,0 +75322,75412,2,75247,75264,0 +75323,75255,0,0,0,0 +75325,75205,0,0,0,0 +75326,75183,2,75419,75533,0 +75327,75146,2,75409,75528,0 +75329,75370,2,75270,75271,0 +75330,75331,0,0,0,0 +75331,75337,2,75330,75382,0 +75332,0,2,75352,75518,0 +75333,75340,0,0,0,0 +75334,75358,2,75277,75284,0 +75335,75358,0,0,0,0 +75337,75340,2,75331,75406,0 +75338,75343,2,75342,75366,0 +75340,75305,2,75333,75337,0 +75341,75170,2,75403,75457,0 +75342,75338,2,75384,75421,0 +75343,75318,2,75338,75494,0 +75345,75319,2,75361,75467,0 +75346,75305,0,0,0,0 +75348,75280,2,75316,75408,0 +75351,75286,0,0,0,0 +75352,75332,0,0,0,0 +75353,75212,2,75387,75474,0 +75354,75243,0,0,0,0 +75356,75481,0,0,0,0 +75357,75481,2,75249,75250,0 +75358,75399,2,75334,75335,0 +75359,75399,0,0,0,0 +75360,75110,0,0,0,0 +75361,75345,2,75390,75404,0 +75363,75401,2,75297,75314,0 +75364,75393,0,0,0,0 +75365,75282,0,0,0,0 +75366,75338,0,0,0,0 +75368,75319,0,0,0,0 +75370,75400,2,75329,75482,0 +75371,75211,0,0,0,0 +75372,75251,0,0,0,0 +75375,75156,0,0,0,0 +75376,75313,2,75449,75471,0 +75379,75380,2,75386,75442,0 +75380,75381,2,75379,75509,0 +75381,75314,2,75380,75416,0 +75382,75331,2,75400,75460,0 +75384,75342,0,0,0,0 +75385,75387,0,0,0,0 +75386,75379,2,75431,75464,0 +75387,75353,2,75385,75396,0 +75389,75412,2,75414,75472,0 +75390,75361,0,0,0,0 +75391,75285,0,0,0,0 +75392,75286,2,75397,75420,0 +75393,75422,2,75364,75401,0 +75394,75414,0,0,0,0 +75395,75260,2,75418,75437,0 +75396,75387,0,0,0,0 +75397,75392,0,0,0,0 +75398,75318,0,0,0,0 +75399,75429,2,75358,75359,0 +75400,75382,2,75370,75425,0 +75401,75393,2,75363,75500,0 +75402,75311,2,75424,75565,0 +75403,75341,0,0,0,0 +75404,75361,0,0,0,0 +75405,75218,2,75426,75477,0 +75406,75337,0,0,0,0 +75407,75429,2,75422,75469,0 +75408,75348,0,0,0,0 +75409,75327,2,75462,75499,0 +75412,75309,2,75322,75389,0 +75413,75282,2,75489,75605,0 +75414,75389,2,75394,75445,0 +75416,75381,0,0,0,0 +75417,0,2,75443,75522,0 +75418,75395,0,0,0,0 +75419,75326,2,75432,75560,0 +75420,75392,0,0,0,0 +75421,75342,0,0,0,0 +75422,75407,2,75393,75428,0 +75423,75262,0,0,0,0 +75424,75402,0,0,0,0 +75425,75400,0,0,0,0 +75426,75405,0,0,0,0 +75427,75466,0,0,0,0 +75428,75422,0,0,0,0 +75429,75466,2,75399,75407,0 +75430,75431,0,0,0,0 +75431,75386,2,75430,75456,0 +75432,75419,0,0,0,0 +75433,0,2,75525,75584,0 +75434,0,0,0,0,0 +75437,75395,0,0,0,0 +75438,0,0,0,0,0 +75439,75156,2,75498,75566,0 +75442,75379,0,0,0,0 +75443,75417,0,0,0,0 +75444,75260,2,75512,75516,0 +75445,75414,0,0,0,0 +75448,75449,0,0,0,0 +75449,75376,2,75448,75450,0 +75450,75449,2,75451,75545,0 +75451,75450,2,75459,75608,0 +75452,75458,0,0,0,0 +75455,75285,2,75496,75521,0 +75456,75431,0,0,0,0 +75457,75341,2,75465,75468,0 +75458,75459,2,75452,75463,0 +75459,75451,2,75458,75487,0 +75460,75382,0,0,0,0 +75461,75462,0,0,0,0 +75462,75409,2,75461,75654,0 +75463,75458,0,0,0,0 +75464,75386,0,0,0,0 +75465,75457,2,75466,75531,0 +75466,75465,2,75427,75429,0 +75467,75345,0,0,0,0 +75468,75457,0,0,0,0 +75469,75407,0,0,0,0 +75470,75473,0,0,0,0 +75471,75376,2,75526,75591,0 +75472,75389,2,75532,75685,0 +75473,75313,2,75470,75502,0 +75474,75353,0,0,0,0 +75477,75405,0,0,0,0 +75481,75485,2,75356,75357,0 +75482,75370,0,0,0,0 +75483,0,2,75503,75554,0 +75484,75574,0,0,0,0 +75485,75574,2,75481,75492,0 +75487,75459,0,0,0,0 +75488,75274,0,0,0,0 +75489,75413,2,75572,75581,0 +75490,75497,0,0,0,0 +75492,75485,0,0,0,0 +75493,0,2,75507,75628,0 +75494,75343,2,75506,75580,0 +75496,75455,2,75497,75811,0 +75497,75496,2,75490,75587,0 +75498,75439,2,75514,75624,0 +75499,75409,0,0,0,0 +75500,75401,0,0,0,0 +75501,75502,0,0,0,0 +75502,75473,2,75501,75578,0 +75503,75483,2,75553,75630,0 +75506,75494,0,0,0,0 +75507,75493,0,0,0,0 +75509,75380,2,75535,75595,0 +75512,75444,2,75544,75663,0 +75513,75514,0,0,0,0 +75514,75498,2,75513,75527,0 +75516,75444,2,75569,75612,0 +75517,75218,0,0,0,0 +75518,75332,0,0,0,0 +75519,75314,2,75530,75550,0 +75520,75298,0,0,0,0 +75521,75455,0,0,0,0 +75522,75417,2,75549,75596,0 +75523,0,0,0,0,0 +75525,75433,2,75529,75632,0 +75526,75471,2,75599,75631,0 +75527,75514,0,0,0,0 +75528,75327,0,0,0,0 +75529,75525,0,0,0,0 +75530,75519,0,0,0,0 +75531,75465,2,75539,75611,0 +75532,75472,2,75564,75648,0 +75533,75326,0,0,0,0 +75535,75509,0,0,0,0 +75538,75539,2,75542,75735,0 +75539,75531,2,75538,75716,0 +75540,75541,0,0,0,0 +75541,75180,2,75540,75621,0 +75542,75538,2,75551,75679,0 +75543,75548,0,0,0,0 +75544,75512,0,0,0,0 +75545,75450,0,0,0,0 +75548,75551,2,75543,75562,0 +75549,75522,2,75556,75600,0 +75550,75519,0,0,0,0 +75551,75542,2,75548,75601,0 +75553,75503,0,0,0,0 +75554,75483,0,0,0,0 +75556,75549,0,0,0,0 +75558,75579,0,0,0,0 +75560,75419,2,75593,75726,0 +75561,75573,0,0,0,0 +75562,75548,0,0,0,0 +75564,75532,2,75568,75676,0 +75565,75402,2,75643,75665,0 +75566,75439,0,0,0,0 +75567,75568,0,0,0,0 +75568,75564,2,75567,75583,0 +75569,75516,2,75609,75619,0 +75572,75489,0,0,0,0 +75573,75590,2,75561,75577,0 +75574,75590,2,75484,75485,0 +75575,75579,0,0,0,0 +75577,75573,0,0,0,0 +75578,75502,0,0,0,0 +75579,75583,2,75558,75575,0 +75580,75494,2,75603,75614,0 +75581,75489,0,0,0,0 +75582,75713,0,0,0,0 +75583,75568,2,75579,75642,0 +75584,75433,0,0,0,0 +75586,75713,0,0,0,0 +75587,75497,0,0,0,0 +75590,75617,2,75573,75574,0 +75591,75471,2,75638,75796,0 +75592,75617,0,0,0,0 +75593,75560,2,75635,75672,0 +75594,0,0,0,0,0 +75595,75509,2,75598,75694,0 +75596,75522,0,0,0,0 +75597,75480,2,75669,75689,0 +75598,75595,0,0,0,0 +75599,75526,0,0,0,0 +75600,75549,0,0,0,0 +75601,75551,2,75610,75668,0 +75602,75603,0,0,0,0 +75603,75580,2,75602,75629,0 +75604,75651,0,0,0,0 +75605,75413,2,75655,75681,0 +75606,75651,0,0,0,0 +75607,75608,0,0,0,0 +75608,75451,2,75607,75613,0 +75609,75569,0,0,0,0 +75610,75601,0,0,0,0 +75611,75531,2,75637,75816,0 +75612,75516,2,75647,75761,0 +75613,75608,0,0,0,0 +75614,75580,2,75644,75731,0 +75616,75619,0,0,0,0 +75617,75658,2,75590,75592,0 +75618,75658,0,0,0,0 +75619,75569,2,75616,75623,0 +75621,75541,2,75626,75705,0 +75623,75619,2,75627,75708,0 +75624,75498,0,0,0,0 +75626,75621,0,0,0,0 +75627,75623,0,0,0,0 +75628,75493,2,75649,75838,0 +75629,75603,2,75670,75710,0 +75630,75503,2,75646,75684,0 +75631,75526,2,75675,75942,0 +75632,75525,0,0,0,0 +75635,75593,2,75640,75741,0 +75636,75657,0,0,0,0 +75637,75611,0,0,0,0 +75638,75591,2,75639,75671,0 +75639,75638,2,75693,75825,0 +75640,75635,2,75695,75748,0 +75642,75583,0,0,0,0 +75643,75565,0,0,0,0 +75644,75614,2,75645,75674,0 +75645,75644,0,0,0,0 +75646,75630,2,75700,75869,0 +75647,75612,2,75660,75859,0 +75648,75532,0,0,0,0 +75649,75628,0,0,0,0 +75651,75753,2,75604,75606,0 +75652,75753,0,0,0,0 +75654,75462,2,75690,75740,0 +75655,75605,0,0,0,0 +75656,75657,0,0,0,0 +75657,75670,2,75636,75656,0 +75658,75661,2,75617,75618,0 +75659,75661,0,0,0,0 +75660,75647,2,75664,75750,0 +75661,75686,2,75658,75659,0 +75663,75512,2,75715,75837,0 +75664,75660,0,0,0,0 +75665,75565,2,75707,75778,0 +75666,75697,0,0,0,0 +75667,75697,0,0,0,0 +75668,75601,0,0,0,0 +75669,75597,0,0,0,0 +75670,75629,2,75657,75673,0 +75671,75638,2,75732,75846,0 +75672,75593,0,0,0,0 +75673,75670,0,0,0,0 +75674,75644,2,75680,75747,0 +75675,75631,2,75687,75692,0 +75676,75564,0,0,0,0 +75679,75542,0,0,0,0 +75680,75674,0,0,0,0 +75681,75605,0,0,0,0 +75684,75630,0,0,0,0 +75685,75472,2,75717,75944,0 +75686,75701,2,75661,75712,0 +75687,75675,0,0,0,0 +75688,75701,2,75702,75768,0 +75689,75597,2,75701,75926,0 +75690,75654,2,75704,75728,0 +75691,75692,0,0,0,0 +75692,75675,2,75691,75777,0 +75693,75639,0,0,0,0 +75694,75595,0,0,0,0 +75695,75640,2,75711,75736,0 +75696,0,2,75699,75749,0 +75697,75724,2,75666,75667,0 +75698,75724,0,0,0,0 +75699,75696,0,0,0,0 +75700,75646,2,75795,75853,0 +75701,75689,2,75686,75688,0 +75702,75688,0,0,0,0 +75704,75690,0,0,0,0 +75705,75621,0,0,0,0 +75707,75665,2,75709,75867,0 +75708,75623,2,75721,75722,0 +75709,75707,0,0,0,0 +75710,75629,0,0,0,0 +75711,75695,0,0,0,0 +75712,75686,2,75713,75769,0 +75713,75712,2,75582,75586,0 +75714,75722,0,0,0,0 +75715,75663,2,75757,75824,0 +75716,75539,0,0,0,0 +75717,75685,2,75756,75866,0 +75719,75760,0,0,0,0 +75720,75909,0,0,0,0 +75721,75708,2,75737,75803,0 +75722,75708,2,75714,76083,0 +75724,75760,2,75697,75698,0 +75725,75890,0,0,0,0 +75726,75560,2,75739,75786,0 +75727,75909,0,0,0,0 +75728,75690,2,75771,75805,0 +75729,75890,0,0,0,0 +75731,75614,0,0,0,0 +75732,75671,0,0,0,0 +75733,75789,0,0,0,0 +75734,75789,0,0,0,0 +75735,75538,0,0,0,0 +75736,75695,0,0,0,0 +75737,75721,0,0,0,0 +75738,75744,0,0,0,0 +75739,75726,2,75742,75754,0 +75740,75654,2,75744,75798,0 +75741,75635,2,75743,75826,0 +75742,75739,0,0,0,0 +75743,75741,0,0,0,0 +75744,75740,2,75738,75764,0 +75746,75818,0,0,0,0 +75747,75674,2,75800,75809,0 +75748,75640,0,0,0,0 +75749,75696,0,0,0,0 +75750,75660,0,0,0,0 +75751,75818,0,0,0,0 +75752,75758,0,0,0,0 +75753,75758,2,75651,75652,0 +75754,75739,0,0,0,0 +75755,75783,0,0,0,0 +75756,75717,2,75773,75797,0 +75757,75715,0,0,0,0 +75758,75770,2,75752,75753,0 +75759,75770,0,0,0,0 +75760,75783,2,75719,75724,0 +75761,75612,2,75810,75842,0 +75762,75808,0,0,0,0 +75763,75808,0,0,0,0 +75764,75744,2,75804,75857,0 +75765,75874,0,0,0,0 +75766,75874,0,0,0,0 +75768,75688,0,0,0,0 +75769,75712,2,75787,75829,0 +75770,75834,2,75758,75759,0 +75771,75728,0,0,0,0 +75773,75756,2,75774,75916,0 +75774,75773,2,75858,75876,0 +75777,75692,2,75831,75987,0 +75778,75665,2,75817,75823,0 +75779,75780,2,75828,75931,0 +75780,75781,2,75779,75793,0 +75781,75784,2,75780,75827,0 +75782,75784,0,0,0,0 +75783,75835,2,75755,75760,0 +75784,75790,2,75781,75782,0 +75785,75790,0,0,0,0 +75786,75726,0,0,0,0 +75787,75769,2,75788,75855,0 +75788,75787,2,75789,75807,0 +75789,75788,2,75733,75734,0 +75790,75791,2,75784,75785,0 +75791,0,2,75790,75794,0 +75793,75780,0,0,0,0 +75794,75791,0,0,0,0 +75795,75700,0,0,0,0 +75796,75591,2,75875,76089,0 +75797,75756,2,75822,75884,0 +75798,75740,0,0,0,0 +75800,75747,2,75861,75912,0 +75801,75809,0,0,0,0 +75802,75834,0,0,0,0 +75803,75721,2,75868,75872,0 +75804,75764,0,0,0,0 +75805,75728,0,0,0,0 +75807,75788,2,75818,75833,0 +75808,75908,2,75762,75763,0 +75809,75747,2,75801,75879,0 +75810,75761,0,0,0,0 +75811,75496,0,0,0,0 +75815,75835,0,0,0,0 +75816,75611,0,0,0,0 +75817,75778,0,0,0,0 +75818,75807,2,75746,75751,0 +75820,75830,0,0,0,0 +75821,75822,0,0,0,0 +75822,75797,2,75821,75852,0 +75823,75778,0,0,0,0 +75824,75715,0,0,0,0 +75825,75639,0,0,0,0 +75826,75741,0,0,0,0 +75827,75781,2,75865,75894,0 +75828,75779,2,75929,75930,0 +75829,75769,2,75841,75898,0 +75830,75831,2,75820,75864,0 +75831,75777,2,75830,75907,0 +75832,75908,0,0,0,0 +75833,75807,2,75854,75892,0 +75834,75934,2,75770,75802,0 +75835,75934,2,75783,75815,0 +75837,75663,2,75839,75878,0 +75838,75628,0,0,0,0 +75839,75837,2,75850,75919,0 +75841,75829,0,0,0,0 +75842,75761,2,75844,75891,0 +75844,75842,0,0,0,0 +75845,75852,0,0,0,0 +75846,75671,2,75856,75887,0 +75847,75925,0,0,0,0 +75848,75925,0,0,0,0 +75849,75852,0,0,0,0 +75850,75839,0,0,0,0 +75852,75822,2,75845,75849,0 +75853,75700,0,0,0,0 +75854,75833,0,0,0,0 +75855,75787,0,0,0,0 +75856,75846,0,0,0,0 +75857,75764,0,0,0,0 +75858,75774,0,0,0,0 +75859,75647,2,76001,76052,0 +75860,75861,0,0,0,0 +75861,75800,2,75860,75871,0 +75864,75830,0,0,0,0 +75865,75827,2,75883,75921,0 +75866,75717,0,0,0,0 +75867,75707,2,75882,75918,0 +75868,75803,0,0,0,0 +75869,75646,0,0,0,0 +75871,75861,2,75889,75959,0 +75872,75803,0,0,0,0 +75874,75900,2,75765,75766,0 +75875,75796,2,75936,76141,0 +75876,75774,2,75901,76019,0 +75878,75837,2,75881,75897,0 +75879,75809,0,0,0,0 +75881,75878,0,0,0,0 +75882,75867,0,0,0,0 +75883,75865,0,0,0,0 +75884,75797,2,75895,75940,0 +75886,75900,0,0,0,0 +75887,75846,0,0,0,0 +75889,75871,2,75952,76077,0 +75890,76028,2,75725,75729,0 +75891,75842,2,75932,76010,0 +75892,75833,2,75893,75985,0 +75893,75892,0,0,0,0 +75894,75827,0,0,0,0 +75895,75884,0,0,0,0 +75897,75878,2,75993,76018,0 +75898,75829,0,0,0,0 +75899,75957,0,0,0,0 +75900,75957,2,75874,75886,0 +75901,75876,0,0,0,0 +75902,76028,0,0,0,0 +75903,76012,0,0,0,0 +75904,76012,0,0,0,0 +75905,75974,0,0,0,0 +75906,75974,0,0,0,0 +75907,75831,2,75986,76059,0 +75908,75924,2,75808,75832,0 +75909,75924,2,75720,75727,0 +75910,76034,0,0,0,0 +75911,76034,0,0,0,0 +75912,75800,0,0,0,0 +75916,75773,0,0,0,0 +75918,75867,2,75928,75941,0 +75919,75839,2,75927,75967,0 +75921,75865,2,75997,76009,0 +75924,75962,2,75908,75909,0 +75925,75962,2,75847,75848,0 +75926,75689,0,0,0,0 +75927,75919,2,75949,75970,0 +75928,75918,0,0,0,0 +75929,75828,0,0,0,0 +75930,75828,0,0,0,0 +75931,75779,0,0,0,0 +75932,75891,0,0,0,0 +75934,75955,2,75834,75835,0 +75936,75875,2,75988,76257,0 +75940,75884,2,75953,75964,0 +75941,75918,2,75976,76075,0 +75942,75631,0,0,0,0 +75944,75685,0,0,0,0 +75947,75955,0,0,0,0 +75949,75927,0,0,0,0 +75952,75889,2,75966,76354,0 +75953,75940,0,0,0,0 +75955,75980,2,75934,75947,0 +75956,76139,0,0,0,0 +75957,76139,2,75899,75900,0 +75959,75871,2,75960,75982,0 +75960,75959,0,0,0,0 +75962,76007,2,75924,75925,0 +75963,76007,0,0,0,0 +75964,75940,0,0,0,0 +75965,75980,0,0,0,0 +75966,75952,2,76004,76224,0 +75967,75919,0,0,0,0 +75970,75927,0,0,0,0 +75971,76003,0,0,0,0 +75972,76003,0,0,0,0 +75974,76024,2,75905,75906,0 +75975,76024,0,0,0,0 +75976,75941,2,75989,76071,0 +75977,76096,0,0,0,0 +75978,76096,0,0,0,0 +75980,76020,2,75955,75965,0 +75981,76020,0,0,0,0 +75982,75959,3,75992,76029,76265 +75985,75892,0,0,0,0 +75986,75907,0,0,0,0 +75987,75777,2,76005,76066,0 +75988,75936,2,76036,76239,0 +75989,75976,2,75990,75999,0 +75990,75989,0,0,0,0 +75992,75982,0,0,0,0 +75993,75897,0,0,0,0 +75994,76000,0,0,0,0 +75995,75999,0,0,0,0 +75996,76102,0,0,0,0 +75997,75921,0,0,0,0 +75998,76000,0,0,0,0 +75999,75989,2,75995,76006,0 +76000,76102,2,75994,75998,0 +76001,75859,2,76026,76058,0 +76003,76023,2,75971,75972,0 +76004,75966,2,76015,76027,0 +76005,75987,0,0,0,0 +76006,75999,2,76057,76120,0 +76007,76073,2,75962,75963,0 +76008,76073,0,0,0,0 +76009,75921,0,0,0,0 +76010,75891,2,76031,76050,0 +76011,76033,0,0,0,0 +76012,76100,2,75903,75904,0 +76013,76100,0,0,0,0 +76015,76004,0,0,0,0 +76016,76033,2,76017,76023,0 +76017,76016,0,0,0,0 +76018,75897,0,0,0,0 +76019,75876,2,76067,76105,0 +76020,76106,2,75980,75981,0 +76021,76106,0,0,0,0 +76023,76016,2,76003,76080,0 +76024,76109,2,75974,75975,0 +76025,76109,0,0,0,0 +76026,76001,2,76069,76140,0 +76027,76004,2,76122,76126,0 +76028,76029,2,75890,75902,0 +76029,75982,2,76028,76079,0 +76030,76037,0,0,0,0 +76031,76010,0,0,0,0 +76032,76037,0,0,0,0 +76033,76068,2,76011,76016,0 +76034,76053,2,75910,75911,0 +76035,76053,0,0,0,0 +76036,75988,0,0,0,0 +76037,76101,2,76030,76032,0 +76038,76101,0,0,0,0 +76041,76068,0,0,0,0 +76044,76181,0,0,0,0 +76045,76181,0,0,0,0 +76048,76085,0,0,0,0 +76050,76010,0,0,0,0 +76052,75859,0,0,0,0 +76053,76136,2,76034,76035,0 +76054,76136,0,0,0,0 +76055,0,0,0,0,0 +76057,76006,2,76062,76266,0 +76058,76001,2,76104,76213,0 +76059,75907,2,76072,76078,0 +76060,0,0,0,0,0 +76062,76057,2,76063,76117,0 +76063,76062,0,0,0,0 +76064,76133,0,0,0,0 +76065,76133,0,0,0,0 +76066,75987,2,76081,76137,0 +76067,76019,2,76151,76161,0 +76068,76110,2,76033,76041,0 +76069,76026,0,0,0,0 +76070,76085,0,0,0,0 +76071,75976,0,0,0,0 +76072,76059,0,0,0,0 +76073,76247,2,76007,76008,0 +76074,76247,0,0,0,0 +76075,75941,0,0,0,0 +76077,75889,0,0,0,0 +76078,76059,2,76115,76130,0 +76079,76029,2,76113,76275,0 +76080,76023,2,76093,76125,0 +76081,76066,0,0,0,0 +76082,76113,0,0,0,0 +76083,75722,0,0,0,0 +76084,76226,0,0,0,0 +76085,76095,2,76048,76070,0 +76086,76113,2,76112,76309,0 +76089,75796,0,0,0,0 +76090,76105,2,76116,76156,0 +76091,76118,0,0,0,0 +76093,76080,2,76094,76225,0 +76094,76093,0,0,0,0 +76095,76112,2,76085,76252,0 +76096,76112,2,75977,75978,0 +76100,76206,2,76012,76013,0 +76101,76226,2,76037,76038,0 +76102,76153,2,75996,76000,0 +76103,76153,0,0,0,0 +76104,76058,0,0,0,0 +76105,76019,2,76090,76157,0 +76106,76222,2,76020,76021,0 +76108,76206,0,0,0,0 +76109,76147,2,76024,76025,0 +76110,76147,2,76068,76144,0 +76112,76086,2,76095,76096,0 +76113,76079,2,76082,76086,0 +76114,76118,2,76136,76195,0 +76115,76078,2,76124,76244,0 +76116,76090,0,0,0,0 +76117,76062,2,76118,76370,0 +76118,76117,2,76091,76114,0 +76119,76222,2,76132,76150,0 +76120,76006,0,0,0,0 +76122,76027,0,0,0,0 +76123,76172,0,0,0,0 +76124,76115,0,0,0,0 +76125,76080,0,0,0,0 +76126,76027,2,76127,76199,0 +76127,76126,0,0,0,0 +76129,76162,0,0,0,0 +76130,76078,0,0,0,0 +76132,76119,0,0,0,0 +76133,76160,2,76064,76065,0 +76136,76114,2,76053,76054,0 +76137,76066,0,0,0,0 +76138,76472,0,0,0,0 +76139,76472,2,75956,75957,0 +76140,76026,0,0,0,0 +76141,75875,0,0,0,0 +76144,76110,2,76202,76237,0 +76146,76248,0,0,0,0 +76147,76248,2,76109,76110,0 +76149,76270,0,0,0,0 +76150,76119,0,0,0,0 +76151,76067,2,76216,76254,0 +76153,76165,2,76102,76103,0 +76154,76165,0,0,0,0 +76156,76090,0,0,0,0 +76157,76105,2,76169,76178,0 +76160,76179,2,76133,76182,0 +76161,76067,0,0,0,0 +76162,76270,2,76129,76168,0 +76164,76183,0,0,0,0 +76165,76183,2,76153,76154,0 +76166,76168,0,0,0,0 +76168,76162,2,76166,76179,0 +76169,76157,0,0,0,0 +76170,76233,0,0,0,0 +76172,76287,2,76123,76197,0 +76174,76179,0,0,0,0 +76177,76209,0,0,0,0 +76178,76157,0,0,0,0 +76179,76168,2,76160,76174,0 +76180,76185,0,0,0,0 +76181,76182,2,76044,76045,0 +76182,76160,2,76181,76207,0 +76183,76185,2,76164,76165,0 +76184,76233,0,0,0,0 +76185,76209,2,76180,76183,0 +76189,76210,0,0,0,0 +76190,76205,0,0,0,0 +76191,76205,0,0,0,0 +76192,76210,0,0,0,0 +76195,76114,2,76273,76294,0 +76196,76197,0,0,0,0 +76197,76172,2,76196,76269,0 +76198,76230,0,0,0,0 +76199,76126,2,76201,76229,0 +76200,76203,0,0,0,0 +76201,76199,0,0,0,0 +76202,76144,0,0,0,0 +76203,76219,2,76200,76251,0 +76204,76219,0,0,0,0 +76205,76230,2,76190,76191,0 +76206,76207,2,76100,76108,0 +76207,76182,2,76206,76215,0 +76208,76220,0,0,0,0 +76209,76303,2,76177,76185,0 +76210,76303,2,76189,76192,0 +76213,76058,0,0,0,0 +76215,76207,2,76219,76264,0 +76216,76151,2,76245,76362,0 +76219,76215,2,76203,76204,0 +76220,76229,2,76208,76235,0 +76222,76326,2,76106,76119,0 +76223,76326,0,0,0,0 +76224,75966,2,76297,76371,0 +76225,76093,0,0,0,0 +76226,76296,2,76084,76101,0 +76227,76296,0,0,0,0 +76228,76244,0,0,0,0 +76229,76199,2,76220,76236,0 +76230,76276,2,76198,76205,0 +76233,76235,2,76170,76184,0 +76234,76287,0,0,0,0 +76235,76220,2,76233,76293,0 +76236,76229,2,76475,76487,0 +76237,76144,0,0,0,0 +76239,75988,0,0,0,0 +76243,76276,2,76259,76299,0 +76244,76115,2,76228,76290,0 +76245,76216,2,76246,76388,0 +76246,76245,0,0,0,0 +76247,76308,2,76073,76074,0 +76248,76308,2,76146,76147,0 +76249,76279,2,76274,76369,0 +76250,76262,0,0,0,0 +76251,76203,0,0,0,0 +76252,76095,2,76270,76304,0 +76254,76151,2,76278,76319,0 +76257,75936,2,76295,76298,0 +76259,76243,0,0,0,0 +76261,76283,0,0,0,0 +76262,76277,2,76250,76271,0 +76263,76277,0,0,0,0 +76264,76215,2,76401,76439,0 +76265,75982,0,0,0,0 +76266,76057,0,0,0,0 +76268,76269,0,0,0,0 +76269,76197,2,76268,76313,0 +76270,76252,2,76149,76162,0 +76271,76262,2,76292,76445,0 +76273,76195,0,0,0,0 +76274,76249,0,0,0,0 +76275,76079,0,0,0,0 +76276,76282,2,76230,76243,0 +76277,76278,2,76262,76263,0 +76278,76254,2,76277,76438,0 +76279,76331,2,76249,76285,0 +76281,76282,0,0,0,0 +76282,76306,2,76276,76281,0 +76283,76293,2,76261,76300,0 +76284,76300,0,0,0,0 +76285,76279,0,0,0,0 +76287,76291,2,76172,76234,0 +76290,76244,2,76296,76324,0 +76291,76292,2,76287,76339,0 +76292,76271,2,76291,76469,0 +76293,76235,2,76283,76301,0 +76294,76195,2,76337,76364,0 +76295,76257,0,0,0,0 +76296,76290,2,76226,76227,0 +76297,76224,0,0,0,0 +76298,76257,0,0,0,0 +76299,76243,0,0,0,0 +76300,76283,2,76284,76318,0 +76301,76293,2,76374,76398,0 +76303,76504,2,76209,76210,0 +76304,76252,2,76347,76403,0 +76306,76504,2,76282,76384,0 +76307,76330,0,0,0,0 +76308,76330,2,76247,76248,0 +76309,76086,0,0,0,0 +76310,76331,0,0,0,0 +76312,76313,0,0,0,0 +76313,76269,2,76312,76454,0 +76318,76300,0,0,0,0 +76319,76254,2,76361,76416,0 +76324,76290,2,76325,76360,0 +76325,76324,0,0,0,0 +76326,76391,2,76222,76223,0 +76327,76391,0,0,0,0 +76330,76377,2,76307,76308,0 +76331,0,2,76279,76310,0 +76332,76375,0,0,0,0 +76333,76375,0,0,0,0 +76334,76377,0,0,0,0 +76337,76294,2,76346,76547,0 +76339,76291,2,76368,76424,0 +76346,76337,0,0,0,0 +76347,76304,0,0,0,0 +76354,75952,0,0,0,0 +76356,76422,0,0,0,0 +76360,76324,2,76400,76478,0 +76361,76319,0,0,0,0 +76362,76216,0,0,0,0 +76364,76294,2,76383,76402,0 +76367,76368,0,0,0,0 +76368,76339,2,76367,76432,0 +76369,76249,0,0,0,0 +76370,76117,2,76378,76389,0 +76371,76224,2,76418,76497,0 +76374,76301,2,76417,76451,0 +76375,76394,2,76332,76333,0 +76377,76387,2,76330,76334,0 +76378,76370,0,0,0,0 +76380,76394,0,0,0,0 +76381,76387,2,76382,76393,0 +76382,76381,0,0,0,0 +76383,76364,2,76543,76593,0 +76384,76306,0,0,0,0 +76386,76467,0,0,0,0 +76387,76467,2,76377,76381,0 +76388,76245,2,76392,76486,0 +76389,76370,0,0,0,0 +76391,76489,2,76326,76327,0 +76392,76388,0,0,0,0 +76393,76381,2,76421,76549,0 +76394,76786,2,76375,76380,0 +76395,76489,0,0,0,0 +76398,76301,0,0,0,0 +76400,76360,2,76404,76457,0 +76401,76264,0,0,0,0 +76402,76364,2,76430,76575,0 +76403,76304,2,76425,76516,0 +76404,76400,0,0,0,0 +76416,76319,0,0,0,0 +76417,76374,0,0,0,0 +76418,76371,0,0,0,0 +76419,76421,0,0,0,0 +76421,76393,2,76419,76433,0 +76422,76517,2,76356,76461,0 +76424,76339,0,0,0,0 +76425,76403,0,0,0,0 +76429,76786,0,0,0,0 +76430,76402,0,0,0,0 +76432,76368,2,76484,76551,0 +76433,76421,2,76436,76554,0 +76434,76437,0,0,0,0 +76436,76433,2,76437,76502,0 +76437,76436,2,76434,76447,0 +76438,76278,0,0,0,0 +76439,76264,0,0,0,0 +76441,76517,0,0,0,0 +76445,76271,0,0,0,0 +76447,76437,0,0,0,0 +76451,76374,2,76452,76466,0 +76452,76451,0,0,0,0 +76453,76477,0,0,0,0 +76454,76313,2,76493,76561,0 +76455,76477,2,76458,76521,0 +76457,76400,0,0,0,0 +76458,76455,0,0,0,0 +76461,76422,0,0,0,0 +76466,76451,2,76485,76520,0 +76467,76505,2,76386,76387,0 +76468,76505,0,0,0,0 +76469,76292,0,0,0,0 +76471,76586,0,0,0,0 +76472,76586,2,76138,76139,0 +76475,76236,2,76530,76535,0 +76476,76572,0,0,0,0 +76477,76478,2,76453,76455,0 +76478,76360,2,76477,76488,0 +76483,76492,0,0,0,0 +76484,76432,2,76513,76528,0 +76485,76466,0,0,0,0 +76486,76388,2,76490,76590,0 +76487,76236,0,0,0,0 +76488,76478,0,0,0,0 +76489,76548,2,76391,76395,0 +76490,76486,0,0,0,0 +76491,76548,0,0,0,0 +76492,76493,2,76483,76517,0 +76493,76454,2,76492,76553,0 +76494,76506,0,0,0,0 +76495,76506,0,0,0,0 +76497,76371,2,76508,76525,0 +76499,76552,0,0,0,0 +76501,76552,0,0,0,0 +76502,76436,2,76514,76564,0 +76504,76557,2,76303,76306,0 +76505,76557,2,76467,76468,0 +76506,76564,2,76494,76495,0 +76508,76497,0,0,0,0 +76512,76519,0,0,0,0 +76513,76484,2,76519,76571,0 +76514,76502,0,0,0,0 +76515,76564,0,0,0,0 +76516,76403,2,76540,76605,0 +76517,76492,2,76422,76441,0 +76518,0,0,0,0,0 +76519,76513,2,76512,76570,0 +76520,76466,0,0,0,0 +76521,76455,0,0,0,0 +76522,76560,0,0,0,0 +76523,76560,0,0,0,0 +76525,76497,2,76563,76566,0 +76528,76484,0,0,0,0 +76529,76541,0,0,0,0 +76530,76475,0,0,0,0 +76534,76541,0,0,0,0 +76535,76475,2,76567,76602,0 +76536,76556,0,0,0,0 +76538,76556,0,0,0,0 +76539,76748,0,0,0,0 +76540,76516,2,76541,76670,0 +76541,76540,2,76529,76534,0 +76543,76383,0,0,0,0 +76546,76572,0,0,0,0 +76547,76337,0,0,0,0 +76548,76630,2,76489,76491,0 +76549,76393,0,0,0,0 +76551,76432,0,0,0,0 +76552,76748,2,76499,76501,0 +76553,76493,0,0,0,0 +76554,76433,0,0,0,0 +76556,76734,2,76536,76538,0 +76557,76734,2,76504,76505,0 +76560,76630,2,76522,76523,0 +76561,76454,2,76646,76756,0 +76563,76525,2,76607,76619,0 +76564,76502,2,76506,76515,0 +76566,76525,2,76591,76706,0 +76567,76535,0,0,0,0 +76568,76569,0,0,0,0 +76569,76570,2,76568,76574,0 +76570,76519,2,76569,76658,0 +76571,76513,2,76576,76637,0 +76572,76591,2,76476,76546,0 +76573,0,0,0,0,0 +76574,76569,0,0,0,0 +76575,76402,2,76578,76622,0 +76576,76571,0,0,0,0 +76578,76575,0,0,0,0 +76580,76657,0,0,0,0 +76581,76657,0,0,0,0 +76582,76596,0,0,0,0 +76583,76609,0,0,0,0 +76586,76690,2,76471,76472,0 +76587,76624,0,0,0,0 +76590,76486,2,76596,76628,0 +76591,76566,2,76572,76633,0 +76593,76383,2,76626,76647,0 +76596,76590,2,76582,76615,0 +76601,76690,0,0,0,0 +76602,76535,0,0,0,0 +76605,76516,2,76610,76824,0 +76606,76615,0,0,0,0 +76607,76563,2,76638,76650,0 +76609,76610,2,76583,76668,0 +76610,76605,2,76609,76666,0 +76615,76596,2,76606,76641,0 +76619,76563,0,0,0,0 +76622,76575,2,76639,76642,0 +76624,76712,2,76587,76627,0 +76626,76593,2,76632,76747,0 +76627,76624,0,0,0,0 +76628,76590,0,0,0,0 +76629,76656,0,0,0,0 +76630,76656,2,76548,76560,0 +76632,76626,0,0,0,0 +76633,76591,2,76671,76701,0 +76636,76668,0,0,0,0 +76637,76571,2,76729,76737,0 +76638,76607,0,0,0,0 +76639,76622,0,0,0,0 +76641,76615,0,0,0,0 +76642,76622,0,0,0,0 +76646,76561,0,0,0,0 +76647,76593,0,0,0,0 +76650,76607,0,0,0,0 +76655,76815,0,0,0,0 +76656,76815,2,76629,76630,0 +76657,76664,2,76580,76581,0 +76658,76570,2,76688,76723,0 +76664,76755,2,76657,76681,0 +76665,76755,0,0,0,0 +76666,76610,2,76684,76874,0 +76668,76609,2,76636,76691,0 +76670,76540,2,76674,76683,0 +76671,76633,0,0,0,0 +76674,76670,2,76675,76740,0 +76675,76674,0,0,0,0 +76681,76664,0,0,0,0 +76683,76670,0,0,0,0 +76684,76666,0,0,0,0 +76688,76658,0,0,0,0 +76689,76927,0,0,0,0 +76690,76927,2,76586,76601,0 +76691,76668,0,0,0,0 +76696,76792,0,0,0,0 +76697,76792,0,0,0,0 +76701,76633,0,0,0,0 +76702,76714,0,0,0,0 +76703,76714,0,0,0,0 +76706,76566,2,76724,76749,0 +76711,76810,0,0,0,0 +76712,76810,2,76624,76716,0 +76714,76931,2,76702,76703,0 +76715,76931,0,0,0,0 +76716,76712,0,0,0,0 +76723,76658,0,0,0,0 +76724,76706,0,0,0,0 +76729,76637,2,76736,76744,0 +76733,76851,0,0,0,0 +76734,76851,2,76556,76557,0 +76736,76729,2,76771,76838,0 +76737,76637,2,76738,76796,0 +76738,76737,0,0,0,0 +76740,76674,2,76806,76834,0 +76742,76798,0,0,0,0 +76743,76798,0,0,0,0 +76744,76729,0,0,0,0 +76747,76626,0,0,0,0 +76748,76836,2,76539,76552,0 +76749,76706,0,0,0,0 +76754,76850,0,0,0,0 +76755,76850,2,76664,76665,0 +76756,76561,2,76814,76829,0 +76758,76761,0,0,0,0 +76759,76787,0,0,0,0 +76760,76841,0,0,0,0 +76761,76787,2,76758,76812,0 +76764,76841,0,0,0,0 +76771,76736,0,0,0,0 +76772,76852,0,0,0,0 +76775,76796,0,0,0,0 +76776,76852,0,0,0,0 +76780,76793,0,0,0,0 +76786,76799,2,76394,76429,0 +76787,76799,2,76759,76761,0 +76790,76833,0,0,0,0 +76791,76968,0,0,0,0 +76792,76968,2,76696,76697,0 +76793,76833,2,76780,76830,0 +76794,76796,0,0,0,0 +76796,76737,2,76775,76794,0 +76797,76827,0,0,0,0 +76798,76827,2,76742,76743,0 +76799,76802,3,76786,76787,76943 +76800,76812,0,0,0,0 +76801,76929,0,0,0,0 +76802,76828,2,76799,76883,0 +76803,77055,0,0,0,0 +76804,77055,0,0,0,0 +76806,76740,0,0,0,0 +76810,76835,2,76711,76712,0 +76811,76835,0,0,0,0 +76812,76761,2,76800,76819,0 +76813,76814,0,0,0,0 +76814,76756,2,76813,77000,0 +76815,76946,2,76655,76656,0 +76816,76946,0,0,0,0 +76819,76812,0,0,0,0 +76820,76855,0,0,0,0 +76821,76855,0,0,0,0 +76823,76929,0,0,0,0 +76824,76605,0,0,0,0 +76825,76933,0,0,0,0 +76826,76933,0,0,0,0 +76827,76961,2,76797,76798,0 +76828,76961,2,76802,76846,0 +76829,76756,0,0,0,0 +76830,76793,0,0,0,0 +76833,76854,2,76790,76793,0 +76834,76740,0,0,0,0 +76835,77110,2,76810,76811,0 +76836,77110,2,76748,76857,0 +76838,76736,2,76845,76856,0 +76839,76985,0,0,0,0 +76840,76985,0,0,0,0 +76841,76859,2,76760,76764,0 +76842,76980,0,0,0,0 +76843,76980,0,0,0,0 +76844,76854,0,0,0,0 +76845,76838,0,0,0,0 +76846,76828,0,0,0,0 +76850,76863,2,76754,76755,0 +76851,76863,2,76733,76734,0 +76852,76919,2,76772,76776,0 +76853,76919,0,0,0,0 +76854,76867,2,76833,76844,0 +76855,76868,2,76820,76821,0 +76856,76838,0,0,0,0 +76857,76836,2,76859,76864,0 +76859,76857,2,76841,76877,0 +76863,77039,2,76850,76851,0 +76864,76857,0,0,0,0 +76866,76934,0,0,0,0 +76867,77039,2,76854,76873,0 +76868,76934,2,76855,76871,0 +76869,76940,0,0,0,0 +76870,76940,0,0,0,0 +76871,76868,2,76893,76960,0 +76873,76867,0,0,0,0 +76874,76666,0,0,0,0 +76877,76859,2,76878,76881,0 +76878,76877,0,0,0,0 +76879,76905,0,0,0,0 +76880,76905,0,0,0,0 +76881,76877,2,76882,76887,0 +76882,76881,0,0,0,0 +76883,76802,0,0,0,0 +76884,76892,0,0,0,0 +76885,76991,0,0,0,0 +76886,76991,0,0,0,0 +76887,76881,0,0,0,0 +76892,76893,2,76884,76910,0 +76893,76871,2,76892,77033,0 +76903,76925,0,0,0,0 +76904,76925,0,0,0,0 +76905,76989,2,76879,76880,0 +76906,76989,0,0,0,0 +76907,76920,0,0,0,0 +76909,76910,0,0,0,0 +76910,76892,2,76909,76958,0 +76912,76966,0,0,0,0 +76913,76966,0,0,0,0 +76914,76979,0,0,0,0 +76915,76979,0,0,0,0 +76917,76992,0,0,0,0 +76918,76992,0,0,0,0 +76919,76930,2,76852,76853,0 +76920,76939,2,76907,76936,0 +76921,77051,0,0,0,0 +76922,77051,0,0,0,0 +76925,77021,2,76903,76904,0 +76926,77021,0,0,0,0 +76927,76974,2,76689,76690,0 +76928,76974,0,0,0,0 +76929,76958,2,76801,76823,0 +76930,76932,2,76919,76942,0 +76931,76932,2,76714,76715,0 +76932,77006,2,76930,76931,0 +76933,77006,2,76825,76826,0 +76934,76954,2,76866,76868,0 +76935,76936,0,0,0,0 +76936,76920,2,76935,76972,0 +76938,76977,0,0,0,0 +76939,77066,2,76920,76950,0 +76940,77066,2,76869,76870,0 +76941,76958,2,77027,77058,0 +76942,76930,2,76984,77023,0 +76943,76799,2,76978,76999,0 +76944,76954,0,0,0,0 +76946,76973,2,76815,76816,0 +76950,76939,0,0,0,0 +76954,76973,2,76934,76944,0 +76955,77063,0,0,0,0 +76956,77063,0,0,0,0 +76957,76977,0,0,0,0 +76958,76910,2,76929,76941,0 +76960,76871,0,0,0,0 +76961,77144,2,76827,76828,0 +76965,77144,0,0,0,0 +76966,77005,2,76912,76913,0 +76967,77049,0,0,0,0 +76968,76982,2,76791,76792,0 +76972,76936,0,0,0,0 +76973,77179,2,76946,76954,0 +76974,77179,2,76927,76928,0 +76977,77049,2,76938,76957,0 +76978,76943,2,77046,77109,0 +76979,76983,2,76914,76915,0 +76980,77008,2,76842,76843,0 +76981,77008,0,0,0,0 +76982,76988,2,76968,77011,0 +76983,77064,2,76979,77005,0 +76984,76942,2,76987,77048,0 +76985,77007,2,76839,76840,0 +76986,77007,0,0,0,0 +76987,76984,2,76991,77096,0 +76988,77016,2,76982,77079,0 +76989,77016,2,76905,76906,0 +76991,76987,2,76885,76886,0 +76992,77017,2,76917,76918,0 +76993,77017,0,0,0,0 +76996,76997,0,0,0,0 +76997,77005,2,76996,77067,0 +76998,77011,2,77052,77219,0 +76999,76943,0,0,0,0 +77000,76814,0,0,0,0 +77005,76983,2,76966,76997,0 +77006,77141,2,76932,76933,0 +77007,77071,2,76985,76986,0 +77008,77071,2,76980,76981,0 +77011,76982,2,76998,77077,0 +77014,77057,0,0,0,0 +77016,77070,2,76988,76989,0 +77017,77070,2,76992,76993,0 +77021,77082,2,76925,76926,0 +77022,77082,0,0,0,0 +77023,76942,0,0,0,0 +77025,77057,0,0,0,0 +77026,77037,0,0,0,0 +77027,76941,2,77045,77065,0 +77028,77034,0,0,0,0 +77029,77062,0,0,0,0 +77030,77073,0,0,0,0 +77033,76893,0,0,0,0 +77034,77073,2,77028,77037,0 +77037,77034,2,77026,77055,0 +77038,77086,0,0,0,0 +77039,77086,2,76863,76867,0 +77045,77027,0,0,0,0 +77046,76978,0,0,0,0 +77047,77114,0,0,0,0 +77048,76984,0,0,0,0 +77049,77059,2,76967,76977,0 +77050,77127,0,0,0,0 +77051,77127,2,76921,76922,0 +77052,76998,0,0,0,0 +77054,77062,0,0,0,0 +77055,77037,2,76803,76804,0 +77056,77095,0,0,0,0 +77057,77095,2,77014,77025,0 +77058,76941,2,77062,77161,0 +77059,77114,2,77049,77080,0 +77062,77058,2,77029,77054,0 +77063,77089,2,76955,76956,0 +77064,77098,2,76983,77218,0 +77065,77027,0,0,0,0 +77066,77081,2,76939,76940,0 +77067,76997,2,77068,77093,0 +77068,77067,0,0,0,0 +77069,77141,0,0,0,0 +77070,77106,2,77016,77017,0 +77071,77106,2,77007,77008,0 +77073,77089,2,77030,77034,0 +77077,77011,2,77088,77330,0 +77079,76988,2,77112,77116,0 +77080,77059,0,0,0,0 +77081,77130,2,77066,77092,0 +77082,77130,2,77021,77022,0 +77086,77199,2,77038,77039,0 +77088,77077,2,77141,77150,0 +77089,77199,2,77063,77073,0 +77092,77081,0,0,0,0 +77093,77067,0,0,0,0 +77094,77193,0,0,0,0 +77095,77193,2,77056,77057,0 +77096,76987,2,77099,77194,0 +77098,77099,2,77064,77140,0 +77099,77096,2,77098,77324,0 +77106,77374,2,77070,77071,0 +77109,76978,0,0,0,0 +77110,77115,2,76835,76836,0 +77111,77115,0,0,0,0 +77112,77079,0,0,0,0 +77114,77214,2,77047,77059,0 +77115,77214,2,77110,77111,0 +77116,77079,0,0,0,0 +77120,77207,0,0,0,0 +77121,77207,0,0,0,0 +77123,77143,0,0,0,0 +77124,77143,0,0,0,0 +77126,77208,0,0,0,0 +77127,77208,2,77050,77051,0 +77129,77139,0,0,0,0 +77130,77177,2,77081,77082,0 +77131,77374,0,0,0,0 +77133,77136,0,0,0,0 +77136,77139,2,77133,77151,0 +77139,77178,2,77129,77136,0 +77140,77098,0,0,0,0 +77141,77088,2,77006,77069,0 +77143,77293,2,77123,77124,0 +77144,77294,2,76961,76965,0 +77145,77202,0,0,0,0 +77146,77202,0,0,0,0 +77148,77294,0,0,0,0 +77150,77088,0,0,0,0 +77151,77136,2,77234,77274,0 +77153,77293,0,0,0,0 +77154,77298,0,0,0,0 +77155,77298,0,0,0,0 +77161,77058,2,77222,77236,0 +77163,77216,0,0,0,0 +77177,77216,2,77130,77235,0 +77178,77183,2,77139,77186,0 +77179,77183,2,76973,76974,0 +77182,77196,0,0,0,0 +77183,77475,2,77178,77179,0 +77184,77196,0,0,0,0 +77186,77178,0,0,0,0 +77191,77285,0,0,0,0 +77192,77285,0,0,0,0 +77193,77262,2,77094,77095,0 +77194,77096,0,0,0,0 +77196,77467,2,77182,77184,0 +77199,77467,2,77086,77089,0 +77202,77281,2,77145,77146,0 +77204,77215,0,0,0,0 +77207,77240,2,77120,77121,0 +77208,77213,2,77126,77127,0 +77210,77215,0,0,0,0 +77212,77475,0,0,0,0 +77213,77237,2,77208,77269,0 +77214,77441,2,77114,77115,0 +77215,77441,2,77204,77210,0 +77216,77284,2,77163,77177,0 +77217,77284,0,0,0,0 +77218,77064,2,77224,77307,0 +77219,76998,0,0,0,0 +77222,77161,2,77273,77312,0 +77224,77218,0,0,0,0 +77227,77302,0,0,0,0 +77229,77281,0,0,0,0 +77234,77151,0,0,0,0 +77235,77177,0,0,0,0 +77236,77161,0,0,0,0 +77237,77248,2,77213,77334,0 +77240,77244,2,77207,77248,0 +77244,77275,2,77240,77310,0 +77245,77275,0,0,0,0 +77248,77240,2,77237,77257,0 +77249,77302,0,0,0,0 +77257,77248,2,77317,77346,0 +77258,77329,0,0,0,0 +77262,77306,2,77193,77265,0 +77263,77387,0,0,0,0 +77264,77387,0,0,0,0 +77265,77262,0,0,0,0 +77268,77269,0,0,0,0 +77269,77213,2,77268,77333,0 +77273,77222,0,0,0,0 +77274,77151,0,0,0,0 +77275,77288,2,77244,77245,0 +77277,77296,0,0,0,0 +77281,77289,2,77202,77229,0 +77282,77289,0,0,0,0 +77284,77407,2,77216,77217,0 +77285,77407,2,77191,77192,0 +77288,77319,2,77275,77342,0 +77289,77304,2,77281,77282,0 +77290,77363,0,0,0,0 +77291,77301,0,0,0,0 +77292,77339,0,0,0,0 +77293,77336,2,77143,77153,0 +77294,77336,2,77144,77148,0 +77296,77329,2,77277,77302,0 +77298,77439,2,77154,77155,0 +77300,77348,0,0,0,0 +77301,77348,2,77291,77347,0 +77302,77296,2,77227,77249,0 +77303,77304,2,77316,77463,0 +77304,77439,2,77289,77303,0 +77306,77391,2,77262,77352,0 +77307,77218,0,0,0,0 +77310,77244,2,77358,77367,0 +77311,77339,2,77319,77395,0 +77312,77222,0,0,0,0 +77313,77363,0,0,0,0 +77314,77316,0,0,0,0 +77316,77303,2,77314,77349,0 +77317,77257,0,0,0,0 +77319,77311,2,77288,77382,0 +77324,77099,0,0,0,0 +77329,77330,2,77258,77296,0 +77330,77077,2,77329,77417,0 +77333,77269,0,0,0,0 +77334,77237,0,0,0,0 +77336,77482,2,77293,77294,0 +77338,77370,0,0,0,0 +77339,77376,2,77292,77311,0 +77342,77288,0,0,0,0 +77344,77381,0,0,0,0 +77345,77381,0,0,0,0 +77346,77257,0,0,0,0 +77347,77301,0,0,0,0 +77348,77386,2,77300,77301,0 +77349,77316,0,0,0,0 +77352,77306,0,0,0,0 +77354,77355,0,0,0,0 +77355,77597,2,77354,77365,0 +77356,77597,0,0,0,0 +77357,0,0,0,0,0 +77358,77310,0,0,0,0 +77359,77366,0,0,0,0 +77363,77536,2,77290,77313,0 +77364,77536,0,0,0,0 +77365,77355,0,0,0,0 +77366,77386,2,77359,77557,0 +77367,77310,0,0,0,0 +77370,77482,2,77338,77371,0 +77371,77370,0,0,0,0 +77374,0,2,77106,77131,0 +77376,77398,2,77339,77409,0 +77377,77414,0,0,0,0 +77381,77402,2,77344,77345,0 +77382,77319,0,0,0,0 +77384,77411,0,0,0,0 +77386,77388,2,77348,77366,0 +77387,77445,2,77263,77264,0 +77388,77445,2,77386,77405,0 +77389,77413,0,0,0,0 +77391,77408,2,77306,77423,0 +77392,77394,0,0,0,0 +77393,77402,2,77394,77404,0 +77394,77393,2,77392,77412,0 +77395,77311,0,0,0,0 +77398,77419,2,77376,77406,0 +77399,77419,0,0,0,0 +77400,77411,0,0,0,0 +77402,77532,2,77381,77393,0 +77404,77393,0,0,0,0 +77405,77388,0,0,0,0 +77406,77398,0,0,0,0 +77407,77425,2,77284,77285,0 +77408,77425,2,77391,77422,0 +77409,77376,0,0,0,0 +77411,77412,2,77384,77400,0 +77412,77394,2,77411,77443,0 +77413,77416,2,77389,77415,0 +77414,77415,2,77377,77457,0 +77415,77413,2,77414,77440,0 +77416,77417,2,77413,77477,0 +77417,77330,2,77416,77481,0 +77419,77426,2,77398,77399,0 +77422,77408,0,0,0,0 +77423,77391,0,0,0,0 +77424,77466,0,0,0,0 +77425,77466,2,77407,77408,0 +77426,77429,2,77419,77453,0 +77429,77456,2,77426,77501,0 +77430,77456,0,0,0,0 +77431,77526,0,0,0,0 +77434,77526,0,0,0,0 +77437,77608,0,0,0,0 +77438,77608,0,0,0,0 +77439,77490,2,77298,77304,0 +77440,77415,0,0,0,0 +77441,77464,2,77214,77215,0 +77443,77412,0,0,0,0 +77445,77491,2,77387,77388,0 +77449,77465,2,77450,77473,0 +77450,77449,0,0,0,0 +77453,77426,0,0,0,0 +77456,77464,2,77429,77430,0 +77457,77414,0,0,0,0 +77459,77693,0,0,0,0 +77460,77693,0,0,0,0 +77461,77522,0,0,0,0 +77462,77522,0,0,0,0 +77463,77303,0,0,0,0 +77464,77493,2,77441,77456,0 +77465,77493,2,77449,77528,0 +77466,77523,2,77424,77425,0 +77467,77529,2,77196,77199,0 +77468,77529,0,0,0,0 +77473,77449,0,0,0,0 +77474,77555,0,0,0,0 +77475,77555,2,77183,77212,0 +77477,77416,0,0,0,0 +77481,77417,2,77512,77561,0 +77482,77600,2,77336,77370,0 +77488,77532,0,0,0,0 +77490,77603,2,77439,77619,0 +77491,77603,2,77445,77496,0 +77493,77613,2,77464,77465,0 +77496,77491,2,77509,77567,0 +77498,77545,0,0,0,0 +77499,77873,0,0,0,0 +77500,77873,0,0,0,0 +77501,77429,0,0,0,0 +77502,77606,0,0,0,0 +77503,77606,0,0,0,0 +77505,77548,0,0,0,0 +77506,77548,0,0,0,0 +77508,77523,0,0,0,0 +77509,77496,0,0,0,0 +77511,77600,0,0,0,0 +77512,77481,0,0,0,0 +77519,77613,0,0,0,0 +77521,77553,0,0,0,0 +77522,77553,2,77461,77462,0 +77523,77546,2,77466,77508,0 +77525,77580,0,0,0,0 +77526,77580,2,77431,77434,0 +77528,77465,2,77535,77547,0 +77529,77677,2,77467,77468,0 +77532,77539,2,77402,77488,0 +77533,77551,0,0,0,0 +77534,77682,0,0,0,0 +77535,77528,0,0,0,0 +77536,78249,2,77363,77364,0 +77537,78249,0,0,0,0 +77539,77677,2,77532,77689,0 +77542,77696,0,0,0,0 +77543,77696,0,0,0,0 +77544,77545,0,0,0,0 +77545,77640,2,77498,77544,0 +77546,77640,2,77523,77558,0 +77547,77528,2,77556,77560,0 +77548,77682,2,77505,77506,0 +77549,77663,0,0,0,0 +77550,77663,0,0,0,0 +77551,0,2,77533,77598,0 +77553,77616,2,77521,77522,0 +77554,77577,0,0,0,0 +77555,77577,2,77474,77475,0 +77556,77547,0,0,0,0 +77557,77366,0,0,0,0 +77558,77546,0,0,0,0 +77560,77547,0,0,0,0 +77561,77481,0,0,0,0 +77567,77496,0,0,0,0 +77575,77616,0,0,0,0 +77577,77694,2,77554,77555,0 +77580,77681,2,77525,77526,0 +77583,77615,0,0,0,0 +77584,77615,0,0,0,0 +77589,77681,0,0,0,0 +77594,77604,0,0,0,0 +77595,77718,0,0,0,0 +77596,77718,0,0,0,0 +77597,77860,2,77355,77356,0 +77598,77551,0,0,0,0 +77600,77860,2,77482,77511,0 +77601,77694,0,0,0,0 +77603,77627,2,77490,77491,0 +77604,77627,2,77594,77670,0 +77605,77669,0,0,0,0 +77606,77669,2,77502,77503,0 +77608,77633,2,77437,77438,0 +77610,77723,0,0,0,0 +77611,77723,0,0,0,0 +77612,77650,0,0,0,0 +77613,77650,2,77493,77519,0 +77614,77633,0,0,0,0 +77615,77708,2,77583,77584,0 +77616,77708,2,77553,77575,0 +77617,77686,0,0,0,0 +77618,77686,0,0,0,0 +77619,77490,0,0,0,0 +77626,77730,0,0,0,0 +77627,77730,2,77603,77604,0 +77633,77698,2,77608,77614,0 +77639,77769,0,0,0,0 +77640,77769,2,77545,77546,0 +77648,77752,0,0,0,0 +77649,77752,0,0,0,0 +77650,77715,2,77612,77613,0 +77651,77715,0,0,0,0 +77657,77806,0,0,0,0 +77661,77662,0,0,0,0 +77662,77698,2,77661,77668,0 +77663,77872,2,77549,77550,0 +77664,77872,0,0,0,0 +77668,77662,0,0,0,0 +77669,77898,2,77605,77606,0 +77670,77604,0,0,0,0 +77671,77898,0,0,0,0 +77675,77679,0,0,0,0 +77677,77705,2,77529,77539,0 +77678,77705,0,0,0,0 +77679,77806,2,77675,77680,0 +77680,77679,0,0,0,0 +77681,77802,2,77580,77589,0 +77682,77802,2,77534,77548,0 +77686,77809,2,77617,77618,0 +77687,77809,0,0,0,0 +77689,77539,0,0,0,0 +77693,77703,2,77459,77460,0 +77694,77704,2,77577,77601,0 +77695,77970,0,0,0,0 +77696,77970,2,77542,77543,0 +77698,77703,2,77633,77662,0 +77700,77720,0,0,0,0 +77703,77865,2,77693,77698,0 +77704,77865,2,77694,77706,0 +77705,77751,2,77677,77678,0 +77706,77704,0,0,0,0 +77707,77739,0,0,0,0 +77708,77739,2,77615,77616,0 +77714,77894,0,0,0,0 +77715,77894,2,77650,77651,0 +77718,77828,2,77595,77596,0 +77719,77828,0,0,0,0 +77720,77751,2,77700,77757,0 +77723,77745,2,77610,77611,0 +77724,77848,0,0,0,0 +77725,77848,0,0,0,0 +77729,77961,0,0,0,0 +77730,77961,2,77626,77627,0 +77731,77745,0,0,0,0 +77738,77740,0,0,0,0 +77739,78005,2,77707,77708,0 +77740,78005,2,77738,77741,0 +77741,77740,2,77748,77817,0 +77744,77858,0,0,0,0 +77745,77858,2,77723,77731,0 +77748,77741,0,0,0,0 +77749,77757,0,0,0,0 +77751,77762,2,77705,77720,0 +77752,77762,2,77648,77649,0 +77757,77720,2,77749,77825,0 +77759,77761,0,0,0,0 +77760,77807,0,0,0,0 +77761,77807,2,77759,77800,0 +77762,77793,2,77751,77752,0 +77763,77793,0,0,0,0 +77769,77885,2,77639,77640,0 +77777,77790,0,0,0,0 +77778,77790,0,0,0,0 +77790,78055,2,77777,77778,0 +77791,78055,0,0,0,0 +77792,77859,0,0,0,0 +77793,77859,2,77762,77763,0 +77797,0,0,0,0,0 +77799,77801,0,0,0,0 +77800,77761,0,0,0,0 +77801,77885,2,77799,77810,0 +77802,77829,2,77681,77682,0 +77806,77953,2,77657,77679,0 +77807,78019,2,77760,77761,0 +77809,77953,2,77686,77687,0 +77810,77801,0,0,0,0 +77811,77838,0,0,0,0 +77812,77838,0,0,0,0 +77813,77863,0,0,0,0 +77814,77863,0,0,0,0 +77817,77741,0,0,0,0 +77818,77829,0,0,0,0 +77819,77851,0,0,0,0 +77820,77825,0,0,0,0 +77821,77825,0,0,0,0 +77823,77921,0,0,0,0 +77825,77757,2,77820,77821,0 +77827,78046,0,0,0,0 +77828,78046,2,77718,77719,0 +77829,77921,2,77802,77818,0 +77830,77874,0,0,0,0 +77831,77874,0,0,0,0 +77832,77851,0,0,0,0 +77836,78019,0,0,0,0 +77837,77839,0,0,0,0 +77838,77839,2,77811,77812,0 +77839,77907,2,77837,77838,0 +77843,77995,0,0,0,0 +77844,77907,2,77861,77864,0 +77845,0,0,0,0,0 +77848,0,2,77724,77725,0 +77851,77964,2,77819,77832,0 +77852,77964,0,0,0,0 +77855,78000,0,0,0,0 +77856,78000,0,0,0,0 +77857,77995,2,77858,77879,0 +77858,77857,2,77744,77745,0 +77859,77901,2,77792,77793,0 +77860,77901,2,77597,77600,0 +77861,77844,0,0,0,0 +77863,77929,2,77813,77814,0 +77864,77844,0,0,0,0 +77865,77889,2,77703,77704,0 +77872,77951,2,77663,77664,0 +77873,77951,2,77499,77500,0 +77874,77879,2,77830,77831,0 +77875,0,0,0,0,0 +77876,77879,0,0,0,0 +77879,77857,2,77874,77876,0 +77882,77889,2,77883,77913,0 +77883,77882,0,0,0,0 +77884,77917,0,0,0,0 +77885,77917,2,77769,77801,0 +77888,78001,0,0,0,0 +77889,78001,2,77865,77882,0 +77890,77969,0,0,0,0 +77891,77969,0,0,0,0 +77894,78017,2,77714,77715,0 +77895,78017,0,0,0,0 +77897,77919,0,0,0,0 +77898,77919,2,77669,77671,0 +77901,77966,2,77859,77860,0 +77902,77966,0,0,0,0 +77903,78043,0,0,0,0 +77904,78043,0,0,0,0 +77907,77918,2,77839,77844,0 +77913,77882,0,0,0,0 +77914,77918,0,0,0,0 +77917,78018,2,77884,77885,0 +77918,77927,2,77907,77914,0 +77919,77927,2,77897,77898,0 +77920,77994,0,0,0,0 +77921,77943,2,77823,77829,0 +77927,77928,2,77918,77919,0 +77928,77929,2,77927,78041,0 +77929,0,2,77863,77928,0 +77932,77943,0,0,0,0 +77941,77994,0,0,0,0 +77942,78133,0,0,0,0 +77943,78133,2,77921,77932,0 +77945,78144,0,0,0,0 +77946,78140,0,0,0,0 +77947,78140,0,0,0,0 +77950,78066,0,0,0,0 +77951,78066,2,77872,77873,0 +77953,78144,2,77806,77809,0 +77956,77972,0,0,0,0 +77957,77972,0,0,0,0 +77958,77979,0,0,0,0 +77959,77979,0,0,0,0 +77960,78018,0,0,0,0 +77961,78021,2,77729,77730,0 +77962,78021,0,0,0,0 +77964,78031,2,77851,77852,0 +77965,78031,0,0,0,0 +77966,78106,2,77901,77902,0 +77967,78106,0,0,0,0 +77969,77978,2,77890,77891,0 +77970,77978,2,77695,77696,0 +77972,78151,2,77956,77957,0 +77973,78151,0,0,0,0 +77975,78011,0,0,0,0 +77976,78011,0,0,0,0 +77978,0,2,77969,77970,0 +77979,0,2,77958,77959,0 +77981,0,0,0,0,0 +77986,0,0,0,0,0 +77987,78054,0,0,0,0 +77988,78054,0,0,0,0 +77991,0,0,0,0,0 +77994,78039,2,77920,77941,0 +77995,78020,2,77843,77857,0 +77998,78020,0,0,0,0 +77999,78214,0,0,0,0 +78000,78214,2,77855,77856,0 +78001,78089,2,77888,77889,0 +78002,78089,0,0,0,0 +78003,78130,0,0,0,0 +78004,78130,0,0,0,0 +78005,78125,2,77739,77740,0 +78006,78125,0,0,0,0 +78008,78039,0,0,0,0 +78011,78029,2,77975,77976,0 +78012,78016,0,0,0,0 +78013,78016,0,0,0,0 +78016,78065,2,78012,78013,0 +78017,78131,2,77894,77895,0 +78018,78057,2,77917,77960,0 +78019,78057,2,77807,77836,0 +78020,0,2,77995,77998,0 +78021,0,2,77961,77962,0 +78025,78088,0,0,0,0 +78029,78131,2,78011,78043,0 +78030,78068,0,0,0,0 +78031,0,2,77964,77965,0 +78036,78065,0,0,0,0 +78037,78088,0,0,0,0 +78039,78050,2,77994,78008,0 +78040,78050,0,0,0,0 +78041,77928,0,0,0,0 +78043,78029,2,77903,77904,0 +78044,78156,0,0,0,0 +78046,78156,2,77827,77828,0 +78047,78095,0,0,0,0 +78049,78064,0,0,0,0 +78050,78079,2,78039,78040,0 +78054,78073,2,77987,77988,0 +78055,0,2,77790,77791,0 +78056,78095,0,0,0,0 +78057,78196,2,78018,78019,0 +78059,0,0,0,0,0 +78060,78196,0,0,0,0 +78061,0,0,0,0,0 +78064,78079,2,78049,78067,0 +78065,78200,2,78016,78036,0 +78066,78200,2,77950,77951,0 +78067,78064,0,0,0,0 +78068,0,2,78030,78080,0 +78072,78073,0,0,0,0 +78073,78135,2,78054,78072,0 +78074,78135,0,0,0,0 +78078,78277,0,0,0,0 +78079,78277,2,78050,78064,0 +78080,78068,0,0,0,0 +78087,78145,0,0,0,0 +78088,78145,2,78025,78037,0 +78089,78178,2,78001,78002,0 +78090,78178,0,0,0,0 +78095,78162,2,78047,78056,0 +78096,78162,0,0,0,0 +78103,0,0,0,0,0 +78105,78134,0,0,0,0 +78106,78124,2,77966,77967,0 +78107,78124,0,0,0,0 +78113,0,0,0,0,0 +78123,0,0,0,0,0 +78124,78239,2,78106,78107,0 +78125,78239,2,78005,78006,0 +78130,78148,2,78003,78004,0 +78131,78148,2,78017,78029,0 +78132,78146,0,0,0,0 +78133,78146,2,77942,77943,0 +78134,0,2,78105,78193,0 +78135,78141,2,78073,78074,0 +78138,78141,0,0,0,0 +78140,0,2,77946,77947,0 +78141,78164,2,78135,78138,0 +78144,78216,2,77945,77953,0 +78145,78216,2,78087,78088,0 +78146,78192,2,78132,78133,0 +78148,78177,2,78130,78131,0 +78149,78177,0,0,0,0 +78151,78194,2,77972,77973,0 +78156,78195,2,78044,78046,0 +78157,78195,0,0,0,0 +78158,78215,0,0,0,0 +78159,78215,0,0,0,0 +78162,78173,2,78095,78096,0 +78164,78298,2,78141,78188,0 +78165,78298,0,0,0,0 +78166,78192,0,0,0,0 +78168,78194,0,0,0,0 +78170,78173,0,0,0,0 +78173,0,2,78162,78170,0 +78177,0,2,78148,78149,0 +78178,78413,2,78089,78090,0 +78188,78164,0,0,0,0 +78189,78413,0,0,0,0 +78192,78252,2,78146,78166,0 +78193,78134,0,0,0,0 +78194,78353,2,78151,78168,0 +78195,78353,2,78156,78157,0 +78196,0,2,78057,78060,0 +78197,0,0,0,0,0 +78199,78247,0,0,0,0 +78200,78247,2,78065,78066,0 +78213,78252,0,0,0,0 +78214,78217,2,77999,78000,0 +78215,78217,2,78158,78159,0 +78216,78222,2,78144,78145,0 +78217,78222,2,78214,78215,0 +78222,0,2,78216,78217,0 +78223,78270,0,0,0,0 +78224,78270,0,0,0,0 +78231,0,0,0,0,0 +78239,0,2,78124,78125,0 +78247,78266,2,78199,78200,0 +78249,0,2,77536,77537,0 +78252,0,2,78192,78213,0 +78257,0,0,0,0,0 +78264,0,0,0,0,0 +78266,78305,2,78247,78271,0 +78269,78289,0,0,0,0 +78270,78289,2,78223,78224,0 +78271,78266,0,0,0,0 +78277,0,2,78078,78079,0 +78282,0,0,0,0,0 +78289,0,2,78269,78270,0 +78294,0,0,0,0,0 +78298,78372,2,78164,78165,0 +78301,78372,0,0,0,0 +78305,78343,2,78266,78320,0 +78318,0,0,0,0,0 +78320,78305,0,0,0,0 +78325,78385,0,0,0,0 +78326,78385,0,0,0,0 +78333,78352,0,0,0,0 +78334,78343,0,0,0,0 +78343,78352,2,78305,78334,0 +78348,0,0,0,0,0 +78351,0,0,0,0,0 +78352,78388,2,78333,78343,0 +78353,78388,2,78194,78195,0 +78360,78373,0,0,0,0 +78363,78373,0,0,0,0 +78364,0,0,0,0,0 +78372,78401,2,78298,78301,0 +78373,0,2,78360,78363,0 +78374,78401,0,0,0,0 +78375,78389,0,0,0,0 +78376,78389,0,0,0,0 +78385,78414,2,78325,78326,0 +78388,78454,2,78352,78353,0 +78389,78414,2,78375,78376,0 +78392,0,0,0,0,0 +78401,0,2,78372,78374,0 +78410,78454,0,0,0,0 +78413,78451,2,78178,78189,0 +78414,78451,2,78385,78389,0 +78421,0,0,0,0,0 +78425,0,2,78473,78499,0 +78434,0,0,0,0,0 +78438,0,0,0,0,0 +78439,0,0,0,0,0 +78442,0,0,0,0,0 +78443,0,0,0,0,0 +78448,0,2,78477,78483,0 +78451,0,2,78413,78414,0 +78454,0,2,78388,78410,0 +78473,78425,0,0,0,0 +78477,78448,2,78488,78530,0 +78483,78448,2,78484,78507,0 +78484,78483,2,78498,78570,0 +78488,78477,0,0,0,0 +78491,0,0,0,0,0 +78494,0,0,0,0,0 +78497,0,0,0,0,0 +78498,78484,0,0,0,0 +78499,78425,2,78511,78519,0 +78507,78483,0,0,0,0 +78511,78499,2,78514,78630,0 +78514,78511,0,0,0,0 +78516,0,2,78525,78565,0 +78519,78499,2,78521,78598,0 +78521,78519,0,0,0,0 +78525,78516,0,0,0,0 +78528,78529,0,0,0,0 +78529,0,2,78528,78612,0 +78530,78477,0,0,0,0 +78565,78516,0,0,0,0 +78570,78484,0,0,0,0 +78598,78519,2,78608,78679,0 +78608,78598,0,0,0,0 +78612,78529,2,78646,78652,0 +78630,78511,0,0,0,0 +78646,78612,2,78709,78723,0 +78652,78612,0,0,0,0 +78677,0,0,0,0,0 +78679,78598,0,0,0,0 +78708,0,0,0,0,0 +78709,78646,0,0,0,0 +78723,78646,0,0,0,0 diff --git a/tests/data/rapid_gssha_connect_file1.csv b/tests/data/rapid_gssha_connect_file1.csv new file mode 100644 index 0000000..ce02b85 --- /dev/null +++ b/tests/data/rapid_gssha_connect_file1.csv @@ -0,0 +1,2 @@ +link_id, node_id, baseflow, rapid_rivid +599, 1, 0.0, 75224 \ No newline at end of file diff --git a/tests/data/rapid_gssha_connect_file3.csv b/tests/data/rapid_gssha_connect_file3.csv new file mode 100644 index 0000000..27bc125 --- /dev/null +++ b/tests/data/rapid_gssha_connect_file3.csv @@ -0,0 +1,4 @@ +link_id, node_id, baseflow, rapid_rivid +599, 1, 0.0, 75224 +603, 1, 0.0, 75225 +605, 1, 0.0, 75226 \ No newline at end of file diff --git a/tests/data/rapid_namelist_invalid b/tests/data/rapid_namelist_invalid new file mode 100755 index 0000000..e81217c --- /dev/null +++ b/tests/data/rapid_namelist_invalid @@ -0,0 +1,131 @@ +&NL_namelist +!******************************************************************************* +!Runtime options +!******************************************************************************* +BS_opt_Qinit =true +!.false. --> no read initial flow .true. --> read initial flow + +BS_opt_Qfinal =.false +!.false. --> no write final flow .true. --> write final flow + +BS_opt_dam =true +!.false. --> no dam model used .true. --> dam model used + +BS_opt_for =.false. +!.false. --> no forcing .true. --> forcing + +BS_opt_influence =.false. +!.false. --> no output influence .true. --> output influence + +IS_opt_routing =1 +!1 --> matrix-based Muskingum 2 --> traditional Muskingum +!3 --> Transbnd. matrix-based + +IS_opt_run =1 +!1 --> regular run 2 --> parameter optimization + +IS_opt_phi =1 +!1 --> phi1 2 --> phi2 + +!******************************************************************************* +!Temporal information +!******************************************************************************* +ZS_TauM =2678400 +!3600*24*31=2678400 +ZS_dtM =10800 +!3600*3=10800 + +ZS_TauO =0 +!3600*24*366=31622400 +ZS_dtO =86400 +!3600*24 =86400 + +ZS_TauR =10800 +!3600*3=10800 +ZS_dtR =900 +!60*15=900 + +ZS_dtF =0 +!3600*24=86400 + +!******************************************************************************* +!Domain in which input data is available +!******************************************************************************* +IS_riv_tot =67313 +rapid_connect_file ='../../rapid/input/nfie_texas_gulf_region/rapid_connect.csv' +IS_max_up =4 +Vlat_file = '../../rapid/input/nfie_texas_gulf_region/m3_riv_bas_erai_t255_3.nc' +IS_riv_bas =67313 +riv_bas_id_file ='../../rapid/input/nfie_texas_gulf_region/riv_bas_id_huc_2_12.csv' + +!******************************************************************************* +!Initial instantaneous flow file +!******************************************************************************* +Qinit_file ='' + +!******************************************************************************* +!Final instantaneous flow file +!******************************************************************************* +Qfinal_file ='' + +!******************************************************************************* +!Available dam data +!******************************************************************************* +IS_dam_tot =0 +dam_tot_id_file ='' + +!******************************************************************************* +!Dam data used +!******************************************************************************* +IS_dam_use =0 +dam_use_id_file ='' + +!******************************************************************************* +!Available forcing data +!******************************************************************************* +IS_for_tot =0 +for_tot_id_file ='' +Qfor_file ='' + +!******************************************************************************* +!Forcing data used as model runs +!******************************************************************************* +IS_for_use =0 +for_use_id_file ='' + +!******************************************************************************* +!File where max (min) of absolute values of b (QoutR) are stored +!******************************************************************************* +babsmax_file ='' +QoutRabsmin_file ='' +QoutRabsmax_file ='' + +!******************************************************************************* +!Regular model run +!******************************************************************************* +k_file ='../../rapid/input/nfie_texas_gulf_region/k.csv' +x_file ='../../rapid/input/nfie_texas_gulf_region/x.csv' +Qout_file = '../../rapid/output/nfie_texas_gulf_region/Qout_texas.nc' +!------------------------------------------------------------------------------ +!Routing parameters +!------------------------------------------------------------------------------ +kfac_file ='' +xfac_file ='' +ZS_knorm_init =0.3 +ZS_xnorm_init =3 +!------------------------------------------------------------------------------ +!Gage observations +!------------------------------------------------------------------------------ +IS_obs_tot =0 +obs_tot_id_file ='' +Qobs_file ='' +Qobsbarrec_file ='' +IS_obs_use =0 +obs_use_id_file ='' +IS_strt_opt =0 +!1461*8+1=11689, 1461 full days pass, starts on first 3-hrly time step of 1462 + +!******************************************************************************* +!End name list +!******************************************************************************* +/ diff --git a/tests/data/rapid_namelist_valid b/tests/data/rapid_namelist_valid new file mode 100755 index 0000000..cf33796 --- /dev/null +++ b/tests/data/rapid_namelist_valid @@ -0,0 +1,131 @@ +&NL_namelist +!******************************************************************************* +!Runtime options +!******************************************************************************* +BS_opt_Qinit =.false. +!.false. --> no read initial flow .true. --> read initial flow + +BS_opt_Qfinal =.false. +!.false. --> no write final flow .true. --> write final flow + +BS_opt_dam =.false. +!.false. --> no dam model used .true. --> dam model used + +BS_opt_for =.false. +!.false. --> no forcing .true. --> forcing + +BS_opt_influence =.false. +!.false. --> no output influence .true. --> output influence + +IS_opt_routing =1 +!1 --> matrix-based Muskingum 2 --> traditional Muskingum +!3 --> Transbnd. matrix-based + +IS_opt_run =1 +!1 --> regular run 2 --> parameter optimization + +IS_opt_phi =1 +!1 --> phi1 2 --> phi2 + +!******************************************************************************* +!Temporal information +!******************************************************************************* +ZS_TauM =2678400 +!3600*24*31=2678400 +ZS_dtM =10800 +!3600*3=10800 + +ZS_TauO =0 +!3600*24*366=31622400 +ZS_dtO =86400 +!3600*24 =86400 + +ZS_TauR =10800 +!3600*3=10800 +ZS_dtR =900 +!60*15=900 + +ZS_dtF =0 +!3600*24=86400 + +!******************************************************************************* +!Domain in which input data is available +!******************************************************************************* +IS_riv_tot =67313 +rapid_connect_file ='../../rapid/input/nfie_texas_gulf_region/rapid_connect.csv' +IS_max_up =4 +Vlat_file = '../../rapid/input/nfie_texas_gulf_region/m3_riv_bas_erai_t255_3.nc' +IS_riv_bas =67313 +riv_bas_id_file ='../../rapid/input/nfie_texas_gulf_region/riv_bas_id_huc_2_12.csv' + +!******************************************************************************* +!Initial instantaneous flow file +!******************************************************************************* +Qinit_file ='' + +!******************************************************************************* +!Final instantaneous flow file +!******************************************************************************* +Qfinal_file ='' + +!******************************************************************************* +!Available dam data +!******************************************************************************* +IS_dam_tot =0 +dam_tot_id_file ='' + +!******************************************************************************* +!Dam data used +!******************************************************************************* +IS_dam_use =0 +dam_use_id_file ='' + +!******************************************************************************* +!Available forcing data +!******************************************************************************* +IS_for_tot =0 +for_tot_id_file ='' +Qfor_file ='' + +!******************************************************************************* +!Forcing data used as model runs +!******************************************************************************* +IS_for_use =0 +for_use_id_file ='' + +!******************************************************************************* +!File where max (min) of absolute values of b (QoutR) are stored +!******************************************************************************* +babsmax_file ='' +QoutRabsmin_file ='' +QoutRabsmax_file ='' + +!******************************************************************************* +!Regular model run +!******************************************************************************* +k_file ='../../rapid/input/nfie_texas_gulf_region/k.csv' +x_file ='../../rapid/input/nfie_texas_gulf_region/x.csv' +Qout_file = '../../rapid/output/nfie_texas_gulf_region/Qout_texas.nc' +!------------------------------------------------------------------------------ +!Routing parameters +!------------------------------------------------------------------------------ +kfac_file ='' +xfac_file ='' +ZS_knorm_init =0.3 +ZS_xnorm_init =3 +!------------------------------------------------------------------------------ +!Gage observations +!------------------------------------------------------------------------------ +IS_obs_tot =0 +obs_tot_id_file ='' +Qobs_file ='' +Qobsbarrec_file ='' +IS_obs_use =0 +obs_use_id_file ='' +IS_strt_opt =0 +!1461*8+1=11689, 1461 full days pass, starts on first 3-hrly time step of 1462 + +!******************************************************************************* +!End name list +!******************************************************************************* +/ diff --git a/tests/data/riv_bas_id.csv b/tests/data/riv_bas_id.csv new file mode 100644 index 0000000..54267bc --- /dev/null +++ b/tests/data/riv_bas_id.csv @@ -0,0 +1,4168 @@ +70563 +70564 +70618 +70625 +70626 +70640 +70648 +70652 +70654 +70655 +70656 +70657 +70658 +70660 +70665 +70666 +70688 +70707 +70736 +70737 +70748 +70750 +70752 +70754 +70755 +70761 +70766 +70773 +70782 +70788 +70791 +70792 +70817 +70821 +70822 +70867 +70871 +70876 +70883 +70906 +70960 +70961 +70963 +70970 +70971 +70986 +70990 +71017 +71029 +71043 +71060 +71078 +71082 +71083 +71087 +71095 +71105 +71120 +71121 +71130 +71135 +71208 +71209 +71212 +71222 +71223 +71226 +71235 +71238 +71244 +71246 +71247 +71258 +71259 +71263 +71271 +71274 +71280 +71293 +71296 +71301 +71308 +71314 +71331 +71332 +71337 +71344 +71351 +71361 +71383 +71384 +71387 +71388 +71392 +71407 +71426 +71427 +71429 +71430 +71433 +71434 +71441 +71442 +71450 +71457 +71458 +71462 +71463 +71464 +71468 +71471 +71481 +71483 +71487 +71488 +71492 +71493 +71494 +71495 +71496 +71497 +71498 +71499 +71500 +71502 +71506 +71507 +71508 +71509 +71510 +71513 +71514 +71519 +71520 +71526 +71527 +71542 +71544 +71549 +71550 +71559 +71560 +71561 +71564 +71565 +71566 +71571 +71572 +71573 +71574 +71580 +71585 +71588 +71595 +71596 +71597 +71600 +71601 +71602 +71603 +71611 +71612 +71613 +71615 +71617 +71618 +71619 +71620 +71622 +71623 +71624 +71625 +71632 +71634 +71638 +71642 +71643 +71644 +71645 +71646 +71647 +71648 +71649 +71650 +71653 +71656 +71660 +71664 +71665 +71666 +71667 +71668 +71670 +71684 +71685 +71686 +71690 +71692 +71699 +71700 +71701 +71706 +71707 +71716 +71717 +71718 +71719 +71720 +71724 +71728 +71731 +71733 +71734 +71738 +71745 +71746 +71748 +71749 +71750 +71751 +71752 +71754 +71757 +71759 +71765 +71766 +71768 +71769 +71772 +71773 +71779 +71780 +71784 +71800 +71801 +71802 +71803 +71804 +71812 +71815 +71818 +71831 +71835 +71840 +71841 +71843 +71847 +71849 +71853 +71854 +71857 +71858 +71860 +71863 +71876 +71879 +71882 +71887 +71888 +71890 +71895 +71900 +71907 +71908 +71909 +71910 +71914 +71915 +71916 +71917 +71925 +71927 +71931 +71934 +71935 +71939 +71940 +71946 +71947 +71948 +71949 +71955 +71956 +71959 +71961 +71963 +71969 +71970 +71974 +71975 +71976 +71977 +71983 +71984 +71987 +71988 +71989 +71990 +71996 +71997 +72001 +72002 +72003 +72006 +72007 +72008 +72009 +72018 +72029 +72030 +72033 +72034 +72035 +72041 +72051 +72052 +72055 +72056 +72074 +72075 +72076 +72080 +72084 +72087 +72089 +72090 +72092 +72093 +72094 +72095 +72096 +72098 +72100 +72101 +72102 +72103 +72104 +72111 +72118 +72120 +72122 +72123 +72124 +72128 +72129 +72134 +72139 +72147 +72153 +72154 +72155 +72156 +72157 +72158 +72167 +72168 +72175 +72178 +72179 +72183 +72186 +72187 +72188 +72189 +72190 +72195 +72196 +72200 +72203 +72205 +72211 +72212 +72213 +72224 +72233 +72241 +72245 +72247 +72251 +72252 +72253 +72257 +72262 +72264 +72266 +72267 +72268 +72269 +72270 +72271 +72272 +72276 +72277 +72278 +72279 +72281 +72282 +72283 +72285 +72286 +72288 +72289 +72290 +72292 +72297 +72305 +72306 +72307 +72309 +72312 +72313 +72314 +72317 +72318 +72320 +72321 +72324 +72325 +72326 +72331 +72332 +72333 +72335 +72340 +72341 +72342 +72343 +72346 +72347 +72348 +72354 +72355 +72357 +72358 +72359 +72366 +72367 +72368 +72370 +72374 +72375 +72377 +72378 +72379 +72382 +72383 +72384 +72392 +72393 +72394 +72396 +72401 +72402 +72404 +72407 +72408 +72409 +72411 +72412 +72413 +72416 +72417 +72420 +72422 +72425 +72426 +72427 +72430 +72431 +72433 +72435 +72436 +72440 +72448 +72452 +72454 +72455 +72460 +72461 +72462 +72465 +72467 +72470 +72471 +72472 +72475 +72476 +72480 +72482 +72485 +72486 +72488 +72492 +72494 +72497 +72498 +72499 +72501 +72502 +72503 +72506 +72510 +72518 +72519 +72523 +72524 +72525 +72530 +72533 +72534 +72537 +72538 +72542 +72544 +72545 +72549 +72550 +72557 +72558 +72560 +72561 +72562 +72563 +72568 +72569 +72572 +72575 +72576 +72577 +72580 +72583 +72585 +72586 +72589 +72590 +72594 +72595 +72599 +72600 +72601 +72605 +72608 +72609 +72611 +72612 +72615 +72616 +72620 +72621 +72623 +72624 +72625 +72628 +72631 +72632 +72634 +72635 +72639 +72642 +72644 +72647 +72648 +72649 +72650 +72654 +72655 +72656 +72662 +72663 +72664 +72665 +72668 +72669 +72673 +72674 +72675 +72676 +72677 +72678 +72681 +72684 +72685 +72686 +72690 +72692 +72693 +72694 +72695 +72702 +72704 +72705 +72708 +72709 +72710 +72715 +72716 +72718 +72719 +72725 +72726 +72732 +72738 +72741 +72742 +72743 +72745 +72746 +72752 +72753 +72761 +72765 +72766 +72767 +72771 +72772 +72773 +72777 +72780 +72781 +72784 +72785 +72794 +72795 +72796 +72797 +72798 +72799 +72800 +72801 +72802 +72803 +72804 +72805 +72808 +72809 +72812 +72815 +72818 +72819 +72820 +72821 +72822 +72825 +72826 +72836 +72838 +72839 +72843 +72849 +72852 +72854 +72859 +72860 +72862 +72865 +72866 +72867 +72874 +72878 +72879 +72881 +72882 +72883 +72884 +72885 +72886 +72888 +72889 +72890 +72893 +72894 +72898 +72902 +72903 +72908 +72909 +72910 +72913 +72920 +72921 +72924 +72928 +72929 +72936 +72939 +72940 +72944 +72946 +72948 +72950 +72951 +72952 +72953 +72954 +72956 +72958 +72960 +72961 +72962 +72965 +72968 +72969 +72970 +72972 +72974 +72975 +72977 +72978 +72979 +72980 +72981 +72983 +72984 +72987 +72988 +73002 +73003 +73005 +73006 +73007 +73008 +73013 +73016 +73017 +73018 +73019 +73026 +73027 +73028 +73033 +73034 +73035 +73036 +73037 +73038 +73039 +73040 +73041 +73046 +73047 +73051 +73052 +73053 +73055 +73057 +73058 +73059 +73064 +73066 +73067 +73068 +73070 +73071 +73072 +73076 +73077 +73080 +73089 +73090 +73091 +73092 +73093 +73094 +73104 +73106 +73107 +73109 +73110 +73111 +73115 +73116 +73117 +73119 +73121 +73122 +73123 +73124 +73128 +73129 +73130 +73131 +73134 +73135 +73136 +73140 +73141 +73142 +73145 +73147 +73148 +73149 +73154 +73155 +73156 +73157 +73163 +73164 +73168 +73169 +73170 +73178 +73179 +73182 +73183 +73184 +73187 +73194 +73195 +73198 +73199 +73200 +73201 +73205 +73206 +73207 +73208 +73215 +73216 +73217 +73218 +73219 +73221 +73222 +73223 +73226 +73228 +73229 +73232 +73233 +73237 +73238 +73239 +73240 +73242 +73243 +73244 +73245 +73246 +73247 +73248 +73249 +73250 +73251 +73252 +73256 +73258 +73261 +73264 +73265 +73266 +73268 +73269 +73277 +73281 +73282 +73283 +73284 +73285 +73292 +73295 +73296 +73298 +73300 +73302 +73303 +73304 +73305 +73306 +73308 +73311 +73312 +73315 +73316 +73317 +73318 +73319 +73321 +73323 +73324 +73326 +73327 +73329 +73330 +73335 +73336 +73337 +73338 +73339 +73340 +73342 +73343 +73346 +73347 +73348 +73351 +73352 +73353 +73355 +73362 +73363 +73364 +73367 +73368 +73375 +73376 +73377 +73378 +73379 +73385 +73386 +73387 +73388 +73389 +73391 +73392 +73393 +73394 +73395 +73396 +73397 +73398 +73400 +73403 +73404 +73405 +73406 +73407 +73410 +73411 +73412 +73413 +73414 +73415 +73416 +73420 +73421 +73422 +73423 +73424 +73427 +73428 +73429 +73431 +73432 +73434 +73436 +73437 +73439 +73443 +73444 +73445 +73446 +73448 +73452 +73456 +73457 +73463 +73464 +73467 +73469 +73470 +73471 +73473 +73476 +73477 +73478 +73479 +73482 +73483 +73484 +73485 +73486 +73487 +73490 +73491 +73496 +73501 +73502 +73508 +73509 +73514 +73515 +73521 +73522 +73523 +73524 +73525 +73526 +73529 +73531 +73532 +73534 +73535 +73538 +73540 +73545 +73546 +73554 +73555 +73556 +73564 +73567 +73568 +73569 +73570 +73571 +73572 +73573 +73575 +73576 +73577 +73580 +73583 +73584 +73585 +73586 +73587 +73588 +73589 +73590 +73592 +73593 +73596 +73597 +73599 +73600 +73601 +73602 +73605 +73608 +73609 +73614 +73615 +73616 +73618 +73619 +73620 +73621 +73622 +73623 +73624 +73625 +73626 +73627 +73628 +73629 +73630 +73633 +73634 +73635 +73636 +73637 +73640 +73641 +73642 +73643 +73644 +73647 +73649 +73650 +73651 +73652 +73654 +73655 +73656 +73657 +73659 +73660 +73664 +73665 +73666 +73669 +73675 +73679 +73681 +73682 +73683 +73684 +73685 +73687 +73688 +73692 +73693 +73694 +73695 +73696 +73697 +73698 +73700 +73701 +73702 +73703 +73704 +73712 +73713 +73714 +73715 +73719 +73720 +73721 +73723 +73724 +73726 +73730 +73731 +73734 +73736 +73737 +73738 +73739 +73740 +73741 +73742 +73746 +73751 +73752 +73753 +73754 +73755 +73756 +73757 +73758 +73760 +73761 +73762 +73770 +73771 +73774 +73775 +73776 +73777 +73778 +73779 +73782 +73784 +73785 +73787 +73788 +73790 +73791 +73794 +73795 +73796 +73799 +73800 +73801 +73802 +73803 +73805 +73806 +73807 +73813 +73814 +73815 +73818 +73819 +73822 +73823 +73824 +73825 +73826 +73827 +73828 +73829 +73830 +73831 +73832 +73835 +73836 +73837 +73838 +73839 +73840 +73842 +73843 +73845 +73846 +73847 +73848 +73853 +73855 +73856 +73857 +73858 +73859 +73860 +73861 +73862 +73864 +73866 +73868 +73869 +73870 +73871 +73872 +73875 +73876 +73877 +73880 +73881 +73882 +73885 +73886 +73887 +73888 +73889 +73894 +73895 +73901 +73902 +73903 +73904 +73905 +73909 +73910 +73913 +73917 +73918 +73919 +73920 +73922 +73923 +73924 +73925 +73927 +73928 +73929 +73931 +73932 +73933 +73936 +73937 +73938 +73940 +73942 +73943 +73944 +73945 +73948 +73949 +73954 +73955 +73958 +73959 +73961 +73962 +73963 +73964 +73965 +73966 +73967 +73968 +73969 +73970 +73971 +73972 +73973 +73976 +73977 +73978 +73979 +73980 +73981 +73983 +73986 +73990 +73991 +73994 +73995 +73996 +73999 +74000 +74001 +74002 +74003 +74004 +74008 +74009 +74015 +74016 +74018 +74021 +74022 +74025 +74026 +74027 +74028 +74029 +74030 +74031 +74035 +74036 +74037 +74042 +74043 +74044 +74047 +74050 +74051 +74052 +74053 +74054 +74055 +74056 +74057 +74059 +74060 +74061 +74062 +74063 +74065 +74066 +74067 +74070 +74071 +74072 +74073 +74074 +74075 +74076 +74077 +74078 +74079 +74080 +74081 +74082 +74083 +74084 +74086 +74087 +74088 +74090 +74091 +74092 +74093 +74094 +74095 +74097 +74098 +74099 +74100 +74102 +74103 +74104 +74105 +74106 +74107 +74108 +74112 +74114 +74115 +74118 +74121 +74124 +74125 +74126 +74127 +74128 +74129 +74130 +74131 +74133 +74134 +74135 +74136 +74137 +74138 +74139 +74140 +74141 +74144 +74145 +74146 +74147 +74148 +74149 +74150 +74151 +74152 +74153 +74154 +74155 +74157 +74158 +74159 +74163 +74168 +74169 +74170 +74171 +74172 +74173 +74174 +74175 +74176 +74177 +74178 +74181 +74182 +74183 +74185 +74186 +74187 +74189 +74195 +74196 +74197 +74198 +74199 +74200 +74201 +74202 +74203 +74204 +74206 +74207 +74208 +74209 +74210 +74211 +74212 +74213 +74215 +74216 +74217 +74218 +74219 +74220 +74221 +74222 +74223 +74224 +74225 +74226 +74228 +74229 +74230 +74231 +74232 +74233 +74235 +74236 +74237 +74238 +74239 +74240 +74243 +74244 +74245 +74247 +74248 +74250 +74251 +74252 +74253 +74254 +74255 +74256 +74257 +74258 +74259 +74262 +74263 +74264 +74265 +74266 +74267 +74268 +74269 +74270 +74271 +74272 +74273 +74276 +74277 +74278 +74279 +74280 +74281 +74285 +74286 +74287 +74288 +74291 +74292 +74294 +74295 +74296 +74297 +74298 +74299 +74300 +74301 +74306 +74307 +74308 +74311 +74312 +74313 +74316 +74317 +74321 +74323 +74325 +74326 +74327 +74328 +74329 +74330 +74332 +74333 +74335 +74336 +74337 +74338 +74339 +74340 +74341 +74342 +74343 +74344 +74345 +74346 +74347 +74348 +74351 +74352 +74353 +74354 +74357 +74360 +74361 +74362 +74363 +74364 +74365 +74366 +74367 +74368 +74369 +74370 +74372 +74373 +74374 +74375 +74376 +74377 +74378 +74379 +74380 +74381 +74386 +74387 +74388 +74391 +74392 +74393 +74394 +74395 +74396 +74397 +74398 +74399 +74401 +74409 +74410 +74411 +74412 +74413 +74414 +74415 +74416 +74417 +74418 +74419 +74420 +74421 +74422 +74425 +74426 +74427 +74431 +74432 +74433 +74434 +74436 +74437 +74439 +74440 +74441 +74443 +74444 +74445 +74446 +74447 +74448 +74449 +74453 +74454 +74456 +74457 +74458 +74459 +74462 +74465 +74466 +74467 +74468 +74469 +74470 +74471 +74472 +74473 +74474 +74476 +74478 +74480 +74482 +74483 +74484 +74485 +74488 +74489 +74490 +74491 +74495 +74496 +74497 +74503 +74504 +74505 +74509 +74510 +74515 +74516 +74518 +74519 +74520 +74521 +74522 +74523 +74524 +74525 +74526 +74527 +74528 +74530 +74531 +74532 +74534 +74537 +74538 +74539 +74540 +74541 +74542 +74543 +74544 +74547 +74548 +74549 +74550 +74552 +74553 +74554 +74555 +74556 +74557 +74558 +74559 +74561 +74562 +74563 +74564 +74567 +74571 +74572 +74573 +74574 +74576 +74577 +74578 +74579 +74580 +74581 +74582 +74583 +74584 +74585 +74586 +74587 +74591 +74592 +74593 +74594 +74597 +74599 +74601 +74603 +74604 +74605 +74606 +74607 +74608 +74610 +74611 +74612 +74613 +74614 +74615 +74616 +74617 +74618 +74619 +74620 +74622 +74623 +74624 +74625 +74626 +74627 +74628 +74629 +74630 +74631 +74632 +74633 +74636 +74637 +74638 +74639 +74640 +74641 +74642 +74643 +74644 +74645 +74646 +74647 +74648 +74649 +74650 +74653 +74654 +74656 +74657 +74658 +74659 +74660 +74661 +74662 +74663 +74664 +74665 +74666 +74667 +74669 +74670 +74671 +74672 +74673 +74674 +74675 +74676 +74677 +74679 +74680 +74684 +74685 +74686 +74687 +74688 +74689 +74690 +74691 +74693 +74694 +74695 +74696 +74700 +74701 +74706 +74707 +74710 +74711 +74712 +74713 +74716 +74717 +74718 +74719 +74720 +74721 +74722 +74723 +74724 +74728 +74729 +74730 +74732 +74733 +74734 +74736 +74738 +74739 +74741 +74742 +74745 +74746 +74747 +74748 +74750 +74751 +74752 +74753 +74755 +74756 +74757 +74760 +74763 +74764 +74768 +74769 +74770 +74771 +74772 +74773 +74774 +74775 +74777 +74779 +74780 +74781 +74782 +74786 +74787 +74788 +74789 +74790 +74791 +74792 +74795 +74800 +74801 +74802 +74803 +74805 +74806 +74807 +74813 +74815 +74816 +74817 +74819 +74820 +74821 +74822 +74823 +74824 +74825 +74826 +74829 +74830 +74833 +74835 +74836 +74838 +74839 +74842 +74843 +74844 +74845 +74847 +74848 +74849 +74850 +74851 +74856 +74857 +74858 +74859 +74860 +74861 +74862 +74863 +74864 +74865 +74866 +74867 +74870 +74871 +74872 +74873 +74874 +74875 +74876 +74879 +74880 +74882 +74883 +74884 +74886 +74887 +74888 +74889 +74890 +74891 +74892 +74893 +74894 +74895 +74896 +74899 +74900 +74901 +74902 +74905 +74907 +74910 +74911 +74912 +74913 +74915 +74916 +74920 +74921 +74922 +74923 +74925 +74926 +74927 +74928 +74929 +74930 +74931 +74932 +74934 +74935 +74936 +74937 +74940 +74941 +74942 +74943 +74944 +74945 +74946 +74947 +74948 +74949 +74950 +74952 +74953 +74954 +74956 +74957 +74958 +74959 +74960 +74961 +74962 +74963 +74967 +74969 +74970 +74971 +74972 +74973 +74974 +74975 +74976 +74981 +74983 +74984 +74985 +74986 +74987 +74991 +74992 +74993 +74994 +74996 +74997 +74998 +74999 +75000 +75001 +75002 +75004 +75007 +75008 +75009 +75011 +75012 +75014 +75015 +75016 +75017 +75018 +75019 +75022 +75023 +75024 +75027 +75028 +75029 +75030 +75031 +75032 +75033 +75034 +75036 +75037 +75038 +75040 +75041 +75042 +75043 +75044 +75045 +75046 +75047 +75048 +75049 +75050 +75051 +75052 +75054 +75056 +75057 +75058 +75059 +75060 +75061 +75062 +75063 +75064 +75065 +75066 +75067 +75068 +75070 +75071 +75072 +75073 +75077 +75078 +75079 +75080 +75081 +75082 +75083 +75084 +75085 +75089 +75090 +75091 +75092 +75093 +75094 +75096 +75097 +75098 +75099 +75100 +75101 +75102 +75104 +75105 +75106 +75107 +75110 +75116 +75117 +75118 +75121 +75122 +75123 +75125 +75126 +75127 +75131 +75132 +75133 +75134 +75136 +75137 +75138 +75139 +75143 +75144 +75145 +75146 +75149 +75150 +75151 +75153 +75155 +75156 +75159 +75163 +75167 +75168 +75169 +75170 +75171 +75172 +75174 +75175 +75178 +75179 +75180 +75181 +75182 +75183 +75184 +75185 +75186 +75187 +75188 +75189 +75190 +75191 +75192 +75193 +75194 +75195 +75197 +75198 +75199 +75200 +75201 +75202 +75203 +75204 +75205 +75206 +75208 +75209 +75210 +75211 +75212 +75213 +75216 +75218 +75219 +75220 +75221 +75222 +75223 +75224 +75225 +75226 +75227 +75228 +75229 +75232 +75233 +75234 +75235 +75236 +75237 +75238 +75239 +75240 +75241 +75242 +75243 +75244 +75245 +75246 +75247 +75248 +75249 +75250 +75251 +75252 +75254 +75255 +75256 +75259 +75260 +75261 +75262 +75263 +75264 +75265 +75266 +75268 +75269 +75270 +75271 +75272 +75273 +75274 +75275 +75276 +75277 +75278 +75279 +75280 +75282 +75284 +75285 +75286 +75287 +75289 +75292 +75293 +75296 +75297 +75298 +75299 +75301 +75302 +75303 +75304 +75305 +75306 +75307 +75308 +75309 +75310 +75311 +75313 +75314 +75315 +75316 +75317 +75318 +75319 +75322 +75323 +75325 +75326 +75327 +75329 +75330 +75331 +75332 +75333 +75334 +75335 +75337 +75338 +75340 +75341 +75342 +75343 +75345 +75346 +75348 +75351 +75352 +75353 +75354 +75356 +75357 +75358 +75359 +75360 +75361 +75363 +75364 +75365 +75366 +75368 +75370 +75371 +75372 +75375 +75376 +75379 +75380 +75381 +75382 +75384 +75385 +75386 +75387 +75389 +75390 +75391 +75392 +75393 +75394 +75395 +75396 +75397 +75398 +75399 +75400 +75401 +75402 +75403 +75404 +75405 +75406 +75407 +75408 +75409 +75412 +75413 +75414 +75416 +75417 +75418 +75419 +75420 +75421 +75422 +75423 +75424 +75425 +75426 +75427 +75428 +75429 +75430 +75431 +75432 +75433 +75434 +75437 +75438 +75439 +75442 +75443 +75444 +75445 +75448 +75449 +75450 +75451 +75452 +75455 +75456 +75457 +75458 +75459 +75460 +75461 +75462 +75463 +75464 +75465 +75466 +75467 +75468 +75469 +75470 +75471 +75472 +75473 +75474 +75477 +75481 +75482 +75483 +75484 +75485 +75487 +75488 +75489 +75490 +75492 +75493 +75494 +75496 +75497 +75498 +75499 +75500 +75501 +75502 +75503 +75506 +75507 +75509 +75512 +75513 +75514 +75516 +75517 +75518 +75519 +75520 +75521 +75522 +75523 +75525 +75526 +75527 +75528 +75529 +75530 +75531 +75532 +75533 +75535 +75538 +75539 +75540 +75541 +75542 +75543 +75544 +75545 +75548 +75549 +75550 +75551 +75553 +75554 +75556 +75558 +75560 +75561 +75562 +75564 +75565 +75566 +75567 +75568 +75569 +75572 +75573 +75574 +75575 +75577 +75578 +75579 +75580 +75581 +75582 +75583 +75584 +75586 +75587 +75590 +75591 +75592 +75593 +75594 +75595 +75596 +75597 +75598 +75599 +75600 +75601 +75602 +75603 +75604 +75605 +75606 +75607 +75608 +75609 +75610 +75611 +75612 +75613 +75614 +75616 +75617 +75618 +75619 +75621 +75623 +75624 +75626 +75627 +75628 +75629 +75630 +75631 +75632 +75635 +75636 +75637 +75638 +75639 +75640 +75642 +75643 +75644 +75645 +75646 +75647 +75648 +75649 +75651 +75652 +75654 +75655 +75656 +75657 +75658 +75659 +75660 +75661 +75663 +75664 +75665 +75666 +75667 +75668 +75669 +75670 +75671 +75672 +75673 +75674 +75675 +75676 +75679 +75680 +75681 +75684 +75685 +75686 +75687 +75688 +75689 +75690 +75691 +75692 +75693 +75694 +75695 +75696 +75697 +75698 +75699 +75700 +75701 +75702 +75704 +75705 +75707 +75708 +75709 +75710 +75711 +75712 +75713 +75714 +75715 +75716 +75717 +75719 +75720 +75721 +75722 +75724 +75725 +75726 +75727 +75728 +75729 +75731 +75732 +75733 +75734 +75735 +75736 +75737 +75738 +75739 +75740 +75741 +75742 +75743 +75744 +75746 +75747 +75748 +75749 +75750 +75751 +75752 +75753 +75754 +75755 +75756 +75757 +75758 +75759 +75760 +75761 +75762 +75763 +75764 +75765 +75766 +75768 +75769 +75770 +75771 +75773 +75774 +75777 +75778 +75779 +75780 +75781 +75782 +75783 +75784 +75785 +75786 +75787 +75788 +75789 +75790 +75791 +75793 +75794 +75795 +75796 +75797 +75798 +75800 +75801 +75802 +75803 +75804 +75805 +75807 +75808 +75809 +75810 +75811 +75815 +75816 +75817 +75818 +75820 +75821 +75822 +75823 +75824 +75825 +75826 +75827 +75828 +75829 +75830 +75831 +75832 +75833 +75834 +75835 +75837 +75838 +75839 +75841 +75842 +75844 +75845 +75846 +75847 +75848 +75849 +75850 +75852 +75853 +75854 +75855 +75856 +75857 +75858 +75859 +75860 +75861 +75864 +75865 +75866 +75867 +75868 +75869 +75871 +75872 +75874 +75875 +75876 +75878 +75879 +75881 +75882 +75883 +75884 +75886 +75887 +75889 +75890 +75891 +75892 +75893 +75894 +75895 +75897 +75898 +75899 +75900 +75901 +75902 +75903 +75904 +75905 +75906 +75907 +75908 +75909 +75910 +75911 +75912 +75916 +75918 +75919 +75921 +75924 +75925 +75926 +75927 +75928 +75929 +75930 +75931 +75932 +75934 +75936 +75940 +75941 +75942 +75944 +75947 +75949 +75952 +75953 +75955 +75956 +75957 +75959 +75960 +75962 +75963 +75964 +75965 +75966 +75967 +75970 +75971 +75972 +75974 +75975 +75976 +75977 +75978 +75980 +75981 +75982 +75985 +75986 +75987 +75988 +75989 +75990 +75992 +75993 +75994 +75995 +75996 +75997 +75998 +75999 +76000 +76001 +76003 +76004 +76005 +76006 +76007 +76008 +76009 +76010 +76011 +76012 +76013 +76015 +76016 +76017 +76018 +76019 +76020 +76021 +76023 +76024 +76025 +76026 +76027 +76028 +76029 +76030 +76031 +76032 +76033 +76034 +76035 +76036 +76037 +76038 +76041 +76044 +76045 +76048 +76050 +76052 +76053 +76054 +76055 +76057 +76058 +76059 +76060 +76062 +76063 +76064 +76065 +76066 +76067 +76068 +76069 +76070 +76071 +76072 +76073 +76074 +76075 +76077 +76078 +76079 +76080 +76081 +76082 +76083 +76084 +76085 +76086 +76089 +76090 +76091 +76093 +76094 +76095 +76096 +76100 +76101 +76102 +76103 +76104 +76105 +76106 +76108 +76109 +76110 +76112 +76113 +76114 +76115 +76116 +76117 +76118 +76119 +76120 +76122 +76123 +76124 +76125 +76126 +76127 +76129 +76130 +76132 +76133 +76136 +76137 +76138 +76139 +76140 +76141 +76144 +76146 +76147 +76149 +76150 +76151 +76153 +76154 +76156 +76157 +76160 +76161 +76162 +76164 +76165 +76166 +76168 +76169 +76170 +76172 +76174 +76177 +76178 +76179 +76180 +76181 +76182 +76183 +76184 +76185 +76189 +76190 +76191 +76192 +76195 +76196 +76197 +76198 +76199 +76200 +76201 +76202 +76203 +76204 +76205 +76206 +76207 +76208 +76209 +76210 +76213 +76215 +76216 +76219 +76220 +76222 +76223 +76224 +76225 +76226 +76227 +76228 +76229 +76230 +76233 +76234 +76235 +76236 +76237 +76239 +76243 +76244 +76245 +76246 +76247 +76248 +76249 +76250 +76251 +76252 +76254 +76257 +76259 +76261 +76262 +76263 +76264 +76265 +76266 +76268 +76269 +76270 +76271 +76273 +76274 +76275 +76276 +76277 +76278 +76279 +76281 +76282 +76283 +76284 +76285 +76287 +76290 +76291 +76292 +76293 +76294 +76295 +76296 +76297 +76298 +76299 +76300 +76301 +76303 +76304 +76306 +76307 +76308 +76309 +76310 +76312 +76313 +76318 +76319 +76324 +76325 +76326 +76327 +76330 +76331 +76332 +76333 +76334 +76337 +76339 +76346 +76347 +76354 +76356 +76360 +76361 +76362 +76364 +76367 +76368 +76369 +76370 +76371 +76374 +76375 +76377 +76378 +76380 +76381 +76382 +76383 +76384 +76386 +76387 +76388 +76389 +76391 +76392 +76393 +76394 +76395 +76398 +76400 +76401 +76402 +76403 +76404 +76416 +76417 +76418 +76419 +76421 +76422 +76424 +76425 +76429 +76430 +76432 +76433 +76434 +76436 +76437 +76438 +76439 +76441 +76445 +76447 +76451 +76452 +76453 +76454 +76455 +76457 +76458 +76461 +76466 +76467 +76468 +76469 +76471 +76472 +76475 +76476 +76477 +76478 +76483 +76484 +76485 +76486 +76487 +76488 +76489 +76490 +76491 +76492 +76493 +76494 +76495 +76497 +76499 +76501 +76502 +76504 +76505 +76506 +76508 +76512 +76513 +76514 +76515 +76516 +76517 +76518 +76519 +76520 +76521 +76522 +76523 +76525 +76528 +76529 +76530 +76534 +76535 +76536 +76538 +76539 +76540 +76541 +76543 +76546 +76547 +76548 +76549 +76551 +76552 +76553 +76554 +76556 +76557 +76560 +76561 +76563 +76564 +76566 +76567 +76568 +76569 +76570 +76571 +76572 +76573 +76574 +76575 +76576 +76578 +76580 +76581 +76582 +76583 +76586 +76587 +76590 +76591 +76593 +76596 +76601 +76602 +76605 +76606 +76607 +76609 +76610 +76615 +76619 +76622 +76624 +76626 +76627 +76628 +76629 +76630 +76632 +76633 +76636 +76637 +76638 +76639 +76641 +76642 +76646 +76647 +76650 +76655 +76656 +76657 +76658 +76664 +76665 +76666 +76668 +76670 +76671 +76674 +76675 +76681 +76683 +76684 +76688 +76689 +76690 +76691 +76696 +76697 +76701 +76702 +76703 +76706 +76711 +76712 +76714 +76715 +76716 +76723 +76724 +76729 +76733 +76734 +76736 +76737 +76738 +76740 +76742 +76743 +76744 +76747 +76748 +76749 +76754 +76755 +76756 +76758 +76759 +76760 +76761 +76764 +76771 +76772 +76775 +76776 +76780 +76786 +76787 +76790 +76791 +76792 +76793 +76794 +76796 +76797 +76798 +76799 +76800 +76801 +76802 +76803 +76804 +76806 +76810 +76811 +76812 +76813 +76814 +76815 +76816 +76819 +76820 +76821 +76823 +76824 +76825 +76826 +76827 +76828 +76829 +76830 +76833 +76834 +76835 +76836 +76838 +76839 +76840 +76841 +76842 +76843 +76844 +76845 +76846 +76850 +76851 +76852 +76853 +76854 +76855 +76856 +76857 +76859 +76863 +76864 +76866 +76867 +76868 +76869 +76870 +76871 +76873 +76874 +76877 +76878 +76879 +76880 +76881 +76882 +76883 +76884 +76885 +76886 +76887 +76892 +76893 +76903 +76904 +76905 +76906 +76907 +76909 +76910 +76912 +76913 +76914 +76915 +76917 +76918 +76919 +76920 +76921 +76922 +76925 +76926 +76927 +76928 +76929 +76930 +76931 +76932 +76933 +76934 +76935 +76936 +76938 +76939 +76940 +76941 +76942 +76943 +76944 +76946 +76950 +76954 +76955 +76956 +76957 +76958 +76960 +76961 +76965 +76966 +76967 +76968 +76972 +76973 +76974 +76977 +76978 +76979 +76980 +76981 +76982 +76983 +76984 +76985 +76986 +76987 +76988 +76989 +76991 +76992 +76993 +76996 +76997 +76998 +76999 +77000 +77005 +77006 +77007 +77008 +77011 +77014 +77016 +77017 +77021 +77022 +77023 +77025 +77026 +77027 +77028 +77029 +77030 +77033 +77034 +77037 +77038 +77039 +77045 +77046 +77047 +77048 +77049 +77050 +77051 +77052 +77054 +77055 +77056 +77057 +77058 +77059 +77062 +77063 +77064 +77065 +77066 +77067 +77068 +77069 +77070 +77071 +77073 +77077 +77079 +77080 +77081 +77082 +77086 +77088 +77089 +77092 +77093 +77094 +77095 +77096 +77098 +77099 +77106 +77109 +77110 +77111 +77112 +77114 +77115 +77116 +77120 +77121 +77123 +77124 +77126 +77127 +77129 +77130 +77131 +77133 +77136 +77139 +77140 +77141 +77143 +77144 +77145 +77146 +77148 +77150 +77151 +77153 +77154 +77155 +77161 +77163 +77177 +77178 +77179 +77182 +77183 +77184 +77186 +77191 +77192 +77193 +77194 +77196 +77199 +77202 +77204 +77207 +77208 +77210 +77212 +77213 +77214 +77215 +77216 +77217 +77218 +77219 +77222 +77224 +77227 +77229 +77234 +77235 +77236 +77237 +77240 +77244 +77245 +77248 +77249 +77257 +77258 +77262 +77263 +77264 +77265 +77268 +77269 +77273 +77274 +77275 +77277 +77281 +77282 +77284 +77285 +77288 +77289 +77290 +77291 +77292 +77293 +77294 +77296 +77298 +77300 +77301 +77302 +77303 +77304 +77306 +77307 +77310 +77311 +77312 +77313 +77314 +77316 +77317 +77319 +77324 +77329 +77330 +77333 +77334 +77336 +77338 +77339 +77342 +77344 +77345 +77346 +77347 +77348 +77349 +77352 +77354 +77355 +77356 +77357 +77358 +77359 +77363 +77364 +77365 +77366 +77367 +77370 +77371 +77374 +77376 +77377 +77381 +77382 +77384 +77386 +77387 +77388 +77389 +77391 +77392 +77393 +77394 +77395 +77398 +77399 +77400 +77402 +77404 +77405 +77406 +77407 +77408 +77409 +77411 +77412 +77413 +77414 +77415 +77416 +77417 +77419 +77422 +77423 +77424 +77425 +77426 +77429 +77430 +77431 +77434 +77437 +77438 +77439 +77440 +77441 +77443 +77445 +77449 +77450 +77453 +77456 +77457 +77459 +77460 +77461 +77462 +77463 +77464 +77465 +77466 +77467 +77468 +77473 +77474 +77475 +77477 +77481 +77482 +77488 +77490 +77491 +77493 +77496 +77498 +77499 +77500 +77501 +77502 +77503 +77505 +77506 +77508 +77509 +77511 +77512 +77519 +77521 +77522 +77523 +77525 +77526 +77528 +77529 +77532 +77533 +77534 +77535 +77536 +77537 +77539 +77542 +77543 +77544 +77545 +77546 +77547 +77548 +77549 +77550 +77551 +77553 +77554 +77555 +77556 +77557 +77558 +77560 +77561 +77567 +77575 +77577 +77580 +77583 +77584 +77589 +77594 +77595 +77596 +77597 +77598 +77600 +77601 +77603 +77604 +77605 +77606 +77608 +77610 +77611 +77612 +77613 +77614 +77615 +77616 +77617 +77618 +77619 +77626 +77627 +77633 +77639 +77640 +77648 +77649 +77650 +77651 +77657 +77661 +77662 +77663 +77664 +77668 +77669 +77670 +77671 +77675 +77677 +77678 +77679 +77680 +77681 +77682 +77686 +77687 +77689 +77693 +77694 +77695 +77696 +77698 +77700 +77703 +77704 +77705 +77706 +77707 +77708 +77714 +77715 +77718 +77719 +77720 +77723 +77724 +77725 +77729 +77730 +77731 +77738 +77739 +77740 +77741 +77744 +77745 +77748 +77749 +77751 +77752 +77757 +77759 +77760 +77761 +77762 +77763 +77769 +77777 +77778 +77790 +77791 +77792 +77793 +77797 +77799 +77800 +77801 +77802 +77806 +77807 +77809 +77810 +77811 +77812 +77813 +77814 +77817 +77818 +77819 +77820 +77821 +77823 +77825 +77827 +77828 +77829 +77830 +77831 +77832 +77836 +77837 +77838 +77839 +77843 +77844 +77845 +77848 +77851 +77852 +77855 +77856 +77857 +77858 +77859 +77860 +77861 +77863 +77864 +77865 +77872 +77873 +77874 +77875 +77876 +77879 +77882 +77883 +77884 +77885 +77888 +77889 +77890 +77891 +77894 +77895 +77897 +77898 +77901 +77902 +77903 +77904 +77907 +77913 +77914 +77917 +77918 +77919 +77920 +77921 +77927 +77928 +77929 +77932 +77941 +77942 +77943 +77945 +77946 +77947 +77950 +77951 +77953 +77956 +77957 +77958 +77959 +77960 +77961 +77962 +77964 +77965 +77966 +77967 +77969 +77970 +77972 +77973 +77975 +77976 +77978 +77979 +77981 +77986 +77987 +77988 +77991 +77994 +77995 +77998 +77999 +78000 +78001 +78002 +78003 +78004 +78005 +78006 +78008 +78011 +78012 +78013 +78016 +78017 +78018 +78019 +78020 +78021 +78025 +78029 +78030 +78031 +78036 +78037 +78039 +78040 +78041 +78043 +78044 +78046 +78047 +78049 +78050 +78054 +78055 +78056 +78057 +78059 +78060 +78061 +78064 +78065 +78066 +78067 +78068 +78072 +78073 +78074 +78078 +78079 +78080 +78087 +78088 +78089 +78090 +78095 +78096 +78103 +78105 +78106 +78107 +78113 +78123 +78124 +78125 +78130 +78131 +78132 +78133 +78134 +78135 +78138 +78140 +78141 +78144 +78145 +78146 +78148 +78149 +78151 +78156 +78157 +78158 +78159 +78162 +78164 +78165 +78166 +78168 +78170 +78173 +78177 +78178 +78188 +78189 +78192 +78193 +78194 +78195 +78196 +78197 +78199 +78200 +78213 +78214 +78215 +78216 +78217 +78222 +78223 +78224 +78231 +78239 +78247 +78249 +78252 +78257 +78264 +78266 +78269 +78270 +78271 +78277 +78282 +78289 +78294 +78298 +78301 +78305 +78318 +78320 +78325 +78326 +78333 +78334 +78343 +78348 +78351 +78352 +78353 +78360 +78363 +78364 +78372 +78373 +78374 +78375 +78376 +78385 +78388 +78389 +78392 +78401 +78410 +78413 +78414 +78421 +78425 +78434 +78438 +78439 +78442 +78443 +78448 +78451 +78454 +78473 +78477 +78483 +78484 +78488 +78491 +78494 +78497 +78498 +78499 +78507 +78511 +78514 +78516 +78519 +78521 +78525 +78528 +78529 +78530 +78565 +78570 +78598 +78608 +78612 +78630 +78646 +78652 +78677 +78679 +78708 +78709 +78723 diff --git a/tests/data/usgs_gage_id_rivid.csv b/tests/data/usgs_gage_id_rivid.csv new file mode 100644 index 0000000..2400dcd --- /dev/null +++ b/tests/data/usgs_gage_id_rivid.csv @@ -0,0 +1,4 @@ +RIVID,USGS_SITE_NO +16039510,6463500 +15954494,6639000 +22105603,6646000 diff --git a/tests/data/x.csv b/tests/data/x.csv new file mode 100644 index 0000000..11fef20 --- /dev/null +++ b/tests/data/x.csv @@ -0,0 +1,4168 @@ +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 +0.30000000000000004 diff --git a/tests/output/.gitignore b/tests/output/.gitignore new file mode 100644 index 0000000..1cfa412 --- /dev/null +++ b/tests/output/.gitignore @@ -0,0 +1,4 @@ +#ignore all +* +#skip this file +!.gitignore diff --git a/tests/test_gis.py b/tests/test_gis.py new file mode 100644 index 0000000..21c6711 --- /dev/null +++ b/tests/test_gis.py @@ -0,0 +1,723 @@ +# -*- coding: utf-8 -*- +## +## test_gis.py +## RAPIDpy +## +## Created by Alan D. Snow. +## Copyright © 2016 Alan D Snow. All rights reserved. +## + +from glob import glob +from numpy.testing import assert_almost_equal +from numpy import array +import os +from osgeo import ogr +import pytest + +#local import +from RAPIDpy.gis.weight import CreateWeightTableECMWF, CreateWeightTableLDAS +from RAPIDpy.gis.workflow import CreateAllStaticECMWFRAPIDFiles +from RAPIDpy.gis.network import CreateNetworkConnectivityNHDPlus +from RAPIDpy.gis.muskingum import CreateMuskingumKfacFile, CreateMuskingumXFileFromDranageLine +from RAPIDpy.gis.taudem import TauDEM +from RAPIDpy.helper_functions import (compare_csv_decimal_files, + remove_files) +#GLOBAL VARIABLES +MAIN_TESTS_FOLDER = os.path.dirname(os.path.abspath(__file__)) +COMPARE_DATA_PATH = os.path.join(MAIN_TESTS_FOLDER, 'compare', 'gis') +GIS_INPUT_DATA_PATH = os.path.join(MAIN_TESTS_FOLDER, 'data', 'gis') +RAPID_INPUT_DATA_PATH = os.path.join(MAIN_TESTS_FOLDER, 'input') +OUTPUT_DATA_PATH = os.path.join(MAIN_TESTS_FOLDER, 'output') +LSM_INPUT_DATA_PATH = os.path.join(MAIN_TESTS_FOLDER, 'data','lsm_grids') +TAUDEM_EXE_PATH = os.path.join(MAIN_TESTS_FOLDER, + "..", "..", "TauDEM", "src") + + +#------------------------------------------------------------------------------ +# MAIN TEST SCRIPTS +#------------------------------------------------------------------------------ +def test_gen_static_rapid_input(): + """ + Checks generating static RAPID input + """ + print("TEST 1: TEST GENERATE STATIC RAPID INPUT DATA") + CreateAllStaticECMWFRAPIDFiles(in_drainage_line=os.path.join(GIS_INPUT_DATA_PATH, 'flowline.shp'), + river_id="COMID", + length_id="LENGTHKM", + slope_id="Slope", + next_down_id="NextDownID", + in_catchment=os.path.join(GIS_INPUT_DATA_PATH, 'catchment.shp'), + catchment_river_id="FEATUREID", + rapid_output_folder=OUTPUT_DATA_PATH, + kfac_length_units="km", + ) + + #CHECK OUTPUT + #comid_lat_lon_z + generated_comid_lat_lon_z_file = os.path.join(OUTPUT_DATA_PATH, + "comid_lat_lon_z.csv") + generated_comid_lat_lon_z_file_solution = os.path.join(COMPARE_DATA_PATH, "x-x", + "comid_lat_lon_z.csv") + assert (compare_csv_decimal_files(generated_comid_lat_lon_z_file, + generated_comid_lat_lon_z_file_solution)) + + #rapid_connect + generated_rapid_connect_file = os.path.join(OUTPUT_DATA_PATH, + "rapid_connect.csv") + generated_rapid_connect_file_solution = os.path.join(COMPARE_DATA_PATH, "x-x", + "rapid_connect.csv") + assert (compare_csv_decimal_files(generated_rapid_connect_file, + generated_rapid_connect_file_solution)) + + #riv_bas_id + generated_riv_bas_id_file = os.path.join(OUTPUT_DATA_PATH, + "riv_bas_id.csv") + generated_riv_bas_id_file_solution = os.path.join(COMPARE_DATA_PATH, "x-x", + "riv_bas_id.csv") + assert (compare_csv_decimal_files(generated_riv_bas_id_file, + generated_riv_bas_id_file_solution)) + + #kfac + generated_kfac_file = os.path.join(OUTPUT_DATA_PATH, + "kfac.csv") + generated_kfac_file_solution = os.path.join(COMPARE_DATA_PATH, "x-x", + "kfac.csv") + assert (compare_csv_decimal_files(generated_kfac_file, + generated_kfac_file_solution)) + + #k + generated_k_file = os.path.join(OUTPUT_DATA_PATH, + "k.csv") + generated_k_file_solution = os.path.join(COMPARE_DATA_PATH, "x-x", + "k.csv") + assert (compare_csv_decimal_files(generated_k_file, + generated_k_file_solution)) + + #x + generated_x_file = os.path.join(OUTPUT_DATA_PATH, + "x.csv") + generated_x_file_solution = os.path.join(COMPARE_DATA_PATH, "x-x", + "x.csv") + assert (compare_csv_decimal_files(generated_x_file, + generated_x_file_solution)) + + #weight_ecmwf_t1279 + generated_weight_ecmwf_t1279_file = os.path.join(OUTPUT_DATA_PATH, + "weight_ecmwf_t1279.csv") + generated_weight_ecmwf_t1279_file_solution = os.path.join(COMPARE_DATA_PATH, "x-x", + "weight_ecmwf_t1279.csv") + assert (compare_csv_decimal_files(generated_weight_ecmwf_t1279_file, + generated_weight_ecmwf_t1279_file_solution)) + + #weight_ecmwf_tco369 + generated_weight_ecmwf_tco639_file = os.path.join(OUTPUT_DATA_PATH, + "weight_ecmwf_tco639.csv") + generated_weight_ecmwf_tco639_file_solution = os.path.join(COMPARE_DATA_PATH, "x-x", + "weight_ecmwf_tco639.csv") + assert (compare_csv_decimal_files(generated_weight_ecmwf_tco639_file, + generated_weight_ecmwf_tco639_file_solution)) + + #weight_era_t511 + generated_weight_era_t511_file = os.path.join(OUTPUT_DATA_PATH, + "weight_era_t511.csv") + generated_weight_era_t511_file_solution = os.path.join(COMPARE_DATA_PATH, "x-x", + "weight_era_t511.csv") + assert (compare_csv_decimal_files(generated_weight_era_t511_file, + generated_weight_era_t511_file_solution)) + + remove_files(generated_comid_lat_lon_z_file, + generated_rapid_connect_file, + generated_riv_bas_id_file, + generated_kfac_file, + generated_k_file, + generated_x_file, + generated_weight_ecmwf_t1279_file, + generated_weight_ecmwf_tco639_file, + generated_weight_era_t511_file) + +def test_gen_static_nhd_connect_rapid_input(): + """ + Checks generating static NHDPlus connect RAPID input + """ + print("TEST 2: TEST GENERATE STATIC NHDPlus CONNECT RAPID INPUT DATA") + generated_rapid_connect_file = os.path.join(OUTPUT_DATA_PATH, + "rapid_connect_nhd.csv") + CreateNetworkConnectivityNHDPlus(in_drainage_line=os.path.join(GIS_INPUT_DATA_PATH, 'flowline.shp'), + out_connectivity_file=generated_rapid_connect_file) + #rapid_connect + generated_rapid_connect_file_solution = os.path.join(COMPARE_DATA_PATH, "x-x", + "rapid_connect.csv") + + assert (compare_csv_decimal_files(generated_rapid_connect_file, + generated_rapid_connect_file_solution)) + + remove_files(generated_rapid_connect_file) + +def test_gen_weight_table_era20cm(): + """ + Checks generating weight table for ERA 20CM grid + """ + print("TEST 3: TEST GENERATE WEIGHT TABLE FOR ERA 20CM GRIDS") + generated_weight_table_file = os.path.join(OUTPUT_DATA_PATH, + "weight_era_t159.csv") + #rapid_connect + rapid_connect_file = os.path.join(COMPARE_DATA_PATH, "x-x", + "rapid_connect.csv") + + lsm_grid = os.path.join(LSM_INPUT_DATA_PATH, "era20cm", "era_20cm_runoff_20000129_0.nc") + CreateWeightTableECMWF(in_ecmwf_nc=lsm_grid, + in_catchment_shapefile=os.path.join(GIS_INPUT_DATA_PATH, 'catchment.shp'), + river_id="FEATUREID", + in_connectivity_file=rapid_connect_file, + out_weight_table=generated_weight_table_file) + + generated_weight_table_file_solution = os.path.join(COMPARE_DATA_PATH, "x-x", + "weight_era_t159.csv") + assert (compare_csv_decimal_files(generated_weight_table_file, + generated_weight_table_file_solution)) + + remove_files(generated_weight_table_file) + +def test_gen_weight_table_era_t255(): + """ + Checks generating weight table for ERA T255 grid + """ + print("TEST 4: TEST GENERATE WEIGHT TABLE FOR ERA T255 GRIDS") + generated_weight_table_file = os.path.join(OUTPUT_DATA_PATH, + "weight_era_t255.csv") + #rapid_connect + rapid_connect_file = os.path.join(COMPARE_DATA_PATH, "x-x", + "rapid_connect.csv") + + lsm_grid = os.path.join(LSM_INPUT_DATA_PATH, "erai3t255", "era_interim_runoff_20140820.nc") + CreateWeightTableECMWF(in_ecmwf_nc=lsm_grid, + in_catchment_shapefile=os.path.join(GIS_INPUT_DATA_PATH, 'catchment.shp'), + river_id="FEATUREID", + in_connectivity_file=rapid_connect_file, + out_weight_table=generated_weight_table_file) + + generated_weight_table_file_solution = os.path.join(COMPARE_DATA_PATH, "x-x", + "weight_era_t255.csv") + assert (compare_csv_decimal_files(generated_weight_table_file, + generated_weight_table_file_solution)) + + remove_files(generated_weight_table_file) + +def test_gen_weight_table_era_t511_24hr(): + """ + Checks generating weight table for ERA T511 24hr grid + """ + print("TEST 5: TEST GENERATE WEIGHT TABLE FOR ERA T511 24hr GRIDS") + generated_weight_table_file = os.path.join(OUTPUT_DATA_PATH, + "weight_era_t511.csv") + #rapid_connect + rapid_connect_file = os.path.join(COMPARE_DATA_PATH,"x-x", + "rapid_connect.csv") + + lsm_grid = os.path.join(LSM_INPUT_DATA_PATH, "erai24", "19990109_erai_runoff.grib.nc") + CreateWeightTableECMWF(in_ecmwf_nc=lsm_grid, + in_catchment_shapefile=os.path.join(GIS_INPUT_DATA_PATH, 'catchment.shp'), + river_id="FEATUREID", + in_connectivity_file=rapid_connect_file, + out_weight_table=generated_weight_table_file) + + generated_weight_table_file_solution = os.path.join(COMPARE_DATA_PATH, "x-x", + "weight_era_t511.csv") + assert (compare_csv_decimal_files(generated_weight_table_file, + generated_weight_table_file_solution)) + + remove_files(generated_weight_table_file) + +def test_gen_weight_table_gldas2(): + """ + Checks generating weight table for GLDAS V2 grid + """ + print("TEST 6: TEST GENERATE WEIGHT TABLE FOR GLDAS V2 GRIDS") + generated_weight_table_file = os.path.join(OUTPUT_DATA_PATH, + "weight_gldas2.csv") + #rapid_connect + rapid_connect_file = os.path.join(COMPARE_DATA_PATH, "x-x", + "rapid_connect.csv") + + lsm_grid = os.path.join(LSM_INPUT_DATA_PATH, "gldas2", "GLDAS_NOAH025_3H.A20101231.0000.020.nc4") + CreateWeightTableLDAS(in_ldas_nc=lsm_grid, + in_nc_lon_var="lon", + in_nc_lat_var="lat", + in_catchment_shapefile=os.path.join(GIS_INPUT_DATA_PATH, 'catchment.shp'), + river_id="FEATUREID", + in_connectivity_file=rapid_connect_file, + out_weight_table=generated_weight_table_file) + + generated_weight_table_file_solution = os.path.join(COMPARE_DATA_PATH, "x-x", + "weight_gldas2.csv") + assert (compare_csv_decimal_files(generated_weight_table_file, + generated_weight_table_file_solution)) + + remove_files(generated_weight_table_file) + +def test_gen_weight_table_lis(): + """ + Checks generating weight table for LIS grid + """ + print("TEST 7: TEST GENERATE WEIGHT TABLE FOR LIS GRIDS") + generated_weight_table_file = os.path.join(OUTPUT_DATA_PATH, + "weight_lis.csv") + #rapid_connect + rapid_connect_file = os.path.join(COMPARE_DATA_PATH, "u-k", + "rapid_connect.csv") + + lsm_grid = os.path.join(LSM_INPUT_DATA_PATH, "lis", "LIS_HIST_201101210000.d01.nc") + CreateWeightTableLDAS(in_ldas_nc=lsm_grid, + in_nc_lon_var="lon", + in_nc_lat_var="lat", + in_catchment_shapefile=os.path.join(GIS_INPUT_DATA_PATH, 'u-k', 'CatchmentSubset.shp'), + river_id="DrainLnID", + in_connectivity_file=rapid_connect_file, + out_weight_table=generated_weight_table_file) + + generated_weight_table_file_solution = os.path.join(COMPARE_DATA_PATH, "u-k", + "weight_lis.csv") + assert (compare_csv_decimal_files(generated_weight_table_file, + generated_weight_table_file_solution)) + + remove_files(generated_weight_table_file) + +def test_gen_weight_table_lis_no_intersect(): + """ + Checks generating weight table for LIS grid with no intersect + """ + print("TEST 8: TEST GENERATE WEIGHT TABLE FOR LIS GRIDS WITH NO INTERSECT") + generated_weight_table_file = os.path.join(OUTPUT_DATA_PATH, + "weight_lis_no_intersect.csv") + #rapid_connect + rapid_connect_file = os.path.join(GIS_INPUT_DATA_PATH, "uk-no_intersect", + "rapid_connect_45390.csv") + + lsm_grid = os.path.join(LSM_INPUT_DATA_PATH, "lis", "LIS_HIST_201101210000.d01.nc") + CreateWeightTableLDAS(in_ldas_nc=lsm_grid, + in_nc_lon_var="lon", + in_nc_lat_var="lat", + in_catchment_shapefile=os.path.join(GIS_INPUT_DATA_PATH, 'uk-no_intersect', 'Catchment_thames_drainID45390.shp'), + river_id="DrainLnID", + in_connectivity_file=rapid_connect_file, + out_weight_table=generated_weight_table_file) + + generated_weight_table_file_solution = os.path.join(COMPARE_DATA_PATH, "uk-no_intersect", + "weight_lis_no_intersect.csv") + assert (compare_csv_decimal_files(generated_weight_table_file, + generated_weight_table_file_solution)) + + remove_files(generated_weight_table_file) + +def test_gen_weight_table_joules(): + """ + Checks generating weight table for Joules grid + """ + print("TEST 9: TEST GENERATE WEIGHT TABLE FOR Joules GRIDS") + generated_weight_table_file = os.path.join(OUTPUT_DATA_PATH, + "weight_joules.csv") + #rapid_connect + rapid_connect_file = os.path.join(COMPARE_DATA_PATH, "u-k", + "rapid_connect.csv") + + lsm_grid = os.path.join(LSM_INPUT_DATA_PATH, "joules", "ukv_test.runoff.20080803_00.nc") + CreateWeightTableLDAS(in_ldas_nc=lsm_grid, + in_nc_lon_var="east_west", + in_nc_lat_var="north_south", + in_catchment_shapefile=os.path.join(GIS_INPUT_DATA_PATH, 'u-k', 'CatchmentSubset.shp'), + river_id="DrainLnID", + in_connectivity_file=rapid_connect_file, + out_weight_table=generated_weight_table_file) + + generated_weight_table_file_solution = os.path.join(COMPARE_DATA_PATH, "u-k", + "weight_joules.csv") + assert (compare_csv_decimal_files(generated_weight_table_file, + generated_weight_table_file_solution)) + + remove_files(generated_weight_table_file) + +#============================================================================== +# def test_gen_weight_table_wrf(): +# """ +# Checks generating weight table for WRF grid +# """ +# print("TEST 9: TEST GENERATE WEIGHT TABLE FOR WRF GRIDS") +# generated_weight_table_file = os.path.join(OUTPUT_DATA_PATH, +# "weight_wrf.csv") +# #rapid_connect +# rapid_connect_file = os.path.join(COMPARE_DATA_PATH, "m-s", +# "rapid_connect.csv") +# +# #============================================================================== +# # drainage_line = os.path.join(GIS_INPUT_DATA_PATH, 'm-s', 'flowline_subset.shp') +# # CreateAllStaticRAPIDFiles(in_drainage_line=drainage_line, +# # river_id="COMID", +# # length_id="LENGTHKM", +# # slope_id="SLOPE", +# # next_down_id="NextDownID", +# # rapid_output_folder=os.path.join(GIS_INPUT_DATA_PATH, 'm-s') +# # ) +# #============================================================================== +# +# +# lsm_grid = os.path.join(LSM_INPUT_DATA_PATH, "wrf", "diffro_d02_20080601010000.nc") +# CreateWeightTableLDAS(in_ldas_nc=lsm_grid, +# in_nc_lon_var="XLONG", +# in_nc_lat_var="XLAT", +# in_catchment_shapefile=os.path.join(GIS_INPUT_DATA_PATH, 'm-s', 'catchment_subset.shp'), +# river_id="FEATUREID", +# in_connectivity_file=rapid_connect_file, +# out_weight_table=generated_weight_table_file) +# +# generated_weight_table_file_solution = os.path.join(COMPARE_DATA_PATH, "m-s", +# "weight_wrf.csv") +# assert (compare_csv_decimal_files(generated_weight_table_file, +# generated_weight_table_file_solution)) +# +# remove_files(generated_weight_table_file) +#============================================================================== + + +def test_extract_sub_network_taudem(): + """ + Checks extracting sub network from larger network + """ + print("TEST 10: TEST EXTRACTING SUB NETWORK FROM LARGER NETWORK") + td = TauDEM() + + subset_network_file = os.path.join(OUTPUT_DATA_PATH, "DrainageLineSubset2.shp") + #to extract a specific network + td.extractSubNetwork(network_file=os.path.join(GIS_INPUT_DATA_PATH, 'u-k', "DrainageLineSubset.shp"), + out_subset_network_file=subset_network_file, + outlet_ids=[42911], #list of outlet ids + river_id_field="HydroID", + next_down_id_field="NextDownID", + river_magnitude_field="HydroID", + safe_mode=False, + ) + + #to extract the subset watersheds using subset river network + subset_watershed_file = os.path.join(OUTPUT_DATA_PATH,"CatchmentSubset2.shp") + td.extractSubsetFromWatershed(subset_network_file=subset_network_file, + subset_network_river_id_field="HydroID", + watershed_file=os.path.join(GIS_INPUT_DATA_PATH, 'u-k', 'CatchmentSubset.shp'), + watershed_network_river_id_field="DrainLnID", + out_watershed_subset_file=subset_watershed_file) + + + #Test results + subset_network_shapefile = ogr.Open(subset_network_file) + subset_network_layer = subset_network_shapefile.GetLayer() + + ogr_watershed_shapefile = ogr.Open(subset_watershed_file) + ogr_watershed_shapefile_lyr = ogr_watershed_shapefile.GetLayer() + + number_of_network_features = subset_network_layer.GetFeatureCount() + number_of_watershed_features = ogr_watershed_shapefile_lyr.GetFeatureCount() + + #count number of features + assert (number_of_network_features==7) + assert (number_of_watershed_features==7) + + #make sure IDs correct + network_id_list = [42911,42891,42747,42748,42892,42841,42846] + for feature_idx, network_feature in enumerate(subset_network_layer): + assert (network_feature.GetField("HydroID") in network_id_list) + for feature_idx, watershed_feature in enumerate(ogr_watershed_shapefile_lyr): + assert (watershed_feature.GetField("DrainLnID") in network_id_list) + + #make sure all fields are there + + #TEST WATERSHED + subset_watershed_layer_defn = ogr_watershed_shapefile_lyr.GetLayerDefn() + num_watershed_fields = subset_watershed_layer_defn.GetFieldCount() + + watershed_field_names = ['Shape_Leng','Shape_Area','HydroID','GridID','DrainLnID'] + assert (num_watershed_fields==len(watershed_field_names)) + for i in range(num_watershed_fields): + assert (subset_watershed_layer_defn.GetFieldDefn(i).GetNameRef() in watershed_field_names) + + #TEST NETWORK + subset_network_layer_defn = subset_network_layer.GetLayerDefn() + num_network_fields = subset_network_layer_defn.GetFieldCount() + + network_field_names = ['arcid','from_node','to_node','HydroID','GridID', + 'NextDownID','SLength','Avg_Slope','LENGTHKM', + 'Shape_Leng','Musk_x','watershed','subbasin'] + + assert (num_network_fields==len(network_field_names)) + + for i in range(num_network_fields): + assert (subset_network_layer_defn.GetFieldDefn(i).GetNameRef() in network_field_names) + + #cleanup + remove_files(*glob(os.path.join(OUTPUT_DATA_PATH,"DrainageLineSubset2.*"))) + remove_files(*glob(os.path.join(OUTPUT_DATA_PATH,"CatchmentSubset2.*"))) + +def test_add_length_to_network_taudem(): + """ + Checks adding length to network + """ + print("TEST 11: TEST ADD LENGTH TO NETWORK") + td = TauDEM() + + subset_network_file = os.path.join(OUTPUT_DATA_PATH, "DrainageLineSubset2.shp") + #to extract a specific network + td.extractSubNetwork(network_file=os.path.join(GIS_INPUT_DATA_PATH, 'u-k', "DrainageLineSubset.shp"), + out_subset_network_file=subset_network_file, + outlet_ids=[42911], #list of outlet ids + river_id_field="HydroID", + next_down_id_field="NextDownID", + river_magnitude_field="HydroID", + safe_mode=False, + ) + + #add length m field + td.addLengthMeters(subset_network_file) + + #Test results + subset_network_shapefile = ogr.Open(subset_network_file) + subset_network_layer = subset_network_shapefile.GetLayer() + + #make sure all fields are there + subset_network_layer_defn = subset_network_layer.GetLayerDefn() + num_network_fields = subset_network_layer_defn.GetFieldCount() + + network_field_names = ['arcid','from_node','to_node','HydroID','GridID', + 'NextDownID', 'SLength', 'Avg_Slope','LENGTHKM', + 'Shape_Leng','Musk_x','watershed','subbasin', 'LENGTH_M'] + + assert (num_network_fields==len(network_field_names)) + + for i in range(num_network_fields): + assert (subset_network_layer_defn.GetFieldDefn(i).GetNameRef() in network_field_names) + + + #make sure values are OK + length_m_list = array([194.440898134, 601.443392962, 1306.53179652, 1501.27444279, + 3437.46584922, 5579.56507836, 6347.04650903]) + generated_list = [] + for network_feature in subset_network_layer: + generated_list.append(network_feature.GetField('LENGTH_M')) + + assert_almost_equal(length_m_list, array(sorted(generated_list)), decimal=2) + + #cleanup + remove_files(*glob(os.path.join(OUTPUT_DATA_PATH,"DrainageLineSubset2.*"))) + +@pytest.mark.skipif(not os.path.exists(TAUDEM_EXE_PATH), reason='Only run if TauDEM installed') +def test_generate_network_taudem(): + """ + Checks generate TauDEM network + """ + print("TEST 12: TEST GENERATE TauDEM NETWORK") + td = TauDEM(TAUDEM_EXE_PATH, use_all_processors=True) + + elevation_dem = os.path.join(GIS_INPUT_DATA_PATH, 'jamaica_dem.tif') + + td.demToStreamNetwork(OUTPUT_DATA_PATH, + elevation_dem, + threshold=1000) + + assert (os.path.exists(os.path.join(OUTPUT_DATA_PATH, 'pit_filled_elevation_grid.tif'))) + assert (os.path.exists(os.path.join(OUTPUT_DATA_PATH, 'pit_filled_elevation_grid.prj'))) + assert (os.path.exists(os.path.join(OUTPUT_DATA_PATH, 'flow_dir_grid_d8.tif'))) + assert (os.path.exists(os.path.join(OUTPUT_DATA_PATH, 'flow_dir_grid_d8.prj'))) + assert (os.path.exists(os.path.join(OUTPUT_DATA_PATH, 'contributing_area_grid_d8.tif'))) + assert (os.path.exists(os.path.join(OUTPUT_DATA_PATH, 'contributing_area_grid_d8.prj'))) + assert (os.path.exists(os.path.join(OUTPUT_DATA_PATH, 'slope_grid_d8.tif'))) + assert (os.path.exists(os.path.join(OUTPUT_DATA_PATH, 'slope_grid_d8.prj'))) + assert (os.path.exists(os.path.join(OUTPUT_DATA_PATH, 'stream_raster_grid.tif'))) + assert (os.path.exists(os.path.join(OUTPUT_DATA_PATH, 'stream_raster_grid.prj'))) + assert (os.path.exists(os.path.join(OUTPUT_DATA_PATH, 'stream_order_grid.tif'))) + assert (os.path.exists(os.path.join(OUTPUT_DATA_PATH, 'stream_order_grid.prj'))) + assert (os.path.exists(os.path.join(OUTPUT_DATA_PATH, 'network_connectivity_tree.txt'))) + assert (os.path.exists(os.path.join(OUTPUT_DATA_PATH, 'network_coordinates.txt'))) +# assert (os.path.exists(os.path.join(OUTPUT_DATA_PATH, 'stream_reach_file.shp'))) +# assert (os.path.exists(os.path.join(OUTPUT_DATA_PATH, 'stream_reach_file.shx'))) +# assert (os.path.exists(os.path.join(OUTPUT_DATA_PATH, 'stream_reach_file.dbf'))) + assert (os.path.exists(os.path.join(OUTPUT_DATA_PATH, 'stream_reach_file.prj'))) + assert (os.path.exists(os.path.join(OUTPUT_DATA_PATH, 'watershed_grid.tif'))) + assert (os.path.exists(os.path.join(OUTPUT_DATA_PATH, 'watershed_grid.prj'))) + assert (os.path.exists(os.path.join(OUTPUT_DATA_PATH, 'watershed_shapefile.shp'))) + assert (os.path.exists(os.path.join(OUTPUT_DATA_PATH, 'watershed_shapefile.shx'))) + assert (os.path.exists(os.path.join(OUTPUT_DATA_PATH, 'watershed_shapefile.dbf'))) + assert (os.path.exists(os.path.join(OUTPUT_DATA_PATH, 'watershed_shapefile.prj'))) + #cleanup + remove_files(*[f for f in glob(os.path.join(OUTPUT_DATA_PATH,"*")) if not f.endswith(".gitignore")]) + +@pytest.mark.skipif(not os.path.exists(TAUDEM_EXE_PATH), reason='Only run if TauDEM installed') +def test_generate_network_taudem_dinf(): + """ + Checks generate TauDEM network dinf + """ + print("TEST 13: TEST GENERATE TauDEM NETWORK DINF") + td = TauDEM(TAUDEM_EXE_PATH) + + elevation_dem = os.path.join(GIS_INPUT_DATA_PATH, 'jamaica_dem.tif') + + td.demToStreamNetwork(OUTPUT_DATA_PATH, + pit_filled_elevation_grid=elevation_dem, + threshold=1000, + use_dinf=True) + assert (os.path.exists(os.path.join(OUTPUT_DATA_PATH, 'flow_dir_grid_d8.tif'))) + assert (os.path.exists(os.path.join(OUTPUT_DATA_PATH, 'flow_dir_grid_d8.prj'))) + assert (os.path.exists(os.path.join(OUTPUT_DATA_PATH, 'flow_dir_grid_dinf.tif'))) + assert (os.path.exists(os.path.join(OUTPUT_DATA_PATH, 'flow_dir_grid_dinf.prj'))) + assert (os.path.exists(os.path.join(OUTPUT_DATA_PATH, 'contributing_area_grid_d8.tif'))) + assert (os.path.exists(os.path.join(OUTPUT_DATA_PATH, 'contributing_area_grid_d8.prj'))) + assert (os.path.exists(os.path.join(OUTPUT_DATA_PATH, 'contributing_area_grid_dinf.tif'))) + assert (os.path.exists(os.path.join(OUTPUT_DATA_PATH, 'contributing_area_grid_dinf.prj'))) + assert (os.path.exists(os.path.join(OUTPUT_DATA_PATH, 'slope_grid_d8.tif'))) + assert (os.path.exists(os.path.join(OUTPUT_DATA_PATH, 'slope_grid_d8.prj'))) + assert (os.path.exists(os.path.join(OUTPUT_DATA_PATH, 'slope_grid_dinf.tif'))) + assert (os.path.exists(os.path.join(OUTPUT_DATA_PATH, 'slope_grid_dinf.prj'))) + assert (os.path.exists(os.path.join(OUTPUT_DATA_PATH, 'stream_raster_grid.tif'))) + assert (os.path.exists(os.path.join(OUTPUT_DATA_PATH, 'stream_raster_grid.prj'))) + assert (os.path.exists(os.path.join(OUTPUT_DATA_PATH, 'stream_order_grid.tif'))) + assert (os.path.exists(os.path.join(OUTPUT_DATA_PATH, 'stream_order_grid.prj'))) + assert (os.path.exists(os.path.join(OUTPUT_DATA_PATH, 'network_connectivity_tree.txt'))) + assert (os.path.exists(os.path.join(OUTPUT_DATA_PATH, 'network_coordinates.txt'))) +# assert (os.path.exists(os.path.join(OUTPUT_DATA_PATH, 'stream_reach_file.shp'))) +# assert (os.path.exists(os.path.join(OUTPUT_DATA_PATH, 'stream_reach_file.shx'))) +# assert (os.path.exists(os.path.join(OUTPUT_DATA_PATH, 'stream_reach_file.dbf'))) + assert (os.path.exists(os.path.join(OUTPUT_DATA_PATH, 'stream_reach_file.prj'))) + assert (os.path.exists(os.path.join(OUTPUT_DATA_PATH, 'watershed_grid.tif'))) + assert (os.path.exists(os.path.join(OUTPUT_DATA_PATH, 'watershed_grid.prj'))) + assert (os.path.exists(os.path.join(OUTPUT_DATA_PATH, 'watershed_shapefile.shp'))) + assert (os.path.exists(os.path.join(OUTPUT_DATA_PATH, 'watershed_shapefile.shx'))) + assert (os.path.exists(os.path.join(OUTPUT_DATA_PATH, 'watershed_shapefile.dbf'))) + assert (os.path.exists(os.path.join(OUTPUT_DATA_PATH, 'watershed_shapefile.prj'))) + #cleanup + remove_files(*[f for f in glob(os.path.join(OUTPUT_DATA_PATH,"*")) if not f.endswith(".gitignore")]) + +def test_gen_muskingum_kfac2(): + """ + Checks generating Muskingum Kfac option 2 + """ + print("TEST 14: TEST GENERATE MUSKINGUM KFAC OPTION 2") + generated_kfac_file = os.path.join(OUTPUT_DATA_PATH, + "kfac2.csv") + #rapid_connect + rapid_connect_file = os.path.join(COMPARE_DATA_PATH, "x-x", + "rapid_connect.csv") + CreateMuskingumKfacFile(in_drainage_line=os.path.join(GIS_INPUT_DATA_PATH, 'flowline.shp'), + river_id="COMID", + length_id="LENGTHKM", + slope_id="Slope", + celerity=1000.0/3600.0, + formula_type=2, + in_connectivity_file=rapid_connect_file, + out_kfac_file=generated_kfac_file) + + #CHECK OUTPUT + #kfac + generated_kfac_file_solution = os.path.join(COMPARE_DATA_PATH, "x-x", + "kfac2.csv") + assert (compare_csv_decimal_files(generated_kfac_file, + generated_kfac_file_solution)) + + remove_files(generated_kfac_file) + +def test_gen_muskingum_kfac1(): + """ + Checks generating Muskingum Kfac option 1 + """ + print("TEST 14: TEST GENERATE MUSKINGUM KFAC OPTION 1") + generated_kfac_file = os.path.join(OUTPUT_DATA_PATH, + "kfac1.csv") + #rapid_connect + rapid_connect_file = os.path.join(COMPARE_DATA_PATH, "x-x", + "rapid_connect.csv") + CreateMuskingumKfacFile(in_drainage_line=os.path.join(GIS_INPUT_DATA_PATH, 'flowline.shp'), + river_id="COMID", + length_id="LENGTHKM", + slope_id="Slope", + celerity=1000.0/3600.0, + formula_type=1, + in_connectivity_file=rapid_connect_file, + out_kfac_file=generated_kfac_file) + + #CHECK OUTPUT + #kfac + generated_kfac_file_solution = os.path.join(COMPARE_DATA_PATH, "x-x", + "kfac1.csv") + assert (compare_csv_decimal_files(generated_kfac_file, + generated_kfac_file_solution)) + remove_files(generated_kfac_file) + +def test_gen_muskingum_x_drainage(): + """ + Checks generating Muskingum X from draiange line + """ + print("TEST 15: TEST GENERATE MUSKINGUM X FROM DRAINAGE LINE") + generated_x_file = os.path.join(OUTPUT_DATA_PATH, + "x_drain.csv") + + CreateMuskingumXFileFromDranageLine(in_drainage_line=os.path.join(GIS_INPUT_DATA_PATH, 'u-k', "DrainageLineSubset.shp"), + x_id="Musk_x", + out_x_file=generated_x_file) + + #CHECK OUTPUT + generated_x_file_solution = os.path.join(COMPARE_DATA_PATH, "u-k", + "x_drain.csv") + assert (compare_csv_decimal_files(generated_x_file, + generated_x_file_solution)) + remove_files(generated_x_file) + + +def test_weight_table_with_invalid_polygon(): + """ + Checks generating weight table with invalid polygon + """ + print("TEST 16: TEST GENERATE WEIGHT TABLE WITH INVALID POLYGON") + generated_weight_table_file = os.path.join(OUTPUT_DATA_PATH, + "weight_polygons.csv") + # rapid_connect + rapid_connect_file = os.path.join(COMPARE_DATA_PATH, "x-x", + "rapid_connect.csv") + + lsm_grid = os.path.join(LSM_INPUT_DATA_PATH, "gldas2", "GLDAS_NOAH025_3H.A20101231.0000.020.nc4") + CreateWeightTableLDAS(in_ldas_nc=lsm_grid, + in_nc_lon_var="lon", + in_nc_lat_var="lat", + in_catchment_shapefile=os.path.join(GIS_INPUT_DATA_PATH, 'test_catchments.shp'), + river_id="DrainLnID", + in_connectivity_file=rapid_connect_file, + out_weight_table=generated_weight_table_file) + + generated_weight_table_file_solution = os.path.join(COMPARE_DATA_PATH, "x-x", + "weight_polygons.csv") + assert (compare_csv_decimal_files(generated_weight_table_file, + generated_weight_table_file_solution)) + + remove_files(generated_weight_table_file) + + +def test_weight_table_with_area_id(): + """ + Checks generating weight table with area id + """ + print("TEST 17: TEST GENERATE WEIGHT TABLE WITH INVALID POLYGON") + generated_weight_table_file = os.path.join(OUTPUT_DATA_PATH, + "weight_area.csv") + # rapid_connect + rapid_connect_file = os.path.join(COMPARE_DATA_PATH, "x-x", + "rapid_connect.csv") + + lsm_grid = os.path.join(LSM_INPUT_DATA_PATH, "gldas2", "GLDAS_NOAH025_3H.A20101231.0000.020.nc4") + CreateWeightTableLDAS(in_ldas_nc=lsm_grid, + in_nc_lon_var="lon", + in_nc_lat_var="lat", + in_catchment_shapefile=os.path.join(GIS_INPUT_DATA_PATH, 'test_catchments.shp'), + river_id="DrainLnID", + area_id="Shape_Area", + in_connectivity_file=rapid_connect_file, + out_weight_table=generated_weight_table_file) + + generated_weight_table_file_solution = os.path.join(COMPARE_DATA_PATH, "x-x", + "weight_area.csv") + assert (compare_csv_decimal_files(generated_weight_table_file, + generated_weight_table_file_solution)) + + remove_files(generated_weight_table_file) diff --git a/tests/test_inflow.py b/tests/test_inflow.py new file mode 100644 index 0000000..2ff952e --- /dev/null +++ b/tests/test_inflow.py @@ -0,0 +1,800 @@ +# -*- coding: utf-8 -*- +# +# test_inflow.py +# RAPIDpy +# +# Created by Alan D. Snow. +# Copyright © 2016 Alan D Snow. All rights reserved. +# + +from datetime import datetime +from glob import glob +import multiprocessing +from netCDF4 import Dataset +from numpy.testing import assert_almost_equal +import numpy as np +import os +from past.builtins import xrange +import pytest +from shutil import copy, copytree, rmtree +import unittest + +# local import +from RAPIDpy.inflow import run_lsm_rapid_process +from RAPIDpy.inflow.CreateInflowFileFromERAInterimRunoff import CreateInflowFileFromERAInterimRunoff +from RAPIDpy.inflow.CreateInflowFileFromLDASRunoff import CreateInflowFileFromLDASRunoff +from RAPIDpy.inflow.CreateInflowFileFromWRFHydroRunoff import CreateInflowFileFromWRFHydroRunoff + +from RAPIDpy.helper_functions import (compare_csv_decimal_files, + remove_files) + +MAIN_TESTS_FOLDER = os.path.dirname(os.path.abspath(__file__)) +RAPID_EXE_PATH = os.path.join(MAIN_TESTS_FOLDER, + "..", "..", + "rapid", "src", "rapid") + +def compare_array_nan(a, b): + # based on https://stackoverflow.com/questions/23810370/python-numpy-comparing-arrays-with-nan + return ((a == b) | (np.isnan(a) & np.isnan(b))).all() + + +class TestRAPIDInflow(unittest.TestCase): + def setUp(self): + # define global variables + self.COMPARE_DATA_PATH = os.path.join(MAIN_TESTS_FOLDER, 'compare') + self.INFLOW_COMPARE_DATA_PATH = os.path.join(self.COMPARE_DATA_PATH, 'inflow') + self.LSM_INPUT_DATA_PATH = os.path.join(MAIN_TESTS_FOLDER, 'data','lsm_grids') + self.OUTPUT_DATA_PATH = os.path.join(MAIN_TESTS_FOLDER, 'output') + self.RAPID_DATA_PATH = os.path.join(self.OUTPUT_DATA_PATH, 'input') + + self.CYGWIN_BIN_PATH = 'C:\\cygwin64\\bin' + + def _setup_automated(self, directory_name): + """ + setup for automated method + """ + rapid_input_path = os.path.join(self.RAPID_DATA_PATH, directory_name) + rapid_output_path = os.path.join(self.OUTPUT_DATA_PATH, "output", directory_name) + try: + os.mkdir(self.RAPID_DATA_PATH) + except OSError: + pass + + try: + os.mkdir(os.path.join(self.OUTPUT_DATA_PATH, "output")) + except OSError: + pass + + try: + copytree(os.path.join(self.COMPARE_DATA_PATH, "gis", directory_name), + rapid_input_path) + except OSError: + pass + + return rapid_input_path, rapid_output_path + + def _setup_manual(self, directory_name): + """ + setup for manual method + """ + rapid_input_path, rapid_output_path = self._setup_automated(directory_name) + + try: + os.mkdir(rapid_output_path) + except OSError: + pass + + return rapid_input_path, rapid_output_path + + def _run_automatic(self, lsm_folder_name, + watershed_folder, + file_datetime_pattern=None, + file_datetime_re_pattern=None, + convert_one_hour_to_three=False, + expected_time_step=None, + single_run=False, + filter_dates=True): + """ + run for automatic method + """ + rapid_input_path, rapid_output_path = self._setup_automated(watershed_folder) + run_input_folder = None + run_output_folder = None + rapid_io_folder = self.OUTPUT_DATA_PATH + if single_run: + run_input_folder = rapid_input_path + run_output_folder = rapid_output_path + rapid_io_folder = None + + start_datetime = None + end_datetime = None + if filter_dates: + start_datetime = datetime(1980, 1, 1) + end_datetime = datetime(2014, 12, 31) + + # run main process + output_file_info = run_lsm_rapid_process( + rapid_executable_location=RAPID_EXE_PATH, + cygwin_bin_location=self.CYGWIN_BIN_PATH, + rapid_io_files_location=rapid_io_folder, + rapid_input_location=run_input_folder, + rapid_output_location=run_output_folder, + lsm_data_location=os.path.join(self.LSM_INPUT_DATA_PATH, lsm_folder_name), + simulation_start_datetime=start_datetime, + simulation_end_datetime=end_datetime, + generate_rapid_namelist_file=False, + run_rapid_simulation=False, + use_all_processors=True, + file_datetime_pattern=file_datetime_pattern, + file_datetime_re_pattern=file_datetime_re_pattern, + convert_one_hour_to_three=convert_one_hour_to_three, + expected_time_step=expected_time_step, + ) + return rapid_input_path, rapid_output_path, output_file_info + + @pytest.mark.skipif(not os.path.exists(RAPID_EXE_PATH), reason='Only run if RAPID installed') + def test_run_era_interim_inflow(self): + """ + Checks generating inflow file from ERA Interim LSM + """ + rapid_input_path, rapid_output_path = self._setup_automated("x-x") + + # run main process + output_file_info = run_lsm_rapid_process( + rapid_executable_location=RAPID_EXE_PATH, + cygwin_bin_location=self.CYGWIN_BIN_PATH, + rapid_io_files_location=self.OUTPUT_DATA_PATH, + lsm_data_location=os.path.join(self.LSM_INPUT_DATA_PATH, 'erai3'), + simulation_start_datetime=datetime(1980, 1, 1), + simulation_end_datetime=datetime(2014, 1, 31), + generate_rapid_namelist_file=False, + run_rapid_simulation=True, + generate_return_periods_file=False, + generate_seasonal_initialization_file=False, + generate_initialization_file=True, + use_all_processors=True, + ) + + # CHECK OUTPUT + # m3_riv + m3_file_name = "m3_riv_bas_erai_t511_3hr_20030121to20030122.nc" + generated_m3_file = os.path.join(rapid_output_path, m3_file_name) + generated_m3_file_solution = os.path.join(self.INFLOW_COMPARE_DATA_PATH, m3_file_name) + self._compare_m3(generated_m3_file,generated_m3_file_solution) + + # qout file + qout_file_name = "Qout_erai_t511_3hr_20030121to20030122.nc" + generated_qout_file = os.path.join(rapid_output_path, qout_file_name) + generated_qout_file_solution = os.path.join(self.INFLOW_COMPARE_DATA_PATH, qout_file_name) + d1 = Dataset(generated_qout_file) + d2 = Dataset(generated_qout_file_solution) + assert_almost_equal(d1.variables['Qout'][:], d2.variables['Qout'][:], decimal=5) + assert (d1.variables['rivid'][:] == d2.variables['rivid'][:]).all() + assert (d1.variables['time'][:] == d2.variables['time'][:]).all() + if 'lat' in d2.variables.keys(): + assert (d1.variables['lat'][:] == d2.variables['lat'][:]).all() + if 'lon' in d2.variables.keys(): + assert (d1.variables['lon'][:] == d2.variables['lon'][:]).all() + d1.close() + d2.close() + + # check output file info + assert output_file_info[0]['x-x']['m3_riv'] == generated_m3_file + assert output_file_info[0]['x-x']['qout'] == generated_qout_file + + # initialization file + qinit_file_name = "qinit_erai_t511_3hr_20030121to20030122.csv" + generated_qinit_file = os.path.join(rapid_input_path, qinit_file_name) + generated_qinit_file_solution = os.path.join(self.INFLOW_COMPARE_DATA_PATH, qinit_file_name) + + assert compare_csv_decimal_files(generated_qinit_file, generated_qinit_file_solution) + + # additional cleanup + remove_files(generated_qinit_file) + + + @pytest.mark.skipif(not os.path.exists(RAPID_EXE_PATH), reason='Only run if RAPID installed') + def test_run_era_interim_inflow_init(self): + """ + Checks generating inflow file from ERA Interim LSM + """ + rapid_input_path, rapid_output_path = self._setup_automated("x-x") + + # initialization file + qinit_file_name = "qinit_erai_t511_3hr_20030121to20030122.csv" + qinit_file = os.path.join(rapid_input_path, qinit_file_name) + copy(os.path.join(self.INFLOW_COMPARE_DATA_PATH, qinit_file_name), + qinit_file) + + # run main process + output_file_info = run_lsm_rapid_process( + rapid_executable_location=RAPID_EXE_PATH, + cygwin_bin_location=self.CYGWIN_BIN_PATH, + rapid_io_files_location=self.OUTPUT_DATA_PATH, + lsm_data_location=os.path.join(self.LSM_INPUT_DATA_PATH, 'erai3'), + generate_rapid_namelist_file=False, + run_rapid_simulation=True, + generate_initialization_file=True, + initial_flows_file=qinit_file, + use_all_processors=True, + ) + # qout file + generated_qout_file = os.path.join(rapid_output_path, "Qout_erai_t511_3hr_20030121to20030122.nc") + generated_qout_file_solution = os.path.join(self.INFLOW_COMPARE_DATA_PATH, + "Qout_erai_t511_3hr_20030121to20030122_init.nc") + + # check output file info + assert output_file_info[0]['x-x']['m3_riv'] == os.path.join(rapid_output_path, "m3_riv_bas_erai_t511_3hr_20030121to20030122.nc") + assert output_file_info[0]['x-x']['qout'] == generated_qout_file + + d1 = Dataset(generated_qout_file) + d2 = Dataset(generated_qout_file_solution) + assert_almost_equal(d1.variables['Qout'][:], d2.variables['Qout'][:], decimal=0) + assert (d1.variables['rivid'][:] == d2.variables['rivid'][:]).all() + assert (d1.variables['time'][:] == d2.variables['time'][:]).all() + if 'lat' in d2.variables.keys(): + assert (d1.variables['lat'][:] == d2.variables['lat'][:]).all() + if 'lon' in d2.variables.keys(): + assert (d1.variables['lon'][:] == d2.variables['lon'][:]).all() + d1.close() + d2.close() + + + def test_generate_erai_t511_inflow_manual(self): + """ + Checks generating inflow file from ERA Interim t511 LSM manually + """ + rapid_input_path, rapid_output_path = self._setup_manual("x-x") + + lsm_file_list = sorted(glob(os.path.join(self.LSM_INPUT_DATA_PATH, 'erai3', '*.nc'))) + mp_lock = multiprocessing.Manager().Lock() + + inf_tool = CreateInflowFileFromERAInterimRunoff() + + m3_file_name = "m3_riv_bas_erai_t511_3hr_20030121to20030122.nc" + generated_m3_file = os.path.join(rapid_output_path, m3_file_name) + + inf_tool.generateOutputInflowFile(out_nc=generated_m3_file, + start_datetime_utc=datetime(2003,1,21), + number_of_timesteps=len(lsm_file_list)*8, + simulation_time_step_seconds=3*3600, + in_rapid_connect_file=os.path.join(rapid_input_path, 'rapid_connect.csv'), + in_rivid_lat_lon_z_file=os.path.join(rapid_input_path, 'comid_lat_lon_z.csv'), + land_surface_model_description="RAPID Inflow from ERA Interim (T511 Grid) 3 Hourly Runoff", + modeling_institution="US Army Engineer Research and Development Center" + ) + + inf_tool.execute(nc_file_list=lsm_file_list, + index_list=list(xrange(len(lsm_file_list))), + in_weight_table=os.path.join(rapid_input_path, 'weight_era_t511.csv'), + out_nc=generated_m3_file, + grid_type='t511', + mp_lock=mp_lock) + + # CHECK OUTPUT + generated_m3_file_solution = os.path.join(self.INFLOW_COMPARE_DATA_PATH, m3_file_name) + self._compare_m3(generated_m3_file,generated_m3_file_solution) + + def test_generate_nldas2_inflow(self): + """ + Checks generating inflow file from NLDAS V2 LSM + """ + rapid_input_path, rapid_output_path, output_file_info = \ + self._run_automatic('nldas2', "x-x", convert_one_hour_to_three=True) + + # CHECK OUTPUT + # m3_riv + m3_file_name = "m3_riv_bas_nasa_nldas_3hr_20030121to20030121.nc" + generated_m3_file = os.path.join(rapid_output_path, m3_file_name) + generated_m3_file_solution = os.path.join(self.INFLOW_COMPARE_DATA_PATH, m3_file_name) + self._compare_m3(generated_m3_file,generated_m3_file_solution) + # check output file info + assert output_file_info[0]['x-x']['m3_riv'] == generated_m3_file + + + def test_generate_nldas2_inflow_single(self): + """ + Checks generating inflow file from NLDAS V2 LSM + """ + rapid_input_path, rapid_output_path, output_file_info = \ + self._run_automatic('nldas2', "x-x", convert_one_hour_to_three=True, + single_run=True, filter_dates=False) + + # CHECK OUTPUT + # m3_riv + m3_file_name = "m3_riv_bas_nasa_nldas_3hr_20030121to20030121.nc" + generated_m3_file = os.path.join(rapid_output_path, m3_file_name) + generated_m3_file_solution = os.path.join(self.INFLOW_COMPARE_DATA_PATH, m3_file_name) + self._compare_m3(generated_m3_file,generated_m3_file_solution) + # check output file info + assert output_file_info[0]['x-x']['m3_riv'] == generated_m3_file + + def test_generate_nldas2_inflow2(self): + """ + Checks generating inflow file from NLDAS V2 LSM manually + """ + rapid_input_path, rapid_output_path = self._setup_manual("x-x") + + lsm_file_list = sorted(glob(os.path.join(self.LSM_INPUT_DATA_PATH, 'nldas2', '*.nc'))) + lsm_file_list = [lsm_file_list[nldas_index:nldas_index+3] for nldas_index in range(0, len(lsm_file_list), 3)\ + if len(lsm_file_list[nldas_index:nldas_index+3])==3] + mp_lock = multiprocessing.Manager().Lock() + + inf_tool = CreateInflowFileFromLDASRunoff(lat_dim="lat_110", + lon_dim="lon_110", + lat_var="lat_110", + lon_var="lon_110", + runoff_vars=["SSRUNsfc_110_SFC_ave2h", + "BGRUNsfc_110_SFC_ave2h"], + ) + + m3_file_name = "m3_riv_bas_nasa_nldas_3hr_20030121to20030121.nc" + generated_m3_file = os.path.join(rapid_output_path, m3_file_name) + + inf_tool.generateOutputInflowFile(out_nc=generated_m3_file, + start_datetime_utc=datetime(2003,1,21), + number_of_timesteps=len(lsm_file_list), + simulation_time_step_seconds=3*3600, + in_rapid_connect_file=os.path.join(rapid_input_path, 'rapid_connect.csv'), + in_rivid_lat_lon_z_file=os.path.join(rapid_input_path, 'comid_lat_lon_z.csv'), + land_surface_model_description="RAPID Inflow from NLDAS Hourly Runoff", + modeling_institution="US Army Engineer Research and Development Center" + ) + + inf_tool.execute(nc_file_list=lsm_file_list, + index_list=list(xrange(len(lsm_file_list))), + in_weight_table=os.path.join(rapid_input_path, 'weight_nldas.csv'), + out_nc=generated_m3_file, + grid_type='nldas', + mp_lock=mp_lock) + + # CHECK OUTPUT + generated_m3_file_solution = os.path.join(self.INFLOW_COMPARE_DATA_PATH, m3_file_name) + + self._compare_m3(generated_m3_file,generated_m3_file_solution) + + def test_generate_era20cm_inflow(self): + """ + Checks generating inflow file from ERA 20CM LSM + """ + rapid_input_path, rapid_output_path = self._setup_automated("x-x") + + output_file_info = run_lsm_rapid_process( + rapid_executable_location=RAPID_EXE_PATH, + cygwin_bin_location=self.CYGWIN_BIN_PATH, + rapid_io_files_location=self.OUTPUT_DATA_PATH, + lsm_data_location=os.path.join(self.LSM_INPUT_DATA_PATH, 'era20cm'), + simulation_start_datetime=datetime(1980, 1, 1), + simulation_end_datetime=datetime(2014, 1, 31), + ensemble_list=range(10), + generate_rapid_namelist_file=False, + run_rapid_simulation=False, + use_all_processors=True, + ) + + for i in range(10): + # CHECK OUTPUT + # m3_riv + m3_file_name = "m3_riv_bas_era_20cm_t159_3hr_20000129to20000130_{0}.nc".format(i) + generated_m3_file = os.path.join(rapid_output_path, m3_file_name) + generated_m3_file_solution = os.path.join(self.INFLOW_COMPARE_DATA_PATH, m3_file_name) + + self._compare_m3(generated_m3_file,generated_m3_file_solution) + # check output file info + assert output_file_info[i]['x-x']['m3_riv'] == generated_m3_file + + def test_generate_era20cm_inflow2(self): + """ + Checks generating inflow file from ERA 20CM LSM manually + """ + rapid_input_path, rapid_output_path = self._setup_manual("x-x") + + lsm_file_list = sorted(glob(os.path.join(self.LSM_INPUT_DATA_PATH, 'era20cm', '*_0.nc'))) + mp_lock = multiprocessing.Manager().Lock() + + inf_tool = CreateInflowFileFromERAInterimRunoff() + + m3_file_name = "m3_riv_bas_era_20cm_t159_3hr_20000129to20000130_0.nc" + generated_m3_file = os.path.join(rapid_output_path, m3_file_name) + + inf_tool.generateOutputInflowFile(out_nc=generated_m3_file, + start_datetime_utc=datetime(2014,8,20), + number_of_timesteps=len(lsm_file_list)*8, + simulation_time_step_seconds=3*3600, + in_rapid_connect_file=os.path.join(rapid_input_path, 'rapid_connect.csv'), + in_rivid_lat_lon_z_file=os.path.join(rapid_input_path, 'comid_lat_lon_z.csv'), + land_surface_model_description="RAPID Inflow from ERA 20CM (T159 Grid) 3 Hourly Runoff", + modeling_institution="US Army Engineer Research and Development Center" + ) + + inf_tool.execute(nc_file_list=lsm_file_list, + index_list=list(xrange(len(lsm_file_list))), + in_weight_table=os.path.join(rapid_input_path, 'weight_era_t159.csv'), + out_nc=generated_m3_file, + grid_type='t159', + mp_lock=mp_lock) + + # CHECK OUTPUT + generated_m3_file_solution = os.path.join(self.INFLOW_COMPARE_DATA_PATH, m3_file_name) + self._compare_m3(generated_m3_file,generated_m3_file_solution) + + def test_generate_erai_t255_inflow(self): + """ + Checks generating inflow file from ERA Interim t255 LSM + """ + + # run main process + rapid_input_path, rapid_output_path, output_file_info = \ + self._run_automatic('erai3t255', "x-x") + + # CHECK OUTPUT + # m3_riv + m3_file_name = "m3_riv_bas_erai_t255_3hr_20140820to20140821.nc" + generated_m3_file = os.path.join(rapid_output_path, m3_file_name) + generated_m3_file_solution = os.path.join(self.INFLOW_COMPARE_DATA_PATH, m3_file_name) + + self._compare_m3(generated_m3_file, generated_m3_file_solution) + + def test_generate_erai_t255_inflow2(self): + """ + Checks generating inflow file from ERA Interim t255 LSM manually + """ + rapid_input_path, rapid_output_path = self._setup_manual("x-x") + + lsm_file_list = sorted(glob(os.path.join(self.LSM_INPUT_DATA_PATH, 'erai3t255', '*.nc'))) + mp_lock = multiprocessing.Manager().Lock() + + inf_tool = CreateInflowFileFromERAInterimRunoff() + + m3_file_name = "m3_riv_bas_erai_t255_3hr_20140820to20140821.nc" + generated_m3_file = os.path.join(rapid_output_path, m3_file_name) + + inf_tool.generateOutputInflowFile(out_nc=generated_m3_file, + start_datetime_utc=datetime(2014,8,20), + number_of_timesteps=len(lsm_file_list)*8, + simulation_time_step_seconds=3*3600, + in_rapid_connect_file=os.path.join(rapid_input_path, 'rapid_connect.csv'), + in_rivid_lat_lon_z_file=os.path.join(rapid_input_path, 'comid_lat_lon_z.csv'), + land_surface_model_description="RAPID Inflow from ERA Interim (T255 Grid) 3 Hourly Runoff", + modeling_institution="US Army Engineer Research and Development Center" + ) + + inf_tool.execute(nc_file_list=lsm_file_list, + index_list=list(xrange(len(lsm_file_list))), + in_weight_table=os.path.join(rapid_input_path, 'weight_era_t255.csv'), + out_nc=generated_m3_file, + grid_type='t255', + mp_lock=mp_lock) + + # CHECK OUTPUT + generated_m3_file_solution = os.path.join(self.INFLOW_COMPARE_DATA_PATH, m3_file_name) + self._compare_m3(generated_m3_file,generated_m3_file_solution) + + def test_generate_gldas2_inflow(self): + """ + Checks generating inflow file from GLDAS V2 LSM + """ + rapid_input_path, rapid_output_path, output_file_info = \ + self._run_automatic('gldas2', "x-x", filter_dates=False) + + # CHECK OUTPUT + # m3_riv + m3_file_name = "m3_riv_bas_nasa_gldas2_3hr_20101231to20101231.nc" + generated_m3_file = os.path.join(rapid_output_path, m3_file_name) + generated_m3_file_solution = os.path.join(self.INFLOW_COMPARE_DATA_PATH, m3_file_name) + self._compare_m3(generated_m3_file,generated_m3_file_solution) + # check output file info + assert output_file_info[0]['x-x']['m3_riv'] == generated_m3_file + + def test_generate_gldas2_inflow2(self): + """ + Checks generating inflow file from GLDAS V2 LSM manually + """ + rapid_input_path, rapid_output_path = self._setup_manual("x-x") + + lsm_file_list = sorted(glob(os.path.join(self.LSM_INPUT_DATA_PATH, 'gldas2', '*.nc4'))) + mp_lock = multiprocessing.Manager().Lock() + + inf_tool = CreateInflowFileFromLDASRunoff(lat_dim="lat", + lon_dim="lon", + lat_var="lat", + lon_var="lon", + runoff_vars=["Qs_acc", + "Qsb_acc"]) + + m3_file_name = "m3_riv_bas_nasa_gldas2_3hr_20101231to20101231.nc" + generated_m3_file = os.path.join(rapid_output_path, m3_file_name) + + inf_tool.generateOutputInflowFile(out_nc=generated_m3_file, + start_datetime_utc=datetime(2010,12,31), + number_of_timesteps=len(lsm_file_list), + simulation_time_step_seconds=3*3600, + in_rapid_connect_file=os.path.join(rapid_input_path, 'rapid_connect.csv'), + in_rivid_lat_lon_z_file=os.path.join(rapid_input_path, 'comid_lat_lon_z.csv'), + land_surface_model_description="RAPID Inflow from GLDAS2.0 LIS land surface model 3 hourly runoff", + modeling_institution="US Army Engineer Research and Development Center" + ) + + inf_tool.execute(nc_file_list=lsm_file_list, + index_list=list(xrange(len(lsm_file_list))), + in_weight_table=os.path.join(rapid_input_path, 'weight_gldas2.csv'), + out_nc=generated_m3_file, + grid_type='gldas2', + mp_lock=mp_lock) + + # CHECK OUTPUT + generated_m3_file_solution = os.path.join(self.INFLOW_COMPARE_DATA_PATH, m3_file_name) + + self._compare_m3(generated_m3_file,generated_m3_file_solution) + + def test_generate_lis_inflow(self): + """ + Checks generating inflow file from LIS LSM + """ + # run main process + rapid_input_path, rapid_output_path, output_file_info = \ + self._run_automatic('lis', "u-k", convert_one_hour_to_three=True) + + # CHECK OUTPUT + # m3_riv + m3_file_name = "m3_riv_bas_nasa_lis_3hr_20110121to20110121.nc" + generated_m3_file = os.path.join(rapid_output_path, m3_file_name) + generated_m3_file_solution = os.path.join(self.INFLOW_COMPARE_DATA_PATH, m3_file_name) + self._compare_m3(generated_m3_file,generated_m3_file_solution) + # check output file info + assert output_file_info[0]['u-k']['m3_riv'] == generated_m3_file + + def test_generate_lis_inflow2(self): + """ + Checks generating inflow file from LIS LSM manually + """ + rapid_input_path, rapid_output_path = self._setup_manual("u-k") + + lsm_file_list = sorted(glob(os.path.join(self.LSM_INPUT_DATA_PATH, 'lis', '*.nc'))) + lsm_file_list = [lsm_file_list[nldas_index:nldas_index+3] for nldas_index in range(0, len(lsm_file_list), 3)\ + if len(lsm_file_list[nldas_index:nldas_index+3])==3] + mp_lock = multiprocessing.Manager().Lock() + + inf_tool = CreateInflowFileFromLDASRunoff(lat_dim="north_south", + lon_dim="east_west", + lat_var="lat", + lon_var="lon", + runoff_vars=["Qs_inst", + "Qsb_inst"]) + + m3_file_name = "m3_riv_bas_nasa_lis_3hr_20110121to20110121.nc" + generated_m3_file = os.path.join(rapid_output_path, m3_file_name) + + inf_tool.generateOutputInflowFile(out_nc=generated_m3_file, + start_datetime_utc=datetime(2008,3,3), + number_of_timesteps=len(lsm_file_list), + simulation_time_step_seconds=3*3600, + in_rapid_connect_file=os.path.join(rapid_input_path, 'rapid_connect.csv'), + in_rivid_lat_lon_z_file=os.path.join(rapid_input_path, 'comid_lat_lon_z.csv'), + land_surface_model_description="RAPID Inflow from NASA GSFC LIS hourly runoff", + modeling_institution="US Army Engineer Research and Development Center" + ) + + inf_tool.execute(nc_file_list=lsm_file_list, + index_list=list(xrange(len(lsm_file_list))), + in_weight_table=os.path.join(rapid_input_path, 'weight_lis.csv'), + out_nc=generated_m3_file, + grid_type='lis', + mp_lock=mp_lock) + + # CHECK OUTPUT + generated_m3_file_solution = os.path.join(self.INFLOW_COMPARE_DATA_PATH, m3_file_name) + + self._compare_m3(generated_m3_file,generated_m3_file_solution) + + def test_generate_joules_inflow(self): + """ + Checks generating inflow file from Joules LSM + """ + + rapid_input_path, rapid_output_path, output_file_info = \ + self._run_automatic('joules', + "u-k", + file_datetime_pattern="%Y%m%d_%H", + file_datetime_re_pattern=r'\d{8}_\d{2}', + convert_one_hour_to_three=True) + + # CHECK OUTPUT + m3_file_name = "m3_riv_bas_met_office_joules_3hr_20080803to20080803.nc" + generated_m3_file = os.path.join(rapid_output_path, m3_file_name) + generated_m3_file_solution = os.path.join(self.INFLOW_COMPARE_DATA_PATH, m3_file_name) + # check other info in netcdf file + self._compare_m3(generated_m3_file, generated_m3_file_solution) + # check output file info + assert output_file_info[0]['u-k']['m3_riv'] == generated_m3_file + + def test_generate_joules_inflow2(self): + """ + Checks generating inflow file from Joules LSM manually + """ + rapid_input_path, rapid_output_path = self._setup_manual("u-k") + + lsm_file_list = sorted(glob(os.path.join(self.LSM_INPUT_DATA_PATH, 'joules', '*.nc'))) + lsm_file_list = [lsm_file_list[nldas_index:nldas_index+3] for nldas_index in range(0, len(lsm_file_list), 3)\ + if len(lsm_file_list[nldas_index:nldas_index+3])==3] + mp_lock = multiprocessing.Manager().Lock() + + inf_tool = CreateInflowFileFromLDASRunoff(lat_dim="north_south", + lon_dim="east_west", + lat_var="north_south", + lon_var="east_west", + runoff_vars=["Qs_inst", + "Qsb_inst"]) + + m3_file_name = "m3_riv_bas_met_office_joules_3hr_20080803to20080803.nc" + generated_m3_file = os.path.join(rapid_output_path, m3_file_name) + + inf_tool.generateOutputInflowFile(out_nc=generated_m3_file, + start_datetime_utc=datetime(2008,3,3), + number_of_timesteps=len(lsm_file_list), + simulation_time_step_seconds=3*3600, + in_rapid_connect_file=os.path.join(rapid_input_path, 'rapid_connect.csv'), + in_rivid_lat_lon_z_file=os.path.join(rapid_input_path, 'comid_lat_lon_z.csv'), + land_surface_model_description="RAPID Inflow from Met Office Joules Hourly Runoff", + modeling_institution="US Army Engineer Research and Development Center" + ) + + inf_tool.execute(nc_file_list=lsm_file_list, + index_list=list(xrange(len(lsm_file_list))), + in_weight_table=os.path.join(rapid_input_path, 'weight_joules.csv'), + out_nc=generated_m3_file, + grid_type='joules', + mp_lock=mp_lock) + + # CHECK OUTPUT + generated_m3_file_solution = os.path.join(self.INFLOW_COMPARE_DATA_PATH, m3_file_name) + + self._compare_m3(generated_m3_file, generated_m3_file_solution) + + def test_generate_erai_t511_24_inflow(self): + """ + Checks generating inflow file from ERA Interim t511 24hr LSM + """ + # run main process + rapid_input_path, rapid_output_path, output_file_info = self._run_automatic('erai24', "x-x") + + # CHECK OUTPUT + # m3_riv + m3_file_name = "m3_riv_bas_erai_t511_24hr_19990109to19990110.nc" + generated_m3_file = os.path.join(rapid_output_path, m3_file_name) + generated_m3_file_solution = os.path.join(self.INFLOW_COMPARE_DATA_PATH, m3_file_name) + self._compare_m3(generated_m3_file,generated_m3_file_solution) + # check output file info + assert output_file_info[0]['x-x']['m3_riv'] == generated_m3_file + + def test_generate_erai_t511_24_inflow2(self): + """ + Checks generating inflow file from ERA Interim t511 24hr LSM manually + """ + rapid_input_path, rapid_output_path = self._setup_manual("x-x") + + lsm_file_list = sorted(glob(os.path.join(self.LSM_INPUT_DATA_PATH, 'erai24', '*.nc'))) + mp_lock = multiprocessing.Manager().Lock() + + inf_tool = CreateInflowFileFromERAInterimRunoff() + + m3_file_name = "m3_riv_bas_erai_t511_24hr_19990109to19990110.nc" + generated_m3_file = os.path.join(rapid_output_path, m3_file_name) + + inf_tool.generateOutputInflowFile(out_nc=generated_m3_file, + start_datetime_utc=datetime(1999,1,9), + number_of_timesteps=len(lsm_file_list), + simulation_time_step_seconds=24*3600, + in_rapid_connect_file=os.path.join(rapid_input_path, 'rapid_connect.csv'), + in_rivid_lat_lon_z_file=os.path.join(rapid_input_path, 'comid_lat_lon_z.csv'), + land_surface_model_description="RAPID Inflow from ERA Interim (T511 Grid) 24 Hourly Runoff", + modeling_institution="US Army Engineer Research and Development Center" + ) + + inf_tool.execute(nc_file_list=lsm_file_list, + index_list=list(xrange(len(lsm_file_list))), + in_weight_table=os.path.join(rapid_input_path, 'weight_era_t511.csv'), + out_nc=generated_m3_file, + grid_type='t511', + mp_lock=mp_lock) + + # CHECK OUTPUT + generated_m3_file_solution = os.path.join(self.INFLOW_COMPARE_DATA_PATH, m3_file_name) + self._compare_m3(generated_m3_file,generated_m3_file_solution) + + def test_generate_wrf_inflow(self): + """ + Checks generating inflow file from WRF LSM + """ + # run main process + rapid_input_path, rapid_output_path, output_file_info = self._run_automatic('wrf', "m-s") + + # CHECK OUTPUT + # m3_riv + m3_file_name = "m3_riv_bas_wrf_wrf_1hr_20080601to20080601.nc" + generated_m3_file = os.path.join(rapid_output_path, m3_file_name) + generated_m3_file_solution = os.path.join(self.INFLOW_COMPARE_DATA_PATH, m3_file_name) + self._compare_m3(generated_m3_file, generated_m3_file_solution) + # check output file info + assert output_file_info[0]['m-s']['m3_riv'] == generated_m3_file + + def test_generate_wrf_inflow2(self): + """ + Checks generating inflow file from WRF LSM manually + """ + rapid_input_path, rapid_output_path = self._setup_manual("m-s") + + lsm_file_list = sorted(glob(os.path.join(self.LSM_INPUT_DATA_PATH, 'wrf', '*.nc'))) + mp_lock = multiprocessing.Manager().Lock() + + inf_tool = CreateInflowFileFromWRFHydroRunoff(lat_dim="south_north", + lon_dim="west_east", + lat_var="XLAT", + lon_var="XLONG", + surface_runoff_var="SFROFF", + subsurface_runoff_var="UDROFF", + ) + + m3_file_name = "m3_riv_bas_wrf_wrf_1hr_20080601to20080601.nc" + generated_m3_file = os.path.join(rapid_output_path, m3_file_name) + + inf_tool.generateOutputInflowFile(out_nc=generated_m3_file, + start_datetime_utc=datetime(2008,6,1), + number_of_timesteps=len(lsm_file_list), + simulation_time_step_seconds=3*3600, + in_rapid_connect_file=os.path.join(rapid_input_path, 'rapid_connect.csv'), + in_rivid_lat_lon_z_file=os.path.join(rapid_input_path, 'comid_lat_lon_z.csv'), + land_surface_model_description="RAPID Inflow from WRF Hourly Runoff", + modeling_institution="US Army Engineer Research and Development Center" + ) + + inf_tool.execute(nc_file_list=lsm_file_list, + index_list=list(xrange(len(lsm_file_list))), + in_weight_table=os.path.join(rapid_input_path, 'weight_wrf.csv'), + out_nc=generated_m3_file, + grid_type='wrf', + mp_lock=mp_lock) + + # CHECK OUTPUT + generated_m3_file_solution = os.path.join(self.INFLOW_COMPARE_DATA_PATH, m3_file_name) + self._compare_m3(generated_m3_file,generated_m3_file_solution) + + + def test_generate_cmip5_inflow(self): + """ + Checks generating inflow file from CMIP5 LSM + """ + rapid_input_path, rapid_output_path, output_file_info = \ + self._run_automatic('cmip5', + "ark-ms", + file_datetime_pattern="%Y", + file_datetime_re_pattern=r'\d{4}', + expected_time_step=24*3600) + + # CHECK OUTPUT + # m3_riv + m3_file_name = "m3_riv_bas_cmip5_cmip5_24hr_20010101to20010103.nc" + generated_m3_file = os.path.join(rapid_output_path, m3_file_name) + generated_m3_file_solution = os.path.join(self.INFLOW_COMPARE_DATA_PATH, m3_file_name) + self._compare_m3(generated_m3_file,generated_m3_file_solution) + # check output file info + assert output_file_info[0]['ark-ms']['m3_riv'] == generated_m3_file + + def _compare_m3(self, generated_m3_file, generated_m3_file_solution): + + # check other info in netcdf file + d1 = Dataset(generated_m3_file) + d2 = Dataset(generated_m3_file_solution) + assert_almost_equal(d1.variables['m3_riv'][:], d2.variables['m3_riv'][:], decimal=5) + if 'rivid' in d2.variables.keys(): + compare_array_nan(d1.variables['rivid'][:], d2.variables['rivid'][:]) + if 'lat' in d2.variables.keys(): + compare_array_nan(d1.variables['lat'][:], d2.variables['lat'][:]) + if 'lon' in d2.variables.keys(): + compare_array_nan(d1.variables['lon'][:], d2.variables['lon'][:]) + d1.close() + d2.close() + + def tearDown(self): + rmtree(os.path.join(self.OUTPUT_DATA_PATH, "input")) + rmtree(os.path.join(self.OUTPUT_DATA_PATH, "output")) diff --git a/tests/test_postprocess.py b/tests/test_postprocess.py new file mode 100644 index 0000000..a94fdc2 --- /dev/null +++ b/tests/test_postprocess.py @@ -0,0 +1,179 @@ +# -*- coding: utf-8 -*- +## +## test_postprocess.py +## RAPIDpy +## +## Created by Alan D. Snow. +## Copyright © 2016 Alan D Snow. All rights reserved. +## + +from datetime import datetime +from glob import glob +from netCDF4 import Dataset +from numpy.testing import assert_almost_equal +import os +from shutil import copy +import unittest + +#local import +from RAPIDpy.rapid import RAPID +from RAPIDpy.postprocess.generate_return_periods import generate_return_periods +from RAPIDpy.postprocess.generate_seasonal_averages import generate_seasonal_averages + +from RAPIDpy.helper_functions import (compare_csv_decimal_files, + remove_files) + +class TestRAPIDInflow(unittest.TestCase): + def setUp(self): + #define global variables + MAIN_TESTS_FOLDER = os.path.dirname(os.path.abspath(__file__)) + self.INPUT_DATA_PATH = os.path.join(MAIN_TESTS_FOLDER, 'data') + self.COMPARE_DATA_PATH = os.path.join(MAIN_TESTS_FOLDER, 'compare') + self.OUTPUT_DATA_PATH = os.path.join(MAIN_TESTS_FOLDER, 'output') + + def test_generate_return_periods(self): + """ + Checks generating return period data from RAPID Qout + """ + return_periods_file_name = 'return_periods_erai_t511_24hr_19800101to19861231.nc' + generated_return_periods_file = os.path.join(self.OUTPUT_DATA_PATH, return_periods_file_name) + generate_return_periods(qout_file=os.path.join(self.INPUT_DATA_PATH, 'Qout_erai_t511_24hr_19800101to19861231.nc'), + return_period_file=generated_return_periods_file + ) + + compare_return_periods_file = os.path.join(self.COMPARE_DATA_PATH, return_periods_file_name) + + #check other info in netcdf file + d1 = Dataset(generated_return_periods_file) + d2 = Dataset(compare_return_periods_file) + assert_almost_equal(d1.variables['max_flow'][:], d2.variables['max_flow'][:], decimal=5) + assert_almost_equal(d1.variables['return_period_20'][:], d2.variables['return_period_20'][:], decimal=5) + assert_almost_equal(d1.variables['return_period_10'][:], d2.variables['return_period_10'][:], decimal=5) + assert_almost_equal(d1.variables['return_period_2'][:], d2.variables['return_period_2'][:], decimal=5) + if 'rivid' in d2.variables.keys(): + assert (d1.variables['rivid'][:] == d2.variables['rivid'][:]).all() + if 'lat' in d2.variables.keys(): + assert (d1.variables['lat'][:] == d2.variables['lat'][:]).all() + if 'lon' in d2.variables.keys(): + assert (d1.variables['lon'][:] == d2.variables['lon'][:]).all() + assert d1.return_period_method == d2.return_period_method + d1.close() + d2.close() + + def test_generate_return_periods_gumble(self): + """ + Checks generating return period data from RAPID Qout using Gumble method + """ + return_periods_file_name = 'return_periods_gumble_erai_t511_24hr_19800101to19861231.nc' + generated_return_periods_file = os.path.join(self.OUTPUT_DATA_PATH, return_periods_file_name) + generate_return_periods(qout_file=os.path.join(self.INPUT_DATA_PATH, 'Qout_erai_t511_24hr_19800101to19861231.nc'), + return_period_file=generated_return_periods_file, + method='gumble' + ) + + compare_return_periods_file = os.path.join(self.COMPARE_DATA_PATH, return_periods_file_name) + + #check other info in netcdf file + d1 = Dataset(generated_return_periods_file) + d2 = Dataset(compare_return_periods_file) + assert_almost_equal(d1.variables['max_flow'][:], d2.variables['max_flow'][:], decimal=5) + assert_almost_equal(d1.variables['return_period_100'][:], d2.variables['return_period_100'][:], decimal=5) + assert_almost_equal(d1.variables['return_period_50'][:], d2.variables['return_period_50'][:], decimal=5) + assert_almost_equal(d1.variables['return_period_20'][:], d2.variables['return_period_20'][:], decimal=5) + assert_almost_equal(d1.variables['return_period_10'][:], d2.variables['return_period_10'][:], decimal=5) + assert_almost_equal(d1.variables['return_period_2'][:], d2.variables['return_period_2'][:], decimal=5) + if 'rivid' in d2.variables.keys(): + assert (d1.variables['rivid'][:] == d2.variables['rivid'][:]).all() + if 'lat' in d2.variables.keys(): + assert (d1.variables['lat'][:] == d2.variables['lat'][:]).all() + if 'lon' in d2.variables.keys(): + assert (d1.variables['lon'][:] == d2.variables['lon'][:]).all() + assert d1.return_period_method == d2.return_period_method + d1.close() + d2.close() + + def test_generate_return_periods_log_pearson(self): + """ + Checks generating return period data from RAPID Qout using log-pearson method + """ + return_periods_file_name = 'return_periods_log_pearson_erai_t511_24hr_19800101to19861231.nc' + generated_return_periods_file = os.path.join(self.OUTPUT_DATA_PATH, return_periods_file_name) + generate_return_periods(qout_file=os.path.join(self.INPUT_DATA_PATH, 'Qout_erai_t511_24hr_19800101to19861231.nc'), + return_period_file=generated_return_periods_file, + method='log_pearson' + ) + + compare_return_periods_file = os.path.join(self.COMPARE_DATA_PATH, return_periods_file_name) + + #check other info in netcdf file + d1 = Dataset(generated_return_periods_file) + d2 = Dataset(compare_return_periods_file) + assert_almost_equal(d1.variables['max_flow'][:], d2.variables['max_flow'][:], decimal=5) + assert_almost_equal(d1.variables['return_period_100'][:], d2.variables['return_period_100'][:], decimal=5) + assert_almost_equal(d1.variables['return_period_50'][:], d2.variables['return_period_50'][:], decimal=5) + assert_almost_equal(d1.variables['return_period_25'][:], d2.variables['return_period_25'][:], decimal=5) + assert_almost_equal(d1.variables['return_period_10'][:], d2.variables['return_period_10'][:], decimal=5) + assert_almost_equal(d1.variables['return_period_2'][:], d2.variables['return_period_2'][:], decimal=5) + if 'rivid' in d2.variables.keys(): + assert (d1.variables['rivid'][:] == d2.variables['rivid'][:]).all() + if 'lat' in d2.variables.keys(): + assert (d1.variables['lat'][:] == d2.variables['lat'][:]).all() + if 'lon' in d2.variables.keys(): + assert (d1.variables['lon'][:] == d2.variables['lon'][:]).all() + + assert d1.return_period_method == d2.return_period_method + d1.close() + d2.close() + + def test_generate_seasonal_averages(self): + """ + Checks generating seasonal average data from RAPID Qout + """ + seasonal_averages_file_name = 'seasonal_averages_erai_t511_24hr_19800101to19861231.nc' + generated_seasonal_averages_file = os.path.join(self.OUTPUT_DATA_PATH, seasonal_averages_file_name) + generate_seasonal_averages(qout_file=os.path.join(self.INPUT_DATA_PATH, 'Qout_erai_t511_24hr_19800101to19861231.nc'), + seasonal_average_file=generated_seasonal_averages_file + ) + + compare_seasonal_averages_file = os.path.join(self.COMPARE_DATA_PATH, seasonal_averages_file_name) + + #check other info in netcdf file + d1 = Dataset(generated_seasonal_averages_file) + d2 = Dataset(compare_seasonal_averages_file) + assert_almost_equal(d1.variables['average_flow'][:], d2.variables['average_flow'][:], decimal=5) + assert_almost_equal(d1.variables['std_dev_flow'][:], d2.variables['std_dev_flow'][:], decimal=5) + assert_almost_equal(d1.variables['max_flow'][:], d2.variables['max_flow'][:], decimal=5) + assert_almost_equal(d1.variables['min_flow'][:], d2.variables['min_flow'][:], decimal=5) + if 'rivid' in d2.variables.keys(): + assert (d1.variables['rivid'][:] == d2.variables['rivid'][:]).all() + if 'lat' in d2.variables.keys(): + assert (d1.variables['lat'][:] == d2.variables['lat'][:]).all() + if 'lon' in d2.variables.keys(): + assert (d1.variables['lon'][:] == d2.variables['lon'][:]).all() + d1.close() + d2.close() + + + def test_generate_seasonal_qinit(self): + """ + Checks generating seasonal qinit from rapid Qout + """ + rapid_manager = RAPID(Qout_file=os.path.join(self.INPUT_DATA_PATH, 'Qout_erai_t511_24hr_19800101to19861231.nc'), + rapid_connect_file=os.path.join(self.COMPARE_DATA_PATH, 'gis', 'x-x', 'rapid_connect.csv') + ) + + seasonal_init_file_name = 'Qinit_seasonal_avg_jan_1.csv' + generated_seasonal_init_file = os.path.join(self.OUTPUT_DATA_PATH, seasonal_init_file_name) + + rapid_manager.generate_seasonal_intitialization(qinit_file=generated_seasonal_init_file, + datetime_start_initialization=datetime(1984,1,1)) + + compare_seasonal_init_file = os.path.join(self.COMPARE_DATA_PATH, generated_seasonal_init_file) + + compare_csv_decimal_files(generated_seasonal_init_file,compare_seasonal_init_file) + + + def tearDown(self): + #remove unused data + remove_files(*[f for f in glob(os.path.join(self.OUTPUT_DATA_PATH,"*")) if not f.endswith(".gitignore")]) + return \ No newline at end of file diff --git a/tests/test_rapidpy.py b/tests/test_rapidpy.py new file mode 100644 index 0000000..b0a29b7 --- /dev/null +++ b/tests/test_rapidpy.py @@ -0,0 +1,851 @@ +# -*- coding: utf-8 -*- +## +## test_rapidpy.py +## RAPIDpy +## +## Created by Alan D. Snow 2016. +## Copyright © 2015 Alan D Snow. All rights reserved. +## + +from datetime import datetime +from filecmp import cmp as fcmp +from netCDF4 import Dataset +import os +from pytz import timezone +from shutil import copy + + +#local import +from RAPIDpy import RAPID +from RAPIDpy import RAPIDDataset +from RAPIDpy.dataset import compare_qout_files +from RAPIDpy.helper_functions import (compare_csv_decimal_files, + compare_csv_timeseries_files, + remove_files) + +from RAPIDpy.postprocess import find_goodness_of_fit +from RAPIDpy.postprocess import ConvertRAPIDOutputToCF + +#GLOBAL VARIABLES +MAIN_TESTS_FOLDER = os.path.dirname(os.path.abspath(__file__)) +COMPARE_DATA_PATH = os.path.join(MAIN_TESTS_FOLDER, 'compare') +INPUT_DATA_PATH = os.path.join(MAIN_TESTS_FOLDER, 'data') +OUTPUT_DATA_PATH = os.path.join(MAIN_TESTS_FOLDER, 'output') +RAPID_EXE_PATH = os.path.join(MAIN_TESTS_FOLDER, + "..", "..", + "rapid", "src", "rapid") +CYGWIN_BIN_PATH = 'C:\\cygwin64\\bin' + +#------------------------------------------------------------------------------ +# MAIN TEST SCRIPTS +#------------------------------------------------------------------------------ +def test_generate_rapid_input_file(): + """ + Checks RAPID input file generation with valid input + """ + print("TEST 1: GENERATE NAMELIST FILE") + rapid_manager = RAPID(rapid_executable_location=RAPID_EXE_PATH, + cygwin_bin_location=CYGWIN_BIN_PATH, + use_all_processors=True, + ZS_TauR = 24*3600, #duration of routing procedure (time step of runoff data) + ZS_dtR = 15*60, #internal routing time step + ZS_TauM = 12*24*3600, #total simulation time + ZS_dtM = 24*3600 #input time step + ) + rapid_manager.update_parameters(rapid_connect_file='rapid_connect.csv', + Vlat_file='m3_riv.nc', + riv_bas_id_file='riv_bas_id.csv', + k_file='k.csv', + x_file='x.csv', + Qout_file='Qout.nc' + ) + generated_input_file = os.path.join(OUTPUT_DATA_PATH, + "rapid_namelist-GENERATE") + rapid_manager.generate_namelist_file(generated_input_file) + generated_input_file_solution = os.path.join(COMPARE_DATA_PATH, + "rapid_namelist-GENERATE") + + + assert (fcmp(generated_input_file, generated_input_file_solution)) + + remove_files(generated_input_file) + +def test_update_rapid_input_file(): + """ + Checks RAPID input file update with valid input + """ + print("TEST 2: UPDATE NAMELIST FILE") + rapid_manager = RAPID(rapid_executable_location=RAPID_EXE_PATH, + cygwin_bin_location=CYGWIN_BIN_PATH, + use_all_processors=True, + ) + rapid_manager.update_parameters(rapid_connect_file='rapid_connect.csv', + Vlat_file='m3_riv.nc', + riv_bas_id_file='riv_bas_id.csv', + k_file='k.csv', + x_file='x.csv', + Qout_file='Qout.nc' + ) + + original_input_file = os.path.join(INPUT_DATA_PATH, + "rapid_namelist_valid") + + updated_input_file = os.path.join(OUTPUT_DATA_PATH, + "rapid_namelist-UPDATE") + + copy(original_input_file, updated_input_file) + rapid_manager.update_namelist_file(updated_input_file) + updated_input_file_solution = os.path.join(COMPARE_DATA_PATH, + "rapid_namelist-UPDATE") + + + assert (fcmp(updated_input_file, updated_input_file_solution)) + + remove_files(updated_input_file) + +def test_update_rapid_invalid_input_file(): + """ + Checks RAPID input file update with valid input + """ + print("TEST 3: UPDATE WITH INVALID NAMELIST FILE") + rapid_manager = RAPID(rapid_executable_location=RAPID_EXE_PATH, + cygwin_bin_location=CYGWIN_BIN_PATH, + use_all_processors=True, + ) + rapid_manager.update_parameters(rapid_connect_file='rapid_connect.csv', + Vlat_file='m3_riv.nc', + riv_bas_id_file='riv_bas_id.csv', + k_file='k.csv', + x_file='x.csv', + Qout_file='Qout.nc' + ) + + original_input_file = os.path.join(INPUT_DATA_PATH, + "rapid_namelist_invalid") + + updated_input_file = os.path.join(OUTPUT_DATA_PATH, + "rapid_namelist-UPDATE-INVALID") + + copy(original_input_file, updated_input_file) + rapid_manager.update_namelist_file(updated_input_file) + updated_input_file_solution = os.path.join(COMPARE_DATA_PATH, + "rapid_namelist-UPDATE-INVALID") + + + assert (fcmp(updated_input_file, updated_input_file_solution)) + + remove_files(updated_input_file) + +def test_update_rapid_numbers_input_file(): + """ + Checks RAPID input file update with number validation + """ + print("TEST 4: GENERATE NUMBERS FOR NAMELIST FILE") + rapid_manager = RAPID(rapid_executable_location=RAPID_EXE_PATH, + cygwin_bin_location=CYGWIN_BIN_PATH, + use_all_processors=True, + rapid_connect_file=os.path.join(INPUT_DATA_PATH, 'rapid_connect.csv'), + riv_bas_id_file=os.path.join(INPUT_DATA_PATH, 'riv_bas_id.csv'), + ) + rapid_manager.update_reach_number_data() + + rapid_manager.update_parameters(rapid_connect_file='rapid_connect.csv', + Vlat_file='m3_nasa_lis_3hr_20020830.nc', + riv_bas_id_file='riv_bas_id.csv', + k_file='k.csv', + x_file='x.csv', + Qout_file='Qout.nc' + ) + + generated_input_file = os.path.join(OUTPUT_DATA_PATH, + "rapid_namelist-GENERATE-NUMBERS") + + rapid_manager.generate_namelist_file(generated_input_file) + + generated_input_file_solution = os.path.join(COMPARE_DATA_PATH, + "rapid_namelist-GENERATE-NUMBERS") + + + assert (fcmp(generated_input_file, generated_input_file_solution)) + + remove_files(generated_input_file) + +def test_update_rapid_runtime(): + """ + Checks RAPID input file update with number validation + """ + print("TEST 5: GENERATE RUNTIME FOR NAMELIST FILE") + rapid_manager = RAPID(rapid_executable_location=RAPID_EXE_PATH, + cygwin_bin_location=CYGWIN_BIN_PATH, + use_all_processors=True, + rapid_connect_file=os.path.join(INPUT_DATA_PATH, 'rapid_connect.csv'), + riv_bas_id_file=os.path.join(INPUT_DATA_PATH, 'riv_bas_id.csv'), + Vlat_file=os.path.join(INPUT_DATA_PATH, 'm3_nasa_lis_3hr_20020830.nc'), + ZS_TauR=3*3600, + ) + + rapid_manager.update_reach_number_data() + + rapid_manager.update_simulation_runtime() + + rapid_manager.update_parameters(rapid_connect_file='rapid_connect.csv', + Vlat_file='m3_nasa_lis_3hr_20020830.nc', + riv_bas_id_file='riv_bas_id.csv', + k_file='k.csv', + x_file='x.csv', + Qout_file='Qout.nc' + ) + + generated_input_file = os.path.join(OUTPUT_DATA_PATH, + "rapid_namelist-GENERATE-TIME") + + rapid_manager.generate_namelist_file(generated_input_file) + + generated_input_file_solution = os.path.join(COMPARE_DATA_PATH, + "rapid_namelist-GENERATE-TIME") + + + assert (fcmp(generated_input_file, generated_input_file_solution)) + + remove_files(generated_input_file) + +def test_qout_same(): + """ + Test function to compare RAPID simulation Qout + """ + print("TEST 6: TEST COMPARE RAPID QOUT") + input_qout_file = os.path.join(COMPARE_DATA_PATH, 'Qout_nasa_lis_3hr_20020830.nc') + input_qout_file_cf = os.path.join(COMPARE_DATA_PATH, 'Qout_nasa_lis_3hr_20020830_CF.nc') + + assert (compare_qout_files(input_qout_file, input_qout_file_cf)) + +def test_run_rapid_simulation(): + """ + Test Running RAPID Simulation + """ + + print("TEST 7: TEST RUNNING RAPID SIMULATION") + generated_qout_file = os.path.join(OUTPUT_DATA_PATH, 'Qout_nasa_lis_3hr_20020830_generated.nc') + + + + rapid_manager = RAPID(rapid_executable_location=RAPID_EXE_PATH, + cygwin_bin_location=CYGWIN_BIN_PATH, + num_processors=1, + rapid_connect_file=os.path.join(INPUT_DATA_PATH, 'rapid_connect.csv'), + riv_bas_id_file=os.path.join(INPUT_DATA_PATH, 'riv_bas_id.csv'), + Vlat_file=os.path.join(INPUT_DATA_PATH, 'm3_nasa_lis_3hr_20020830.nc'), + k_file=os.path.join(INPUT_DATA_PATH, 'k.csv'), + x_file=os.path.join(INPUT_DATA_PATH, 'x.csv'), + ZS_dtM=10800, + ZS_dtR=900, + ZS_TauM=2*86400, + ZS_TauR=10800, + Qout_file=generated_qout_file + ) + rapid_manager.update_reach_number_data() + rapid_manager.run() + + generated_qout_file_solution = os.path.join(COMPARE_DATA_PATH, + 'Qout_nasa_lis_3hr_20020830.nc') + + #check Qout + assert (compare_qout_files(generated_qout_file, generated_qout_file_solution)) + + #check other info in netcdf file + d1 = Dataset(generated_qout_file) + d2 = Dataset(generated_qout_file_solution) + assert (d1.dimensions.keys() == d2.dimensions.keys()) + assert (d1.variables.keys() == d2.variables.keys()) + assert ((d1.variables['rivid'][:] == d2.variables['rivid'][:]).all()) + d1.close() + d2.close() + + remove_files(generated_qout_file) + +def test_convert_file_to_be_cf_compliant_new_format_comid_lat_lon_z(): + """ + Test Convert RAPID Output to be CF Compliant for new format with COMID_LAT_LON_Z + """ + print("TEST 8: TEST CONVERT RAPID OUTPUT TO CF COMPLIANT (COMID_LAT_LON_Z)") + + input_qout_file = os.path.join(COMPARE_DATA_PATH, 'Qout_nasa_lis_3hr_20020830.nc') + temp_qout_file = os.path.join(OUTPUT_DATA_PATH, 'Qout_nasa_lis_3hr_20020830_test_cf_lat_lon_z.nc') + copy(input_qout_file, temp_qout_file) + + rapid_manager = RAPID(rapid_executable_location=RAPID_EXE_PATH, + cygwin_bin_location=CYGWIN_BIN_PATH, + Qout_file=temp_qout_file, + rapid_connect_file=os.path.join(INPUT_DATA_PATH, 'rapid_connect.csv'), + ZS_TauR=3*3600) + + rapid_manager.make_output_CF_compliant(simulation_start_datetime=datetime(2002, 8, 30), + comid_lat_lon_z_file=os.path.join(INPUT_DATA_PATH, 'comid_lat_lon_z.csv'), + project_name="ERA Interim (T511 Grid) 3 Hourly Runoff Based Historical flows by US Army ERDC") + + cf_qout_file_solution = os.path.join(COMPARE_DATA_PATH, + 'Qout_nasa_lis_3hr_20020830_CF.nc') + + #check Qout + assert (compare_qout_files(temp_qout_file, cf_qout_file_solution)) + + #check other info in netcdf file + d1 = Dataset(temp_qout_file) + d2 = Dataset(cf_qout_file_solution) + assert (d1.dimensions.keys() == d2.dimensions.keys()) + assert (d1.variables.keys() == d2.variables.keys()) + assert ((d1.variables['time'][:] == d1.variables['time'][:]).all()) + assert ((d1.variables['rivid'][:] == d1.variables['rivid'][:]).all()) + assert ((d1.variables['lat'][:] == d1.variables['lat'][:]).all()) + assert ((d1.variables['lon'][:] == d1.variables['lon'][:]).all()) + d1.close() + d2.close() + + remove_files(temp_qout_file) + +def test_convert_file_to_be_cf_compliant_new_format(): + """ + Test Convert RAPID Output to be CF Compliant for new format without COMID_LAT_LON_Z + """ + print("TEST 9: TEST CONVERT RAPID OUTPUT TO CF COMPLIANT (NO COMID_LAT_LON_Z)") + + input_qout_file = os.path.join(COMPARE_DATA_PATH, 'Qout_nasa_lis_3hr_20020830.nc') + temp_qout_file = os.path.join(OUTPUT_DATA_PATH, 'Qout_nasa_lis_3hr_20020830_test_cf.nc') + copy(input_qout_file, temp_qout_file) + + rapid_manager = RAPID(rapid_executable_location=RAPID_EXE_PATH, + cygwin_bin_location=CYGWIN_BIN_PATH, + Qout_file=temp_qout_file, + rapid_connect_file=os.path.join(INPUT_DATA_PATH, 'rapid_connect.csv'), + ZS_TauR=3*3600) + + rapid_manager.make_output_CF_compliant(simulation_start_datetime=datetime(2002, 8, 30), + comid_lat_lon_z_file="", + project_name="ERA Interim (T511 Grid) 3 Hourly Runoff Based Historical flows by US Army ERDC") + + cf_qout_file_solution = os.path.join(COMPARE_DATA_PATH, + 'Qout_nasa_lis_3hr_20020830_CF_no_lat_lon_z.nc') + + #check Qout + assert (compare_qout_files(temp_qout_file, cf_qout_file_solution)) + + #check other info in netcdf file + d1 = Dataset(temp_qout_file) + d2 = Dataset(cf_qout_file_solution) + assert (d1.dimensions.keys() == d2.dimensions.keys()) + assert (d1.variables.keys() == d2.variables.keys()) + assert ((d1.variables['time'][:] == d1.variables['time'][:]).all()) + assert ((d1.variables['rivid'][:] == d1.variables['rivid'][:]).all()) + d1.close() + d2.close() + + remove_files(temp_qout_file) + +def test_convert_file_to_be_cf_compliant_original_format(): + """ + Test Convert RAPID Output to be CF Compliant for original format + """ + print("TEST 10: TEST CONVERT RAPID OUTPUT TO CF COMPLIANT - ORIGINAL (COMID_LAT_LON_Z)") + + input_qout_file = os.path.join(COMPARE_DATA_PATH, 'Qout_nasa_lis_3hr_20020830_original.nc') + temp_qout_file = os.path.join(OUTPUT_DATA_PATH, 'Qout_nasa_lis_3hr_20020830_original_test_cf.nc') + copy(input_qout_file, temp_qout_file) + + rapid_manager = RAPID(rapid_executable_location=RAPID_EXE_PATH, + cygwin_bin_location=CYGWIN_BIN_PATH, + Qout_file=temp_qout_file, + rapid_connect_file=os.path.join(INPUT_DATA_PATH, 'rapid_connect.csv'), + ZS_TauR=3*3600) + + rapid_manager.make_output_CF_compliant(simulation_start_datetime=datetime(2002, 8, 30), + comid_lat_lon_z_file=os.path.join(INPUT_DATA_PATH, 'comid_lat_lon_z.csv'), + project_name="ERA Interim (T511 Grid) 3 Hourly Runoff Based Historical flows by US Army ERDC") + + cf_qout_file_solution = os.path.join(COMPARE_DATA_PATH, + 'Qout_nasa_lis_3hr_20020830_CF.nc') + + #check Qout + assert (compare_qout_files(temp_qout_file, cf_qout_file_solution)) + + #check other info in netcdf file + d1 = Dataset(temp_qout_file) + d2 = Dataset(cf_qout_file_solution) + assert (d1.dimensions.keys() == d2.dimensions.keys()) + assert (d1.variables.keys() == d2.variables.keys()) + assert ((d1.variables['time'][:] == d1.variables['time'][:]).all()) + assert ((d1.variables['rivid'][:] == d1.variables['rivid'][:]).all()) + assert ((d1.variables['lat'][:] == d1.variables['lat'][:]).all()) + assert ((d1.variables['lon'][:] == d1.variables['lon'][:]).all()) + d1.close() + d2.close() + + remove_files(temp_qout_file) + +def test_generate_qinit_file(): + """ + This tests the qinit file function to create an input qinit file for RAPID + """ + print("TEST 11: TEST GENERATE QINIT FILE") + rapid_manager = RAPID(rapid_executable_location=RAPID_EXE_PATH, + cygwin_bin_location=CYGWIN_BIN_PATH, + rapid_connect_file=os.path.join(INPUT_DATA_PATH, 'rapid_connect.csv') + ) + + #test with original rapid outpur + input_qout_file = os.path.join(COMPARE_DATA_PATH, 'Qout_nasa_lis_3hr_20020830.nc') + original_qout_file = os.path.join(OUTPUT_DATA_PATH, 'Qout_nasa_lis_3hr_20020830.nc') + copy(input_qout_file, original_qout_file) + + qinit_original_rapid_qout = os.path.join(OUTPUT_DATA_PATH, 'qinit_original_rapid_qout.csv') + rapid_manager.update_parameters(Qout_file=original_qout_file) + rapid_manager.generate_qinit_from_past_qout(qinit_file=qinit_original_rapid_qout) + + qinit_original_rapid_qout_solution = os.path.join(COMPARE_DATA_PATH, 'qinit_original_rapid_qout.csv') + assert (compare_csv_decimal_files(qinit_original_rapid_qout, qinit_original_rapid_qout_solution, header=False)) + + #test with CF rapid output and alternate time index + cf_input_qout_file = os.path.join(COMPARE_DATA_PATH, 'Qout_nasa_lis_3hr_20020830_CF.nc') + cf_qout_file = os.path.join(OUTPUT_DATA_PATH, 'Qout_nasa_lis_3hr_20020830_CF.nc') + copy(cf_input_qout_file, cf_qout_file) + + qinit_cf_rapid_qout = os.path.join(OUTPUT_DATA_PATH, 'qinit_cf_rapid_qout.csv') + rapid_manager.update_parameters(Qout_file=cf_qout_file) + rapid_manager.generate_qinit_from_past_qout(qinit_file=qinit_cf_rapid_qout, + time_index=5) + + qinit_cf_rapid_qout_solution = os.path.join(COMPARE_DATA_PATH, 'qinit_cf_rapid_qout.csv') + assert (compare_csv_decimal_files(qinit_cf_rapid_qout, qinit_cf_rapid_qout_solution, header=False)) + + remove_files(original_qout_file, + qinit_original_rapid_qout, + cf_qout_file, + qinit_cf_rapid_qout + ) + + +def test_download_usgs_daily_avg(): + """ + This tests downloading USGS daily avg data + """ + print("TEST 12: TEST DOWNLOAD USGS DAILY AVERAGE DATA") + + out_streamflow_file=os.path.join(OUTPUT_DATA_PATH,"gage_streamflow.csv") + out_stream_id_file=os.path.join(OUTPUT_DATA_PATH,"gage_rivid.csv") + + rapid_manager = RAPID(rapid_executable_location=RAPID_EXE_PATH, + cygwin_bin_location=CYGWIN_BIN_PATH) + + rapid_manager.generate_usgs_avg_daily_flows_opt(reach_id_gage_id_file=os.path.join(INPUT_DATA_PATH,"usgs_gage_id_rivid.csv"), + start_datetime=datetime(2000,1,1), + end_datetime=datetime(2000,1,3), + out_streamflow_file=out_streamflow_file, + out_stream_id_file=out_stream_id_file) + + compare_streamflow_file=os.path.join(COMPARE_DATA_PATH,"gage_streamflow.csv") + assert (compare_csv_decimal_files(out_streamflow_file, compare_streamflow_file, header=False)) + + compare_stream_id_file=os.path.join(COMPARE_DATA_PATH,"gage_rivid.csv") + assert (compare_csv_decimal_files(out_stream_id_file, compare_stream_id_file, header=False)) + + remove_files(out_streamflow_file, + out_stream_id_file) + +def test_extract_timeseries(): + """ + This tests extracting a timeseries from RAPID Qout file + """ + print("TEST 13: TEST EXTRACT TIMESERIES FROM QINIT FILE") + + #for writing entire time series to file from new rapid output + input_qout_file = os.path.join(COMPARE_DATA_PATH, 'Qout_nasa_lis_3hr_20020830.nc') + new_qout_file = os.path.join(OUTPUT_DATA_PATH, 'Qout_nasa_lis_3hr_20020830.nc') + copy(input_qout_file, new_qout_file) + new_timeseries_file = os.path.join(OUTPUT_DATA_PATH, 'new_timeseries_file.csv') + + with RAPIDDataset(new_qout_file) as qout_nc: + qout_nc.write_flows_to_csv(new_timeseries_file, + river_id=75224) + + if qout_nc.is_time_variable_valid(): + original_timeseries_file_solution = os.path.join(COMPARE_DATA_PATH, 'original_timeseries.csv') + else: + original_timeseries_file_solution = os.path.join(COMPARE_DATA_PATH, 'original_timeseries-notime.csv') + + assert (compare_csv_timeseries_files(new_timeseries_file, original_timeseries_file_solution, header=False)) + + #for writing entire time series to file from original rapid output + input_qout_file = os.path.join(COMPARE_DATA_PATH, 'Qout_nasa_lis_3hr_20020830_original.nc') + original_qout_file = os.path.join(OUTPUT_DATA_PATH, 'Qout_nasa_lis_3hr_20020830_original.nc') + copy(input_qout_file, original_qout_file) + original_timeseries_file = os.path.join(OUTPUT_DATA_PATH, 'original_timeseries.csv') + + with RAPIDDataset(original_qout_file) as qout_nc: + qout_nc.write_flows_to_csv(original_timeseries_file, + river_id=75224) + original_timeseries_file_solution = os.path.join(COMPARE_DATA_PATH, 'original_timeseries-notime.csv') + + assert (compare_csv_timeseries_files(original_timeseries_file, original_timeseries_file_solution, header=False)) + + #if file is CF compliant, you can write out daily average + cf_input_qout_file = os.path.join(COMPARE_DATA_PATH, 'Qout_nasa_lis_3hr_20020830_CF.nc') + cf_qout_file = os.path.join(OUTPUT_DATA_PATH, 'Qout_nasa_lis_3hr_20020830_CF.nc') + copy(cf_input_qout_file, cf_qout_file) + cf_timeseries_daily_file = os.path.join(OUTPUT_DATA_PATH, 'cf_timeseries_daily.csv') + + with RAPIDDataset(cf_qout_file) as qout_nc: + qout_nc.write_flows_to_csv(cf_timeseries_daily_file, + river_index=20, + daily=True) + + cf_timeseries_daily_file_solution = os.path.join(COMPARE_DATA_PATH, 'cf_timeseries_daily.csv') + assert (compare_csv_timeseries_files(cf_timeseries_daily_file, cf_timeseries_daily_file_solution, header=False)) + + #if file is CF compliant, check write out timeseries + cf_timeseries_file = os.path.join(OUTPUT_DATA_PATH, 'cf_timeseries.csv') + with RAPIDDataset(cf_qout_file) as qout_nc: + qout_nc.write_flows_to_csv(cf_timeseries_file, + river_index=20) + + cf_timeseries_file_solution = os.path.join(COMPARE_DATA_PATH, 'cf_timeseries.csv') + assert (compare_csv_timeseries_files(cf_timeseries_file, cf_timeseries_file_solution, header=False)) + + #if file is CF compliant, you can write out daily average, filter by date, and use max mode + cf_timeseries_daily_date_file = os.path.join(OUTPUT_DATA_PATH, 'cf_timeseries_daily_date.csv') + + with RAPIDDataset(cf_qout_file) as qout_nc: + qout_nc.write_flows_to_csv(cf_timeseries_daily_date_file, + river_id=75224, + date_search_start=datetime(2002, 8, 31), + date_search_end=datetime(2002, 8, 31, 23, 59, 59), + daily=True, + mode='max') + + cf_timeseries_daily_date_file_solution = os.path.join(COMPARE_DATA_PATH, 'cf_timeseries_daily_date.csv') + assert (compare_csv_timeseries_files(cf_timeseries_daily_date_file, cf_timeseries_daily_date_file_solution, header=False)) + + #if file is CF compliant, check write out timeseries and filter by date + cf_timeseries_date_file = os.path.join(OUTPUT_DATA_PATH, 'cf_timeseries_date.csv') + with RAPIDDataset(cf_qout_file) as qout_nc: + qout_nc.write_flows_to_csv(cf_timeseries_date_file, + date_search_start=datetime(2002, 8, 31), + #date_search_end=None, + river_id=75224) + + cf_timeseries_date_file_solution = os.path.join(COMPARE_DATA_PATH, 'cf_timeseries_date.csv') + assert (compare_csv_timeseries_files(cf_timeseries_date_file, cf_timeseries_date_file_solution, header=False)) + + remove_files(new_timeseries_file, + new_qout_file, + original_timeseries_file, + original_qout_file, + cf_timeseries_file, + cf_timeseries_date_file, + cf_timeseries_daily_file, + cf_timeseries_daily_date_file, + cf_qout_file, + ) + + +def test_goodness_of_fit(): + """ + This tests the goodness of fit functions + """ + print("TEST 14: TEST GOODNESS OF FIT FUNCTIONS") + + reach_id_file = os.path.join(INPUT_DATA_PATH, 'obs_reach_id.csv') + observed_file = os.path.join(INPUT_DATA_PATH, 'obs_flow.csv') + #using CF-compliant file + cf_input_qout_file = os.path.join(COMPARE_DATA_PATH, 'Qout_nasa_lis_3hr_20020830_CF.nc') + cf_out_analysis_file = os.path.join(OUTPUT_DATA_PATH, 'cf_goodness_of_fit_results-daily.csv') + find_goodness_of_fit(cf_input_qout_file, reach_id_file, observed_file, + cf_out_analysis_file, daily=True) + + cf_goodness_of_fit_file_solution = os.path.join(COMPARE_DATA_PATH, 'cf_goodness_of_fit_analysis.csv') + assert (compare_csv_decimal_files(cf_out_analysis_file, cf_goodness_of_fit_file_solution)) + #using original RAPID file + raw_goodness_of_fit_file_solution = os.path.join(COMPARE_DATA_PATH, 'raw_goodness_of_fit_analysis.csv') + original_input_qout_file = os.path.join(COMPARE_DATA_PATH, 'Qout_nasa_lis_3hr_20020830_original.nc') + original_out_analysis_file = os.path.join(OUTPUT_DATA_PATH, 'original_goodness_of_fit_results-daily.csv') + find_goodness_of_fit(original_input_qout_file, reach_id_file, observed_file, + original_out_analysis_file, steps_per_group=8) + + assert (compare_csv_decimal_files(original_out_analysis_file, raw_goodness_of_fit_file_solution)) + + #using new RAPID file + new_input_qout_file = os.path.join(COMPARE_DATA_PATH, 'Qout_nasa_lis_3hr_20020830.nc') + new_out_analysis_file = os.path.join(OUTPUT_DATA_PATH, 'goodness_of_fit_results-daily.csv') + find_goodness_of_fit(new_input_qout_file, reach_id_file, observed_file, + new_out_analysis_file, steps_per_group=8) + + assert (compare_csv_decimal_files(new_out_analysis_file, raw_goodness_of_fit_file_solution)) + + reach_id_file = os.path.join(INPUT_DATA_PATH, 'obs_reach_id_1.csv') + observed_file = os.path.join(INPUT_DATA_PATH, 'obs_flow_1.csv') + #using CF-compliant file single input + cf_out_analysis_file_1 = os.path.join(OUTPUT_DATA_PATH, 'cf_goodness_of_fit_results_1-daily.csv') + find_goodness_of_fit(cf_input_qout_file, reach_id_file, observed_file, + cf_out_analysis_file_1, daily=True) + + cf_goodness_of_fit_file_solution_1 = os.path.join(COMPARE_DATA_PATH, 'cf_goodness_of_fit_analysis_1.csv') + assert (compare_csv_decimal_files(cf_out_analysis_file_1, cf_goodness_of_fit_file_solution_1)) + + remove_files(cf_out_analysis_file, + original_out_analysis_file, + new_out_analysis_file, + cf_out_analysis_file_1) + +def test_cf_merge(): + """ + This tests merging two qout files + """ + print("TEST 15: TEST MERGE QOUT") + + orig_qout_1 = os.path.join(INPUT_DATA_PATH, 'Qout_merge_3hr.nc') + orig_qout_2 = os.path.join(INPUT_DATA_PATH, 'Qout_merge_6hr.nc') + + qout_1 = os.path.join(OUTPUT_DATA_PATH, 'Qout_merge_3hr.nc') + qout_2 = os.path.join(OUTPUT_DATA_PATH, 'Qout_merge_6hr.nc') + + copy(orig_qout_1, qout_1) + copy(orig_qout_2, qout_2) + #Merge all files together at the end + cv = ConvertRAPIDOutputToCF(rapid_output_file=[qout_1, qout_2], + start_datetime=datetime(2016, 2, 12), + time_step=[3*3600, 6*3600], + qinit_file="", + comid_lat_lon_z_file="", + rapid_connect_file="", + project_name="ECMWF-RAPID Predicted flows by US Army ERDC", + output_id_dim_name='rivid', + output_flow_var_name='Qout', + print_debug=False) + cv.convert() + + cf_merge_qout_file_solution = os.path.join(COMPARE_DATA_PATH, + 'Qout_merge.nc') + + #check Qout + assert (compare_qout_files(qout_1, cf_merge_qout_file_solution)) + + #check other info in netcdf file + d1 = Dataset(qout_1) + d2 = Dataset(cf_merge_qout_file_solution) + assert (d1.dimensions.keys() == d2.dimensions.keys()) + assert (d1.variables.keys() == d2.variables.keys()) + assert ((d1.variables['time'][:] == d1.variables['time'][:]).all()) + assert ((d1.variables['rivid'][:] == d1.variables['rivid'][:]).all()) + d1.close() + d2.close() + + remove_files(qout_1, + qout_2) + +def test_extract_timeseries_to_gssha_xys(): + """ + This tests extracting a timeseries from RAPID Qout file to GSHHA xys file + """ + print("TEST 16: TEST EXTRACT TIMESERIES FROM Qout file to GSSHA xys file") + + cf_input_qout_file = os.path.join(COMPARE_DATA_PATH, 'Qout_nasa_lis_3hr_20020830_CF.nc') + cf_qout_file = os.path.join(OUTPUT_DATA_PATH, 'Qout_nasa_lis_3hr_20020830_CF.nc') + copy(cf_input_qout_file, cf_qout_file) + + #if file is CF compliant, you can write out daily average + cf_timeseries_daily_file = os.path.join(OUTPUT_DATA_PATH, 'cf_timeseries_daily.xys') + + with RAPIDDataset(cf_qout_file) as qout_nc: + qout_nc.write_flows_to_gssha_time_series_xys(cf_timeseries_daily_file, + series_name="RAPID_TO_GSSHA", + series_id=25, + river_index=20, + daily=True) + + cf_timeseries_daily_file_solution = os.path.join(COMPARE_DATA_PATH, 'cf_timeseries_daily.xys') + assert (compare_csv_timeseries_files(cf_timeseries_daily_file, cf_timeseries_daily_file_solution)) + + #if file is CF compliant, check write out timeseries + cf_timeseries_file = os.path.join(OUTPUT_DATA_PATH, 'cf_timeseries.xys') + with RAPIDDataset(cf_qout_file) as qout_nc: + qout_nc.write_flows_to_gssha_time_series_xys(cf_timeseries_file, + series_name="RAPID_TO_GSSHA", + series_id=25, + river_index=20) + + cf_timeseries_file_solution = os.path.join(COMPARE_DATA_PATH, 'cf_timeseries.xys') + assert (compare_csv_timeseries_files(cf_timeseries_file, cf_timeseries_file_solution, header=True)) + + #if file is CF compliant, you can write out daily average, filter by date, and use max mode + cf_timeseries_daily_date_file = os.path.join(OUTPUT_DATA_PATH, 'cf_timeseries_daily_date.xys') + + with RAPIDDataset(cf_qout_file) as qout_nc: + qout_nc.write_flows_to_gssha_time_series_xys(cf_timeseries_daily_date_file, + series_name="RAPID_TO_GSSHA", + series_id=25, + river_id=75224, + date_search_start=datetime(2002, 8, 31), + date_search_end=datetime(2002, 8, 31, 23, 59, 59), + daily=True, + mode='max') + + cf_timeseries_daily_date_file_solution = os.path.join(COMPARE_DATA_PATH, 'cf_timeseries_daily_date.xys') + assert (compare_csv_timeseries_files(cf_timeseries_daily_date_file, cf_timeseries_daily_date_file_solution)) + + #if file is CF compliant, check write out timeseries and filter by date + cf_timeseries_date_file = os.path.join(OUTPUT_DATA_PATH, 'cf_timeseries_date.xys') + with RAPIDDataset(cf_qout_file) as qout_nc: + qout_nc.write_flows_to_gssha_time_series_xys(cf_timeseries_date_file, + series_name="RAPID_TO_GSSHA", + series_id=25, + date_search_start=datetime(2002, 8, 31), + #date_search_end=None, + river_id=75224) + + cf_timeseries_date_file_solution = os.path.join(COMPARE_DATA_PATH, 'cf_timeseries_date.xys') + assert (compare_csv_timeseries_files(cf_timeseries_date_file, cf_timeseries_date_file_solution)) + + remove_files(cf_timeseries_file, + cf_qout_file, + cf_timeseries_daily_file, + cf_timeseries_daily_date_file, + cf_timeseries_date_file, + ) + +def test_extract_timeseries_to_gssha_ihg(): + """ + This tests extracting a timeseries from RAPID Qout file to GSHHA ihg file + """ + print("TEST 16: TEST EXTRACT TIMESERIES FROM Qout file to GSSHA ihg file") + + cf_input_qout_file = os.path.join(COMPARE_DATA_PATH, 'Qout_nasa_lis_3hr_20020830_CF.nc') + cf_qout_file = os.path.join(OUTPUT_DATA_PATH, 'Qout_nasa_lis_3hr_20020830_CF.nc') + copy(cf_input_qout_file, cf_qout_file) + + + #if file is CF compliant, you can write out daily average + connection_list_file = os.path.join(INPUT_DATA_PATH, 'rapid_gssha_connect_file3.csv') + cf_timeseries_daily_file = os.path.join(OUTPUT_DATA_PATH, 'cf_timeseries_daily.ihg') + + with RAPIDDataset(cf_qout_file) as qout_nc: + qout_nc.write_flows_to_gssha_time_series_ihg(cf_timeseries_daily_file, + connection_list_file=connection_list_file, + daily=True) + + cf_timeseries_daily_file_solution = os.path.join(COMPARE_DATA_PATH, 'cf_timeseries_daily.ihg') + assert (compare_csv_timeseries_files(cf_timeseries_daily_file, cf_timeseries_daily_file_solution, header=False)) + + #if file is CF compliant, check write out timeseries + connection_list_file = os.path.join(INPUT_DATA_PATH, 'rapid_gssha_connect_file1.csv') + cf_timeseries_file = os.path.join(OUTPUT_DATA_PATH, 'cf_timeseries.ihg') + with RAPIDDataset(cf_qout_file) as qout_nc: + qout_nc.write_flows_to_gssha_time_series_ihg(cf_timeseries_file, + connection_list_file=connection_list_file, + ) + + cf_timeseries_file_solution = os.path.join(COMPARE_DATA_PATH, 'cf_timeseries.ihg') + assert (compare_csv_timeseries_files(cf_timeseries_file, cf_timeseries_file_solution, header=False)) + + #if file is CF compliant, you can write out daily average, filter by date, and use max mode + connection_list_file = os.path.join(INPUT_DATA_PATH, 'rapid_gssha_connect_file1.csv') + cf_timeseries_daily_date_file = os.path.join(OUTPUT_DATA_PATH, 'cf_timeseries_daily_date.ihg') + + with RAPIDDataset(cf_qout_file) as qout_nc: + qout_nc.write_flows_to_gssha_time_series_ihg(cf_timeseries_daily_date_file, + connection_list_file=connection_list_file, + date_search_start=datetime(2002, 8, 31), + date_search_end=datetime(2002, 8, 31, 23, 59, 59), + daily=True, + mode='max') + + cf_timeseries_daily_date_file_solution = os.path.join(COMPARE_DATA_PATH, 'cf_timeseries_daily_date.ihg') + assert (compare_csv_timeseries_files(cf_timeseries_daily_date_file, cf_timeseries_daily_date_file_solution, header=False)) + + #if file is CF compliant, check write out timeseries and filter by date + connection_list_file = os.path.join(INPUT_DATA_PATH, 'rapid_gssha_connect_file3.csv') + cf_timeseries_date_file = os.path.join(OUTPUT_DATA_PATH, 'cf_timeseries_date.ihg') + with RAPIDDataset(cf_qout_file) as qout_nc: + qout_nc.write_flows_to_gssha_time_series_ihg(cf_timeseries_date_file, + connection_list_file=connection_list_file, + date_search_start=datetime(2002, 8, 31), + #date_search_end=None, + ) + + cf_timeseries_date_file_solution = os.path.join(COMPARE_DATA_PATH, 'cf_timeseries_date.ihg') + assert (compare_csv_timeseries_files(cf_timeseries_date_file, cf_timeseries_date_file_solution, header=False)) + + remove_files(cf_timeseries_file, + cf_qout_file, + cf_timeseries_daily_file, + cf_timeseries_daily_date_file, + cf_timeseries_date_file, + ) + +def test_extract_timeseries_to_gssha_ihg_tzinfo(): + """ + This tests extracting a timeseries from RAPID Qout file to GSHHA ihg file + with different time zone output + """ + print("TEST 17: TEST EXTRACT TIMESERIES FROM Qout file to GSSHA ihg file tzinfo") + + CENTRAL_TZ = timezone('US/Central') + + cf_input_qout_file = os.path.join(COMPARE_DATA_PATH, 'Qout_nasa_lis_3hr_20020830_CF.nc') + cf_qout_file = os.path.join(OUTPUT_DATA_PATH, 'Qout_nasa_lis_3hr_20020830_CF.nc') + copy(cf_input_qout_file, cf_qout_file) + + + #if file is CF compliant, you can write out daily average + connection_list_file = os.path.join(INPUT_DATA_PATH, 'rapid_gssha_connect_file3.csv') + cf_timeseries_daily_file = os.path.join(OUTPUT_DATA_PATH, 'cf_timeseries_daily_tz.ihg') + + with RAPIDDataset(cf_qout_file, out_tzinfo=CENTRAL_TZ) as qout_nc: + qout_nc.write_flows_to_gssha_time_series_ihg(cf_timeseries_daily_file, + connection_list_file=connection_list_file, + daily=True) + + cf_timeseries_daily_file_solution = os.path.join(COMPARE_DATA_PATH, 'cf_timeseries_daily_tz.ihg') + assert (compare_csv_timeseries_files(cf_timeseries_daily_file, cf_timeseries_daily_file_solution, header=False)) + + #if file is CF compliant, check write out timeseries + connection_list_file = os.path.join(INPUT_DATA_PATH, 'rapid_gssha_connect_file1.csv') + cf_timeseries_file = os.path.join(OUTPUT_DATA_PATH, 'cf_timeseries_tz.ihg') + with RAPIDDataset(cf_qout_file, out_tzinfo=CENTRAL_TZ) as qout_nc: + qout_nc.write_flows_to_gssha_time_series_ihg(cf_timeseries_file, + connection_list_file=connection_list_file, + ) + + cf_timeseries_file_solution = os.path.join(COMPARE_DATA_PATH, 'cf_timeseries_tz.ihg') + assert (compare_csv_timeseries_files(cf_timeseries_file, cf_timeseries_file_solution, header=False)) + + #if file is CF compliant, you can write out daily average, filter by date, and use max mode + connection_list_file = os.path.join(INPUT_DATA_PATH, 'rapid_gssha_connect_file1.csv') + cf_timeseries_daily_date_file = os.path.join(OUTPUT_DATA_PATH, 'cf_timeseries_daily_date_tz.ihg') + + with RAPIDDataset(cf_qout_file, out_tzinfo=CENTRAL_TZ) as qout_nc: + qout_nc.write_flows_to_gssha_time_series_ihg(cf_timeseries_daily_date_file, + connection_list_file=connection_list_file, + date_search_start=datetime(2002, 8, 31), + date_search_end=datetime(2002, 8, 31, 23, 59, 59), + daily=True, + mode='max') + + cf_timeseries_daily_date_file_solution = os.path.join(COMPARE_DATA_PATH, 'cf_timeseries_daily_date_tz.ihg') + assert (compare_csv_timeseries_files(cf_timeseries_daily_date_file, cf_timeseries_daily_date_file_solution, header=False)) + + #if file is CF compliant, check write out timeseries and filter by date + connection_list_file = os.path.join(INPUT_DATA_PATH, 'rapid_gssha_connect_file3.csv') + cf_timeseries_date_file = os.path.join(OUTPUT_DATA_PATH, 'cf_timeseries_date_tz.ihg') + with RAPIDDataset(cf_qout_file, out_tzinfo=CENTRAL_TZ) as qout_nc: + qout_nc.write_flows_to_gssha_time_series_ihg(cf_timeseries_date_file, + connection_list_file=connection_list_file, + date_search_start=datetime(2002, 8, 31), + ) + + cf_timeseries_date_file_solution = os.path.join(COMPARE_DATA_PATH, 'cf_timeseries_date_tz.ihg') + assert (compare_csv_timeseries_files(cf_timeseries_date_file, cf_timeseries_date_file_solution, header=False)) + + remove_files(cf_timeseries_file, + cf_qout_file, + cf_timeseries_daily_file, + cf_timeseries_daily_date_file, + cf_timeseries_date_file, + )