diff --git a/docs/assets/model_evaluation/intake_example.png b/docs/assets/model_evaluation/intake_example.png index ab033c4f5..23e47f110 100644 Binary files a/docs/assets/model_evaluation/intake_example.png and b/docs/assets/model_evaluation/intake_example.png differ diff --git a/docs/assets/terminal_animation_switch_active.png b/docs/assets/terminal_animation_switch_active.png new file mode 100644 index 000000000..c47e28535 Binary files /dev/null and b/docs/assets/terminal_animation_switch_active.png differ diff --git a/docs/assets/terminal_animation_switch_inactive.png b/docs/assets/terminal_animation_switch_inactive.png new file mode 100644 index 000000000..9cc9d8997 Binary files /dev/null and b/docs/assets/terminal_animation_switch_inactive.png differ diff --git a/docs/community_resources/community_med/community_data_processing.md b/docs/community_resources/community_med/community_data_processing.md index 2f40edbfc..2a5135fe6 100644 --- a/docs/community_resources/community_med/community_data_processing.md +++ b/docs/community_resources/community_med/community_data_processing.md @@ -1,97 +1,168 @@ # Community Processing Data Processing Tools - - - -## Tools - -### Kerchunk - -[**Documentation**][kerchunk-doc] | -[**Sources**][kerchunk-source] - -Kerchunk is a library that provides a unified way to represent a variety of chunked, compressed data formats (e.g. NetCDF/HDF5, GRIB2, TIFF, …), allowing efficient access to the data from traditional file systems or cloud object storage. It also provides a flexible way to create virtual datasets from multiple files. - -### CMOR3 - -*Climate Model Output Rewriter Version 3* - -[**Documentation**][cmor3-doc] | -[**Sources**][cmor3-source] - -CMOR is used to produce CF-compliant netCDF files. The structure of the files created by CMOR and the metadata they contain fulfill the requirements of many of the climate community’s standard model experiments (which are referred to here as “MIPs” and include, for example, AMIP, PMIP, APE, and IPCC scenario runs). - -### xMIP - -[**Documentation**][xmip-doc] | -[**Tutorial on NCI**][xmip-tutorial] | -[**Sources**][xmip-source] - -This package facilitates the cleaning, organization and interactive analysis of Model Intercomparison Projects (MIPs) within the Pangeo software stack. - -### APP4 (The ACCESS Post Processor) - -[**Documentation**][APP4-doc] | -[**Sources**][APP4-source] - -The APP4 is a CMORisation tool designed to convert ACCESS model output to ESGF-compliant formats, primarily for publication to CMIP6. The code was originally built for CMIP5, and was further developed for CMIP6-era activities. -Uses CMOR3 and files created with the CMIP6 data request to generate CF-compliant files according to the CMIP6 data standards. - -### ACCESS-Archiver - -[**Documentation**][ACCESS-Archiver-doc] | -[**Sources**][ACCESS-Archiver-source] - -The ACCESS Archiver is designed to archive model output from ACCESS simulations. It's focus is to copy ACCESS model output from its initial location to a secondary location (typically from `/scratch` to `/g/data`), while converting UM files to netCDF, compressing MOM/CICE files, and culling restart files to 10-yearly. Saves 50-80% of storage space due to conversion and compression. - -### Synda - -synda is a command line tool to search and download files from the Earth System Grid Federation (ESGF) archive. - -### FluxnetLSM - -[**Citation** [@Ukkola2017]][fluxnetlsm-cite] | -[**Sources**][fluxnetlsm-source] - -R package for post-processing FLUXNET datasets for use in land surface modelling. Performs quality control and data conversion of FLUXNET data and collated site metadata. Supports FLUXNET2015, La Thuile, OzFlux and ICOS data releases. - -### Metpy - -https://unidata.github.io/MetPy/latest/examples/formats/index.html - -[**Documentation**][metpy_docu] | -[**Sources**][metpy_docu-source] - -MetPy is a collection of tools in Python for reading, visualizing, and performing calculations with weather data. MetPy supports Python >= 3.8 and is freely available under a permissive open source license. - -Format types are: GINI Water Vapor Imagery, NEXRAD Level 3 File, and NEXRAD Level 2 File. - -### xskillscore - -[**Documentation**][xskillscore-doc] | -[**Sources**][xskillscore-source] - -xskillscore is a Python library for computing a wide variety of skill metrics. Its typical application is to verify deterministic and probabilistic forecasts relative to observations. - -## Analysis blogposts and tutorials - -[Accessing NetCDF and GRIB file collections as cloud-native virtual datasets using Kerchunk, Peter March, Sep 2022](https://medium.com/pangeo/accessing-netcdf-and-grib-file-collections-as-cloud-native-virtual-datasets-using-kerchunk-625a2d0a9191) - - -[kerchunk-doc]: https://fsspec.github.io/kerchunk/ -[kerchunk-source]: https://github.com/fsspec/kerchunk -[APP4-doc]: https://github.com/ACCESS-Hive/APP4 -[APP4-source]: https://github.com/ACCESS-Hive/APP4 -[ACCESS-Archiver-doc]: https://github.com/ACCESS-Hive/ACCESS-Archiver -[ACCESS-Archiver-source]: https://github.com/ACCESS-Hive/ACCESS-Archiver -[xskillscore-doc]: https://xskillscore.readthedocs.io/en/stable/ -[xskillscore-source]: https://github.com/xarray-contrib/xskillscore -[fluxnetlsm-source]: https://github.com/aukkola/FluxnetLSM -[fluxnetlsm-cite]: https://gmd.copernicus.org/articles/10/3379/2017/ -[metpy_docu]: https://unidata.github.io/MetPy/latest/examples/formats/index.html -[metpy_docu-source]: https://github.com/Unidata/MetPy -[cmor3-doc]: https://cmor.llnl.gov/ -[cmor3-source]: https://github.com/PCMDI/cmor -[xmip-doc]: https://cmip6-preprocessing.readthedocs.io/en/latest/?badge=latest -[xmip-source]: https://github.com/jbusecke/xMIP -[xmip-tutorial]: https://github.com/coecms/xmip_nci +???+ danger "Support Level: NOT supported by ACCESS-NRI" + Here, we collate lists of useful tools for Model Evaluation and Diagnostics (MED). Contrary to the supported content of our [ACCESS-NRI Model Evaluation pages](../../model_evaluation/index.md), the information below is not supported by ACCESS-NRI unless stated otherwise. + +Please let us know, if we are missing an important tool. See [How To Contribute](../../contribute/index.md) to get in touch. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+

Dataset

+
+
+
+

Description

+
+
+
+ CMOR3
(Climate Model Output Rewriter Version 3)
+
+
+
+ CMOR is used to produce CF-compliant netCDF files. The structure of the files created by CMOR and the metadata they contain fulfill the requirements of many of the climate community’s standard model experiments (which are referred to here as “MIPs” and include, for example, AMIP, PMIP, APE, and IPCC scenario runs). +
+ Documentation | + Source Code +
+
+
+ APP4 (The ACCESS Post Processor) +
+
+
+ The APP4 is a CMORisation tool designed to convert ACCESS model output to ESGF-compliant formats, primarily for publication to CMIP6. The code was originally built for CMIP5, and was further developed for CMIP6-era activities. It uses CMOR3 and files created with the CMIP6 data request to generate CF-compliant files according to the CMIP6 data standards. +
+ Documentation | + Source Code +
+
+
+ ACCESS-Archiver +
+
+
+ The ACCESS Archiver is designed to archive model output from ACCESS simulations. It's focus is to copy ACCESS model output from its initial location to a secondary location (typically from `/scratch` to `/g/data`), while converting UM files to netCDF, compressing MOM/CICE files, and culling restart files to 10-yearly. Saves 50-80% of storage space due to conversion and compression. +
+ Documentation | + Source Code +
+
+
+ Kerchunk +
+
+
+ Kerchunk is a library that provides a unified way to represent a variety of chunked, compressed data formats (e.g. NetCDF/HDF5, GRIB2, TIFF, …), allowing efficient access to the data from traditional file systems or cloud object storage. It also provides a flexible way to create virtual datasets from multiple files. + Read this blogpost on how to access NetCDF and GRIB file colletions with Kerchunk. +
+ Documentation | + Source Code +
+
+
+ xMIP +
+
+
+ This package facilitates the cleaning, organization and interactive analysis of Model Intercomparison Projects (MIPs) within the Pangeo software stack. +
+ Documentation | + Source Code | + Tutorial +
+
+
+ esgpull and synda +
+
+
+ esgpull and synda are command line tools to search and download files from the Earth System Grid Federation (ESGF) archive. esgpull is a tool that simplifies usage of the ESGF Search API for data discovery, and manages procedures related to downloading and storing files from ESGF. +
+ Documentation | + Source Code (esgpull) | + Source Code (synda) +
+
+
+ FluxnetLSM +
+
+
+ R package for post-processing FLUXNET datasets for use in land surface modelling. Performs quality control and data conversion of FLUXNET data and collated site metadata. Supports FLUXNET2015, La Thuile, OzFlux and ICOS data releases. +
+ Documentation | + Source Code +
+
+
+ MetPy +
+
+
+ MetPy is a collection of tools in Python for reading, visualizing, and performing calculations with weather data. Format types are GINI Water Vapor Imagery, NEXRAD Level 3 File, and NEXRAD Level 2 File. +
+ Documentation | + Source Code +
+
+
+ xskillscore +
+
+
+ xskillscore is a Python library for computing a wide variety of skill metrics. Its typical application is to verify deterministic and probabilistic forecasts relative to observations. +
+ Documentation | + Source Code +
+
\ No newline at end of file diff --git a/docs/community_resources/community_med/community_med_recipes.md b/docs/community_resources/community_med/community_med_recipes.md index 24911e44b..1e5226ed6 100644 --- a/docs/community_resources/community_med/community_med_recipes.md +++ b/docs/community_resources/community_med/community_med_recipes.md @@ -1,6 +1,7 @@ # Community Model Evaluation and Diagnostics (MED) Recipe Gallery - +???+ danger "Support Level: NOT supported by ACCESS-NRI" + Here, we collate lists of useful resources for Model Evaluation and Diagnostics (MED). Contrary to the supported content of our [ACCESS-NRI Model Evaluation pages](../../model_evaluation/index.md), the information below is not supported by ACCESS-NRI unless stated otherwise. We are trying to ingest more and more model evaluation and diagnostics recipes in your currated [recipe gallery on this website](../../model_evaluation/model_evaluation_recipe_gallery.md). While this is a continous effort, this site is intented for a list of model evaluation and diagnostics recipes that are not (yet) ingested but may be interesting for the community: @@ -379,4 +380,4 @@ IOMB uses the same code base as the International Land Model Benchmarking (ILAMB - \ No newline at end of file +
\ No newline at end of file diff --git a/docs/community_resources/community_med/community_model_catalogs.md b/docs/community_resources/community_med/community_model_catalogs.md index 0870c9dcb..fda8d85f8 100644 --- a/docs/community_resources/community_med/community_model_catalogs.md +++ b/docs/community_resources/community_med/community_model_catalogs.md @@ -1,43 +1,34 @@ # Community Model Data Catalogs -We are trying to ingest more and more model data catalogs in your currated [catalog on this website](../../model_evaluation/model_evaluation_model_catalogs/model_evaluation_search_models.md). While this is a continous effort, this site is intented for a list of additional model data catalogs that are not (yet) ingested but are recommended by us or may be interesting for the community: +???+ danger "Support Level: NOT supported by ACCESS-NRI" + Here, we collate lists of useful resources for Model Evaluation and Diagnostics (MED). Contrary to the supported content of our [ACCESS-NRI Model Evaluation pages](../../model_evaluation/index.md), the information below is not supported by ACCESS-NRI unless stated otherwise. - + +Please let us know, if we are missing an important catalogue. See [How To Contribute](../../contribute/index.md) to get in touch. + +
- - - - - @@ -48,19 +39,12 @@ We are trying to ingest more and more model data catalogs in your currated [cata CLEX NCI Data Collection Intake Catalogue - - @@ -71,60 +55,35 @@ We are trying to ingest more and more model data catalogs in your currated [cata Australia Climate Data Guide Catalogue - - - - - - - - @@ -135,77 +94,24 @@ We are trying to ingest more and more model data catalogs in your currated [cata FLUXNET - - - - - - - - - - - - + - - - -
-

Model Catalog

+

Dataset

-
-

Comp.

-
-
+

Description

NCI datasets
-
- -
-
+
- - NCI has an extensive catalog of datasets of interest to the weather and climate community. These datasets are directly available on the NCI supercomputer and the [Australian Research Environment](https://opus.nci.org.au/display/Help/ARE+User+Guide) - + NCI has an extensive catalog of datasets of interest to the weather and climate community. These datasets are directly available on the NCI supercomputer and the Australian Research Environment.
+
- -
-
-
- - This is an Intake catalogue maintained by the ARC Centre of Excellence for Climate Extremes [(CLEX)](https://climateextremes.org.au/). + This is an intake catalogue maintained by the ARC Centre of Excellence for Climate Extremes CLEX. Only datasets from the NCI Catalog are referenced. The catalogue is available in intake's default catalogue list in the CLEX Conda environment. - Two notebooks are provided in the docs folder showing how to access the ERA5 and CIP6 datasets. - + Two notebooks are provided in the docs folder showing how to access the ERA5 and CMIP6 datasets.
-
- -
-
+
- - *A one-stop catalogue to discover Climate Data in Australia* The ACDG portal is a metadata portal listing climate research resources available in Australia from multiple data repositories. - This is a community based project managed by the ACDG Single Access working group. This is a group of Australian climate community self-nominated representatives. Anyone is welcome to join the group or to contribute independently to the metadata portal the group is developing. -
Australian Ocean Data Network
+
- -
-
-
- - The Australian Ocean Data Network (AODN) is an interoperable online network of marine and climate data resources. IMOS and the 6 Australian Commonwealth agencies ([see AODN Partners](https://imos.org.au/facilities/aodn/aodn-data-management/aodn-partners)) form the core of the AODN. Increasingly, though, universities and State government offices are offering up data resources to the AODN, and delivery of data to the AODN is being written in to significant research programs e.g. [National Environmental Science Program Marine Biodiversity Hub](http://www.nespmarine.edu.au/) and the [Great Australian Bight research program](http://www.misa.net.au/GAB). - + The Australian Ocean Data Network (AODN) is an interoperable online network of marine and climate data resources.
Intake-Ilamb Catalog
-
- -
-
+
- - The Intake-Ilamb catalog provides an yaml-style intake catalog of the reference data used for ESM model benchmarking in the International Land Model Benchmarking [(ILAMB)](https://www.ilamb.org/) effort. - + The Intake-Ilamb catalog provides an yaml-style intake catalog of the reference data used for ESM model benchmarking in the International Land Model Benchmarking (ILAMB) effort.
+
- -
-
-
- - FLUXNET is an international “network of networks,” tying together regional networks of earth system scientists. FLUXNET scientists use the eddy covariance technique to measure the cycling of carbon, water, and energy between the biosphere and atmosphere. Scientists use these data to better understand ecosystem functioning, and to detect trends in climate, greenhouse gases, and air pollution. - -
-
-
- CEDA Archive -
-
-
- -
-
-
- - The CEDA Archive forms part of NERC's Environmental Data Service (EDS) and is responsible for looking after data from atmospheric and earth observation research. They host over 18 Petabytes of data from climate models, satellites, aircraft, met observations, and other sources. - -
-
-
- OZFlux -
-
-
- -
-
-
- - OzFlux is an ecosystem research network set up to provide Australian, New Zealand and global ecosystem modelling communities with consistent observations of energy, carbon and water exchange between the atmosphere and key Australian and New Zealand ecosystems. - + FLUXNET scientists use the eddy covariance technique to measure the cycling of carbon, water, and energy between the biosphere and atmosphere.
Australian Community Reference Climate Data Collection
-
- -
-
+
- - This collection is a collaborative effort between the Australian Climate Service (ACS), ARC Centre of Excellence for Climate Extremes (CLEX) and the wider Australian climate research community to re-establish and maintain a reference dataset collection at NCI. - An [intake-esm catalogue](https://github.com/aus-ref-clim-data-nci/acs-replica-intake) is also available to facilitate data access. - + This dataset is available as intake-esm catalogue.
\ No newline at end of file +
\ No newline at end of file diff --git a/docs/community_resources/community_med/community_observational_catalogs.md b/docs/community_resources/community_med/community_observational_catalogs.md index 6b7b02a7e..3d5f9a435 100644 --- a/docs/community_resources/community_med/community_observational_catalogs.md +++ b/docs/community_resources/community_med/community_observational_catalogs.md @@ -1,45 +1,63 @@ # Community Observational Data Catalogs -We are trying to ingest more and more model data catalogs in your currated [catalog on this website](../../model_evaluation/model_evaluation_model_catalogs/model_evaluation_search_models.md). While this is a continous effort, this site is intented for a list of additional model data catalogs that are not (yet) ingested but are recommended by us or may be interesting for the community: +???+ danger "Support Level: NOT supported by ACCESS-NRI" + Here, we collate lists of useful resources for Model Evaluation and Diagnostics (MED). Contrary to the supported content of our [ACCESS-NRI Model Evaluation pages](../../model_evaluation/index.md), the information below is not supported by ACCESS-NRI unless stated otherwise. - +Please let us know, if we are missing an important catalogue. See [How To Contribute](../../contribute/index.md) to get in touch. + +
- + + + + - - - - + + + + @@ -47,29 +65,27 @@ We are trying to ingest more and more model data catalogs in your currated [cata - - + + + + -
-

Data Catalog

+

Dataset

+
-

Comp.

+

Description

+
+
+
+ Copernicus Climate Change Service (C3S) Data Store (CDS)
+
-

Description

+ The Copernicus Climate Change Service (C3S) combines observations of the climate system with the latest science to develop authoritative, quality-assured information about the past, current and future states of the climate in Europe and worldwide. C3S data is provided via its Climate Data Store (CDS). + You can search its available datasets via this interface. + You can use the CDS API as well as command line tools to download data. To download ERA5 from CDS, you can use for example this era5cli command line tool.
- Copernicus Climate Change Service (C3S) Data Store (CDS) + Catalogue Search at CEDA (Centre for Environmental Data Analysis)
+
- + The CEDA (Centre for Environmental Data Analysis) Archive hosts atmospheric and earth observation data. + It provids an interactive Catalogue Search and Tools for downloading data. + It holds environmental data related to atmospheric and earth observation fields, such as Climate, Compisition, Observations, Numerical Weather Predictions, Airborne or Satellite data and imagery.
+
+
+ NERC's Environmental Data Service (EDS) +
+
- - The Copernicus Climate Change Service (C3S) combines observations of the climate system with the latest science to develop authoritative, quality-assured information about the past, current and future states of the climate in Europe and worldwide. C3S data is provided via its Climate Data Store (CDS). - You can search its available datasets via this interface. - You can use the CDS API as well as command line tools to download data. To download ERA5 from CDS, you can use for example this era5cli command line tool. - + The range of data held by the Environmental Data Service (EDS) is vast, covering all aspects of environmental science: atmosphere, climate and earth observation, geoscience, marine, polar and cryosphere, terrestrial and freshwater
- Catalogue Search at CEDA (Centre for Environmental Data Analysis) + CEDA Archive
+
- + The CEDA Archive forms part of NERC's Environmental Data Service (EDS) and is responsible for looking after data from atmospheric and earth observation research. They host over 18 Petabytes of data from climate models, satellites, aircraft, met observations, and other sources.
+
- - The CEDA (Centre for Environmental Data Analysis) Archive hosts atmospheric and earth observation data. - It provids an interactive Catalogue Search and Tools for downloading data. - It holds environmental data related to atmospheric and earth observation fields. Our remit covers the following areas (see linked examples to some of our most popular datasets): - - Climate - e.g. HadUK Grid, CMIP, CRU
- - Composition - e.g. CCI
- - Observations - e.g. MIDAS Open
- - Numerical weather prediction - e.g. Met Office NWP
- - Airborne - e.g. FAAM
- - Satellite data and imagery - e.g. Sentinel - + OZFlux +
+
+
+ OzFlux is an ecosystem research network set up to provide Australian, New Zealand and global ecosystem modelling communities with consistent observations of energy, carbon and water exchange between the atmosphere and key Australian and New Zealand ecosystems.
\ No newline at end of file +
\ No newline at end of file diff --git a/docs/community_resources/community_med/index.md b/docs/community_resources/community_med/index.md index 03e92ddb3..af9801fda 100644 --- a/docs/community_resources/community_med/index.md +++ b/docs/community_resources/community_med/index.md @@ -1,6 +1,7 @@ # Community Model Evaluation and Diagnostics Links - +???+ danger "Support Level: NOT supported by ACCESS-NRI" + Here, we collate lists of useful resources for Model Evaluation and Diagnostics (MED). Contrary to the supported content of our [ACCESS-NRI Model Evaluation pages](../../model_evaluation/index.md), the information below is not supported by ACCESS-NRI unless stated otherwise.
diff --git a/docs/css/access-nri.css b/docs/css/access-nri.css index 4a1b8fbed..da723bc00 100644 --- a/docs/css/access-nri.css +++ b/docs/css/access-nri.css @@ -24,7 +24,7 @@ --tab-text-color: 235, 235, 235; /* Color for text of top tab and back to top button */ --tab-text: rgb(var(--tab-text-color)); /* Main text in navigation tab */ --tab-text-light: rgba(var(--tab-text-color),.7); /* Main text in navigation tab inactive */ - --default-bg-color: 46, 51, 62; /* Color for main background */ + --default-bg-color: 53, 54, 58; /* Color for main background */ --md-default-bg-color: rgb(var(--default-bg-color)); /* Main background */ --md-default-bg-color--light: rgba(var(--default-bg-color),.7); --md-default-bg-color--lighter: rgba(var(--default-bg-color),.3); @@ -38,8 +38,8 @@ --md-accent-fg-color: var(--nri-blue); /* link text hover */ --md-accent-fg-color--transparent: rgba(var(--nri-blue-color),.05); /* navigation bar little arrows hover */ --md-accent-bg-color: rgb(var(--tab-text-color)); /* back to top button text hover */ - --md-code-fg-color: rgb(213, 217, 226); /* code element text */ - --md-code-bg-color: #242428; /* code element background */ + --md-code-fg-color: var(--md-default-fg-color); /* code element text */ + --md-code-bg-color: rgb(41, 41, 41); /* code element background */ --md-code-hl-color: rgba(255,255,0,.5); --md-code-hl-number-color: #d52a2a; --md-code-hl-special-color: #db1457; @@ -76,9 +76,11 @@ --card-shadows-hover: #00000090; /* Shadows hover on cards and other elements */ --white-background: rgb(255, 255, 255); /* Background for transparent images */ --darker-background-hover: rgba(28, 28, 28, 0.185); /* Darker background on hover */ - --terminal-animation-directory: var(--nri-green); - --terminal-animation-buttons: var(--nri-orange); - --terminal-animation-buttons-hover: var(--nri-blue); + --animated-terminal-directory: var(--nri-green); + --animated-terminal-buttons: var(--nri-orange); + --animated-terminal-buttons-hover: var(--nri-blue); + --animated-terminal-text: rgb(235, 235, 235); + --animated-terminal-background: var(--md-primary-fg-color); --note: var(--card-borders); /* Note border and icon */ --note-bg: rgba(var(--nri-orange-color),.05); /* Note background */ } @@ -154,9 +156,11 @@ --card-shadows-hover: #00000090; /* Shadows hover on cards and other elements */ --white-background: rgb(255, 255, 255); /* Background for transparent images */ --darker-background-hover: rgba(28, 28, 28, 0.185); /* Darker background on hover */ - --terminal-animation-directory: var(--nri-dark-blue); - --terminal-animation-buttons: var(--nri-orange); - --terminal-animation-buttons-hover: var(--nri-blue); + --animated-terminal-directory: var(--nri-dark-blue); + --animated-terminal-buttons: var(--nri-orange); + --animated-terminal-buttons-hover: var(--nri-blue); + --animated-terminal-text: rgb(235, 235, 235); + --animated-terminal-background: var(--md-primary-fg-color); --note: var(--card-borders); /* Note border and icon */ --note-bg: rgba(var(--nri-orange-color),.05); /* Note background */ } @@ -648,28 +652,28 @@ pre:has(code):hover > button { /* =============================================================== Terminal animations */ -::part(terminal-container) { - background-color: var(--md-code-bg-color); - color: var(--md-code-fg-color); +::part(terminal-window) { + background-color: var(--animated-terminal-background); + color: var(--animated-terminal-text); font-family: var(--md-code-font-family); font-weight: unset; } ::part(input-character) { - color: var(--terminal-animation-buttons); + color: var(--animated-terminal-buttons); } ::part(directory) { - color: var(--terminal-animation-directory); + color: var(--animated-terminal-directory); } -::part(fast-button), ::part(restart-button) { - color: var(--terminal-animation-buttons); +::part(fast-button), ::part(restart-button), ::part(img-icon) { + color: var(--animated-terminal-buttons); font-weight: 700; } -::part(fast-button):hover, ::part(restart-button):hover { - color: var(--terminal-animation-buttons-hover); +::part(fast-button):hover, ::part(restart-button):hover, ::part(img-icon):hover { + color: var(--animated-terminal-buttons-hover); } /* Try to format like the output of `ls` command */ @@ -678,6 +682,15 @@ pre:has(code):hover > button { word-break: normal; } +#terminalSwitch { + float: right; + height: 1.1rem; + margin: 0.5rem 0.2rem; +} + +#terminalSwitch:hover { + cursor: pointer; +} /* =============================================================== General styling for html tabs */ @@ -686,7 +699,6 @@ pre:has(code):hover > button { box-shadow: 0 -0.05rem var(--md-default-fg-color--lightest) inset; display: flex; width: fit-content; - /* max-width: 100%; */ overflow: auto; margin-top: 1em; } @@ -716,7 +728,7 @@ pre:has(code):hover > button { /* Create an active/current tablink class */ .tabLabels button.activeTab { color: var(--md-primary-fg-color--dark); - border-bottom: solid 2px var(--md-primary-fg-color--dark); + border-bottom: solid 2px var(--nri-orange); transition: border-bottom .2s; } diff --git a/docs/fontello/config.json b/docs/fontello/config.json index 837b85e9e..cf74dad9e 100644 --- a/docs/fontello/config.json +++ b/docs/fontello/config.json @@ -43,6 +43,20 @@ "search": [ "key" ] + }, + { + "uid": "7523e449ad0bd4432eec68980a7815da", + "css": "group-1", + "code": 59397, + "src": "custom_icons", + "selected": true, + "svg": { + "path": "M1342.9 0C1390.3 0 1428.6 38.3 1428.6 85.7V914.3C1428.6 961.7 1390.3 1000 1342.9 1000H85.7C38.3 1000 0 961.7 0 914.3V85.7C0 38.3 38.3 0 85.7 0ZM207.7 136.9C193.4 130 176.6 136.3 169.7 150.6 163.1 164.9 169.1 182 183.7 188.6L417.4 297.7 185.1 406C170.9 412.6 164.6 429.4 171.1 443.7 178 458 194.9 464.3 209.1 457.7L498 323.1C512.3 316.3 518.3 299.4 511.7 285.1 507.7 276.6 500 270.9 491.4 269.1ZM605.7 402.9C590 402.9 577.1 415.7 577.1 431.4 577.1 447.1 590 460 605.7 460H924.3C940 460 952.9 447.1 952.9 431.4 952.9 415.7 940 402.9 924.3 402.9Z", + "width": 1429 + }, + "search": [ + "group-1" + ] } ] } \ No newline at end of file diff --git a/docs/fontello/css/fontello-codes.css b/docs/fontello/css/fontello-codes.css index aeadfacab..c1a27db07 100644 --- a/docs/fontello/css/fontello-codes.css +++ b/docs/fontello/css/fontello-codes.css @@ -4,3 +4,4 @@ .icon-cc-by:before { content: '\e802'; } /* '' */ .icon-logout:before { content: '\e803'; } /* '' */ .icon-key:before { content: '\e804'; } /* '' */ +.icon-group-1:before { content: '\e805'; } /* '' */ diff --git a/docs/fontello/css/fontello-embedded.css b/docs/fontello/css/fontello-embedded.css index 87538f390..8b5493a39 100644 --- a/docs/fontello/css/fontello-embedded.css +++ b/docs/fontello/css/fontello-embedded.css @@ -1,15 +1,15 @@ @font-face { font-family: 'fontello'; - src: url('../font/fontello.eot?78506661'); - src: url('../font/fontello.eot?78506661#iefix') format('embedded-opentype'), - url('../font/fontello.svg?78506661#fontello') format('svg'); + src: url('../font/fontello.eot?56444611'); + src: url('../font/fontello.eot?56444611#iefix') format('embedded-opentype'), + url('../font/fontello.svg?56444611#fontello') format('svg'); font-weight: normal; font-style: normal; } @font-face { font-family: 'fontello'; - src: url('data:application/octet-stream;base64,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') format('woff'), - url('data:application/octet-stream;base64,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ASsjYTgtsD4ssAAWsBcjQrADJbACJUcjRyNhsABUWC4gPCMhG7ACJbACJUcjRyNhILAFJbAEJUcjRyNhsAYlsAUlSbACJWG5CAAIAGNjIyBYYhshWWO4BABiILAAUFiwQGBZZrABY2AjLiMgIDyKOCMhWS2wPyywABawFyNCILAKQyAuRyNHI2EgYLAgYGawAmIgsABQWLBAYFlmsAFjIyAgPIo4LbBALCMgLkawAiVGsBdDWFAbUllYIDxZLrEwARQrLbBBLCMgLkawAiVGsBdDWFIbUFlYIDxZLrEwARQrLbBCLCMgLkawAiVGsBdDWFAbUllYIDxZIyAuRrACJUawF0NYUhtQWVggPFkusTABFCstsEMssDorIyAuRrACJUawF0NYUBtSWVggPFkusTABFCstsEQssDsriiAgPLAGI0KKOCMgLkawAiVGsBdDWFAbUllYIDxZLrEwARQrsAZDLrAwKy2wRSywABawBCWwBCYgICBGI0dhsAwjQi5HI0cjYbALQysjIDwgLiM4sTABFCstsEYssQoEJUKwABawBCWwBCUgLkcjRyNhILAGI0KxDABCsAtDKyCwYFBYILBAUVizBCAFIBuzBCYFGllCQiMgR7AGQ7ACYiCwAFBYsEBgWWawAWNgILABKyCKimEgsARDYGQjsAVDYWRQWLAEQ2EbsAVDYFmwAyWwAmIgsABQWLBAYFlmsAFjYbACJUZhOCMgPCM4GyEgIEYjR7ABKyNhOCFZsTABFCstsEcssQA6Ky6xMAEUKy2wSCyxADsrISMgIDywBiNCIzixMAEUK7AGQy6wMCstsEkssAAVIEewACNCsgABARUUEy6wNiotsEossAAVIEewACNCsgABARUUEy6wNiotsEsssQABFBOwNyotsEwssDkqLbBNLLAAFkUjIC4gRoojYTixMAEUKy2wTiywCiNCsE0rLbBPLLIAAEYrLbBQLLIAAUYrLbBRLLIBAEYrLbBSLLIBAUYrLbBTLLIAAEcrLbBULLIAAUcrLbBVLLIBAEcrLbBWLLIBAUcrLbBXLLMAAABDKy2wWCyzAAEAQystsFksswEAAEMrLbBaLLMBAQBDKy2wWyyzAAABQystsFwsswABAUMrLbBdLLMBAAFDKy2wXiyzAQEBQystsF8ssgAARSstsGAssgABRSstsGEssgEARSstsGIssgEBRSstsGMssgAASCstsGQssgABSCstsGUssgEASCstsGYssgEBSCstsGcsswAAAEQrLbBoLLMAAQBEKy2waSyzAQAARCstsGosswEBAEQrLbBrLLMAAAFEKy2wbCyzAAEBRCstsG0sswEAAUQrLbBuLLMBAQFEKy2wbyyxADwrLrEwARQrLbBwLLEAPCuwQCstsHEssQA8K7BBKy2wciywABaxADwrsEIrLbBzLLEBPCuwQCstsHQssQE8K7BBKy2wdSywABaxATwrsEIrLbB2LLEAPSsusTABFCstsHcssQA9K7BAKy2weCyxAD0rsEErLbB5LLEAPSuwQistsHossQE9K7BAKy2weyyxAT0rsEErLbB8LLEBPSuwQistsH0ssQA+Ky6xMAEUKy2wfiyxAD4rsEArLbB/LLEAPiuwQSstsIAssQA+K7BCKy2wgSyxAT4rsEArLbCCLLEBPiuwQSstsIMssQE+K7BCKy2whCyxAD8rLrEwARQrLbCFLLEAPyuwQCstsIYssQA/K7BBKy2whyyxAD8rsEIrLbCILLEBPyuwQCstsIkssQE/K7BBKy2wiiyxAT8rsEIrLbCLLLILAANFUFiwBhuyBAIDRVgjIRshWVlCK7AIZbADJFB4sQUBFUVYMFktAEu4AMhSWLEBAY5ZsAG5CAAIAGNwsQAHQrEAACqxAAdCsQAKKrEAB0KxAAoqsQAHQrkAAAALKrEAB0K5AAAACyq5AAMAAESxJAGIUViwQIhYuQADAGREsSgBiFFYuAgAiFi5AAMAAERZG7EnAYhRWLoIgAABBECIY1RYuQADAABEWVlZWVmxAA4quAH/hbAEjbECAESzBWQGAERE') format('truetype'); + src: url('data:application/octet-stream;base64,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') format('woff'), + url('data:application/octet-stream;base64,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') format('truetype'); } /* Chrome hack: SVG is rendered more smooth in Windozze. 100% magic, uncomment if you need it. */ /* Note, that will break hinting! In other OS-es font will be not as sharp as it could be */ @@ -17,7 +17,7 @@ @media screen and (-webkit-min-device-pixel-ratio:0) { @font-face { font-family: 'fontello'; - src: url('../font/fontello.svg?78506661#fontello') format('svg'); + src: url('../font/fontello.svg?56444611#fontello') format('svg'); } } */ @@ -62,3 +62,4 @@ .icon-cc-by:before { content: '\e802'; } /* '' */ .icon-logout:before { content: '\e803'; } /* '' */ .icon-key:before { content: '\e804'; } /* '' */ +.icon-group-1:before { content: '\e805'; } /* '' */ diff --git a/docs/fontello/css/fontello-ie7-codes.css b/docs/fontello/css/fontello-ie7-codes.css index 34b550050..c77e063b0 100644 --- a/docs/fontello/css/fontello-ie7-codes.css +++ b/docs/fontello/css/fontello-ie7-codes.css @@ -4,3 +4,4 @@ .icon-cc-by { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-logout { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-key { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-group-1 { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } diff --git a/docs/fontello/css/fontello-ie7.css b/docs/fontello/css/fontello-ie7.css index b24cc4ead..48e033462 100644 --- a/docs/fontello/css/fontello-ie7.css +++ b/docs/fontello/css/fontello-ie7.css @@ -15,3 +15,4 @@ .icon-cc-by { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-logout { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } .icon-key { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } +.icon-group-1 { *zoom: expression( this.runtimeStyle['zoom'] = '1', this.innerHTML = ' '); } diff --git a/docs/fontello/css/fontello.css b/docs/fontello/css/fontello.css index e9de4108d..4416cd94a 100644 --- a/docs/fontello/css/fontello.css +++ b/docs/fontello/css/fontello.css @@ -1,11 +1,11 @@ @font-face { font-family: 'fontello'; - src: url('../font/fontello.eot?17104538'); - src: url('../font/fontello.eot?17104538#iefix') format('embedded-opentype'), - url('../font/fontello.woff2?17104538') format('woff2'), - url('../font/fontello.woff?17104538') format('woff'), - url('../font/fontello.ttf?17104538') format('truetype'), - url('../font/fontello.svg?17104538#fontello') format('svg'); + src: url('../font/fontello.eot?31780772'); + src: url('../font/fontello.eot?31780772#iefix') format('embedded-opentype'), + url('../font/fontello.woff2?31780772') format('woff2'), + url('../font/fontello.woff?31780772') format('woff'), + url('../font/fontello.ttf?31780772') format('truetype'), + url('../font/fontello.svg?31780772#fontello') format('svg'); font-weight: normal; font-style: normal; } @@ -15,7 +15,7 @@ @media screen and (-webkit-min-device-pixel-ratio:0) { @font-face { font-family: 'fontello'; - src: url('../font/fontello.svg?17104538#fontello') format('svg'); + src: url('../font/fontello.svg?31780772#fontello') format('svg'); } } */ @@ -59,3 +59,4 @@ .icon-cc-by:before { content: '\e802'; } /* '' */ .icon-logout:before { content: '\e803'; } /* '' */ .icon-key:before { content: '\e804'; } /* '' */ +.icon-group-1:before { content: '\e805'; } /* '' */ diff --git a/docs/fontello/demo.html b/docs/fontello/demo.html index c91c43b6a..7f4fec8c2 100644 --- a/docs/fontello/demo.html +++ b/docs/fontello/demo.html @@ -146,11 +146,11 @@ } @font-face { font-family: 'fontello'; - src: url('./font/fontello.eot?99954771'); - src: url('./font/fontello.eot?99954771#iefix') format('embedded-opentype'), - url('./font/fontello.woff?99954771') format('woff'), - url('./font/fontello.ttf?99954771') format('truetype'), - url('./font/fontello.svg?99954771#fontello') format('svg'); + src: url('./font/fontello.eot?94335739'); + src: url('./font/fontello.eot?94335739#iefix') format('embedded-opentype'), + url('./font/fontello.woff?94335739') format('woff'), + url('./font/fontello.ttf?94335739') format('truetype'), + url('./font/fontello.svg?94335739#fontello') format('svg'); font-weight: normal; font-style: normal; } @@ -228,6 +228,9 @@

fontello font demo

icon-key0xe804
+
+ icon-group-10xe805 +
diff --git a/docs/fontello/font/fontello.eot b/docs/fontello/font/fontello.eot index 773cfbaea..6a23a5a76 100644 Binary files a/docs/fontello/font/fontello.eot and b/docs/fontello/font/fontello.eot differ diff --git a/docs/fontello/font/fontello.svg b/docs/fontello/font/fontello.svg index 18a5b5b75..c61d1152d 100644 --- a/docs/fontello/font/fontello.svg +++ b/docs/fontello/font/fontello.svg @@ -15,6 +15,8 @@ + + diff --git a/docs/fontello/font/fontello.ttf b/docs/fontello/font/fontello.ttf index 8f0024dbf..01dcf0e86 100644 Binary files a/docs/fontello/font/fontello.ttf and b/docs/fontello/font/fontello.ttf differ diff --git a/docs/fontello/font/fontello.woff b/docs/fontello/font/fontello.woff index fdafe1d11..bbead1969 100644 Binary files a/docs/fontello/font/fontello.woff and b/docs/fontello/font/fontello.woff differ diff --git a/docs/fontello/font/fontello.woff2 b/docs/fontello/font/fontello.woff2 index 76c526f3c..1715e5efa 100644 Binary files a/docs/fontello/font/fontello.woff2 and b/docs/fontello/font/fontello.woff2 differ diff --git a/docs/getting_started/index.md b/docs/getting_started/index.md index 46c8e088e..7a0c8cc5e 100644 --- a/docs/getting_started/index.md +++ b/docs/getting_started/index.md @@ -29,6 +29,11 @@ Once you sign up, you will be assigned a username (e.g. `ab1234`).
## Join relevant NCI projects + +NCI is hosting a large amount of data for the climate community on its supercomputer Gadi. The access to this storage as well as to computing resources to run models and evaluate them is organised in *projects*. + +To be able to perform computations yourself, you need to join a project with computing resources. This project code will be provided by your supervisor, research project or institution. + To join a project, search for it on NCI website and request membership. Every project has an ID (e.g. `xp65`). This ID is what the term project actually refers to. @@ -41,16 +46,13 @@ There are several NCI projects that may be relevant to you, depending on the tas
Even though we recommend you have a chat with your supervisor to identify the relevant projects for your needs, the table below has a list of some useful climate-related projects at NCI: -| Project | Description | Group | +| Project | Description | Type | |:------- |:----------- |:----- | -| access | ACCESS software sharing | ACCESS | -| hh5 | Climate-LIEF Data Storage | Data output| -| oi10 | ESGF CMIP6 Replication Data | Data output| -| fs38 | ESGF CMIP6 Australian Data Publication | Data output| -| rt52 | ERA5 Replicated Data: Single and pressure-levels data | Data output| -| uc16 | ERA5 Replicated Datasets on Potential Temperature & Vorticity Levels | Data output| -| zz93 | ERA5-Land Replicated Data | Data output| -| qv56 | Reference Datasets for Climate Model Analysis/Forcing | Data output| +| xp65 | ACCESS-NRI code environments | ACCESS-NRI code environment | +| hh5 | Climate-LIEF code environment | Code environment | +| access | ACCESS software sharing | ACCESS code environment | +| ik11 | COSIMA shared working space | Data storage | +
## Log in to Gadi @@ -77,7 +79,7 @@ To log in to Gadi we use ssh <your-NCI-username>@gadi.nci.org.au <NCI-username>@gadi.nci.org.au's password: ############################################################################### @@ -93,7 +95,7 @@ You will be asked for your NCI password and then you will get connected to Ga =============================================================================== =============================================================================== - + ### Automate the log in step To simplify the log in step and avoid having to always insert your NCI password, there are a few steps we suggest you to follow: @@ -105,7 +107,7 @@ To simplify the log in step and avoid having to always insert your NCI password, To create an SSH key, in your machine's local terminal, run:
ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_gadi
You will be asked to create a passphrase linked to the SSH key, and insert it twice: - + ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_gadi Generating public/private rsa key pair. Enter passphrase (empty for no passphrase): @@ -125,7 +127,7 @@ To simplify the log in step and avoid having to always insert your NCI password, |xxxxxxxxxxxxxxxxx| |xxxxxxxxxxxxxxxxx| +----[SHA256]-----+ - +
We suggest you don't leave the passphrase empty for security reason.
@@ -151,20 +153,20 @@ To simplify the log in step and avoid having to always insert your NCI password,
  • In your machine's local terminal, start the ssh-agent by running:
    eval "$(ssh-agent -s)"
    - + eval "$(ssh-agent -s)" Agent pid <agent-PID> - +
  • Add your SSH key to the ssh-agent by running:
    ssh-add --apple-use-keychain ~/.ssh/id_gadi
    You will be asked for the SSH key passphrase, which will be stored inside the ssh-agent: - + ssh-add --apple-use-keychain ~/.ssh/id_gadi Enter passphrase for <$HOME>/.ssh/id_gadi: Identity added: <$HOME>/.ssh/id_gadi <$USER@hostname> - +
    If you are running a MacOS version prior to Monterey (12.0), the --apple-use-keychain flag needs to be substituted with -K.
    @@ -177,24 +179,25 @@ To simplify the log in step and avoid having to always insert your NCI password,
  • In your machine's local terminal, start the ssh-agent by running:
    eval "$(ssh-agent -s)"
    - + eval "$(ssh-agent -s)" Agent pid <agent-PID> - +
  • Add your SSH key to the ssh-agent by running:
    ssh-add ~/.ssh/id_gadi
    You will be asked for the SSH key passphrase, which will be stored inside the ssh-agent: - + ssh-add ~/.ssh/id_gadi Enter passphrase for <$HOME>/.ssh/id_gadi: Identity added: <$HOME>/.ssh/id_gadi <$USER@hostname> - +
  • +
  • Create/Update the SSH config file @@ -245,7 +248,7 @@ Alternatively, on Gadi you can run: exit from Gadi, and log back in.
    For example, if you want to change your default project to `tm70`, on Gadi, run: - + echo $PROJECT <old-default-project> sed "s/\(PROJECT \).*/\1tm70/" ~/.config/gadi-login.conf @@ -267,7 +270,7 @@ For example, if you want to change your default project to `tm70`, on Gadi=============================================================================== echo $PROJECT tm70 - +
    References
    diff --git a/docs/js/miscellaneous.js b/docs/js/miscellaneous.js index 6372dab82..2967770a4 100644 --- a/docs/js/miscellaneous.js +++ b/docs/js/miscellaneous.js @@ -1,3 +1,5 @@ +'use strict'; + // Add buttons at the top of each table column (when hovered) to sort it function sortTables() { let tables = document.querySelectorAll("article table:not([class])"); @@ -68,19 +70,90 @@ function tabFunctionality() { Add the external-link icon to
    tags with target="_blank" */ function addExternalLinkIcon() { - let extLinks = document.querySelectorAll("article a[target='_blank']:not(> img)"); + let extLinks = document.querySelectorAll("article a[target='_blank']:not(:has(img))"); extLinks.forEach(link => { link.classList.add('external-link'); }) } +/* + Add button to toggle terminal-animations for the whole page (next to the page title) +*/ +function toggleTerminalAnimations() { + if (document.querySelector('terminal-window')) { + let state; + + function applyState() { + let terminalWindows = document.querySelectorAll('terminal-window'); + if (state == 'active') { + terminalWindows.forEach(t => { + t.removeAttribute('static'); + }) + } else { + terminalWindows.forEach(t => { + t.setAttribute('static',""); + }) + } + } + + function getCookie() { + let cvalue = document.cookie.split(';') + .find(c => c.trim().startsWith('terminalState=')) + ?.split("=")[1]; + return cvalue; + } + + function setCookie() { + document.cookie = `terminalState=${state};path=/;max-age=2592000;samesite=lax`; // Expires after 1 month + } + + function toggleState(e) { + if (state == 'active') { + state='inactive' + } else { + state='active' + } + setCookie(); + location.reload(); + } + + let terminalStateCookie = getCookie(); + if (! terminalStateCookie) { + state = 'active'; + setCookie(); + } else { + state = terminalStateCookie; + } + applyState(); + let terminalAnimationsSwitch = document.createElement('img'); + let rootDir; + if (location.pathname.startsWith('/development_site')) { + rootDir = `${location.origin}/development_site`; + } else if (location.pathname.startsWith('/pr-preview')) { + rootDir = `${location.origin}${location.pathname.split('/').slice(0,3).join('/')}`; + } else { + rootDir = location.origin; + } + terminalAnimationsSwitch.setAttribute('src',`${rootDir}/assets/terminal_animation_switch_${state}.png`); + let current = state == 'active' ? 'enabled' : 'disabled'; + let onclick = state == 'active' ? 'disable' : 'enable'; + terminalAnimationsSwitch.setAttribute('title',`Terminal animations ${current}.\nClick to ${onclick} them.`); + terminalAnimationsSwitch.setAttribute('id','terminalSwitch'); + let h1 = document.querySelector('h1'); + h1.parentElement.insertBefore(terminalAnimationsSwitch, h1); + terminalAnimationsSwitch.addEventListener('click', toggleState, false); + } +} + + // Join all functions function main() { sortTables(); adjustScrollingToId(); tabFunctionality(); addExternalLinkIcon(); + toggleTerminalAnimations(); } // Run all functions diff --git a/docs/js/terminal_animation.js b/docs/js/terminal_animation.js deleted file mode 100644 index 4e23b4c4d..000000000 --- a/docs/js/terminal_animation.js +++ /dev/null @@ -1,1037 +0,0 @@ -/** - * terminal-animation components - * Components based on the animated terminal app 'termynal.js' by Ines Montani . - * - * @author Davide Marchegiani - * @version 1.0.0 - * - * The usage is as follow: - * - * - * First input line - * Second input line - * Third input with red span - * First output line - * - * - * The tag allows only and tags inside it. All the other nodes will be removed. - * E.g.: - * - * This line will be removed - * This line will be kept - *
    Also this line will be removed
    - *
    - * - * The tag allows only text nodes or tags inside it. All the other nodes will be removed. - * E.g.: - * All this line will be kept - * This will be kept but
    this will be removed
    - * - * The animation starts only when the terminal becomes visible, unless the 'init' - * attribute is present (in that case the animation starts right after the page loads). - * To know all the other possible attributes and what they do please read the specific components. - * - * - * List of sub-components editable with the CSS ::part pseudo-element: - * - Terminal Container -> ::part(terminal-container) - * - Fast Button -> ::part(fast-button) - * - Restart Button -> ::part(restart-button) - * - Directory -> ::part(directory) - * - Input Character(s) -> ::part(input-character) - * - Prompt Character(s) -> ::part(prompt-character) -*/ -'use strict'; - -function replaceTagSymbols(str) { - /** - * Replace HTML tag symbols '<' and '>' with HTML enities '<' and '>' - * for correct usage in directories, PS1, input/promp characters etc. - */ - return str?.replace('<','<').replace('>','>') -} - -const terminalTemplate = document.createElement('template'); -terminalTemplate.innerHTML = ` - - -
    - -
    -` -/* Terminal component */ -class TerminalAnimation extends HTMLElement { - /** - * Custom attributes for the component: - * - * @param {string} mode - 'light' for light mode; 'dark' for dark mode (default). - * @param {string} data - Type of prompt for each line of the entire terminal. Choices can be: - * - 'output': Output of the terminal. Written all at once; (default) - * - 'input': Input to the terminal. Written with typing animation after 'directory' and 'inputChar' attributes; - * - 'prompt': Same as input, but with written with typing animation after 'promptChar' attribute; - * - 'progress' Line with progress bar animation. - * @param {number || string} startDelay - Delay before the start of terminal animation, in ms. - * @param {number || string} lineDelay - Delay before the start of each terminal line animation, in ms. - * @param {number || string} typingDelay - Delay between each typed character in the terminal, in ms. - * @param {string} progressChar – Character(s) to use for progress bar for the entire terminal, defaults to █. - * @param {number || string} progressPercent - Max percent of progress for the entire terminal, default 100%. - * @param {string} cursor – Character to use for cursor for the entire terminal, defaults to ▋. - * @param {string} inputChar – Character(s) to use before the 'input' prompt for the entire terminal, defaults to '$'. - * @param {string} directory – Directory to write in the 'input' prompt before the input character for the entire terminal. - * @param {string} promptChar – Character(s) to use before the 'prompt' prompt for the entire terminal, defaults to '>>>'. - * @param {string} PS1 – String to write in the 'input' prompt before the actual line for the entire terminal. - * If present, any 'directory' or 'input' attribute will be disregarded. - * Accepts HTML format. E.g.: "This is a valid PS1 attribute" - * @param {boolean} init - Initialise the terminal animation at page load. - * @param {boolean} static - Create a static terminal without animation. - */ - constructor() { - super(); - this.attachShadow({ mode: "open" }); - this.shadowRoot.appendChild(terminalTemplate.content.cloneNode(true)); - this.applyMode(); - this.ALLOWED_TAGS = ['terminal-line','img']; - this.DATA_TYPES = ['input','prompt','progress','output']; - this.keepLines(); - if (!this.static) { - this.setTerminal(); - if (this.init) { - this.initialiseAnimation(); - } else { - this.initialiseWhenVisible(); - } - } else { - this.generateAllProgress(); - } - } - - get container() { - const container = this.shadowRoot.querySelector(".terminal-container"); - if (this.hasAttribute('lineDelay')) { - container.setAttribute('lineDelay',parseFloat(this.getAttribute('lineDelay'))) - } - if (this.hasAttribute('typingDelay')) { - container.setAttribute('typingDelay',parseFloat(this.getAttribute('typingDelay'))) - } - return container - } - - get mode() { - /** - * Getter for the mode property - */ - if (this.getAttribute('mode')?.toString().toLowerCase() == 'light') { - return 'light'; - } else { - return 'dark'; - } - } - - get data() { - /** - * Getter for the data property - */ - let attr = this.getAttribute('data'); - if (this.DATA_TYPES.includes(attr)) { - return attr; - } else { - return 'output' - } - } - - get startDelay() { - /** - * Resets startDelay property. - */ - return parseFloat(this.getAttribute('startDelay')) || 300; - } - - get progressChar() { - /** - * Getter for the progressChar property - */ - return replaceTagSymbols(this.getAttribute('progressChar')?.toString()) || '█'; - } - - get progressPercent() { - /** - * Getter for the progressPercent property - */ - return parseFloat(this.getAttribute('progressPercent')) || 100; - } - - get cursor() { - /** - * Getter for the cursor property - */ - return replaceTagSymbols(this.getAttribute('cursor')?.toString()) || '▋'; - } - - get inputChar() { - /** - * Getter for the inputChar property - */ - if (this.hasAttribute('PS1')) { - return ''; - } else { - return replaceTagSymbols(this.getAttribute('inputChar')?.toString()) || '$'; - } - } - - get promptChar() { - /** - * Getter for the promptChar property - */ - return replaceTagSymbols(this.getAttribute('promptChar')?.toString()) || '>>>'; - } - - get directory() { - /** - * Getter for the directory property - */ - if (this.hasAttribute('PS1')) { - return ''; - } else { - return replaceTagSymbols(this.getAttribute('directory')?.toString()) || ''; - } - } - - get PS1() { - /** - * Getter for the PS1 property - */ - if (this.hasAttribute('PS1')) { - return this.getAttribute('PS1'); - } else { - return `${this.directory}${this.inputChar} `; - } - } - - get static() { - /** - * Getter for the static property - */ - let attr = this.getAttribute('static') - if (attr == 'false') { - return false - } else if (attr == "") { - return true - } else { - return !!attr - } - } - - get init() { - /** - * Getter for the init property - */ - let attr = this.getAttribute('init') - if (attr == 'false') { - return false - } else if (attr == "") { - return true - } else { - return !!attr - } - } - - applyMode() { - /** - * Sets the color scheme according to the mode selected. - */ - const colors = document.createElement('style'); - if (this.mode == 'dark') { - colors.innerHTML = ` - :host { - --color-bg: #252a33; - --color-text: #eee; - --color-control-buttons: #FAA619; - --color-control-buttons-hover: #115D97; - --color-scrollbar: rgba(255, 255, 255, .6); - ` - } else { - colors.innerHTML = ` - :host { - --color-text: #252a33; - --color-bg: #eee; - --color-control-buttons-hover: #FAA619; - --color-control-buttons: #115D97; - --color-scrollbar: rgba(0, 0, 0, .6); - ` - } - this.shadowRoot.appendChild(colors); - } - - keepLines() { - /* - * Delete all terminal lines without tags or whose tags are not within the elementList - * and create the lines property with the kept ones. - */ - for (let i=0; i { - if (line.data == 'progress') { - line.generateProgress(); - } - }) - } - - hide(element) { - /** - * Change element's style to 'hidden' - */ - element.style.visibility = 'hidden'; - } - - show(element) { - /** - * Change element's style to 'visible' - */ - element.style.visibility = 'visible'; - } - - sleep(time) { - /** - * Sleep for an amount of time - */ - return new Promise(resolve => setTimeout(resolve, time)); - } - - resetDelays() { - this.lines.forEach(line => { - line._lineDelay; - line._typingDelay; - }) - } - - hideLines() { - /** - * Hide lines inside the terminal - */ - this.lines.forEach(line => this.hide(line)); - } - - generateRestartButton() { - /** - * Generate restart button and adds it hidden to 'this.container' - */ - const restart = document.createElement('a') - restart.setAttribute('part','restart-button') - restart.onclick = e => { - e.preventDefault(); - this.hideAll(); - this.scrollToTop(); - this.mutationObserver.disconnect(); - this.initialiseAnimation(); - } - restart.href = ''; - restart.classList.add('restart-button'); - restart.innerHTML = "restart ↻"; - this.hide(restart); - restart.addEventListener('click', e => this.hide(restart)); - this.restartButton = restart; - this.container.appendChild(restart); - } - - generateFastButton() { - /** - * Generate fast button and adds it hidden to 'this.container' - */ - function nullifyDelays(_this) { - _this.lines.forEach(line => { - line._lineDelay = 0; - line._typingDelay = 0; - }) - } - const fast = document.createElement('a') - fast.setAttribute('part','fast-button') - fast.onclick = (e) => { - e.preventDefault(); - nullifyDelays(this); - } - fast.href = ''; - fast.classList.add('fast-button'); - fast.innerHTML = "fast ❯❯❯"; - this.hide(fast); - fast.addEventListener('click', e => this.hide(fast)); - this.addFocusOnTerminalContainerOnClick(fast); - this.fastButton = fast; - this.container.prepend(fast); - } - - setTerminal() { - /** - * Clear container and generate restart/fast buttons. - */ - this.hideLines(); - this.generateRestartButton(); - this.generateFastButton(); - this.generateObservers(); - } - - hidePS1AndPromptChar() { - /** - * Hides PS1 and Prompt Char for terminal reset - */ - this.lines.forEach(line => { - let elem = line.shadowRoot?.querySelector('.ps1, .promptChar'); - if (elem) { - this.hide(elem); - } - }) - } - - hideAll() { - this.hideLines(); - this.hidePS1AndPromptChar(); - } - - async initialiseAnimation() { - /** - * Start the animation and render the lines - */ - // while (this.container.scrollTop != 0) {await this.sleep(50)} //Start when the container is scroll up to the top. - this.autoScroll(); - await this.sleep(this.startDelay); - this.show(this.fastButton); - for (let line of this.lines) { - line.classList.add('isBeingTyped'); - if (line.tagName.toLowerCase() == 'terminal-line') { - // Handle lines - await line.type(); - } else if (line.tagName.toLowerCase() == 'img') { - // Handle lines - this.show(line); - // await this.sleep(2000); - // this.hide(line); - } - line.classList.remove('isBeingTyped'); - } - this.hide(this.fastButton); - this.resetDelays(); - this.show(this.restartButton); - } - - initialiseWhenVisible() { - /** - * Initialise the terminal only when it becomes visible - */ - let observer = new IntersectionObserver(entries => { - entries.forEach(entry => { - if (entry.isIntersecting) { - this.initialiseAnimation(); - observer.unobserve(this); - } - }) - }, - { - rootMargin: "-50px", - }) - observer.observe(this); - } - - addFocusOnTerminalContainerOnClick(elem) { - elem.addEventListener('click',() => this.container.focus()) - } - - scrollToTop() { - // Scroll to the bottom of the container. - this.container.scrollTop = 0; - } - - scrollToBottom() { - // Scroll to the bottom of the container. - this.container.scrollTop = this.container.scrollHeight; - } - - scrollOneLine(line) { - const nPix = parseInt(getComputedStyle(line).height); - this.container.scrollBy(0,nPix); - } - - generateObservers() { - const intersectionFunction = entry => { - if (entry.intersectionRatio == 1) { - intersectionObserver.unobserve(entry.target); - } else { - if (entry.target.nextSibling) { - this.scrollOneLine(entry.target); - } - intersectionObserver.unobserve(entry.target); - } - } - - let margin = `${parseInt(getComputedStyle(this.container).marginBottom) - 5}px` // Margin of the intersectionObserver computed as bottom margin - 5px (5px padding) - let intersectionObserver = new IntersectionObserver(entries => { - entries.forEach(entry => { - intersectionFunction(entry) - }) - }, - { - root: this.container, - rootMargin: `0px 0px ${margin} 0px`, - }) - - const mutationFunction = entry => { - if (entry.target.nextSibling) { - intersectionObserver.observe(entry.target.nextSibling) - } else { - this.scrollToBottom(); - } - } - - this.mutationObserver = new MutationObserver(entries => { - entries.forEach(entry => { - if (entry.oldValue?.includes("isBeingTyped")) { - mutationFunction(entry) - } - }) - }) - } - - autoScroll() { - /** - * Auto scrolls 1 line if the terminal content exceeds the terminal max-height. - */ - this.lines.forEach(line => { - this.mutationObserver.observe(line,{ - attributes: true, - attributeOldValue: true, - attributeFilter: ["class"] - }) - }); - - this.addEventListener('wheel', e => { - this.mutationObserver.disconnect(); - }) - - this.addEventListener('keydown', e => { - if (['ArrowDown','Space','ArrowUp'].includes(e.code)) { - this.mutationObserver.disconnect(); - } - }) - } -} - -/* ============================================================================================================= - =============================================================================================================== - =============================================================================================================== - =============================================================================================================== - =============================================================================================================== - =============================================================================================================== - =============================================================================================================== - =============================================================================================================== - =============================================================================================================== - =============================================================================================================== - =============================================================================================================== */ - - /* Terminal line */ -const lineTemplate = document.createElement('template'); -lineTemplate.innerHTML = ` - - - -
    - - -` - -class TerminalLine extends HTMLElement { - /** - * Defining custom attributes for component - // * @param {string} data - Type of prompt for the current line. Choices can be: - // * - 'output': Output of the terminal. Written all at once; (default) - // * - 'input': Input to the terminal. Written with typing animation after 'directory' and 'inputChar' attributes; - // * - 'prompt': Same as input, but with written with typing animation after 'promptChar' attribute; - // * - 'progress' Line with progress bar animation. - // * @param {number} lineDelay - Delay before the start of the line animation, in ms. - // * @param {number} typingDelay - Delay between each typed character in the line, in ms. - // * @param {string} progressChar – Character to use for progress bar in the line, defaults to █. - // * @param {number} progressPercent - Max percent of progress in the line, default 100%. - // * @param {string} cursor – Character to use for cursor in the line, defaults to ▋. - // * @param {string} inputChar – Character(s) to use before the 'input' prompt in the line, defaults to '$'. - // * @param {string} directory – Directory to write in the 'input' prompt before the input character in the line. - // * @param {string} promptChar – Character(s) to use before the 'prompt' prompt in the line, defaults to '>>>'. - // * @param {string} PS1 – String to write in the 'input' prompt before the actual line. - If present, any 'directory' or 'input' attribute will be disregarded. - Accepts HTML format. E.g.: "This is a valid PS1 attribute" - // */ - constructor() { - super(); - const shadow = this.attachShadow({ mode: "open" }); - shadow.appendChild(lineTemplate.content.cloneNode(true)); - this.ALLOWED_NODES = ["span"]; - this.line = this.shadowRoot.querySelector(".terminal-line"); - this.setCursorChar(); - this.keepNodes(); - this.generatePS1AndPromptCharElements(); - this.resetDelays(); - this.container.addFocusOnTerminalContainerOnClick(this); - } - - get container() { - if (this.parentElement.tagName.toLowerCase() != 'terminal-animation') { - throw new Error("A 'terminal-line' tag can only be placed inside a 'terminal-animation' tag."); - } - return this.parentElement; - } - - get data() { - /** - * Getter for the data property - */ - if (this.hasAttribute('data')) { - let attr = this.getAttribute('data'); - if (this.container.DATA_TYPES.includes(attr)) { - return attr; - } else { - return 'output'; - } - } else { - return this.container.data; - } - } - - get _lineDelay() { - /** - * Resets lineDelay property. - */ - if (this.hasAttribute('lineDelay')) { - this.lineDelay = parseFloat(this.getAttribute('lineDelay')); - } else if (this.container.hasAttribute('lineDelay')) { - this.lineDelay = parseFloat(this.container.getAttribute('lineDelay')); - } else if (["input","prompt"].includes(this.data)) { - this.lineDelay = 600; - } else { - this.lineDelay = 100; - } - } - - set _lineDelay(time) { - /** - * Sets lineDelay property. - */ - this.lineDelay = time; - } - - get _typingDelay() { - /** - * Resets typingDelay property. - */ - if (this.hasAttribute('typingDelay')) { - this.typingDelay = parseFloat(this.getAttribute('typingDelay')); - } else if (this.container.hasAttribute('typingDelay')) { - this.typingDelay = parseFloat(this.container.getAttribute('typingDelay')); - } else if (["progress"].includes(this.data)) { - this.typingDelay = 30; - } else { - this.typingDelay = 80; - } - } - - set _typingDelay(time) { - /** - * Sets typingDelay property. - */ - this.typingDelay = time; - } - - resetDelays() { - this._lineDelay; - this._typingDelay; - } - - get progressChar() { - /** - * Getter for the progressChar property - */ - return replaceTagSymbols(this.getAttribute('progressChar')?.toString()) || this.container.progressChar; - } - - get progressPercent() { - /** - * Getter for the progressPercent property - */ - return parseFloat(this.getAttribute('progressPercent')) || this.container.progressPercent; - } - - get cursor() { - /** - * Getter for the cursor property - */ - return replaceTagSymbols(this.getAttribute('cursor')?.toString()) || this.container.cursor; - } - - get inputChar() { - /** - * Getter for the inputChar property - */ - if (this.hasAttribute('PS1')) { - return ''; - } else { - return replaceTagSymbols(this.getAttribute('inputChar')?.toString()) || this.container.inputChar; - } - } - - get promptChar() { - /** - * Getter for the promptChar property - */ - return replaceTagSymbols(this.getAttribute('promptChar')?.toString()) || this.container.promptChar; - } - - get directory() { - /** - * Getter for the directory property - */ - if (this.hasAttribute('PS1')) { - return ''; - } else { - return replaceTagSymbols(this.getAttribute('directory')?.toString()) || this.container.directory; - } - } - - get PS1() { - /** - * Getter for the PS1 property - */ - if (this.hasAttribute('PS1')) { - return this.getAttribute('PS1'); - } else if (this.hasAttribute('directory') || this.hasAttribute('inputChar')) { - return `${this.directory}${this.inputChar} `; - } else { - return this.container.PS1; - } - } - - setCursorChar() { - const style = document.createElement('style'); - style.innerHTML=` - .cursor::after { - content: '${this.cursor}'; - font-family: monospace; - -webkit-animation: blink 1s infinite; - animation: blink 1s infinite; - } - - @-webkit-keyframes blink { - 50% { - opacity: 0; - } - } - - @keyframes blink { - 50% { - opacity: 0; - } - } - ` - this.shadowRoot.appendChild(style); - } - - keepNodes(elementList=this.ALLOWED_NODES) { - /* - * Delete all line nodes whose tags are not within the elementList, - * create tags around textNodes, - * and create the nodes property with the kept ones. - */ - for (let i=0; i setTimeout(resolve, time)); - } - - showPS1() { - this.show(this.shadowRoot.querySelector('.ps1')); - } - - showPromptChar() { - this.show(this.shadowRoot.querySelector('.promptChar')); - } - - async type() { - /** - * Function that handles the animation of the current line based on its data property - */ - if (this.data == 'input') { - this.showPS1(); - await this.typeInput(); - } else if (this.data == 'progress') { - await this.sleep(this.lineDelay); - await this.typeProgress(); - return; - } else if (this.data == 'prompt') { - this.showPromptChar(); - await this.typeInput(); - } else { - await this.sleep(this.lineDelay); - this.show() - } - - } - - measureChar(char=this.progressChar) { - const ruler = document.createElement('span'); - ruler.innerHTML = char; - ruler.style.whiteSpace = 'pre'; - this.appendChild(ruler); - const width = ruler.offsetWidth; - this.removeChild(ruler); - return width; - } - - async typeProgress() { - /** - * Animate a progress bar. - */ - const progressCharWidth = this.measureChar(); - const progressSteps = Math.round((parseInt(getComputedStyle(this).width)*0.8*(this.progressPercent/100))/progressCharWidth); - let percent = 0; - this.textContent = '0%'; - this.show(); - for (let i=1; i<=progressSteps; i++) { - await this.sleep(this.typingDelay); - percent = Math.round(this.progressPercent/progressSteps*i) - this.textContent = `${this.progressChar.repeat(i)} ${percent}%`; - } - } - - generateProgress() { - const progressCharWidth = this.measureChar(); - const progressLength = Math.round((parseInt(getComputedStyle(this).width)*0.8*(this.progressPercent/100))/progressCharWidth); - this.textContent = `${this.progressChar.repeat(progressLength)} ${this.progressPercent}%`; - } - - async typeInput() { - /** - * Animate an input line. - */ - let textArray = this.getAndRemoveTextContent(); - this.show(); - this.addCursor(); - await this.sleep(this.lineDelay); - for (let i=0; i -ACCESS-NRI's "Model Evaluation and Diagnostics" work is a critical facet of climate modeling, encompassing various tasks designed to ensure the model's reliability and accuracy. +ACCESS-NRI's Model Evaluation and Diagnostics (MED) work is a critical facet of climate modeling, encompassing various tasks designed to ensure the model's reliability and accuracy. If you are new to model evaluation and diagnostics, we recommend you read our [Getting Started with MED page](./model_evaluation_getting_started/index.md):
    diff --git a/docs/model_evaluation/model_evaluation_getting_started/model_variables/index.md b/docs/model_evaluation/model_evaluation_getting_started/model_variables/index.md index eb713d4e5..211edc0e3 100644 --- a/docs/model_evaluation/model_evaluation_getting_started/model_variables/index.md +++ b/docs/model_evaluation/model_evaluation_getting_started/model_variables/index.md @@ -14,7 +14,7 @@ We therefore support projects like the Coupled Model Intercomparison Projects (C ## 1 Network Common Data Format (NetCDF) -Many organizations and scientific groups in different countries have adopted a data format called [NetCDF](https://www.unidata.ucar.edu/software/NetCDF/) by the Unidata Community as a standard way to represent some forms of scientific data. +Many organizations and scientific groups in different countries have adopted a data format called NetCDF by the Unidata Community as a standard way to represent some forms of scientific data. NetCDF (with file extensions `*.nc`) is a set of software libraries and self-describing, machine-independent data formats that support the creation, access, and sharing of array-oriented scientific data. @@ -23,14 +23,14 @@ NetCDF (with file extensions `*.nc`) is a set of software libraries and self-des - **Array-oriented** means that the `*.nc` data is typically spanning multiple dimensions with the same lengths (like latitude and longitude or time) and variables (like temperature or humidity) which are stored in arrays.
    - Schematic of a NetCDF file with data (temperature and pressure as variables stored over the dimensions latitude, longitude, and time) and metadata + Schematic of a NetCDF file with data (temperature and pressure as variables stored over the dimensions latitude, longitude, and time) and metadata
    ### 1.1 NetCDF metadata Metadata enables users of data from different sources to decide which quantities are comparable, and facilitates building applications with powerful extraction, regridding, and display capabilities. -To facilitate this process, there are conventions for CF (Climate and Forecast) metadata. These are designed to promote the processing and sharing of files created with NetCDF. The conventions define metadata that provide a definitive description of what the data in each variable represents, and the spatial and temporal properties of the data. Learn more about the CF metadata conventions [here](http://cfconventions.org). +To facilitate this process, there are conventions for CF (Climate and Forecast) metadata. These are designed to promote the processing and sharing of files created with NetCDF. The conventions define metadata that provide a definitive description of what the data in each variable represents, and the spatial and temporal properties of the data. Learn more about the CF metadata conventions here. ### 1.2 NetCDF data and variables @@ -46,20 +46,19 @@ Using common variables is key for a united climate modelling community. While we ### 2.1 Variables of CMIP6 (Coupled Model Intercomparison Project Version 6) -You can search the extensive list of Coupled Model Intercomparison Project version 6 on [this website](Chttps://clipc-services.ceda.ac.uk/dreq/index/var.html). +You can search the extensive list of Coupled Model Intercomparison Project version 6 on this website. ### 2.2 Variables of the ERA5 atmospheric reanalysis ERA5 is the fifth generation ECMWF atmospheric reanalysis of the global climate covering the period from January 1940 to present. ERA5 is produced by the Copernicus Climate Change Service (C3S) at ECMWF. ERA5 provides hourly estimates of a large number of atmospheric, land and oceanic climate variables. -A full list of ERA5 parameters is available on the [ECMWF database](https://codes.ecmwf.int/grib/param-db/). It covers both the [ERA5 parameter listings](https://confluence.ecmwf.int/display/CKB/ERA5%3A+data+documentation#ERA5:datadocumentation-Parameterlistings) as well as the [ERA5-LAND parameter listings](https://confluence.ecmwf.int/display/CKB/ERA5-Land%3A+data+documentation#ERA5Land:datadocumentation-parameterlistingParameterlistings). +A full list of ERA5 parameters is available on the ECMWF database. It covers both the ERA5 parameter listings as well as the ERA5-LAND parameter listings. ## 3 Loading NetCDF files -Our Model Evaluation and Diagnostics tools are based around the reading and storing of files via the Python package `xarray`. You can find a quick overview [here](https://docs.xarray.dev/en/stable/getting-started-guide/quick-overview.html) and tutorials [here]( -https://tutorial.xarray.dev/intro.html#). +Our Model Evaluation and Diagnostics tools are based around the reading and storing of files via the Python package `xarray`. You can find a quick overview here and tutorials here. -We provide `xarray` through out `conda` environment, so you can use it either directly as shown below, or through the dataset capabilities of our catalog [ACCESS-NRI Model Intake Catalog Tool](../../model_evaluation_model_catalogs/index.md). +We provide `xarray` through out `conda` environment, so you can use it either directly as shown below, or through the dataset capabilities of our catalog [ACCESS-NRI Model Intake Catalog Tool](../../model_evaluation_model_catalogs/index.md. ``` import xarray as xr diff --git a/docs/model_evaluation/model_evaluation_model_catalogs/index.md b/docs/model_evaluation/model_evaluation_model_catalogs/index.md index 5daf51b9c..197ddb3d8 100644 --- a/docs/model_evaluation/model_evaluation_model_catalogs/index.md +++ b/docs/model_evaluation/model_evaluation_model_catalogs/index.md @@ -16,7 +16,7 @@ The ACCESS-NRI catalog is essentially a table of climate data products that exis ## Showcase: use intake to easily find, load and plot data -In this showcase, we'll demonstrate one of the simplest use-cases of the ACCESS-NRI intake catalog: a user wants to plot a timeseries of a variable from a specific data product. Here, the variable is a scalar ocean variable called "temp_global_ave" and the product is an ACCESS-OM2 run called "025deg_jra55_iaf_omip2_cycle1". +In this showcase, we'll demonstrate one of the simplest use-cases of the ACCESS-NRI intake catalog: a user wants to plot a timeseries of a variable from a specific data product. Here, the variable is a scalar ocean variable called "temp_global_ave" and the product is an ACCESS-ESM1-5 run called "HI_CN_05", which is an historical run using same configuration as CMIP6 ACCESS-ESM1-5 historical r1i1p1f1, but with phosphorus limitation disabled within CASA-CNP. First we load the catalog using @@ -25,20 +25,17 @@ import intake catalog = intake.cat.access_nri ``` -Now we can load and plot available datasets of the variable "temp_global_ave" from the product "025deg_jra55_iaf_omip2_cycle1" using +Now we can load and plot available datasets of the variable "temp_global_ave" from the product "HI_CN_05" using ```python import matplotlib.pyplot as plt -dataset_dict = catalog["025deg_jra55_iaf_omip2_cycle1"].search( - variable="temp_global_ave" -).to_dataset_dict() +# This returns an xarray Dataset +dataset = catalog["HI_CN_05"].search(variable="temp_global_ave").to_dask() -# `dataset_dict` contains two xarray Datasets, one at daily frequency and one at monthly -dataset_dict["ocean_scalar_snapshot.1day"]["temp_global_ave"].plot(label="daily") -dataset_dict["ocean_scalar.1mon"]["temp_global_ave"].plot(label="monthly") +# Plot the data +dataset["temp_global_ave"].plot() plt.title("") -plt.legend() plt.grid() ``` diff --git a/docs/model_evaluation/model_evaluation_on_gadi/index.md b/docs/model_evaluation/model_evaluation_on_gadi/index.md index 4d435e63e..1e5f22760 100644 --- a/docs/model_evaluation/model_evaluation_on_gadi/index.md +++ b/docs/model_evaluation/model_evaluation_on_gadi/index.md @@ -1,8 +1,6 @@ # Model Evaluation on Gadi/NCI -We are providing support for an increasing amount of frameworks and recipes on Gadi/NCI. - -At the moment, we are actively supporting: +At the moment, we are providing support for an the following model evaluation frameworks on Gadi/NCI:
    @@ -34,4 +32,4 @@ At the moment, we are actively supporting: The best way to get our help is by raising an issue on the [community forum](https://forum.access-hive.org.au/) with tags `help` and another tag for the specific framework. -In the future, we are also aiming to support a broader range of frameworks and recipes. \ No newline at end of file +In the future, we are also aiming to support a broader range of frameworks and recipes which are currently not supported (see [our community resource lists](../../community_resources/community_med/index.md) for this collection). \ No newline at end of file diff --git a/docs/model_evaluation/model_evaluation_on_gadi/model_evaluation_on_gadi_esmvaltool.md b/docs/model_evaluation/model_evaluation_on_gadi/model_evaluation_on_gadi_esmvaltool.md index 4f9ab009f..5823d465d 100644 --- a/docs/model_evaluation/model_evaluation_on_gadi/model_evaluation_on_gadi_esmvaltool.md +++ b/docs/model_evaluation/model_evaluation_on_gadi/model_evaluation_on_gadi_esmvaltool.md @@ -1,12 +1,22 @@ # Tutorial for using `esmvaltool` on Gadi@NCI -![ESMValTool-logo](https://docs.esmvaltool.org/en/latest/_static/ESMValTool-logo-2.png) - -{% include "call_contribute.md" %} - - - -[ACCESS ESMValTool Worflow recipe status][esmvaltool-workflow-repository] +`esmvaltool` is the Earth System Model Evaluation Tool. + +???+ warning "Support Level: Supported on Gadi, but not owned by ACCESS-NRI" + + ESMValTool is a community-developed climate model diagnostics and evaluation software package. + + ACCESS-NRI does not own the code of ESMValTool, but actively supports the use of ESMValTool on Gadi. + ACCESS-NRI provides access to the latest version of ESMValTool via the `xp65` access-med conda environment deployed on NCI-Gadi. + + ## About ESMValTool @@ -70,32 +80,41 @@ The ESMValTool is released under the Apache License, version 2.0. Citation of th Besides the above citation, users are kindly asked to register any journal articles (or other scientific documents) that use the software at the ESMValTool webpage (http://www.esmvaltool.org/). Citing the Software Documentation Paper and registering your paper(s) will serve to document the scientific impact of the Software, which is of vital importance for securing future funding. You should consider this an obligation if you have taken advantage of the ESMValTool, which represents the end product of considerable effort by the development team. -## ESMValTool recipes examples +## ESMValTool recipe examples -Below you can find the recipes from `esmvaltool` that we are providing to run on Gadi. The original recipes are +To find the available recipes, please go see the [ACCESS ESMValTool Worflow recipe status][esmvaltool-workflow-repository] + +Below we showcase example recipes from `esmvaltool` that we are providing to run on Gadi: - - - - - - - - - - - - - - - + + +
    - recipe_flato13ipcc.yml - recipe_perfmetrics_CMIP5.yml - recipe_ecs_scatter.yml
    diff --git a/docs/model_evaluation/model_evaluation_on_gadi/model_evaluation_on_gadi_ilamb.md b/docs/model_evaluation/model_evaluation_on_gadi/model_evaluation_on_gadi_ilamb.md index b3497e70a..d3ca5bf8b 100644 --- a/docs/model_evaluation/model_evaluation_on_gadi/model_evaluation_on_gadi_ilamb.md +++ b/docs/model_evaluation/model_evaluation_on_gadi/model_evaluation_on_gadi_ilamb.md @@ -1,6 +1,15 @@ # `ilamb` on Gadi at NCI -ACCESS-NRI is maintaining a version of the `python` package `ilamb` for International Land Model Benchmarking (ILAMB) and International Ocean Model Benchmark (IOMB) on Gadi at the National Compuational Infrastructure (NCI). +`ilamb` is a Python framework for for International Land Model Benchmarking (ILAMB) and International Ocean Model Benchmark (IOMB). + +???+ warning "Support Level: Supported on Gadi, but not owned by ACCESS-NRI" + + ILAMB/IOMB is a community-developed climate model diagnostics and evaluation software package. + + ACCESS-NRI does not own the code of ILAMB/IOMB, but actively supports the use of ILAMB/IOMB on Gadi. + ACCESS-NRI provides access to the latest version of ILAMB/IOMB via the `xp65` access-med conda environment deployed on NCI-Gadi. + +ACCESS-NRI is maintaining a version of the package `ilamb` on Gadi at the National Compuational Infrastructure (NCI). Here, we provide a quick tutorial on how use `ilamb` on Gadi. We assume that you already have access to Gadi, logged onto Gadi via secure shell (ssh) and loaded our `access-med` `conda` environment (if not, follow [these instructions](../model_evaluation_getting_started/index.md)). diff --git a/docs/model_evaluation/model_evaluation_on_gadi/model_evaluation_on_gadi_metplus.md b/docs/model_evaluation/model_evaluation_on_gadi/model_evaluation_on_gadi_metplus.md index d18f9336c..f7fd2e370 100644 --- a/docs/model_evaluation/model_evaluation_on_gadi/model_evaluation_on_gadi_metplus.md +++ b/docs/model_evaluation/model_evaluation_on_gadi/model_evaluation_on_gadi_metplus.md @@ -2,7 +2,12 @@ [METplus](https://dtcenter.org/community-code/metplus) is the enhanced Model Evaluation Tools (METplus) verification system. -???+ int "ACCESS-NRI is actively supporting METplus on Gadi" +???+ warning "Support Level: Supported on Gadi, but not owned by ACCESS-NRI" + + METplus was developed by the Developmental Testbed Center (DTC) and is being actively developed by NCAR/Research Applications Laboratory (RAL), NOAA/Earth Systems Research Laboratories (ESRL), NOAA/Environmental Modeling Center (EMC), and is open to community contributions. + + ACCESS-NRI does not own the code of METplus, but actively supports the use of METplus on Gadi. + ACCESS-NRI provides access to the latest version of ESMValTool via the `access` conda environment deployed on NCI-Gadi. For detailed information, tutorials and more of [METplus](https://metplus.readthedocs.io/en/latest/index.html), please go to the
    @@ -16,7 +21,7 @@ For detailed information, tutorials and more of [METplus](https://metplus.readth ## What is METplus? -[METplus](https://dtcenter.org/community-code/metplus) is a verification framework that spans a wide range of temporal (warn-on-forecast to climate) and spatial (storm to global) scales. It is intended to be extensible through additional capability developed by the community The core components of the framework include the [Model Evaluation Tools (MET)](https://met.readthedocs.io/en/latest/), the associated database and display systems called METviewer and METexpress, and a suite of Python wrappers to provide low-level automation and examples, also called use-cases. METplus will be a component of NOAA's Unified Forecast System (UFS) cross-cutting infrastructure as well as NCAR's System for Integrated Modeling of the Atmosphere (SIMA). METplus was developed by the Developmental Testbed Center (DTC) and is being actively developed by NCAR/Research Applications Laboratory (RAL), NOAA/Earth Systems Research Laboratories (ESRL), NOAA/Environmental Modeling Center (EMC), and is open to community contributions. +[METplus](https://dtcenter.org/community-code/metplus) is a verification framework that spans a wide range of temporal (warn-on-forecast to climate) and spatial (storm to global) scales. It is intended to be extensible through additional capability developed by the community The core components of the framework include the [Model Evaluation Tools (MET)](https://met.readthedocs.io/en/latest/), the associated database and display systems called METviewer and METexpress, and a suite of Python wrappers to provide low-level automation and examples, also called use-cases. METplus will be a component of NOAA's Unified Forecast System (UFS) cross-cutting infrastructure as well as NCAR's System for Integrated Modeling of the Atmosphere (SIMA). ## Showcase of METplus 5.0 diff --git a/docs/model_evaluation/model_evaluation_on_gadi/model_evaluation_on_gadi_pangeo_cosima.md b/docs/model_evaluation/model_evaluation_on_gadi/model_evaluation_on_gadi_pangeo_cosima.md index 7c1bccf52..d056b304f 100644 --- a/docs/model_evaluation/model_evaluation_on_gadi/model_evaluation_on_gadi_pangeo_cosima.md +++ b/docs/model_evaluation/model_evaluation_on_gadi/model_evaluation_on_gadi_pangeo_cosima.md @@ -1,12 +1,15 @@ # COSIMA Cookbook on NCI's Gadi -COSIMA is the [Consortium for Ocean-Sea Ice Modelling in Australia](http://cosima.org.au/), which brings together Australian researchers involved in global ocean and sea ice modelling. +???+ warning "Support Level: Supported on Gadi, but not owned by ACCESS-NRI" + + The COSIMA Cookbook is developed and maintained by the Consortium for Ocean-Sea Ice Modelling in Australia. + + ACCESS-NRI does not own the code of the COSIMA Cookbook, but actively supports the use of the COSIMA Cookbook and its collection of `cosmia-recipes` on Gadi. + ACCESS-NRI provides access to the latest version of the COSIMA Cookbook via the `hh5` access-med conda environment deployed on NCI-Gadi. -The COSIMA Cookbook is a framework for analysing output from ocean-sea ice models. The focus is on the [ACCESS-OM2](../../models/configurations/access-om.md) suite of models being developed and run by members of [COSIMA]((http://cosima.org.au/)). But this framework is suited to analysing any MOM5/MOM6 output, as well as output from other models. +COSIMA is the Consortium for Ocean-Sea Ice Modelling in Australia, which brings together Australian researchers involved in global ocean and sea ice modelling. The consortium provides a collection of `cosmia-recipes` for the evaluation of ocean-sea ice modelling that are currated for you on Gadi. -???+ warning "The COSIMA Cookbook is a framework by COSIMA" - The COSIMA Cookbook itself is maintained by the COSIMA members. - ACCESS-NRI is only providing support for the COSIMA Cookbook and its collection of `cosmia-recipes` for the evaluation of ocean-sea ice modelling on Gadi. +The COSIMA Cookbook is a framework for analysing output from ocean-sea ice models. The focus is on the [ACCESS-OM2](../../models/configurations/access-om.md) suite of models being developed and run by members of [COSIMA]((http://cosima.org.au/)). But this framework is suited to analysing any MOM5/MOM6 output, as well as output from other models. ## Getting Started diff --git a/docs/models/run-a-model/run-access-cm.md b/docs/models/run-a-model/run-access-cm.md index 372b7377c..79df67617 100644 --- a/docs/models/run-a-model/run-access-cm.md +++ b/docs/models/run-a-model/run-access-cm.md @@ -1,6 +1,5 @@ {% set model = "ACCESS-CM" %} - -# Run {{ model }} +# Run {{ model }} ## Requirements Before running {{ model }}, you need to make sure to possess the right tools and to have an account with specific institutions. @@ -51,31 +50,31 @@ To copy an existing suite, on accessdev: Run
    mosrs-auth
    to authenticate using your MOSRS credentials: - + mosrs-auth Please enter the MOSRS password for <MOSRS-username>: - Successfully authenticated with MOSRS as <MOSRS-username> - + Successfully authenticated with MOSRS as <MOSRS-username> +
  • Run
    rosie checkout <suite-ID>
    to create a local copy of the <suite-ID> from the UKMO repository (used mostly for testing and examining existing suites): - + rosie checkout <suite-ID> [INFO] create: /home/565/<$USER>/roses [INFO] <suite-ID>: local copy created at /home/565/<$USER>/roses/<suite-ID> - + Alternatively, run
    rosie copy <suite-ID>
    to create a new full copy (local and remote in the UKMO repository) rather than just a local copy. When a new suite is created in this way, a new unique name is generated within the repository, and populated with some descriptive information about the suite along with all the initial configuration details: - + rosie copy <suite-ID> Copy "<suite-ID>/trunk@<trunk-ID>" to "u-?????"? [y or n (default)] y [INFO] <new-suite-ID>: created at https://code.metoffice.gov.uk/svn/roses-u/<suite-n/a/m/e/> [INFO] <new-suite-ID>: copied items from <suite-ID>/trunk@<trunk-ID> [INFO] <suite-ID>: local copy created at /home/565/<$USER>/roses/<new-suite-ID> - +
  • For additional rosie options, run @@ -90,10 +89,10 @@ The suite directory usually contains 2 subdirectories and 3 files:
  • rose-suite.conf → the main suite configuration file.
  • rose-suite.info → suite information file.
  • suite.rc → the Cylc control script file (Jinja2 language).
  • - + ls ~/roses/<suite-ID> app meta rose-suite.conf rose-suite.info suite.rc - + ---------------------------------------------------------------------------------------- @@ -110,13 +109,13 @@ to open the Rose GUI and inspect the suite information.
    The & is optional and keeps the terminal prompt active while runs the GUI as a separate process.
    - + cd ~/roses/<suite-ID> rose edit & [<N>] <PID> Rose GUI - + ### Change NCI project To make sure we run the suite under the NCI project we belong to, we can navigate to suite conf → Machine and Runtime Options, edit the Compute project field, and click the Save button Save button. (Check how to connect to a project if you have not joined one yet). @@ -168,7 +167,7 @@ To run an {{ model }} suite, on accessdev:
  • After the initial tasks get executed, the Cylc GUI will open up and you will be able to see and control all the different tasks in the suite as they are run:
  • - + cd ~/roses/<suite-ID> rose suite-run [INFO] export CYLC_VERSION=7.8.3 @@ -215,7 +214,7 @@ To run an {{ model }} suite, on accessdev: [INFO] $ cylc ping -v --host=accessdev.nci.org.au <suite-ID> [INFO] $ ps -opid,args <PID> # on accessdev.nci.org.au Cylc GUI - +
    If after you run the command rose suite-run you get an error similar to the following:
    [FAIL] Suite "<suite-ID>" appears to be running:
    @@ -268,7 +267,7 @@ To investigate the cause of a failure, we need to look at the logs (job.er
             They are then further separated into "attempts" (consecutive failed/successful tasks), with NN being a symlink to the most recent attempt.
             
    In our example, the failure occurred for the 09500101 simulation cycle (starting date on 1st January 950) in the coupled task. Therefore, the directory where to find the job.err and job.out files is ~/cylc-run/<suite-ID>/log/job/09500101/coupled/NN. - + cd ~/cylc-run/<suite-ID> ls app cylc-suite.db log log.20230530T051952Z meta rose-suite.info share suite.rc suite.rc.processed work @@ -287,7 +286,7 @@ To investigate the cause of a failure, we need to look at the logs (job.er cd NN ls job job-activity.log job.err job.out job.status - + ---------------------------------------------------------------------------------------- @@ -301,13 +300,13 @@ To scan for active suites run
    cylc scan
    To reopen the Cylc GUI, from inside the suite directory run
    rose suite-gcontrol
    - + cylc scan <suite-ID> <$USER>@accessdev.nci.org.au:<port> cd ~/roses/<suite-ID> rose suite-gcontrol Cylc GUI - + ### STOP a suite To shutdown a suite in a safe manner, from inside the suite directory run @@ -334,7 +333,7 @@ There are two main ways to restart a suite:
    rose suite-run --restart
    to re-install the suite and reopen Cylc in the same state as when it was stopped (you may need to manually trigger failed tasks from the Cylc GUI).
    - + cylc cd ~/roses/<suite-ID> rose suite-run --restart @@ -366,7 +365,7 @@ There are two main ways to restart a suite: [INFO] $ cylc ping -v --host=accessdev.nci.org.au <suite-ID> [INFO] $ ps -opid,args <PID> # on accessdev.nci.org.au Cylc GUI - +
  • 'HARD' restart @@ -416,7 +415,7 @@ This directory contains 2 subdirectories: For the atmospheric output data, each file it is usually a UM fieldsfile or netCDF file, formatted as <suite-name>a.p<output-stream-identifier><year><month-string>.
    In the case of the u-br565 suite we will have: - + cd /scratch/<$PROJECT>/<$USER>/archive ls br565 <other-suite-name> <other-suite-name> @@ -425,7 +424,7 @@ In the case of the u-br565 suite we will have: history restart ls history/atm br565a.pd0950apr.nc br565a.pd0950aug.nc br565a.pd0950dec.nc br565a.pd0950feb.nc br565a.pd0950jan.nc br565a.pd0950jul.nc br565a.pd0950jun.nc br565a.pd0950mar.nc br565a.pd0950may.nc br565a.pd0950nov.nc br565a.pd0950oct.nc br565a.pd0950sep.nc br565a.pd0951apr.nc br565a.pd0951aug.nc br565a.pd0951dec.nc br565a.pm0950apr.nc br565a.pm0950aug.nc br565a.pm0950dec.nc br565a.pm0950feb.nc br565a.pm0950jan.nc br565a.pm0950jul.nc br565a.pm0950jun.nc br565a.pm0950mar.nc br565a.pm0950may.nc br565a.pm0950nov.nc br565a.pm0950oct.nc br565a.pm0950sep.nc br565a.pm0951apr.nc br565a.pm0951aug.nc br565a.pm0951dec.nc netCDF - + @@ -439,10 +438,10 @@ In the directory there are also some files formatted as <suite-name> For more details on how to control the frequency and formatting of restart dumps, check Rose GUI user guide (TO CHECK). -->
    In the case of the u-br565 suite we will have: - + ls /scratch/<$PROJECT>/<$USER>/archive/br565/restart/atm br565a.da09500201_00 br565a.da09510101_00 br565.xhist-09500131 br565.xhist-09501231 - +
    References
    diff --git a/docs/models/run-a-model/run-access-esm.md b/docs/models/run-a-model/run-access-esm.md index 8aa385149..703c1bc2c 100644 --- a/docs/models/run-a-model/run-access-esm.md +++ b/docs/models/run-a-model/run-access-esm.md @@ -1,5 +1,5 @@ {% set model = "ACCESS-ESM" %} -# Run {{ model }} +# Run {{ model }} ## Requirements Before running {{ model }}, you need to make sure to possess the right tools and to have an account with specific institutions. @@ -30,10 +30,10 @@ For the general requirements needed to run all ACCESS models, please refer to th
    To check that payu is effectively available, you can run:
    payu --version
    - + payu --version 1.0.19 - +
  • ---------------------------------------------------------------------------------------- @@ -43,7 +43,7 @@ A suitable {{ model }} pre-industrial configuration is avaible on the mkdir -p ~/access-esm cd ~/access-esm git clone https://github.com/coecms/esm-pre-industrial @@ -54,7 +54,7 @@ In order to get it, on Gadi, create a directory where to keep the model c remote: Total 767 (delta 173), reused 274 (delta 157), pack-reused 472 Receiving objects: 100% (767/767), 461.57 KiB | 5.24 MiB/s, done. Resolving deltas: 100% (450/450), done. - +
    Some modules might interfere with the git commands (for example matlab/R2018a). If you are running into issues during the cloning of the repository, it might be a good idea to run
    module purge
    first, before trying again.
    @@ -86,7 +86,7 @@ This will create the laboratory directory, along with other subdirectorie
    • work → temporary directory where the model is actually run. It gets cleaned after each run.
    • archive → directory where the output is placed after each run.
    • - + cd ~/access-esm/esm-pre-industrial payu init laboratory path: /scratch/$PROJECT/$USER/access-esm @@ -94,7 +94,7 @@ This will create the laboratory directory, along with other subdirectorie input path: /scratch/$PROJECT/$USER/access-esm/input work path: /scratch/$PROJECT/$USER/access-esm/work archive path: /scratch/$PROJECT/$USER/access-esm/archive - +
    ### Edit the Master Configuration file @@ -223,7 +223,7 @@ After editing the configuration, we are ready to run {{ model }}. As a first step, from the control directory, is good practice to run:
    payu setup
    This will prepare the model run, based on the experiment configuration. - + payu setup laboratory path: /scratch/$PROJECT/$USER/access-esm binary path: /scratch/$PROJECT/$USER/access-esm/bin @@ -243,7 +243,7 @@ This will prepare the model run, based on the experiment configuration. Updating full hashes for 30 files in manifests/restart.yaml Writing manifests/restart.yaml Writing manifests/exe.yaml - +
    You can skip this step as it is included also in the run command. However, runnning it explicitly helps to check for errors and make sure executable and restart directories are accessible.
    @@ -256,7 +256,7 @@ This will submit a single job to the queue with a total run length of runt
    The -f option ensures that payu will run even if there is an existing non-empty work directory, which happens if a run crashes.
    - + payu run -f Loading input manifest: manifests/input.yaml Loading restart manifest: manifests/restart.yaml @@ -264,7 +264,7 @@ This will submit a single job to the queue with a total run length of runt payu: Found modules in /opt/Modules/v4.3.0 qsub -q normal -P <project> -l walltime=11400 -l ncpus=384 -l mem=1536GB -N pre-industrial -l wd -j n -v PAYU_PATH=/g/data/hh5/public/apps/miniconda3/envs/analysis3-23.01/bin,MODULESHOME=/opt/Modules/v4.3.0,MODULES_CMD=/opt/Modules/v4.3.0/libexec/modulecmd.tcl,MODULEPATH=/g/data3/hh5/public/modules:/etc/scl/modulefiles:/opt/Modules/modulefiles:/opt/Modules/v4.3.0/modulefiles:/apps/Modules/modulefiles -W umask=027 -l storage=gdata/access+gdata/hh5 -- /g/data/hh5/public/apps/miniconda3/envs/analysis3-23.01/bin/python3.9 /g/data/hh5/public/apps/miniconda3/envs/analysis3-23.01/bin/payu-run <job-ID>.gadi-pbs - + ### Run configuration for multiple years If you want to run {{ model }} configuration for multiple internal run lengths (controlled by runtime in the config.yaml file), you can use the option -n: @@ -332,14 +332,14 @@ Currently, there is no specific tool to monitor {{ model }} runs. One way to check the status of our run is running:
    qstat -u $USER
    This will show the status of all your PBS jobs (if there is any PBS job submitted): - + qstat -u $USER Job id                Name             User             Time Use S Queue --------------------- ---------------- ---------------- -------- - ----- <job-ID>.gadi-pbs     pre-industrial   <$USER>            <time> R normal-exec <job-ID-2>.gadi-pbs   <other-job-name> <$USER>            <time> R normal-exec <job-ID-3>.gadi-pbs   <other-job-name> <$USER>            <time> R normal-exec - + If you changed the jobname in the PBS resources of the
    Master Configuration file, that will be your job's Name instead of pre-industrial.
    S indicates the status of your run: @@ -370,13 +370,13 @@ The format of a typical output folder is outputXXX, whereas the typ In the respective folders, outputs and restarts are separated for each model component.
    For the atmospheric output data, each file it is usually a UM fieldsfile, formatted as <UM-suite-identifier>a.p<output-stream-identifier><time-identifier>. - + cd /scratch/$PROJECT/$USER/access-esm/archive/esm-pre-industrial ls output000 pbs_logs restart000 ls output000/atmosphere aiihca.daa1210 aiihca.daa1810 aiihca.paa1apr aiihca.paa1jun aiihca.pea1apr aiihca.pea1jun aiihca.pga1apr aiihca.pga1jun atm.fort6.pe0 exstat ihist prefix.CNTLGEN UAFLDS_A aiihca.daa1310 aiihca.daa1910 aiihca.paa1aug aiihca.paa1mar aiihca.pea1aug aiihca.pea1mar aiihca.pga1aug aiihca.pga1mar cable.nml fort.57 INITHIS prefix.PRESM_A um_env.py aiihca.daa1410 aiihca.daa1a10 aiihca.paa1dec aiihca.paa1may aiihca.pea1dec aiihca.pea1may aiihca.pga1dec aiihca.pga1may CNTLALL ftxx input_atm.nml SIZES xhist aiihca.daa1510 aiihca.daa1b10 aiihca.paa1feb aiihca.paa1nov aiihca.pea1feb aiihca.pea1nov aiihca.pga1feb aiihca.pga1nov CONTCNTL ftxx.new namelists STASHC aiihca.daa1610 aiihca.daa1c10 aiihca.paa1jan aiihca.paa1oct aiihca.pea1jan aiihca.pea1oct aiihca.pga1jan aiihca.pga1oct debug.root.01 ftxx.vars nout.000000 thist aiihca.daa1710 aiihca.daa2110 aiihca.paa1jul aiihca.paa1sep aiihca.pea1jul aiihca.pea1sep aiihca.pga1jul aiihca.pga1sep errflag hnlist prefix.CNTLATM UAFILES_A - + ----------------------------------------------------------------------------------------
    References
    diff --git a/docs/models/run-a-model/run-access-om.md b/docs/models/run-a-model/run-access-om.md index 6ce8698b0..f467b01e2 100644 --- a/docs/models/run-a-model/run-access-om.md +++ b/docs/models/run-a-model/run-access-om.md @@ -1,6 +1,6 @@ {% set model = "ACCESS-OM" %} -# Run {{ model }} +# Run {{ model }} ## Requirements Before running {{ model }}, you need to make sure to possess the right tools and to have an account with specific institutions. @@ -34,10 +34,10 @@ For the general requirements needed to run all ACCESS models, please refer to th
    To check that payu is effectively available, you can run:
    payu --version
    - + payu --version 1.0.19 - + ---------------------------------------------------------------------------------------- @@ -50,7 +50,7 @@ This is a 1° horizontal resolution configuration, with interannual forcing from
    In order to get it, on Gadi, create a directory where to keep the model configuration, and clone the GitHub repo in it by running:
    git clone https://github.com/COSIMA/1deg_jra55_iaf.git
    - + mkdir -p ~/access-om cd ~/access-om git clone https://github.com/COSIMA/1deg_jra55_iaf.git @@ -61,7 +61,7 @@ In order to get it, on Gadi, create a directory where to keep the model c remote: Total 14715 (delta 3383), reused 3379 (delta 3377), pack-reused 11314 Receiving objects: 100% (14715/14715), 35.68 MiB | 18.11 MiB/s, done. Resolving deltas: 100% (10707/10707), done. - +
    Some modules might interfere with the git commands (for example matlab/R2018a). If you are running into issues during the cloning of the repository, it might be a good idea to run
    module purge
    first, before trying again.
    @@ -93,7 +93,7 @@ This will create the laboratory directory, along with other subdirectorie
    • work → temporary directory where the model is actually run. It gets cleaned after each run.
    • archive → directory where the output is placed after each run.
    • - + cd ~/access-om/1deg_jra55_iaf payu init laboratory path: /scratch/$PROJECT/$USER/access-om2 @@ -101,7 +101,7 @@ This will create the laboratory directory, along with other subdirectorie input path: /scratch/$PROJECT/$USER/access-om2/input work path: /scratch/$PROJECT/$USER/access-om2/work archive path: /scratch/$PROJECT/$USER/access-om2/archive - +
    ### Edit the Master Configuration file @@ -276,7 +276,7 @@ After editing the configuration, we are ready to run {{ model }}. As a first step, from the control directory, is good practice to run:
    payu setup
    This will prepare the model run, based on the experiment configuration. - + payu setup laboratory path: /scratch/$PROJECT/$USER/access-om2 binary ppath: /scratch/$PROJECT/$USER/access-om2/bin @@ -295,7 +295,7 @@ This will prepare the model run, based on the experiment configuration. Creating restart manifest Writing manifests/restart.yaml Writing manifests/exe.yaml - +
    You can skip this step as it is included also in the run command. However, runnning it explicitly helps to check for errors and make sure executable and restart directories are accessible.
    @@ -308,7 +308,7 @@ This will submit a single job to the queue with a total run length of rest
    The -f option ensures that payu will run even if there is an existing non-empty work directory, which happens if a run crashes.
    - + payu run -f payu: warning: Job request includes 47 unused CPUs. payu: warning: CPU request increased from 241 to 288 @@ -318,7 +318,7 @@ This will submit a single job to the queue with a total run length of rest payu: Found modules in /opt/Modules/v4.3.0 qsub -q normal -P tm70 -l walltime=10800 -l ncpus=288 -l mem=1000GB -N 1deg_jra55_iaf -l wd -j n -v PYTHONPATH=/g/data3/tm70/dm5220/scripts/python_modules/,PAYU_PATH=/g/data/hh5/public/apps/miniconda3/envs/analysis3-23.01/bin,PAYU_FORCE=True,MODULESHOME=/opt/Modules/v4.3.0,MODULES_CMD=/opt/Modules/v4.3.0/libexec/modulecmd.tcl,MODULEPATH=/g/data3/hh5/public/modules:/etc/scl/modulefiles:/opt/Modules/modulefiles:/opt/Modules/v4.3.0/modulefiles:/apps/Modules/modulefiles -W umask=027 -l storage=gdata/hh5+gdata/ik11+gdata/qv56 -- /g/data/hh5/public/apps/miniconda3/envs/analysis3-23.01/bin/python3.9 /g/data/hh5/public/apps/miniconda3/envs/analysis3-23.01/bin/payu-run <job-ID>.gadi-pbs - + ### Run configuration for multiple years If you want to run {{ model }} configuration for multiple internal run lengths (controlled by restart_period in the config.yaml file), you can use the option -n: @@ -335,14 +335,14 @@ Currently, there is no specific tool to monitor {{ model }} runs. One way to check the status of our run is running:
    qstat -u $USER
    This will show the status of all your PBS jobs (if there is any PBS job submitted): - + qstat -u $USER Job id                Name             User             Time Use S Queue --------------------- ---------------- ---------------- -------- - ----- <job-ID>.gadi-pbs     1deg_jra55_iaf   <$USER>            <time> R normal-exec <job-ID-2>.gadi-pbs   <other-job-name> <$USER>            <time> R normal-exec <job-ID-3>.gadi-pbs   <other-job-name> <$USER>            <time> R normal-exec - + If you changed the jobname in the PBS resources of the Master Configuration file, that will be your job's Name instead of 1deg_jra55_iaf.
    S indicates the status of your run: @@ -371,11 +371,11 @@ Both outputs and restarts are stored into subfolders for each different configur The format of a typical output folder is outputXXX, whereas the typical restart folder is usually formatted as restartXXX, with XXX being the number of internal run, starting from 000.
    In the respective folders, outputs and restarts are separated for each model component. - + cd /scratch/$PROJECT/$USER/access-om2/archive/1deg_jra55_iaf ls output000 pbs_logs restart000 - +
    References
    diff --git a/mkdocs.yml b/mkdocs.yml index 1708aced4..0e7d4ca91 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -200,5 +200,5 @@ extra_css: extra_javascript: - https://unpkg.com/tablesort@5.3.0/dist/tablesort.min.js # For tablesort functionality - - js/terminal_animation.js + - https://cdn.jsdelivr.net/gh/atteggiani/animated-terminal/animated-terminal.min.js - js/miscellaneous.js