├── stormevents ├── __init__.py ├── nhc │ ├── __init__.py │ ├── const.py │ └── storms.py ├── usgs │ ├── __init__.py │ ├── base.py │ └── sensors.py └── utilities.py ├── docs ├── source │ ├── index.rst │ ├── stormevent.rst │ ├── nhc.rst │ ├── usgs.rst │ ├── installation.rst │ └── conf.py ├── Makefile └── make.bat ├── .readthedocs.yml ├── pyproject.toml ├── .pre-commit-config.yaml ├── .github └── workflows │ ├── build.yml │ ├── test_quick.yml │ └── test.yml ├── .gitignore ├── tests ├── test_atcf.py ├── test_utilities.py ├── __init__.py ├── test_usgs.py ├── data │ ├── reference │ │ ├── test_usgs_flood_events │ │ │ └── events.csv │ │ ├── test_usgs_flood_storms │ │ │ └── storms.csv │ │ ├── test_vortex_track │ │ │ ├── isabel2003.fort.22 │ │ │ ├── michael2018.fort.22 │ │ │ ├── harvey2017.fort.22 │ │ │ ├── irene2011.fort.22 │ │ │ └── sandy2012.fort.22 │ │ ├── test_vortex_track_no_internet │ │ │ ├── vortex_1.22 │ │ │ ├── vortex_2.22 │ │ │ └── vortex_3.22 │ │ ├── test_vortex_track_file_decks │ │ │ └── b-deck_BEST.22 │ │ └── test_vortex_track_from_file │ │ │ └── irma2017_fort.22 │ └── input │ │ └── test_vortex_track_no_internet │ │ └── fort.22 └── test_stormevent.py └── .editorconfig /stormevents/__init__.py: -------------------------------------------------------------------------------- 1 | from stormevents.stormevent import StormEvent 2 | -------------------------------------------------------------------------------- /stormevents/nhc/__init__.py: -------------------------------------------------------------------------------- 1 | from stormevents.nhc.storms import nhc_storms 2 | from stormevents.nhc.track import VortexTrack 3 | -------------------------------------------------------------------------------- /docs/source/index.rst: -------------------------------------------------------------------------------- 1 | .. mdinclude:: ../../README.md 2 | 3 | .. toctree:: 4 | :hidden: 5 | 6 | installation 7 | nhc 8 | usgs 9 | stormevent 10 | -------------------------------------------------------------------------------- /docs/source/stormevent.rst: -------------------------------------------------------------------------------- 1 | Retrieving data for a specific storm 2 | ==================================== 3 | 4 | The ``StormEvent`` class provides an interface to retrieve data within the time interval and spatial bounds of a specific storm 5 | event. 6 | 7 | .. autoclass:: stormevents.stormevent.StormEvent 8 | -------------------------------------------------------------------------------- /stormevents/usgs/__init__.py: -------------------------------------------------------------------------------- 1 | from stormevents.usgs.events import USGS_Event 2 | from stormevents.usgs.events import usgs_flood_events 3 | from stormevents.usgs.events import usgs_flood_storms 4 | from stormevents.usgs.events import USGS_StormEvent 5 | from stormevents.usgs.sensors import USGS_File 6 | from stormevents.usgs.sensors import usgs_files 7 | from stormevents.usgs.sensors import usgs_sensors 8 | -------------------------------------------------------------------------------- /.readthedocs.yml: -------------------------------------------------------------------------------- 1 | # .readthedocs.yaml 2 | # Read the Docs configuration file 3 | # See https://docs.readthedocs.io/en/stable/config-file/v2.html for details 4 | 5 | version: 2 6 | 7 | build: 8 | os: ubuntu-20.04 9 | tools: 10 | python: '3.10' 11 | 12 | sphinx: 13 | configuration: docs/source/conf.py 14 | 15 | python: 16 | install: 17 | - method: pip 18 | path: . 19 | extra_requirements: 20 | - docs 21 | -------------------------------------------------------------------------------- /docs/source/nhc.rst: -------------------------------------------------------------------------------- 1 | NHC storm tracks 2 | ================ 3 | 4 | The `National Hurricane Center (NHC) `_ tracks and tropical cyclones dating back to 1851. 5 | 6 | The ``nhc_storms()`` function provides a list of NHC storms from their online archive: 7 | 8 | .. autofunction:: stormevents.nhc.storms.nhc_storms 9 | 10 | ``VortexTrack`` class 11 | --------------------- 12 | 13 | .. autoclass:: stormevents.nhc.track.VortexTrack 14 | -------------------------------------------------------------------------------- /stormevents/usgs/base.py: -------------------------------------------------------------------------------- 1 | from enum import Enum 2 | 3 | 4 | class EventType(Enum): 5 | """ 6 | https://stn.wim.usgs.gov/STNServices/EventTypes.json 7 | """ 8 | 9 | RIVERINE_FLOOD = 1 10 | HURRICANE = 2 11 | DROUGHT = 3 12 | NOREASTER = 4 13 | TSUNAMI = 6 14 | TYPHOON = 7 15 | 16 | 17 | class EventStatus(Enum): 18 | """ 19 | https://stn.wim.usgs.gov/STNServices/EventStatus.json 20 | """ 21 | 22 | ACTIVE = 1 23 | COMPLETED = 2 24 | -------------------------------------------------------------------------------- /docs/source/usgs.rst: -------------------------------------------------------------------------------- 1 | USGS high water mark (HWM) surveys 2 | ================================== 3 | 4 | The `United States Geological Survey (USGS) `_ 5 | conducts surveys of flooded areas following flood events to determine the highest level of water elevation, 6 | and provides the results of these surveys via their API. 7 | 8 | list flood events that have HWM surveys 9 | --------------------------------------- 10 | 11 | .. autofunction:: stormevents.usgs.events.usgs_flood_events 12 | 13 | abstraction of a USGS flood event 14 | --------------------------------- 15 | 16 | .. autoclass:: stormevents.usgs.events.USGS_Event 17 | -------------------------------------------------------------------------------- /docs/Makefile: -------------------------------------------------------------------------------- 1 | # Minimal makefile for Sphinx documentation 2 | # 3 | 4 | # You can set these variables from the command line, and also 5 | # from the environment for the first two. 6 | SPHINXOPTS ?= 7 | SPHINXBUILD ?= sphinx-build 8 | SOURCEDIR = source 9 | BUILDDIR = build 10 | 11 | # Put it first so that "make" without argument is like "make help". 12 | help: 13 | @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) 14 | 15 | .PHONY: help Makefile 16 | 17 | # Catch-all target: route all unknown targets to Sphinx using the new 18 | # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). 19 | %: Makefile 20 | @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) 21 | -------------------------------------------------------------------------------- /docs/make.bat: -------------------------------------------------------------------------------- 1 | @ECHO OFF 2 | 3 | pushd %~dp0 4 | 5 | REM Command file for Sphinx documentation 6 | 7 | if "%SPHINXBUILD%" == "" ( 8 | set SPHINXBUILD=sphinx-build 9 | ) 10 | set SOURCEDIR=source 11 | set BUILDDIR=build 12 | 13 | if "%1" == "" goto help 14 | 15 | %SPHINXBUILD% >NUL 2>NUL 16 | if errorlevel 9009 ( 17 | echo. 18 | echo.The 'sphinx-build' command was not found. Make sure you have Sphinx 19 | echo.installed, then set the SPHINXBUILD environment variable to point 20 | echo.to the full path of the 'sphinx-build' executable. Alternatively you 21 | echo.may add the Sphinx directory to PATH. 22 | echo. 23 | echo.If you don't have Sphinx installed, grab it from 24 | echo.https://www.sphinx-doc.org/ 25 | exit /b 1 26 | ) 27 | 28 | %SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% 29 | goto end 30 | 31 | :help 32 | %SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% 33 | 34 | :end 35 | popd 36 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [project] 2 | name = "stormevents" 3 | description = "Python interfaces for observational data surrounding named storm events" 4 | authors = [ 5 | { name = "Zach Burnett", email = "zachary.r.burnett@gmail.com" }, 6 | { name = "Soroosh Mani", email = "Soroosh.Mani@noaa.gov"} 7 | ] 8 | readme = "README.md" 9 | requires-python = ">=3.6" 10 | license = { file = "LICENSE" } 11 | dependencies = [ 12 | "beautifulsoup4", 13 | "geopandas", 14 | "netcdf4", 15 | "numpy", 16 | "python-dateutil", 17 | "pandas", 18 | "pyproj >=2.6", 19 | "requests", 20 | "searvey >=0.2.0,<1.0", 21 | "shapely >=1.8", 22 | "typepigeon >=1.0.5, <2", 23 | "xarray", 24 | ] 25 | dynamic = ["version"] 26 | 27 | [project.optional-dependencies] 28 | test = ['pytest', 'pytest-cov', 'pytest-socket', 'pytest-xdist'] 29 | style = ['black', 'reorder-python-imports'] 30 | docs = ['dunamai', 'm2r2', 'sphinx<7', 'sphinx-rtd-theme', 'toml'] 31 | 32 | [project.urls] 33 | repository = 'https://github.com/oceanmodeling/StormEvents.git' 34 | documentation = 'https://stormevents.readthedocs.io' 35 | 36 | [build-system] 37 | requires = ["setuptools", "setuptools-scm", "wheel"] 38 | build-backend = "setuptools.build_meta" 39 | 40 | [tool.setuptools_scm] 41 | -------------------------------------------------------------------------------- /docs/source/installation.rst: -------------------------------------------------------------------------------- 1 | Installation 2 | ============ 3 | 4 | To install ``stormevents``, you need `Python greater than or equal to version 3.6 `_. 5 | 6 | Once you have installed Python, and presumably have ``pip`` that comes with the default installation, 7 | you can run the following command to install ``stormevents`` directly from PyPI: 8 | 9 | .. code-block:: bash 10 | 11 | pip install stormevents 12 | 13 | installing into a virtual environment 14 | ------------------------------------- 15 | 16 | The above steps detail how to install ``stormevents`` to the system Python installation. 17 | However, you might find the need to install to a virtual environment, such as an `Anaconda `_, ``virtualenv``. 18 | 19 | To set up a ``virtualenv`` environment, do the following: 20 | 21 | .. code-block:: bash 22 | 23 | pip install virtualenv 24 | mkdir ~/environments 25 | virtualenv ~/environments/stormevents 26 | source ~/environments/stormevents/bin/activate 27 | pip install stormevents 28 | 29 | Then, you can execute a Python script from this environment: 30 | 31 | .. code-block:: bash 32 | 33 | source ~/environments/stormevents/bin/activate 34 | python /path/to/python/script.py 35 | deactivate 36 | -------------------------------------------------------------------------------- /.pre-commit-config.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | default_language_version: 3 | python: "python3" 4 | fail_fast: true 5 | 6 | repos: 7 | - repo: "https://github.com/pre-commit/pre-commit-hooks" 8 | rev: "v4.2.0" 9 | hooks: 10 | - id: "check-added-large-files" 11 | - id: "check-ast" 12 | - id: "check-byte-order-marker" 13 | - id: "check-docstring-first" 14 | - id: "check-executables-have-shebangs" 15 | - id: "check-json" 16 | - id: "check-symlinks" 17 | - id: "check-merge-conflict" 18 | - id: "check-vcs-permalinks" 19 | - id: "check-xml" 20 | - id: "check-yaml" 21 | - id: "debug-statements" 22 | - id: "end-of-file-fixer" 23 | exclude: .+\.ipynb|tests/data/.+ 24 | - id: "trailing-whitespace" 25 | exclude: .+\.ipynb|tests/data/.+ 26 | 27 | - repo: https://github.com/pre-commit/pygrep-hooks 28 | rev: v1.9.0 29 | hooks: 30 | - id: python-check-blanket-noqa 31 | - id: python-check-blanket-type-ignore 32 | - id: python-use-type-annotations 33 | 34 | - repo: "https://github.com/asottile/reorder_python_imports" 35 | rev: "v3.1.0" 36 | hooks: 37 | - id: "reorder-python-imports" 38 | args: 39 | - "--py39-plus" 40 | 41 | - repo: "https://github.com/psf/black" 42 | rev: "22.3.0" 43 | hooks: 44 | - id: "black" 45 | -------------------------------------------------------------------------------- /.github/workflows/build.yml: -------------------------------------------------------------------------------- 1 | name: build 2 | 3 | on: 4 | release: 5 | types: 6 | - published 7 | 8 | jobs: 9 | build: 10 | name: build package 11 | runs-on: ubuntu-latest 12 | steps: 13 | - uses: actions/checkout@main 14 | - uses: actions/setup-python@main 15 | with: 16 | python-version: '3.x' 17 | - uses: actions/cache@main 18 | with: 19 | path: ${{ env.pythonLocation }} 20 | key: build-${{ runner.os }}-${{ env.pythonLocation }}-${{ hashFiles('pyproject.toml', 'setup.*') }} 21 | - run: pip wheel . --no-deps -w dist 22 | - uses: actions/upload-artifact@main 23 | with: 24 | name: package 25 | path: dist/ 26 | publish: 27 | name: publish package 28 | needs: [ build ] 29 | runs-on: ubuntu-latest 30 | steps: 31 | - uses: actions/checkout@main 32 | - uses: actions/setup-python@main 33 | with: 34 | python-version: '3.x' 35 | - uses: actions/cache@main 36 | with: 37 | path: ${{ env.pythonLocation }} 38 | key: build-${{ runner.os }}-${{ env.pythonLocation }}-${{ hashFiles('pyproject.toml', 'setup.*') }} 39 | - uses: actions/download-artifact@main 40 | with: 41 | name: package 42 | path: dist/ 43 | - uses: pypa/gh-action-pypi-publish@master 44 | with: 45 | user: __token__ 46 | password: ${{ secrets.PYPI_TOKEN }} 47 | -------------------------------------------------------------------------------- /.github/workflows/test_quick.yml: -------------------------------------------------------------------------------- 1 | name: quick test 2 | 3 | on: 4 | push: 5 | branches-ignore: 6 | - 'main' 7 | paths: 8 | - '**.py' 9 | - '.github/workflows/test*.yml' 10 | - 'pyproject.toml' 11 | 12 | jobs: 13 | style: 14 | name: check code style 15 | runs-on: ubuntu-latest 16 | steps: 17 | - uses: actions/checkout@main 18 | - uses: actions/setup-python@main 19 | with: 20 | python-version: '3.9' 21 | - uses: actions/cache@main 22 | id: cache 23 | with: 24 | path: ${{ env.pythonLocation }} 25 | key: style-${{ runner.os }}-${{ env.pythonLocation }}-${{ hashFiles('pyproject.toml', 'setup.*') }} 26 | - run: pip install flake8 black 27 | # stop the build if there are Python syntax errors or undefined names 28 | - run: flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics 29 | # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide 30 | - run: flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics 31 | - run: black . --check 32 | test: 33 | needs: [ style ] 34 | name: test 35 | runs-on: ubuntu-latest 36 | steps: 37 | - uses: actions/checkout@main 38 | - uses: actions/setup-python@main 39 | with: 40 | python-version: '3.9' 41 | - uses: actions/cache@main 42 | id: cache 43 | with: 44 | path: ${{ env.pythonLocation }} 45 | key: test-${{ runner.os }}-${{ env.pythonLocation }}-${{ hashFiles('pyproject.toml', 'setup.*') }} 46 | - run: pip install ".[test]" pytest-xdist 47 | - run: pytest -n auto 48 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | examples/outputs 2 | examples/data 3 | tests/data/input 4 | tests/data/output 5 | 6 | # Created by https://www.gitignore.io/api/python 7 | # Edit at https://www.gitignore.io/?templates=python 8 | 9 | ### Python ### 10 | # Byte-compiled / optimized / DLL files 11 | __pycache__/ 12 | *.py[cod] 13 | *$py.class 14 | 15 | # C extensions 16 | *.so 17 | 18 | # Distribution / packaging 19 | .Python 20 | build/ 21 | develop-eggs/ 22 | dist/ 23 | downloads/ 24 | eggs/ 25 | .eggs/ 26 | #lib/ 27 | lib64/ 28 | parts/ 29 | sdist/ 30 | var/ 31 | wheels/ 32 | pip-wheel-metadata/ 33 | share/python-wheels/ 34 | *.egg-info/ 35 | .installed.cfg 36 | *.egg 37 | MANIFEST 38 | 39 | # PyInstaller 40 | # Usually these files are written by a python script from a template 41 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 42 | *.manifest 43 | *.spec 44 | 45 | # Installer logs 46 | pip-log.txt 47 | pip-delete-this-directory.txt 48 | 49 | # Unit test / coverage reports 50 | htmlcov/ 51 | .tox/ 52 | .nox/ 53 | .coverage 54 | .coverage.* 55 | .cache 56 | nosetests.xml 57 | coverage.xml 58 | *.cover 59 | .hypothesis/ 60 | .pytest_cache/ 61 | 62 | # Translations 63 | *.mo 64 | *.pot 65 | 66 | # Django stuff: 67 | *.log 68 | local_settings.py 69 | db.sqlite3 70 | 71 | # Flask stuff: 72 | instance/ 73 | .webassets-cache 74 | 75 | # Scrapy stuff: 76 | .scrapy 77 | 78 | # Sphinx documentation 79 | docs/_build/ 80 | 81 | # PyBuilder 82 | target/ 83 | 84 | # Jupyter Notebook 85 | .ipynb_checkpoints 86 | 87 | # IPython 88 | profile_default/ 89 | ipython_config.py 90 | 91 | # pyenv 92 | .python-version 93 | 94 | # pipenv 95 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 96 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 97 | # having no cross-platform support, pipenv may install dependencies that don’t work, or not 98 | # install all needed dependencies. 99 | #Pipfile.lock 100 | 101 | # celery beat schedule file 102 | celerybeat-schedule 103 | 104 | # SageMath parsed files 105 | *.sage.py 106 | 107 | # Environments 108 | .env 109 | .venv 110 | env/ 111 | venv/ 112 | ENV/ 113 | env.bak/ 114 | venv.bak/ 115 | 116 | # Spyder project settings 117 | .spyderproject 118 | .spyproject 119 | 120 | # Rope project settings 121 | .ropeproject 122 | 123 | # mkdocs documentation 124 | /site 125 | 126 | # mypy 127 | .mypy_cache/ 128 | .dmypy.json 129 | dmypy.json 130 | 131 | # Pyre type checker 132 | .pyre/ 133 | 134 | # End of https://www.gitignore.io/api/python 135 | /.idea/ 136 | -------------------------------------------------------------------------------- /tests/test_atcf.py: -------------------------------------------------------------------------------- 1 | import pytest 2 | from datetime import datetime 3 | 4 | from stormevents.nhc.atcf import ATCF_FileDeck 5 | from stormevents.nhc.atcf import atcf_files 6 | from stormevents.nhc.atcf import ATCF_Mode 7 | from stormevents.nhc.atcf import atcf_url 8 | from stormevents.nhc.atcf import get_atcf_entry 9 | 10 | 11 | def test_atcf_url(): 12 | url_1 = atcf_url(nhc_code="AL062018") 13 | url_2 = atcf_url(mode="REALTIME", file_deck="a") 14 | url_3 = atcf_url(mode="HISTORICAL", file_deck="a", year=2018) 15 | 16 | assert url_1 == "ftp://ftp.nhc.noaa.gov/atcf/archive/2018/aal062018.dat.gz" 17 | assert url_2 == "ftp://ftp.nhc.noaa.gov/atcf/aid_public/" 18 | assert url_3 == "ftp://ftp.nhc.noaa.gov/atcf/archive/2018/" 19 | 20 | 21 | def test_atcf_nhc_codes(): 22 | # Some months of the year this will return empty, resulting in 23 | # the test to fail! Also testing for all (mode=ATCF_Mode.HISTORICAL) 24 | # can be very slow. 25 | # a_realtime = atcf_files(file_deck=ATCF_FileDeck.ADVISORY, mode=ATCF_Mode.REALTIME) 26 | # abf_realtime = atcf_files(mode=ATCF_Mode.REALTIME) 27 | # Using -2 to avoid test failure in months when the prior year's data 28 | # has not been moved to the the archive url. 29 | ref_year = datetime.now().year - 2 30 | a_historical = atcf_files( 31 | file_deck=ATCF_FileDeck.ADVISORY, mode=ATCF_Mode.HISTORICAL, year=[ref_year] 32 | ) 33 | abf_historical = atcf_files(mode=ATCF_Mode.HISTORICAL, year=[ref_year]) 34 | a_2014_2015 = atcf_files(file_deck=ATCF_FileDeck.ADVISORY, year=range(2014, 2015)) 35 | abf_2014_2015 = atcf_files(year=range(2014, 2015)) 36 | 37 | # assert len(a_realtime) > 0 38 | # assert len(abf_realtime) > 0 39 | assert len(a_historical) > 0 40 | assert len(abf_historical) > 0 41 | assert len(a_historical) < len(abf_historical) 42 | assert len(a_2014_2015) > 0 43 | assert len(abf_2014_2015) > 0 44 | 45 | 46 | def test_atcf_entry(): 47 | storm_1 = get_atcf_entry(year=2018, basin="AL", storm_number=6) 48 | storm_2 = get_atcf_entry(year=2018, storm_name="florence") 49 | 50 | with pytest.raises(ValueError): 51 | get_atcf_entry(year=2018, basin=None, storm_name=None, storm_number=None) 52 | with pytest.raises(ValueError): 53 | get_atcf_entry(year=2018, basin="EP", storm_name="nonexistent") 54 | with pytest.raises(ValueError): 55 | get_atcf_entry(year=2018, basin="EP", storm_number=99) 56 | 57 | assert get_atcf_entry(year=2020, storm_name="BETA")["name"] == "BETA" 58 | assert get_atcf_entry(year=2020, storm_name="ETA")["name"] == "ETA" 59 | 60 | assert storm_1["name"] == "FLORENCE" 61 | assert storm_2["basin"] == "AL" and storm_2["number"] == 6 62 | -------------------------------------------------------------------------------- /tests/test_utilities.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from datetime import timedelta 3 | 4 | import numpy 5 | import pytest 6 | 7 | from stormevents.utilities import relative_to_time_interval 8 | from stormevents.utilities import subset_time_interval 9 | 10 | 11 | def test_subset_time_interval(): 12 | interval_1 = subset_time_interval( 13 | datetime(2020, 1, 1), 14 | datetime(2021, 1, 1), 15 | datetime(2020, 2, 1), 16 | datetime(2020, 11, 1), 17 | ) 18 | interval_2 = subset_time_interval( 19 | "2020-01-01", "2021-01-01", "2020-02-01", "2020-11-01" 20 | ) 21 | interval_3 = subset_time_interval( 22 | "2020-01-01", "2021-01-01", "2020-02-01", -1 * 31 * 24 * 60 * 60 23 | ) 24 | 25 | with pytest.raises(ValueError): 26 | subset_time_interval("2021-01-01", "2020-01-01", "2020-02-01", "2020-11-01") 27 | 28 | with pytest.raises(ValueError): 29 | subset_time_interval("2020-01-01", "2021-01-01", "2020-11-01", "2020-02-01") 30 | 31 | with pytest.raises(ValueError): 32 | subset_time_interval(None, "2021-01-01", "2020-02-01", "2020-11-01") 33 | 34 | with pytest.raises(ValueError): 35 | subset_time_interval("2020-01-01", numpy.nan, "2020-02-01", "2020-11-01") 36 | 37 | assert interval_1 == (datetime(2020, 2, 1), datetime(2020, 11, 1)) 38 | assert interval_2 == (datetime(2020, 2, 1), datetime(2020, 11, 1)) 39 | assert interval_3 == (datetime(2020, 2, 1), datetime(2020, 12, 1)) 40 | 41 | 42 | def test_relative_to_time_interval(): 43 | time_1 = relative_to_time_interval( 44 | datetime(2020, 1, 1), 45 | datetime(2021, 1, 1), 46 | datetime(2020, 2, 1), 47 | ) 48 | time_2 = relative_to_time_interval("2020-01-01", "2021-01-01", "2020-02-01") 49 | time_3 = relative_to_time_interval( 50 | "2020-01-01", "2021-01-01", timedelta(days=30 * 3) 51 | ) 52 | time_4 = relative_to_time_interval("2020-01-01", "2021-01-01", 5 * 24 * 60 * 60) 53 | 54 | with pytest.raises(ValueError): 55 | relative_to_time_interval("2021-01-01", "2020-01-01", "2020-02-01") 56 | 57 | with pytest.raises(ValueError): 58 | relative_to_time_interval("2021-01-01", "2020-01-01", "2020-02-01") 59 | 60 | with pytest.raises(ValueError): 61 | relative_to_time_interval("2020-01-01", "2021-01-01", "2021-02-01") 62 | 63 | with pytest.raises(ValueError): 64 | relative_to_time_interval("2020-01-01", "2021-01-01", None) 65 | 66 | with pytest.raises(ValueError): 67 | relative_to_time_interval(numpy.nan, "2021-01-01", "2020-02-01") 68 | 69 | assert time_1 == datetime(2020, 2, 1) 70 | assert time_2 == datetime(2020, 2, 1) 71 | assert time_3 == datetime(2020, 3, 31) 72 | assert time_4 == datetime(2020, 1, 6) 73 | -------------------------------------------------------------------------------- /.github/workflows/test.yml: -------------------------------------------------------------------------------- 1 | name: test 2 | 3 | on: 4 | push: 5 | branches: 6 | - 'main' 7 | paths: 8 | - '**.py' 9 | - '.github/workflows/test*.yml' 10 | - 'pyproject.toml' 11 | pull_request: 12 | paths: 13 | - '**.py' 14 | - '.github/workflows/test*.yml' 15 | - 'pyproject.toml' 16 | 17 | jobs: 18 | style: 19 | name: check code style 20 | runs-on: ubuntu-latest 21 | steps: 22 | - uses: actions/checkout@main 23 | - uses: actions/setup-python@main 24 | with: 25 | python-version: '3.9' 26 | - uses: actions/cache@main 27 | id: cache 28 | with: 29 | path: ${{ env.pythonLocation }} 30 | key: style-${{ runner.os }}-${{ env.pythonLocation }}-${{ hashFiles('pyproject.toml', 'setup.*') }} 31 | - run: pip install flake8 black 32 | # stop the build if there are Python syntax errors or undefined names 33 | - run: flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics 34 | # exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide 35 | - run: flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics 36 | - run: black . --check 37 | test: 38 | needs: [ style ] 39 | name: test Python ${{ matrix.python }} on ${{ matrix.os }} 40 | runs-on: ${{ matrix.os }} 41 | strategy: 42 | matrix: 43 | os: [ ubuntu-latest ] 44 | python: [ '3.9', '3.10', '3.11' ] 45 | steps: 46 | - uses: actions/checkout@main 47 | - uses: actions/setup-python@main 48 | with: 49 | python-version: ${{ matrix.python }} 50 | - uses: actions/cache@main 51 | id: cache 52 | with: 53 | path: ${{ env.pythonLocation }} 54 | key: test-${{ runner.os }}-${{ env.pythonLocation }}-${{ hashFiles('pyproject.toml', 'setup.*') }} 55 | - run: pip install ".[test]" pytest-xdist 56 | - run: pytest -n auto 57 | test_with_coverage: 58 | needs: [ style, test ] 59 | name: test with code coverage 60 | runs-on: ubuntu-latest 61 | steps: 62 | - uses: actions/checkout@main 63 | - uses: actions/setup-python@main 64 | with: 65 | python-version: '3.10' 66 | - uses: actions/cache@main 67 | id: cache 68 | with: 69 | path: ${{ env.pythonLocation }} 70 | key: test-${{ runner.os }}-${{ env.pythonLocation }}-${{ hashFiles('pyproject.toml', 'setup.*') }} 71 | - run: pip install ".[test]" pytest-cov pytest-xdist 72 | - run: pytest --cov . --cov-report xml:coverage.xml 73 | - run: coverage report -m 74 | - uses: codecov/codecov-action@main 75 | with: 76 | token: ${{ secrets.CODECOV_TOKEN }} 77 | files: coverage.xml 78 | fail_ci_if_error: false 79 | -------------------------------------------------------------------------------- /tests/__init__.py: -------------------------------------------------------------------------------- 1 | import os 2 | import re 3 | from os import PathLike 4 | from pathlib import Path 5 | from typing import Dict 6 | from typing import List 7 | 8 | import pytest 9 | import xarray 10 | 11 | from stormevents.nhc.storms import nhc_storms 12 | from stormevents.nhc.storms import nhc_storms_archive 13 | 14 | DATA_DIRECTORY = Path(__file__).parent.absolute().resolve() / "data" 15 | INPUT_DIRECTORY = DATA_DIRECTORY / "input" 16 | OUTPUT_DIRECTORY = DATA_DIRECTORY / "output" 17 | REFERENCE_DIRECTORY = DATA_DIRECTORY / "reference" 18 | 19 | 20 | @pytest.fixture(scope="session", autouse=True) 21 | def cache_nhc_storms(): 22 | nhc_storms() 23 | nhc_storms_archive() 24 | 25 | 26 | def check_reference_directory( 27 | test_directory: PathLike, 28 | reference_directory: PathLike, 29 | skip_lines: Dict[str, List[int]] = None, 30 | ): 31 | if not isinstance(test_directory, Path): 32 | test_directory = Path(test_directory) 33 | if not isinstance(reference_directory, Path): 34 | reference_directory = Path(reference_directory) 35 | if skip_lines is None: 36 | skip_lines = {} 37 | 38 | for reference_filename in reference_directory.iterdir(): 39 | if reference_filename.is_dir(): 40 | check_reference_directory( 41 | test_directory / reference_filename.name, reference_filename, skip_lines 42 | ) 43 | else: 44 | test_filename = test_directory / reference_filename.name 45 | 46 | if reference_filename.suffix in [".h5", ".nc"]: 47 | reference_filesize = Path(reference_filename).stat().st_size 48 | test_filesize = Path(test_filename).stat().st_size 49 | 50 | assert ( 51 | reference_filesize == test_filesize 52 | ), f'"{test_filesize}" != "{reference_filesize}"\n{test_filesize - reference_filesize}' 53 | 54 | assert xarray.open_dataset(test_filename) == xarray.open_dataset( 55 | reference_filename 56 | ) 57 | else: 58 | with open(test_filename) as test_file, open( 59 | reference_filename 60 | ) as reference_file: 61 | test_lines = list(test_file.readlines()) 62 | reference_lines = list(reference_file.readlines()) 63 | 64 | lines_to_skip = set() 65 | for file_mask, line_indices in skip_lines.items(): 66 | if ( 67 | file_mask in str(test_filename) 68 | or re.match(file_mask, str(test_filename)) 69 | and len(test_lines) > 0 70 | ): 71 | try: 72 | lines_to_skip.update( 73 | line_index % len(test_lines) 74 | for line_index in line_indices 75 | ) 76 | except ZeroDivisionError: 77 | continue 78 | 79 | for line_index in sorted(lines_to_skip, reverse=True): 80 | del test_lines[line_index], reference_lines[line_index] 81 | 82 | cwd = Path.cwd() 83 | assert "\n".join(test_lines) == "\n".join( 84 | reference_lines 85 | ), f'"{os.path.relpath(test_filename, cwd)}" != "{os.path.relpath(reference_filename, cwd)}"' 86 | -------------------------------------------------------------------------------- /tests/test_usgs.py: -------------------------------------------------------------------------------- 1 | import sys 2 | 3 | import pytest 4 | 5 | from stormevents.usgs import USGS_Event 6 | from stormevents.usgs import usgs_flood_events 7 | from stormevents.usgs import usgs_flood_storms 8 | from stormevents.usgs import USGS_StormEvent 9 | from stormevents.usgs.base import EventStatus 10 | from stormevents.usgs.base import EventType 11 | from stormevents.usgs.highwatermarks import HighWaterMarksQuery 12 | from tests import check_reference_directory 13 | from tests import INPUT_DIRECTORY 14 | from tests import OUTPUT_DIRECTORY 15 | from tests import REFERENCE_DIRECTORY 16 | 17 | 18 | @pytest.mark.skipif( 19 | sys.version_info < (3, 10), 20 | reason="difference in datetime format before Python 3.10", 21 | ) 22 | def test_usgs_flood_events(): 23 | reference_directory = REFERENCE_DIRECTORY / "test_usgs_flood_events" 24 | output_directory = OUTPUT_DIRECTORY / "test_usgs_flood_events" 25 | 26 | if not output_directory.exists(): 27 | output_directory.mkdir(parents=True, exist_ok=True) 28 | 29 | usgs_flood_events(event_status=EventStatus.COMPLETED) 30 | 31 | events = usgs_flood_events( 32 | year=tuple(range(2003, 2020 + 1)), 33 | event_type=EventType.HURRICANE, 34 | event_status=EventStatus.COMPLETED, 35 | ) 36 | 37 | events.to_csv(output_directory / "events.csv") 38 | 39 | check_reference_directory(output_directory, reference_directory) 40 | 41 | 42 | @pytest.mark.skipif( 43 | sys.version_info < (3, 10), 44 | reason="difference in datetime format before Python 3.10", 45 | ) 46 | def test_usgs_flood_storms(): 47 | reference_directory = REFERENCE_DIRECTORY / "test_usgs_flood_storms" 48 | output_directory = OUTPUT_DIRECTORY / "test_usgs_flood_storms" 49 | 50 | if not output_directory.exists(): 51 | output_directory.mkdir(parents=True, exist_ok=True) 52 | 53 | storms = usgs_flood_storms(year=tuple(range(2003, 2020 + 1))) 54 | 55 | storms.to_csv(output_directory / "storms.csv") 56 | 57 | check_reference_directory(output_directory, reference_directory) 58 | 59 | 60 | @pytest.mark.skipif( 61 | sys.version_info < (3, 10), 62 | reason="difference in datetime format before Python 3.10", 63 | ) 64 | def test_usgs_flood_event(): 65 | input_directory = INPUT_DIRECTORY / "test_usgs_flood_event" 66 | reference_directory = REFERENCE_DIRECTORY / "test_usgs_flood_event" 67 | output_directory = OUTPUT_DIRECTORY / "test_usgs_flood_event" 68 | 69 | if not output_directory.exists(): 70 | output_directory.mkdir(parents=True, exist_ok=True) 71 | 72 | flood_1 = USGS_Event.from_csv(input_directory / "florence2018.csv") 73 | flood_2 = USGS_Event.from_name("2017 Irma") 74 | 75 | with pytest.raises(ValueError): 76 | USGS_StormEvent.from_name("nonexistent") 77 | 78 | assert flood_2.high_water_marks().shape == (506, 53) 79 | assert flood_1 != flood_2 80 | flood_1.high_water_marks().to_csv(output_directory / "florence2018.csv") 81 | 82 | check_reference_directory(output_directory, reference_directory) 83 | 84 | 85 | def test_usgs_high_water_marks_query(): 86 | query_1 = HighWaterMarksQuery(182) 87 | query_2 = HighWaterMarksQuery(23, quality="EXCELLENT") 88 | query_3 = HighWaterMarksQuery("nonexistent") 89 | 90 | assert len(query_1.data) == 506 91 | assert len(query_2.data) == 148 92 | 93 | with pytest.raises(ValueError): 94 | query_3.data 95 | 96 | query_1.quality = "EXCELLENT", "GOOD" 97 | query_2.quality = "EXCELLENT", "GOOD" 98 | query_3.quality = "EXCELLENT", "GOOD" 99 | 100 | assert len(query_1.data) == 277 101 | assert len(query_2.data) == 628 102 | 103 | with pytest.raises(ValueError): 104 | query_3.data 105 | 106 | query_3.event_id = 189 107 | 108 | assert len(query_3.data) == 116 109 | -------------------------------------------------------------------------------- /tests/data/reference/test_usgs_flood_events/events.csv: -------------------------------------------------------------------------------- 1 | usgs_id,name,year,description,event_type,event_status,coordinator,instruments,last_updated,last_updated_by,start_date,end_date 2 | 7,FEMA 2013 exercise,2013,Ardent/Sentry 2013 FEMA Exercise,HURRICANE,COMPLETED,36,[],,,2013-05-15 04:00:00,2013-05-23 04:00:00 3 | 8,2005 Wilma,2005,"Category 3 in west FL. 4 | Hurricane Wilma was the most intense tropical cyclone ever recorded in the Atlantic basin. Part of the record breaking 2005 Atlantic hurricane season.",HURRICANE,COMPLETED,515,[],2023-12-19 20:47:51.435776,1.0,2005-10-20 04:00:00,2005-10-31 05:00:00 5 | 18,2012 Isaac,2012,historical hurricane data loaded by the data archive team,HURRICANE,COMPLETED,36,[],2022-09-09 14:57:23.815290,2062.0,2012-08-27 04:00:00,2012-09-02 04:00:00 6 | 19,2005 Rita,2005,historical hurricane data loaded by the data archive team,HURRICANE,COMPLETED,515,[],2022-09-08 20:10:38.533682,1.0,2005-09-23 04:00:00,2005-09-25 04:00:00 7 | 23,2011 Irene,2011,historical hurricane data loaded by the data archive team,HURRICANE,COMPLETED,36,[],2022-09-09 15:04:03.637296,2062.0,2011-08-26 04:00:00,2011-08-29 04:00:00 8 | 24,2012 Sandy,2012,historical hurricane data loaded by the data archive team,HURRICANE,COMPLETED,36,[],2022-09-09 15:04:13.715276,2062.0,2012-10-21 04:00:00,2012-10-30 04:00:00 9 | 25,2008 Gustav,2008,historical hurricane data loaded by the data archive team,HURRICANE,COMPLETED,515,[],2022-09-09 15:04:24.293240,2062.0,2008-08-31 04:00:00,2008-09-03 04:00:00 10 | 26,2008 Ike,2008,historical hurricane data loaded by the data archive team,HURRICANE,COMPLETED,515,[],2022-09-09 15:04:47.855383,2062.0,2008-09-11 04:00:00,2008-09-12 04:00:00 11 | 119,2015 Joaquin,2015,Hurricane/Tropical storm with intense waves predicted in the Atlantic,HURRICANE,COMPLETED,36,[],2022-09-09 16:08:59.765383,2062.0,2015-10-01 04:00:00,2015-10-08 04:00:00 12 | 131,2016 Hermine,2016,Small deployment of Initial landfall of Hermine is in the Big Bend area of FL to assist NWS modeling,HURRICANE,COMPLETED,3,[],2022-09-09 16:23:30.939594,2062.0,2016-09-01 04:00:00,2016-09-07 04:00:00 13 | 133,2003 Isabel,2003,"Hurricane Isabel formed near the Cape Verde Islands from a tropical wave on Sep. 6 and reached peak winds of 165 mph (265 km/h) on Sep. 11. It made landfall on Sep. 18 in North Carolina, killing 16 and damaging over $5 billion of property.",HURRICANE,COMPLETED,515,[],2022-09-09 16:24:28.501226,2062.0,2003-09-06 04:00:00,2003-09-30 04:00:00 14 | 135,2016 Matthew,2016,Hurricane Matthew,HURRICANE,COMPLETED,35,[],2022-09-09 16:25:00.672612,2062.0,2016-10-03 04:00:00,2016-10-30 04:00:00 15 | 180,2017 Harvey,2017,Hurricane Harvey Texas Coast August 2017,HURRICANE,COMPLETED,35,[],2022-09-09 17:27:26.943616,2062.0,2017-08-24 04:00:00,2017-09-24 04:00:00 16 | 182,2017 Irma,2017,"Hurricane affecting PR, USVI and maybe mainland US",HURRICANE,COMPLETED,36,[],2022-09-09 17:28:15.677235,2062.0,2017-09-03 04:00:00,2017-09-30 04:00:00 17 | 189,2017 Maria,2017,TD15,HURRICANE,COMPLETED,36,[],2022-09-09 19:06:47.524544,2062.0,2017-09-17 04:00:00,2017-10-02 04:00:00 18 | 190,2017 Jose,2017,Tropical storm impacting the northeast us,HURRICANE,COMPLETED,36,[],2022-09-09 19:07:05.868050,2062.0,2017-09-18 04:00:00,2017-09-25 04:00:00 19 | 196,2017 Nate,2017,TD16 will be developing into Nate. North Gulf deployment,HURRICANE,COMPLETED,36,[],2022-09-09 19:08:52.507058,2062.0,2017-10-05 04:00:00,2017-10-14 04:00:00 20 | 247,Atlantic Fury Exercise May 2018,2018,"*** Mock Data *** for interagency exercise around Hampton Roads, Virginia during the first two weeks of May, 2018",HURRICANE,COMPLETED,35,[],2018-09-07 15:06:34.421058,35.0,2018-04-23 05:00:00,2018-05-18 05:00:00 21 | 284,2018 Isaac,2018,,HURRICANE,COMPLETED,3,[],2022-09-09 19:33:02.531819,2062.0,2018-09-11 04:00:00,2018-09-18 04:00:00 22 | 287,2018 Michael,2018,storm hit the Mexico Beach area of the Florida panhandle,HURRICANE,COMPLETED,3,[],2022-09-09 19:32:14.235677,2062.0,2018-10-08 04:00:00,2018-10-15 04:00:00 23 | -------------------------------------------------------------------------------- /stormevents/nhc/const.py: -------------------------------------------------------------------------------- 1 | from enum import Enum, auto 2 | 3 | from numpy import isnan, array, argwhere 4 | from pandas import DataFrame 5 | 6 | 7 | class RMWFillMethod(Enum): 8 | none = None 9 | persistent = auto() 10 | regression_penny_2023_with_smoothing = auto() 11 | regression_penny_2023 = regression_penny_2023_with_smoothing 12 | regression_penny_2023_no_smoothing = auto() 13 | 14 | 15 | # Bias correction values for the Rmax forecast 16 | # ref: Penny et al. (2023). https://doi.org/10.1175/WAF-D-22-0209.1 17 | bias_lat = [ 18 | 0.0063, 19 | 0.0301, 20 | 0.0299, 21 | 0.0085, 22 | -0.0199, 23 | -0.0354, 24 | -0.0799, 25 | -0.1240, 26 | -0.1572, 27 | -0.1982, 28 | -0.1706, 29 | ] 30 | 31 | bias_vmax = [ 32 | -0.8047, 33 | -0.2003, 34 | -0.2001, 35 | -0.4070, 36 | -0.6271, 37 | -0.7515, 38 | -0.3369, 39 | -0.3338, 40 | -0.3930, 41 | -0.8167, 42 | -1.4322, 43 | ] 44 | 45 | bias_r34 = [ 46 | -2.0503, 47 | -5.5195, 48 | -7.7374, 49 | -8.4337, 50 | -8.1458, 51 | -10.2065, 52 | -12.6435, 53 | 0, 54 | 0, 55 | 0, 56 | 0, 57 | ] 58 | 59 | bias_r50 = [ 60 | -0.7659, 61 | -3.2270, 62 | -4.5476, 63 | -6.2219, 64 | -7.7406, 65 | -8.5449, 66 | -10.0759, 67 | 0, 68 | 0, 69 | 0, 70 | 0, 71 | ] 72 | 73 | bias_r64 = [ 74 | -0.5082, 75 | -2.4170, 76 | -3.6993, 77 | -4.7795, 78 | 0, 79 | 0, 80 | 0, 81 | 0, 82 | 0, 83 | 0, 84 | 0, 85 | ] 86 | 87 | RMW_bias_correction = DataFrame( 88 | index=range(0, 132, 12), 89 | data={ 90 | "latitude": bias_lat, 91 | "max_sustained_wind_speed": bias_vmax, 92 | "isotach_radius_34": bias_r34, 93 | "isotach_radius_50": bias_r50, 94 | "isotach_radius_64": bias_r64, 95 | }, 96 | ) 97 | 98 | # Regression coefficients for the Rmax forecast 99 | # ref: Penny et al. (2023). https://doi.org/10.1175/WAF-D-22-0209.1 100 | fhrs = [12, 24, 36, 48, 72, 96, 120] 101 | RMW_regression_coefs = { 102 | 3: [ # a0 #a1 #a2 #a3 #a4 #a5 #a6 103 | [3.1894, 0.3524, 0.1208, -0.1091, 0.5862, -0.8070, 0.0057], 104 | [4.4373, 0.1473, 0.1045, -0.1112, 0.7566, -1.0689, 0.0061], 105 | [4.9447, 0.0784, 0.1168, -0.1448, 0.8246, -1.1709, 0.0059], 106 | [5.1818, 0.0549, 0.1335, -0.2345, 0.8972, -1.2038, 0.0063], 107 | ], 108 | 2: [ # a0 #a1 #a2 #a3 #a5 #a6 109 | [3.1131, 0.3680, 0.1589, 0.4710, -0.9111, 0.0068], 110 | [4.1567, 0.1834, 0.2085, 0.5873, -1.1841, 0.0073], 111 | [4.6694, 0.1062, 0.2330, 0.6295, -1.3122, 0.0074], 112 | [4.9434, 0.0459, 0.3027, 0.5828, -1.3675, 0.0079], 113 | [4.7906, 0.0157, 0.3953, 0.5321, -1.3617, 0.0067], 114 | ], 115 | 1: [ # a0 #a1 #a2 #a5 #a6 116 | [2.6272, 0.4230, 0.6320, -0.9117, 0.0064], 117 | [3.6525, 0.2142, 0.8222, -1.2158, 0.0082], 118 | [4.2822, 0.0884, 0.9059, -1.3656, 0.0091], 119 | [4.7700, -0.0042, 0.9225, -1.4349, 0.0102], 120 | [4.7307, -0.0365, 0.9153, -1.3882, 0.0086], 121 | ], 122 | 0: [ # a0 #a1 #a5 #a6 123 | [2.1633, 0.6360, -0.3314, 0.0154], 124 | [3.7884, 0.3953, -0.5738, 0.0219], 125 | [5.0213, 0.1999, -0.7481, 0.0276], 126 | [5.8092, 0.0615, -0.8508, 0.0318], 127 | [6.3321, -0.0362, -0.9079, 0.0343], 128 | [6.6181, 0.0041, -0.9599, 0.0295], 129 | [6.7073, -0.0028, -0.9478, 0.0257], 130 | ], 131 | } 132 | 133 | 134 | def get_RMW_regression_coefs(fcst_hr, radii_values): 135 | num_radii_available = (~isnan(radii_values)).sum() 136 | coefs_by_radii_available = array(RMW_regression_coefs[num_radii_available]) 137 | fcst_index = argwhere(fhrs == fcst_hr) 138 | if fcst_index.size == 0 or fcst_index > coefs_by_radii_available.shape[0] - 1: 139 | return coefs_by_radii_available[-1].flatten() 140 | else: 141 | return coefs_by_radii_available[fcst_index].flatten() 142 | -------------------------------------------------------------------------------- /docs/source/conf.py: -------------------------------------------------------------------------------- 1 | # Configuration file for the Sphinx documentation builder. 2 | # 3 | # This file only contains a selection of the most common options. For a full 4 | # list see the documentation: 5 | # https://www.sphinx-doc.org/en/master/usage/configuration.html 6 | # -- Path setup -------------------------------------------------------------- 7 | # If extensions (or modules to document with autodoc) are in another directory, 8 | # add these directories to sys.path here. If the directory is relative to the 9 | # documentation root, use os.path.abspath to make it absolute, like shown here. 10 | import os 11 | import subprocess 12 | import sys 13 | from datetime import datetime 14 | from os import PathLike 15 | from pathlib import Path 16 | 17 | import toml as toml 18 | from dunamai import Version 19 | 20 | 21 | def repository_root(path: PathLike = None) -> Path: 22 | if path is None: 23 | path = __file__ 24 | if not isinstance(path, Path): 25 | path = Path(path) 26 | if path.is_file(): 27 | path = path.parent 28 | if ".git" in (child.name for child in path.iterdir()) or path == path.parent: 29 | return path 30 | else: 31 | return repository_root(path.parent) 32 | 33 | 34 | sys.path.insert(0, str(repository_root())) 35 | 36 | subprocess.run( 37 | f"{sys.executable} -m pip install -U pip", 38 | shell=True, 39 | stdout=subprocess.DEVNULL, 40 | stderr=subprocess.DEVNULL, 41 | ) 42 | 43 | # -- Project information ----------------------------------------------------- 44 | metadata = toml.load("../../pyproject.toml")["project"] 45 | 46 | project = metadata["name"] 47 | author = ", ".join([m["name"] for m in metadata["authors"]]) 48 | copyright = f"{datetime.today().year}, {author}" 49 | 50 | # The full version, including alpha/beta/rc tags 51 | try: 52 | release = Version.from_any_vcs().serialize() 53 | except RuntimeError: 54 | release = os.environ.get("VERSION") 55 | 56 | # -- General configuration --------------------------------------------------- 57 | 58 | autoclass_content = "both" # include both class docstring and __init__ 59 | autodoc_default_options = { 60 | # Make sure that any autodoc declar 61 | # ations show the right members 62 | "members": True, 63 | "inherited-members": True, 64 | "private-members": True, 65 | "member-order": "bysource", 66 | "exclude-members": "__weakref__", 67 | } 68 | autosummary_generate = True # Make _autosummary files and include them 69 | napoleon_numpy_docstring = False # Force consistency, leave only Google 70 | napoleon_use_rtype = False # More legible 71 | 72 | # Add any Sphinx extension module names here, as strings. They can be 73 | # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom 74 | # ones. 75 | extensions = [ 76 | # Need the autodoc and autosummary packages to generate our docs. 77 | "sphinx.ext.autodoc", 78 | "sphinx.ext.autosummary", 79 | # The Napoleon extension allows for nicer argument formatting. 80 | "sphinx.ext.napoleon", 81 | "m2r2", 82 | ] 83 | 84 | # Add any paths that contain templates here, relative to this directory. 85 | templates_path = ["_templates"] 86 | 87 | # List of patterns, relative to source directory, that match files and 88 | # directories to ignore when looking for source files. 89 | # This pattern also affects html_static_path and html_extra_path. 90 | exclude_patterns = [] 91 | 92 | # -- Options for HTML output ------------------------------------------------- 93 | 94 | # The theme to use for HTML and HTML Help pages. See the documentation for 95 | # a list of builtin themes. 96 | # 97 | html_theme = "sphinx_rtd_theme" 98 | 99 | # Add any paths that contain custom static files (such as style sheets) here, 100 | # relative to this directory. They are copied after the builtin static files, 101 | # so a file named "default.css" will overwrite the builtin "default.css". 102 | html_static_path = ["_static"] 103 | 104 | # -- Extension configuration ------------------------------------------------- 105 | source_suffix = [".rst", ".md"] 106 | bibtex_bibfiles = ["references.bib"] 107 | -------------------------------------------------------------------------------- /stormevents/utilities.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from datetime import timedelta 3 | from numbers import Number 4 | from typing import Union 5 | 6 | import pandas 7 | import typepigeon 8 | 9 | 10 | def subset_time_interval( 11 | start: datetime, 12 | end: datetime, 13 | subset_start: Union[datetime, timedelta] = None, 14 | subset_end: Union[datetime, timedelta] = None, 15 | ) -> (datetime, datetime): 16 | """ 17 | constrain the given time interval to the given subset times 18 | 19 | :param start: start of larger time interval that will be subsetted 20 | :param end: end of larger time interval that will be subsetted 21 | :param subset_start: either an absolute date time or a relative time delta; positive time delta adds to the start time, negative time delta subtracts from the end time 22 | :param subset_end: either an absolute date time or a relative time delta; positive time delta adds to the start time, negative time delta subtracts from the end time 23 | :return: constrained time interval 24 | """ 25 | 26 | if pandas.isna([start, end]).any(): 27 | raise ValueError(f'cannot parse time interval "{start} - {end}"') 28 | 29 | if not isinstance(start, datetime): 30 | start = typepigeon.convert_value(start, datetime) 31 | if not isinstance(end, datetime): 32 | end = typepigeon.convert_value(end, datetime) 33 | 34 | if start > end: 35 | raise ValueError(f'given start time ("{start}") ' f'exceeds end time ("{end}")') 36 | 37 | if not pandas.isna(subset_start): 38 | try: 39 | subset_start = relative_to_time_interval(start, end, subset_start) 40 | except ValueError: 41 | subset_start = start 42 | else: 43 | subset_start = start 44 | 45 | if not pandas.isna(subset_end): 46 | try: 47 | subset_end = relative_to_time_interval(start, end, subset_end) 48 | except ValueError: 49 | subset_end = end 50 | else: 51 | subset_end = end 52 | 53 | if subset_start > subset_end: 54 | raise ValueError( 55 | f'subset start time ("{subset_start}") ' 56 | f'exceeds subset end time ("{subset_end}")' 57 | ) 58 | 59 | if start <= subset_start <= end and start <= subset_end <= end: 60 | return subset_start, subset_end 61 | else: 62 | raise ValueError( 63 | f'subsetted time interval ("{subset_start} - {subset_end}") ' 64 | f'exceeds existing time interval ("{start} - {end}")' 65 | ) 66 | 67 | 68 | def relative_to_time_interval( 69 | start: datetime, 70 | end: datetime, 71 | relative: Union[datetime, timedelta], 72 | ) -> datetime: 73 | """ 74 | return the absolute time relative to the time interval 75 | 76 | :param start: start of time interval 77 | :param end: end of time interval 78 | :param relative: either an absolute date time or a relative time delta; positive time delta adds to the start time, negative time delta subtracts from the end time 79 | :return: absolute datetime relative to the time interval 80 | """ 81 | 82 | if pandas.isna([start, end, relative]).any(): 83 | raise ValueError( 84 | f'cannot parse time interval "{start} - {end}" ir relative time "{relative}"' 85 | ) 86 | 87 | if not isinstance(start, datetime): 88 | start = typepigeon.convert_value(start, datetime) 89 | if not isinstance(end, datetime): 90 | end = typepigeon.convert_value(end, datetime) 91 | 92 | if start > end: 93 | raise ValueError(f'given start time ("{start}") ' f'exceeds end time ("{end}")') 94 | 95 | if isinstance(relative, timedelta) or isinstance(relative, Number): 96 | relative = typepigeon.convert_value(relative, timedelta) 97 | if relative >= timedelta(0): 98 | relative = start + relative 99 | else: 100 | relative = end + relative 101 | elif not isinstance(relative, datetime): 102 | relative = typepigeon.convert_value(relative, datetime) 103 | 104 | if start <= relative <= end: 105 | return relative 106 | else: 107 | raise ValueError( 108 | f'relative time "{relative}" ' 109 | f'not within given time interval ("{start} - {end}")' 110 | ) 111 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | [*] 2 | charset = utf-8 3 | end_of_line = lf 4 | indent_size = 4 5 | indent_style = space 6 | insert_final_newline = true 7 | max_line_length = 127 8 | tab_width = 4 9 | ij_continuation_indent_size = 8 10 | ij_formatter_off_tag = @formatter:off 11 | ij_formatter_on_tag = @formatter:on 12 | ij_formatter_tags_enabled = false 13 | ij_smart_tabs = false 14 | ij_visual_guides = 79, 127 15 | ij_wrap_on_typing = false 16 | 17 | [.editorconfig] 18 | ij_editorconfig_align_group_field_declarations = false 19 | ij_editorconfig_space_after_colon = false 20 | ij_editorconfig_space_after_comma = true 21 | ij_editorconfig_space_before_colon = false 22 | ij_editorconfig_space_before_comma = false 23 | ij_editorconfig_spaces_around_assignment_operators = true 24 | 25 | [{*.bash, *.job, *.sh, *.zsh}] 26 | indent_size = 2 27 | tab_width = 2 28 | ij_shell_binary_ops_start_line = false 29 | ij_shell_keep_column_alignment_padding = false 30 | ij_shell_minify_program = false 31 | ij_shell_redirect_followed_by_space = false 32 | ij_shell_switch_cases_indented = false 33 | 34 | [{*.py, *.pyw, soundings}] 35 | max_line_length = 79 36 | ij_python_align_collections_and_comprehensions = true 37 | ij_python_align_multiline_imports = true 38 | ij_python_align_multiline_parameters = true 39 | ij_python_align_multiline_parameters_in_calls = true 40 | ij_python_blank_line_at_file_end = true 41 | ij_python_blank_lines_after_imports = 1 42 | ij_python_blank_lines_after_local_imports = 0 43 | ij_python_blank_lines_around_class = 1 44 | ij_python_blank_lines_around_method = 1 45 | ij_python_blank_lines_around_top_level_classes_functions = 2 46 | ij_python_blank_lines_before_first_method = 0 47 | ij_python_dict_alignment = 0 48 | ij_python_dict_new_line_after_left_brace = false 49 | ij_python_dict_new_line_before_right_brace = false 50 | ij_python_dict_wrapping = 5 51 | ij_python_from_import_new_line_after_left_parenthesis = false 52 | ij_python_from_import_new_line_before_right_parenthesis = false 53 | ij_python_from_import_parentheses_force_if_multiline = false 54 | ij_python_from_import_trailing_comma_if_multiline = false 55 | ij_python_from_import_wrapping = 1 56 | ij_python_hang_closing_brackets = false 57 | ij_python_keep_blank_lines_in_code = 1 58 | ij_python_keep_blank_lines_in_declarations = 1 59 | ij_python_keep_indents_on_empty_lines = false 60 | ij_python_keep_line_breaks = true 61 | ij_python_new_line_after_colon = false 62 | ij_python_new_line_after_colon_multi_clause = true 63 | ij_python_optimize_imports_always_split_from_imports = false 64 | ij_python_optimize_imports_case_insensitive_order = false 65 | ij_python_optimize_imports_join_from_imports_with_same_source = true 66 | ij_python_optimize_imports_sort_by_type_first = false 67 | ij_python_optimize_imports_sort_imports = true 68 | ij_python_optimize_imports_sort_names_in_from_imports = true 69 | ij_python_space_after_comma = true 70 | ij_python_space_after_number_sign = true 71 | ij_python_space_after_py_colon = true 72 | ij_python_space_before_backslash = true 73 | ij_python_space_before_comma = false 74 | ij_python_space_before_for_semicolon = false 75 | ij_python_space_before_lbracket = false 76 | ij_python_space_before_method_call_parentheses = false 77 | ij_python_space_before_method_parentheses = false 78 | ij_python_space_before_number_sign = true 79 | ij_python_space_before_py_colon = false 80 | ij_python_space_within_empty_method_call_parentheses = false 81 | ij_python_space_within_empty_method_parentheses = false 82 | ij_python_spaces_around_additive_operators = true 83 | ij_python_spaces_around_assignment_operators = true 84 | ij_python_spaces_around_bitwise_operators = true 85 | ij_python_spaces_around_eq_in_keyword_argument = false 86 | ij_python_spaces_around_eq_in_named_parameter = false 87 | ij_python_spaces_around_equality_operators = true 88 | ij_python_spaces_around_multiplicative_operators = true 89 | ij_python_spaces_around_power_operator = true 90 | ij_python_spaces_around_relational_operators = true 91 | ij_python_spaces_around_shift_operators = true 92 | ij_python_spaces_within_braces = false 93 | ij_python_spaces_within_brackets = false 94 | ij_python_spaces_within_method_call_parentheses = false 95 | ij_python_spaces_within_method_parentheses = false 96 | ij_python_use_continuation_indent_for_arguments = true 97 | ij_python_use_continuation_indent_for_collection_and_comprehensions = false 98 | ij_python_wrap_long_lines = false 99 | 100 | [{*.yaml, *.yml}] 101 | indent_size = 2 102 | ij_yaml_keep_indents_on_empty_lines = false 103 | ij_yaml_keep_line_breaks = true 104 | ij_yaml_space_before_colon = false 105 | ij_yaml_spaces_within_braces = true 106 | ij_yaml_spaces_within_brackets = true 107 | -------------------------------------------------------------------------------- /tests/data/reference/test_usgs_flood_storms/storms.csv: -------------------------------------------------------------------------------- 1 | nhc_code,usgs_id,usgs_name,year,nhc_name,description,event_type,event_status,coordinator,instruments,last_updated,last_updated_by,start_date,end_date 2 | AL252005,8,2005 Wilma,2005,WILMA,"Category 3 in west FL. 3 | Hurricane Wilma was the most intense tropical cyclone ever recorded in the Atlantic basin. Part of the record breaking 2005 Atlantic hurricane season.",HURRICANE,COMPLETED,515,[],2023-12-19 20:47:51.435776,1.0,2005-10-20 04:00:00,2005-10-31 05:00:00 4 | AL092012,18,2012 Isaac,2012,ISAAC,historical hurricane data loaded by the data archive team,HURRICANE,COMPLETED,36,[],2022-09-09 14:57:23.815290,2062.0,2012-08-27 04:00:00,2012-09-02 04:00:00 5 | AL182005,19,2005 Rita,2005,RITA,historical hurricane data loaded by the data archive team,HURRICANE,COMPLETED,515,[],2022-09-08 20:10:38.533682,1.0,2005-09-23 04:00:00,2005-09-25 04:00:00 6 | AL092011,23,2011 Irene,2011,IRENE,historical hurricane data loaded by the data archive team,HURRICANE,COMPLETED,36,[],2022-09-09 15:04:03.637296,2062.0,2011-08-26 04:00:00,2011-08-29 04:00:00 7 | AL182012,24,2012 Sandy,2012,SANDY,historical hurricane data loaded by the data archive team,HURRICANE,COMPLETED,36,[],2022-09-09 15:04:13.715276,2062.0,2012-10-21 04:00:00,2012-10-30 04:00:00 8 | AL072008,25,2008 Gustav,2008,GUSTAV,historical hurricane data loaded by the data archive team,HURRICANE,COMPLETED,515,[],2022-09-09 15:04:24.293240,2062.0,2008-08-31 04:00:00,2008-09-03 04:00:00 9 | AL092008,26,2008 Ike,2008,IKE,historical hurricane data loaded by the data archive team,HURRICANE,COMPLETED,515,[],2022-09-09 15:04:47.855383,2062.0,2008-09-11 04:00:00,2008-09-12 04:00:00 10 | AL112015,119,2015 Joaquin,2015,JOAQUIN,Hurricane/Tropical storm with intense waves predicted in the Atlantic,HURRICANE,COMPLETED,36,[],2022-09-09 16:08:59.765383,2062.0,2015-10-01 04:00:00,2015-10-08 04:00:00 11 | AL092016,131,2016 Hermine,2016,HERMINE,Small deployment of Initial landfall of Hermine is in the Big Bend area of FL to assist NWS modeling,HURRICANE,COMPLETED,3,[],2022-09-09 16:23:30.939594,2062.0,2016-09-01 04:00:00,2016-09-07 04:00:00 12 | AL132003,133,2003 Isabel,2003,ISABEL,"Hurricane Isabel formed near the Cape Verde Islands from a tropical wave on Sep. 6 and reached peak winds of 165 mph (265 km/h) on Sep. 11. It made landfall on Sep. 18 in North Carolina, killing 16 and damaging over $5 billion of property.",HURRICANE,COMPLETED,515,[],2022-09-09 16:24:28.501226,2062.0,2003-09-06 04:00:00,2003-09-30 04:00:00 13 | AL142016,135,2016 Matthew,2016,MATTHEW,Hurricane Matthew,HURRICANE,COMPLETED,35,[],2022-09-09 16:25:00.672612,2062.0,2016-10-03 04:00:00,2016-10-30 04:00:00 14 | AL092017,180,2017 Harvey,2017,HARVEY,Hurricane Harvey Texas Coast August 2017,HURRICANE,COMPLETED,35,[],2022-09-09 17:27:26.943616,2062.0,2017-08-24 04:00:00,2017-09-24 04:00:00 15 | AL112017,182,2017 Irma,2017,IRMA,"Hurricane affecting PR, USVI and maybe mainland US",HURRICANE,COMPLETED,36,[],2022-09-09 17:28:15.677235,2062.0,2017-09-03 04:00:00,2017-09-30 04:00:00 16 | AL152017,189,2017 Maria,2017,MARIA,TD15,HURRICANE,COMPLETED,36,[],2022-09-09 19:06:47.524544,2062.0,2017-09-17 04:00:00,2017-10-02 04:00:00 17 | AL122017,190,2017 Jose,2017,JOSE,Tropical storm impacting the northeast us,HURRICANE,COMPLETED,36,[],2022-09-09 19:07:05.868050,2062.0,2017-09-18 04:00:00,2017-09-25 04:00:00 18 | AL162017,196,2017 Nate,2017,NATE,TD16 will be developing into Nate. North Gulf deployment,HURRICANE,COMPLETED,36,[],2022-09-09 19:08:52.507058,2062.0,2017-10-05 04:00:00,2017-10-14 04:00:00 19 | EP142018,281,2018 Lane,2018,LANE,Hurricane Lane in the central Pacific Ocean.,HURRICANE,ACTIVE,35,[],2022-09-09 19:33:46.421776,2062.0,2018-08-22 04:00:00,2018-09-15 04:00:00 20 | AL072018,282,2018 Gordon,2018,GORDON,TS/Hurricane Gordon in Gulf of Mexico,HURRICANE,ACTIVE,35,[],2022-09-09 19:33:33.625101,2062.0,2018-09-04 04:00:00,2018-10-04 04:00:00 21 | AL062018,283,2018 Florence,2018,FLORENCE,,HURRICANE,ACTIVE,35,[],2022-09-09 19:33:14.016012,2062.0,2018-09-07 04:00:00,2018-10-07 04:00:00 22 | AL092018,284,2018 Isaac,2018,ISAAC,,HURRICANE,COMPLETED,3,[],2022-09-09 19:33:02.531819,2062.0,2018-09-11 04:00:00,2018-09-18 04:00:00 23 | AL142018,287,2018 Michael,2018,MICHAEL,storm hit the Mexico Beach area of the Florida panhandle,HURRICANE,COMPLETED,3,[],2022-09-09 19:32:14.235677,2062.0,2018-10-08 04:00:00,2018-10-15 04:00:00 24 | AL052019,291,2019 Dorian,2019,DORIAN,,HURRICANE,ACTIVE,864,[],2022-09-09 19:31:39.126837,2062.0,2019-08-28 04:00:00,2019-09-20 04:00:00 25 | AL092020,301,2020 Isaias,2020,ISAIAS,,HURRICANE,ACTIVE,1001,[],2022-09-09 19:29:43.878587,2062.0,2020-07-31 04:00:00,2020-08-07 04:00:00 26 | AL132020,303,2020 Laura,2020,LAURA,,HURRICANE,ACTIVE,864,[],2022-09-09 19:29:38.331805,2062.0,2020-08-22 04:00:00,2020-08-30 04:00:00 27 | AL192020,304,2020 Sally,2020,SALLY,,HURRICANE,ACTIVE,864,[],2022-09-09 19:29:25.785112,2062.0,2020-09-13 04:00:00,2020-09-20 04:00:00 28 | AL262020,305,2020 Delta,2020,DELTA,,HURRICANE,ACTIVE,864,[],2022-09-09 19:29:19.644578,2062.0,2020-10-06 04:00:00,2020-10-13 04:00:00 29 | -------------------------------------------------------------------------------- /stormevents/usgs/sensors.py: -------------------------------------------------------------------------------- 1 | from enum import Enum 2 | from os import PathLike 3 | 4 | import pandas 5 | import requests 6 | from pandas import DataFrame 7 | 8 | 9 | class SensorType(Enum): 10 | """ 11 | https://stn.wim.usgs.gov/STNServices/SensorTypes.json 12 | """ 13 | 14 | PRESSURE_TRANSDUCER = 1 15 | METEROLOGICAL_STATION = 2 16 | THERMOMETER = 3 17 | WEBCAM = 4 18 | RAPID_DEPLOYMENT_GAGE = 5 19 | RAIN_GAGE = 6 20 | 21 | 22 | class FileType(Enum): 23 | """ 24 | https://stn.wim.usgs.gov/STNServices/FileTypes.json 25 | """ 26 | 27 | PHOTO = 1 28 | DATA = 2 29 | HISTORIC_CITATION = 3 30 | FIELD_SHEETS = 4 31 | LEVEL_NOTES = 5 32 | SITE_SKETCH = 6 33 | OTHER = 7 34 | LINK = 8 35 | NGS_DATASHEET = 9 36 | SKETCH = 10 37 | LANDOWNER_PERMISSION_FORM = 11 38 | HYDROGRAPH = 13 39 | 40 | 41 | class DeploymentType(Enum): 42 | """ 43 | https://stn.wim.usgs.gov/STNServices/DeploymentTypes.json 44 | """ 45 | 46 | WATER_LEVEL = 1 47 | WAVE_HEIGHT = 2 48 | BAROMETRIC = 3 49 | TEMPERATURE = 4 50 | WIND_SPEED = 5 51 | HUMIDITY = 6 52 | AIR_TEMPERATURE = 7 53 | WATER_TEMPERATURE = 8 54 | RAPID_DEPLOYMENT = 9 55 | 56 | 57 | class USGS_File: 58 | def __init__(self, id: int): 59 | files = usgs_files() 60 | if id not in files: 61 | raise FileNotFoundError(self.url) 62 | 63 | self.id = id 64 | 65 | @property 66 | def url(self) -> str: 67 | return f"https://stn.wim.usgs.gov/STNServices/Files/{id}/item" 68 | 69 | def to_file(self, path: PathLike): 70 | response = requests.get(self.url, stream=True) 71 | with open(path, "wb") as output_file: 72 | for chunk in response.iter_content(chunk_size=1024): 73 | output_file.write(chunk) 74 | 75 | 76 | def usgs_files(file_type: FileType = None, event_id: int = None) -> DataFrame: 77 | """ 78 | this function collects USGS files 79 | 80 | https://stn.wim.usgs.gov/STNServices/Files.json 81 | 82 | :param file_type: file type 83 | :param event_id: USGS event ID 84 | :return: table of files 85 | 86 | >>> usgs_files() 87 | name ... script_parent 88 | file_id ... 89 | 8075 AlafiaRv@41_1.JPG ... NaN 90 | 8076 AlafiaRv@41_2.JPG ... NaN 91 | 8079 SSS-FL-MIA-001WL-01.JPG ... NaN 92 | 8080 SSS-FL-MIA-001WL-02.JPG ... NaN 93 | 8081 SSS-FL-MIA-001WL-03.JPG ... NaN 94 | ... ... ... ... 95 | 125592 chetco 1 20201019 04-Nov-2020 11-18-17.pdf ... NaN 96 | 125593 chetco 1 20201022 04-Nov-2020 11-17-08.pdf ... NaN 97 | 125594 chetco 21-Dec-2020 10-06-59.pdf ... NaN 98 | 125595 stn-db-schema (1).pdf ... NaN 99 | 125596 stn-db-schema (1).pdf ... NaN 100 | [89421 rows x 19 columns] 101 | """ 102 | 103 | if event_id is None: 104 | url = "https://stn.wim.usgs.gov/STNServices/Files.json" 105 | else: 106 | url = f"https://stn.wim.usgs.gov/STNServices/Events/{event_id}/Files.json" 107 | 108 | files = pandas.read_json(url) 109 | files.set_index("file_id", inplace=True) 110 | 111 | if file_type is not None: 112 | if isinstance(file_type, FileType): 113 | file_type = file_type.value 114 | 115 | files = files[files["filetype_id"] == file_type] 116 | return files 117 | 118 | 119 | def usgs_sensors( 120 | sensor_type: SensorType = None, 121 | deployment_type: DeploymentType = None, 122 | event_id: int = None, 123 | ) -> DataFrame: 124 | """ 125 | this function collects USGS sensors with the given type and deployment 126 | 127 | https://stn.wim.usgs.gov/STNServices/Instruments.json 128 | 129 | :param sensor_type: type of sensor 130 | :param deployment_type: deployment type of sensor 131 | :param event_id: USGS event ID 132 | :return: table of sensors 133 | 134 | >>> usgs_sensors() 135 | sensor_type_id ... housing_serial_number 136 | instrument_id ... 137 | 8080 1 ... NaN 138 | 7755 5 ... NaN 139 | 9512 1 ... NaN 140 | 9568 1 ... NaN 141 | 7595 1 ... NaN 142 | ... ... ... ... 143 | 10432 1 ... NaN 144 | 10427 1 ... NaN 145 | 10450 1 ... NaN 146 | 10449 1 ... NaN 147 | 9505 1 ... NaN 148 | [4155 rows x 17 columns] 149 | """ 150 | 151 | if event_id is None: 152 | url = "https://stn.wim.usgs.gov/STNServices/Instruments.json" 153 | else: 154 | url = f"https://stn.wim.usgs.gov/STNServices/Events/{event_id}/Instruments.json" 155 | 156 | sensors = pandas.read_json(url) 157 | sensors.set_index("instrument_id", inplace=True) 158 | 159 | if sensor_type is not None: 160 | if isinstance(sensor_type, SensorType): 161 | sensor_type = sensor_type.value 162 | sensors = sensors[sensors["sensor_type_id"] == sensor_type] 163 | 164 | if deployment_type is not None: 165 | if isinstance(deployment_type, DeploymentType): 166 | deployment_type = deployment_type.value 167 | sensors = sensors[sensors["deployment_type_id"] == deployment_type] 168 | 169 | return sensors 170 | -------------------------------------------------------------------------------- /tests/data/reference/test_vortex_track/isabel2003.fort.22: -------------------------------------------------------------------------------- 1 | AL, 13, 2003090600, , BEST, 0, 138N, 314W, 30, 1009, TD, 34, NEQ, 0, 0, 0, 0, 1012, 150, 40, 0, 0, ,,, 275, 7,, 1 2 | AL, 13, 2003090606, , BEST, 0, 139N, 327W, 35, 1005, TS, 34, NEQ, 0, 0, 0, 0, 1012, 150, 40, 0, 0, ,,, 275, 7,, 2 3 | AL, 13, 2003090612, , BEST, 0, 136N, 339W, 40, 1003, TS, 34, NEQ, 75, 75, 25, 75, 1012, 150, 25, 0, 0, ,,, 256, 6,, 3 4 | AL, 13, 2003090618, , BEST, 0, 134N, 349W, 45, 1000, TS, 34, NEQ, 75, 75, 25, 75, 1012, 150, 25, 0, 0, ,,, 259, 5,, 4 5 | AL, 13, 2003090700, , BEST, 0, 135N, 358W, 55, 994, TS, 34, NEQ, 75, 75, 75, 75, 1012, 150, 25, 0, 0, ,,, 277, 5,, 5 6 | AL, 13, 2003090706, , BEST, 0, 139N, 365W, 60, 991, TS, 34, NEQ, 75, 75, 75, 75, 1012, 220, 25, 0, 0, ,,, 300, 4,, 6 7 | AL, 13, 2003090712, , BEST, 0, 144N, 373W, 65, 987, HU, 34, NEQ, 80, 80, 80, 80, 1012, 220, 25, 0, 0, ,,, 303, 5,, 7 8 | AL, 13, 2003090718, , BEST, 0, 152N, 385W, 70, 984, HU, 34, NEQ, 80, 80, 80, 80, 1012, 220, 25, 0, 0, ,,, 305, 7,, 8 9 | AL, 13, 2003090800, , BEST, 0, 158N, 397W, 80, 976, HU, 34, NEQ, 80, 80, 80, 80, 1012, 220, 25, 0, 0, ,,, 297, 7,, 9 10 | AL, 13, 2003090806, , BEST, 0, 165N, 409W, 95, 966, HU, 34, NEQ, 90, 90, 90, 90, 1012, 220, 25, 0, 0, ,,, 301, 7,, 10 11 | AL, 13, 2003090812, , BEST, 0, 171N, 420W, 110, 952, HU, 34, NEQ, 90, 90, 90, 90, 1012, 220, 25, 0, 0, ,,, 300, 6,, 11 12 | AL, 13, 2003090818, , BEST, 0, 176N, 431W, 110, 952, HU, 34, NEQ, 120, 100, 100, 120, 1012, 220, 25, 0, 0, ,,, 295, 6,, 12 13 | AL, 13, 2003090900, , BEST, 0, 182N, 441W, 115, 948, HU, 34, NEQ, 120, 100, 75, 120, 1012, 200, 25, 0, 0, ,,, 302, 6,, 13 14 | AL, 13, 2003090906, , BEST, 0, 189N, 452W, 115, 948, HU, 34, NEQ, 150, 100, 75, 150, 1012, 200, 25, 0, 0, ,,, 304, 6,, 14 15 | AL, 13, 2003090912, , BEST, 0, 194N, 463W, 115, 948, HU, 34, NEQ, 150, 100, 75, 150, 1012, 200, 25, 0, 0, ,,, 296, 6,, 15 16 | AL, 13, 2003090918, , BEST, 0, 200N, 473W, 115, 948, HU, 34, NEQ, 150, 100, 75, 150, 1012, 200, 25, 0, 0, ,,, 303, 6,, 16 17 | AL, 13, 2003091000, , BEST, 0, 205N, 483W, 110, 952, HU, 34, NEQ, 150, 100, 100, 150, 1012, 220, 25, 0, 0, ,,, 298, 5,, 17 18 | AL, 13, 2003091006, , BEST, 0, 209N, 494W, 110, 952, HU, 34, NEQ, 150, 100, 100, 150, 1012, 220, 25, 0, 0, ,,, 291, 6,, 18 19 | AL, 13, 2003091012, , BEST, 0, 211N, 504W, 115, 948, HU, 34, NEQ, 160, 120, 100, 160, 1012, 220, 25, 0, 0, ,,, 282, 5,, 19 20 | AL, 13, 2003091018, , BEST, 0, 211N, 514W, 120, 942, HU, 34, NEQ, 160, 120, 120, 160, 1012, 220, 25, 0, 0, ,,, 270, 5,, 20 21 | AL, 13, 2003091100, , BEST, 0, 212N, 523W, 125, 935, HU, 34, NEQ, 160, 120, 100, 120, 1012, 225, 20, 0, 0, ,,, 277, 4,, 21 22 | AL, 13, 2003091106, , BEST, 0, 213N, 532W, 125, 935, HU, 34, NEQ, 160, 120, 100, 120, 1012, 225, 20, 0, 0, ,,, 277, 4,, 22 23 | AL, 13, 2003091112, , BEST, 0, 214N, 540W, 135, 925, HU, 34, NEQ, 160, 120, 100, 120, 1010, 225, 20, 0, 0, ,,, 278, 4,, 23 24 | AL, 13, 2003091118, , BEST, 0, 215N, 548W, 145, 915, HU, 34, NEQ, 160, 120, 100, 140, 1010, 225, 20, 0, 0, ,,, 278, 4,, 24 25 | AL, 13, 2003091200, , BEST, 0, 216N, 557W, 140, 920, HU, 34, NEQ, 160, 120, 100, 140, 1010, 225, 20, 0, 0, ,,, 277, 4,, 25 26 | AL, 13, 2003091206, , BEST, 0, 217N, 566W, 140, 920, HU, 34, NEQ, 160, 120, 100, 140, 1010, 225, 20, 0, 0, ,,, 277, 4,, 26 27 | AL, 13, 2003091212, , BEST, 0, 216N, 574W, 140, 920, HU, 34, NEQ, 160, 120, 100, 140, 1013, 240, 25, 0, 0, ,,, 263, 4,, 27 28 | AL, 13, 2003091218, , BEST, 0, 217N, 582W, 140, 920, HU, 34, NEQ, 160, 120, 105, 140, 1013, 240, 15, 0, 0, ,,, 278, 4,, 28 29 | AL, 13, 2003091300, , BEST, 0, 218N, 591W, 135, 925, HU, 34, NEQ, 160, 120, 105, 140, 1013, 240, 15, 0, 0, ,,, 277, 4,, 29 30 | AL, 13, 2003091306, , BEST, 0, 219N, 601W, 130, 935, HU, 34, NEQ, 140, 120, 105, 140, 1013, 240, 15, 0, 0, ,,, 276, 5,, 30 31 | AL, 13, 2003091312, , BEST, 0, 221N, 610W, 135, 935, HU, 34, NEQ, 150, 130, 110, 140, 1013, 240, 20, 0, 0, ,,, 284, 4,, 31 32 | AL, 13, 2003091318, , BEST, 0, 225N, 621W, 140, 932, HU, 34, NEQ, 150, 130, 110, 140, 1013, 240, 20, 0, 0, ,,, 292, 6,, 32 33 | AL, 13, 2003091400, , BEST, 0, 229N, 633W, 135, 935, HU, 34, NEQ, 150, 150, 130, 150, 1013, 240, 25, 0, 0, ,,, 290, 6,, 33 34 | AL, 13, 2003091406, , BEST, 0, 232N, 646W, 135, 939, HU, 34, NEQ, 175, 175, 175, 150, 1013, 240, 25, 0, 0, ,,, 284, 6,, 34 35 | AL, 13, 2003091412, , BEST, 0, 235N, 658W, 135, 935, HU, 34, NEQ, 175, 175, 175, 150, 1013, 240, 25, 0, 0, ,,, 285, 6,, 35 36 | AL, 13, 2003091418, , BEST, 0, 239N, 670W, 140, 933, HU, 34, NEQ, 175, 175, 175, 150, 1013, 240, 25, 0, 0, ,,, 290, 6,, 36 37 | AL, 13, 2003091500, , BEST, 0, 243N, 679W, 130, 937, HU, 34, NEQ, 180, 180, 180, 180, 1013, 240, 25, 0, 0, ,,, 296, 5,, 37 38 | AL, 13, 2003091506, , BEST, 0, 245N, 688W, 125, 940, HU, 34, NEQ, 180, 180, 180, 180, 1011, 240, 35, 0, 0, ,,, 284, 4,, 38 39 | AL, 13, 2003091512, , BEST, 0, 248N, 694W, 120, 946, HU, 34, NEQ, 180, 180, 180, 180, 1011, 240, 30, 0, 0, ,,, 299, 3,, 39 40 | AL, 13, 2003091518, , BEST, 0, 253N, 698W, 115, 949, HU, 34, NEQ, 180, 180, 140, 140, 1011, 240, 30, 0, 0, ,,, 324, 3,, 40 41 | AL, 13, 2003091600, , BEST, 0, 257N, 702W, 105, 952, HU, 34, NEQ, 175, 150, 150, 150, 1011, 275, 30, 0, 0, ,,, 318, 3,, 41 42 | AL, 13, 2003091606, , BEST, 0, 263N, 705W, 100, 955, HU, 34, NEQ, 175, 150, 150, 150, 1010, 275, 40, 0, 0, ,,, 336, 3,, 42 43 | AL, 13, 2003091612, , BEST, 0, 268N, 709W, 95, 959, HU, 34, NEQ, 200, 200, 100, 150, 1010, 300, 50, 0, 0, ,,, 324, 3,, 43 44 | AL, 13, 2003091618, , BEST, 0, 274N, 712W, 95, 959, HU, 34, NEQ, 240, 200, 120, 180, 1010, 300, 55, 0, 0, ,,, 336, 3,, 44 45 | AL, 13, 2003091700, , BEST, 0, 281N, 715W, 95, 957, HU, 34, NEQ, 240, 200, 150, 200, 1010, 300, 55, 0, 0, ,,, 339, 4,, 45 46 | AL, 13, 2003091706, , BEST, 0, 289N, 719W, 95, 957, HU, 34, NEQ, 225, 200, 175, 200, 1010, 300, 55, 0, 0, ,,, 336, 4,, 46 47 | AL, 13, 2003091712, , BEST, 0, 297N, 725W, 90, 957, HU, 34, NEQ, 225, 200, 175, 200, 1010, 300, 55, 0, 0, ,,, 327, 5,, 47 48 | AL, 13, 2003091718, , BEST, 0, 306N, 730W, 90, 955, HU, 34, NEQ, 275, 250, 150, 200, 1010, 300, 40, 0, 0, ,,, 334, 5,, 48 49 | AL, 13, 2003091800, , BEST, 0, 315N, 735W, 90, 953, HU, 34, NEQ, 275, 250, 150, 200, 1010, 300, 40, 0, 0, ,,, 335, 5,, 49 50 | AL, 13, 2003091806, , BEST, 0, 325N, 743W, 90, 956, HU, 34, NEQ, 300, 250, 150, 200, 1010, 300, 45, 0, 0, ,,, 326, 6,, 50 51 | AL, 13, 2003091812, , BEST, 0, 337N, 752W, 90, 956, HU, 34, NEQ, 300, 250, 150, 250, 1010, 300, 45, 0, 0, ,,, 328, 7,, 51 52 | AL, 13, 2003091817, , BEST, 0, 349N, 762W, 90, 957, HU, 0, , 0, 0, 0, 0, 1013,,,,,,,, 326, 9,, 52 53 | AL, 13, 2003091818, , BEST, 0, 351N, 764W, 85, 958, HU, 34, NEQ, 300, 200, 200, 200, 1010, 300, 45, 0, 0, ,,, 321, 8,, 53 54 | AL, 13, 2003091900, , BEST, 0, 367N, 777W, 65, 969, HU, 34, NEQ, 300, 200, 100, 100, 1010, 300, 45, 0, 0, ,,, 327, 10,, 54 55 | AL, 13, 2003091906, , BEST, 0, 386N, 789W, 50, 988, TS, 34, NEQ, 300, 200, 60, 60, 1010, 300, 60, 0, 0, ,,, 334, 11,, 55 56 | AL, 13, 2003091912, , BEST, 0, 409N, 803W, 35, 997, EX, 34, NEQ, 200, 300, 0, 0, 1010, 300, 200, 0, 0, ,,, 335, 13,, 56 57 | AL, 13, 2003091918, , BEST, 0, 439N, 809W, 30, 1000, EX, 0, , 0, 0, 0, 0, 1013,,,,,,,, 352, 16,, 57 58 | AL, 13, 2003092000, , BEST, 0, 480N, 810W, 25, 1000, EX, 0, , 0, 0, 0, 0, 1013,,,,,,,, 359, 21,, 58 59 | -------------------------------------------------------------------------------- /tests/test_stormevent.py: -------------------------------------------------------------------------------- 1 | from datetime import datetime 2 | from datetime import timedelta 3 | 4 | import pandas 5 | import pytest 6 | import shapely 7 | from shapely.geometry import box 8 | 9 | from stormevents.nhc import nhc_storms 10 | from stormevents.stormevent import StormEvent 11 | from stormevents.stormevent import StormStatus 12 | from tests import check_reference_directory 13 | from tests import OUTPUT_DIRECTORY 14 | from tests import REFERENCE_DIRECTORY 15 | 16 | 17 | @pytest.fixture 18 | def florence2018() -> StormEvent: 19 | return StormEvent("florence", 2018) 20 | 21 | 22 | @pytest.fixture 23 | def ida2021() -> StormEvent: 24 | return StormEvent("florence", 2018) 25 | 26 | 27 | def test_storm_event_lookup(): 28 | florence2018 = StormEvent("florence", 2018) 29 | paine2016 = StormEvent.from_nhc_code("EP172016") 30 | henri2021 = StormEvent.from_usgs_id(310) 31 | ida2021 = StormEvent("ida", 2021) 32 | eta2020 = StormEvent("eta", 2020) 33 | beta2020 = StormEvent("beta", 2020) 34 | 35 | with pytest.raises(ValueError): 36 | StormEvent("nonexistent", 2021) 37 | 38 | with pytest.raises(ValueError): 39 | StormEvent.from_nhc_code("nonexistent") 40 | 41 | with pytest.raises(ValueError): 42 | StormEvent.from_nhc_code("AL992021") 43 | 44 | with pytest.raises(ValueError): 45 | StormEvent.from_nhc_code(-1) 46 | 47 | with pytest.raises(ValueError): 48 | StormEvent.from_usgs_id(-1) 49 | 50 | assert florence2018.name == "FLORENCE" 51 | assert florence2018.year == 2018 52 | assert florence2018.basin == "AL" 53 | assert florence2018.number == 6 54 | assert florence2018._StormEvent__data_start == datetime(2018, 8, 30, 6) 55 | assert florence2018.nhc_code == "AL062018" 56 | assert florence2018.usgs_id == 283 57 | assert florence2018.start_date == datetime(2018, 8, 30, 6) 58 | assert florence2018.end_date == datetime(2018, 9, 18, 12) 59 | assert ( 60 | repr(florence2018) 61 | == "StormEvent(name='FLORENCE', year=2018, start_date=Timestamp('2018-08-30 06:00:00'), end_date=Timestamp('2018-09-18 12:00:00'))" 62 | ) 63 | 64 | assert paine2016.name == "PAINE" 65 | assert paine2016.year == 2016 66 | assert paine2016.nhc_code == "EP172016" 67 | assert paine2016.usgs_id is None 68 | assert paine2016.start_date == datetime(2016, 9, 18) 69 | assert paine2016.end_date == datetime(2016, 9, 21, 12) 70 | 71 | assert henri2021.name == "HENRI" 72 | assert henri2021.year == 2021 73 | assert henri2021.nhc_code == "AL082021" 74 | assert henri2021.usgs_id == 310 75 | assert henri2021.start_date == datetime(2021, 8, 20, 4) 76 | assert henri2021.end_date == datetime(2021, 8, 24, 18) 77 | 78 | assert ida2021.name == "IDA" 79 | assert ida2021.year == 2021 80 | assert ida2021.nhc_code == "AL092021" 81 | assert ida2021.usgs_id == 312 82 | assert ida2021.start_date == datetime(2021, 8, 26, 12) 83 | assert ida2021.end_date == datetime(2021, 9, 4, 18) 84 | 85 | # Similar names are not swapped (like [B]ETA) 86 | assert eta2020.name == "ETA" 87 | assert beta2020.name == "BETA" 88 | 89 | 90 | def test_storm_event_time_interval(): 91 | florence2018 = StormEvent("florence", 2018, start_date=timedelta(days=-2)) 92 | paine2016 = StormEvent.from_nhc_code("EP172016", end_date=timedelta(days=1)) 93 | henri2021 = StormEvent.from_usgs_id( 94 | 310, start_date=timedelta(days=-4), end_date=timedelta(days=-2) 95 | ) 96 | ida2021 = StormEvent( 97 | "ida", 2021, start_date=datetime(2021, 8, 30), end_date=datetime(2021, 9, 1) 98 | ) 99 | 100 | # test times outside base interval 101 | StormEvent("florence", 2018, start_date=timedelta(days=30)) 102 | StormEvent("florence", 2018, start_date=datetime(2018, 10, 1)) 103 | 104 | assert florence2018.start_date == datetime(2018, 9, 16, 12) 105 | assert florence2018.end_date == datetime(2018, 9, 18, 12) 106 | assert ( 107 | repr(florence2018) 108 | == "StormEvent(name='FLORENCE', year=2018, start_date=Timestamp('2018-09-16 12:00:00'), end_date=Timestamp('2018-09-18 12:00:00'))" 109 | ) 110 | 111 | assert paine2016.start_date == datetime(2016, 9, 18) 112 | assert paine2016.end_date == datetime(2016, 9, 19) 113 | assert ( 114 | repr(paine2016) 115 | == "StormEvent(name='PAINE', year=2016, start_date=Timestamp('2016-09-18 00:00:00'), end_date=Timestamp('2016-09-19 00:00:00'))" 116 | ) 117 | 118 | assert henri2021.start_date == datetime(2021, 8, 20, 18) 119 | assert henri2021.end_date == datetime(2021, 8, 22, 18) 120 | assert ( 121 | repr(henri2021) 122 | == "StormEvent(name='HENRI', year=2021, start_date=Timestamp('2021-08-20 18:00:00'), end_date=Timestamp('2021-08-22 18:00:00'))" 123 | ) 124 | 125 | assert ida2021.start_date == datetime(2021, 8, 30) 126 | assert ida2021.end_date == datetime(2021, 9, 1) 127 | assert ( 128 | repr(ida2021) 129 | == "StormEvent(name='IDA', year=2021, start_date=datetime.datetime(2021, 8, 30, 0, 0), end_date=datetime.datetime(2021, 9, 1, 0, 0))" 130 | ) 131 | 132 | 133 | def test_storm_event_track(florence2018, ida2021): 134 | reference_directory = REFERENCE_DIRECTORY / "test_storm_event_track" 135 | output_directory = OUTPUT_DIRECTORY / "test_storm_event_track" 136 | 137 | if not output_directory.exists(): 138 | output_directory.mkdir(parents=True, exist_ok=True) 139 | 140 | florence_track = florence2018.track() 141 | ida_track = ida2021.track() 142 | 143 | florence_track.to_file(output_directory / "florence2018.fort.22", overwrite=True) 144 | ida_track.to_file(output_directory / "ida2021.fort.22", overwrite=True) 145 | 146 | check_reference_directory(output_directory, reference_directory) 147 | 148 | 149 | def test_storm_event_track_forecast_time(florence2018): 150 | florence_track = florence2018.track(file_deck="a", forecast_time="09-10-2018") 151 | assert len(florence_track.data.track_start_time.unique()) == 1 152 | 153 | 154 | def test_storm_event_high_water_marks(florence2018): 155 | reference_directory = REFERENCE_DIRECTORY / "test_storm_event_high_water_marks" 156 | output_directory = OUTPUT_DIRECTORY / "test_storm_event_high_water_marks" 157 | 158 | if not output_directory.exists(): 159 | output_directory.mkdir(parents=True, exist_ok=True) 160 | 161 | flood = florence2018.flood_event 162 | 163 | high_water_marks = flood.high_water_marks() 164 | high_water_marks.to_csv(output_directory / "florence2018_hwm.csv") 165 | 166 | check_reference_directory(output_directory, reference_directory) 167 | 168 | 169 | def test_storm_event_coops_product_within_isotach(florence2018): 170 | null_data = florence2018.coops_product_within_isotach( 171 | "water_level", 172 | wind_speed=34, 173 | end_date=florence2018.start_date + timedelta(hours=1), 174 | ) 175 | 176 | tidal_data = florence2018.coops_product_within_isotach( 177 | "water_level", 178 | wind_speed=34, 179 | start_date=datetime(2018, 9, 13), 180 | end_date=datetime(2018, 9, 14), 181 | ) 182 | 183 | assert len(null_data.data_vars) == 0 184 | assert list(tidal_data.data_vars) == ["v", "s", "f", "q"] 185 | 186 | assert null_data["t"].sizes == {} 187 | assert tidal_data.sizes["nos_id"] > 0 188 | assert tidal_data.sizes["t"] > 0 189 | 190 | 191 | def test_storm_event_coops_product_within_region(florence2018): 192 | null_tidal_data = florence2018.coops_product_within_region( 193 | "water_level", 194 | region=shapely.geometry.box(0, 0, 1, 1), 195 | start_date=florence2018.start_date, 196 | end_date=florence2018.start_date + timedelta(minutes=1), 197 | ) 198 | 199 | east_coast = shapely.geometry.box(-85, 25, -65, 45) 200 | 201 | east_coast_tidal_data = florence2018.coops_product_within_region( 202 | "water_level", 203 | region=east_coast, 204 | start_date=datetime(2018, 9, 13, 23, 59), 205 | end_date=datetime(2018, 9, 14), 206 | ) 207 | 208 | assert len(null_tidal_data.data_vars) == 0 209 | assert list(east_coast_tidal_data.data_vars) == ["v", "s", "f", "q"] 210 | 211 | assert null_tidal_data["t"].sizes == {} 212 | assert east_coast_tidal_data.sizes["nos_id"] > 0 213 | assert east_coast_tidal_data.sizes["t"] > 0 214 | 215 | 216 | def test_status(): 217 | florence2018 = StormEvent("florence", 2018) 218 | paine2016 = StormEvent.from_nhc_code("EP172016") 219 | henri2021 = StormEvent.from_usgs_id(310) 220 | ida2021 = StormEvent("ida", 2021) 221 | 222 | assert florence2018.status == StormStatus.HISTORICAL 223 | assert paine2016.status == StormStatus.HISTORICAL 224 | assert henri2021.status == StormStatus.HISTORICAL 225 | assert ida2021.status == StormStatus.HISTORICAL 226 | 227 | # TODO: fails due to issue #78 228 | # How could it pass before in early 2023?! 229 | 230 | 231 | # storms = nhc_storms() 232 | # latest_storm_entry = storms[ 233 | # ((storms["class"] == "HU") | (storms["class"] == "TS")) 234 | # & (storms["number"] < 60) 235 | # ].iloc[-1] 236 | # latest_storm = StormEvent.from_nhc_code(latest_storm_entry.name) 237 | # age = datetime.today() - latest_storm_entry["end_date"] 238 | # if pandas.isna(latest_storm_entry["end_date"]) or age < timedelta(days=1): 239 | # if datetime.today() - latest_storm_entry["start_date"] > timedelta(days=30): 240 | # assert latest_storm.status == StormStatus.HISTORICAL 241 | # else: 242 | # assert latest_storm.status == StormStatus.REALTIME 243 | # else: 244 | # assert latest_storm.status == StormStatus.HISTORICAL 245 | -------------------------------------------------------------------------------- /stormevents/nhc/storms.py: -------------------------------------------------------------------------------- 1 | import re 2 | from collections.abc import Iterable 3 | from datetime import datetime 4 | from functools import lru_cache 5 | 6 | import numpy 7 | import pandas 8 | import requests 9 | from bs4 import BeautifulSoup 10 | 11 | NHC_GIS_ARCHIVE_START_YEAR = 2008 12 | 13 | 14 | @lru_cache(maxsize=None) 15 | def nhc_storms(year: int = None) -> pandas.DataFrame: 16 | """ 17 | retrieve a list of hurricanes from NHC since 1851 18 | 19 | :param year: storm year 20 | :return: table of storms 21 | 22 | >>> nhc_storms() 23 | name class year basin number source start_date end_date 24 | nhc_code 25 | AL021851 UNNAMED HU 1851 AL 2 ARCHIVE 1851-07-05 12:00:00 1851-07-05 12:00:00 26 | AL031851 UNNAMED TS 1851 AL 3 ARCHIVE 1851-07-10 12:00:00 1851-07-10 12:00:00 27 | AL041851 UNNAMED HU 1851 AL 4 ARCHIVE 1851-08-16 00:00:00 1851-08-27 18:00:00 28 | AL051851 UNNAMED TS 1851 AL 5 ARCHIVE 1851-09-13 00:00:00 1851-09-16 18:00:00 29 | AL061851 UNNAMED TS 1851 AL 6 ARCHIVE 1851-10-16 00:00:00 1851-10-19 18:00:00 30 | ... ... ... ... ... ... ... ... ... 31 | CP902021 INVEST LO 2021 CP 90 METWATCH 2021-07-24 12:00:00 NaT 32 | CP912021 INVEST DB 2021 CP 91 METWATCH 2021-08-07 18:00:00 NaT 33 | EP922021 INVEST DB 2021 EP 92 METWATCH 2021-06-05 06:00:00 NaT 34 | EP712022 GENESIS001 DB 2022 EP 71 GENESIS 2022-01-20 12:00:00 NaT 35 | EP902022 INVEST LO 2022 EP 90 METWATCH 2022-01-20 12:00:00 NaT 36 | [2714 rows x 8 columns] 37 | """ 38 | 39 | url = "https://ftp.nhc.noaa.gov/atcf/index/storm_list.txt" 40 | 41 | columns = [ 42 | "name", 43 | "basin", 44 | 2, 45 | 3, 46 | 4, 47 | 5, 48 | 6, 49 | "number", 50 | "year", 51 | "class", 52 | 10, 53 | "start_date", 54 | "end_date", 55 | 13, 56 | 14, 57 | 15, 58 | 16, 59 | 17, 60 | "source", 61 | 19, 62 | "nhc_code", 63 | ] 64 | storms = pandas.read_csv( 65 | url, 66 | header=0, 67 | names=columns, 68 | ) 69 | for i in ["start_date", "end_date"]: 70 | storms[i] = pandas.to_datetime(storms[i], errors="coerce", format="%Y%m%d%H") 71 | 72 | storms = storms.astype( 73 | {"start_date": "datetime64[s]", "end_date": "datetime64[s]"}, 74 | copy=False, 75 | ) 76 | 77 | storms = storms[ 78 | [ 79 | "nhc_code", 80 | "name", 81 | "class", 82 | "year", 83 | "basin", 84 | "number", 85 | "source", 86 | "start_date", 87 | "end_date", 88 | ] 89 | ] 90 | 91 | if year is not None: 92 | if isinstance(year, Iterable) and not isinstance(year, str): 93 | storms = storms[storms["year"].isin(year)] 94 | else: 95 | storms = storms[storms["year"] == int(year)] 96 | 97 | storms["nhc_code"] = storms["nhc_code"].str.strip() 98 | storms.set_index("nhc_code", inplace=True) 99 | 100 | gis_archive_storms = nhc_storms_gis_archive(year=year) 101 | gis_archive_storms = gis_archive_storms.drop( 102 | gis_archive_storms[gis_archive_storms.index.isin(storms.index)].index 103 | ) 104 | if len(gis_archive_storms) > 0: 105 | gis_archive_storms[["start_date", "end_date"]] = pandas.to_datetime(numpy.nan) 106 | storms = pandas.concat( 107 | [storms, gis_archive_storms[storms.columns].astype(storms.dtypes.to_dict())] 108 | ) 109 | 110 | for string_column in ["name", "class", "source"]: 111 | storms.loc[storms[string_column].str.len() == 0, string_column] = pandas.NA 112 | storms[string_column] = storms[string_column].str.strip() 113 | storms[string_column] = storms[string_column].astype("string") 114 | 115 | storms.sort_values(["year", "number", "basin"], inplace=True) 116 | 117 | return storms 118 | 119 | 120 | @lru_cache(maxsize=None) 121 | def nhc_storms_archive(year: int = None) -> pandas.DataFrame: 122 | url = "https://ftp.nhc.noaa.gov/atcf/archive/storm.table" 123 | 124 | columns = [ 125 | "name", 126 | "basin", 127 | 2, 128 | 3, 129 | 4, 130 | 5, 131 | 6, 132 | "number", 133 | "year", 134 | "class", 135 | 10, 136 | "start_date", 137 | "end_date", 138 | 13, 139 | 14, 140 | 15, 141 | 16, 142 | 17, 143 | "source", 144 | 19, 145 | "nhc_code", 146 | ] 147 | 148 | storms = pandas.read_csv(url, header=0, names=columns) 149 | 150 | storms = storms[ 151 | [ 152 | "nhc_code", 153 | "name", 154 | "class", 155 | "year", 156 | "basin", 157 | "number", 158 | "source", 159 | "start_date", 160 | "end_date", 161 | ] 162 | ] 163 | 164 | if year is not None: 165 | if isinstance(year, Iterable) and not isinstance(year, str): 166 | storms = storms[storms["year"].isin(year)] 167 | else: 168 | storms = storms[storms["year"] == int(year)] 169 | 170 | storms["nhc_code"] = storms["nhc_code"].str.strip() 171 | storms.set_index("nhc_code", inplace=True) 172 | 173 | storms.sort_values(["year", "number", "basin"], inplace=True) 174 | 175 | for string_column in ["name", "class", "source"]: 176 | storms.loc[storms[string_column].str.len() == 0, string_column] = pandas.NA 177 | storms[string_column] = storms[string_column].str.strip() 178 | storms[string_column] = storms[string_column].astype("string") 179 | 180 | return storms 181 | 182 | 183 | @lru_cache(maxsize=None) 184 | def nhc_storms_gis_archive(year: int = None) -> pandas.DataFrame: 185 | """ 186 | retrieve list of hurricanes from GIS archive since 2008 187 | 188 | :param year: storm year 189 | :return: table of storms 190 | 191 | >>> nhc_storms_gis_archive() 192 | name class year basin number source 193 | nhc_code 194 | AL012008 ARTHUR TS 2008 AL 1 GIS_ARCHIVE 195 | AL022008 BERTHA HU 2008 AL 2 GIS_ARCHIVE 196 | AL032008 CRISTOBAL TS 2008 AL 3 GIS_ARCHIVE 197 | AL042008 DOLLY HU 2008 AL 4 GIS_ARCHIVE 198 | AL052008 EDOUARD TS 2008 AL 5 GIS_ARCHIVE 199 | ... ... ... ... ... ... ... 200 | EP152021 OLAF HU 2021 EP 15 GIS_ARCHIVE 201 | EP162021 PAMELA HU 2021 EP 16 GIS_ARCHIVE 202 | EP172021 RICK HU 2021 EP 17 GIS_ARCHIVE 203 | EP182021 TERRY TS 2021 EP 18 GIS_ARCHIVE 204 | EP192021 SANDRA TS 2021 EP 19 GIS_ARCHIVE 205 | [523 rows x 6 columns] 206 | """ 207 | 208 | if year is None: 209 | year = list(range(NHC_GIS_ARCHIVE_START_YEAR, datetime.today().year + 1)) 210 | 211 | if isinstance(year, Iterable) and not isinstance(year, str): 212 | years = sorted(pandas.unique(numpy.array(year))) 213 | return pandas.concat( 214 | [ 215 | nhc_storms_gis_archive(year) 216 | for year in years 217 | if year is not None and year >= NHC_GIS_ARCHIVE_START_YEAR 218 | ] 219 | ) 220 | elif not isinstance(year, int): 221 | year = int(year) 222 | 223 | url = "http://www.nhc.noaa.gov/gis/archive_wsurge.php" 224 | response = requests.get(url, params={"year": year}) 225 | if not response.ok: 226 | response.raise_for_status() 227 | soup = BeautifulSoup(response.content, features="html.parser") 228 | table = soup.find("table") 229 | 230 | rows = [] 231 | for row in table.find_all("tr")[1:]: 232 | identifier, long_name = (entry.text for entry in row.find_all("td")) 233 | short_name = long_name.split()[-1] 234 | rows.append((f"{identifier}{year}", short_name, long_name, year)) 235 | 236 | storms = pandas.DataFrame(rows, columns=["nhc_code", "name", "long_name", "year"]) 237 | storms["nhc_code"] = storms["nhc_code"].str.upper() 238 | storms.set_index("nhc_code", inplace=True) 239 | 240 | storms["number"] = storms.index.str.slice(2, 4).astype(int) 241 | storms["basin"] = storms.index.str.slice(0, 2) 242 | 243 | storms["class"] = None 244 | storms.loc[ 245 | storms["long_name"].str.contains("Tropical Cyclone", flags=re.IGNORECASE) 246 | | storms["long_name"].str.contains("Hurricane", flags=re.IGNORECASE), 247 | "class", 248 | ] = "HU" 249 | storms.loc[ 250 | storms["long_name"].str.contains("Tropical Storm", flags=re.IGNORECASE), 251 | "class", 252 | ] = "TS" 253 | storms.loc[ 254 | storms["long_name"].str.contains("Tropical Depression", flags=re.IGNORECASE), 255 | "class", 256 | ] = "TD" 257 | storms.loc[ 258 | storms["long_name"].str.contains("Subtropical", flags=re.IGNORECASE), 259 | "class", 260 | ] = "ST" 261 | 262 | storms["source"] = "GIS_ARCHIVE" 263 | 264 | storms.sort_values(["year", "basin", "number"], inplace=True) 265 | 266 | for string_column in ["name", "class", "source"]: 267 | storms.loc[storms[string_column].str.len() == 0, string_column] = pandas.NA 268 | storms[string_column] = storms[string_column].str.strip() 269 | storms[string_column] = storms[string_column].astype("string") 270 | 271 | return storms[["name", "class", "year", "basin", "number", "source"]] 272 | -------------------------------------------------------------------------------- /tests/data/reference/test_vortex_track_no_internet/vortex_1.22: -------------------------------------------------------------------------------- 1 | AL, 06, 2018091100, , BEST, 0, 256N, 618W, 115, 944, HU, 34, NEQ, 130, 130, 90, 130, 1010, 200, 10,,, ,, , 270, 13, FLORENCE, 1 2 | AL, 06, 2018091100, , BEST, 0, 256N, 618W, 115, 944, HU, 50, NEQ, 60, 60, 50, 60, 1010, 200, 10,,, ,, , 270, 13, FLORENCE, 1 3 | AL, 06, 2018091100, , BEST, 0, 256N, 618W, 115, 944, HU, 64, NEQ, 35, 30, 25, 35, 1010, 200, 10,,, ,, , 270, 13, FLORENCE, 1 4 | AL, 06, 2018091106, , BEST, 6, 260N, 632W, 115, 950, HU, 34, NEQ, 130, 130, 90, 140, 1010, 200, 15,,, ,, , 270, 14, FLORENCE, 2 5 | AL, 06, 2018091106, , BEST, 6, 260N, 632W, 115, 950, HU, 50, NEQ, 60, 60, 50, 60, 1010, 200, 15,,, ,, , 270, 14, FLORENCE, 2 6 | AL, 06, 2018091106, , BEST, 6, 260N, 632W, 115, 950, HU, 64, NEQ, 35, 30, 25, 35, 1010, 200, 15,,, ,, , 270, 14, FLORENCE, 2 7 | AL, 06, 2018091112, , BEST, 12, 265N, 647W, 125, 947, HU, 34, NEQ, 140, 130, 90, 120, 1010, 200, 15,,, ,, , 270, 15, FLORENCE, 3 8 | AL, 06, 2018091112, , BEST, 12, 265N, 647W, 125, 947, HU, 50, NEQ, 70, 60, 50, 70, 1010, 200, 15,,, ,, , 270, 15, FLORENCE, 3 9 | AL, 06, 2018091112, , BEST, 12, 265N, 647W, 125, 947, HU, 64, NEQ, 40, 35, 35, 40, 1010, 200, 15,,, ,, , 270, 15, FLORENCE, 3 10 | AL, 06, 2018091118, , BEST, 18, 272N, 664W, 130, 937, HU, 34, NEQ, 150, 130, 100, 140, 1010, 200, 10,,, ,, , 270, 15, FLORENCE, 4 11 | AL, 06, 2018091118, , BEST, 18, 272N, 664W, 130, 937, HU, 50, NEQ, 80, 60, 50, 70, 1010, 200, 10,,, ,, , 270, 15, FLORENCE, 4 12 | AL, 06, 2018091118, , BEST, 18, 272N, 664W, 130, 937, HU, 64, NEQ, 50, 40, 40, 45, 1010, 200, 10,,, ,, , 270, 15, FLORENCE, 4 13 | AL, 06, 2018091200, , BEST, 24, 279N, 681W, 120, 943, HU, 34, NEQ, 150, 130, 100, 140, 1010, 200, 10,,, ,, , 270, 12, FLORENCE, 5 14 | AL, 06, 2018091200, , BEST, 24, 279N, 681W, 120, 943, HU, 50, NEQ, 80, 60, 50, 70, 1010, 200, 10,,, ,, , 270, 12, FLORENCE, 5 15 | AL, 06, 2018091200, , BEST, 24, 279N, 681W, 120, 943, HU, 64, NEQ, 50, 45, 40, 45, 1010, 200, 10,,, ,, , 270, 12, FLORENCE, 5 16 | AL, 06, 2018091206, , BEST, 30, 287N, 695W, 115, 945, HU, 34, NEQ, 150, 140, 110, 140, 1010, 200, 15,,, ,, , 270, 11, FLORENCE, 6 17 | AL, 06, 2018091206, , BEST, 30, 287N, 695W, 115, 945, HU, 50, NEQ, 80, 65, 60, 70, 1010, 200, 15,,, ,, , 270, 11, FLORENCE, 6 18 | AL, 06, 2018091206, , BEST, 30, 287N, 695W, 115, 945, HU, 64, NEQ, 60, 50, 40, 50, 1010, 200, 15,,, ,, , 270, 11, FLORENCE, 6 19 | AL, 06, 2018091212, , BEST, 36, 294N, 707W, 115, 945, HU, 34, NEQ, 150, 140, 110, 130, 1010, 200, 15,,, ,, , 270, 10, FLORENCE, 7 20 | AL, 06, 2018091212, , BEST, 36, 294N, 707W, 115, 945, HU, 50, NEQ, 90, 80, 60, 70, 1010, 200, 15,,, ,, , 270, 10, FLORENCE, 7 21 | AL, 06, 2018091212, , BEST, 36, 294N, 707W, 115, 945, HU, 64, NEQ, 60, 60, 40, 50, 1010, 200, 15,,, ,, , 270, 10, FLORENCE, 7 22 | AL, 06, 2018091218, , BEST, 42, 304N, 719W, 110, 949, HU, 34, NEQ, 170, 140, 110, 140, 1010, 200, 15,,, ,, , 270, 11, FLORENCE, 8 23 | AL, 06, 2018091218, , BEST, 42, 304N, 719W, 110, 949, HU, 50, NEQ, 90, 80, 60, 70, 1010, 200, 15,,, ,, , 270, 11, FLORENCE, 8 24 | AL, 06, 2018091218, , BEST, 42, 304N, 719W, 110, 949, HU, 64, NEQ, 60, 60, 40, 50, 1010, 200, 15,,, ,, , 270, 11, FLORENCE, 8 25 | AL, 06, 2018091300, , BEST, 48, 315N, 732W, 105, 955, HU, 34, NEQ, 170, 140, 110, 140, 1010, 200, 20,,, ,, , 270, 9, FLORENCE, 9 26 | AL, 06, 2018091300, , BEST, 48, 315N, 732W, 105, 955, HU, 50, NEQ, 110, 80, 70, 80, 1010, 200, 20,,, ,, , 270, 9, FLORENCE, 9 27 | AL, 06, 2018091300, , BEST, 48, 315N, 732W, 105, 955, HU, 64, NEQ, 70, 60, 50, 60, 1010, 200, 20,,, ,, , 270, 9, FLORENCE, 9 28 | AL, 06, 2018091306, , BEST, 54, 324N, 742W, 100, 955, HU, 34, NEQ, 170, 150, 110, 140, 1010, 200, 20,,, ,, , 270, 8, FLORENCE, 10 29 | AL, 06, 2018091306, , BEST, 54, 324N, 742W, 100, 955, HU, 50, NEQ, 100, 90, 70, 80, 1010, 200, 20,,, ,, , 270, 8, FLORENCE, 10 30 | AL, 06, 2018091306, , BEST, 54, 324N, 742W, 100, 955, HU, 64, NEQ, 70, 60, 50, 60, 1010, 200, 20,,, ,, , 270, 8, FLORENCE, 10 31 | AL, 06, 2018091312, , BEST, 60, 331N, 751W, 95, 954, HU, 34, NEQ, 170, 150, 120, 140, 1011, 200, 20,,, ,, , 270, 8, FLORENCE, 11 32 | AL, 06, 2018091312, , BEST, 60, 331N, 751W, 95, 954, HU, 50, NEQ, 100, 90, 80, 80, 1011, 200, 20,,, ,, , 270, 8, FLORENCE, 11 33 | AL, 06, 2018091312, , BEST, 60, 331N, 751W, 95, 954, HU, 64, NEQ, 70, 60, 50, 60, 1011, 200, 20,,, ,, , 270, 8, FLORENCE, 11 34 | AL, 06, 2018091318, , BEST, 66, 336N, 760W, 90, 953, HU, 34, NEQ, 170, 150, 120, 140, 1011, 200, 20,,, ,, , 270, 4, FLORENCE, 12 35 | AL, 06, 2018091318, , BEST, 66, 336N, 760W, 90, 953, HU, 50, NEQ, 100, 90, 80, 80, 1011, 200, 20,,, ,, , 270, 4, FLORENCE, 12 36 | AL, 06, 2018091318, , BEST, 66, 336N, 760W, 90, 953, HU, 64, NEQ, 70, 60, 50, 60, 1011, 200, 20,,, ,, , 270, 4, FLORENCE, 12 37 | AL, 06, 2018091400, , BEST, 72, 340N, 765W, 90, 952, HU, 34, NEQ, 170, 150, 130, 100, 1012, 200, 20,,, ,, , 270, 6, FLORENCE, 13 38 | AL, 06, 2018091400, , BEST, 72, 340N, 765W, 90, 952, HU, 50, NEQ, 100, 80, 80, 70, 1012, 200, 20,,, ,, , 270, 6, FLORENCE, 13 39 | AL, 06, 2018091400, , BEST, 72, 340N, 765W, 90, 952, HU, 64, NEQ, 70, 60, 50, 50, 1012, 200, 20,,, ,, , 270, 6, FLORENCE, 13 40 | AL, 06, 2018091406, , BEST, 78, 342N, 772W, 85, 952, HU, 34, NEQ, 170, 150, 130, 100, 1012, 200, 20,,, ,, , 270, 6, FLORENCE, 14 41 | AL, 06, 2018091406, , BEST, 78, 342N, 772W, 85, 952, HU, 50, NEQ, 100, 80, 80, 70, 1012, 200, 20,,, ,, , 270, 6, FLORENCE, 14 42 | AL, 06, 2018091406, , BEST, 78, 342N, 772W, 85, 952, HU, 64, NEQ, 70, 60, 60, 50, 1012, 200, 20,,, ,, , 270, 6, FLORENCE, 14 43 | AL, 06, 2018091411, , BEST, 83, 342N, 778W, 80, 956, HU, 34, NEQ, 170, 150, 140, 90, 1012, 200, 25,,, ,, , 270, 7, FLORENCE, 15 44 | AL, 06, 2018091411, , BEST, 83, 342N, 778W, 80, 956, HU, 50, NEQ, 100, 80, 80, 60, 1012, 200, 25,,, ,, , 270, 7, FLORENCE, 15 45 | AL, 06, 2018091411, , BEST, 83, 342N, 778W, 80, 956, HU, 64, NEQ, 70, 60, 60, 40, 1012, 200, 25,,, ,, , 270, 7, FLORENCE, 15 46 | AL, 06, 2018091412, , BEST, 84, 341N, 779W, 80, 957, HU, 34, NEQ, 170, 150, 140, 80, 1012, 200, 25,,, ,, , 270, 4, FLORENCE, 16 47 | AL, 06, 2018091412, , BEST, 84, 341N, 779W, 80, 957, HU, 50, NEQ, 100, 80, 80, 40, 1012, 200, 25,,, ,, , 270, 4, FLORENCE, 16 48 | AL, 06, 2018091412, , BEST, 84, 341N, 779W, 80, 957, HU, 64, NEQ, 60, 60, 60, 20, 1012, 200, 25,,, ,, , 270, 4, FLORENCE, 16 49 | AL, 06, 2018091418, , BEST, 90, 340N, 784W, 65, 969, HU, 34, NEQ, 150, 130, 120, 70, 1012, 200, 30,,, ,, , 270, 3, FLORENCE, 17 50 | AL, 06, 2018091418, , BEST, 90, 340N, 784W, 65, 969, HU, 50, NEQ, 90, 70, 60, 30, 1012, 200, 30,,, ,, , 270, 3, FLORENCE, 17 51 | AL, 06, 2018091418, , BEST, 90, 340N, 784W, 65, 969, HU, 64, NEQ, 0, 30, 30, 0, 1012, 200, 30,,, ,, , 270, 3, FLORENCE, 17 52 | AL, 06, 2018091500, , BEST, 96, 339N, 788W, 60, 978, TS, 34, NEQ, 150, 150, 100, 60, 1013, 210, 30,,, ,, , 270, 4, FLORENCE, 18 53 | AL, 06, 2018091500, , BEST, 96, 339N, 788W, 60, 978, TS, 50, NEQ, 70, 70, 50, 30, 1013, 210, 30,,, ,, , 270, 4, FLORENCE, 18 54 | AL, 06, 2018091506, , BEST, 102, 337N, 793W, 55, 986, TS, 34, NEQ, 150, 150, 90, 50, 1013, 210, 50,,, ,, , 270, 2, FLORENCE, 19 55 | AL, 06, 2018091506, , BEST, 102, 337N, 793W, 55, 986, TS, 50, NEQ, 70, 70, 0, 0, 1013, 210, 50,,, ,, , 270, 2, FLORENCE, 19 56 | AL, 06, 2018091512, , BEST, 108, 336N, 795W, 55, 992, TS, 34, NEQ, 150, 130, 80, 40, 1013, 220, 60,,, ,, , 270, 3, FLORENCE, 20 57 | AL, 06, 2018091512, , BEST, 108, 336N, 795W, 55, 992, TS, 50, NEQ, 60, 100, 0, 0, 1013, 220, 60,,, ,, , 270, 3, FLORENCE, 20 58 | AL, 06, 2018091518, , BEST, 114, 336N, 798W, 50, 997, TS, 34, NEQ, 140, 130, 0, 0, 1013, 220, 110,,, ,, , 270, 3, FLORENCE, 21 59 | AL, 06, 2018091518, , BEST, 114, 336N, 798W, 50, 997, TS, 50, NEQ, 0, 110, 0, 0, 1013, 220, 110,,, ,, , 270, 3, FLORENCE, 21 60 | AL, 06, 2018091600, , BEST, 120, 336N, 802W, 45, 998, TS, 34, NEQ, 130, 130, 0, 0, 1013, 240, 110,,, ,, , 270, 5, FLORENCE, 22 61 | AL, 06, 2018091606, , BEST, 126, 336N, 808W, 40, 999, TS, 34, NEQ, 130, 130, 0, 0, 1013, 260, 110,,, ,, , 270, 6, FLORENCE, 23 62 | AL, 06, 2018091612, , BEST, 132, 336N, 815W, 35, 1002, TS, 34, NEQ, 0, 140, 0, 0, 1013, 280, 140,,, ,, , 270, 5, FLORENCE, 24 63 | AL, 06, 2018091618, , BEST, 138, 341N, 821W, 30, 1006, TD, 0, , 0, 0, 0, 0, 1013, 300, 140,,, ,, , 270, 1, FLORENCE, 25 64 | AL, 06, 2018091700, , BEST, 144, 350N, 822W, 25, 1007, TD, 0, , 0, 0, 0, 0, 1013, 320, 150,,, ,, , 270, 3, FLORENCE, 26 65 | AL, 06, 2018091706, , BEST, 150, 364N, 826W, 25, 1008, TD, 0, , 0, 0, 0, 0, 1013, 340, 160,,, ,, , 90, 3, FLORENCE, 27 66 | AL, 06, 2018091712, , BEST, 156, 378N, 822W, 25, 1008, EX, 0, , 0, 0, 0, 0, 1013, 360, 160,,, ,, , 90, 2, FLORENCE, 28 67 | AL, 06, 2018091718, , BEST, 162, 388N, 820W, 25, 1008, EX, 0, , 0, 0, 0, 0, 1013, 360, 160,,, ,, , 90, 12, FLORENCE, 29 68 | AL, 06, 2018091800, , BEST, 168, 395N, 805W, 25, 1008, EX, 0, , 0, 0, 0, 0, 1013, 360, 160,,, ,, , 89, 29, FLORENCE, 30 69 | AL, 06, 2018091806, , BEST, 174, 413N, 768W, 25, 1007, EX, 0, , 0, 0, 0, 0, 1013, 360, 170,,, ,, , 89, 26, FLORENCE, 31 70 | AL, 06, 2018091812, , BEST, 180, 422N, 733W, 25, 1006, EX, 34, NEQ, 0, 0, 0, 0, 1013, 360, 180,,, ,, , 271, 26, FLORENCE, 32 71 | -------------------------------------------------------------------------------- /tests/data/reference/test_vortex_track_no_internet/vortex_2.22: -------------------------------------------------------------------------------- 1 | AL, 06, 2018091100, , BEST, 0, 256N, 618W, 115, 944, HU, 34, NEQ, 130, 130, 90, 130, 1010, 200, 10,,, ,, , 270, 13, FLORENCE, 1 2 | AL, 06, 2018091100, , BEST, 0, 256N, 618W, 115, 944, HU, 50, NEQ, 60, 60, 50, 60, 1010, 200, 10,,, ,, , 270, 13, FLORENCE, 1 3 | AL, 06, 2018091100, , BEST, 0, 256N, 618W, 115, 944, HU, 64, NEQ, 35, 30, 25, 35, 1010, 200, 10,,, ,, , 270, 13, FLORENCE, 1 4 | AL, 06, 2018091106, , BEST, 6, 260N, 632W, 115, 950, HU, 34, NEQ, 130, 130, 90, 140, 1010, 200, 15,,, ,, , 270, 14, FLORENCE, 2 5 | AL, 06, 2018091106, , BEST, 6, 260N, 632W, 115, 950, HU, 50, NEQ, 60, 60, 50, 60, 1010, 200, 15,,, ,, , 270, 14, FLORENCE, 2 6 | AL, 06, 2018091106, , BEST, 6, 260N, 632W, 115, 950, HU, 64, NEQ, 35, 30, 25, 35, 1010, 200, 15,,, ,, , 270, 14, FLORENCE, 2 7 | AL, 06, 2018091112, , BEST, 12, 265N, 647W, 125, 947, HU, 34, NEQ, 140, 130, 90, 120, 1010, 200, 15,,, ,, , 270, 15, FLORENCE, 3 8 | AL, 06, 2018091112, , BEST, 12, 265N, 647W, 125, 947, HU, 50, NEQ, 70, 60, 50, 70, 1010, 200, 15,,, ,, , 270, 15, FLORENCE, 3 9 | AL, 06, 2018091112, , BEST, 12, 265N, 647W, 125, 947, HU, 64, NEQ, 40, 35, 35, 40, 1010, 200, 15,,, ,, , 270, 15, FLORENCE, 3 10 | AL, 06, 2018091118, , BEST, 18, 272N, 664W, 130, 937, HU, 34, NEQ, 150, 130, 100, 140, 1010, 200, 10,,, ,, , 270, 15, FLORENCE, 4 11 | AL, 06, 2018091118, , BEST, 18, 272N, 664W, 130, 937, HU, 50, NEQ, 80, 60, 50, 70, 1010, 200, 10,,, ,, , 270, 15, FLORENCE, 4 12 | AL, 06, 2018091118, , BEST, 18, 272N, 664W, 130, 937, HU, 64, NEQ, 50, 40, 40, 45, 1010, 200, 10,,, ,, , 270, 15, FLORENCE, 4 13 | AL, 06, 2018091200, , BEST, 24, 279N, 681W, 120, 943, HU, 34, NEQ, 150, 130, 100, 140, 1010, 200, 10,,, ,, , 270, 12, FLORENCE, 5 14 | AL, 06, 2018091200, , BEST, 24, 279N, 681W, 120, 943, HU, 50, NEQ, 80, 60, 50, 70, 1010, 200, 10,,, ,, , 270, 12, FLORENCE, 5 15 | AL, 06, 2018091200, , BEST, 24, 279N, 681W, 120, 943, HU, 64, NEQ, 50, 45, 40, 45, 1010, 200, 10,,, ,, , 270, 12, FLORENCE, 5 16 | AL, 06, 2018091206, , BEST, 30, 287N, 695W, 115, 945, HU, 34, NEQ, 150, 140, 110, 140, 1010, 200, 15,,, ,, , 270, 11, FLORENCE, 6 17 | AL, 06, 2018091206, , BEST, 30, 287N, 695W, 115, 945, HU, 50, NEQ, 80, 65, 60, 70, 1010, 200, 15,,, ,, , 270, 11, FLORENCE, 6 18 | AL, 06, 2018091206, , BEST, 30, 287N, 695W, 115, 945, HU, 64, NEQ, 60, 50, 40, 50, 1010, 200, 15,,, ,, , 270, 11, FLORENCE, 6 19 | AL, 06, 2018091212, , BEST, 36, 294N, 707W, 115, 945, HU, 34, NEQ, 150, 140, 110, 130, 1010, 200, 15,,, ,, , 270, 10, FLORENCE, 7 20 | AL, 06, 2018091212, , BEST, 36, 294N, 707W, 115, 945, HU, 50, NEQ, 90, 80, 60, 70, 1010, 200, 15,,, ,, , 270, 10, FLORENCE, 7 21 | AL, 06, 2018091212, , BEST, 36, 294N, 707W, 115, 945, HU, 64, NEQ, 60, 60, 40, 50, 1010, 200, 15,,, ,, , 270, 10, FLORENCE, 7 22 | AL, 06, 2018091218, , BEST, 42, 304N, 719W, 110, 949, HU, 34, NEQ, 170, 140, 110, 140, 1010, 200, 15,,, ,, , 270, 11, FLORENCE, 8 23 | AL, 06, 2018091218, , BEST, 42, 304N, 719W, 110, 949, HU, 50, NEQ, 90, 80, 60, 70, 1010, 200, 15,,, ,, , 270, 11, FLORENCE, 8 24 | AL, 06, 2018091218, , BEST, 42, 304N, 719W, 110, 949, HU, 64, NEQ, 60, 60, 40, 50, 1010, 200, 15,,, ,, , 270, 11, FLORENCE, 8 25 | AL, 06, 2018091300, , BEST, 48, 315N, 732W, 105, 955, HU, 34, NEQ, 170, 140, 110, 140, 1010, 200, 20,,, ,, , 270, 9, FLORENCE, 9 26 | AL, 06, 2018091300, , BEST, 48, 315N, 732W, 105, 955, HU, 50, NEQ, 110, 80, 70, 80, 1010, 200, 20,,, ,, , 270, 9, FLORENCE, 9 27 | AL, 06, 2018091300, , BEST, 48, 315N, 732W, 105, 955, HU, 64, NEQ, 70, 60, 50, 60, 1010, 200, 20,,, ,, , 270, 9, FLORENCE, 9 28 | AL, 06, 2018091306, , BEST, 54, 324N, 742W, 100, 955, HU, 34, NEQ, 170, 150, 110, 140, 1010, 200, 20,,, ,, , 270, 8, FLORENCE, 10 29 | AL, 06, 2018091306, , BEST, 54, 324N, 742W, 100, 955, HU, 50, NEQ, 100, 90, 70, 80, 1010, 200, 20,,, ,, , 270, 8, FLORENCE, 10 30 | AL, 06, 2018091306, , BEST, 54, 324N, 742W, 100, 955, HU, 64, NEQ, 70, 60, 50, 60, 1010, 200, 20,,, ,, , 270, 8, FLORENCE, 10 31 | AL, 06, 2018091312, , BEST, 60, 331N, 751W, 95, 954, HU, 34, NEQ, 170, 150, 120, 140, 1011, 200, 20,,, ,, , 270, 8, FLORENCE, 11 32 | AL, 06, 2018091312, , BEST, 60, 331N, 751W, 95, 954, HU, 50, NEQ, 100, 90, 80, 80, 1011, 200, 20,,, ,, , 270, 8, FLORENCE, 11 33 | AL, 06, 2018091312, , BEST, 60, 331N, 751W, 95, 954, HU, 64, NEQ, 70, 60, 50, 60, 1011, 200, 20,,, ,, , 270, 8, FLORENCE, 11 34 | AL, 06, 2018091318, , BEST, 66, 336N, 760W, 90, 953, HU, 34, NEQ, 170, 150, 120, 140, 1011, 200, 20,,, ,, , 270, 4, FLORENCE, 12 35 | AL, 06, 2018091318, , BEST, 66, 336N, 760W, 90, 953, HU, 50, NEQ, 100, 90, 80, 80, 1011, 200, 20,,, ,, , 270, 4, FLORENCE, 12 36 | AL, 06, 2018091318, , BEST, 66, 336N, 760W, 90, 953, HU, 64, NEQ, 70, 60, 50, 60, 1011, 200, 20,,, ,, , 270, 4, FLORENCE, 12 37 | AL, 06, 2018091400, , BEST, 72, 340N, 765W, 90, 952, HU, 34, NEQ, 170, 150, 130, 100, 1012, 200, 20,,, ,, , 270, 6, FLORENCE, 13 38 | AL, 06, 2018091400, , BEST, 72, 340N, 765W, 90, 952, HU, 50, NEQ, 100, 80, 80, 70, 1012, 200, 20,,, ,, , 270, 6, FLORENCE, 13 39 | AL, 06, 2018091400, , BEST, 72, 340N, 765W, 90, 952, HU, 64, NEQ, 70, 60, 50, 50, 1012, 200, 20,,, ,, , 270, 6, FLORENCE, 13 40 | AL, 06, 2018091406, , BEST, 78, 342N, 772W, 85, 952, HU, 34, NEQ, 170, 150, 130, 100, 1012, 200, 20,,, ,, , 270, 6, FLORENCE, 14 41 | AL, 06, 2018091406, , BEST, 78, 342N, 772W, 85, 952, HU, 50, NEQ, 100, 80, 80, 70, 1012, 200, 20,,, ,, , 270, 6, FLORENCE, 14 42 | AL, 06, 2018091406, , BEST, 78, 342N, 772W, 85, 952, HU, 64, NEQ, 70, 60, 60, 50, 1012, 200, 20,,, ,, , 270, 6, FLORENCE, 14 43 | AL, 06, 2018091411, , BEST, 83, 342N, 778W, 80, 956, HU, 34, NEQ, 170, 150, 140, 90, 1012, 200, 25,,, ,, , 270, 7, FLORENCE, 15 44 | AL, 06, 2018091411, , BEST, 83, 342N, 778W, 80, 956, HU, 50, NEQ, 100, 80, 80, 60, 1012, 200, 25,,, ,, , 270, 7, FLORENCE, 15 45 | AL, 06, 2018091411, , BEST, 83, 342N, 778W, 80, 956, HU, 64, NEQ, 70, 60, 60, 40, 1012, 200, 25,,, ,, , 270, 7, FLORENCE, 15 46 | AL, 06, 2018091412, , BEST, 84, 341N, 779W, 80, 957, HU, 34, NEQ, 170, 150, 140, 80, 1012, 200, 25,,, ,, , 270, 4, FLORENCE, 16 47 | AL, 06, 2018091412, , BEST, 84, 341N, 779W, 80, 957, HU, 50, NEQ, 100, 80, 80, 40, 1012, 200, 25,,, ,, , 270, 4, FLORENCE, 16 48 | AL, 06, 2018091412, , BEST, 84, 341N, 779W, 80, 957, HU, 64, NEQ, 60, 60, 60, 20, 1012, 200, 25,,, ,, , 270, 4, FLORENCE, 16 49 | AL, 06, 2018091418, , BEST, 90, 340N, 784W, 65, 969, HU, 34, NEQ, 150, 130, 120, 70, 1012, 200, 30,,, ,, , 270, 3, FLORENCE, 17 50 | AL, 06, 2018091418, , BEST, 90, 340N, 784W, 65, 969, HU, 50, NEQ, 90, 70, 60, 30, 1012, 200, 30,,, ,, , 270, 3, FLORENCE, 17 51 | AL, 06, 2018091418, , BEST, 90, 340N, 784W, 65, 969, HU, 64, NEQ, 0, 30, 30, 0, 1012, 200, 30,,, ,, , 270, 3, FLORENCE, 17 52 | AL, 06, 2018091500, , BEST, 96, 339N, 788W, 60, 978, TS, 34, NEQ, 150, 150, 100, 60, 1013, 210, 30,,, ,, , 270, 4, FLORENCE, 18 53 | AL, 06, 2018091500, , BEST, 96, 339N, 788W, 60, 978, TS, 50, NEQ, 70, 70, 50, 30, 1013, 210, 30,,, ,, , 270, 4, FLORENCE, 18 54 | AL, 06, 2018091506, , BEST, 102, 337N, 793W, 55, 986, TS, 34, NEQ, 150, 150, 90, 50, 1013, 210, 50,,, ,, , 270, 2, FLORENCE, 19 55 | AL, 06, 2018091506, , BEST, 102, 337N, 793W, 55, 986, TS, 50, NEQ, 70, 70, 0, 0, 1013, 210, 50,,, ,, , 270, 2, FLORENCE, 19 56 | AL, 06, 2018091512, , BEST, 108, 336N, 795W, 55, 992, TS, 34, NEQ, 150, 130, 80, 40, 1013, 220, 60,,, ,, , 270, 3, FLORENCE, 20 57 | AL, 06, 2018091512, , BEST, 108, 336N, 795W, 55, 992, TS, 50, NEQ, 60, 100, 0, 0, 1013, 220, 60,,, ,, , 270, 3, FLORENCE, 20 58 | AL, 06, 2018091518, , BEST, 114, 336N, 798W, 50, 997, TS, 34, NEQ, 140, 130, 0, 0, 1013, 220, 110,,, ,, , 270, 3, FLORENCE, 21 59 | AL, 06, 2018091518, , BEST, 114, 336N, 798W, 50, 997, TS, 50, NEQ, 0, 110, 0, 0, 1013, 220, 110,,, ,, , 270, 3, FLORENCE, 21 60 | AL, 06, 2018091600, , BEST, 120, 336N, 802W, 45, 998, TS, 34, NEQ, 130, 130, 0, 0, 1013, 240, 110,,, ,, , 270, 5, FLORENCE, 22 61 | AL, 06, 2018091606, , BEST, 126, 336N, 808W, 40, 999, TS, 34, NEQ, 130, 130, 0, 0, 1013, 260, 110,,, ,, , 270, 6, FLORENCE, 23 62 | AL, 06, 2018091612, , BEST, 132, 336N, 815W, 35, 1002, TS, 34, NEQ, 0, 140, 0, 0, 1013, 280, 140,,, ,, , 270, 5, FLORENCE, 24 63 | AL, 06, 2018091618, , BEST, 138, 341N, 821W, 30, 1006, TD, 0, , 0, 0, 0, 0, 1013, 300, 140,,, ,, , 270, 1, FLORENCE, 25 64 | AL, 06, 2018091700, , BEST, 144, 350N, 822W, 25, 1007, TD, 0, , 0, 0, 0, 0, 1013, 320, 150,,, ,, , 270, 3, FLORENCE, 26 65 | AL, 06, 2018091706, , BEST, 150, 364N, 826W, 25, 1008, TD, 0, , 0, 0, 0, 0, 1013, 340, 160,,, ,, , 90, 3, FLORENCE, 27 66 | AL, 06, 2018091712, , BEST, 156, 378N, 822W, 25, 1008, EX, 0, , 0, 0, 0, 0, 1013, 360, 160,,, ,, , 90, 2, FLORENCE, 28 67 | AL, 06, 2018091718, , BEST, 162, 388N, 820W, 25, 1008, EX, 0, , 0, 0, 0, 0, 1013, 360, 160,,, ,, , 90, 12, FLORENCE, 29 68 | AL, 06, 2018091800, , BEST, 168, 395N, 805W, 25, 1008, EX, 0, , 0, 0, 0, 0, 1013, 360, 160,,, ,, , 89, 29, FLORENCE, 30 69 | AL, 06, 2018091806, , BEST, 174, 413N, 768W, 25, 1007, EX, 0, , 0, 0, 0, 0, 1013, 360, 170,,, ,, , 89, 26, FLORENCE, 31 70 | AL, 06, 2018091812, , BEST, 180, 422N, 733W, 25, 1006, EX, 34, NEQ, 0, 0, 0, 0, 1013, 360, 180,,, ,, , 271, 26, FLORENCE, 32 71 | -------------------------------------------------------------------------------- /tests/data/reference/test_vortex_track_no_internet/vortex_3.22: -------------------------------------------------------------------------------- 1 | AL, 06, 2018091100, , BEST, 0, 256N, 618W, 115, 944, HU, 34, NEQ, 130, 130, 90, 130, 1010, 200, 10,,, ,, , 270, 13, FLORENCE, 1 2 | AL, 06, 2018091100, , BEST, 0, 256N, 618W, 115, 944, HU, 50, NEQ, 60, 60, 50, 60, 1010, 200, 10,,, ,, , 270, 13, FLORENCE, 1 3 | AL, 06, 2018091100, , BEST, 0, 256N, 618W, 115, 944, HU, 64, NEQ, 35, 30, 25, 35, 1010, 200, 10,,, ,, , 270, 13, FLORENCE, 1 4 | AL, 06, 2018091106, , BEST, 6, 260N, 632W, 115, 950, HU, 34, NEQ, 130, 130, 90, 140, 1010, 200, 15,,, ,, , 270, 14, FLORENCE, 2 5 | AL, 06, 2018091106, , BEST, 6, 260N, 632W, 115, 950, HU, 50, NEQ, 60, 60, 50, 60, 1010, 200, 15,,, ,, , 270, 14, FLORENCE, 2 6 | AL, 06, 2018091106, , BEST, 6, 260N, 632W, 115, 950, HU, 64, NEQ, 35, 30, 25, 35, 1010, 200, 15,,, ,, , 270, 14, FLORENCE, 2 7 | AL, 06, 2018091112, , BEST, 12, 265N, 647W, 125, 947, HU, 34, NEQ, 140, 130, 90, 120, 1010, 200, 15,,, ,, , 270, 15, FLORENCE, 3 8 | AL, 06, 2018091112, , BEST, 12, 265N, 647W, 125, 947, HU, 50, NEQ, 70, 60, 50, 70, 1010, 200, 15,,, ,, , 270, 15, FLORENCE, 3 9 | AL, 06, 2018091112, , BEST, 12, 265N, 647W, 125, 947, HU, 64, NEQ, 40, 35, 35, 40, 1010, 200, 15,,, ,, , 270, 15, FLORENCE, 3 10 | AL, 06, 2018091118, , BEST, 18, 272N, 664W, 130, 937, HU, 34, NEQ, 150, 130, 100, 140, 1010, 200, 10,,, ,, , 270, 15, FLORENCE, 4 11 | AL, 06, 2018091118, , BEST, 18, 272N, 664W, 130, 937, HU, 50, NEQ, 80, 60, 50, 70, 1010, 200, 10,,, ,, , 270, 15, FLORENCE, 4 12 | AL, 06, 2018091118, , BEST, 18, 272N, 664W, 130, 937, HU, 64, NEQ, 50, 40, 40, 45, 1010, 200, 10,,, ,, , 270, 15, FLORENCE, 4 13 | AL, 06, 2018091200, , BEST, 24, 279N, 681W, 120, 943, HU, 34, NEQ, 150, 130, 100, 140, 1010, 200, 10,,, ,, , 270, 12, FLORENCE, 5 14 | AL, 06, 2018091200, , BEST, 24, 279N, 681W, 120, 943, HU, 50, NEQ, 80, 60, 50, 70, 1010, 200, 10,,, ,, , 270, 12, FLORENCE, 5 15 | AL, 06, 2018091200, , BEST, 24, 279N, 681W, 120, 943, HU, 64, NEQ, 50, 45, 40, 45, 1010, 200, 10,,, ,, , 270, 12, FLORENCE, 5 16 | AL, 06, 2018091206, , BEST, 30, 287N, 695W, 115, 945, HU, 34, NEQ, 150, 140, 110, 140, 1010, 200, 15,,, ,, , 270, 11, FLORENCE, 6 17 | AL, 06, 2018091206, , BEST, 30, 287N, 695W, 115, 945, HU, 50, NEQ, 80, 65, 60, 70, 1010, 200, 15,,, ,, , 270, 11, FLORENCE, 6 18 | AL, 06, 2018091206, , BEST, 30, 287N, 695W, 115, 945, HU, 64, NEQ, 60, 50, 40, 50, 1010, 200, 15,,, ,, , 270, 11, FLORENCE, 6 19 | AL, 06, 2018091212, , BEST, 36, 294N, 707W, 115, 945, HU, 34, NEQ, 150, 140, 110, 130, 1010, 200, 15,,, ,, , 270, 10, FLORENCE, 7 20 | AL, 06, 2018091212, , BEST, 36, 294N, 707W, 115, 945, HU, 50, NEQ, 90, 80, 60, 70, 1010, 200, 15,,, ,, , 270, 10, FLORENCE, 7 21 | AL, 06, 2018091212, , BEST, 36, 294N, 707W, 115, 945, HU, 64, NEQ, 60, 60, 40, 50, 1010, 200, 15,,, ,, , 270, 10, FLORENCE, 7 22 | AL, 06, 2018091218, , BEST, 42, 304N, 719W, 110, 949, HU, 34, NEQ, 170, 140, 110, 140, 1010, 200, 15,,, ,, , 270, 11, FLORENCE, 8 23 | AL, 06, 2018091218, , BEST, 42, 304N, 719W, 110, 949, HU, 50, NEQ, 90, 80, 60, 70, 1010, 200, 15,,, ,, , 270, 11, FLORENCE, 8 24 | AL, 06, 2018091218, , BEST, 42, 304N, 719W, 110, 949, HU, 64, NEQ, 60, 60, 40, 50, 1010, 200, 15,,, ,, , 270, 11, FLORENCE, 8 25 | AL, 06, 2018091300, , BEST, 48, 315N, 732W, 105, 955, HU, 34, NEQ, 170, 140, 110, 140, 1010, 200, 20,,, ,, , 270, 9, FLORENCE, 9 26 | AL, 06, 2018091300, , BEST, 48, 315N, 732W, 105, 955, HU, 50, NEQ, 110, 80, 70, 80, 1010, 200, 20,,, ,, , 270, 9, FLORENCE, 9 27 | AL, 06, 2018091300, , BEST, 48, 315N, 732W, 105, 955, HU, 64, NEQ, 70, 60, 50, 60, 1010, 200, 20,,, ,, , 270, 9, FLORENCE, 9 28 | AL, 06, 2018091306, , BEST, 54, 324N, 742W, 100, 955, HU, 34, NEQ, 170, 150, 110, 140, 1010, 200, 20,,, ,, , 270, 8, FLORENCE, 10 29 | AL, 06, 2018091306, , BEST, 54, 324N, 742W, 100, 955, HU, 50, NEQ, 100, 90, 70, 80, 1010, 200, 20,,, ,, , 270, 8, FLORENCE, 10 30 | AL, 06, 2018091306, , BEST, 54, 324N, 742W, 100, 955, HU, 64, NEQ, 70, 60, 50, 60, 1010, 200, 20,,, ,, , 270, 8, FLORENCE, 10 31 | AL, 06, 2018091312, , BEST, 60, 331N, 751W, 95, 954, HU, 34, NEQ, 170, 150, 120, 140, 1011, 200, 20,,, ,, , 270, 8, FLORENCE, 11 32 | AL, 06, 2018091312, , BEST, 60, 331N, 751W, 95, 954, HU, 50, NEQ, 100, 90, 80, 80, 1011, 200, 20,,, ,, , 270, 8, FLORENCE, 11 33 | AL, 06, 2018091312, , BEST, 60, 331N, 751W, 95, 954, HU, 64, NEQ, 70, 60, 50, 60, 1011, 200, 20,,, ,, , 270, 8, FLORENCE, 11 34 | AL, 06, 2018091318, , BEST, 66, 336N, 760W, 90, 953, HU, 34, NEQ, 170, 150, 120, 140, 1011, 200, 20,,, ,, , 270, 4, FLORENCE, 12 35 | AL, 06, 2018091318, , BEST, 66, 336N, 760W, 90, 953, HU, 50, NEQ, 100, 90, 80, 80, 1011, 200, 20,,, ,, , 270, 4, FLORENCE, 12 36 | AL, 06, 2018091318, , BEST, 66, 336N, 760W, 90, 953, HU, 64, NEQ, 70, 60, 50, 60, 1011, 200, 20,,, ,, , 270, 4, FLORENCE, 12 37 | AL, 06, 2018091400, , BEST, 72, 340N, 765W, 90, 952, HU, 34, NEQ, 170, 150, 130, 100, 1012, 200, 20,,, ,, , 270, 6, FLORENCE, 13 38 | AL, 06, 2018091400, , BEST, 72, 340N, 765W, 90, 952, HU, 50, NEQ, 100, 80, 80, 70, 1012, 200, 20,,, ,, , 270, 6, FLORENCE, 13 39 | AL, 06, 2018091400, , BEST, 72, 340N, 765W, 90, 952, HU, 64, NEQ, 70, 60, 50, 50, 1012, 200, 20,,, ,, , 270, 6, FLORENCE, 13 40 | AL, 06, 2018091406, , BEST, 78, 342N, 772W, 85, 952, HU, 34, NEQ, 170, 150, 130, 100, 1012, 200, 20,,, ,, , 270, 6, FLORENCE, 14 41 | AL, 06, 2018091406, , BEST, 78, 342N, 772W, 85, 952, HU, 50, NEQ, 100, 80, 80, 70, 1012, 200, 20,,, ,, , 270, 6, FLORENCE, 14 42 | AL, 06, 2018091406, , BEST, 78, 342N, 772W, 85, 952, HU, 64, NEQ, 70, 60, 60, 50, 1012, 200, 20,,, ,, , 270, 6, FLORENCE, 14 43 | AL, 06, 2018091411, , BEST, 83, 342N, 778W, 80, 956, HU, 34, NEQ, 170, 150, 140, 90, 1012, 200, 25,,, ,, , 270, 7, FLORENCE, 15 44 | AL, 06, 2018091411, , BEST, 83, 342N, 778W, 80, 956, HU, 50, NEQ, 100, 80, 80, 60, 1012, 200, 25,,, ,, , 270, 7, FLORENCE, 15 45 | AL, 06, 2018091411, , BEST, 83, 342N, 778W, 80, 956, HU, 64, NEQ, 70, 60, 60, 40, 1012, 200, 25,,, ,, , 270, 7, FLORENCE, 15 46 | AL, 06, 2018091412, , BEST, 84, 341N, 779W, 80, 957, HU, 34, NEQ, 170, 150, 140, 80, 1012, 200, 25,,, ,, , 270, 4, FLORENCE, 16 47 | AL, 06, 2018091412, , BEST, 84, 341N, 779W, 80, 957, HU, 50, NEQ, 100, 80, 80, 40, 1012, 200, 25,,, ,, , 270, 4, FLORENCE, 16 48 | AL, 06, 2018091412, , BEST, 84, 341N, 779W, 80, 957, HU, 64, NEQ, 60, 60, 60, 20, 1012, 200, 25,,, ,, , 270, 4, FLORENCE, 16 49 | AL, 06, 2018091418, , BEST, 90, 340N, 784W, 65, 969, HU, 34, NEQ, 150, 130, 120, 70, 1012, 200, 30,,, ,, , 270, 3, FLORENCE, 17 50 | AL, 06, 2018091418, , BEST, 90, 340N, 784W, 65, 969, HU, 50, NEQ, 90, 70, 60, 30, 1012, 200, 30,,, ,, , 270, 3, FLORENCE, 17 51 | AL, 06, 2018091418, , BEST, 90, 340N, 784W, 65, 969, HU, 64, NEQ, 0, 30, 30, 0, 1012, 200, 30,,, ,, , 270, 3, FLORENCE, 17 52 | AL, 06, 2018091500, , BEST, 96, 339N, 788W, 60, 978, TS, 34, NEQ, 150, 150, 100, 60, 1013, 210, 30,,, ,, , 270, 4, FLORENCE, 18 53 | AL, 06, 2018091500, , BEST, 96, 339N, 788W, 60, 978, TS, 50, NEQ, 70, 70, 50, 30, 1013, 210, 30,,, ,, , 270, 4, FLORENCE, 18 54 | AL, 06, 2018091506, , BEST, 102, 337N, 793W, 55, 986, TS, 34, NEQ, 150, 150, 90, 50, 1013, 210, 50,,, ,, , 270, 2, FLORENCE, 19 55 | AL, 06, 2018091506, , BEST, 102, 337N, 793W, 55, 986, TS, 50, NEQ, 70, 70, 0, 0, 1013, 210, 50,,, ,, , 270, 2, FLORENCE, 19 56 | AL, 06, 2018091512, , BEST, 108, 336N, 795W, 55, 992, TS, 34, NEQ, 150, 130, 80, 40, 1013, 220, 60,,, ,, , 270, 3, FLORENCE, 20 57 | AL, 06, 2018091512, , BEST, 108, 336N, 795W, 55, 992, TS, 50, NEQ, 60, 100, 0, 0, 1013, 220, 60,,, ,, , 270, 3, FLORENCE, 20 58 | AL, 06, 2018091518, , BEST, 114, 336N, 798W, 50, 997, TS, 34, NEQ, 140, 130, 0, 0, 1013, 220, 110,,, ,, , 270, 3, FLORENCE, 21 59 | AL, 06, 2018091518, , BEST, 114, 336N, 798W, 50, 997, TS, 50, NEQ, 0, 110, 0, 0, 1013, 220, 110,,, ,, , 270, 3, FLORENCE, 21 60 | AL, 06, 2018091600, , BEST, 120, 336N, 802W, 45, 998, TS, 34, NEQ, 130, 130, 0, 0, 1013, 240, 110,,, ,, , 270, 5, FLORENCE, 22 61 | AL, 06, 2018091606, , BEST, 126, 336N, 808W, 40, 999, TS, 34, NEQ, 130, 130, 0, 0, 1013, 260, 110,,, ,, , 270, 6, FLORENCE, 23 62 | AL, 06, 2018091612, , BEST, 132, 336N, 815W, 35, 1002, TS, 34, NEQ, 0, 140, 0, 0, 1013, 280, 140,,, ,, , 270, 5, FLORENCE, 24 63 | AL, 06, 2018091618, , BEST, 138, 341N, 821W, 30, 1006, TD, 0, , 0, 0, 0, 0, 1013, 300, 140,,, ,, , 270, 1, FLORENCE, 25 64 | AL, 06, 2018091700, , BEST, 144, 350N, 822W, 25, 1007, TD, 0, , 0, 0, 0, 0, 1013, 320, 150,,, ,, , 270, 3, FLORENCE, 26 65 | AL, 06, 2018091706, , BEST, 150, 364N, 826W, 25, 1008, TD, 0, , 0, 0, 0, 0, 1013, 340, 160,,, ,, , 90, 3, FLORENCE, 27 66 | AL, 06, 2018091712, , BEST, 156, 378N, 822W, 25, 1008, EX, 0, , 0, 0, 0, 0, 1013, 360, 160,,, ,, , 90, 2, FLORENCE, 28 67 | AL, 06, 2018091718, , BEST, 162, 388N, 820W, 25, 1008, EX, 0, , 0, 0, 0, 0, 1013, 360, 160,,, ,, , 90, 12, FLORENCE, 29 68 | AL, 06, 2018091800, , BEST, 168, 395N, 805W, 25, 1008, EX, 0, , 0, 0, 0, 0, 1013, 360, 160,,, ,, , 89, 29, FLORENCE, 30 69 | AL, 06, 2018091806, , BEST, 174, 413N, 768W, 25, 1007, EX, 0, , 0, 0, 0, 0, 1013, 360, 170,,, ,, , 89, 26, FLORENCE, 31 70 | AL, 06, 2018091812, , BEST, 180, 422N, 733W, 25, 1006, EX, 34, NEQ, 0, 0, 0, 0, 1013, 360, 180,,, ,, , 271, 26, FLORENCE, 32 71 | -------------------------------------------------------------------------------- /tests/data/reference/test_vortex_track_file_decks/b-deck_BEST.22: -------------------------------------------------------------------------------- 1 | AL, 06, 2018091106, , BEST, 0, 260N, 632W, 115, 950, HU, 34, NEQ, 130, 130, 90, 140, 1010, 200, 15, 145, 0, L, 0, , 288, 7, FLORENCE, 1 2 | AL, 06, 2018091106, , BEST, 0, 260N, 632W, 115, 950, HU, 50, NEQ, 60, 60, 50, 60, 1010, 200, 15, 145, 0, L, 0, , 288, 7, FLORENCE, 1 3 | AL, 06, 2018091106, , BEST, 0, 260N, 632W, 115, 950, HU, 64, NEQ, 35, 30, 25, 35, 1010, 200, 15, 145, 0, L, 0, , 288, 7, FLORENCE, 1 4 | AL, 06, 2018091112, , BEST, 0, 265N, 647W, 125, 947, HU, 34, NEQ, 140, 130, 90, 120, 1010, 200, 15, 140, 0, L, 0, , 291, 7, FLORENCE, 2 5 | AL, 06, 2018091112, , BEST, 0, 265N, 647W, 125, 947, HU, 50, NEQ, 70, 60, 50, 70, 1010, 200, 15, 140, 0, L, 0, , 291, 7, FLORENCE, 2 6 | AL, 06, 2018091112, , BEST, 0, 265N, 647W, 125, 947, HU, 64, NEQ, 40, 35, 35, 40, 1010, 200, 15, 140, 0, L, 0, , 291, 7, FLORENCE, 2 7 | AL, 06, 2018091118, , BEST, 0, 272N, 664W, 130, 937, HU, 34, NEQ, 150, 130, 100, 140, 1010, 200, 10, 145, 0, L, 0, , 295, 9, FLORENCE, 3 8 | AL, 06, 2018091118, , BEST, 0, 272N, 664W, 130, 937, HU, 50, NEQ, 80, 60, 50, 70, 1010, 200, 10, 145, 0, L, 0, , 295, 9, FLORENCE, 3 9 | AL, 06, 2018091118, , BEST, 0, 272N, 664W, 130, 937, HU, 64, NEQ, 50, 40, 40, 45, 1010, 200, 10, 145, 0, L, 0, , 295, 9, FLORENCE, 3 10 | AL, 06, 2018091200, , BEST, 0, 279N, 681W, 120, 943, HU, 34, NEQ, 150, 130, 100, 140, 1010, 200, 10, 145, 0, L, 0, , 295, 9, FLORENCE, 4 11 | AL, 06, 2018091200, , BEST, 0, 279N, 681W, 120, 943, HU, 50, NEQ, 80, 60, 50, 70, 1010, 200, 10, 145, 0, L, 0, , 295, 9, FLORENCE, 4 12 | AL, 06, 2018091200, , BEST, 0, 279N, 681W, 120, 943, HU, 64, NEQ, 50, 45, 40, 45, 1010, 200, 10, 145, 0, L, 0, , 295, 9, FLORENCE, 4 13 | AL, 06, 2018091206, , BEST, 0, 287N, 695W, 115, 945, HU, 34, NEQ, 150, 140, 110, 140, 1010, 200, 15, 140, 20, L, 0, , 303, 8, FLORENCE, 5 14 | AL, 06, 2018091206, , BEST, 0, 287N, 695W, 115, 945, HU, 50, NEQ, 80, 65, 60, 70, 1010, 200, 15, 140, 20, L, 0, , 303, 8, FLORENCE, 5 15 | AL, 06, 2018091206, , BEST, 0, 287N, 695W, 115, 945, HU, 64, NEQ, 60, 50, 40, 50, 1010, 200, 15, 140, 20, L, 0, , 303, 8, FLORENCE, 5 16 | AL, 06, 2018091212, , BEST, 0, 294N, 707W, 115, 945, HU, 34, NEQ, 150, 140, 110, 130, 1010, 200, 15, 140, 0, L, 0, , 304, 6, FLORENCE, 6 17 | AL, 06, 2018091212, , BEST, 0, 294N, 707W, 115, 945, HU, 50, NEQ, 90, 80, 60, 70, 1010, 200, 15, 140, 0, L, 0, , 304, 6, FLORENCE, 6 18 | AL, 06, 2018091212, , BEST, 0, 294N, 707W, 115, 945, HU, 64, NEQ, 60, 60, 40, 50, 1010, 200, 15, 140, 0, L, 0, , 304, 6, FLORENCE, 6 19 | AL, 06, 2018091218, , BEST, 0, 304N, 719W, 110, 949, HU, 34, NEQ, 170, 140, 110, 140, 1010, 200, 15, 135, 0, L, 0, , 314, 7, FLORENCE, 7 20 | AL, 06, 2018091218, , BEST, 0, 304N, 719W, 110, 949, HU, 50, NEQ, 90, 80, 60, 70, 1010, 200, 15, 135, 0, L, 0, , 314, 7, FLORENCE, 7 21 | AL, 06, 2018091218, , BEST, 0, 304N, 719W, 110, 949, HU, 64, NEQ, 60, 60, 40, 50, 1010, 200, 15, 135, 0, L, 0, , 314, 7, FLORENCE, 7 22 | AL, 06, 2018091300, , BEST, 0, 315N, 732W, 105, 955, HU, 34, NEQ, 170, 140, 110, 140, 1010, 200, 20, 120, 0, L, 0, , 315, 8, FLORENCE, 8 23 | AL, 06, 2018091300, , BEST, 0, 315N, 732W, 105, 955, HU, 50, NEQ, 110, 80, 70, 80, 1010, 200, 20, 120, 0, L, 0, , 315, 8, FLORENCE, 8 24 | AL, 06, 2018091300, , BEST, 0, 315N, 732W, 105, 955, HU, 64, NEQ, 70, 60, 50, 60, 1010, 200, 20, 120, 0, L, 0, , 315, 8, FLORENCE, 8 25 | AL, 06, 2018091306, , BEST, 0, 324N, 742W, 100, 955, HU, 34, NEQ, 170, 150, 110, 140, 1010, 200, 20, 115, 0, L, 0, , 317, 6, FLORENCE, 9 26 | AL, 06, 2018091306, , BEST, 0, 324N, 742W, 100, 955, HU, 50, NEQ, 100, 90, 70, 80, 1010, 200, 20, 115, 0, L, 0, , 317, 6, FLORENCE, 9 27 | AL, 06, 2018091306, , BEST, 0, 324N, 742W, 100, 955, HU, 64, NEQ, 70, 60, 50, 60, 1010, 200, 20, 115, 0, L, 0, , 317, 6, FLORENCE, 9 28 | AL, 06, 2018091312, , BEST, 0, 331N, 751W, 95, 954, HU, 34, NEQ, 170, 150, 120, 140, 1011, 200, 20, 115, 0, L, 0, , 313, 5, FLORENCE, 10 29 | AL, 06, 2018091312, , BEST, 0, 331N, 751W, 95, 954, HU, 50, NEQ, 100, 90, 80, 80, 1011, 200, 20, 115, 0, L, 0, , 313, 5, FLORENCE, 10 30 | AL, 06, 2018091312, , BEST, 0, 331N, 751W, 95, 954, HU, 64, NEQ, 70, 60, 50, 60, 1011, 200, 20, 115, 0, L, 0, , 313, 5, FLORENCE, 10 31 | AL, 06, 2018091318, , BEST, 0, 336N, 760W, 90, 953, HU, 34, NEQ, 170, 150, 120, 140, 1011, 200, 20, 110, 0, L, 0, , 304, 5, FLORENCE, 11 32 | AL, 06, 2018091318, , BEST, 0, 336N, 760W, 90, 953, HU, 50, NEQ, 100, 90, 80, 80, 1011, 200, 20, 110, 0, L, 0, , 304, 5, FLORENCE, 11 33 | AL, 06, 2018091318, , BEST, 0, 336N, 760W, 90, 953, HU, 64, NEQ, 70, 60, 50, 60, 1011, 200, 20, 110, 0, L, 0, , 304, 5, FLORENCE, 11 34 | AL, 06, 2018091400, , BEST, 0, 340N, 765W, 90, 952, HU, 34, NEQ, 170, 150, 130, 100, 1012, 200, 20, 105, 0, L, 0, , 314, 3, FLORENCE, 12 35 | AL, 06, 2018091400, , BEST, 0, 340N, 765W, 90, 952, HU, 50, NEQ, 100, 80, 80, 70, 1012, 200, 20, 105, 0, L, 0, , 314, 3, FLORENCE, 12 36 | AL, 06, 2018091400, , BEST, 0, 340N, 765W, 90, 952, HU, 64, NEQ, 70, 60, 50, 50, 1012, 200, 20, 105, 0, L, 0, , 314, 3, FLORENCE, 12 37 | AL, 06, 2018091406, , BEST, 0, 342N, 772W, 85, 952, HU, 34, NEQ, 170, 150, 130, 100, 1012, 200, 20, 100, 0, L, 0, , 289, 3, FLORENCE, 13 38 | AL, 06, 2018091406, , BEST, 0, 342N, 772W, 85, 952, HU, 50, NEQ, 100, 80, 80, 70, 1012, 200, 20, 100, 0, L, 0, , 289, 3, FLORENCE, 13 39 | AL, 06, 2018091406, , BEST, 0, 342N, 772W, 85, 952, HU, 64, NEQ, 70, 60, 60, 50, 1012, 200, 20, 100, 0, L, 0, , 289, 3, FLORENCE, 13 40 | AL, 06, 2018091411, 15, BEST, 0, 342N, 778W, 80, 956, HU, 34, NEQ, 170, 150, 140, 90, 1012, 200, 25, 0, 0, , 0, , 270, 3, FLORENCE, 14 41 | AL, 06, 2018091411, 15, BEST, 0, 342N, 778W, 80, 956, HU, 50, NEQ, 100, 80, 80, 60, 1012, 200, 25, 0, 0, , 0, , 270, 3, FLORENCE, 14 42 | AL, 06, 2018091411, 15, BEST, 0, 342N, 778W, 80, 956, HU, 64, NEQ, 70, 60, 60, 40, 1012, 200, 25, 0, 0, , 0, , 270, 3, FLORENCE, 14 43 | AL, 06, 2018091412, , BEST, 0, 341N, 779W, 80, 957, HU, 34, NEQ, 170, 150, 140, 80, 1012, 200, 25, 90, 0, L, 0, , 220, 5, FLORENCE, 15 44 | AL, 06, 2018091412, , BEST, 0, 341N, 779W, 80, 957, HU, 50, NEQ, 100, 80, 80, 40, 1012, 200, 25, 90, 0, L, 0, , 220, 5, FLORENCE, 15 45 | AL, 06, 2018091412, , BEST, 0, 341N, 779W, 80, 957, HU, 64, NEQ, 60, 60, 60, 20, 1012, 200, 25, 90, 0, L, 0, , 220, 5, FLORENCE, 15 46 | AL, 06, 2018091418, , BEST, 0, 340N, 784W, 65, 969, HU, 34, NEQ, 150, 130, 120, 70, 1012, 200, 30, 80, 0, L, 0, , 257, 2, FLORENCE, 16 47 | AL, 06, 2018091418, , BEST, 0, 340N, 784W, 65, 969, HU, 50, NEQ, 90, 70, 60, 30, 1012, 200, 30, 80, 0, L, 0, , 257, 2, FLORENCE, 16 48 | AL, 06, 2018091418, , BEST, 0, 340N, 784W, 65, 969, HU, 64, NEQ, 0, 30, 30, 0, 1012, 200, 30, 80, 0, L, 0, , 257, 2, FLORENCE, 16 49 | AL, 06, 2018091500, , BEST, 0, 339N, 788W, 60, 978, TS, 34, NEQ, 150, 150, 100, 60, 1013, 210, 30, 65, 0, L, 0, , 253, 2, FLORENCE, 17 50 | AL, 06, 2018091500, , BEST, 0, 339N, 788W, 60, 978, TS, 50, NEQ, 70, 70, 50, 30, 1013, 210, 30, 65, 0, L, 0, , 253, 2, FLORENCE, 17 51 | AL, 06, 2018091506, , BEST, 0, 337N, 793W, 55, 986, TS, 34, NEQ, 150, 150, 90, 50, 1013, 210, 50, 60, 0, L, 0, , 245, 2, FLORENCE, 18 52 | AL, 06, 2018091506, , BEST, 0, 337N, 793W, 55, 986, TS, 50, NEQ, 70, 70, 0, 0, 1013, 210, 50, 60, 0, L, 0, , 245, 2, FLORENCE, 18 53 | AL, 06, 2018091512, , BEST, 0, 336N, 795W, 55, 992, TS, 34, NEQ, 150, 130, 80, 40, 1013, 220, 60, 55, 0, L, 0, , 239, 1, FLORENCE, 19 54 | AL, 06, 2018091512, , BEST, 0, 336N, 795W, 55, 992, TS, 50, NEQ, 60, 100, 0, 0, 1013, 220, 60, 55, 0, L, 0, , 239, 1, FLORENCE, 19 55 | AL, 06, 2018091518, , BEST, 0, 336N, 798W, 50, 997, TS, 34, NEQ, 140, 130, 0, 0, 1013, 220, 110, 50, 0, L, 0, , 270, 1, FLORENCE, 20 56 | AL, 06, 2018091518, , BEST, 0, 336N, 798W, 50, 997, TS, 50, NEQ, 0, 110, 0, 0, 1013, 220, 110, 50, 0, L, 0, , 270, 1, FLORENCE, 20 57 | AL, 06, 2018091600, , BEST, 0, 336N, 802W, 45, 998, TS, 34, NEQ, 130, 130, 0, 0, 1013, 240, 110, 50, 0, L, 0, , 270, 2, FLORENCE, 21 58 | AL, 06, 2018091606, , BEST, 0, 336N, 808W, 40, 999, TS, 34, NEQ, 130, 130, 0, 0, 1013, 260, 110, 40, 0, L, 0, , 270, 3, FLORENCE, 22 59 | AL, 06, 2018091612, , BEST, 0, 336N, 815W, 35, 1002, TS, 34, NEQ, 0, 140, 0, 0, 1013, 280, 140, 40, 0, L, 0, , 270, 3, FLORENCE, 23 60 | AL, 06, 2018091618, , BEST, 0, 341N, 821W, 30, 1006, TD, 0, , 0, 0, 0, 0, 1013, 300, 140, 40, 0, L, 0, , 315, 4, FLORENCE, 24 61 | AL, 06, 2018091700, , BEST, 0, 350N, 822W, 25, 1007, TD, 0, , 0, 0, 0, 0, 1013, 320, 150, 35, 0, L, 0, , 355, 5, FLORENCE, 25 62 | AL, 06, 2018091706, , BEST, 0, 364N, 826W, 25, 1008, TD, 0, , 0, 0, 0, 0, 1013, 340, 160, 35, 0, L, 0, , 347, 7, FLORENCE, 26 63 | AL, 06, 2018091712, , BEST, 0, 378N, 822W, 25, 1008, EX, 0, , 0, 0, 0, 0, 1013, 360, 160, 30, 0, L, 0, , 13, 7, FLORENCE, 27 64 | AL, 06, 2018091718, , BEST, 0, 388N, 820W, 25, 1008, EX, 0, , 0, 0, 0, 0, 1013, 360, 160, 30, 0, L, 0, , 9, 5, FLORENCE, 28 65 | AL, 06, 2018091800, , BEST, 0, 395N, 805W, 25, 1008, EX, 0, , 0, 0, 0, 0, 1013, 360, 160, 0, 0, , 0, , 59, 7, FLORENCE, 29 66 | AL, 06, 2018091806, , BEST, 0, 413N, 768W, 25, 1007, EX, 0, , 0, 0, 0, 0, 1013, 360, 170, 0, 0, , 0, , 56, 17, FLORENCE, 30 67 | -------------------------------------------------------------------------------- /tests/data/input/test_vortex_track_no_internet/fort.22: -------------------------------------------------------------------------------- 1 | AL, 06, 2018091100, , BEST, 0, 256N, 618W, 115, 944, HU, 34, NEQ, 130, 130, 90, 130, 1010, 200, 10, , , , , ,270, 13, FLORENCE , 1 2 | AL, 06, 2018091100, , BEST, 0, 256N, 618W, 115, 944, HU, 50, NEQ, 60, 60, 50, 60, 1010, 200, 10, , , , , ,270, 13, FLORENCE , 1 3 | AL, 06, 2018091100, , BEST, 0, 256N, 618W, 115, 944, HU, 64, NEQ, 35, 30, 25, 35, 1010, 200, 10, , , , , ,270, 13, FLORENCE , 1 4 | AL, 06, 2018091106, , BEST, 6, 260N, 632W, 115, 950, HU, 34, NEQ, 130, 130, 90, 140, 1010, 200, 15, , , , , ,270, 14, FLORENCE , 2 5 | AL, 06, 2018091106, , BEST, 6, 260N, 632W, 115, 950, HU, 50, NEQ, 60, 60, 50, 60, 1010, 200, 15, , , , , ,270, 14, FLORENCE , 2 6 | AL, 06, 2018091106, , BEST, 6, 260N, 632W, 115, 950, HU, 64, NEQ, 35, 30, 25, 35, 1010, 200, 15, , , , , ,270, 14, FLORENCE , 2 7 | AL, 06, 2018091112, , BEST, 12, 265N, 647W, 125, 947, HU, 34, NEQ, 140, 130, 90, 120, 1010, 200, 15, , , , , ,270, 15, FLORENCE , 3 8 | AL, 06, 2018091112, , BEST, 12, 265N, 647W, 125, 947, HU, 50, NEQ, 70, 60, 50, 70, 1010, 200, 15, , , , , ,270, 15, FLORENCE , 3 9 | AL, 06, 2018091112, , BEST, 12, 265N, 647W, 125, 947, HU, 64, NEQ, 40, 35, 35, 40, 1010, 200, 15, , , , , ,270, 15, FLORENCE , 3 10 | AL, 06, 2018091118, , BEST, 18, 272N, 664W, 130, 937, HU, 34, NEQ, 150, 130, 100, 140, 1010, 200, 10, , , , , ,270, 15, FLORENCE , 4 11 | AL, 06, 2018091118, , BEST, 18, 272N, 664W, 130, 937, HU, 50, NEQ, 80, 60, 50, 70, 1010, 200, 10, , , , , ,270, 15, FLORENCE , 4 12 | AL, 06, 2018091118, , BEST, 18, 272N, 664W, 130, 937, HU, 64, NEQ, 50, 40, 40, 45, 1010, 200, 10, , , , , ,270, 15, FLORENCE , 4 13 | AL, 06, 2018091200, , BEST, 24, 279N, 681W, 120, 943, HU, 34, NEQ, 150, 130, 100, 140, 1010, 200, 10, , , , , ,270, 12, FLORENCE , 5 14 | AL, 06, 2018091200, , BEST, 24, 279N, 681W, 120, 943, HU, 50, NEQ, 80, 60, 50, 70, 1010, 200, 10, , , , , ,270, 12, FLORENCE , 5 15 | AL, 06, 2018091200, , BEST, 24, 279N, 681W, 120, 943, HU, 64, NEQ, 50, 45, 40, 45, 1010, 200, 10, , , , , ,270, 12, FLORENCE , 5 16 | AL, 06, 2018091206, , BEST, 30, 287N, 695W, 115, 945, HU, 34, NEQ, 150, 140, 110, 140, 1010, 200, 15, , , , , ,270, 11, FLORENCE , 6 17 | AL, 06, 2018091206, , BEST, 30, 287N, 695W, 115, 945, HU, 50, NEQ, 80, 65, 60, 70, 1010, 200, 15, , , , , ,270, 11, FLORENCE , 6 18 | AL, 06, 2018091206, , BEST, 30, 287N, 695W, 115, 945, HU, 64, NEQ, 60, 50, 40, 50, 1010, 200, 15, , , , , ,270, 11, FLORENCE , 6 19 | AL, 06, 2018091212, , BEST, 36, 294N, 707W, 115, 945, HU, 34, NEQ, 150, 140, 110, 130, 1010, 200, 15, , , , , ,270, 10, FLORENCE , 7 20 | AL, 06, 2018091212, , BEST, 36, 294N, 707W, 115, 945, HU, 50, NEQ, 90, 80, 60, 70, 1010, 200, 15, , , , , ,270, 10, FLORENCE , 7 21 | AL, 06, 2018091212, , BEST, 36, 294N, 707W, 115, 945, HU, 64, NEQ, 60, 60, 40, 50, 1010, 200, 15, , , , , ,270, 10, FLORENCE , 7 22 | AL, 06, 2018091218, , BEST, 42, 304N, 719W, 110, 949, HU, 34, NEQ, 170, 140, 110, 140, 1010, 200, 15, , , , , ,270, 11, FLORENCE , 8 23 | AL, 06, 2018091218, , BEST, 42, 304N, 719W, 110, 949, HU, 50, NEQ, 90, 80, 60, 70, 1010, 200, 15, , , , , ,270, 11, FLORENCE , 8 24 | AL, 06, 2018091218, , BEST, 42, 304N, 719W, 110, 949, HU, 64, NEQ, 60, 60, 40, 50, 1010, 200, 15, , , , , ,270, 11, FLORENCE , 8 25 | AL, 06, 2018091300, , BEST, 48, 315N, 732W, 105, 955, HU, 34, NEQ, 170, 140, 110, 140, 1010, 200, 20, , , , , ,270, 9, FLORENCE , 9 26 | AL, 06, 2018091300, , BEST, 48, 315N, 732W, 105, 955, HU, 50, NEQ, 110, 80, 70, 80, 1010, 200, 20, , , , , ,270, 9, FLORENCE , 9 27 | AL, 06, 2018091300, , BEST, 48, 315N, 732W, 105, 955, HU, 64, NEQ, 70, 60, 50, 60, 1010, 200, 20, , , , , ,270, 9, FLORENCE , 9 28 | AL, 06, 2018091306, , BEST, 54, 324N, 742W, 100, 955, HU, 34, NEQ, 170, 150, 110, 140, 1010, 200, 20, , , , , ,270, 8, FLORENCE , 10 29 | AL, 06, 2018091306, , BEST, 54, 324N, 742W, 100, 955, HU, 50, NEQ, 100, 90, 70, 80, 1010, 200, 20, , , , , ,270, 8, FLORENCE , 10 30 | AL, 06, 2018091306, , BEST, 54, 324N, 742W, 100, 955, HU, 64, NEQ, 70, 60, 50, 60, 1010, 200, 20, , , , , ,270, 8, FLORENCE , 10 31 | AL, 06, 2018091312, , BEST, 60, 331N, 751W, 95, 954, HU, 34, NEQ, 170, 150, 120, 140, 1011, 200, 20, , , , , ,270, 8, FLORENCE , 11 32 | AL, 06, 2018091312, , BEST, 60, 331N, 751W, 95, 954, HU, 50, NEQ, 100, 90, 80, 80, 1011, 200, 20, , , , , ,270, 8, FLORENCE , 11 33 | AL, 06, 2018091312, , BEST, 60, 331N, 751W, 95, 954, HU, 64, NEQ, 70, 60, 50, 60, 1011, 200, 20, , , , , ,270, 8, FLORENCE , 11 34 | AL, 06, 2018091318, , BEST, 66, 336N, 760W, 90, 953, HU, 34, NEQ, 170, 150, 120, 140, 1011, 200, 20, , , , , ,270, 4, FLORENCE , 12 35 | AL, 06, 2018091318, , BEST, 66, 336N, 760W, 90, 953, HU, 50, NEQ, 100, 90, 80, 80, 1011, 200, 20, , , , , ,270, 4, FLORENCE , 12 36 | AL, 06, 2018091318, , BEST, 66, 336N, 760W, 90, 953, HU, 64, NEQ, 70, 60, 50, 60, 1011, 200, 20, , , , , ,270, 4, FLORENCE , 12 37 | AL, 06, 2018091400, , BEST, 72, 340N, 765W, 90, 952, HU, 34, NEQ, 170, 150, 130, 100, 1012, 200, 20, , , , , ,270, 6, FLORENCE , 13 38 | AL, 06, 2018091400, , BEST, 72, 340N, 765W, 90, 952, HU, 50, NEQ, 100, 80, 80, 70, 1012, 200, 20, , , , , ,270, 6, FLORENCE , 13 39 | AL, 06, 2018091400, , BEST, 72, 340N, 765W, 90, 952, HU, 64, NEQ, 70, 60, 50, 50, 1012, 200, 20, , , , , ,270, 6, FLORENCE , 13 40 | AL, 06, 2018091406, , BEST, 78, 342N, 772W, 85, 952, HU, 34, NEQ, 170, 150, 130, 100, 1012, 200, 20, , , , , ,270, 6, FLORENCE , 14 41 | AL, 06, 2018091406, , BEST, 78, 342N, 772W, 85, 952, HU, 50, NEQ, 100, 80, 80, 70, 1012, 200, 20, , , , , ,270, 6, FLORENCE , 14 42 | AL, 06, 2018091406, , BEST, 78, 342N, 772W, 85, 952, HU, 64, NEQ, 70, 60, 60, 50, 1012, 200, 20, , , , , ,270, 6, FLORENCE , 14 43 | AL, 06, 2018091411, , BEST, 83, 342N, 778W, 80, 956, HU, 34, NEQ, 170, 150, 140, 90, 1012, 200, 25, , , , , ,270, 7, FLORENCE , 15 44 | AL, 06, 2018091411, , BEST, 83, 342N, 778W, 80, 956, HU, 50, NEQ, 100, 80, 80, 60, 1012, 200, 25, , , , , ,270, 7, FLORENCE , 15 45 | AL, 06, 2018091411, , BEST, 83, 342N, 778W, 80, 956, HU, 64, NEQ, 70, 60, 60, 40, 1012, 200, 25, , , , , ,270, 7, FLORENCE , 15 46 | AL, 06, 2018091412, , BEST, 84, 341N, 779W, 80, 957, HU, 34, NEQ, 170, 150, 140, 80, 1012, 200, 25, , , , , ,270, 4, FLORENCE , 16 47 | AL, 06, 2018091412, , BEST, 84, 341N, 779W, 80, 957, HU, 50, NEQ, 100, 80, 80, 40, 1012, 200, 25, , , , , ,270, 4, FLORENCE , 16 48 | AL, 06, 2018091412, , BEST, 84, 341N, 779W, 80, 957, HU, 64, NEQ, 60, 60, 60, 20, 1012, 200, 25, , , , , ,270, 4, FLORENCE , 16 49 | AL, 06, 2018091418, , BEST, 90, 340N, 784W, 65, 969, HU, 34, NEQ, 150, 130, 120, 70, 1012, 200, 30, , , , , ,270, 3, FLORENCE , 17 50 | AL, 06, 2018091418, , BEST, 90, 340N, 784W, 65, 969, HU, 50, NEQ, 90, 70, 60, 30, 1012, 200, 30, , , , , ,270, 3, FLORENCE , 17 51 | AL, 06, 2018091418, , BEST, 90, 340N, 784W, 65, 969, HU, 64, NEQ, 0, 30, 30, 0, 1012, 200, 30, , , , , ,270, 3, FLORENCE , 17 52 | AL, 06, 2018091500, , BEST, 96, 339N, 788W, 60, 978, TS, 34, NEQ, 150, 150, 100, 60, 1013, 210, 30, , , , , ,270, 4, FLORENCE , 18 53 | AL, 06, 2018091500, , BEST, 96, 339N, 788W, 60, 978, TS, 50, NEQ, 70, 70, 50, 30, 1013, 210, 30, , , , , ,270, 4, FLORENCE , 18 54 | AL, 06, 2018091506, , BEST, 102, 337N, 793W, 55, 986, TS, 34, NEQ, 150, 150, 90, 50, 1013, 210, 50, , , , , ,270, 2, FLORENCE , 19 55 | AL, 06, 2018091506, , BEST, 102, 337N, 793W, 55, 986, TS, 50, NEQ, 70, 70, 0, 0, 1013, 210, 50, , , , , ,270, 2, FLORENCE , 19 56 | AL, 06, 2018091512, , BEST, 108, 336N, 795W, 55, 992, TS, 34, NEQ, 150, 130, 80, 40, 1013, 220, 60, , , , , ,270, 3, FLORENCE , 20 57 | AL, 06, 2018091512, , BEST, 108, 336N, 795W, 55, 992, TS, 50, NEQ, 60, 100, 0, 0, 1013, 220, 60, , , , , ,270, 3, FLORENCE , 20 58 | AL, 06, 2018091518, , BEST, 114, 336N, 798W, 50, 997, TS, 34, NEQ, 140, 130, 0, 0, 1013, 220, 110, , , , , ,270, 3, FLORENCE , 21 59 | AL, 06, 2018091518, , BEST, 114, 336N, 798W, 50, 997, TS, 50, NEQ, 0, 110, 0, 0, 1013, 220, 110, , , , , ,270, 3, FLORENCE , 21 60 | AL, 06, 2018091600, , BEST, 120, 336N, 802W, 45, 998, TS, 34, NEQ, 130, 130, 0, 0, 1013, 240, 110, , , , , ,270, 5, FLORENCE , 22 61 | AL, 06, 2018091606, , BEST, 126, 336N, 808W, 40, 999, TS, 34, NEQ, 130, 130, 0, 0, 1013, 260, 110, , , , , ,270, 6, FLORENCE , 23 62 | AL, 06, 2018091612, , BEST, 132, 336N, 815W, 35, 1002, TS, 34, NEQ, 0, 140, 0, 0, 1013, 280, 140, , , , , ,270, 5, FLORENCE , 24 63 | AL, 06, 2018091618, , BEST, 138, 341N, 821W, 30, 1006, TD, 0, , 0, 0, 0, 0, 1013, 300, 140, , , , , ,270, 1, FLORENCE , 25 64 | AL, 06, 2018091700, , BEST, 144, 350N, 822W, 25, 1007, TD, 0, , 0, 0, 0, 0, 1013, 320, 150, , , , , ,270, 3, FLORENCE , 26 65 | AL, 06, 2018091706, , BEST, 150, 364N, 826W, 25, 1008, TD, 0, , 0, 0, 0, 0, 1013, 340, 160, , , , , , 90, 3, FLORENCE , 27 66 | AL, 06, 2018091712, , BEST, 156, 378N, 822W, 25, 1008, EX, 0, , 0, 0, 0, 0, 1013, 360, 160, , , , , , 90, 2, FLORENCE , 28 67 | AL, 06, 2018091718, , BEST, 162, 388N, 820W, 25, 1008, EX, 0, , 0, 0, 0, 0, 1013, 360, 160, , , , , , 90, 12, FLORENCE , 29 68 | AL, 06, 2018091800, , BEST, 168, 395N, 805W, 25, 1008, EX, 0, , 0, 0, 0, 0, 1013, 360, 160, , , , , , 89, 29, FLORENCE , 30 69 | AL, 06, 2018091806, , BEST, 174, 413N, 768W, 25, 1007, EX, 0, , 0, 0, 0, 0, 1013, 360, 170, , , , , , 89, 26, FLORENCE , 31 70 | AL, 06, 2018091812, , BEST, 180, 422N, 733W, 25, 1006, EX, 34, NEQ, 0, 0, 0, 0, 1013, 360, 180, , , , , ,271, 26, FLORENCE , 32 71 | -------------------------------------------------------------------------------- /tests/data/reference/test_vortex_track_from_file/irma2017_fort.22: -------------------------------------------------------------------------------- 1 | AL, 11, 2017090500, , BEST, 0, 167N, 551W, 120, 943, , 34, NEQ, 120, 100, 80, 110, 1013,, 15,,, ,, , 265, 13, IRMA, 1 2 | AL, 11, 2017090500, , BEST, 0, 167N, 551W, 120, 943, , 50, NEQ, 70, 60, 50, 60, 1013,, 15,,, ,, , 265, 13, IRMA, 1 3 | AL, 11, 2017090500, , BEST, 0, 167N, 551W, 120, 943, , 64, NEQ, 40, 35, 30, 35, 1013,, 15,,, ,, , 265, 13, IRMA, 1 4 | AL, 11, 2017090506, , BEST, 6, 166N, 564W, 135, 929, , 34, NEQ, 120, 100, 80, 120, 1013,, 15,,, ,, , 265, 13, IRMA, 2 5 | AL, 11, 2017090506, , BEST, 6, 166N, 564W, 135, 929, , 50, NEQ, 70, 60, 50, 60, 1013,, 15,,, ,, , 265, 13, IRMA, 2 6 | AL, 11, 2017090506, , BEST, 6, 166N, 564W, 135, 929, , 64, NEQ, 40, 35, 30, 35, 1013,, 15,,, ,, , 265, 13, IRMA, 2 7 | AL, 11, 2017090512, , BEST, 12, 167N, 578W, 155, 929, , 34, NEQ, 140, 110, 80, 130, 1013,, 15,,, ,, , 274, 13, IRMA, 3 8 | AL, 11, 2017090512, , BEST, 12, 167N, 578W, 155, 929, , 50, NEQ, 80, 70, 50, 70, 1013,, 15,,, ,, , 274, 13, IRMA, 3 9 | AL, 11, 2017090512, , BEST, 12, 167N, 578W, 155, 929, , 64, NEQ, 50, 40, 30, 40, 1013,, 15,,, ,, , 274, 13, IRMA, 3 10 | AL, 11, 2017090518, , BEST, 18, 169N, 592W, 160, 926, , 34, NEQ, 150, 110, 100, 140, 1013,, 15,,, ,, , 278, 14, IRMA, 4 11 | AL, 11, 2017090518, , BEST, 18, 169N, 592W, 160, 926, , 50, NEQ, 90, 70, 50, 80, 1013,, 15,,, ,, , 278, 14, IRMA, 4 12 | AL, 11, 2017090518, , BEST, 18, 169N, 592W, 160, 926, , 64, NEQ, 50, 45, 35, 50, 1013,, 15,,, ,, , 278, 14, IRMA, 4 13 | AL, 11, 2017090600, , BEST, 24, 172N, 604W, 160, 915, , 34, NEQ, 150, 110, 90, 150, 1013,, 15,,, ,, , 285, 12, IRMA, 5 14 | AL, 11, 2017090600, , BEST, 24, 172N, 604W, 160, 915, , 50, NEQ, 80, 60, 40, 70, 1013,, 15,,, ,, , 285, 12, IRMA, 5 15 | AL, 11, 2017090600, , BEST, 24, 172N, 604W, 160, 915, , 64, NEQ, 45, 40, 30, 45, 1013,, 15,,, ,, , 285, 12, IRMA, 5 16 | AL, 11, 2017090606, , BEST, 30, 177N, 619W, 160, 914, , 34, NEQ, 150, 110, 90, 150, 1013,, 15,,, ,, , 289, 15, IRMA, 6 17 | AL, 11, 2017090606, , BEST, 30, 177N, 619W, 160, 914, , 50, NEQ, 80, 60, 50, 70, 1013,, 15,,, ,, , 289, 15, IRMA, 6 18 | AL, 11, 2017090606, , BEST, 30, 177N, 619W, 160, 914, , 64, NEQ, 45, 40, 30, 45, 1013,, 15,,, ,, , 289, 15, IRMA, 6 19 | AL, 11, 2017090612, , BEST, 36, 181N, 633W, 160, 918, , 34, NEQ, 160, 110, 90, 150, 1013,, 15,,, ,, , 287, 14, IRMA, 7 20 | AL, 11, 2017090612, , BEST, 36, 181N, 633W, 160, 918, , 50, NEQ, 80, 60, 50, 70, 1013,, 15,,, ,, , 287, 14, IRMA, 7 21 | AL, 11, 2017090612, , BEST, 36, 181N, 633W, 160, 918, , 64, NEQ, 45, 45, 30, 45, 1013,, 15,,, ,, , 287, 14, IRMA, 7 22 | AL, 11, 2017090618, , BEST, 42, 185N, 647W, 160, 918, , 34, NEQ, 160, 120, 80, 150, 1013,, 15,,, ,, , 287, 14, IRMA, 8 23 | AL, 11, 2017090618, , BEST, 42, 185N, 647W, 160, 918, , 50, NEQ, 100, 70, 50, 70, 1013,, 15,,, ,, , 287, 14, IRMA, 8 24 | AL, 11, 2017090618, , BEST, 42, 185N, 647W, 160, 918, , 64, NEQ, 45, 45, 30, 45, 1013,, 15,,, ,, , 287, 14, IRMA, 8 25 | AL, 11, 2017090700, , BEST, 48, 191N, 660W, 160, 916, , 34, NEQ, 160, 120, 80, 150, 1013,, 15,,, ,, , 296, 14, IRMA, 9 26 | AL, 11, 2017090700, , BEST, 48, 191N, 660W, 160, 916, , 50, NEQ, 100, 70, 50, 70, 1013,, 15,,, ,, , 296, 14, IRMA, 9 27 | AL, 11, 2017090700, , BEST, 48, 191N, 660W, 160, 916, , 64, NEQ, 45, 45, 30, 45, 1013,, 15,,, ,, , 296, 14, IRMA, 9 28 | AL, 11, 2017090706, , BEST, 54, 197N, 677W, 155, 921, , 34, NEQ, 160, 120, 80, 150, 1013,, 15,,, ,, , 291, 17, IRMA, 10 29 | AL, 11, 2017090706, , BEST, 54, 197N, 677W, 155, 921, , 50, NEQ, 100, 70, 50, 70, 1013,, 15,,, ,, , 291, 17, IRMA, 10 30 | AL, 11, 2017090706, , BEST, 54, 197N, 677W, 155, 921, , 64, NEQ, 45, 45, 30, 45, 1013,, 15,,, ,, , 291, 17, IRMA, 10 31 | AL, 11, 2017090712, , BEST, 60, 201N, 690W, 150, 921, , 34, NEQ, 160, 120, 80, 150, 1013,, 15,,, ,, , 288, 13, IRMA, 11 32 | AL, 11, 2017090712, , BEST, 60, 201N, 690W, 150, 921, , 50, NEQ, 100, 70, 50, 70, 1013,, 15,,, ,, , 288, 13, IRMA, 11 33 | AL, 11, 2017090712, , BEST, 60, 201N, 690W, 150, 921, , 64, NEQ, 50, 50, 30, 50, 1013,, 15,,, ,, , 288, 13, IRMA, 11 34 | AL, 11, 2017090718, , BEST, 66, 207N, 704W, 150, 922, , 34, NEQ, 160, 120, 80, 150, 1013,, 15,,, ,, , 295, 14, IRMA, 12 35 | AL, 11, 2017090718, , BEST, 66, 207N, 704W, 150, 922, , 50, NEQ, 100, 70, 50, 70, 1013,, 15,,, ,, , 295, 14, IRMA, 12 36 | AL, 11, 2017090718, , BEST, 66, 207N, 704W, 150, 922, , 64, NEQ, 60, 40, 30, 50, 1013,, 15,,, ,, , 295, 14, IRMA, 12 37 | AL, 11, 2017090800, , BEST, 72, 211N, 718W, 150, 919, , 34, NEQ, 160, 120, 80, 150, 1013,, 15,,, ,, , 287, 14, IRMA, 13 38 | AL, 11, 2017090800, , BEST, 72, 211N, 718W, 150, 919, , 50, NEQ, 100, 70, 50, 80, 1013,, 15,,, ,, , 287, 14, IRMA, 13 39 | AL, 11, 2017090800, , BEST, 72, 211N, 718W, 150, 919, , 64, NEQ, 60, 45, 30, 55, 1013,, 15,,, ,, , 287, 14, IRMA, 13 40 | AL, 11, 2017090806, , BEST, 78, 215N, 732W, 140, 925, , 34, NEQ, 160, 120, 80, 150, 1013,, 30,,, ,, , 287, 14, IRMA, 14 41 | AL, 11, 2017090806, , BEST, 78, 215N, 732W, 140, 925, , 50, NEQ, 100, 70, 50, 80, 1013,, 30,,, ,, , 287, 14, IRMA, 14 42 | AL, 11, 2017090806, , BEST, 78, 215N, 732W, 140, 925, , 64, NEQ, 60, 45, 35, 55, 1013,, 30,,, ,, , 287, 14, IRMA, 14 43 | AL, 11, 2017090812, , BEST, 84, 218N, 747W, 130, 927, , 34, NEQ, 160, 120, 80, 150, 1013,, 30,,, ,, , 282, 14, IRMA, 15 44 | AL, 11, 2017090812, , BEST, 84, 218N, 747W, 130, 927, , 50, NEQ, 100, 90, 50, 80, 1013,, 30,,, ,, , 282, 14, IRMA, 15 45 | AL, 11, 2017090812, , BEST, 84, 218N, 747W, 130, 927, , 64, NEQ, 60, 45, 35, 55, 1013,, 30,,, ,, , 282, 14, IRMA, 15 46 | AL, 11, 2017090818, , BEST, 90, 220N, 760W, 135, 925, , 34, NEQ, 160, 120, 80, 150, 1013,, 30,,, ,, , 279, 12, IRMA, 16 47 | AL, 11, 2017090818, , BEST, 90, 220N, 760W, 135, 925, , 50, NEQ, 100, 90, 50, 80, 1013,, 30,,, ,, , 279, 12, IRMA, 16 48 | AL, 11, 2017090818, , BEST, 90, 220N, 760W, 135, 925, , 64, NEQ, 60, 60, 30, 60, 1013,, 30,,, ,, , 279, 12, IRMA, 16 49 | AL, 11, 2017090900, , BEST, 96, 221N, 772W, 140, 924, , 34, NEQ, 160, 120, 80, 150, 1013,, 20,,, ,, , 275, 11, IRMA, 17 50 | AL, 11, 2017090900, , BEST, 96, 221N, 772W, 140, 924, , 50, NEQ, 100, 90, 50, 80, 1013,, 20,,, ,, , 275, 11, IRMA, 17 51 | AL, 11, 2017090900, , BEST, 96, 221N, 772W, 140, 924, , 64, NEQ, 60, 60, 30, 60, 1013,, 20,,, ,, , 275, 11, IRMA, 17 52 | AL, 11, 2017090906, , BEST, 102, 223N, 783W, 140, 930, , 34, NEQ, 160, 160, 120, 170, 1013,, 15,,, ,, , 281, 10, IRMA, 18 53 | AL, 11, 2017090906, , BEST, 102, 223N, 783W, 140, 930, , 50, NEQ, 100, 90, 50, 80, 1013,, 15,,, ,, , 281, 10, IRMA, 18 54 | AL, 11, 2017090906, , BEST, 102, 223N, 783W, 140, 930, , 64, NEQ, 60, 60, 30, 60, 1013,, 15,,, ,, , 281, 10, IRMA, 18 55 | AL, 11, 2017090912, , BEST, 108, 227N, 793W, 115, 941, , 34, NEQ, 160, 160, 120, 170, 1013,, 15,,, ,, , 293, 10, IRMA, 19 56 | AL, 11, 2017090912, , BEST, 108, 227N, 793W, 115, 941, , 50, NEQ, 100, 90, 50, 80, 1013,, 15,,, ,, , 293, 10, IRMA, 19 57 | AL, 11, 2017090912, , BEST, 108, 227N, 793W, 115, 941, , 64, NEQ, 60, 60, 30, 60, 1013,, 15,,, ,, , 293, 10, IRMA, 19 58 | AL, 11, 2017090918, , BEST, 114, 231N, 802W, 110, 938, , 34, NEQ, 160, 160, 120, 170, 1013,, 15,,, ,, , 296, 9, IRMA, 20 59 | AL, 11, 2017090918, , BEST, 114, 231N, 802W, 110, 938, , 50, NEQ, 100, 90, 50, 80, 1013,, 15,,, ,, , 296, 9, IRMA, 20 60 | AL, 11, 2017090918, , BEST, 114, 231N, 802W, 110, 938, , 64, NEQ, 60, 60, 30, 60, 1013,, 15,,, ,, , 296, 9, IRMA, 20 61 | AL, 11, 2017091000, , BEST, 120, 234N, 809W, 105, 932, , 34, NEQ, 170, 170, 120, 180, 1013,, 15,,, ,, , 295, 7, IRMA, 21 62 | AL, 11, 2017091000, , BEST, 120, 234N, 809W, 105, 932, , 50, NEQ, 100, 100, 50, 80, 1013,, 15,,, ,, , 295, 7, IRMA, 21 63 | AL, 11, 2017091000, , BEST, 120, 234N, 809W, 105, 932, , 64, NEQ, 60, 60, 30, 60, 1013,, 15,,, ,, , 295, 7, IRMA, 21 64 | AL, 11, 2017091006, , BEST, 126, 237N, 813W, 115, 930, , 34, NEQ, 190, 170, 140, 190, 1013,, 10,,, ,, , 309, 5, IRMA, 22 65 | AL, 11, 2017091006, , BEST, 126, 237N, 813W, 115, 930, , 50, NEQ, 110, 110, 70, 100, 1013,, 10,,, ,, , 309, 5, IRMA, 22 66 | AL, 11, 2017091006, , BEST, 126, 237N, 813W, 115, 930, , 64, NEQ, 70, 50, 30, 50, 1013,, 10,,, ,, , 309, 5, IRMA, 22 67 | AL, 11, 2017091012, , BEST, 132, 245N, 815W, 115, 931, , 34, NEQ, 190, 170, 140, 190, 1013,, 10,,, ,, , 347, 8, IRMA, 23 68 | AL, 11, 2017091012, , BEST, 132, 245N, 815W, 115, 931, , 50, NEQ, 110, 110, 70, 100, 1013,, 10,,, ,, , 347, 8, IRMA, 23 69 | AL, 11, 2017091012, , BEST, 132, 245N, 815W, 115, 931, , 64, NEQ, 70, 50, 30, 50, 1013,, 10,,, ,, , 347, 8, IRMA, 23 70 | AL, 11, 2017091018, , BEST, 138, 256N, 817W, 100, 936, , 34, NEQ, 190, 170, 140, 190, 1013,, 15,,, ,, , 351, 11, IRMA, 24 71 | AL, 11, 2017091018, , BEST, 138, 256N, 817W, 100, 936, , 50, NEQ, 100, 100, 70, 100, 1013,, 15,,, ,, , 351, 11, IRMA, 24 72 | AL, 11, 2017091018, , BEST, 138, 256N, 817W, 100, 936, , 64, NEQ, 70, 60, 30, 50, 1013,, 15,,, ,, , 351, 11, IRMA, 24 73 | AL, 11, 2017091100, , BEST, 144, 268N, 817W, 90, 942, , 34, NEQ, 360, 200, 150, 240, 1013,, 15,,, ,, , 0, 12, IRMA, 25 74 | AL, 11, 2017091100, , BEST, 144, 268N, 817W, 90, 942, , 50, NEQ, 140, 140, 90, 120, 1013,, 15,,, ,, , 0, 12, IRMA, 25 75 | AL, 11, 2017091100, , BEST, 144, 268N, 817W, 90, 942, , 64, NEQ, 70, 60, 30, 50, 1013,, 15,,, ,, , 0, 12, IRMA, 25 76 | AL, 11, 2017091106, , BEST, 150, 282N, 822W, 75, 961, , 34, NEQ, 360, 230, 150, 240, 1013,, 20,,, ,, , 342, 15, IRMA, 26 77 | AL, 11, 2017091106, , BEST, 150, 282N, 822W, 75, 961, , 50, NEQ, 140, 140, 90, 120, 1013,, 20,,, ,, , 342, 15, IRMA, 26 78 | AL, 11, 2017091106, , BEST, 150, 282N, 822W, 75, 961, , 64, NEQ, 30, 30, 20, 50, 1013,, 20,,, ,, , 342, 15, IRMA, 26 79 | AL, 11, 2017091112, , BEST, 156, 296N, 827W, 60, 970, , 34, NEQ, 360, 230, 150, 240, 1013,, 40,,, ,, , 343, 15, IRMA, 27 80 | AL, 11, 2017091112, , BEST, 156, 296N, 827W, 60, 970, , 50, NEQ, 140, 140, 90, 120, 1013,, 40,,, ,, , 343, 15, IRMA, 27 81 | AL, 11, 2017091118, , BEST, 162, 309N, 835W, 45, 980, , 34, NEQ, 360, 230, 150, 240, 1013,, 60,,, ,, , 332, 15, IRMA, 28 82 | AL, 11, 2017091200, , BEST, 168, 319N, 844W, 40, 986, , 34, NEQ, 360, 300, 0, 0, 1013,, 60,,, ,, , 322, 13, IRMA, 29 83 | -------------------------------------------------------------------------------- /tests/data/reference/test_vortex_track/michael2018.fort.22: -------------------------------------------------------------------------------- 1 | AL, 14, 2018100618, , BEST, 0, 178N, 866W, 25, 1006, LO, 0, , 0, 0, 0, 0, 1009, 180, 90, 35, 0, L, 0, , 316, 2, INVEST, 1 2 | AL, 14, 2018100700, , BEST, 0, 181N, 869W, 25, 1004, LO, 0, , 0, 0, 0, 0, 1009, 180, 90, 35, 0, L, 0, , 316, 2, FOURTEEN, 2 3 | AL, 14, 2018100706, , BEST, 0, 184N, 868W, 30, 1004, TD, 0, , 0, 0, 0, 0, 1010, 240, 120, 40, 0, L, 0, , 18, 2, FOURTEEN, 3 4 | AL, 14, 2018100712, , BEST, 0, 188N, 864W, 35, 1003, TS, 34, NEQ, 120, 180, 0, 0, 1009, 270, 120, 40, 0, L, 0, , 44, 3, FOURTEEN, 4 5 | AL, 14, 2018100718, , BEST, 0, 191N, 857W, 45, 999, TS, 34, NEQ, 120, 180, 0, 0, 1009, 270, 60, 50, 0, L, 0, , 66, 4, MICHAEL, 5 6 | AL, 14, 2018100800, , BEST, 0, 197N, 855W, 50, 996, TS, 34, NEQ, 120, 150, 90, 90, 1008, 270, 35, 60, 0, L, 0, , 18, 3, MICHAEL, 6 7 | AL, 14, 2018100800, , BEST, 0, 197N, 855W, 50, 996, TS, 50, NEQ, 40, 0, 0, 0, 1008, 270, 35, 60, 0, L, 0, , 18, 3, MICHAEL, 6 8 | AL, 14, 2018100806, , BEST, 0, 202N, 854W, 60, 984, TS, 34, NEQ, 120, 150, 90, 90, 1008, 270, 35, 75, 0, L, 0, , 11, 3, MICHAEL, 7 9 | AL, 14, 2018100806, , BEST, 0, 202N, 854W, 60, 984, TS, 50, NEQ, 80, 80, 0, 50, 1008, 270, 35, 75, 0, L, 0, , 11, 3, MICHAEL, 7 10 | AL, 14, 2018100812, , BEST, 0, 209N, 851W, 65, 982, HU, 34, NEQ, 120, 150, 90, 90, 1007, 210, 30, 80, 0, L, 0, , 22, 4, MICHAEL, 8 11 | AL, 14, 2018100812, , BEST, 0, 209N, 851W, 65, 982, HU, 50, NEQ, 70, 50, 20, 50, 1007, 210, 30, 80, 0, L, 0, , 22, 4, MICHAEL, 8 12 | AL, 14, 2018100812, , BEST, 0, 209N, 851W, 65, 982, HU, 64, NEQ, 25, 0, 0, 0, 1007, 210, 30, 80, 0, L, 0, , 22, 4, MICHAEL, 8 13 | AL, 14, 2018100818, , BEST, 0, 217N, 851W, 75, 977, HU, 34, NEQ, 120, 150, 80, 90, 1008, 240, 25, 85, 0, L, 0, , 0, 4, MICHAEL, 9 14 | AL, 14, 2018100818, , BEST, 0, 217N, 851W, 75, 977, HU, 50, NEQ, 60, 50, 20, 50, 1008, 240, 25, 85, 0, L, 0, , 0, 4, MICHAEL, 9 15 | AL, 14, 2018100818, , BEST, 0, 217N, 851W, 75, 977, HU, 64, NEQ, 30, 0, 0, 25, 1008, 240, 25, 85, 0, L, 0, , 0, 4, MICHAEL, 9 16 | AL, 14, 2018100900, , BEST, 0, 227N, 852W, 85, 971, HU, 34, NEQ, 150, 150, 80, 110, 1007, 240, 20, 90, 0, L, 0, , 355, 5, MICHAEL, 10 17 | AL, 14, 2018100900, , BEST, 0, 227N, 852W, 85, 971, HU, 50, NEQ, 60, 50, 30, 50, 1007, 240, 20, 90, 0, L, 0, , 355, 5, MICHAEL, 10 18 | AL, 14, 2018100900, , BEST, 0, 227N, 852W, 85, 971, HU, 64, NEQ, 30, 30, 25, 30, 1007, 240, 20, 90, 0, L, 0, , 355, 5, MICHAEL, 10 19 | AL, 14, 2018100906, , BEST, 0, 237N, 858W, 85, 973, HU, 34, NEQ, 170, 140, 70, 140, 1006, 240, 20, 100, 0, L, 0, , 331, 6, MICHAEL, 11 20 | AL, 14, 2018100906, , BEST, 0, 237N, 858W, 85, 973, HU, 50, NEQ, 70, 50, 30, 50, 1006, 240, 20, 100, 0, L, 0, , 331, 6, MICHAEL, 11 21 | AL, 14, 2018100906, , BEST, 0, 237N, 858W, 85, 973, HU, 64, NEQ, 35, 30, 20, 30, 1006, 240, 20, 100, 0, L, 0, , 331, 6, MICHAEL, 11 22 | AL, 14, 2018100912, , BEST, 0, 246N, 862W, 90, 968, HU, 34, NEQ, 160, 140, 70, 140, 1005, 200, 15, 110, 25, L, 0, , 338, 5, MICHAEL, 12 23 | AL, 14, 2018100912, , BEST, 0, 246N, 862W, 90, 968, HU, 50, NEQ, 70, 50, 30, 50, 1005, 200, 15, 110, 25, L, 0, , 338, 5, MICHAEL, 12 24 | AL, 14, 2018100912, , BEST, 0, 246N, 862W, 90, 968, HU, 64, NEQ, 30, 30, 20, 30, 1005, 200, 15, 110, 25, L, 0, , 338, 5, MICHAEL, 12 25 | AL, 14, 2018100918, , BEST, 0, 256N, 864W, 100, 961, HU, 34, NEQ, 160, 140, 70, 140, 1006, 210, 15, 130, 0, L, 0, , 350, 5, MICHAEL, 13 26 | AL, 14, 2018100918, , BEST, 0, 256N, 864W, 100, 961, HU, 50, NEQ, 70, 50, 30, 50, 1006, 210, 15, 130, 0, L, 0, , 350, 5, MICHAEL, 13 27 | AL, 14, 2018100918, , BEST, 0, 256N, 864W, 100, 961, HU, 64, NEQ, 40, 30, 20, 30, 1006, 210, 15, 130, 0, L, 0, , 350, 5, MICHAEL, 13 28 | AL, 14, 2018101000, , BEST, 0, 266N, 865W, 110, 952, HU, 34, NEQ, 160, 140, 70, 140, 1005, 210, 15, 135, 0, L, 0, , 355, 5, MICHAEL, 14 29 | AL, 14, 2018101000, , BEST, 0, 266N, 865W, 110, 952, HU, 50, NEQ, 70, 60, 30, 50, 1005, 210, 15, 135, 0, L, 0, , 355, 5, MICHAEL, 14 30 | AL, 14, 2018101000, , BEST, 0, 266N, 865W, 110, 952, HU, 64, NEQ, 40, 30, 20, 30, 1005, 210, 15, 135, 0, L, 0, , 355, 5, MICHAEL, 14 31 | AL, 14, 2018101006, , BEST, 0, 277N, 866W, 120, 945, HU, 34, NEQ, 160, 140, 70, 140, 1006, 210, 15, 140, 0, L, 0, , 355, 6, MICHAEL, 15 32 | AL, 14, 2018101006, , BEST, 0, 277N, 866W, 120, 945, HU, 50, NEQ, 80, 80, 30, 50, 1006, 210, 15, 140, 0, L, 0, , 355, 6, MICHAEL, 15 33 | AL, 14, 2018101006, , BEST, 0, 277N, 866W, 120, 945, HU, 64, NEQ, 40, 30, 20, 30, 1006, 210, 15, 140, 0, L, 0, , 355, 6, MICHAEL, 15 34 | AL, 14, 2018101012, , BEST, 0, 290N, 863W, 125, 934, HU, 34, NEQ, 150, 140, 80, 120, 1007, 210, 10, 150, 0, L, 0, , 11, 7, MICHAEL, 16 35 | AL, 14, 2018101012, , BEST, 0, 290N, 863W, 125, 934, HU, 50, NEQ, 80, 80, 40, 50, 1007, 210, 10, 150, 0, L, 0, , 11, 7, MICHAEL, 16 36 | AL, 14, 2018101012, , BEST, 0, 290N, 863W, 125, 934, HU, 64, NEQ, 40, 35, 25, 30, 1007, 210, 10, 150, 0, L, 0, , 11, 7, MICHAEL, 16 37 | AL, 14, 2018101017, 30, BEST, 0, 300N, 855W, 140, 919, HU, 34, NEQ, 90, 140, 100, 80, 1007, 210, 10, 0, 0, , 0, , 35, 7, MICHAEL, 17 38 | AL, 14, 2018101017, 30, BEST, 0, 300N, 855W, 140, 919, HU, 50, NEQ, 60, 80, 50, 50, 1007, 210, 10, 0, 0, , 0, , 35, 7, MICHAEL, 17 39 | AL, 14, 2018101017, 30, BEST, 0, 300N, 855W, 140, 919, HU, 64, NEQ, 35, 35, 25, 25, 1007, 210, 10, 0, 0, , 0, , 35, 7, MICHAEL, 17 40 | AL, 14, 2018101018, , BEST, 0, 302N, 854W, 135, 920, HU, 34, NEQ, 90, 140, 100, 80, 1008, 210, 15, 165, 0, L, 0, , 23, 13, MICHAEL, 18 41 | AL, 14, 2018101018, , BEST, 0, 302N, 854W, 135, 920, HU, 50, NEQ, 60, 80, 50, 50, 1008, 210, 15, 165, 0, L, 0, , 23, 13, MICHAEL, 18 42 | AL, 14, 2018101018, , BEST, 0, 302N, 854W, 135, 920, HU, 64, NEQ, 35, 35, 25, 25, 1008, 210, 15, 165, 0, L, 0, , 23, 13, MICHAEL, 18 43 | AL, 14, 2018101100, , BEST, 0, 315N, 845W, 80, 957, HU, 34, NEQ, 60, 140, 60, 40, 1008, 210, 15, 100, 0, L, 0, , 31, 8, MICHAEL, 19 44 | AL, 14, 2018101100, , BEST, 0, 315N, 845W, 80, 957, HU, 50, NEQ, 40, 40, 30, 20, 1008, 210, 15, 100, 0, L, 0, , 31, 8, MICHAEL, 19 45 | AL, 14, 2018101100, , BEST, 0, 315N, 845W, 80, 957, HU, 64, NEQ, 25, 25, 0, 0, 1008, 210, 15, 100, 0, L, 0, , 31, 8, MICHAEL, 19 46 | AL, 14, 2018101106, , BEST, 0, 328N, 832W, 50, 979, TS, 34, NEQ, 50, 140, 50, 0, 1007, 220, 20, 60, 0, L, 0, , 40, 9, MICHAEL, 20 47 | AL, 14, 2018101106, , BEST, 0, 328N, 832W, 50, 979, TS, 50, NEQ, 0, 20, 0, 0, 1007, 220, 20, 60, 0, L, 0, , 40, 9, MICHAEL, 20 48 | AL, 14, 2018101112, , BEST, 0, 341N, 817W, 45, 987, TS, 34, NEQ, 0, 160, 0, 0, 1006, 220, 120, 55, 0, L, 0, , 44, 9, MICHAEL, 21 49 | AL, 14, 2018101118, , BEST, 0, 356N, 800W, 45, 991, TS, 34, NEQ, 0, 200, 0, 0, 1004, 180, 130, 55, 0, L, 0, , 43, 11, MICHAEL, 22 50 | AL, 14, 2018101200, , BEST, 0, 365N, 777W, 50, 988, EX, 34, NEQ, 90, 240, 0, 60, 1002, 160, 120, 55, 0, L, 0, , 64, 11, MICHAEL, 23 51 | AL, 14, 2018101200, , BEST, 0, 365N, 777W, 50, 988, EX, 50, NEQ, 0, 120, 0, 0, 1002, 160, 120, 55, 0, L, 0, , 64, 11, MICHAEL, 23 52 | AL, 14, 2018101206, , BEST, 0, 373N, 750W, 60, 983, EX, 34, NEQ, 90, 240, 80, 80, 1001, 180, 50, 65, 0, L, 0, , 69, 12, MICHAEL, 24 53 | AL, 14, 2018101206, , BEST, 0, 373N, 750W, 60, 983, EX, 50, NEQ, 0, 50, 50, 50, 1001, 180, 50, 65, 0, L, 0, , 69, 12, MICHAEL, 24 54 | AL, 14, 2018101212, , BEST, 0, 391N, 706W, 60, 980, EX, 34, NEQ, 90, 240, 80, 60, 998, 180, 50, 0, 0, , 0, , 61, 20, MICHAEL, 25 55 | AL, 14, 2018101212, , BEST, 0, 391N, 706W, 60, 980, EX, 50, NEQ, 0, 50, 50, 0, 998, 180, 50, 0, 0, , 0, , 61, 20, MICHAEL, 25 56 | AL, 14, 2018101218, , BEST, 0, 411N, 661W, 60, 977, EX, 34, NEQ, 90, 320, 230, 60, 996, 180, 90, 0, 0, , 0, , 59, 21, MICHAEL, 26 57 | AL, 14, 2018101218, , BEST, 0, 411N, 661W, 60, 977, EX, 50, NEQ, 0, 90, 90, 0, 996, 180, 90, 0, 0, , 0, , 59, 21, MICHAEL, 26 58 | AL, 14, 2018101300, , BEST, 0, 431N, 615W, 65, 975, EX, 34, NEQ, 90, 400, 380, 60, 996, 180, 120, 0, 0, , 0, , 58, 20, MICHAEL, 27 59 | AL, 14, 2018101300, , BEST, 0, 431N, 615W, 65, 975, EX, 50, NEQ, 0, 220, 220, 0, 996, 180, 120, 0, 0, , 0, , 58, 20, MICHAEL, 27 60 | AL, 14, 2018101300, , BEST, 0, 431N, 615W, 65, 975, EX, 64, NEQ, 0, 180, 0, 0, 996, 180, 120, 0, 0, , 0, , 58, 20, MICHAEL, 27 61 | AL, 14, 2018101306, , BEST, 0, 448N, 557W, 65, 975, EX, 34, NEQ, 90, 400, 380, 60, 996, 180, 120, 0, 0, , 0, , 66, 23, MICHAEL, 28 62 | AL, 14, 2018101306, , BEST, 0, 448N, 557W, 65, 975, EX, 50, NEQ, 0, 220, 220, 0, 996, 180, 120, 0, 0, , 0, , 66, 23, MICHAEL, 28 63 | AL, 14, 2018101306, , BEST, 0, 448N, 557W, 65, 975, EX, 64, NEQ, 0, 180, 0, 0, 996, 180, 120, 0, 0, , 0, , 66, 23, MICHAEL, 28 64 | AL, 14, 2018101312, , BEST, 0, 464N, 482W, 65, 975, EX, 34, NEQ, 120, 400, 380, 60, 996, 180, 120, 0, 0, , 0, , 70, 28, MICHAEL, 29 65 | AL, 14, 2018101312, , BEST, 0, 464N, 482W, 65, 975, EX, 50, NEQ, 0, 220, 220, 0, 996, 180, 120, 0, 0, , 0, , 70, 28, MICHAEL, 29 66 | AL, 14, 2018101312, , BEST, 0, 464N, 482W, 65, 975, EX, 64, NEQ, 0, 180, 0, 0, 996, 180, 120, 0, 0, , 0, , 70, 28, MICHAEL, 29 67 | AL, 14, 2018101318, , BEST, 0, 476N, 407W, 65, 975, EX, 34, NEQ, 120, 400, 380, 60, 998, 180, 120, 0, 0, , 0, , 74, 27, MICHAEL, 30 68 | AL, 14, 2018101318, , BEST, 0, 476N, 407W, 65, 975, EX, 50, NEQ, 0, 220, 220, 0, 998, 180, 120, 0, 0, , 0, , 74, 27, MICHAEL, 30 69 | AL, 14, 2018101318, , BEST, 0, 476N, 407W, 65, 975, EX, 64, NEQ, 0, 180, 0, 0, 998, 180, 120, 0, 0, , 0, , 74, 27, MICHAEL, 30 70 | AL, 14, 2018101400, , BEST, 0, 484N, 331W, 65, 975, EX, 34, NEQ, 120, 400, 380, 100, 998, 180, 120, 0, 0, , 0, , 78, 27, MICHAEL, 31 71 | AL, 14, 2018101400, , BEST, 0, 484N, 331W, 65, 975, EX, 50, NEQ, 0, 220, 220, 60, 998, 180, 120, 0, 0, , 0, , 78, 27, MICHAEL, 31 72 | AL, 14, 2018101400, , BEST, 0, 484N, 331W, 65, 975, EX, 64, NEQ, 0, 180, 0, 0, 998, 180, 120, 0, 0, , 0, , 78, 27, MICHAEL, 31 73 | AL, 14, 2018101406, , BEST, 0, 488N, 261W, 65, 975, EX, 34, NEQ, 120, 400, 380, 150, 998, 180, 90, 0, 0, , 0, , 82, 24, MICHAEL, 32 74 | AL, 14, 2018101406, , BEST, 0, 488N, 261W, 65, 975, EX, 50, NEQ, 0, 220, 220, 90, 998, 180, 90, 0, 0, , 0, , 82, 24, MICHAEL, 32 75 | AL, 14, 2018101406, , BEST, 0, 488N, 261W, 65, 975, EX, 64, NEQ, 0, 180, 0, 0, 998, 180, 90, 0, 0, , 0, , 82, 24, MICHAEL, 32 76 | AL, 14, 2018101412, , BEST, 0, 486N, 207W, 60, 975, EX, 34, NEQ, 170, 340, 340, 220, 1002, 180, 90, 0, 0, , 0, , 91, 18, MICHAEL, 33 77 | AL, 14, 2018101412, , BEST, 0, 486N, 207W, 60, 975, EX, 50, NEQ, 120, 150, 150, 120, 1002, 180, 90, 0, 0, , 0, , 91, 18, MICHAEL, 33 78 | AL, 14, 2018101418, , BEST, 0, 475N, 164W, 55, 978, EX, 34, NEQ, 170, 340, 340, 220, 1006, 180, 90, 0, 0, , 0, , 109, 16, MICHAEL, 34 79 | AL, 14, 2018101418, , BEST, 0, 475N, 164W, 55, 978, EX, 50, NEQ, 120, 100, 100, 120, 1006, 180, 90, 0, 0, , 0, , 109, 16, MICHAEL, 34 80 | AL, 14, 2018101500, , BEST, 0, 459N, 135W, 55, 982, EX, 34, NEQ, 140, 320, 320, 170, 1010, 180, 90, 0, 0, , 0, , 128, 13, MICHAEL, 35 81 | AL, 14, 2018101500, , BEST, 0, 459N, 135W, 55, 982, EX, 50, NEQ, 100, 0, 120, 120, 1010, 180, 90, 0, 0, , 0, , 128, 13, MICHAEL, 35 82 | AL, 14, 2018101506, , BEST, 0, 444N, 114W, 50, 989, EX, 34, NEQ, 140, 320, 320, 170, 1010, 180, 90, 0, 0, , 0, , 135, 11, MICHAEL, 36 83 | AL, 14, 2018101506, , BEST, 0, 444N, 114W, 50, 989, EX, 50, NEQ, 0, 100, 100, 0, 1010, 180, 90, 0, 0, , 0, , 135, 11, MICHAEL, 36 84 | AL, 14, 2018101512, , BEST, 0, 428N, 103W, 35, 996, EX, 34, NEQ, 0, 200, 0, 170, 1011, 180, 90, 0, 0, , 0, , 153, 9, MICHAEL, 37 85 | AL, 14, 2018101518, , BEST, 0, 412N, 100W, 35, 1001, EX, 34, NEQ, 0, 200, 0, 170, 1012, 180, 90, 0, 0, L, 0, , 172, 8, MICHAEL, 38 86 | -------------------------------------------------------------------------------- /tests/data/reference/test_vortex_track/harvey2017.fort.22: -------------------------------------------------------------------------------- 1 | AL, 09, 2017081606, , BEST, 0, 137N, 458W, 25, 1013, LO, 0, , 0, 0, 0, 0, 1014, 150, 80, 0, 0, ,,, 270, 8,, 1 2 | AL, 09, 2017081612, , BEST, 0, 137N, 474W, 25, 1010, LO, 0, , 0, 0, 0, 0, 1013, 150, 80, 0, 0, L, 0, , 270, 8, INVEST, 2 3 | AL, 09, 2017081618, , BEST, 0, 136N, 490W, 25, 1009, LO, 0, , 0, 0, 0, 0, 1013, 150, 80, 0, 0, L, 0, , 267, 8, INVEST, 3 4 | AL, 09, 2017081700, , BEST, 0, 136N, 506W, 25, 1010, LO, 0, , 0, 0, 0, 0, 1012, 120, 80, 0, 0, L, 0, , 270, 8, INVEST, 4 5 | AL, 09, 2017081706, , BEST, 0, 134N, 520W, 25, 1008, TD, 0, , 0, 0, 0, 0, 1012, 120, 70, 0, 0, L, 0, , 262, 7, INVEST, 5 6 | AL, 09, 2017081712, , BEST, 0, 131N, 534W, 30, 1008, TD, 0, , 0, 0, 0, 0, 1012, 120, 70, 40, 0, L, 0, , 258, 7, INVEST, 6 7 | AL, 09, 2017081718, , BEST, 0, 130N, 550W, 35, 1004, TS, 34, NEQ, 30, 0, 0, 30, 1012, 120, 30, 45, 0, L, 0, , 267, 8, NINE, 7 8 | AL, 09, 2017081800, , BEST, 0, 130N, 566W, 40, 1003, TS, 34, NEQ, 50, 0, 0, 50, 1010, 120, 30, 45, 0, L, 0, , 270, 8, HARVEY, 8 9 | AL, 09, 2017081806, , BEST, 0, 130N, 584W, 40, 1004, TS, 34, NEQ, 50, 0, 0, 50, 1010, 120, 30, 45, 0, L, 0, , 270, 9, HARVEY, 9 10 | AL, 09, 2017081810, , BEST, 0, 131N, 596W, 40, 1004, TS, 34, NEQ, 50, 0, 0, 50, 1010, 120, 30, 0, 0, , 0, , 275, 9, HARVEY, 10 11 | AL, 09, 2017081812, , BEST, 0, 131N, 603W, 40, 1004, TS, 34, NEQ, 60, 0, 0, 60, 1010, 120, 40, 45, 0, L, 0, , 270, 11, HARVEY, 11 12 | AL, 09, 2017081815, , BEST, 0, 132N, 612W, 40, 1004, TS, 34, NEQ, 60, 0, 0, 60, 1010, 120, 40, 0, 0, , 0, , 277, 9, HARVEY, 12 13 | AL, 09, 2017081818, , BEST, 0, 132N, 622W, 35, 1005, TS, 34, NEQ, 60, 0, 0, 60, 1010, 120, 60, 45, 0, L, 0, , 270, 10, HARVEY, 13 14 | AL, 09, 2017081900, , BEST, 0, 134N, 640W, 35, 1005, TS, 34, NEQ, 60, 0, 0, 60, 1009, 120, 60, 45, 0, L, 0, , 277, 9, HARVEY, 14 15 | AL, 09, 2017081906, , BEST, 0, 135N, 657W, 35, 1005, TS, 34, NEQ, 60, 0, 0, 60, 1008, 120, 60, 45, 0, L, 0, , 274, 9, HARVEY, 15 16 | AL, 09, 2017081912, , BEST, 0, 137N, 675W, 30, 1006, TD, 0, , 0, 0, 0, 0, 1009, 100, 60, 45, 0, L, 0, , 277, 9, HARVEY, 16 17 | AL, 09, 2017081918, , BEST, 0, 138N, 692W, 30, 1007, WV, 0, , 0, 0, 0, 0, 1009, 100, 60, 40, 0, L, 0, , 274, 9, HARVEY, 17 18 | AL, 09, 2017082000, , BEST, 0, 140N, 710W, 30, 1007, WV, 0, , 0, 0, 0, 0, 1008, 180, 60, 40, 0, L, 0, , 277, 9, HARVEY, 18 19 | AL, 09, 2017082006, , BEST, 0, 142N, 729W, 30, 1007, WV, 0, , 0, 0, 0, 0, 1008, 180, 60, 0, 0, L, 0, , 276, 10, HARVEY, 19 20 | AL, 09, 2017082012, , BEST, 0, 144N, 750W, 30, 1006, WV, 0, , 0, 0, 0, 0, 1009, 150, 60, 0, 0, L, 0, , 276, 11, HARVEY, 20 21 | AL, 09, 2017082018, , BEST, 0, 147N, 768W, 30, 1007, WV, 0, , 0, 0, 0, 0, 1010, 120, 60, 0, 0, L, 0, , 280, 9, HARVEY, 21 22 | AL, 09, 2017082100, , BEST, 0, 151N, 786W, 25, 1007, WV, 0, , 0, 0, 0, 0, 1010, 120, 90, 0, 0, L, 0, , 283, 9, HARVEY, 22 23 | AL, 09, 2017082106, , BEST, 0, 157N, 805W, 25, 1008, WV, 0, , 0, 0, 0, 0, 1010, 120, 90, 0, 0, L, 0, , 288, 10, HARVEY, 23 24 | AL, 09, 2017082112, , BEST, 0, 164N, 825W, 25, 1008, WV, 0, , 0, 0, 0, 0, 1012, 120, 90, 0, 0, L, 0, , 290, 11, HARVEY, 24 25 | AL, 09, 2017082118, , BEST, 0, 173N, 846W, 25, 1008, WV, 0, , 0, 0, 0, 0, 1012, 120, 90, 0, 0, L, 0, , 294, 11, HARVEY, 25 26 | AL, 09, 2017082200, , BEST, 0, 180N, 864W, 25, 1008, WV, 0, , 0, 0, 0, 0, 1012, 120, 90, 0, 0, L, 0, , 292, 10, HARVEY, 26 27 | AL, 09, 2017082206, , BEST, 0, 186N, 878W, 25, 1009, WV, 0, , 0, 0, 0, 0, 1012, 120, 90, 0, 0, L, 0, , 294, 8, HARVEY, 27 28 | AL, 09, 2017082212, , BEST, 0, 194N, 888W, 25, 1010, WV, 0, , 0, 0, 0, 0, 1013, 120, 90, 35, 0, L, 0, , 310, 6, HARVEY, 28 29 | AL, 09, 2017082218, , BEST, 0, 200N, 897W, 25, 1010, LO, 0, , 0, 0, 0, 0, 1013, 120, 90, 35, 0, L, 0, , 305, 5, HARVEY, 29 30 | AL, 09, 2017082300, , BEST, 0, 205N, 907W, 25, 1009, LO, 0, , 0, 0, 0, 0, 1011, 120, 90, 35, 0, L, 0, , 298, 5, HARVEY, 30 31 | AL, 09, 2017082306, , BEST, 0, 209N, 916W, 25, 1008, LO, 0, , 0, 0, 0, 0, 1012, 140, 90, 35, 0, L, 0, , 295, 5, HARVEY, 31 32 | AL, 09, 2017082312, , BEST, 0, 214N, 923W, 30, 1006, TD, 0, , 0, 0, 0, 0, 1011, 150, 100, 40, 0, L, 0, , 307, 4, HARVEY, 32 33 | AL, 09, 2017082318, , BEST, 0, 216N, 924W, 35, 1005, TS, 34, NEQ, 60, 0, 0, 0, 1011, 150, 100, 40, 0, L, 0, , 335, 1, HARVEY, 33 34 | AL, 09, 2017082400, , BEST, 0, 220N, 925W, 40, 1003, TS, 34, NEQ, 70, 0, 0, 0, 1009, 150, 60, 40, 0, L, 0, , 347, 2, HARVEY, 34 35 | AL, 09, 2017082406, , BEST, 0, 228N, 926W, 50, 997, TS, 34, NEQ, 80, 0, 0, 50, 1009, 150, 30, 50, 0, L, 0, , 353, 4, HARVEY, 35 36 | AL, 09, 2017082406, , BEST, 0, 228N, 926W, 50, 997, TS, 50, NEQ, 30, 0, 0, 0, 1009, 150, 30, 50, 0, L, 0, , 353, 4, HARVEY, 35 37 | AL, 09, 2017082412, , BEST, 0, 237N, 931W, 60, 986, TS, 34, NEQ, 80, 30, 20, 50, 1008, 180, 30, 75, 0, L, 0, , 333, 5, HARVEY, 36 38 | AL, 09, 2017082412, , BEST, 0, 237N, 931W, 60, 986, TS, 50, NEQ, 30, 10, 0, 20, 1008, 180, 30, 75, 0, L, 0, , 333, 5, HARVEY, 36 39 | AL, 09, 2017082418, , BEST, 0, 244N, 936W, 70, 978, HU, 34, NEQ, 80, 40, 30, 60, 1008, 180, 15, 90, 0, L, 0, , 327, 4, HARVEY, 37 40 | AL, 09, 2017082418, , BEST, 0, 244N, 936W, 70, 978, HU, 50, NEQ, 30, 20, 20, 30, 1008, 180, 15, 90, 0, L, 0, , 327, 4, HARVEY, 37 41 | AL, 09, 2017082418, , BEST, 0, 244N, 936W, 70, 978, HU, 64, NEQ, 20, 0, 0, 0, 1008, 180, 15, 90, 0, L, 0, , 327, 4, HARVEY, 37 42 | AL, 09, 2017082500, , BEST, 0, 250N, 944W, 80, 973, HU, 34, NEQ, 90, 50, 40, 60, 1008, 190, 10, 90, 0, L, 0, , 310, 5, HARVEY, 38 43 | AL, 09, 2017082500, , BEST, 0, 250N, 944W, 80, 973, HU, 50, NEQ, 30, 20, 20, 30, 1008, 190, 10, 90, 0, L, 0, , 310, 5, HARVEY, 38 44 | AL, 09, 2017082500, , BEST, 0, 250N, 944W, 80, 973, HU, 64, NEQ, 20, 10, 10, 10, 1008, 190, 10, 90, 0, L, 0, , 310, 5, HARVEY, 38 45 | AL, 09, 2017082506, , BEST, 0, 256N, 951W, 90, 966, HU, 34, NEQ, 120, 50, 40, 90, 1008, 190, 10, 110, 0, L, 0, , 313, 4, HARVEY, 39 46 | AL, 09, 2017082506, , BEST, 0, 256N, 951W, 90, 966, HU, 50, NEQ, 30, 30, 20, 30, 1008, 190, 10, 110, 0, L, 0, , 313, 4, HARVEY, 39 47 | AL, 09, 2017082506, , BEST, 0, 256N, 951W, 90, 966, HU, 64, NEQ, 20, 20, 10, 20, 1008, 190, 10, 110, 0, L, 0, , 313, 4, HARVEY, 39 48 | AL, 09, 2017082512, , BEST, 0, 263N, 958W, 95, 949, HU, 34, NEQ, 120, 90, 80, 100, 1007, 210, 10, 115, 0, L, 0, , 318, 5, HARVEY, 40 49 | AL, 09, 2017082512, , BEST, 0, 263N, 958W, 95, 949, HU, 50, NEQ, 50, 40, 40, 30, 1007, 210, 10, 115, 0, L, 0, , 318, 5, HARVEY, 40 50 | AL, 09, 2017082512, , BEST, 0, 263N, 958W, 95, 949, HU, 64, NEQ, 30, 20, 10, 20, 1007, 210, 10, 115, 0, L, 0, , 318, 5, HARVEY, 40 51 | AL, 09, 2017082518, , BEST, 0, 271N, 963W, 105, 943, HU, 34, NEQ, 120, 90, 80, 100, 1008, 180, 15, 130, 0, L, 0, , 331, 5, HARVEY, 41 52 | AL, 09, 2017082518, , BEST, 0, 271N, 963W, 105, 943, HU, 50, NEQ, 50, 40, 40, 40, 1008, 180, 15, 130, 0, L, 0, , 331, 5, HARVEY, 41 53 | AL, 09, 2017082518, , BEST, 0, 271N, 963W, 105, 943, HU, 64, NEQ, 30, 25, 20, 25, 1008, 180, 15, 130, 0, L, 0, , 331, 5, HARVEY, 41 54 | AL, 09, 2017082600, , BEST, 0, 278N, 968W, 115, 941, HU, 34, NEQ, 120, 90, 80, 70, 1009, 180, 15, 140, 0, L, 0, , 328, 4, HARVEY, 42 55 | AL, 09, 2017082600, , BEST, 0, 278N, 968W, 115, 941, HU, 50, NEQ, 60, 40, 40, 40, 1009, 180, 15, 140, 0, L, 0, , 328, 4, HARVEY, 42 56 | AL, 09, 2017082600, , BEST, 0, 278N, 968W, 115, 941, HU, 64, NEQ, 35, 25, 20, 25, 1009, 180, 15, 140, 0, L, 0, , 328, 4, HARVEY, 42 57 | AL, 09, 2017082603, , BEST, 0, 280N, 969W, 115, 937, HU, 34, NEQ, 120, 90, 80, 70, 1009, 180, 15, 0, 0, , 0, , 336, 2, HARVEY, 43 58 | AL, 09, 2017082603, , BEST, 0, 280N, 969W, 115, 937, HU, 50, NEQ, 60, 40, 40, 40, 1009, 180, 15, 0, 0, , 0, , 336, 2, HARVEY, 43 59 | AL, 09, 2017082603, , BEST, 0, 280N, 969W, 115, 937, HU, 64, NEQ, 35, 25, 20, 25, 1009, 180, 15, 0, 0, , 0, , 336, 2, HARVEY, 43 60 | AL, 09, 2017082606, , BEST, 0, 282N, 971W, 105, 948, HU, 34, NEQ, 120, 100, 70, 70, 1010, 180, 10, 120, 0, L, 0, , 318, 3, HARVEY, 44 61 | AL, 09, 2017082606, , BEST, 0, 282N, 971W, 105, 948, HU, 50, NEQ, 50, 50, 30, 40, 1010, 180, 10, 120, 0, L, 0, , 318, 3, HARVEY, 44 62 | AL, 09, 2017082606, , BEST, 0, 282N, 971W, 105, 948, HU, 64, NEQ, 30, 25, 20, 25, 1010, 180, 10, 120, 0, L, 0, , 318, 3, HARVEY, 44 63 | AL, 09, 2017082612, , BEST, 0, 287N, 973W, 65, 978, HU, 34, NEQ, 120, 100, 70, 70, 1010, 180, 10, 85, 0, L, 0, , 341, 3, HARVEY, 45 64 | AL, 09, 2017082612, , BEST, 0, 287N, 973W, 65, 978, HU, 50, NEQ, 50, 50, 30, 40, 1010, 180, 10, 85, 0, L, 0, , 341, 3, HARVEY, 45 65 | AL, 09, 2017082612, , BEST, 0, 287N, 973W, 65, 978, HU, 64, NEQ, 25, 20, 15, 20, 1010, 180, 10, 85, 0, L, 0, , 341, 3, HARVEY, 45 66 | AL, 09, 2017082618, , BEST, 0, 290N, 975W, 50, 991, TS, 34, NEQ, 75, 100, 30, 50, 1010, 180, 10, 75, 0, L, 0, , 330, 2, HARVEY, 46 67 | AL, 09, 2017082618, , BEST, 0, 290N, 975W, 50, 991, TS, 50, NEQ, 40, 40, 20, 30, 1010, 180, 10, 75, 0, L, 0, , 330, 2, HARVEY, 46 68 | AL, 09, 2017082700, , BEST, 0, 292N, 974W, 45, 995, TS, 34, NEQ, 50, 100, 30, 50, 1008, 180, 20, 60, 0, L, 0, , 24, 1, HARVEY, 47 69 | AL, 09, 2017082706, , BEST, 0, 293N, 976W, 40, 998, TS, 34, NEQ, 50, 100, 30, 50, 1010, 180, 20, 50, 0, L, 0, , 300, 1, HARVEY, 48 70 | AL, 09, 2017082712, , BEST, 0, 291N, 975W, 35, 998, TS, 34, NEQ, 150, 60, 0, 30, 1010, 180, 100, 45, 0, L, 0, , 156, 1, HARVEY, 49 71 | AL, 09, 2017082718, , BEST, 0, 290N, 972W, 35, 998, TS, 34, NEQ, 120, 60, 30, 60, 1010, 180, 90, 45, 0, L, 0, , 111, 1, HARVEY, 50 72 | AL, 09, 2017082800, , BEST, 0, 288N, 968W, 35, 997, TS, 34, NEQ, 120, 60, 30, 60, 1010, 210, 90, 45, 0, L, 0, , 120, 2, HARVEY, 51 73 | AL, 09, 2017082806, , BEST, 0, 286N, 965W, 40, 997, TS, 34, NEQ, 150, 150, 30, 60, 1008, 180, 90, 45, 0, L, 0, , 127, 2, HARVEY, 52 74 | AL, 09, 2017082812, , BEST, 0, 285N, 962W, 40, 997, TS, 34, NEQ, 150, 150, 30, 0, 1008, 180, 60, 45, 0, L, 0, , 111, 1, HARVEY, 53 75 | AL, 09, 2017082818, , BEST, 0, 284N, 959W, 40, 997, TS, 34, NEQ, 150, 150, 60, 0, 1009, 180, 60, 45, 0, L, 0, , 111, 1, HARVEY, 54 76 | AL, 09, 2017082900, , BEST, 0, 282N, 954W, 40, 996, TS, 34, NEQ, 150, 150, 60, 60, 1008, 200, 60, 0, 0, L, 0, , 114, 2, HARVEY, 55 77 | AL, 09, 2017082906, , BEST, 0, 281N, 950W, 40, 996, TS, 34, NEQ, 150, 150, 60, 60, 1008, 200, 60, 50, 0, L, 0, , 106, 2, HARVEY, 56 78 | AL, 09, 2017082912, , BEST, 0, 282N, 946W, 40, 995, TS, 34, NEQ, 140, 140, 60, 60, 1008, 200, 60, 50, 0, L, 0, , 74, 2, HARVEY, 57 79 | AL, 09, 2017082918, , BEST, 0, 285N, 942W, 45, 993, TS, 34, NEQ, 100, 140, 60, 60, 1008, 200, 60, 55, 0, L, 0, , 50, 2, HARVEY, 58 80 | AL, 09, 2017083000, , BEST, 0, 289N, 938W, 45, 994, TS, 34, NEQ, 100, 140, 60, 60, 1008, 200, 60, 55, 0, L, 0, , 41, 3, HARVEY, 59 81 | AL, 09, 2017083006, , BEST, 0, 294N, 936W, 40, 990, TS, 34, NEQ, 70, 70, 70, 70, 1010, 200, 50, 50, 0, L, 0, , 19, 3, HARVEY, 60 82 | AL, 09, 2017083008, , BEST, 0, 298N, 935W, 40, 991, TS, 34, NEQ, 60, 60, 70, 70, 1010, 200, 50, 0, 0, , 0, , 12, 6, HARVEY, 61 83 | AL, 09, 2017083012, , BEST, 0, 301N, 934W, 40, 992, TS, 34, NEQ, 40, 60, 70, 40, 1010, 200, 40, 50, 0, L, 0, , 16, 2, HARVEY, 62 84 | AL, 09, 2017083018, , BEST, 0, 306N, 931W, 35, 996, TS, 34, NEQ, 0, 60, 70, 0, 1012, 200, 70, 45, 0, L, 0, , 27, 3, HARVEY, 63 85 | AL, 09, 2017083100, , BEST, 0, 313N, 926W, 30, 998, TD, 0, , 0, 0, 0, 0, 1010, 220, 80, 40, 0, L, 0, , 31, 4, HARVEY, 64 86 | AL, 09, 2017083106, , BEST, 0, 319N, 922W, 25, 999, TD, 0, , 0, 0, 0, 0, 1010, 220, 80, 0, 0, , 0, , 30, 4, HARVEY, 65 87 | AL, 09, 2017083112, , BEST, 0, 325N, 917W, 20, 1001, TD, 0, , 0, 0, 0, 0, 1010, 220, 80, 0, 0, , 0, , 35, 4, HARVEY, 66 88 | AL, 09, 2017083118, , BEST, 0, 334N, 909W, 25, 1001, TD, 0, , 0, 0, 0, 0, 1010, 220, 80, 0, 0, , 0, , 37, 6, HARVEY, 67 89 | AL, 09, 2017090100, , BEST, 0, 341N, 896W, 30, 1000, TD, 0, , 0, 0, 0, 0, 1010, 220, 80, 0, 0, , 0, , 57, 7, HARVEY, 68 90 | AL, 09, 2017090106, , BEST, 0, 349N, 882W, 30, 1002, EX, 0, , 0, 0, 0, 0, 1010, 220, 80, 0, 0, , 0, , 55, 7, HARVEY, 69 91 | AL, 09, 2017090112, , BEST, 0, 360N, 871W, 25, 1002, EX, 0, , 0, 0, 0, 0, 1010, 220, 80, 0, 0, , 0, , 39, 7, HARVEY, 70 92 | AL, 09, 2017090118, , BEST, 0, 365N, 864W, 20, 1004, EX, 0, , 0, 0, 0, 0, 1010, 220, 80, 0, 0, , 0, , 48, 4, HARVEY, 71 93 | AL, 09, 2017090200, , BEST, 0, 372N, 856W, 20, 1007, EX, 0, , 0, 0, 0, 0, 1010, 220, 80, 0, 0, , 0, , 42, 5, HARVEY, 72 94 | AL, 09, 2017090206, , BEST, 0, 379N, 849W, 20, 1009, EX, 0, , 0, 0, 0, 0, 1010, 220, 80, 0, 0, , 0, , 38, 5, HARVEY, 73 95 | AL, 09, 2017090212, , BEST, 0, 382N, 847W, 15, 1013, EX, 0, , 0, 0, 0, 0, 1014, 220, 80, 0, 0, , 0, , 28, 2, HARVEY, 74 96 | -------------------------------------------------------------------------------- /tests/data/reference/test_vortex_track/irene2011.fort.22: -------------------------------------------------------------------------------- 1 | AL, 09, 2011082100, , BEST, 0, 150N, 590W, 45, 1006, TS, 34, NEQ, 105, 0, 0, 45, 1010, 175, 60, 55, 0, L, 0, , 303, 9, IRENE, 1 2 | AL, 09, 2011082106, , BEST, 0, 160N, 606W, 45, 1006, TS, 34, NEQ, 130, 0, 0, 80, 1010, 175, 50, 55, 0, L, 0, , 303, 9, IRENE, 2 3 | AL, 09, 2011082112, , BEST, 0, 168N, 622W, 45, 1005, TS, 34, NEQ, 130, 0, 0, 70, 1010, 175, 50, 55, 0, L, 0, , 298, 9, IRENE, 3 4 | AL, 09, 2011082118, , BEST, 0, 175N, 637W, 50, 999, TS, 34, NEQ, 130, 20, 0, 70, 1010, 175, 50, 55, 0, L, 0, , 296, 8, IRENE, 4 5 | AL, 09, 2011082118, , BEST, 0, 175N, 637W, 50, 999, TS, 50, NEQ, 30, 0, 0, 0, 1010, 175, 50, 55, 0, L, 0, , 296, 8, IRENE, 4 6 | AL, 09, 2011082123, , BEST, 0, 178N, 646W, 60, 993, TS, 0, , 0, 0, 0, 0, 1013,,,,,,,, 289, 6,, 5 7 | AL, 09, 2011082200, , BEST, 0, 179N, 650W, 60, 993, TS, 34, NEQ, 130, 30, 30, 90, 1010, 125, 30, 60, 0, L, 0, , 285, 12, IRENE, 6 8 | AL, 09, 2011082200, , BEST, 0, 179N, 650W, 60, 993, TS, 50, NEQ, 30, 0, 0, 30, 1010, 125, 30, 60, 0, L, 0, , 285, 12, IRENE, 6 9 | AL, 09, 2011082205, 25, BEST, 0, 181N, 658W, 60, 990, TS, 0, , 0, 0, 0, 0, 1013,,,,,,,, 285, 4,, 7 10 | AL, 09, 2011082206, , BEST, 0, 182N, 659W, 65, 990, HU, 34, NEQ, 130, 60, 60, 90, 1010, 150, 15, 75, 0, L, 0, , 316, 7, IRENE, 8 11 | AL, 09, 2011082206, , BEST, 0, 182N, 659W, 65, 990, HU, 50, NEQ, 40, 25, 20, 35, 1010, 150, 15, 75, 0, L, 0, , 316, 7, IRENE, 8 12 | AL, 09, 2011082206, , BEST, 0, 182N, 659W, 65, 990, HU, 64, NEQ, 25, 0, 0, 0, 1010, 150, 15, 75, 0, L, 0, , 316, 7, IRENE, 8 13 | AL, 09, 2011082212, , BEST, 0, 189N, 670W, 70, 989, HU, 34, NEQ, 160, 60, 60, 90, 1010, 200, 15, 85, 0, L, 0, , 304, 6, IRENE, 9 14 | AL, 09, 2011082212, , BEST, 0, 189N, 670W, 70, 989, HU, 50, NEQ, 40, 25, 20, 35, 1010, 200, 15, 85, 0, L, 0, , 304, 6, IRENE, 9 15 | AL, 09, 2011082212, , BEST, 0, 189N, 670W, 70, 989, HU, 64, NEQ, 25, 0, 0, 0, 1010, 200, 15, 85, 0, L, 0, , 304, 6, IRENE, 9 16 | AL, 09, 2011082218, , BEST, 0, 193N, 680W, 75, 988, HU, 34, NEQ, 160, 60, 40, 90, 1010, 250, 15, 85, 0, L, 0, , 293, 5, IRENE, 10 17 | AL, 09, 2011082218, , BEST, 0, 193N, 680W, 75, 988, HU, 50, NEQ, 40, 30, 20, 35, 1010, 250, 15, 85, 0, L, 0, , 293, 5, IRENE, 10 18 | AL, 09, 2011082218, , BEST, 0, 193N, 680W, 75, 988, HU, 64, NEQ, 25, 0, 0, 0, 1010, 250, 15, 85, 0, L, 0, , 293, 5, IRENE, 10 19 | AL, 09, 2011082300, , BEST, 0, 197N, 688W, 80, 981, HU, 34, NEQ, 160, 70, 50, 100, 1010, 300, 15, 105, 30, L, 0, , 298, 4, IRENE, 11 20 | AL, 09, 2011082300, , BEST, 0, 197N, 688W, 80, 981, HU, 50, NEQ, 70, 30, 30, 70, 1010, 300, 15, 105, 30, L, 0, , 298, 4, IRENE, 11 21 | AL, 09, 2011082300, , BEST, 0, 197N, 688W, 80, 981, HU, 64, NEQ, 25, 0, 0, 35, 1010, 300, 15, 105, 30, L, 0, , 298, 4, IRENE, 11 22 | AL, 09, 2011082306, , BEST, 0, 201N, 697W, 80, 978, HU, 34, NEQ, 180, 120, 90, 130, 1010, 300, 15, 105, 0, L, 0, , 295, 5, IRENE, 12 23 | AL, 09, 2011082306, , BEST, 0, 201N, 697W, 80, 978, HU, 50, NEQ, 90, 60, 40, 70, 1010, 300, 15, 105, 0, L, 0, , 295, 5, IRENE, 12 24 | AL, 09, 2011082306, , BEST, 0, 201N, 697W, 80, 978, HU, 64, NEQ, 45, 30, 20, 35, 1010, 300, 15, 105, 0, L, 0, , 295, 5, IRENE, 12 25 | AL, 09, 2011082312, , BEST, 0, 204N, 706W, 80, 978, HU, 34, NEQ, 180, 120, 90, 130, 1008, 300, 15, 105, 0, L, 0, , 290, 5, IRENE, 13 26 | AL, 09, 2011082312, , BEST, 0, 204N, 706W, 80, 978, HU, 50, NEQ, 90, 60, 40, 70, 1008, 300, 15, 105, 0, L, 0, , 290, 5, IRENE, 13 27 | AL, 09, 2011082312, , BEST, 0, 204N, 706W, 80, 978, HU, 64, NEQ, 40, 30, 20, 35, 1008, 300, 15, 105, 0, L, 0, , 290, 5, IRENE, 13 28 | AL, 09, 2011082318, , BEST, 0, 207N, 712W, 80, 977, HU, 34, NEQ, 180, 120, 90, 130, 1006, 300, 20, 100, 0, L, 0, , 298, 3, IRENE, 14 29 | AL, 09, 2011082318, , BEST, 0, 207N, 712W, 80, 977, HU, 50, NEQ, 75, 60, 40, 70, 1006, 300, 20, 100, 0, L, 0, , 298, 3, IRENE, 14 30 | AL, 09, 2011082318, , BEST, 0, 207N, 712W, 80, 977, HU, 64, NEQ, 35, 30, 20, 35, 1006, 300, 20, 100, 0, L, 0, , 298, 3, IRENE, 14 31 | AL, 09, 2011082400, , BEST, 0, 210N, 719W, 80, 969, HU, 34, NEQ, 180, 150, 90, 150, 1006, 300, 20, 100, 0, L, 0, , 295, 4, IRENE, 15 32 | AL, 09, 2011082400, , BEST, 0, 210N, 719W, 80, 969, HU, 50, NEQ, 70, 70, 40, 70, 1006, 300, 20, 100, 0, L, 0, , 295, 4, IRENE, 15 33 | AL, 09, 2011082400, , BEST, 0, 210N, 719W, 80, 969, HU, 64, NEQ, 35, 30, 25, 35, 1006, 300, 20, 100, 0, L, 0, , 295, 4, IRENE, 15 34 | AL, 09, 2011082406, , BEST, 0, 213N, 725W, 95, 965, HU, 34, NEQ, 180, 150, 90, 150, 1008, 300, 20, 115, 0, L, 0, , 298, 3, IRENE, 16 35 | AL, 09, 2011082406, , BEST, 0, 213N, 725W, 95, 965, HU, 50, NEQ, 70, 70, 40, 70, 1008, 300, 20, 115, 0, L, 0, , 298, 3, IRENE, 16 36 | AL, 09, 2011082406, , BEST, 0, 213N, 725W, 95, 965, HU, 64, NEQ, 35, 30, 25, 35, 1008, 300, 20, 115, 0, L, 0, , 298, 3, IRENE, 16 37 | AL, 09, 2011082412, , BEST, 0, 219N, 733W, 105, 957, HU, 34, NEQ, 180, 150, 90, 150, 1008, 275, 15, 120, 0, L, 0, , 309, 5, IRENE, 17 38 | AL, 09, 2011082412, , BEST, 0, 219N, 733W, 105, 957, HU, 50, NEQ, 90, 60, 45, 80, 1008, 275, 15, 120, 0, L, 0, , 309, 5, IRENE, 17 39 | AL, 09, 2011082412, , BEST, 0, 219N, 733W, 105, 957, HU, 64, NEQ, 45, 40, 25, 40, 1008, 275, 15, 120, 0, L, 0, , 309, 5, IRENE, 17 40 | AL, 09, 2011082416, , BEST, 0, 224N, 740W, 100, 955, HU, 0, , 0, 0, 0, 0, 1013,,,,,,,, 308, 6,, 18 41 | AL, 09, 2011082418, , BEST, 0, 227N, 743W, 100, 954, HU, 34, NEQ, 200, 180, 100, 150, 1008, 300, 15, 130, 0, L, 0, , 317, 6, IRENE, 19 42 | AL, 09, 2011082418, , BEST, 0, 227N, 743W, 100, 954, HU, 50, NEQ, 100, 70, 50, 80, 1008, 300, 15, 130, 0, L, 0, , 317, 6, IRENE, 19 43 | AL, 09, 2011082418, , BEST, 0, 227N, 743W, 100, 954, HU, 64, NEQ, 50, 45, 25, 40, 1008, 300, 15, 130, 0, L, 0, , 317, 6, IRENE, 19 44 | AL, 09, 2011082500, , BEST, 0, 235N, 751W, 95, 952, HU, 34, NEQ, 220, 180, 100, 150, 1008, 300, 30, 130, 0, L, 0, , 317, 6, IRENE, 20 45 | AL, 09, 2011082500, , BEST, 0, 235N, 751W, 95, 952, HU, 50, NEQ, 100, 90, 50, 80, 1008, 300, 30, 130, 0, L, 0, , 317, 6, IRENE, 20 46 | AL, 09, 2011082500, , BEST, 0, 235N, 751W, 95, 952, HU, 64, NEQ, 60, 60, 25, 50, 1008, 300, 30, 130, 0, L, 0, , 317, 6, IRENE, 20 47 | AL, 09, 2011082506, , BEST, 0, 241N, 759W, 95, 950, HU, 34, NEQ, 220, 180, 100, 150, 1008, 275, 30, 120, 0, L, 0, , 309, 5, IRENE, 21 48 | AL, 09, 2011082506, , BEST, 0, 241N, 759W, 95, 950, HU, 50, NEQ, 100, 80, 50, 70, 1008, 275, 30, 120, 0, L, 0, , 309, 5, IRENE, 21 49 | AL, 09, 2011082506, , BEST, 0, 241N, 759W, 95, 950, HU, 64, NEQ, 60, 60, 25, 50, 1008, 275, 30, 120, 0, L, 0, , 309, 5, IRENE, 21 50 | AL, 09, 2011082509, , BEST, 0, 247N, 762W, 90, 950, HU, 0, , 0, 0, 0, 0, 1013,,,,,,,, 335, 7,, 22 51 | AL, 09, 2011082512, , BEST, 0, 254N, 766W, 90, 950, HU, 34, NEQ, 250, 200, 100, 160, 1008, 300, 30, 120, 0, L, 0, , 333, 8, IRENE, 23 52 | AL, 09, 2011082512, , BEST, 0, 254N, 766W, 90, 950, HU, 50, NEQ, 100, 100, 50, 70, 1008, 300, 30, 120, 0, L, 0, , 333, 8, IRENE, 23 53 | AL, 09, 2011082512, , BEST, 0, 254N, 766W, 90, 950, HU, 64, NEQ, 60, 60, 25, 50, 1008, 300, 30, 120, 0, L, 0, , 333, 8, IRENE, 23 54 | AL, 09, 2011082518, , BEST, 0, 265N, 772W, 90, 950, HU, 34, NEQ, 250, 200, 125, 160, 1008, 300, 30, 115, 0, L, 0, , 334, 6, IRENE, 24 55 | AL, 09, 2011082518, , BEST, 0, 265N, 772W, 90, 950, HU, 50, NEQ, 110, 100, 50, 75, 1008, 300, 30, 115, 0, L, 0, , 334, 6, IRENE, 24 56 | AL, 09, 2011082518, , BEST, 0, 265N, 772W, 90, 950, HU, 64, NEQ, 70, 60, 25, 50, 1008, 300, 30, 115, 0, L, 0, , 334, 6, IRENE, 24 57 | AL, 09, 2011082600, , BEST, 0, 277N, 773W, 90, 946, HU, 34, NEQ, 250, 200, 125, 160, 1008, 300, 30, 120, 0, L, 0, , 356, 6, IRENE, 25 58 | AL, 09, 2011082600, , BEST, 0, 277N, 773W, 90, 946, HU, 50, NEQ, 110, 100, 50, 75, 1008, 300, 30, 120, 0, L, 0, , 356, 6, IRENE, 25 59 | AL, 09, 2011082600, , BEST, 0, 277N, 773W, 90, 946, HU, 64, NEQ, 70, 60, 25, 50, 1008, 300, 30, 120, 0, L, 0, , 356, 6, IRENE, 25 60 | AL, 09, 2011082606, , BEST, 0, 288N, 773W, 90, 942, HU, 34, NEQ, 250, 200, 130, 175, 1010, 325, 10, 115, 0, L, 0, , 0, 6, IRENE, 26 61 | AL, 09, 2011082606, , BEST, 0, 288N, 773W, 90, 942, HU, 50, NEQ, 125, 105, 75, 75, 1010, 325, 10, 115, 0, L, 0, , 0, 6, IRENE, 26 62 | AL, 09, 2011082606, , BEST, 0, 288N, 773W, 90, 942, HU, 64, NEQ, 80, 80, 50, 50, 1010, 325, 10, 115, 0, L, 0, , 0, 6, IRENE, 26 63 | AL, 09, 2011082612, , BEST, 0, 300N, 774W, 85, 947, HU, 34, NEQ, 250, 200, 130, 175, 1010, 325, 40, 110, 0, L, 0, , 356, 6, IRENE, 27 64 | AL, 09, 2011082612, , BEST, 0, 300N, 774W, 85, 947, HU, 50, NEQ, 125, 105, 75, 75, 1010, 325, 40, 110, 0, L, 0, , 356, 6, IRENE, 27 65 | AL, 09, 2011082612, , BEST, 0, 300N, 774W, 85, 947, HU, 64, NEQ, 80, 80, 50, 50, 1010, 325, 40, 110, 0, L, 0, , 356, 6, IRENE, 27 66 | AL, 09, 2011082618, , BEST, 0, 311N, 775W, 80, 950, HU, 34, NEQ, 250, 225, 140, 175, 1012, 360, 40, 105, 0, L, 0, , 356, 6, IRENE, 28 67 | AL, 09, 2011082618, , BEST, 0, 311N, 775W, 80, 950, HU, 50, NEQ, 125, 125, 80, 75, 1012, 360, 40, 105, 0, L, 0, , 356, 6, IRENE, 28 68 | AL, 09, 2011082618, , BEST, 0, 311N, 775W, 80, 950, HU, 64, NEQ, 80, 80, 50, 50, 1012, 360, 40, 105, 0, L, 0, , 356, 6, IRENE, 28 69 | AL, 09, 2011082700, , BEST, 0, 321N, 771W, 75, 952, HU, 34, NEQ, 225, 225, 140, 140, 1012, 360, 60, 0, 0, L, 0, , 19, 5, IRENE, 29 70 | AL, 09, 2011082700, , BEST, 0, 321N, 771W, 75, 952, HU, 50, NEQ, 125, 125, 90, 75, 1012, 360, 60, 0, 0, L, 0, , 19, 5, IRENE, 29 71 | AL, 09, 2011082700, , BEST, 0, 321N, 771W, 75, 952, HU, 64, NEQ, 80, 80, 40, 40, 1012, 360, 60, 0, 0, L, 0, , 19, 5, IRENE, 29 72 | AL, 09, 2011082706, , BEST, 0, 334N, 768W, 75, 952, HU, 34, NEQ, 225, 225, 140, 140, 1012, 400, 60, 100, 0, L, 0, , 11, 7, IRENE, 30 73 | AL, 09, 2011082706, , BEST, 0, 334N, 768W, 75, 952, HU, 50, NEQ, 125, 125, 90, 75, 1012, 400, 60, 100, 0, L, 0, , 11, 7, IRENE, 30 74 | AL, 09, 2011082706, , BEST, 0, 334N, 768W, 75, 952, HU, 64, NEQ, 80, 80, 40, 40, 1012, 400, 60, 100, 0, L, 0, , 11, 7, IRENE, 30 75 | AL, 09, 2011082712, , BEST, 0, 347N, 766W, 75, 952, HU, 34, NEQ, 225, 225, 150, 125, 1012, 400, 45, 90, 0, L, 0, , 7, 7, IRENE, 31 76 | AL, 09, 2011082712, , BEST, 0, 347N, 766W, 75, 952, HU, 50, NEQ, 125, 125, 90, 60, 1012, 400, 45, 90, 0, L, 0, , 7, 7, IRENE, 31 77 | AL, 09, 2011082712, , BEST, 0, 347N, 766W, 75, 952, HU, 64, NEQ, 80, 80, 40, 35, 1012, 400, 45, 90, 0, L, 0, , 7, 7, IRENE, 31 78 | AL, 09, 2011082718, , BEST, 0, 355N, 763W, 65, 950, HU, 34, NEQ, 210, 225, 150, 125, 1012, 400, 45, 90, 0, L, 0, , 17, 4, IRENE, 32 79 | AL, 09, 2011082718, , BEST, 0, 355N, 763W, 65, 950, HU, 50, NEQ, 125, 125, 80, 60, 1012, 400, 45, 90, 0, L, 0, , 17, 4, IRENE, 32 80 | AL, 09, 2011082718, , BEST, 0, 355N, 763W, 65, 950, HU, 64, NEQ, 75, 75, 35, 35, 1012, 400, 45, 90, 0, L, 0, , 17, 4, IRENE, 32 81 | AL, 09, 2011082800, , BEST, 0, 367N, 757W, 65, 951, HU, 34, NEQ, 210, 225, 150, 125, 1012, 400, 45, 85, 0, L, 0, , 22, 7, IRENE, 33 82 | AL, 09, 2011082800, , BEST, 0, 367N, 757W, 65, 951, HU, 50, NEQ, 150, 150, 80, 60, 1012, 400, 45, 85, 0, L, 0, , 22, 7, IRENE, 33 83 | AL, 09, 2011082800, , BEST, 0, 367N, 757W, 65, 951, HU, 64, NEQ, 75, 75, 0, 0, 1012, 400, 45, 0, 0, ,,, 22, 7,, 33 84 | AL, 09, 2011082806, , BEST, 0, 381N, 750W, 65, 958, HU, 34, NEQ, 230, 280, 160, 110, 1008, 365, 100, 80, 0, L, 0, , 22, 8, IRENE, 34 85 | AL, 09, 2011082806, , BEST, 0, 381N, 750W, 65, 958, HU, 50, NEQ, 150, 150, 80, 30, 1008, 365, 100, 80, 0, L, 0, , 22, 8, IRENE, 34 86 | AL, 09, 2011082806, , BEST, 0, 381N, 750W, 65, 958, HU, 64, NEQ, 75, 75, 0, 0, 1008, 365, 100, 0, 0, ,,, 22, 8,, 34 87 | AL, 09, 2011082809, 35, BEST, 0, 394N, 744W, 60, 959, TS, 34, NEQ, 230, 280, 160, 110, 1013,,,,,,,, 20, 12,, 35 88 | AL, 09, 2011082809, 35, BEST, 0, 394N, 744W, 60, 959, TS, 50, NEQ, 150, 150, 80, 30, 1013,,,,,,,, 20, 12,, 35 89 | AL, 09, 2011082812, , BEST, 0, 403N, 741W, 55, 963, TS, 34, NEQ, 230, 280, 130, 50, 1006, 400, 100, 65, 0, L, 0, , 14, 12, IRENE, 36 90 | AL, 09, 2011082812, , BEST, 0, 403N, 741W, 55, 963, TS, 50, NEQ, 150, 150, 80, 30, 1006, 400, 100, 65, 0, L, 0, , 14, 12, IRENE, 36 91 | AL, 09, 2011082813, , BEST, 0, 406N, 740W, 55, 965, TS, 34, NEQ, 230, 280, 130, 50, 1013,,,,,,,, 14, 10,, 37 92 | AL, 09, 2011082813, , BEST, 0, 406N, 740W, 55, 965, TS, 50, NEQ, 150, 150, 80, 30, 1013,,,,,,,, 14, 10,, 37 93 | AL, 09, 2011082818, , BEST, 0, 425N, 731W, 50, 970, TS, 34, NEQ, 230, 280, 180, 50, 1006, 400, 100, 60, 0, L, 0, , 19, 12, IRENE, 38 94 | AL, 09, 2011082818, , BEST, 0, 425N, 731W, 50, 970, TS, 50, NEQ, 150, 150, 80, 30, 1006, 400, 100, 60, 0, L, 0, , 19, 12, IRENE, 38 95 | AL, 09, 2011082900, , BEST, 0, 442N, 721W, 45, 979, EX, 34, NEQ, 230, 315, 250, 50, 1004, 350, 150, 55, 0, L, 0, , 23, 10, IRENE, 39 96 | AL, 09, 2011082906, , BEST, 0, 465N, 695W, 40, 983, EX, 34, NEQ, 360, 360, 360, 0, 1013,,,,,,,, 38, 15,, 40 97 | AL, 09, 2011082912, , BEST, 0, 491N, 667W, 40, 985, EX, 34, NEQ, 360, 360, 300, 0, 1013,,,,,,,, 35, 17,, 41 98 | AL, 09, 2011082918, , BEST, 0, 513N, 638W, 40, 987, EX, 34, NEQ, 0, 360, 0, 0, 1013,,,,,,,, 39, 15,, 42 99 | AL, 09, 2011083000, , BEST, 0, 530N, 600W, 40, 991, EX, 34, NEQ, 0, 270, 0, 0, 1013,,,,,,,, 52, 15,, 43 100 | -------------------------------------------------------------------------------- /tests/data/reference/test_vortex_track/sandy2012.fort.22: -------------------------------------------------------------------------------- 1 | AL, 18, 2012102118, , BEST, 0, 143N, 774W, 25, 1006, LO, 0, , 0, 0, 0, 0, 1008, 180, 150, 35, 0, L, 0, , 224, 3, INVEST, 1 2 | AL, 18, 2012102200, , BEST, 0, 139N, 778W, 25, 1005, LO, 0, , 0, 0, 0, 0, 1008, 180, 150, 35, 0, L, 0, , 224, 3, INVEST, 2 3 | AL, 18, 2012102206, , BEST, 0, 135N, 782W, 25, 1003, LO, 0, , 0, 0, 0, 0, 1008, 225, 75, 35, 0, L, 0, , 224, 3, INVEST, 3 4 | AL, 18, 2012102212, , BEST, 0, 131N, 786W, 30, 1002, TD, 0, , 0, 0, 0, 0, 1007, 250, 75, 0, 0, L, 0, , 224, 3, EIGHTEEN, 4 5 | AL, 18, 2012102218, , BEST, 0, 127N, 787W, 35, 1000, TS, 34, NEQ, 50, 60, 0, 0, 1007, 250, 60, 45, 0, L, 0, , 194, 2, EIGHTEEN, 5 6 | AL, 18, 2012102300, , BEST, 0, 126N, 784W, 40, 998, TS, 34, NEQ, 50, 60, 0, 0, 1007, 250, 40, 50, 0, L, 0, , 109, 2, SANDY, 6 7 | AL, 18, 2012102306, , BEST, 0, 129N, 781W, 40, 998, TS, 34, NEQ, 70, 80, 0, 0, 1005, 240, 60, 50, 0, L, 0, , 44, 2, SANDY, 7 8 | AL, 18, 2012102312, , BEST, 0, 134N, 779W, 40, 995, TS, 34, NEQ, 100, 100, 0, 0, 1005, 240, 60, 55, 0, L, 0, , 21, 3, SANDY, 8 9 | AL, 18, 2012102318, , BEST, 0, 140N, 776W, 45, 993, TS, 34, NEQ, 100, 120, 0, 0, 1005, 240, 60, 55, 0, L, 0, , 26, 3, SANDY, 9 10 | AL, 18, 2012102400, , BEST, 0, 147N, 773W, 55, 990, TS, 34, NEQ, 100, 150, 40, 40, 1007, 300, 60, 60, 0, L, 0, , 23, 4, SANDY, 10 11 | AL, 18, 2012102400, , BEST, 0, 147N, 773W, 55, 990, TS, 50, NEQ, 0, 70, 0, 0, 1007, 300, 60, 60, 0, L, 0, , 23, 4, SANDY, 10 12 | AL, 18, 2012102406, , BEST, 0, 156N, 771W, 60, 987, TS, 34, NEQ, 100, 150, 50, 50, 1007, 300, 45, 65, 0, L, 0, , 12, 5, SANDY, 11 13 | AL, 18, 2012102406, , BEST, 0, 156N, 771W, 60, 987, TS, 50, NEQ, 50, 70, 20, 20, 1007, 300, 45, 65, 0, L, 0, , 12, 5, SANDY, 11 14 | AL, 18, 2012102412, , BEST, 0, 166N, 769W, 65, 981, HU, 34, NEQ, 120, 160, 70, 70, 1006, 285, 40, 75, 0, L, 0, , 11, 5, SANDY, 12 15 | AL, 18, 2012102412, , BEST, 0, 166N, 769W, 65, 981, HU, 50, NEQ, 50, 60, 40, 30, 1006, 285, 40, 75, 0, L, 0, , 11, 5, SANDY, 12 16 | AL, 18, 2012102412, , BEST, 0, 166N, 769W, 65, 981, HU, 64, NEQ, 20, 20, 0, 0, 1006, 285, 40, 75, 0, L, 0, , 11, 5, SANDY, 12 17 | AL, 18, 2012102418, , BEST, 0, 177N, 767W, 75, 972, HU, 34, NEQ, 150, 180, 70, 70, 1005, 290, 25, 85, 0, L, 0, , 10, 6, SANDY, 13 18 | AL, 18, 2012102418, , BEST, 0, 177N, 767W, 75, 972, HU, 50, NEQ, 50, 60, 40, 40, 1005, 290, 25, 85, 0, L, 0, , 10, 6, SANDY, 13 19 | AL, 18, 2012102418, , BEST, 0, 177N, 767W, 75, 972, HU, 64, NEQ, 25, 30, 20, 25, 1005, 290, 25, 85, 0, L, 0, , 10, 6, SANDY, 13 20 | AL, 18, 2012102419, , BEST, 0, 179N, 766W, 75, 971, HU, 34, NEQ, 150, 180, 70, 70, 1013,,,,,,,, 26, 7,, 14 21 | AL, 18, 2012102419, , BEST, 0, 179N, 766W, 75, 971, HU, 50, NEQ, 50, 60, 40, 40, 1013,,,,,,,, 26, 7,, 14 22 | AL, 18, 2012102419, , BEST, 0, 179N, 766W, 75, 971, HU, 64, NEQ, 25, 30, 20, 25, 1013,,,,,,,, 26, 7,, 14 23 | AL, 18, 2012102500, , BEST, 0, 189N, 764W, 85, 964, HU, 34, NEQ, 180, 240, 70, 70, 1005, 300, 15, 100, 0, L, 0, , 11, 6, SANDY, 15 24 | AL, 18, 2012102500, , BEST, 0, 189N, 764W, 85, 964, HU, 50, NEQ, 50, 60, 40, 40, 1005, 300, 15, 100, 0, L, 0, , 11, 6, SANDY, 15 25 | AL, 18, 2012102500, , BEST, 0, 189N, 764W, 85, 964, HU, 64, NEQ, 30, 30, 25, 25, 1005, 300, 15, 100, 0, L, 0, , 11, 6, SANDY, 15 26 | AL, 18, 2012102505, 25, BEST, 0, 200N, 760W, 100, 954, HU, 34, NEQ, 240, 240, 70, 120, 1013,,,,,,,, 19, 7,, 16 27 | AL, 18, 2012102505, 25, BEST, 0, 200N, 760W, 100, 954, HU, 50, NEQ, 50, 60, 40, 40, 1013,,,,,,,, 19, 7,, 16 28 | AL, 18, 2012102505, 25, BEST, 0, 200N, 760W, 100, 954, HU, 64, NEQ, 30, 30, 25, 25, 1013,,,,,,,, 19, 7,, 16 29 | AL, 18, 2012102506, , BEST, 0, 201N, 760W, 100, 954, HU, 34, NEQ, 240, 240, 70, 120, 1005, 300, 10, 115, 0, L, 0, , 0, 5, SANDY, 17 30 | AL, 18, 2012102506, , BEST, 0, 201N, 760W, 100, 954, HU, 50, NEQ, 50, 60, 40, 40, 1005, 300, 10, 115, 0, L, 0, , 0, 5, SANDY, 17 31 | AL, 18, 2012102506, , BEST, 0, 201N, 760W, 100, 954, HU, 64, NEQ, 25, 20, 20, 20, 1005, 300, 10, 115, 0, L, 0, , 0, 5, SANDY, 17 32 | AL, 18, 2012102509, , BEST, 0, 209N, 757W, 95, 960, HU, 34, NEQ, 240, 240, 70, 180, 1013,,,,,,,, 19, 9,, 18 33 | AL, 18, 2012102509, , BEST, 0, 209N, 757W, 95, 960, HU, 50, NEQ, 50, 60, 40, 40, 1013,,,,,,,, 19, 9,, 18 34 | AL, 18, 2012102509, , BEST, 0, 209N, 757W, 95, 960, HU, 64, NEQ, 25, 20, 20, 20, 1013,,,,,,,, 19, 9,, 18 35 | AL, 18, 2012102512, , BEST, 0, 217N, 755W, 95, 966, HU, 34, NEQ, 240, 240, 70, 240, 1005, 320, 20, 110, 0, L, 0, , 13, 8, SANDY, 19 36 | AL, 18, 2012102512, , BEST, 0, 217N, 755W, 95, 966, HU, 50, NEQ, 60, 60, 40, 50, 1005, 320, 20, 110, 0, L, 0, , 13, 8, SANDY, 19 37 | AL, 18, 2012102512, , BEST, 0, 217N, 755W, 95, 966, HU, 64, NEQ, 30, 30, 20, 20, 1005, 320, 20, 110, 0, L, 0, , 13, 8, SANDY, 19 38 | AL, 18, 2012102518, , BEST, 0, 233N, 753W, 90, 963, HU, 34, NEQ, 270, 270, 120, 270, 1005, 350, 20, 110, 0, L, 0, , 7, 8, SANDY, 20 39 | AL, 18, 2012102518, , BEST, 0, 233N, 753W, 90, 963, HU, 50, NEQ, 60, 60, 40, 50, 1005, 350, 20, 110, 0, L, 0, , 7, 8, SANDY, 20 40 | AL, 18, 2012102518, , BEST, 0, 233N, 753W, 90, 963, HU, 64, NEQ, 30, 30, 20, 20, 1005, 350, 20, 110, 0, L, 0, , 7, 8, SANDY, 20 41 | AL, 18, 2012102600, , BEST, 0, 248N, 759W, 75, 965, HU, 34, NEQ, 300, 300, 160, 270, 1007, 375, 20, 105, 0, L, 0, , 340, 8, SANDY, 21 42 | AL, 18, 2012102600, , BEST, 0, 248N, 759W, 75, 965, HU, 50, NEQ, 70, 60, 40, 60, 1007, 375, 20, 105, 0, L, 0, , 340, 8, SANDY, 21 43 | AL, 18, 2012102600, , BEST, 0, 248N, 759W, 75, 965, HU, 64, NEQ, 30, 30, 20, 30, 1007, 375, 20, 105, 0, L, 0, , 340, 8, SANDY, 21 44 | AL, 18, 2012102606, , BEST, 0, 257N, 764W, 70, 968, HU, 34, NEQ, 300, 300, 160, 240, 1006, 380, 30, 90, 0, L, 0, , 333, 5, SANDY, 22 45 | AL, 18, 2012102606, , BEST, 0, 257N, 764W, 70, 968, HU, 50, NEQ, 90, 70, 50, 70, 1006, 380, 30, 90, 0, L, 0, , 333, 5, SANDY, 22 46 | AL, 18, 2012102606, , BEST, 0, 257N, 764W, 70, 968, HU, 64, NEQ, 30, 20, 0, 60, 1006, 380, 30, 90, 0, L, 0, , 333, 5, SANDY, 22 47 | AL, 18, 2012102612, , BEST, 0, 264N, 769W, 65, 970, HU, 34, NEQ, 360, 240, 170, 240, 1008, 420, 70, 85, 0, L, 0, , 327, 4, SANDY, 23 48 | AL, 18, 2012102612, , BEST, 0, 264N, 769W, 65, 970, HU, 50, NEQ, 90, 80, 90, 120, 1008, 420, 70, 85, 0, L, 0, , 327, 4, SANDY, 23 49 | AL, 18, 2012102612, , BEST, 0, 264N, 769W, 65, 970, HU, 64, NEQ, 0, 0, 0, 90, 1008, 420, 70, 85, 0, L, 0, , 327, 4, SANDY, 23 50 | AL, 18, 2012102618, , BEST, 0, 270N, 772W, 65, 971, HU, 34, NEQ, 400, 210, 170, 240, 1008, 420, 90, 80, 0, L, 0, , 336, 3, SANDY, 24 51 | AL, 18, 2012102618, , BEST, 0, 270N, 772W, 65, 971, HU, 50, NEQ, 60, 70, 90, 140, 1008, 420, 90, 80, 0, L, 0, , 336, 3, SANDY, 24 52 | AL, 18, 2012102618, , BEST, 0, 270N, 772W, 65, 971, HU, 64, NEQ, 0, 0, 0, 90, 1008, 420, 90, 80, 0, L, 0, , 336, 3, SANDY, 24 53 | AL, 18, 2012102700, , BEST, 0, 275N, 771W, 60, 969, TS, 34, NEQ, 450, 210, 180, 270, 1008, 450, 60, 80, 0, L, 0, , 10, 3, SANDY, 25 54 | AL, 18, 2012102700, , BEST, 0, 275N, 771W, 60, 969, TS, 50, NEQ, 0, 0, 120, 160, 1008, 450, 60, 80, 0, L, 0, , 10, 3, SANDY, 25 55 | AL, 18, 2012102706, , BEST, 0, 281N, 769W, 60, 968, TS, 34, NEQ, 450, 260, 180, 280, 1008, 460, 70, 75, 0, L, 0, , 16, 3, SANDY, 26 56 | AL, 18, 2012102706, , BEST, 0, 281N, 769W, 60, 968, TS, 50, NEQ, 0, 0, 120, 160, 1008, 460, 70, 75, 0, L, 0, , 16, 3, SANDY, 26 57 | AL, 18, 2012102712, , BEST, 0, 288N, 765W, 70, 956, HU, 34, NEQ, 450, 300, 210, 280, 1008, 460, 75, 80, 0, L, 0, , 27, 4, SANDY, 27 58 | AL, 18, 2012102712, , BEST, 0, 288N, 765W, 70, 956, HU, 50, NEQ, 30, 120, 160, 200, 1008, 460, 75, 80, 0, L, 0, , 27, 4, SANDY, 27 59 | AL, 18, 2012102712, , BEST, 0, 288N, 765W, 70, 956, HU, 64, NEQ, 0, 0, 120, 120, 1008, 460, 75, 80, 0, L, 0, , 27, 4, SANDY, 27 60 | AL, 18, 2012102718, , BEST, 0, 297N, 756W, 70, 960, HU, 34, NEQ, 450, 300, 240, 280, 1006, 480, 75, 80, 0, L, 0, , 41, 6, SANDY, 28 61 | AL, 18, 2012102718, , BEST, 0, 297N, 756W, 70, 960, HU, 50, NEQ, 30, 150, 180, 200, 1006, 480, 75, 80, 0, L, 0, , 41, 6, SANDY, 28 62 | AL, 18, 2012102718, , BEST, 0, 297N, 756W, 70, 960, HU, 64, NEQ, 0, 0, 150, 180, 1006, 480, 75, 80, 0, L, 0, , 41, 6, SANDY, 28 63 | AL, 18, 2012102800, , BEST, 0, 305N, 747W, 65, 960, HU, 34, NEQ, 480, 300, 300, 280, 1006, 480, 90, 80, 0, L, 0, , 44, 6, SANDY, 29 64 | AL, 18, 2012102800, , BEST, 0, 305N, 747W, 65, 960, HU, 50, NEQ, 30, 180, 180, 210, 1006, 480, 90, 80, 0, L, 0, , 44, 6, SANDY, 29 65 | AL, 18, 2012102800, , BEST, 0, 305N, 747W, 65, 960, HU, 64, NEQ, 0, 0, 150, 180, 1006, 480, 90, 80, 0, L, 0, , 44, 6, SANDY, 29 66 | AL, 18, 2012102806, , BEST, 0, 313N, 739W, 65, 959, HU, 34, NEQ, 450, 300, 300, 270, 1006, 480, 90, 80, 0, L, 0, , 41, 5, SANDY, 30 67 | AL, 18, 2012102806, , BEST, 0, 313N, 739W, 65, 959, HU, 50, NEQ, 0, 180, 180, 210, 1006, 480, 90, 80, 0, L, 0, , 41, 5, SANDY, 30 68 | AL, 18, 2012102806, , BEST, 0, 313N, 739W, 65, 959, HU, 64, NEQ, 0, 0, 150, 180, 1006, 480, 90, 80, 0, L, 0, , 41, 5, SANDY, 30 69 | AL, 18, 2012102812, , BEST, 0, 320N, 730W, 65, 954, HU, 34, NEQ, 450, 300, 300, 270, 1006, 480, 100, 80, 0, L, 0, , 47, 5, SANDY, 31 70 | AL, 18, 2012102812, , BEST, 0, 320N, 730W, 65, 954, HU, 50, NEQ, 0, 150, 200, 210, 1006, 480, 100, 80, 0, L, 0, , 47, 5, SANDY, 31 71 | AL, 18, 2012102812, , BEST, 0, 320N, 730W, 65, 954, HU, 64, NEQ, 0, 0, 150, 180, 1006, 480, 100, 80, 0, L, 0, , 47, 5, SANDY, 31 72 | AL, 18, 2012102818, , BEST, 0, 328N, 720W, 65, 952, HU, 34, NEQ, 450, 300, 350, 270, 1006, 500, 120, 80, 0, L, 0, , 46, 6, SANDY, 32 73 | AL, 18, 2012102818, , BEST, 0, 328N, 720W, 65, 952, HU, 50, NEQ, 0, 150, 200, 210, 1006, 500, 120, 80, 0, L, 0, , 46, 6, SANDY, 32 74 | AL, 18, 2012102818, , BEST, 0, 328N, 720W, 65, 952, HU, 64, NEQ, 0, 0, 150, 180, 1006, 500, 120, 80, 0, L, 0, , 46, 6, SANDY, 32 75 | AL, 18, 2012102900, , BEST, 0, 339N, 710W, 70, 950, HU, 34, NEQ, 450, 300, 400, 270, 1004, 500, 120, 80, 0, L, 0, , 37, 7, SANDY, 33 76 | AL, 18, 2012102900, , BEST, 0, 339N, 710W, 70, 950, HU, 50, NEQ, 150, 150, 200, 200, 1004, 500, 120, 80, 0, L, 0, , 37, 7, SANDY, 33 77 | AL, 18, 2012102900, , BEST, 0, 339N, 710W, 70, 950, HU, 64, NEQ, 0, 0, 150, 0, 1004, 500, 120, 80, 0, L, 0, , 37, 7, SANDY, 33 78 | AL, 18, 2012102906, , BEST, 0, 353N, 705W, 80, 947, HU, 34, NEQ, 420, 360, 450, 270, 1004, 500, 100, 90, 0, L, 0, , 16, 7, SANDY, 34 79 | AL, 18, 2012102906, , BEST, 0, 353N, 705W, 80, 947, HU, 50, NEQ, 150, 150, 200, 180, 1004, 500, 100, 90, 0, L, 0, , 16, 7, SANDY, 34 80 | AL, 18, 2012102906, , BEST, 0, 353N, 705W, 80, 947, HU, 64, NEQ, 0, 0, 150, 0, 1004, 500, 100, 90, 0, L, 0, , 16, 7, SANDY, 34 81 | AL, 18, 2012102912, , BEST, 0, 369N, 710W, 85, 945, HU, 34, NEQ, 420, 420, 400, 270, 1004, 500, 110, 100, 0, L, 0, , 346, 8, SANDY, 35 82 | AL, 18, 2012102912, , BEST, 0, 369N, 710W, 85, 945, HU, 50, NEQ, 200, 150, 200, 180, 1004, 500, 110, 100, 0, L, 0, , 346, 8, SANDY, 35 83 | AL, 18, 2012102912, , BEST, 0, 369N, 710W, 85, 945, HU, 64, NEQ, 0, 70, 120, 0, 1004, 500, 110, 100, 0, L, 0, , 346, 8, SANDY, 35 84 | AL, 18, 2012102918, , BEST, 0, 383N, 732W, 80, 940, HU, 34, NEQ, 420, 420, 400, 420, 1004, 500, 110, 100, 0, L, 0, , 309, 12, SANDY, 36 85 | AL, 18, 2012102918, , BEST, 0, 383N, 732W, 80, 940, HU, 50, NEQ, 220, 150, 200, 150, 1004, 500, 110, 100, 0, L, 0, , 309, 12, SANDY, 36 86 | AL, 18, 2012102918, , BEST, 0, 383N, 732W, 80, 940, HU, 64, NEQ, 180, 80, 120, 0, 1004, 500, 110, 100, 0, L, 0, , 309, 12, SANDY, 36 87 | AL, 18, 2012102921, , BEST, 0, 388N, 740W, 75, 943, EX, 34, NEQ, 420, 420, 400, 420, 1013,,,,,,,, 309, 8,, 37 88 | AL, 18, 2012102921, , BEST, 0, 388N, 740W, 75, 943, EX, 50, NEQ, 220, 150, 200, 150, 1013,,,,,,,, 309, 8,, 37 89 | AL, 18, 2012102921, , BEST, 0, 388N, 740W, 75, 943, EX, 64, NEQ, 180, 80, 120, 0, 1013,,,,,,,, 309, 8,, 37 90 | AL, 18, 2012102923, 30, BEST, 0, 394N, 744W, 70, 945, EX, 34, NEQ, 460, 370, 400, 490, 1013,,,,,,,, 333, 8,, 38 91 | AL, 18, 2012102923, 30, BEST, 0, 394N, 744W, 70, 945, EX, 50, NEQ, 180, 150, 80, 50, 1013,,,,,,,, 333, 8,, 38 92 | AL, 18, 2012102923, 30, BEST, 0, 394N, 744W, 70, 945, EX, 64, NEQ, 70, 80, 60, 0, 1013,,,,,,,, 333, 8,, 38 93 | AL, 18, 2012103000, , BEST, 0, 395N, 745W, 70, 946, EX, 34, NEQ, 460, 370, 400, 490, 1006, 525, 80, 85, 0, L, 0, , 322, 8, SANDY, 39 94 | AL, 18, 2012103000, , BEST, 0, 395N, 745W, 70, 946, EX, 50, NEQ, 150, 150, 80, 50, 1006, 525, 80, 85, 0, L, 0, , 322, 8, SANDY, 39 95 | AL, 18, 2012103000, , BEST, 0, 395N, 745W, 70, 946, EX, 64, NEQ, 65, 0, 0, 0, 1006, 525, 80, 85, 0, L, 0, , 322, 8, SANDY, 39 96 | AL, 18, 2012103006, , BEST, 0, 399N, 762W, 55, 960, EX, 34, NEQ, 450, 400, 160, 530, 1006, 480, 80, 75, 0, L, 0, , 287, 7, SANDY, 40 97 | AL, 18, 2012103006, , BEST, 0, 399N, 762W, 55, 960, EX, 50, NEQ, 150, 150, 30, 30, 1006, 480, 80, 75, 0, L, 0, , 287, 7, SANDY, 40 98 | AL, 18, 2012103012, , BEST, 0, 401N, 778W, 50, 978, EX, 34, NEQ, 450, 490, 0, 500, 1006, 480, 30, 0, 0, L, 0, , 280, 6, SANDY, 41 99 | AL, 18, 2012103012, , BEST, 0, 401N, 778W, 50, 978, EX, 50, NEQ, 0, 0, 0, 260, 1006, 480, 30, 0, 0, L, 0, , 280, 6, SANDY, 41 100 | AL, 18, 2012103018, , BEST, 0, 404N, 789W, 40, 986, EX, 34, NEQ, 0, 530, 0, 430, 1006, 480, 30, 50, 0, L, 0, , 290, 5, SANDY, 42 101 | AL, 18, 2012103100, , BEST, 0, 407N, 798W, 35, 992, EX, 34, NEQ, 0, 0, 0, 410, 1013,,,,,,,, 294, 4,, 43 102 | AL, 18, 2012103106, , BEST, 0, 411N, 803W, 35, 993, EX, 34, NEQ, 0, 0, 0, 380, 1013,,,,,,,, 317, 3,, 44 103 | AL, 18, 2012103112, , BEST, 0, 415N, 807W, 30, 995, EX, 0, , 0, 0, 0, 0, 1013,,,,,,,, 323, 3,, 45 104 | --------------------------------------------------------------------------------