Skip to content

Commit

Permalink
feat: can calculate polar stereographic distortion for distances (#294)
Browse files Browse the repository at this point in the history
* feat: can calculate polar stereographic distortion for distances

docs: update links to CATS2008-v2023

* fix: dtype suggestions

* fix: append v currents in TPXO9 only if netcdf to address #295
  • Loading branch information
tsutterley authored Apr 4, 2024
1 parent b1c8e34 commit 24f03ff
Show file tree
Hide file tree
Showing 9 changed files with 133 additions and 93 deletions.
2 changes: 1 addition & 1 deletion doc/source/api_reference/spatial.rst
Original file line number Diff line number Diff line change
Expand Up @@ -84,4 +84,4 @@ General Methods

.. autofunction:: pyTMD.spatial._zhu_closed_form

.. autofunction:: pyTMD.spatial.scale_areas
.. autofunction:: pyTMD.spatial.scale_factors
4 changes: 2 additions & 2 deletions doc/source/getting_started/Getting-Started.rst
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,9 @@ Presently, the following models and their directories parameterized within ``pyT
- Circum-Antarctic Tidal Simulations [Padman2008]_

* CATS0201: ``<path_to_tide_models>/cats0201_tmd/``
* `CATS2008 <https://www.usap-dc.org/view/dataset/601235>`_: ``<path_to_tide_models>/CATS2008/``
* `CATS2008 <https://doi.org/10.15784/601235>`_: ``<path_to_tide_models>/CATS2008/``
* CATS2008_load: ``<path_to_tide_models>/CATS2008a_SPOTL_Load/``
* `CATS2008-v2023 <https://www.chadagreene.com/tide_data/CATS2008_v2023.nc.zip>`_: ``<path_to_tide_models>/CATS2008_v2023/``
* `CATS2008-v2023 <https://doi.org/10.15784/601772>`_: ``<path_to_tide_models>/CATS2008_v2023/``

- Arctic Ocean and Greenland Coast Tidal Simulations [Padman2004]_

Expand Down
12 changes: 6 additions & 6 deletions pyTMD/compute.py
Original file line number Diff line number Diff line change
Expand Up @@ -183,7 +183,7 @@ def tide_elevations(
DEFINITION_FILE: str | pathlib.Path | None = None,
EPSG: str | int = 3031,
EPOCH: list | tuple = (2000, 1, 1, 0, 0, 0),
TYPE: str or None = 'drift',
TYPE: str | None = 'drift',
TIME: str = 'UTC',
METHOD: str = 'spline',
EXTRAPOLATE: bool = False,
Expand Down Expand Up @@ -411,7 +411,7 @@ def tide_currents(
DEFINITION_FILE: str | pathlib.Path | None = None,
EPSG: str | int = 3031,
EPOCH: list | tuple = (2000, 1, 1, 0, 0, 0),
TYPE: str or None = 'drift',
TYPE: str | None = 'drift',
TIME: str = 'UTC',
METHOD: str = 'spline',
EXTRAPOLATE: bool = False,
Expand Down Expand Up @@ -627,7 +627,7 @@ def LPET_elevations(
x: np.ndarray, y: np.ndarray, delta_time: np.ndarray,
EPSG: str | int = 3031,
EPOCH: list | tuple = (2000, 1, 1, 0, 0, 0),
TYPE: str or None = 'drift',
TYPE: str | None = 'drift',
TIME: str = 'UTC',
**kwargs
):
Expand Down Expand Up @@ -732,7 +732,7 @@ def LPT_displacements(
h: float | np.ndarray = 0.0,
EPSG: str | int = 3031,
EPOCH: list | tuple = (2000, 1, 1, 0, 0, 0),
TYPE: str or None = 'drift',
TYPE: str | None = 'drift',
TIME: str = 'UTC',
ELLIPSOID: str = 'WGS84',
CONVENTION: str = '2018',
Expand Down Expand Up @@ -903,7 +903,7 @@ def OPT_displacements(
h: float | np.ndarray = 0.0,
EPSG: str | int = 3031,
EPOCH: list | tuple = (2000, 1, 1, 0, 0, 0),
TYPE: str or None = 'drift',
TYPE: str | None = 'drift',
TIME: str = 'UTC',
ELLIPSOID: str = 'WGS84',
CONVENTION: str = '2018',
Expand Down Expand Up @@ -1103,7 +1103,7 @@ def SET_displacements(
h: float | np.ndarray = 0.0,
EPSG: str | int = 3031,
EPOCH: list | tuple = (2000, 1, 1, 0, 0, 0),
TYPE: str or None = 'drift',
TYPE: str | None = 'drift',
TIME: str = 'UTC',
ELLIPSOID: str = 'WGS84',
TIDE_SYSTEM='tide_free',
Expand Down
6 changes: 3 additions & 3 deletions pyTMD/eop.py
Original file line number Diff line number Diff line change
Expand Up @@ -197,9 +197,9 @@ def pull_pole_coordinates(FILE: str, verbose: bool = False):

# PURPOSE: connects to servers and downloads finals files
def update_finals_file(
username: str or None = None,
password: str or None = None,
timeout: int or None = 20,
username: str | None = None,
password: str | None = None,
timeout: int | None = 20,
verbose: bool = False,
mode: oct = 0o775
):
Expand Down
2 changes: 1 addition & 1 deletion pyTMD/interpolate.py
Original file line number Diff line number Diff line change
Expand Up @@ -275,7 +275,7 @@ def extrapolate(
fill_value: float = None,
dtype: str | np.dtype = np.float64,
cutoff: int | float = np.inf,
EPSG: str or int = '4326',
EPSG: str | int = '4326',
**kwargs
):
"""
Expand Down
90 changes: 55 additions & 35 deletions pyTMD/io/model.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
#!/usr/bin/env python
u"""
model.py
Written by Tyler Sutterley (11/2023)
Written by Tyler Sutterley (04/2024)
Retrieves tide model parameters for named tide models and
from model definition files
UPDATE HISTORY:
Updated 04/2024: append v-components of velocity only to netcdf format
Updated 11/2023: revert TPXO9-atlas currents changes to separate dicts
Updated 09/2023: fix scale values for TPXO9-atlas currents
Updated 08/2023: changed ESR netCDF4 format to TMD3 format
Expand Down Expand Up @@ -726,12 +727,16 @@ def current(self, m: str):
'u_s2_tpxo9_atlas_30','u_k2_tpxo9_atlas_30',
'u_m4_tpxo9_atlas_30','u_ms4_tpxo9_atlas_30',
'u_mn4_tpxo9_atlas_30','u_2n2_tpxo9_atlas_30']
model_files['v'] = ['v_q1_tpxo9_atlas_30','v_o1_tpxo9_atlas_30',
'v_p1_tpxo9_atlas_30','v_k1_tpxo9_atlas_30',
'v_n2_tpxo9_atlas_30','v_m2_tpxo9_atlas_30',
'v_s2_tpxo9_atlas_30','v_k2_tpxo9_atlas_30',
'v_m4_tpxo9_atlas_30','v_ms4_tpxo9_atlas_30',
'v_mn4_tpxo9_atlas_30','v_2n2_tpxo9_atlas_30']
# add v-component if format is netcdf
if (self.format == 'netcdf'):
model_files['v'] = ['v_q1_tpxo9_atlas_30',
'v_o1_tpxo9_atlas_30','v_p1_tpxo9_atlas_30',
'v_k1_tpxo9_atlas_30','v_n2_tpxo9_atlas_30',
'v_m2_tpxo9_atlas_30','v_s2_tpxo9_atlas_30',
'v_k2_tpxo9_atlas_30','v_m4_tpxo9_atlas_30',
'v_ms4_tpxo9_atlas_30','v_mn4_tpxo9_atlas_30',
'v_2n2_tpxo9_atlas_30']
# build model file dictionary
self.model_file = {}
for key,val in model_files.items():
self.model_file[key] = self.pathfinder(val)
Expand All @@ -751,12 +756,16 @@ def current(self, m: str):
'u_s2_tpxo9_atlas_30_v2','u_k2_tpxo9_atlas_30_v2',
'u_m4_tpxo9_atlas_30_v2','u_ms4_tpxo9_atlas_30_v2',
'u_mn4_tpxo9_atlas_30_v2','u_2n2_tpxo9_atlas_30_v2']
model_files['v'] = ['v_q1_tpxo9_atlas_30_v2','v_o1_tpxo9_atlas_30_v2',
'v_p1_tpxo9_atlas_30_v2','v_k1_tpxo9_atlas_30_v2',
'v_n2_tpxo9_atlas_30_v2','v_m2_tpxo9_atlas_30_v2',
'v_s2_tpxo9_atlas_30_v2','v_k2_tpxo9_atlas_30_v2',
'v_m4_tpxo9_atlas_30_v2','v_ms4_tpxo9_atlas_30_v2',
'v_mn4_tpxo9_atlas_30_v2','v_2n2_tpxo9_atlas_30_v2']
# add v-component if format is netcdf
if (self.format == 'netcdf'):
model_files['v'] = ['v_q1_tpxo9_atlas_30_v2',
'v_o1_tpxo9_atlas_30_v2','v_p1_tpxo9_atlas_30_v2',
'v_k1_tpxo9_atlas_30_v2','v_n2_tpxo9_atlas_30_v2',
'v_m2_tpxo9_atlas_30_v2','v_s2_tpxo9_atlas_30_v2',
'v_k2_tpxo9_atlas_30_v2','v_m4_tpxo9_atlas_30_v2',
'v_ms4_tpxo9_atlas_30_v2','v_mn4_tpxo9_atlas_30_v2',
'v_2n2_tpxo9_atlas_30_v2']
# build model file dictionary
self.model_file = {}
for key,val in model_files.items():
self.model_file[key] = self.pathfinder(val)
Expand All @@ -776,13 +785,17 @@ def current(self, m: str):
'u_m4_tpxo9_atlas_30_v3','u_ms4_tpxo9_atlas_30_v3',
'u_mn4_tpxo9_atlas_30_v3','u_2n2_tpxo9_atlas_30_v3',
'u_mf_tpxo9_atlas_30_v3','u_mm_tpxo9_atlas_30_v3']
model_files['v'] = ['v_q1_tpxo9_atlas_30_v3','v_o1_tpxo9_atlas_30_v3',
'v_p1_tpxo9_atlas_30_v3','v_k1_tpxo9_atlas_30_v3',
'v_n2_tpxo9_atlas_30_v3','v_m2_tpxo9_atlas_30_v3',
'v_s2_tpxo9_atlas_30_v3','v_k2_tpxo9_atlas_30_v3',
'v_m4_tpxo9_atlas_30_v3','v_ms4_tpxo9_atlas_30_v3',
'v_mn4_tpxo9_atlas_30_v3','v_2n2_tpxo9_atlas_30_v3',
'v_mf_tpxo9_atlas_30_v3','v_mm_tpxo9_atlas_30_v3']
# add v-component if format is netcdf
if (self.format == 'netcdf'):
model_files['v'] = ['v_q1_tpxo9_atlas_30_v3',
'v_o1_tpxo9_atlas_30_v3','v_p1_tpxo9_atlas_30_v3',
'v_k1_tpxo9_atlas_30_v3','v_n2_tpxo9_atlas_30_v3',
'v_m2_tpxo9_atlas_30_v3','v_s2_tpxo9_atlas_30_v3',
'v_k2_tpxo9_atlas_30_v3','v_m4_tpxo9_atlas_30_v3',
'v_ms4_tpxo9_atlas_30_v3','v_mn4_tpxo9_atlas_30_v3',
'v_2n2_tpxo9_atlas_30_v3','v_mf_tpxo9_atlas_30_v3',
'v_mm_tpxo9_atlas_30_v3']
# build model file dictionary
self.model_file = {}
for key,val in model_files.items():
self.model_file[key] = self.pathfinder(val)
Expand All @@ -802,13 +815,17 @@ def current(self, m: str):
'u_m4_tpxo9_atlas_30_v4','u_ms4_tpxo9_atlas_30_v4',
'u_mn4_tpxo9_atlas_30_v4','u_2n2_tpxo9_atlas_30_v4',
'u_mf_tpxo9_atlas_30_v4','u_mm_tpxo9_atlas_30_v4']
model_files['v'] = ['v_q1_tpxo9_atlas_30_v4','v_o1_tpxo9_atlas_30_v4',
'v_p1_tpxo9_atlas_30_v4','v_k1_tpxo9_atlas_30_v4',
'v_n2_tpxo9_atlas_30_v4','v_m2_tpxo9_atlas_30_v4',
'v_s2_tpxo9_atlas_30_v4','v_k2_tpxo9_atlas_30_v4',
'v_m4_tpxo9_atlas_30_v4','v_ms4_tpxo9_atlas_30_v4',
'v_mn4_tpxo9_atlas_30_v4','v_2n2_tpxo9_atlas_30_v4',
'v_mf_tpxo9_atlas_30_v4','v_mm_tpxo9_atlas_30_v4']
# add v-component if format is netcdf
if (self.format == 'netcdf'):
model_files['v'] = ['v_q1_tpxo9_atlas_30_v4',
'v_o1_tpxo9_atlas_30_v4','v_p1_tpxo9_atlas_30_v4',
'v_k1_tpxo9_atlas_30_v4','v_n2_tpxo9_atlas_30_v4',
'v_m2_tpxo9_atlas_30_v4','v_s2_tpxo9_atlas_30_v4',
'v_k2_tpxo9_atlas_30_v4','v_m4_tpxo9_atlas_30_v4',
'v_ms4_tpxo9_atlas_30_v4','v_mn4_tpxo9_atlas_30_v4',
'v_2n2_tpxo9_atlas_30_v4','v_mf_tpxo9_atlas_30_v4',
'v_mm_tpxo9_atlas_30_v4']
# build model file dictionary
self.model_file = {}
for key,val in model_files.items():
self.model_file[key] = self.pathfinder(val)
Expand All @@ -829,14 +846,17 @@ def current(self, m: str):
'u_ms4_tpxo9_atlas_30_v5','u_mn4_tpxo9_atlas_30_v5',
'u_2n2_tpxo9_atlas_30_v5','u_mf_tpxo9_atlas_30_v5',
'u_mm_tpxo9_atlas_30_v5']
model_files['v'] = ['v_q1_tpxo9_atlas_30_v5','v_o1_tpxo9_atlas_30_v5',
'v_p1_tpxo9_atlas_30_v5','v_k1_tpxo9_atlas_30_v5',
'v_n2_tpxo9_atlas_30_v5','v_m2_tpxo9_atlas_30_v5',
'v_s1_tpxo9_atlas_30_v5','v_s2_tpxo9_atlas_30_v5',
'v_k2_tpxo9_atlas_30_v5','v_m4_tpxo9_atlas_30_v5',
'v_ms4_tpxo9_atlas_30_v5','v_mn4_tpxo9_atlas_30_v5',
'v_2n2_tpxo9_atlas_30_v5','v_mf_tpxo9_atlas_30_v5',
'v_mm_tpxo9_atlas_30_v5']
# add v-component if format is netcdf
if (self.format == 'netcdf'):
model_files['v'] = ['u_q1_tpxo9_atlas_30_v5',
'u_o1_tpxo9_atlas_30_v5','u_p1_tpxo9_atlas_30_v5',
'u_k1_tpxo9_atlas_30_v5','u_n2_tpxo9_atlas_30_v5',
'u_m2_tpxo9_atlas_30_v5','u_s1_tpxo9_atlas_30_v5',
'u_s2_tpxo9_atlas_30_v5','u_k2_tpxo9_atlas_30_v5',
'u_m4_tpxo9_atlas_30_v5','u_ms4_tpxo9_atlas_30_v5',
'u_mn4_tpxo9_atlas_30_v5','u_2n2_tpxo9_atlas_30_v5',
'u_mf_tpxo9_atlas_30_v5','u_mm_tpxo9_atlas_30_v5']
# build model file dictionary
self.model_file = {}
for key,val in model_files.items():
self.model_file[key] = self.pathfinder(val)
Expand Down
44 changes: 32 additions & 12 deletions pyTMD/spatial.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#!/usr/bin/env python
u"""
spatial.py
Written by Tyler Sutterley (10/2023)
Written by Tyler Sutterley (03/2024)
Utilities for reading, writing and operating on spatial data
Expand All @@ -22,6 +22,7 @@
crs.py: Coordinate Reference System (CRS) routines
UPDATE HISTORY:
Updated 03/2024: can calculate polar stereographic distortion for distances
Updated 02/2024: changed class name for ellipsoid parameters to datum
Updated 10/2023: can read from netCDF4 or HDF5 variable groups
apply no formatting to columns in ascii file output
Expand Down Expand Up @@ -78,6 +79,7 @@
import uuid
import logging
import pathlib
import warnings
import datetime
import numpy as np
import pyTMD.time
Expand Down Expand Up @@ -791,7 +793,8 @@ def _grid_netCDF4(fileID, output: dict, attributes: dict, **kwargs):
crs = ['crs', 'crs_wkt', 'crs_proj4', 'projection']
fields = sorted(set(output.keys()) - set(dimensions) - set(crs))
# Defining the NetCDF dimensions
ny, nx, nt = output[fields[0]].shape
reference_fields = [v for v in fields if output[v].ndim == 3]
ny, nx, nt = output[reference_fields[0]].shape
fileID.createDimension('y', ny)
fileID.createDimension('x', nx)
fileID.createDimension('time', nt)
Expand Down Expand Up @@ -840,7 +843,8 @@ def _time_series_netCDF4(fileID, output: dict, attributes: dict, **kwargs):
crs = ['crs', 'crs_wkt', 'crs_proj4', 'projection']
fields = sorted(set(output.keys()) - set(dimensions) - set(crs))
# Defining the NetCDF dimensions
nstation, nt = output[fields[0]].shape
reference_fields = [v for v in fields if output[v].ndim == 2]
nstation, nt = output[reference_fields[0]].shape
fileID.createDimension('station', nstation)
fileID.createDimension('time', nt)
# defining the NetCDF variables
Expand Down Expand Up @@ -1629,39 +1633,51 @@ def _zhu_closed_form(
# return latitude, longitude and height
return (lon, lat, h)

def scale_areas(
def scale_areas(*args, **kwargs):
warnings.warn("Deprecated. Please use pyTMD.spatial.scale_factors instead",
DeprecationWarning)
return scale_factors(*args, **kwargs)

def scale_factors(
lat: np.ndarray,
flat: float = _wgs84.flat,
ref: float = 70.0
reference_latitude: float = 70.0,
metric: str = 'area'
):
"""
Calculates area scaling factors for a polar stereographic projection
including special case of at the exact pole [1]_ [2]_
Calculates scaling factors to account for polar stereographic
distortion including special case of at the exact pole [1]_ [2]_
Parameters
----------
lat: np.ndarray
latitude (degrees north)
flat: float, default 1.0/298.257223563
ellipsoidal flattening
ref: float, default 70.0
reference_latitude: float, default 70.0
reference latitude (true scale latitude)
metric: str, default 'area'
metric to calculate scaling factors
- ``'distance'``: scale factors for distance
- ``'area'``: scale factors for area
Returns
-------
scale: np.ndarray
area scaling factors at input latitudes
scaling factors at input latitudes
References
----------
.. [1] J. P. Snyder, *Map Projections used by the U.S. Geological Survey*,
Geological Survey Bulletin 1532, U.S. Government Printing Office, (1982).
.. [2] JPL Technical Memorandum 3349-85-101
"""
assert metric.lower() in ['distance', 'area'], 'Unknown metric'
# convert latitude from degrees to positive radians
theta = np.abs(lat)*np.pi/180.0
# convert reference latitude from degrees to positive radians
theta_ref = np.abs(ref)*np.pi/180.0
theta_ref = np.abs(reference_latitude)*np.pi/180.0
# square of the eccentricity of the ellipsoid
# ecc2 = (1-b**2/a**2) = 2.0*flat - flat^2
ecc2 = 2.0*flat - flat**2
Expand All @@ -1678,6 +1694,10 @@ def scale_areas(
# distance scaling
k = (mref/m)*(t/tref)
kp = 0.5*mref*np.sqrt(((1.0+ecc)**(1.0+ecc))*((1.0-ecc)**(1.0-ecc)))/tref
# area scaling
scale = np.where(np.isclose(theta, np.pi/2.0), 1.0/(kp**2), 1.0/(k**2))
if (metric.lower() == 'distance'):
# distance scaling
scale = np.where(np.isclose(theta, np.pi/2.0), 1.0/kp, 1.0/k)
elif (metric.lower() == 'area'):
# area scaling
scale = np.where(np.isclose(theta, np.pi/2.0), 1.0/(kp**2), 1.0/(k**2))
return scale
2 changes: 1 addition & 1 deletion test/model_TPXO9-atlas-v5_currents.def
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
format netcdf
name TPXO9-atlas-v5
model_file TPXO9_atlas_v5/u_2n2_tpxo9_atlas_30_v5.nc,TPXO9_atlas_v5/u_k1_tpxo9_atlas_30_v5.nc,TPXO9_atlas_v5/u_k2_tpxo9_atlas_30_v5.nc,TPXO9_atlas_v5/u_m2_tpxo9_atlas_30_v5.nc,TPXO9_atlas_v5/u_m4_tpxo9_atlas_30_v5.nc,TPXO9_atlas_v5/u_mf_tpxo9_atlas_30_v5.nc,TPXO9_atlas_v5/u_mm_tpxo9_atlas_30_v5.nc,TPXO9_atlas_v5/u_mn4_tpxo9_atlas_30_v5.nc,TPXO9_atlas_v5/u_ms4_tpxo9_atlas_30_v5.nc,TPXO9_atlas_v5/u_n2_tpxo9_atlas_30_v5.nc,TPXO9_atlas_v5/u_o1_tpxo9_atlas_30_v5.nc,TPXO9_atlas_v5/u_p1_tpxo9_atlas_30_v5.nc,TPXO9_atlas_v5/u_q1_tpxo9_atlas_30_v5.nc,TPXO9_atlas_v5/u_s1_tpxo9_atlas_30_v5.nc,TPXO9_atlas_v5/u_s2_tpxo9_atlas_30_v5.nc;TPXO9_atlas_v5/v_2n2_tpxo9_atlas_30_v5.nc,TPXO9_atlas_v5/v_k1_tpxo9_atlas_30_v5.nc,TPXO9_atlas_v5/v_k2_tpxo9_atlas_30_v5.nc,TPXO9_atlas_v5/v_m2_tpxo9_atlas_30_v5.nc,TPXO9_atlas_v5/v_m4_tpxo9_atlas_30_v5.nc,TPXO9_atlas_v5/v_mf_tpxo9_atlas_30_v5.nc,TPXO9_atlas_v5/v_mm_tpxo9_atlas_30_v5.nc,TPXO9_atlas_v5/v_mn4_tpxo9_atlas_30_v5.nc,TPXO9_atlas_v5/v_ms4_tpxo9_atlas_30_v5.nc,TPXO9_atlas_v5/v_n2_tpxo9_atlas_30_v5.nc,TPXO9_atlas_v5/v_o1_tpxo9_atlas_30_v5.nc,TPXO9_atlas_v5/v_p1_tpxo9_atlas_30_v5.nc,TPXO9_atlas_v5/v_q1_tpxo9_atlas_30_v5.nc,TPXO9_atlas_v5/v_s1_tpxo9_atlas_30_v5.nc,TPXO9_atlas_v5/v_s2_tpxo9_atlas_30_v5.nc
model_file TPXO9_atlas_v5/u_2n2_tpxo9_atlas_30_v5.nc,TPXO9_atlas_v5/u_k1_tpxo9_atlas_30_v5.nc,TPXO9_atlas_v5/u_k2_tpxo9_atlas_30_v5.nc,TPXO9_atlas_v5/u_m2_tpxo9_atlas_30_v5.nc,TPXO9_atlas_v5/u_m4_tpxo9_atlas_30_v5.nc,TPXO9_atlas_v5/u_mf_tpxo9_atlas_30_v5.nc,TPXO9_atlas_v5/u_mm_tpxo9_atlas_30_v5.nc,TPXO9_atlas_v5/u_mn4_tpxo9_atlas_30_v5.nc,TPXO9_atlas_v5/u_ms4_tpxo9_atlas_30_v5.nc,TPXO9_atlas_v5/u_n2_tpxo9_atlas_30_v5.nc,TPXO9_atlas_v5/u_o1_tpxo9_atlas_30_v5.nc,TPXO9_atlas_v5/u_p1_tpxo9_atlas_30_v5.nc,TPXO9_atlas_v5/u_q1_tpxo9_atlas_30_v5.nc,TPXO9_atlas_v5/u_s1_tpxo9_atlas_30_v5.nc,TPXO9_atlas_v5/u_s2_tpxo9_atlas_30_v5.nc;TPXO9_atlas_v5/u_2n2_tpxo9_atlas_30_v5.nc,TPXO9_atlas_v5/u_k1_tpxo9_atlas_30_v5.nc,TPXO9_atlas_v5/u_k2_tpxo9_atlas_30_v5.nc,TPXO9_atlas_v5/u_m2_tpxo9_atlas_30_v5.nc,TPXO9_atlas_v5/u_m4_tpxo9_atlas_30_v5.nc,TPXO9_atlas_v5/u_mf_tpxo9_atlas_30_v5.nc,TPXO9_atlas_v5/u_mm_tpxo9_atlas_30_v5.nc,TPXO9_atlas_v5/u_mn4_tpxo9_atlas_30_v5.nc,TPXO9_atlas_v5/u_ms4_tpxo9_atlas_30_v5.nc,TPXO9_atlas_v5/u_n2_tpxo9_atlas_30_v5.nc,TPXO9_atlas_v5/u_o1_tpxo9_atlas_30_v5.nc,TPXO9_atlas_v5/u_p1_tpxo9_atlas_30_v5.nc,TPXO9_atlas_v5/u_q1_tpxo9_atlas_30_v5.nc,TPXO9_atlas_v5/u_s1_tpxo9_atlas_30_v5.nc,TPXO9_atlas_v5/u_s2_tpxo9_atlas_30_v5.nc
grid_file TPXO9_atlas_v5/grid_tpxo9_atlas_30_v5.nc
type u,v
version v5
Expand Down
Loading

0 comments on commit 24f03ff

Please sign in to comment.