From 1b4734ad8d2dfb2a92a22a85c7a95b3503595c33 Mon Sep 17 00:00:00 2001 From: <> Date: Sat, 21 Dec 2024 06:37:05 +0000 Subject: [PATCH] Deployed 7780f80 with MkDocs version: 1.6.1 --- .nojekyll | 0 404.html | 797 ++ api/index.html | 8859 +++++++++++++++++ assets/_mkdocstrings.css | 143 + assets/eo-tides-abstract.gif | Bin 0 -> 2178475 bytes assets/eo-tides-logo-128.png | Bin 0 -> 12783 bytes assets/eo-tides-logo-256.png | Bin 0 -> 30434 bytes assets/eo-tides-logo.gif | Bin 0 -> 497756 bytes assets/eo-tides-logo.png | Bin 0 -> 60833 bytes assets/eot20_download.jpg | Bin 0 -> 51569 bytes assets/fes_ftp.jpg | Bin 0 -> 50653 bytes assets/fes_myproducts.jpg | Bin 0 -> 11458 bytes assets/fes_productselection.jpg | Bin 0 -> 91892 bytes assets/fes_subscriptions.jpg | Bin 0 -> 28812 bytes assets/got_download.jpg | Bin 0 -> 44023 bytes assets/images/favicon.png | Bin 0 -> 1870 bytes assets/javascripts/bundle.83f73b43.min.js | 16 + assets/javascripts/bundle.83f73b43.min.js.map | 7 + assets/javascripts/lunr/min/lunr.ar.min.js | 1 + assets/javascripts/lunr/min/lunr.da.min.js | 18 + assets/javascripts/lunr/min/lunr.de.min.js | 18 + assets/javascripts/lunr/min/lunr.du.min.js | 18 + assets/javascripts/lunr/min/lunr.el.min.js | 1 + assets/javascripts/lunr/min/lunr.es.min.js | 18 + assets/javascripts/lunr/min/lunr.fi.min.js | 18 + assets/javascripts/lunr/min/lunr.fr.min.js | 18 + assets/javascripts/lunr/min/lunr.he.min.js | 1 + assets/javascripts/lunr/min/lunr.hi.min.js | 1 + assets/javascripts/lunr/min/lunr.hu.min.js | 18 + assets/javascripts/lunr/min/lunr.hy.min.js | 1 + assets/javascripts/lunr/min/lunr.it.min.js | 18 + assets/javascripts/lunr/min/lunr.ja.min.js | 1 + assets/javascripts/lunr/min/lunr.jp.min.js | 1 + assets/javascripts/lunr/min/lunr.kn.min.js | 1 + assets/javascripts/lunr/min/lunr.ko.min.js | 1 + assets/javascripts/lunr/min/lunr.multi.min.js | 1 + assets/javascripts/lunr/min/lunr.nl.min.js | 18 + assets/javascripts/lunr/min/lunr.no.min.js | 18 + assets/javascripts/lunr/min/lunr.pt.min.js | 18 + assets/javascripts/lunr/min/lunr.ro.min.js | 18 + assets/javascripts/lunr/min/lunr.ru.min.js | 18 + assets/javascripts/lunr/min/lunr.sa.min.js | 1 + .../lunr/min/lunr.stemmer.support.min.js | 1 + assets/javascripts/lunr/min/lunr.sv.min.js | 18 + assets/javascripts/lunr/min/lunr.ta.min.js | 1 + assets/javascripts/lunr/min/lunr.te.min.js | 1 + assets/javascripts/lunr/min/lunr.th.min.js | 1 + assets/javascripts/lunr/min/lunr.tr.min.js | 18 + assets/javascripts/lunr/min/lunr.vi.min.js | 1 + assets/javascripts/lunr/min/lunr.zh.min.js | 1 + assets/javascripts/lunr/tinyseg.js | 206 + assets/javascripts/lunr/wordcut.js | 6708 +++++++++++++ .../workers/search.6ce7567c.min.js | 42 + .../workers/search.6ce7567c.min.js.map | 7 + assets/stylesheets/main.0253249f.min.css | 1 + assets/stylesheets/main.0253249f.min.css.map | 1 + assets/stylesheets/palette.06af60db.min.css | 1 + .../stylesheets/palette.06af60db.min.css.map | 1 + assets/tide_models_clipped.jpg | Bin 0 -> 87169 bytes assets/tpxo_download.jpg | Bin 0 -> 64431 bytes changelog/index.html | 1361 +++ credits/index.html | 967 ++ index.html | 1013 ++ install/index.html | 1025 ++ migration/index.html | 1195 +++ notebooks/Case_study_intertidal/index.html | 3269 ++++++ notebooks/Model_tides/index.html | 3499 +++++++ notebooks/Satellite_data/index.html | 2831 ++++++ notebooks/Tide_statistics/index.html | 2635 +++++ notebooks/Validating_tides/index.html | 2530 +++++ objects.inv | Bin 0 -> 1083 bytes search/search_index.json | 1 + setup/index.html | 1493 +++ sitemap.xml | 51 + sitemap.xml.gz | Bin 0 -> 319 bytes stylesheets/extra.css | 26 + 76 files changed, 38972 insertions(+) create mode 100644 .nojekyll create mode 100644 404.html create mode 100644 api/index.html create mode 100644 assets/_mkdocstrings.css create mode 100644 assets/eo-tides-abstract.gif create mode 100644 assets/eo-tides-logo-128.png create mode 100644 assets/eo-tides-logo-256.png create mode 100644 assets/eo-tides-logo.gif create mode 100644 assets/eo-tides-logo.png create mode 100644 assets/eot20_download.jpg create mode 100644 assets/fes_ftp.jpg create mode 100644 assets/fes_myproducts.jpg create mode 100644 assets/fes_productselection.jpg create mode 100644 assets/fes_subscriptions.jpg create mode 100644 assets/got_download.jpg create mode 100644 assets/images/favicon.png create mode 100644 assets/javascripts/bundle.83f73b43.min.js create mode 100644 assets/javascripts/bundle.83f73b43.min.js.map create mode 100644 assets/javascripts/lunr/min/lunr.ar.min.js create mode 100644 assets/javascripts/lunr/min/lunr.da.min.js create mode 100644 assets/javascripts/lunr/min/lunr.de.min.js create mode 100644 assets/javascripts/lunr/min/lunr.du.min.js create mode 100644 assets/javascripts/lunr/min/lunr.el.min.js create mode 100644 assets/javascripts/lunr/min/lunr.es.min.js create mode 100644 assets/javascripts/lunr/min/lunr.fi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.fr.min.js create mode 100644 assets/javascripts/lunr/min/lunr.he.min.js create mode 100644 assets/javascripts/lunr/min/lunr.hi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.hu.min.js create mode 100644 assets/javascripts/lunr/min/lunr.hy.min.js create mode 100644 assets/javascripts/lunr/min/lunr.it.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ja.min.js create mode 100644 assets/javascripts/lunr/min/lunr.jp.min.js create mode 100644 assets/javascripts/lunr/min/lunr.kn.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ko.min.js create mode 100644 assets/javascripts/lunr/min/lunr.multi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.nl.min.js create mode 100644 assets/javascripts/lunr/min/lunr.no.min.js create mode 100644 assets/javascripts/lunr/min/lunr.pt.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ro.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ru.min.js create mode 100644 assets/javascripts/lunr/min/lunr.sa.min.js create mode 100644 assets/javascripts/lunr/min/lunr.stemmer.support.min.js create mode 100644 assets/javascripts/lunr/min/lunr.sv.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ta.min.js create mode 100644 assets/javascripts/lunr/min/lunr.te.min.js create mode 100644 assets/javascripts/lunr/min/lunr.th.min.js create mode 100644 assets/javascripts/lunr/min/lunr.tr.min.js create mode 100644 assets/javascripts/lunr/min/lunr.vi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.zh.min.js create mode 100644 assets/javascripts/lunr/tinyseg.js create mode 100644 assets/javascripts/lunr/wordcut.js create mode 100644 assets/javascripts/workers/search.6ce7567c.min.js create mode 100644 assets/javascripts/workers/search.6ce7567c.min.js.map create mode 100644 assets/stylesheets/main.0253249f.min.css create mode 100644 assets/stylesheets/main.0253249f.min.css.map create mode 100644 assets/stylesheets/palette.06af60db.min.css create mode 100644 assets/stylesheets/palette.06af60db.min.css.map create mode 100644 assets/tide_models_clipped.jpg create mode 100644 assets/tpxo_download.jpg create mode 100644 changelog/index.html create mode 100644 credits/index.html create mode 100644 index.html create mode 100644 install/index.html create mode 100644 migration/index.html create mode 100644 notebooks/Case_study_intertidal/index.html create mode 100644 notebooks/Model_tides/index.html create mode 100644 notebooks/Satellite_data/index.html create mode 100644 notebooks/Tide_statistics/index.html create mode 100644 notebooks/Validating_tides/index.html create mode 100644 objects.inv create mode 100644 search/search_index.json create mode 100644 setup/index.html create mode 100644 sitemap.xml create mode 100644 sitemap.xml.gz create mode 100644 stylesheets/extra.css diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/404.html b/404.html new file mode 100644 index 0000000..5036759 --- /dev/null +++ b/404.html @@ -0,0 +1,797 @@ + + + +
+ + + + + + + + + + + + + + + + + + +
eo_tides.model
+
+
+¶Functions:
+Name | +Description | +
---|---|
ensemble_tides |
+
+
+
+ Combine multiple tide models into a single locally optimised + |
+
model_phases |
+
+
+
+ Model tide phases (low-flow, high-flow, high-ebb, low-ebb) + |
+
model_tides |
+
+
+
+ Model tide heights at multiple coordinates and/or timesteps + |
+
ensemble_tides
+
+
+¶ensemble_tides(
+ tide_df,
+ crs,
+ ensemble_models,
+ ensemble_func=None,
+ ensemble_top_n=3,
+ ranking_points="https://dea-public-data-dev.s3-ap-southeast-2.amazonaws.com/derivative/dea_intertidal/supplementary/rankings_ensemble_2017-2019.fgb",
+ ranking_valid_perc=0.02,
+ **idw_kwargs
+)
+
Combine multiple tide models into a single locally optimised +ensemble tide model using external model ranking data (e.g. +satellite altimetry or NDWI-tide correlations along the coastline) +to inform the selection of the best local models.
+This function performs the following steps:
+eo_tides.model.model_tides
Parameters:
+Name | +Type | +Description | +Default | +
---|---|---|---|
+ |
+
+ DataFrame
+ |
+
+
+
+ DataFrame produced by |
+ + required + | +
+ |
+
+ string
+ |
+
+
+
+ Coordinate reference system for the "x" and "y" coordinates in
+ |
+ + required + | +
+ |
+
+ list
+ |
+
+
+
+ A list of models to include in the ensemble modelling process.
+All values must exist as columns with the prefix "rank_" in
+ |
+ + required + | +
+ |
+
+ dict
+ |
+
+
+
+ By default, a simple ensemble model will be calculated by taking
+the mean of the |
+
+ None
+ |
+
+ |
+
+ int
+ |
+
+
+
+ If |
+
+ 3
+ |
+
+ |
+
+ str
+ |
+
+
+
+ Path to the file containing model ranking points. This dataset +should include columns containing rankings for each tide +model, named with the prefix "rank_". e.g. "rank_EOT20". +Low values should represent high rankings (e.g. 1 = top ranked). +The default value points to an example file covering Australia. + |
+
+ 'https://dea-public-data-dev.s3-ap-southeast-2.amazonaws.com/derivative/dea_intertidal/supplementary/rankings_ensemble_2017-2019.fgb'
+ |
+
+ |
+
+ float
+ |
+
+
+
+ Minimum percentage of valid data required to include a model +rank point in the analysis, as defined in a column named +"valid_perc". Defaults to 0.02. + |
+
+ 0.02
+ |
+
+ |
+ + | +
+
+
+ Optional keyword arguments to pass to the |
+
+ {}
+ |
+
Returns:
+Type | +Description | +
---|---|
+ DataFrame
+ |
+
+
+
+ DataFrame containing the ensemble model predictions, matching
+the format of the input |
+
eo_tides/model.py
203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 |
|
model_phases
+
+
+¶model_phases(
+ x,
+ y,
+ time,
+ model="EOT20",
+ directory=None,
+ time_offset="15 min",
+ return_tides=False,
+ **model_tides_kwargs
+)
+
Model tide phases (low-flow, high-flow, high-ebb, low-ebb) +at multiple coordinates and/or timesteps using using one +or more ocean tide models.
+Ebb and low phases are calculated by running the
+eo_tides.model.model_tides
function twice, once for
+the requested timesteps, and again after subtracting a
+small time offset (by default, 15 minutes). If tides
+increased over this period, they are assigned as "flow";
+if they decreased, they are assigned as "ebb".
+Tides are considered "high" if equal or greater than 0
+metres tide height, otherwise "low".
This function supports all parameters that are supported
+by model_tides
.
Parameters:
+Name | +Type | +Description | +Default | +
---|---|---|---|
+ |
+
+ float or list of float
+ |
+
+
+
+ One or more x and y coordinates used to define +the location at which to model tide phases. By default +these coordinates should be lat/lon; use "crs" if they +are in a custom coordinate reference system. + |
+ + required + | +
+ |
+
+ float or list of float
+ |
+
+
+
+ One or more x and y coordinates used to define +the location at which to model tide phases. By default +these coordinates should be lat/lon; use "crs" if they +are in a custom coordinate reference system. + |
+ + required + | +
+ |
+
+ DatetimeLike
+ |
+
+
+
+ Times at which to model tide phases (in UTC). Accepts
+any format that can be converted by |
+ + required + | +
+ |
+
+ str or list of str
+ |
+
+
+
+ The tide model (or list of models) to use to model tides.
+Defaults to "EOT20"; specify "all" to use all models available
+in |
+
+ 'EOT20'
+ |
+
+ |
+
+ str
+ |
+
+
+
+ The directory containing tide model data files. If no path is
+provided, this will default to the environment variable
+ |
+
+ None
+ |
+
+ |
+
+ str
+ |
+
+
+
+ The time offset/delta used to generate a time series of
+offset tide heights required for phase calculation. Defeaults
+to "15 min"; can be any string passed to |
+
+ '15 min'
+ |
+
+ |
+
+ bool
+ |
+
+
+
+ Whether to return intermediate modelled tide heights as a +"tide_height" column in the output dataframe. Defaults to False. + |
+
+ False
+ |
+
+ |
+ + | +
+
+
+ Optional parameters passed to the |
+
+ {}
+ |
+
Returns:
+Type | +Description | +
---|---|
+ DataFrame
+ |
+
+
+
+ A dataframe containing modelled tide phases. + |
+
eo_tides/model.py
694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 +706 +707 +708 +709 +710 +711 +712 +713 +714 +715 +716 +717 +718 +719 +720 +721 +722 +723 +724 +725 +726 +727 +728 +729 +730 +731 +732 +733 +734 +735 +736 +737 +738 +739 +740 +741 +742 +743 +744 +745 +746 +747 +748 +749 +750 +751 +752 +753 +754 +755 +756 +757 +758 +759 +760 +761 +762 +763 +764 +765 +766 +767 +768 +769 +770 +771 +772 +773 +774 +775 +776 +777 +778 +779 +780 +781 +782 +783 +784 +785 +786 +787 +788 +789 +790 +791 +792 +793 +794 +795 +796 +797 +798 +799 +800 +801 +802 +803 +804 +805 +806 +807 +808 +809 +810 +811 +812 +813 +814 +815 +816 +817 +818 +819 +820 +821 +822 +823 +824 +825 |
|
model_tides
+
+
+¶model_tides(
+ x,
+ y,
+ time,
+ model="EOT20",
+ directory=None,
+ crs="EPSG:4326",
+ mode="one-to-many",
+ output_format="long",
+ output_units="m",
+ method="linear",
+ extrapolate=True,
+ cutoff=None,
+ crop=True,
+ crop_buffer=5,
+ parallel=True,
+ parallel_splits="auto",
+ parallel_max=None,
+ ensemble_models=None,
+ **ensemble_kwargs
+)
+
Model tide heights at multiple coordinates and/or timesteps +using using one or more ocean tide models.
+This function is parallelised to improve performance, and
+supports all tidal models supported by pyTMD
, including:
This function requires access to tide model data files.
+These should be placed in a folder with subfolders matching
+the structure required by pyTMD
. For more details:
+https://geoscienceaustralia.github.io/eo-tides/setup/
+https://pytmd.readthedocs.io/en/latest/getting_started/Getting-Started.html#directories
This function is a modification of the pyTMD
package's
+pyTMD.compute.tide_elevations
function. For more info:
+https://pytmd.readthedocs.io/en/latest/api_reference/compute.html#pyTMD.compute.tide_elevations
Parameters:
+Name | +Type | +Description | +Default | +
---|---|---|---|
+ |
+
+ float or list of float
+ |
+
+
+
+ One or more x and y coordinates used to define +the location at which to model tides. By default these +coordinates should be lat/lon; use "crs" if they +are in a custom coordinate reference system. + |
+ + required + | +
+ |
+
+ float or list of float
+ |
+
+
+
+ One or more x and y coordinates used to define +the location at which to model tides. By default these +coordinates should be lat/lon; use "crs" if they +are in a custom coordinate reference system. + |
+ + required + | +
+ |
+
+ DatetimeLike
+ |
+
+
+
+ Times at which to model tide heights (in UTC). Accepts
+any format that can be converted by |
+ + required + | +
+ |
+
+ str or list of str
+ |
+
+
+
+ The tide model (or list of models) to use to model tides.
+Defaults to "EOT20"; specify "all" to use all models available
+in |
+
+ 'EOT20'
+ |
+
+ |
+
+ str
+ |
+
+
+
+ The directory containing tide model data files. If no path is
+provided, this will default to the environment variable
+ |
+
+ None
+ |
+
+ |
+
+ str
+ |
+
+
+
+ Input coordinate reference system for x and y coordinates. +Defaults to "EPSG:4326" (WGS84; degrees latitude, longitude). + |
+
+ 'EPSG:4326'
+ |
+
+ |
+
+ str
+ |
+
+
+
+ The analysis mode to use for tide modelling. Supports two options: +
|
+
+ 'one-to-many'
+ |
+
+ |
+
+ str
+ |
+
+
+
+ Whether to return the output dataframe in long format (with +results stacked vertically along "tide_model" and "tide_height" +columns), or wide format (with a column for each tide model). +Defaults to "long". + |
+
+ 'long'
+ |
+
+ |
+
+ str
+ |
+
+
+
+ Whether to return modelled tides in floating point metre units, +or integer centimetre units (i.e. scaled by 100) or integer +millimetre units (i.e. scaled by 1000. Returning outputs in +integer units can be useful for reducing memory usage. +Defaults to "m" for metres; set to "cm" for centimetres or "mm" +for millimetres. + |
+
+ 'm'
+ |
+
+ |
+
+ str
+ |
+
+
+
+ Method used to interpolate tidal constituents +from model files. Defaults to "linear"; options include: +
|
+
+ 'linear'
+ |
+
+ |
+
+ bool
+ |
+
+
+
+ Whether to extrapolate tides into x and y coordinates outside of +the valid tide modelling domain using nearest-neighbor. + |
+
+ True
+ |
+
+ |
+
+ float
+ |
+
+
+
+ Extrapolation cutoff in kilometers. The default is None, which +will extrapolate for all points regardless of distance from the +valid tide modelling domain. + |
+
+ None
+ |
+
+ |
+
+ bool
+ |
+
+
+
+ Whether to crop tide model constituent files on-the-fly to
+improve performance. Defaults to True; use |
+
+ True
+ |
+
+ |
+
+ int or float
+ |
+
+
+
+ The buffer distance in degrees used to crop tide model +constituent files around the modelling area. Defaults to 5, +which will crop constituents using a five degree buffer on either +side of the analysis extent. + |
+
+ 5
+ |
+
+ |
+
+ bool
+ |
+
+
+
+ Whether to parallelise tide modelling. If multiple tide models are
+requested, these will be run in parallel using |
+
+ True
+ |
+
+ |
+
+ str or int
+ |
+
+
+
+ Whether to split the input x and y coordinates into smaller, +evenly-sized chunks that are processed in parallel. This can +provide a large performance boost when processing large numbers +of coordinates. The default is "auto", which will automatically +attempt to determine optimal splits based on available CPUs, +the number of input points, and the number of models. + |
+
+ 'auto'
+ |
+
+ |
+
+ int
+ |
+
+
+
+ Maximum number of processes to run in parallel. The default of +None will automatically determine this from your available CPUs. + |
+
+ None
+ |
+
+ |
+
+ list of str
+ |
+
+
+
+ An optional list of models used to generate the ensemble tide
+model if "ensemble" tide modelling is requested. Defaults to
+ |
+
+ None
+ |
+
+ |
+ + | +
+
+
+ Keyword arguments used to customise the generation of optional
+ensemble tide models if "ensemble" modelling are requested.
+These are passed to the underlying |
+
+ {}
+ |
+
Returns:
+Type | +Description | +
---|---|
+ DataFrame
+ |
+
+
+
+ A dataframe containing modelled tide heights. + |
+
eo_tides/model.py
386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 |
|
eo_tides.eo
+
+
+¶Functions:
+Name | +Description | +
---|---|
pixel_tides |
+
+
+
+ Model tide heights for every pixel in a multi-dimensional + |
+
tag_tides |
+
+
+
+ Model tide heights for every timestep in a multi-dimensional + |
+
pixel_tides
+
+
+¶pixel_tides(
+ data,
+ time=None,
+ model="EOT20",
+ directory=None,
+ resample=True,
+ calculate_quantiles=None,
+ resolution=None,
+ buffer=None,
+ resample_method="bilinear",
+ dask_chunks=None,
+ dask_compute=True,
+ **model_tides_kwargs
+)
+
Model tide heights for every pixel in a multi-dimensional +dataset, using one or more ocean tide models.
+This function models tides into a low-resolution tide +modelling grid covering the spatial extent of the input +data (buffered to reduce potential edge effects). These +modelled tides can then be resampled back into the original +higher resolution dataset's extent and resolution to +produce a modelled tide height for every pixel through time.
+This function uses the parallelised model_tides
function
+under the hood. It supports all tidal models supported by
+pyTMD
, including:
This function requires access to tide model data files.
+These should be placed in a folder with subfolders matching
+the structure required by pyTMD
. For more details:
+https://geoscienceaustralia.github.io/eo-tides/setup/
+https://pytmd.readthedocs.io/en/latest/getting_started/Getting-Started.html#directories
Parameters:
+Name | +Type | +Description | +Default | +
---|---|---|---|
+ |
+
+ Dataset or DataArray or GeoBox
+ |
+
+
+
+ A multi-dimensional dataset or GeoBox pixel grid that will
+be used to define the spatial tide modelling grid. If |
+ + required + | +
+ |
+
+ DatetimeLike
+ |
+
+
+
+ By default, tides will be modelled using times from the
+"time" dimension of |
+
+ None
+ |
+
+ |
+
+ str or list of str
+ |
+
+
+
+ The tide model (or list of models) to use to model tides.
+If a list is provided, a new "tide_model" dimension will be
+added to the |
+
+ 'EOT20'
+ |
+
+ |
+
+ str
+ |
+
+
+
+ The directory containing tide model data files. If no path is
+provided, this will default to the environment variable
+ |
+
+ None
+ |
+
+ |
+
+ bool
+ |
+
+
+
+ Whether to resample low resolution tides back into |
+
+ True
+ |
+
+ |
+
+ tuple of float or numpy.ndarray
+ |
+
+
+
+ Rather than returning all individual tides, low-resolution tides
+can be first aggregated using a quantile calculation by passing in
+a tuple or array of quantiles to compute. For example, this could
+be used to calculate the min/max tide across all times:
+ |
+
+ None
+ |
+
+ |
+
+ float
+ |
+
+
+
+ The desired resolution of the low-resolution grid used for tide
+modelling. The default None will create a 5000 m resolution grid
+if |
+
+ None
+ |
+
+ |
+
+ float
+ |
+
+
+
+ The amount by which to buffer the higher resolution grid extent
+when creating the new low resolution grid. This buffering
+ensures that modelled tides are seamless across analysis
+boundaries. This buffer is eventually be clipped away when
+the low-resolution modelled tides are re-projected back to the
+original resolution and extent of |
+
+ None
+ |
+
+ |
+
+ str
+ |
+
+
+
+ If resampling is requested (see |
+
+ 'bilinear'
+ |
+
+ |
+
+ tuple of float
+ |
+
+
+
+ Can be used to configure custom Dask chunking for the final
+resampling step. By default, chunks will be automatically set
+to match y/x chunks from |
+
+ None
+ |
+
+ |
+
+ bool
+ |
+
+
+
+ Whether to compute results of the resampling step using Dask.
+If False, |
+
+ True
+ |
+
+ |
+ + | +
+
+
+ Optional parameters passed to the |
+
+ {}
+ |
+
Returns:
+Name | Type | +Description | +
---|---|---|
tides_da |
+ DataArray
+ |
+
+
+
+ A three-dimensional tide height array.
+If |
+
eo_tides/eo.py
282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 |
|
tag_tides
+
+
+¶tag_tides(
+ data,
+ time=None,
+ model="EOT20",
+ directory=None,
+ tidepost_lat=None,
+ tidepost_lon=None,
+ **model_tides_kwargs
+)
+
Model tide heights for every timestep in a multi-dimensional
+dataset, and return a new tide_height
array that can
+be used to "tag" each observation with tide heights.
The function models tides at the centroid of the dataset
+by default, but a custom tidal modelling location can
+be specified using tidepost_lat
and tidepost_lon
.
This function uses the parallelised model_tides
function
+under the hood. It supports all tidal models supported by
+pyTMD
, including:
Parameters:
+Name | +Type | +Description | +Default | +
---|---|---|---|
+ |
+
+ Dataset or DataArray or GeoBox
+ |
+
+
+
+ A multi-dimensional dataset or GeoBox pixel grid that will
+be used to define the tide modelling location. If |
+ + required + | +
+ |
+
+ DatetimeLike
+ |
+
+
+
+ By default, tides will be modelled using times from the
+"time" dimension of |
+
+ None
+ |
+
+ |
+
+ str or list of str
+ |
+
+
+
+ The tide model (or list of models) to use to model tides.
+If a list is provided, a new "tide_model" dimension will be
+added to the |
+
+ 'EOT20'
+ |
+
+ |
+
+ str
+ |
+
+
+
+ The directory containing tide model data files. If no path is
+provided, this will default to the environment variable
+ |
+
+ None
+ |
+
+ |
+
+ float
+ |
+
+
+
+ Optional coordinates used to model tides. The default is None, +which uses the centroid of the dataset as the tide modelling +location. + |
+
+ None
+ |
+
+ |
+
+ float
+ |
+
+
+
+ Optional coordinates used to model tides. The default is None, +which uses the centroid of the dataset as the tide modelling +location. + |
+
+ None
+ |
+
+ |
+ + | +
+
+
+ Optional parameters passed to the |
+
+ {}
+ |
+
Returns:
+Name | Type | +Description | +
---|---|---|
tides_da |
+ DataArray
+ |
+
+
+
+ A one-dimensional tide height array. This will contain either
+tide heights for every timestep in |
+
eo_tides/eo.py
164 +165 +166 +167 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +182 +183 +184 +185 +186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 |
|
eo_tides.stats
+
+
+¶Functions:
+Name | +Description | +
---|---|
pixel_stats |
+
+
+
+ Takes a multi-dimensional dataset and generate spatial + |
+
tide_stats |
+
+
+
+ Takes a multi-dimensional dataset and generate tide statistics + |
+
pixel_stats
+
+
+¶pixel_stats(
+ data,
+ time=None,
+ model="EOT20",
+ directory=None,
+ resample=True,
+ modelled_freq="3h",
+ min_max_q=(0.0, 1.0),
+ resample_method="bilinear",
+ dask_chunks=None,
+ dask_compute=True,
+ extrapolate=True,
+ cutoff=10,
+ **pixel_tides_kwargs
+)
+
Takes a multi-dimensional dataset and generate spatial +tide statistics and satellite-observed tide bias metrics, +calculated based on every timestep in the satellite data and +modelled into the spatial extent of the imagery.
+By comparing the subset of tides observed by satellites +against the full astronomical tidal range, we can evaluate +whether the tides observed by satellites are biased +(e.g. fail to observe either the highest or lowest tides) +due to tide aliasing interactions with sun-synchronous satellite +overpasses.
+Compared to tide_stats
, this function models tide metrics
+spatially to produce a two-dimensional output for each statistic.
For more information about the tidal statistics computed by this +function, refer to Figure 8 in Bishop-Taylor et al. 2018: +https://www.sciencedirect.com/science/article/pii/S0272771418308783#fig8
+ + +Parameters:
+Name | +Type | +Description | +Default | +
---|---|---|---|
+ |
+
+ Dataset or DataArray or GeoBox
+ |
+
+
+
+ A multi-dimensional dataset or GeoBox pixel grid that will
+be used to calculate spatial tide statistics. If |
+ + required + | +
+ |
+
+ DatetimeLike
+ |
+
+
+
+ By default, tides will be modelled using times from the
+"time" dimension of |
+
+ None
+ |
+
+ |
+
+ str or list of str
+ |
+
+
+
+ The tide model (or list of models) to use to model tides.
+If a list is provided, a new "tide_model" dimension will be
+added to the |
+
+ 'EOT20'
+ |
+
+ |
+
+ str
+ |
+
+
+
+ The directory containing tide model data files. If no path is
+provided, this will default to the environment variable
+ |
+
+ None
+ |
+
+ |
+
+ bool
+ |
+
+
+
+ Whether to resample tide statistics back into |
+
+ True
+ |
+
+ |
+
+ str
+ |
+
+
+
+ An optional string giving the frequency at which to model tides
+when computing the full modelled tidal range. Defaults to '3h',
+which computes a tide height for every three hours across the
+temporal extent of |
+
+ '3h'
+ |
+
+ |
+
+ tuple
+ |
+
+
+
+ Quantiles used to calculate max and min observed and modelled
+astronomical tides. By default |
+
+ (0.0, 1.0)
+ |
+
+ |
+
+ str
+ |
+
+
+
+ If resampling is requested (see |
+
+ 'bilinear'
+ |
+
+ |
+
+ tuple of float
+ |
+
+
+
+ Can be used to configure custom Dask chunking for the final
+resampling step. By default, chunks will be automatically set
+to match y/x chunks from |
+
+ None
+ |
+
+ |
+
+ bool
+ |
+
+
+
+ Whether to compute results of the resampling step using Dask.
+If False, |
+
+ True
+ |
+
+ |
+
+ bool
+ |
+
+
+
+ Whether to extrapolate tides into x and y coordinates outside of +the valid tide modelling domain using nearest-neighbor. Defaults +to True. + |
+
+ True
+ |
+
+ |
+
+ float
+ |
+
+
+
+ Extrapolation cutoff in kilometers. To avoid producing tide +statistics too far inland, the default is 10 km. + |
+
+ 10
+ |
+
+ |
+ + | +
+
+
+ Optional parameters passed to the |
+
+ {}
+ |
+
Returns:
+Name | Type | +Description | +
---|---|---|
stats_ds |
+ Dataset
+ |
+
+
+
+ An
|
+
eo_tides/stats.py
401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 +440 +441 +442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 +564 +565 +566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 |
|
tide_stats
+
+
+¶tide_stats(
+ data,
+ time=None,
+ model="EOT20",
+ directory=None,
+ tidepost_lat=None,
+ tidepost_lon=None,
+ plain_english=True,
+ plot=True,
+ plot_var=None,
+ point_col=None,
+ modelled_freq="3h",
+ min_max_q=(0.0, 1.0),
+ round_stats=3,
+ **tag_tides_kwargs
+)
+
Takes a multi-dimensional dataset and generate tide statistics +and satellite-observed tide bias metrics, calculated based on +every timestep in the satellite data and the geographic centroid +of the imagery.
+By comparing the subset of tides observed by satellites +against the full astronomical tidal range, we can evaluate +whether the tides observed by satellites are biased +(e.g. fail to observe either the highest or lowest tides) due +to tide aliasing interactions with sun-synchronous satellite +overpasses.
+For more information about the tidal statistics computed by this +function, refer to Figure 8 in Bishop-Taylor et al. 2018: +https://www.sciencedirect.com/science/article/pii/S0272771418308783#fig8
+ + +Parameters:
+Name | +Type | +Description | +Default | +
---|---|---|---|
+ |
+
+ Dataset or DataArray or GeoBox
+ |
+
+
+
+ A multi-dimensional dataset or GeoBox pixel grid that will
+be used to calculate tide statistics. If |
+ + required + | +
+ |
+
+ DatetimeLike
+ |
+
+
+
+ By default, tides will be modelled using times from the
+"time" dimension of |
+
+ None
+ |
+
+ |
+
+ str or list of str
+ |
+
+
+
+ The tide model (or list of models) to use to model tides.
+If a list is provided, the resulting statistics will be
+returned as a |
+
+ 'EOT20'
+ |
+
+ |
+
+ str
+ |
+
+
+
+ The directory containing tide model data files. If no path is
+provided, this will default to the environment variable
+ |
+
+ None
+ |
+
+ |
+
+ float or int
+ |
+
+
+
+ Optional coordinates used to model tides. The default is None, +which uses the centroid of the dataset as the tide modelling +location. + |
+
+ None
+ |
+
+ |
+
+ float or int
+ |
+
+
+
+ Optional coordinates used to model tides. The default is None, +which uses the centroid of the dataset as the tide modelling +location. + |
+
+ None
+ |
+
+ |
+
+ bool
+ |
+
+
+
+ An optional boolean indicating whether to print a plain english
+version of the tidal statistics to the screen. Defaults to True;
+only supported when a single tide model is passed to |
+
+ True
+ |
+
+ |
+
+ bool
+ |
+
+
+
+ An optional boolean indicating whether to plot how satellite-
+observed tide heights compare against the full tidal range.
+Defaults to True; only supported when a single tide model is
+passed to |
+
+ True
+ |
+
+ |
+
+ str
+ |
+
+
+
+ Optional name of a coordinate, dimension or variable in the array +that will be used to plot observations with unique symbols. +Defaults to None, which will plot all observations as circles. + |
+
+ None
+ |
+
+ |
+
+ str
+ |
+
+
+
+ Colour used to plot points on the graph. Defaults to None which +will automatically select colours. + |
+
+ None
+ |
+
+ |
+
+ str
+ |
+
+
+
+ An optional string giving the frequency at which to model tides
+when computing the full modelled tidal range. Defaults to '3h',
+which computes a tide height for every three hours across the
+temporal extent of |
+
+ '3h'
+ |
+
+ |
+
+ tuple
+ |
+
+
+
+ Quantiles used to calculate max and min observed and modelled
+astronomical tides. By default |
+
+ (0.0, 1.0)
+ |
+
+ |
+
+ int
+ |
+
+
+
+ The number of decimal places used to round the output statistics. +Defaults to 3. + |
+
+ 3
+ |
+
+ |
+ + | +
+
+
+ Optional parameters passed to the |
+
+ {}
+ |
+
Returns:
+Name | Type | +Description | +
---|---|---|
stats_df |
+ Series or Dataframe
+ |
+
+
+
+ A pandas object containing the following statistics: +
|
+
eo_tides/stats.py
196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 |
|
eo_tides.validation
+
+
+¶Functions:
+Name | +Description | +
---|---|
eval_metrics |
+
+
+
+ Calculate a set of common statistical metrics + |
+
load_gauge_gesla |
+
+
+
+ Load Global Extreme Sea Level Analysis (GESLA) tide gauge data. + |
+
eval_metrics
+
+
+¶Calculate a set of common statistical metrics +based on two input actual and predicted vectors.
+These include:
+Parameters:
+Name | +Type | +Description | +Default | +
---|---|---|---|
+ |
+
+ array
+ |
+
+
+
+ An array providing "actual" variable values. + |
+ + required + | +
+ |
+
+ array
+ |
+
+
+
+ An array providing "predicted" variable values. + |
+ + required + | +
+ |
+
+ int
+ |
+
+
+
+ Number of decimal places to round each metric +to. Defaults to 3. + |
+
+ 3
+ |
+
+ |
+
+ bool
+ |
+
+
+
+ Whether to return linear regression p-value, +intercept and standard error (in addition to +only regression slope). Defaults to False. + |
+
+ False
+ |
+
Returns:
+Type | +Description | +
---|---|
+ Series
+ |
+
+
+
+ A |
+
eo_tides/validation.py
load_gauge_gesla
+
+
+¶load_gauge_gesla(
+ x=None,
+ y=None,
+ site_code=None,
+ time=("2018", "2020"),
+ max_distance=None,
+ correct_mean=False,
+ filter_use_flag=True,
+ site_metadata=True,
+ data_path="/gdata1/data/sea_level/gesla/",
+ metadata_path="/gdata1/data/sea_level/GESLA3_ALL 2.csv",
+)
+
Load Global Extreme Sea Level Analysis (GESLA) tide gauge data.
+Load and process all available GESLA measured sea-level data
+with an x, y, time
spatio-temporal query, or from a list of
+specific tide gauges. Can optionally filter by gauge quality
+and append detailed gauge metadata.
Modified from original code in https://github.com/philiprt/GeslaDataset.
+ + +Parameters:
+Name | +Type | +Description | +Default | +
---|---|---|---|
+ |
+
+ numeric or list / tuple
+ |
+
+
+
+ Coordinates (in degrees longitude, latitude) used to load GESLA
+tide gauge observations. If provided as singular values
+(e.g. |
+
+ None
+ |
+
+ |
+
+ numeric or list / tuple
+ |
+
+
+
+ Coordinates (in degrees longitude, latitude) used to load GESLA
+tide gauge observations. If provided as singular values
+(e.g. |
+
+ None
+ |
+
+ |
+
+ str or list of str
+ |
+
+
+
+ GESLA site code(s) for which to load data (e.g. |
+
+ None
+ |
+
+ |
+
+ tuple or list of str
+ |
+
+
+
+ Time range to consider, given as a tuple of start and end dates,
+e.g. |
+
+ ('2018', '2020')
+ |
+
+ |
+
+ numeric
+ |
+
+
+
+ Optional max distance within which to return the nearest tide gauge
+when |
+
+ None
+ |
+
+ |
+
+ bool
+ |
+
+
+
+ Whether to correct sea level measurements to a standardised mean +sea level by subtracting the mean of all observed sea level +observations. This can be useful when GESLA tide heights come +from different or unknown tide datums. Note: the observed mean +sea level calculated here may differ from true long-term/ +astronomical Mean Sea Level (MSL) datum. + |
+
+ False
+ |
+
+ |
+
+ bool
+ |
+
+
+
+ Whether to filter out low quality observations with a "use_flag" +value of 0 (do not use). Defaults to True. + |
+
+ True
+ |
+
+ |
+
+ bool
+ |
+
+
+
+ Whether to add tide gauge station metadata as additional columns +in the output DataFrame. Defaults to True. + |
+
+ True
+ |
+
+ |
+
+ str
+ |
+
+
+
+ Path to the raw GESLA data files. Default is
+ |
+
+ '/gdata1/data/sea_level/gesla/'
+ |
+
+ |
+
+ str
+ |
+
+
+
+ Path to the GESLA station metadata file.
+Default is |
+
+ '/gdata1/data/sea_level/GESLA3_ALL 2.csv'
+ |
+
Returns:
+Type | +Description | +
---|---|
+ DataFrame
+ |
+
+
+
+ Processed GESLA data as a DataFrame with columns including: +
...and additional columns from station metadata. + |
+
eo_tides/validation.py
186 +187 +188 +189 +190 +191 +192 +193 +194 +195 +196 +197 +198 +199 +200 +201 +202 +203 +204 +205 +206 +207 +208 +209 +210 +211 +212 +213 +214 +215 +216 +217 +218 +219 +220 +221 +222 +223 +224 +225 +226 +227 +228 +229 +230 +231 +232 +233 +234 +235 +236 +237 +238 +239 +240 +241 +242 +243 +244 +245 +246 +247 +248 +249 +250 +251 +252 +253 +254 +255 +256 +257 +258 +259 +260 +261 +262 +263 +264 +265 +266 +267 +268 +269 +270 +271 +272 +273 +274 +275 +276 +277 +278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 |
|
eo_tides.utils
+
+
+¶Functions:
+Name | +Description | +
---|---|
clip_models |
+
+
+
+ Clip NetCDF-format ocean tide models to a bounding box. + |
+
idw |
+
+
+
+ Perform Inverse Distance Weighting (IDW) interpolation. + |
+
list_models |
+
+
+
+ List all tide models available for tide modelling. + |
+
clip_models
+
+
+¶clip_models(
+ input_directory,
+ output_directory,
+ bbox,
+ model=None,
+ buffer=5,
+ overwrite=False,
+)
+
Clip NetCDF-format ocean tide models to a bounding box.
+This function identifies all NetCDF-format tide models in a
+given input directory, including "ATLAS-netcdf" (e.g. TPXO9-atlas-nc),
+"FES-netcdf" (e.g. FES2022, EOT20), and "GOT-netcdf" (e.g. GOT5.5)
+format files. Files for each model are then clipped to the extent of
+the provided bounding box, handling model-specific file structures.
+After each model is clipped, the result is exported to the output
+directory and verified with pyTMD
to ensure the clipped data is
+suitable for tide modelling.
For instructions on accessing and downloading tide models, see: +https://geoscienceaustralia.github.io/eo-tides/setup/
+ + +Parameters:
+Name | +Type | +Description | +Default | +
---|---|---|---|
+ |
+
+ str or PathLike
+ |
+
+
+
+ Path to directory containing input NetCDF-format tide model files. + |
+ + required + | +
+ |
+
+ str or PathLike
+ |
+
+
+
+ Path to directory where clipped NetCDF files will be exported. + |
+ + required + | +
+ |
+
+ tuple of float
+ |
+
+
+
+ Bounding box for clipping the tide models in EPSG:4326 degrees
+coordinates, specified as |
+ + required + | +
+ |
+
+ str or list of str
+ |
+
+
+
+ The tide model (or models) to clip. Defaults to None, which +will automatically identify and clip all NetCDF-format models +in the input directly. + |
+
+ None
+ |
+
+ |
+
+ float
+ |
+
+
+
+ Buffer distance (in degrees) added to the bounding box to provide +sufficient data on edges of study area. Defaults to 5 degrees. + |
+
+ 5
+ |
+
+ |
+
+ bool
+ |
+
+
+
+ If True, overwrite existing files in the output directory. +Defaults to False. + |
+
+ False
+ |
+
Examples:
+>>> clip_models(
+... input_directory="tide_models/",
+... output_directory="tide_models_clipped/",
+... bbox=(-8.968392, 50.070574, 2.447160, 59.367122),
+... )
+
eo_tides/utils.py
278 +279 +280 +281 +282 +283 +284 +285 +286 +287 +288 +289 +290 +291 +292 +293 +294 +295 +296 +297 +298 +299 +300 +301 +302 +303 +304 +305 +306 +307 +308 +309 +310 +311 +312 +313 +314 +315 +316 +317 +318 +319 +320 +321 +322 +323 +324 +325 +326 +327 +328 +329 +330 +331 +332 +333 +334 +335 +336 +337 +338 +339 +340 +341 +342 +343 +344 +345 +346 +347 +348 +349 +350 +351 +352 +353 +354 +355 +356 +357 +358 +359 +360 +361 +362 +363 +364 +365 +366 +367 +368 +369 +370 +371 +372 +373 +374 +375 +376 +377 +378 +379 +380 +381 +382 +383 +384 +385 +386 +387 +388 +389 +390 +391 +392 +393 +394 +395 +396 +397 +398 +399 +400 +401 +402 +403 +404 +405 +406 +407 +408 +409 +410 +411 +412 +413 +414 +415 +416 +417 +418 +419 +420 +421 +422 +423 +424 +425 +426 +427 +428 +429 +430 +431 +432 +433 +434 +435 +436 +437 +438 +439 |
|
idw
+
+
+¶idw(
+ input_z,
+ input_x,
+ input_y,
+ output_x,
+ output_y,
+ p=1,
+ k=10,
+ max_dist=None,
+ k_min=1,
+ epsilon=1e-12,
+)
+
Perform Inverse Distance Weighting (IDW) interpolation.
+This function performs fast IDW interpolation by creating a KDTree
+from the input coordinates then uses it to find the k
nearest
+neighbors for each output point. Weights are calculated based on the
+inverse distance to each neighbor, with weights descreasing with
+increasing distance.
Code inspired by: https://github.com/DahnJ/REM-xarray
+ + +Parameters:
+Name | +Type | +Description | +Default | +
---|---|---|---|
+ |
+
+ array - like
+ |
+
+
+
+ Array of values at the input points. This can be either a +1-dimensional array, or a 2-dimensional array where each column +(axis=1) represents a different set of values to be interpolated. + |
+ + required + | +
+ |
+
+ array - like
+ |
+
+
+
+ Array of x-coordinates of the input points. + |
+ + required + | +
+ |
+
+ array - like
+ |
+
+
+
+ Array of y-coordinates of the input points. + |
+ + required + | +
+ |
+
+ array - like
+ |
+
+
+
+ Array of x-coordinates where the interpolation is to be computed. + |
+ + required + | +
+ |
+
+ array - like
+ |
+
+
+
+ Array of y-coordinates where the interpolation is to be computed. + |
+ + required + | +
+ |
+
+ int or float
+ |
+
+
+
+ Power function parameter defining how rapidly weightings should
+decrease as distance increases. Higher values of |
+
+ 1
+ |
+
+ |
+
+ int
+ |
+
+
+
+ Number of nearest neighbors to use for interpolation. |
+
+ 10
+ |
+
+ |
+
+ int or float
+ |
+
+
+
+ Restrict neighbouring points to less than this distance. +By default, no distance limit is applied. + |
+
+ None
+ |
+
+ |
+
+ int
+ |
+
+
+
+ If |
+
+ 1
+ |
+
+ |
+
+ float
+ |
+
+
+
+ Small value added to distances to prevent division by zero +errors in the case that output coordinates are identical to +input coordinates. Defaults to 1e-12. + |
+
+ 1e-12
+ |
+
Returns:
+Name | Type | +Description | +
---|---|---|
interp_values |
+ ndarray
+ |
+
+
+
+ Interpolated values at the output coordinates. If |
+
Examples:
+>>> input_z = [1, 2, 3, 4, 5]
+>>> input_x = [0, 1, 2, 3, 4]
+>>> input_y = [0, 1, 2, 3, 4]
+>>> output_x = [0.5, 1.5, 2.5]
+>>> output_y = [0.5, 1.5, 2.5]
+>>> idw(input_z, input_x, input_y, output_x, output_y, k=2)
+array([1.5, 2.5, 3.5])
+
eo_tides/utils.py
566 +567 +568 +569 +570 +571 +572 +573 +574 +575 +576 +577 +578 +579 +580 +581 +582 +583 +584 +585 +586 +587 +588 +589 +590 +591 +592 +593 +594 +595 +596 +597 +598 +599 +600 +601 +602 +603 +604 +605 +606 +607 +608 +609 +610 +611 +612 +613 +614 +615 +616 +617 +618 +619 +620 +621 +622 +623 +624 +625 +626 +627 +628 +629 +630 +631 +632 +633 +634 +635 +636 +637 +638 +639 +640 +641 +642 +643 +644 +645 +646 +647 +648 +649 +650 +651 +652 +653 +654 +655 +656 +657 +658 +659 +660 +661 +662 +663 +664 +665 +666 +667 +668 +669 +670 +671 +672 +673 +674 +675 +676 +677 +678 +679 +680 +681 +682 +683 +684 +685 +686 +687 +688 +689 +690 +691 +692 +693 +694 +695 +696 +697 +698 +699 +700 +701 +702 +703 +704 +705 |
|
list_models
+
+
+¶list_models(
+ directory=None,
+ show_available=True,
+ show_supported=True,
+ raise_error=False,
+)
+
List all tide models available for tide modelling.
+This function scans the specified tide model directory
+and returns a list of models that are available in the
+directory as well as the full list of all models supported
+by eo-tides
and pyTMD
.
For instructions on setting up tide models, see: +https://geoscienceaustralia.github.io/eo-tides/setup/
+ + +Parameters:
+Name | +Type | +Description | +Default | +
---|---|---|---|
+ |
+
+ str
+ |
+
+
+
+ The directory containing tide model data files. If no path is
+provided, this will default to the environment variable
+ |
+
+ None
+ |
+
+ |
+
+ bool
+ |
+
+
+
+ Whether to print a list of locally available models. + |
+
+ True
+ |
+
+ |
+
+ bool
+ |
+
+
+
+ Whether to print a list of all supported models, in +addition to models available locally. + |
+
+ True
+ |
+
+ |
+
+ bool
+ |
+
+
+
+ If True, raise an error if no available models are found. +If False, raise a warning. + |
+
+ False
+ |
+
Returns:
+Name | Type | +Description | +
---|---|---|
available_models |
+ list of str
+ |
+
+
+
+ A list of all tide models available within |
+
supported_models |
+ list of str
+ |
+
+
+
+ A list of all tide models supported by |
+
eo_tides/utils.py
442 +443 +444 +445 +446 +447 +448 +449 +450 +451 +452 +453 +454 +455 +456 +457 +458 +459 +460 +461 +462 +463 +464 +465 +466 +467 +468 +469 +470 +471 +472 +473 +474 +475 +476 +477 +478 +479 +480 +481 +482 +483 +484 +485 +486 +487 +488 +489 +490 +491 +492 +493 +494 +495 +496 +497 +498 +499 +500 +501 +502 +503 +504 +505 +506 +507 +508 +509 +510 +511 +512 +513 +514 +515 +516 +517 +518 +519 +520 +521 +522 +523 +524 +525 +526 +527 +528 +529 +530 +531 +532 +533 +534 +535 +536 +537 +538 +539 +540 +541 +542 +543 +544 +545 +546 +547 +548 +549 +550 +551 +552 +553 +554 +555 +556 +557 +558 +559 +560 +561 +562 +563 |
|
Yn`5)}k)q__efW?FMHwt|+O#7we+J6@8U>e}e81gH2xy^szK}r5cYLChl~2>iD9- zg2=mwxn8`?EeG7~w23aX7cz}{EsZ-AUb|um)>G%gut4}IcTdNw(uKL#hC{GVlbAK` z7K)xbOw=@b30QIm8aGmPsGMM74vGQ{eKBVhO?*CsL(jgAuLdi?LC}0NvY!yyJ%)Y$TX3QLA+L<74N5V_Tg!tHDDkz9jnYWOnVIl zaFt9z(E<+ct+OJ29wvmn-;|YP?$^j+$MN?!j=>HF(+vO2oR;Ux2t+z1KxGU>i(RST zFpsFm`1~Lr84TSzI;p%G-*8%^W#Gg|l0u_Jf+-@BG#+OrJ2m&kj zlv zb^%k}*yzyjojHAwGNHo)$qRwF H^bT=pe+hBk!)Hm3#+7v3k z# lYC|TxWz8csx!!2^&5}oa`ig8w(Y--MwhpStnM9R# z+;}p0Agl?h!g#JS_hzsFGEg;Gj(J{wR;*eJfK0iXOaa!nx~UC~pzyBJs6LKTrdVxG zOxLBx*f?tlml7G&*U1-1UqfJ%t|XiO&9~qv!LU?B`*SB$p-ZHrOogw!J2}4}WC`zB zm^~~!+y3K1yUPfIGr|C|d~p)rk3Rp}ygi9l+lK%LI7#cptmeqKxsw5 *EsoxY$jq$siEI-y8nP{YJPP0pJwSKy6 NeV$Hh@OAv!4!hAInxeTL_3=h_QR2G=4$Zm1Fmf4_gUTL!rb~jWAJma#N#{X>por zSqlrLU@M>cIfh{N?z(6IPCS!ZDBsBlQro&Ef4tO_kUM=9E7R5Gd5Yw9bKaLMEAx-9 z=eyrZU1WLF8z}KfZSI42#Ft>_!N^-#O@sZ#x9Cp1QW>R&iJni|4ab-kLc)P~K(t5* z3+BqLi!l_gWk?IdUxBHd``UC!6R~dr_+S`+I?(c!jwQ(XE^2(4uEeH)2!B=fsdjJ9 zU^(v |DeUz+afJJ8ZJS}J z!v!Vw?(i^J;|X$j57?muCh=!$WDUzpKE}lvN;=4>C5TpsmRm3_*^;MhLOW#T{F}RW ze{IS82isOOpB4;1aJruE_FS-NyvXtz7i{-NQ1B!O_l}mu3kg)ot#bve+ z7BG(f`0oWNPbsWyj98RZy*%bn)bzqbm izGY+xk(sZ=RYemB+1dnfHsYQ8>itwL28f?abJb`$d^; z+8Q2SMlqKmS=5tTu1P|9?z=dueGS&xW>AskWbu(^)~3coL4B2TAFv*4Iv6at7+Ct~ zT<&D*P<9(8zEPYEcIip{5EAkvi(YPO%0EBo*>TaUk9uA-FoW+8>Imr#f!Hv252hWo z-A9+t#N_|+n{EE6E-VF7ssGi1_5px6|9B@lFD|XB<`~CLT`VsUX(wuV91}xVc8AA( zer>?@P^E6X &=G)yx*LZEXD={6{e|jY*f%1DD`S&8_b4hJ zAAI @Y@yu0;v77 zs36DU>=6`%_a~I1J;Fl~zryw?%obqXfk=c@_5(JIEB~3?rxqrZgK%Xfih+)szuDYB zd{E*4MisYj-aheF$;P8f`6~v+HSzX{LWQZ9T-|hy*oio>GcCJh!0Fdk4F9|KiwY@W z^u+R?&Zn}YQ*Vi!rr ~UNAWk(dsqJj2PYHnTZ%T1m0wWJ1gI26r7kKpgOqrc z<%+jGgZ~kRk8etfnV#MmNmflUeWBh00bZsy_`a5&fhwk+A4uJI24U}YyJWFxEBTph zC8SwquMQQHF>zF{GIV4y(-9X^tRMcrqHQ}mb9yuGrHSFm!AfaBt*)Q4D}YhXB(9lh zRVgxy=k&3o`ZqbKHQ*ky+OI+HsB=*Eu9a-hI3r-i;!ccr?c}4Axu{A}e;CC4lFO60 zS93)<5hjKS7a&NM#dIIl{s{ER&u;1~>f9@lLnBAg GSD9QHBmu*v`H6D-CZ0kbtx~4g0Csk5!@~BgmU6`0zQznF)CXl_p7H(tA0Sv z&f_%IL;h8!o+W?NZei0dB04=AA2arkSIiC(FZQFLB8)^-|KXNzIXVtBYA#WF5QcIn zy-=V8*nzpwCDyd$s+Rz9iB!$As6!YfhmMK1G@0F7Ygkahv%?=>kYZf10^iI2&zS$a z{8nuOlRcfVt=Jy@?y*hP!_qSW+3Uvw!n1DOzmc_gN-=z(tT|fwRj46 zs<%Yrc}OL%bYgtPeEXT7ua%s1q*z}Em%_H6>T#39cR%AqcB8c%H4*7TEeSQJ-oKQS zeWNWPTruj7QMIYd1EyG$@x4&v{9*-K)d_$A&>NYhkrC$Ne7GXIgm6A(C3)hkg+oE& zLd5c-IzjaZej^SvCaa+1(G{T}!-F7lQ66#6wiOg=t38-C$?FFc+3gFf{mg?DDj~Kj zBnqP%%iwZ(*6L=A(F&5z5%0R&5?$xU%Vi~7X;$nNUL(Y3p+Yj?1eMD-;wjrO+adSu zGpzknmOG~|ngKSyfBU7B%o3lH73okS2Z4h{ZdLYS+ctn>a%AI6SrXve$y(b(-%D)2 zfYTebY_$KdT$UA$)w}oILwwg(G9pA0qy8y8jlF&NzwgcoaDrB1GkeUbsH)4vzB8;a zd$EXU+@G~cv~n*{Q`5@|`=J9pO4y}ezd5D>y+tqy?rGLf?|-zZw_bW+8U%JNQMNrv z9;*PusEMQ8;-uSk5il=YJqZJe?SqTA-)_zC*J81T^SsTuBn7p UQjz~njX>ht4a zn%K;8+*d>zgLa_Lx!n01mB@35ri(oFUyfbhvr9f1?!C?H`HY6ig`BDxdwCXX)?lOK z?Q|&71@Or9fCtAvP&e-D!=MJb0A_k74mPyUcj v)ei+qW7BEHGVG_wJM(Y0M?P)6V9 zqVj1lUm#241#1Acb$X7tuvgXB0LsJgq^JSHY^sn{pk7%3FV38sLzf0`&gqbgl*gdf zMctri<1hnIVflmLiv?~kP>Ud?yPHU%%luetr(GMv(=ZclkZ7cX?jD!%%h@(*aPfaq zj`$T+T@xbS&@LNc-BUya-m(^rY|9F!=LYS6V10)V!KraM0|?Gq_o&gElIx?E_N;=3 zU+@3wx$i4u+A9i~Al|SmvwdUjIy$;L{N-G__A3Q<`A$2-N}*4INl$Y2Et|;q+)~$O zq7O>#g=jHNtE-~l?Ze`PsT3N#Igt0QOBgQmg_!RE*{mOp{Jtx-fK*71+-%weMr}4~ z!ZZ@sX )(F2<~Z%XjLY1cfUls`9^Y1lPOT!TDjsA71_$4-kExvaOJ|OHR`q19nn_B@Q15T z%9n@WiTC8?cC3qW?i`eH7|;#0F{3lb;?YV-`#!E}s4P2gKlY>;={@yKv!E+`=hmha zH(S+=>GP{JjuXfm#33O}MwhmbC4)a+F!YpFQ5e>&cbLI-jWMsR7+Z=uocUb6C?)4e zvj}4;03tao9%Txk@8(WbEMWl!M+Fcc8qL3ip?INI8$3SA3A&G~X(367Q~mQQn|#pC z*+{8HiUVyE0l@AYM2LSZ3-!kO#=X-3c){gJJ?EPfFJvtR8|c^O3dot-OP0+cyCs@k z1 8MSK@bo`;&of_9hhYd3y{56Iq@GW5L=-(f_lg;b-%4}`; z(G@ZJwtRjPRj7ut!v^U3mm_E2v?|Z=WqTy|x)W%G%`sZx)3Gx#CXK#pG9Zv8pXX-z z4n@n%`K9UZtd!gCS~U}aG-m_@em?U4D-#QR=?^jvG4w=a5ii`J_sg2c@2(qii!rOE zVfM9VHxxyHZ$iY$2gf`=AtI5Q(`{}M;~tlJ`3V`yPC>fVUcbbM^PlLKncYQ!y~%K} zGD}zG_G)&=waPy=qVgN(AKU^+;2H&85c?wl=!vr+wM`1#tZV`O%d19ttld?y!#8y1 z*qh#( 2INo^)!GW|`S3^{&q%#RncAK`H4iLr zRpuEvn&nKDv7-EJt{C}Fc$jSpz=iS=+KF=^5N*=K+rdPfJOzOGI#m)w|L<0aNlt_W z_UOi#U((@o-t4E=Dkpiv7k+*{moVor^{j(veIywuH~V(mtG <2}cA_5_@EN#LzIkOOoFdYNxQf+6hBn0?VI3Tzq5J#$ibs7iF(z z4i s>gm+X&)9kP#T05MbtVH^=cl&WebJ6HLO=+r %9o5L=iS`GRup9hYwu;z_M$lerIkvU@e!_H8H3mS8y%-Rg+e8T zRm*I$q0Y``R#%wtdS!|H4$jkI^+*t+PZyZhSZra^1w4T^1%-jmlrh9`?J3~f`w6lC z%nw^ u yIb|c^_X@q zOj7n!h*o6|12M$2G4`EX+U@A&6PTM_+uU349^mf7{7mmjHZDjI1YD!{`X5+`iQZF$ z2ps3%%$blm*nV@EQn2kUxQ6)s`~kG8SjvfmqzMp9(g6{mJfRWq?(Q}RD7np&{qA;` zpL_SLOX-}!y%&g;B+g0>My_ld!jTw8C4$11q@P|od6Qet&P)R}#BDewp z HrIhLOJGHJ ?3fM zU<*YCd_CJ**9JnMf%+(#hQYrZO|6u`Ws^= U}v>BE)_4=zRqG2g;aks^}oCRxW0qa0tfx!Z6 zrB4v&PyFC-{g4@H?4MTP-`|zvK4hgM0M~F3!;*0rc;b^hz`q%*ErQ#4L!Eppi>RzL z5xlI-R83rX-xNv_Lz9RlQYPV$Fht$Av>u9ka^POhL-N#Th&Vb>*>&5$2e7Ui_-CiV zO!@s33HrMPeS}DenjUpngt@{Zn6PL~pr&S`pB<6V!GRR9FnTdE-fJq^A}F5&;qX+H zA~xCt%Gm8H4$>zpHqm6HO*{T>VO(=RzHE8qb_yy mQwL6Ej>e7^UF~b~a-=>q^DVpkJH8&G6RHjT86> fs>BJcs0+gA}-7p;I;?tGXlWyxaD zG>t&0=OW`(oDk7VE_%u~haaZ+2`T>)x4;~RMGHF{_0Y$_*#A4(a}E*&zYa0^Vs7lt zI6L?nlHyhL;Tn4=pd)~JOehn7m{}$CBObWPFqWZ3%Le4$@FXrK=E#H`LUyjWfuqoN z07!=fUDTqO0XSd)V)=9AiVjyU6|lA$D)qK2GidO7mk@%l{msXBw0&{UjaOC*%E~^? zM?wM{gy0w-IE;(3k>G7P;870vlZ)ab4(dkXfHllCm?P)nM0Rx&dk&*`RB#WSNR%S# z7{-!?e_flRCpnO~#M)*vl`7Ha^O4Y!VZ0E8xGO@`H(~D+60h{*=esE=ylH0)hCK{O z5PO%fz*RhratWdjwx#)C5VTGMp@0gkt1Nib#EW6G#D5#=d$iuid%Q)O17@_~GsHi7 zR;~k{a^v!A0t|i}Gsz+m+jfYm@O(F^bNN!o)l4ThR1OvHFmA_>!dmM)Bn0hD&<71g z$(2OOO@eJ-UEN|4k^B+$pL ^>@27i;B97dwW~@9TDsa8?=RfxcVX$b)?r0y$IQ)Vd6w!#9 dAt1B(gxO}-9u*^SVB&7m-q zTU?2wTR9Gxg=Tiq>{P%>gts!w%1oCTY0wuL7f?2l-|TJ$_VU;Kz$60{k6lj=81#}7 zlKnRJ38@u$5628ah4xbsro_I$`J@39lm<}{T9iy0u(eW3rzY(G`M} Zsp z^Xku{Mm_|9mqgZ*zI~ZTs`M6Pvuorw9> `LJRb`?-%XKdy8m>|`;=XDO#DnV_QR|HwcEkqM ze{_^i%FAW5w5#U0sPl ~RJk7cFaC~Z+=*F+Fr<34TAt)?T+ zC{^HJcbvla#EYFoB%u3emT3Cy_%v)`M_Ckne4s^d1pW|ssYj3zj>7`Pdw`_B9ou26 z5v?3^`0P=7S?oC=`| I?*qm{~vv{`%R z*I%-|0w|yIk9xV@U1tV<2}myXeTuzV `}#yjvNtqijb^l)nh=s8{a7gM^8oZ0%hxF*?g4NGKji!B=dT;3^IE z%_VVbl9=Hm@>TJNjepd|b$~HE=xs^DCT9dELKGNktx}OC0z%%f>$`sMHp!tDw8A*- zD)ddVe2`W~-T6W9$?>%mrKp2OJ1lUi&^(cRi7l`bZ@orsoaB%+6VmnoWb&SQ!^N_$ zGpP;_yggzs-VH$<0oc|*k{x{HVEOKM;^mgXa{Q5*t>1&-hX1lNCxNYB-^ix|n1|e+ z{Em7|0iFQTosY@xvZIgGjWphDJF4F7bW);G@J_~vsL(`3uwUri`p+*yGIy;*#^IC8 z3ToTOHe1O^=kH3yvwWEpG7}-g0U2;$?jEzImvv-(I-2t+nO@AuH=cgig^I1OO --2OP_+-|DfZ3 zMcqH47nTPP2GAE4Vk1pdDi=USV%2g%MQf8j@i}JOcHo*M-oam8SES_UZ#oIkcoYv_ zdy1&(2M_lH`e4<5w@_arVlQ#-*=taEc#i|y&!pcv^L$xr`@YnM9*duP$-n=pE#K3) zDuTL;>XhJT)175HB{KXG*=wAi04q2p;#@m8Jtu1CyffmrNcQRK+dZPeLvWdg+#}=T z`az!=C(L&>OENVBc7?sz^;@TjJL5N #ADk|S_tagI=OsA+9S@3W3+s&>3;1QlEc zwH?wcj?FBNZT+f)9N%(lSOO@19_)O&?PRB9{;LtfpKrR|5PCz_O_l4Kuype87q2+g z?m>sJLsH_Gv1G~t$hXQP3qD^&1SPPp|1Ev}`QUDI;lr!+UN$+bkG;nrx)0P)lxZB8 z<`wvm(VIMBbyNmp)>0Vv`sUn|e92Vzi*;Z3ZJ;&P#iJI@y4&w`D#sKOSD7aqe|qif z__PlfU-9`s_YaY*yTHyM(WZk)Sk|Y?vrzm$FkU$OXy={0oqLCCOEx&NcSli`w5y?r zj|>1Pasl;%FxK&~wD&}n9h#VlupD?Zsj6gv#vA!gX6Lgt;|!3ggVHGUi1*QH 4;LsV`Uwo zc)=|7>;{ ?7LIUYl@x`$1 z_k*1jEouZKupO_0vo%e>k7|Rc+I%V;IXgo$#gPk}i!}NMB4w>4*DsdZ`yiu{jD1Kp zl6J&)sR#)fYq9U86KSU5e^<)tVnKDB)4CM?Qr$X{69d}Bw=OkMD{W&<59x^jXV6tg zFI8wDkZe;e!AuE<@2bkO5aO8yijI70B-W5hq#5Fxlc8#M=za)X-;(C4KoTD7Z&$A8 zh&z-SVu*tO8Vw?Ek2Wtr8C9+3VeI;7O?VCbXP^-4&<``(u|7T2GrPsKhig6i%)N4B zezAKHmzkrs&1h_jgEAT-UnhdrtC$E>3YF4`w8Q5Bb^bfw`0xF_D-#GALrxCWc?_Qg z)EuI-MDnz`6t2v^Oldxx{ ?`9d(2U99i-Hrp=U9-23ZZZr~LD^PTI1Serhd>LEsG0 zb3isB*!|24xsMwouhE}$|MP)n{KtBsG_o6(g-Z?+sdJoztcGzymN^tu?!Sfj=I8CZ zP=Irsk%o(mt1N7J9G?gC>oap#+9Bv~DOw-+0(9_tGS*bQ9TVW95%6{YQ1LM#sQfD< zTQkMby|C?c5x=<^QS}~d>_i3ri_I~brE;uMAYk`w)2}~qUh$vh!7nQeU@snNoHB1j zJ{i0eI@_-ifqGnz$>k`TuQNWeMCWpPF3Humg4a1Dei@!?EL`w?;I$Yyyk6iGCxJ Xb#d5TvOtJ`<3MPTXc)hHOvM8RE5 zLln7OW^lAK3xEo*X99bdr=T=Vr@ha{Yi`uAK*<#nTxK#&j5^Y|epE;Zqtm2~aaavL zN4|s)Hh9E>Hdi&Fq@#RXTrv{k4*{i9po7{3n0>QA1E$QAM^~8n0f4%wZYTL75xnAx z7}C<^4oj*$-9T(HwkW>j92NsmN29bhg-+HNy7Y{Nv_j7{&&M4xy;rMF*YDmt|9CW{ zCN-gS`~F`t5&e4Bv|27Y&TB8iJtcQp{T=G?;}Vz=OXXHPMy6@Hp9nd#!$f_XwNGs+ zK}uYIob%4UXP|sJk-r6I*Mns^o7w5B5$Bg`2aY^0^hvMHZdh~Ihj-2Stg+qh>{^n* zf7tFhKK~^bH4DBRHu@;bXe!(FYgH!wAY^@U9on}O1d;R N&gbF>^Jw){*#iPDTDyXyY~< dX$)|}!Jo-lp3YA}S<#PDD_iQ?tn zK7~|qd}C50AO{S%h|P89asXRNU|uamT~YC36d{Glc^Z&xgpq`c3MLL2`b@(eMRcs? z6p*pyA&{rBvVSHGwdo1l0^ L#&7{GZ-kuU_WY`LBA|f`oD`tYg-y9^&2q@(4$Np zoO8c6jt6p^Ydmv^;vz!xK? 0C9LkbWD2ks0M!dG)|&p zpq89xQMOnnMGqFb*cXS+H(B2C4jK0g)Sq2tVtO2i2mXCAv7Z3E;Zh$duT1l%tRw4& zbEv34cX=51$JQ5LnI3Ll_y=>$8D*#(fC?>G(fmzCsj+=h>z#$tFf)7fPsEn_SYy4r zS5f^t^>?-%*LS}UooBvXq8@qCs{SDu4qh~btGom5J6?6!q1Go~u(Ke& #_b^$FG>%6Rn&OwWwIlTYlz!2pc`5miVZVm z_WrMya07MJeL3|5-;3(>bRfMDy@x3pa}QFyB#<;;1V9|SdARXvv_qJ-3Q`(h=Se{J zQ^ZJjDo-ho5ux^v7<&nESE+;{kH<&VZY$hSo#Wt9i7c|6*&x(h6p>C>(0`nz0xGND zon>MR$_0duoXg081j|mm^DnM`)_+V`>Nl}pJa4Z>$@!m@$MB`cS!3syA4pEsuwsbkT8OQejKk8ne2_WOCtWQaUr+ebMl|_93O&97`tkaB9xp ze%-uCvXy0So|C@DdUB8A-tQK{kTcZ1JhFgiQ1n^Pv`V`q0OUOly=Qf7uNW=}f)vwW z>a2Wqs 90p1;o<=a7@kXSXUX(@`#h7n?2a=i2kkR;(S$;-A zQ-V-TfuOPYUCZb_3{b8FW3--^tZb zHKwsH~S6d8wGI^ ztMz*0gtf?~I!66wcUCje_7d>aM1*?lY4F7eaEqCSl9lFogx@!~x>mHt__RvRFm&hJ zQ{&lwT>zPH8( 8&3Qe{lmZu?`6V=`uk%u&+AsD!s_QgQqIVSUlN^ zaRes_^+S+jcr}M2owoFVaULn~uOXj?0eX-_(Es$nL3xIe$!*X>)WJi@r@*HF%7Esu zAflt62*#j8Vnx7Ly@!vu8y_3ZUwZ5MuDVdvpGpRh DW!skmcA+qsU$nY__WTpK_F8Y1 KiH!gtBreuA?@;p$QjsS#H7uY&E%L9PW4v8z5WMzw(3qV8& z05MYGHwLs5eo^0mgX`tB>R{^SIvNYKQ`Wl77PHG1(S9yJ)Hi^fZxX-X8_-=?FvwkV zM!xzcf!hM$`iE5SQ4ApT;h$s!>T!Y3zaaKi6IEw`hEoV5rV9Uks|EmwW$4?j)chFW zZB_OHx5XU{``otAoGeonyq)f}2c)|*nCd8OuX?M~HSW9?so(x1#IZT}kZx!IA}N9i zk`LN@O*i}EH|L;&yyNENiJzh9SpB5Wp{Hh&M4>XJ61D-#@Bsxz7s1D{l#f`Wv0->r zTK*jskbc+U>obQ%g~mxasdY9ki4<*F5J~*qP(2QsBmkA$Tz&OKxxLc0dnSLW+IYmJ zKr|EPhbKL@3P;^Y!*T$}h^+U8?(;K6q5sL~3DUzdz+c}V`K1fH>W|(>1(9kpXj2$B zfLuBijCovghy}+FQwA*I5V63bn^Hz; 3Va>b8I#rvy-aJ~Zkqq~HzYYRctQBh`{&bu)g};PqR& zidxS%)PF?8Uy|xkNK8sH#+HxVrl>g=0e&aC{UpL~(@d+O(eIYRfsZudtFGI1>-I8n z)$+*)ijN(zSQmO)!p0UcXeUR66RDN~W?7MHiQ#Wf6Q5iJB19xZ{=HWNJN22n{(GaH z@ Aa9CvH7Nfx zUL^mG(Ld`S ?-f@-MakmMaF%pu;pH3 zX*JDMKf*K?bT$%7qqccmuG38}K9gMZ;|Vk$4-5HE#$5#8AxK}b9TtkBG%j7R *bNOM=VWN2q3#y^hXdBp=a@kvF0cg`0^&$??o6Mf}hY~34)XQ?I zO(9-pP~j9b4ci|?@_|f^8LJY$WLn0Ul}GtnHD`@)T~72#+N+fED|)HwA|NCtmj)7J z(OEJoAz1K-b-29*=15f;{SR8pVdOsb4>wZtl|VRvxNE=@?}!N(tbJ{%%nh#k)2toK zW*TD=>dRcMy3-ohbnHa(ejPFo>!wa#eG@17Z8zcz{8CZHDbl=sK=YoAjO{vfbRGIR zv3e)vZVE-~&Qpgd;?Ad!?=AW5obu8RZYIiu9G@MYIxyCH@tR{62ac!#tYhgR)d8OX zz=kK 1_Rwc5Z6;R? 3 z0Jup0Sio+@Nc(XU)VQCYl}8jI_PFJxl5w5niz)Vyz|$9fz!Q$QLDU4eytOg%`OSD8 z$f>D4Qqbf{0zB7VrEdWSt8LjLA=T_WP!C@8;ai{`&c5e=+45oWHN%%5bJfQ-;Df-+ zi|?4%2I4!7{UpC_n0zF2{qksvA4K=j9SiWzbueuRY6g&T{Q=(j1Z=_LZ2JpMRG9Ll z!@pA@JErJ|XKHJWNa1e-(BbF&JAjbmAnPQM=}cf}dfuATE`t87$+cbDrWSwwz&5G6 zjw}CD%OtyL|IY&Q*0d@6XgUpIS$lV0n<{Ld{Asv7XZFDT5TB;dx?6Q;ZY9UHIzJxQ ztv1|iWGOxlGO(rRdVtQ~(lw0|r3CEkM`Z&dDDb9xPx$wrNYU`yI4I{%*1t3NYFVJH zF1U2Ba0Peu^Xk*bg@arDDrxtd=BD26Sc4XkQimRZT098~^t zIp<~EhnKAm<((bJcKm#q8F4c*8{)!(#Y&E!TsQKOz*0|FD6Ru@5BPgXz`-ocPLaA= z>!g&jte{wV91A^(g;qJEd?_|}?%W~|J*a_cJT|*M!mY$T%(5Pe&;J5{Mbx+kR#)Gr zx~UIkJO?W#`)z%sE#6f)U?H;K6|L!gG{FTa+*u9jT8HB|*{OVV%?wGy+__-p-ka+? z=c7q>QxE_JR+R) VNG=E!{-Jjf=dqr4nK rYh`_`+sz-}-#`4#;hgvT z9A2;I^YJW{82z&cwJrkgrGcD8ptN;kq)C1SV{o(H#Q&FxV`REL4fN7+Tcn )e+F=eFbW9RbN$rl zakRpAhH#!94alyd9%I%nc4foQ>Jo}cmT{vqqnK Pa-k9Swa=&$584#9LaRx{Q+ zDNAJt{q>j6I;G*tC%0V|1BIdQgD>qm?;4dTQsLqu;s_Vo@gXk$tyk#F%x_nj?FS|= zysWQIde)JA)0Om@m3JF%vg#Dk6%Rc}KH)DGEe(w!ce*kDQ)_MtYSKP%kMZNH_`a?w zhw)>Y>RDLr64dCBuyn{m 6l2>pOAY9fgtq+Z) 1=~ULAV=)}4aXQvdOfJSqx{Y{Mf1g*2WbtRJKV-wmLZxZ9^#*P&+EY zvIN_ts`~`qBU)Fd-V9(iBwdh``#nU}gwq?AykJ+(Q4eZvn?6sa)PuvtPdbPAQPm77 zK>ehnaP5s{4*dFw2GvQ!90wbmr+di(1!TOpE_XMjv zmYbbaO)D-;$xW*YMp#dk7Lc{yZ_#+cdK?+v#D6MU(I6n6Du{F^>k5?4xB&S|wG#P3 zXsw8?7zd9IgK80;a3LmbeT~n(F_j`5!lsr7(F%0{gRPdyV6dYF*)G!fA?tq_?N@KP z&{M~!8uF-K!%tD+A&kW`Vu9r%Os}9XzQpr+Sv-EbKc#`9*Uyjwz&H!8%rS!*Q%I$z zY||IgP)KcX3Fm&ElfT_t9=a%FBaac^I0kli=Dcrae3EQ4%xabV9faHrw25y(bGMmX zMU1w#Hg_zIx3)_fTTPpL-5#{{&IS8jqs(QBk~;R1sB4t9?j$_n1g^+J>({z_!H0W{ zCB?Z+PPEXJA>E?FOnb=Lm3Pd(>J~_P0eWZ+S&Uik0-JA+TxsTDZ;}r3Ctw !J`1-CQ~t{!Bt3UH!qwrr zkDA}qQSYp!f2MuS|1>=?p>#cY)>D5+s?M*hjlaJ9Fg$&5DWpiY++<}mdYYcdGE0oU zOwgD3;sxIDUmjw_rAND;#z-#6EX6x+4F(o72i8Nyl?RI!QU4tUDtH_>vYwg3)ZDIY zv9iszkb_AWkTsCNu=P+Cx$RNsNVs}adGhIX2%iN~I?-aXA85iPNvO&NRc$V7obai} zy(I5pn4NqWsy%HFr;P?uUMEMs uo>rQ5JP@h1bsv?D(Tj9*66r54*N_TldjG z+mJkT|CB{8d67jhf}xFhWoETf6v3oU%d6Zfq>{!q9F=%urU@Z4^w?lz3;s(GT%W`S zo5cVga;TNY7OdD>;UMbxGa^{>CVr39cSZ>7?FwwsWUC#VeK?@f?kqB8COw$D@y_;E z`r+hRy?y&@$)ptQ5~_Hrm?(LMF!hMW{aMRZ>6Qul6Qr=C;-W*1EcF@F0Q-_HFm_oJ zes=O>j$`$Q$aFjSIsab p8Ml|cRn_s_GZY$_p7Ea8jDtX&m+&Ft>aXonTq13ICgNu)_-ttQr?~Cz zuU`mrR_$H!Z?^-%jUk2AjLViE4ZSyUtgv2VD!FRA*NKSfvdGFIr@La_C(`RGLZ!hC z(3n4qEjjDov(4rTG9VGEbbcw3-fK0sOEW9TjKq41*GB~1nTbQ+;h;iURK%`UcguBL zj_)-orrLH;)2i^wB)c`l_1BD8NHz}oaWrDbuEug37BqB4p7C%1ZmFf&?z3Xz3j-w7 z?mh-&yQ@jj#%-LTRIgVo}bq zPS5~35U%Ew+(S+B#`()b@hQ;?1`f;kU^c3{Xb88%2jI7QwHuQzpIhI|8^bgR -~lQfv<{f7k;;O?^U^4^^`}L5-JbX8xVhu2R~CujFgoVdw2Mb>=li%@;rfjm)<) zZvAex(a^jU@4jQHEM!-ud_MXgPq44FG~MPe%^;&QH@$jGZm-UgS`ZwAq97qHU7`}_ zGe49Q)G;QI#2!%8Nn_vW-cFjQlyyKTS-t=IE|(zE0r5nbJz!*tTd@g;`uNjf1&biP z^zrV0F7V@Q_g#6I=v$tE_$XfIY**@&K$AN`px~+Z!Razo*t#6`rDe~5_r0-AM(b>6 zn!Yqhg6{~VkDPA->j*gte{KLZ3XW#~ qx&NQE z?MP~Hp65_!G~L4urw0S7j{03sA`fT^QaD5sz2Zb40Jp|sfqTdjYC=BV uny zp?^CDo=}L*xbFDitt9O)U{spbq5?_ein22lyIpiY`*cG#;v?p)n*KcaWg!K0JnXzj z(?#v&jG3lW)dLr|_RhPxn#!#bPC9(x$P-Wdh&`nUo^ooz@A`n~J>%AWim+*@v#1ef zlz6 Dgb1O@N&mZrc^0A-7y1k6=88k9yMz z@t5=j6WmVes2F8$L|?^!)*(%o6V55wd{% mM|!jQ ziD$emYZgRh3XuOpRV}gECY5{sI`70CMA0+Q`3i)0Cs=3+C9~=(n7|-HKH37>>J9{0 zgA~PlptXMf6(|;2VBE=xP_IL<0Br-U3`Bz)smF4j{)?>6ax#cP6<(gc!=AX)Hg+f0 z#xg!}gkas@Cmb2t!D(+O1RHjBo&p>vfgIM+#yF4;gO@1>tyv0Yso>}ppau>^amdvZ zg8JSoWIyJO3!(QY*`sxu&jMXu0ZLwGKxC;3Btz``DXX^@*l!Fhjmglz&i&iL@QCdG z(>$(&T&0uOf!NnyB%DvF<&>N|U-Xl!!?9k-2OeR;WVNLqDtHxcZ3p8iTU1(ha!@&D z>54av<92MP`&pi64A@dwMGpi!lE6w9JO-Ia_TjX|_Wl<`(EU-Seud{mqRBrMMmff{ zlJx}RuU9HA`Ri<*>O~Zd6D%aqv$UUMy*Rop@G(C2s@>Lys}{)ejfNYRU1V4)p7f(a zXZnGJ`amcAB0?wv{-{t3C9FyX`WZWr|9bu+@x3iL*o?-af2$qVbagDK*6fSDC|=bu zdxI?dX~DomtNre1E_d-}&{1Hi35@f#=D#;Jwwcv234I3^IW-R&&7AlyGT@HK4w+pw zu2k*@{|Y%TJB;2Q%mBW7477I}T5;ktDiJ0Y%9KQVy*$#^C0$@)_&{-4Eo7>BmwLX6 zM6a5pFE(kZ9_y$W%MG%EKvwb)fw@;Ps6G8)O_JK_b>z8cfUJ!F6LEDj1d*BkVhaw0 z47m4T2itVya>B@sz>#Z=k=XQ0am`Z$e-!pHN8%$3rTjvr3a<{NhKY!08h^hp|Go(s zx=o@%Nd?cXD7>eQZhxV156}Bs)cuTweLu=gAdfCqxX7++9we7M91|RK5FZ0T27Ih0 zEU;StX%*Pq(-w1PPhBq>H?;e}MKbSYZgStA)v_;CV9M^67I3{gOK-j5V`ZgV>!l9` zoUnY_*+iUwDmat{){5tycHmddbF_otkUYrNFG^)gn^c#pyjR!ndgVCufv*OoRr8rd zN3CK9($1_wsY_7x8)3IuM{^PP8aK>fhRU>pOkBI{z~vl-Sn1Yyx#O6K&aGgcF6+=E z> kC(`wrvneP+T=3CtY=FUP}N^W;h~I3`+k#}d$f!olLFnY{&&`b%C^ z&3y+UDLFVz6DRc}`AvMcN98s0+&pDKZr0i-`aDcFa(I_;&6)+mlKIc6`~_!KcD|!i z{jHPF%#}Irj**i)L49PB!?GJrfeG36{GkV`u^{25lLeB<;&Z3listk3Xu!+Xg3mVD zm`%N19=ih?Z$}_H_xRU2%_FxmMlW={;6ylBV8`mts}*<~35dR7Vne}|&VuOV`sN_@ zu62}R%T(e}{WTxwc;~LfEOc^Z1V&-{FOB{VrgM_|S*=l?mPF%co_sD%F8ONgbb#x~ z&Su&$_&u7Y^JiZum5|oECx3vMLJ-p-m%DV=(9HUQqaky?$guDJ<0qhS!@Ic~-dd-- zXF5l<9Tevl8J}g3&9WENNIr9Q+|mVxxkV|71N|ms)OfU6B6?Du0N&z-K&cJT5|{j* z1MM=>BKxXa7ze$$Kv);HIL)-oh%l|$dOY}dpBqdx4;$XObglfx8vYmMqRlB|1)fy- zy~*!?IlC)*d)j)pjJP_G&5JDetCVLI3WSNfn2H^0H`YHsNNO_C*ihO+nh-wEMi
4n3+TwUh-4yu+5} zL_+~Kl{$SJp(G=Hqt>dk-IV5UV{qZy*Fkxtx?io^zpZtYeXjjqa()d-txlXD8tQr6 zB44-9GrUp%qyx`w3Jkt`;Ieo}Q=Pg3-{7ET7wWjdp`}2l3o+=HDe;~N@vbiCPj9*r zL0t)!TM{|HoXQ^+!(XohgJsW8tSL}Z_q`=yjac5jF0tGH<-beC@(Y5^9&leifE)ze zTOz-;LSNT=0NObUqR|Y8tF#J>I3u*2vR|X?wZPIgc;R?t;g`o>rrtVz!0tdBQ1FGQe44AUsN}&-1nd8Gvzg*U#i-rl=SA6BrR9UzN*w_ zLawXmbGpdW4tqVUL=D1)#^>0Cp&V;L;5>j`;9l*%y{BJ3wV7x%^i`p*P$AloLqV)9 zElHS_RTDO&N crb5dOou&?K{0o+z}cv&D~yI8I2 Aa~Jb!a} z^3INXQxj(*h&wF%Nd1poIo-${uQ}exI?z-I(!s$f>tK6vk*S1d`o!wFL+-t!`yOu= zzs?w)QZwXXTwi_l=JS99W87o3NIkUXjUO)IeRoISbAvk}DsjxA+%gsXE35^jr~IONXKyd0Olz8^Hl`z%udkGc{Qhti)J+&Nz3~Ov zuy?T{a`>V&mZkt|2&)q9)z@Li5N@!0X$j@`V#~Zc4-8(ga3X>Kk=N-K-TnK3%H-<# z*2c2$dkc0{g98$ZuZPuO9qa7O4|6$)uvPs99_rx0$#8H{7p17y-sLCJq>VHOSu~p% ze7ic>f>m8veJVBpT`8$4oYM8_u4x}ZY&zw8_HhHIP5(E*=gAzm#Mi+FULf81{K`&n zkHIj8Mk1~|-9CY=uR?V^fY&wD{qVOCrNRzL;Poy%YrAB~w-(W^WcKaOL#u%;cc yT2}Ikpnbc(a0`1 z%=rl(ic-`mew<6ZyENbJFN6kn0?RWQw7?W;T*}btlI?lm?fEITSFO$C&;O17XYG4% z5&ODM-pR>fv1Qf0?HLe1hH2cV8aMa9JpFo1ruc5haEakn@8}omBQSh^58oZS>&+|W zptApc#sRk8DO%FdZRNho1aY}BeC8bmIIAvc4W8}A%-C*4y`e$3m&Ll5zcV{}UA@dX zU(}~gRBJc{YpzgCB(vUDM0{KSi&r5YzlvOapcDbRg+6|HKG$+SKA)zGjBga^^8RQs zV@>Y@c&Wr$%C>j=YvJ4`lUQM=s)AWm|5TtWbG7K`_F~+wb0c|X_jOx8txka&sghN8 ztx9$_yrP0b%*$pQ^6WBoP1A0PvCK7g*2qrqx*I7&1pLQ_fByi)i-`36!n051QXC## z4^Z1~0r|S@6r?#^E{iw3kstJ&v%MX V04X+dw{^y$>@-&5$+bMnCw?4vRogLWZZSCv>J=KN`0w9A93OBQt8Foe4 $0>X|-ki)I|g?J|lK`SB-gAxg#%^OwSefk{O)6SHb;Qgm2~4^#;^@r-oHBqVcjv z@s3EpWG$3!BK%};qL0{w`w4#XQx8?Vc(dSwG5ym@(AE1#ihB<~!yaC!{rH^li8|vc zdua6{qEg?2v0nRO`F3yjZBN=>oA=kscW*ti{rGGHKEC%ycbr8yxUAy#$*-TT?JLp7 zW%Kmh_q2@@9~kPH?mn7bTq2Jaor@ q{!d#)G(e5c#4cV{`3to; z(h